From 6b8290f63d44e03fc544c078955c5cd92e93f4fe Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Thu, 7 Aug 2025 05:45:05 +0200 Subject: [PATCH] adds some more links and updates plugins --- .obsidian/plugins/commentator/main.js | 97 ++++++++---------- .obsidian/plugins/commentator/manifest.json | 2 +- .obsidian/plugins/commentator/styles.css | 2 +- 10 Notes/Async Iterators.md | 2 + ... Codex Requirements - various documents.md | 49 +++++++++ "10 Notes/Obsidian \"Workshop\".md" | 5 +- .../92 Assets/Pasted image 20250724142014.png | Bin 0 -> 52789 bytes 7 files changed, 98 insertions(+), 59 deletions(-) create mode 100644 10 Notes/New Codex Requirements - various documents.md create mode 100644 90 Extras/92 Assets/Pasted image 20250724142014.png diff --git a/.obsidian/plugins/commentator/main.js b/.obsidian/plugins/commentator/main.js index c11efa3..984998c 100644 --- a/.obsidian/plugins/commentator/main.js +++ b/.obsidian/plugins/commentator/main.js @@ -3,71 +3,56 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin at https://github.com/Fevol/obsidian-translate - Commentator — 0.2.4 [PRODUCTION BUILD] + Commentator — 0.2.5 [PRODUCTION BUILD] Author: kometenstaub and Fevol - Version: 0.2.4 - Time: Sun, 13 Jul 2025 11:40:48 GMT + Version: 0.2.5 + Time: Sun, 27 Jul 2025 11:45:35 GMT ======================================================= */ -"use strict";var Ob=Object.create;var yU=Object.defineProperty;var _b=Object.getOwnPropertyDescriptor;var qb=Object.getOwnPropertyNames;var $b=Object.getPrototypeOf,I0=Object.prototype.hasOwnProperty;var SU=(C,I)=>()=>(I||C((I={exports:{}}).exports,I),I.exports),g0=(C,I)=>{for(var g in I)yU(C,g,{get:I[g],enumerable:!0})},BG=(C,I,g,B)=>{if(I&&typeof I=="object"||typeof I=="function")for(let F of qb(I))!I0.call(C,F)&&F!==g&&yU(C,F,{get:()=>I[F],enumerable:!(B=_b(I,F))||B.enumerable});return C};var WU=(C,I,g)=>(g=C!=null?Ob($b(C)):{},BG(I||!C||!C.__esModule?yU(g,"default",{value:C,enumerable:!0}):g,C)),C0=C=>BG(yU({},"__esModule",{value:!0}),C);var Ci=SU((vn,rQ)=>{var _=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},Fg=-1,lg=1,NI=0;_.Diff=function(C,I){return[C,I]};_.prototype.diff_main=function(C,I,g,B){typeof B>"u"&&(this.Diff_Timeout<=0?B=Number.MAX_VALUE:B=new Date().getTime()+this.Diff_Timeout*1e3);var F=B;if(C==null||I==null)throw new Error("Null input. (diff_main)");if(C==I)return C?[new _.Diff(NI,C)]:[];typeof g>"u"&&(g=!0);var Q=g,A=this.diff_commonPrefix(C,I),U=C.substring(0,A);C=C.substring(A),I=I.substring(A),A=this.diff_commonSuffix(C,I);var l=C.substring(C.length-A);C=C.substring(0,C.length-A),I=I.substring(0,I.length-A);var s=this.diff_compute_(C,I,Q,F);return U&&s.unshift(new _.Diff(NI,U)),l&&s.push(new _.Diff(NI,l)),this.diff_cleanupMerge(s),s};_.prototype.diff_compute_=function(C,I,g,B){var F;if(!C)return[new _.Diff(lg,I)];if(!I)return[new _.Diff(Fg,C)];var Q=C.length>I.length?C:I,A=C.length>I.length?I:C,U=Q.indexOf(A);if(U!=-1)return F=[new _.Diff(lg,Q.substring(0,U)),new _.Diff(NI,A),new _.Diff(lg,Q.substring(U+A.length))],C.length>I.length&&(F[0][0]=F[2][0]=Fg),F;if(A.length==1)return[new _.Diff(Fg,C),new _.Diff(lg,I)];var l=this.diff_halfMatch_(C,I);if(l){var s=l[0],G=l[1],t=l[2],c=l[3],d=l[4],b=this.diff_main(s,t,g,B),Z=this.diff_main(G,c,g,B);return b.concat([new _.Diff(NI,d)],Z)}return g&&C.length>100&&I.length>100?this.diff_lineMode_(C,I,B):this.diff_bisect_(C,I,B)};_.prototype.diff_lineMode_=function(C,I,g){var B=this.diff_linesToChars_(C,I);C=B.chars1,I=B.chars2;var F=B.lineArray,Q=this.diff_main(C,I,!1,g);this.diff_charsToLines_(Q,F),this.diff_cleanupSemantic(Q),Q.push(new _.Diff(NI,""));for(var A=0,U=0,l=0,s="",G="";A=1&&l>=1){Q.splice(A-U-l,U+l),A=A-U-l;for(var t=this.diff_main(s,G,!1,g),c=t.length-1;c>=0;c--)Q.splice(A,0,t[c]);A=A+t.length}l=0,U=0,s="",G="";break}A++}return Q.pop(),Q};_.prototype.diff_bisect_=function(C,I,g){for(var B=C.length,F=I.length,Q=Math.ceil((B+F)/2),A=Q,U=2*Q,l=new Array(U),s=new Array(U),G=0;Gg);x++){for(var a=-x+d;a<=x-b;a+=2){var n=A+a,h;a==-x||a!=x&&l[n-1]B)b+=2;else if(m>F)d+=2;else if(c){var L=A+t-a;if(L>=0&&L=R)return this.diff_bisectSplit_(C,I,h,m,g)}}}for(var o=-x+Z;o<=x-e;o+=2){var L=A+o,R;o==-x||o!=x&&s[L-1]B)e+=2;else if(y>F)Z+=2;else if(!c){var n=A+t-o;if(n>=0&&n=R)return this.diff_bisectSplit_(C,I,h,m,g)}}}}return[new _.Diff(Fg,C),new _.Diff(lg,I)]};_.prototype.diff_bisectSplit_=function(C,I,g,B,F){var Q=C.substring(0,g),A=I.substring(0,B),U=C.substring(g),l=I.substring(B),s=this.diff_main(Q,A,!1,F),G=this.diff_main(U,l,!1,F);return s.concat(G)};_.prototype.diff_linesToChars_=function(C,I){var g=[],B={};g[0]="";function F(l){for(var s="",G=0,t=-1,c=g.length;tB?C=C.substring(g-B):gI.length?C:I,B=C.length>I.length?I:C;if(g.length<4||B.length*2=b.length?[h,m,L,R,n]:null}var A=Q(g,B,Math.ceil(g.length/4)),U=Q(g,B,Math.ceil(g.length/2)),l;if(!A&&!U)return null;U?A?l=A[4].length>U[4].length?A:U:l=U:l=A;var s,G,t,c;C.length>I.length?(s=l[0],G=l[1],t=l[2],c=l[3]):(t=l[0],c=l[1],s=l[2],G=l[3]);var d=l[4];return[s,G,t,c,d]};_.prototype.diff_cleanupSemantic=function(C){for(var I=!1,g=[],B=0,F=null,Q=0,A=0,U=0,l=0,s=0;Q0?g[B-1]:-1,A=0,U=0,l=0,s=0,F=null,I=!0)),Q++;for(I&&this.diff_cleanupMerge(C),this.diff_cleanupSemanticLossless(C),Q=1;Q=d?(c>=G.length/2||c>=t.length/2)&&(C.splice(Q,0,new _.Diff(NI,t.substring(0,c))),C[Q-1][1]=G.substring(0,G.length-c),C[Q+1][1]=t.substring(c),Q++):(d>=G.length/2||d>=t.length/2)&&(C.splice(Q,0,new _.Diff(NI,G.substring(0,d))),C[Q-1][0]=lg,C[Q-1][1]=t.substring(0,t.length-d),C[Q+1][0]=Fg,C[Q+1][1]=G.substring(d),Q++),Q++}Q++}};_.prototype.diff_cleanupSemanticLossless=function(C){function I(d,b){if(!d||!b)return 6;var Z=d.charAt(d.length-1),e=b.charAt(0),x=Z.match(_.nonAlphaNumericRegex_),a=e.match(_.nonAlphaNumericRegex_),n=x&&Z.match(_.whitespaceRegex_),h=a&&e.match(_.whitespaceRegex_),m=n&&Z.match(_.linebreakRegex_),L=h&&e.match(_.linebreakRegex_),R=m&&d.match(_.blanklineEndRegex_),o=L&&b.match(_.blanklineStartRegex_);return R||o?5:m||L?4:x&&!n&&h?3:n||h?2:x||a?1:0}for(var g=1;g=t&&(t=c,l=B,s=F,G=Q)}C[g-1][1]!=l&&(l?C[g-1][1]=l:(C.splice(g-1,1),g--),C[g][1]=s,G?C[g+1][1]=G:(C.splice(g+1,1),g--))}g++}};_.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;_.whitespaceRegex_=/\s/;_.linebreakRegex_=/[\r\n]/;_.blanklineEndRegex_=/\n\r?\n$/;_.blanklineStartRegex_=/^\r?\n\r?\n/;_.prototype.diff_cleanupEfficiency=function(C){for(var I=!1,g=[],B=0,F=null,Q=0,A=!1,U=!1,l=!1,s=!1;Q0?g[B-1]:-1,l=s=!1),I=!0)),Q++;I&&this.diff_cleanupMerge(C)};_.prototype.diff_cleanupMerge=function(C){C.push(new _.Diff(NI,""));for(var I=0,g=0,B=0,F="",Q="",A;I1?(g!==0&&B!==0&&(A=this.diff_commonPrefix(Q,F),A!==0&&(I-g-B>0&&C[I-g-B-1][0]==NI?C[I-g-B-1][1]+=Q.substring(0,A):(C.splice(0,0,new _.Diff(NI,Q.substring(0,A))),I++),Q=Q.substring(A),F=F.substring(A)),A=this.diff_commonSuffix(Q,F),A!==0&&(C[I][1]=Q.substring(Q.length-A)+C[I][1],Q=Q.substring(0,Q.length-A),F=F.substring(0,F.length-A))),I-=g+B,C.splice(I,g+B),F.length&&(C.splice(I,0,new _.Diff(Fg,F)),I++),Q.length&&(C.splice(I,0,new _.Diff(lg,Q)),I++),I++):I!==0&&C[I-1][0]==NI?(C[I-1][1]+=C[I][1],C.splice(I,1)):I++,B=0,g=0,F="",Q="";break}C[C.length-1][1]===""&&C.pop();var U=!1;for(I=1;II));A++)F=g,Q=B;return C.length!=A&&C[A][0]===Fg?Q:Q+(I-F)};_.prototype.diff_prettyHtml=function(C){for(var I=[],g=/&/g,B=//g,Q=/\n/g,A=0;A");switch(U){case lg:I[A]=''+s+"";break;case Fg:I[A]=''+s+"";break;case NI:I[A]=""+s+"";break}}return I.join("")};_.prototype.diff_text1=function(C){for(var I=[],g=0;gthis.Match_MaxBits)throw new Error("Pattern too long for this browser.");var B=this.match_alphabet_(I),F=this;function Q(h,m){var L=h/I.length,R=Math.abs(g-m);return F.Match_Distance?L+R/F.Match_Distance:R?1:L}var A=this.Match_Threshold,U=C.indexOf(I,g);U!=-1&&(A=Math.min(Q(0,U),A),U=C.lastIndexOf(I,g+I.length),U!=-1&&(A=Math.min(Q(0,U),A)));var l=1<=b;x--){var a=B[C.charAt(x-1)];if(d===0?e[x]=(e[x+1]<<1|1)&a:e[x]=(e[x+1]<<1|1)&a|((c[x+1]|c[x])<<1|1)|c[x+1],e[x]&l){var n=Q(d,x-1);if(n<=A)if(A=n,U=x-1,U>g)b=Math.max(1,2*g-U);else break}}if(Q(d+1,g)>A)break;c=e}return U};_.prototype.match_alphabet_=function(C){for(var I={},g=0;g"u")B=C,F=this.diff_main(B,I,!0),F.length>2&&(this.diff_cleanupSemantic(F),this.diff_cleanupEfficiency(F));else if(C&&typeof C=="object"&&typeof I>"u"&&typeof g>"u")F=C,B=this.diff_text1(F);else if(typeof C=="string"&&I&&typeof I=="object"&&typeof g>"u")B=C,F=I;else if(typeof C=="string"&&typeof I=="string"&&g&&typeof g=="object")B=C,F=g;else throw new Error("Unknown call format to patch_make.");if(F.length===0)return[];for(var Q=[],A=new _.patch_obj,U=0,l=0,s=0,G=B,t=B,c=0;c=2*this.Patch_Margin&&U&&(this.patch_addContext_(A,G),Q.push(A),A=new _.patch_obj,U=0,G=t,l=s);break}d!==lg&&(l+=b.length),d!==Fg&&(s+=b.length)}return U&&(this.patch_addContext_(A,G),Q.push(A)),Q};_.prototype.patch_deepCopy=function(C){for(var I=[],g=0;gthis.Match_MaxBits?(l=this.match_main(I,U.substring(0,this.Match_MaxBits),A),l!=-1&&(s=this.match_main(I,U.substring(U.length-this.Match_MaxBits),A+U.length-this.Match_MaxBits),(s==-1||l>=s)&&(l=-1))):l=this.match_main(I,U,A),l==-1)F[Q]=!1,B-=C[Q].length2-C[Q].length1;else{F[Q]=!0,B=l-A;var G;if(s==-1?G=I.substring(l,l+U.length):G=I.substring(l,s+this.Match_MaxBits),U==G)I=I.substring(0,l)+this.diff_text2(C[Q].diffs)+I.substring(l+U.length);else{var t=this.diff_main(U,G,!1);if(U.length>this.Match_MaxBits&&this.diff_levenshtein(t)/U.length>this.Patch_DeleteThreshold)F[Q]=!1;else{this.diff_cleanupSemanticLossless(t);for(var c=0,d,b=0;bQ[0][1].length){var A=I-Q[0][1].length;Q[0][1]=g.substring(Q[0][1].length)+Q[0][1],F.start1-=A,F.start2-=A,F.length1+=A,F.length2+=A}if(F=C[C.length-1],Q=F.diffs,Q.length==0||Q[Q.length-1][0]!=NI)Q.push(new _.Diff(NI,g)),F.length1+=I,F.length2+=I;else if(I>Q[Q.length-1][1].length){var A=I-Q[Q.length-1][1].length;Q[Q.length-1][1]+=g.substring(0,A),F.length1+=A,F.length2+=A}return g};_.prototype.patch_splitMax=function(C){for(var I=this.Match_MaxBits,g=0;g2*I?(U.length1+=G.length,F+=G.length,l=!1,U.diffs.push(new _.Diff(s,G)),B.diffs.shift()):(G=G.substring(0,I-U.length1-this.Patch_Margin),U.length1+=G.length,F+=G.length,s===NI?(U.length2+=G.length,Q+=G.length):l=!1,U.diffs.push(new _.Diff(s,G)),G==B.diffs[0][1]?B.diffs.shift():B.diffs[0][1]=B.diffs[0][1].substring(G.length))}A=this.diff_text2(U.diffs),A=A.substring(A.length-this.Patch_Margin);var t=this.diff_text1(B.diffs).substring(0,this.Patch_Margin);t!==""&&(U.length1+=t.length,U.length2+=t.length,U.diffs.length!==0&&U.diffs[U.diffs.length-1][0]===NI?U.diffs[U.diffs.length-1][1]+=t:U.diffs.push(new _.Diff(NI,t))),l||C.splice(++g,0,U)}}};_.prototype.patch_toText=function(C){for(var I=[],g=0;g{(function(C){if(typeof Fi=="object"&&typeof xt<"u")xt.exports=C();else if(typeof define=="function"&&define.amd)define([],C);else{var I;typeof window<"u"?I=window:typeof global<"u"?I=global:typeof self<"u"?I=self:I=this,I.localforage=C()}})(function(){var C,I,g;return function B(F,Q,A){function U(G,t){if(!Q[G]){if(!F[G]){var c=typeof require=="function"&&require;if(!t&&c)return c(G,!0);if(l)return l(G,!0);var d=new Error("Cannot find module '"+G+"'");throw d.code="MODULE_NOT_FOUND",d}var b=Q[G]={exports:{}};F[G][0].call(b.exports,function(Z){var e=F[G][1][Z];return U(e||Z)},b,b.exports,B,F,Q,A)}return Q[G].exports}for(var l=typeof require=="function"&&require,s=0;s"u"&&B(3);var c=Promise;function d(V,X){X&&V.then(function(u){X(null,u)},function(u){X(u)})}function b(V,X,u){typeof X=="function"&&V.then(X),typeof u=="function"&&V.catch(u)}function Z(V){return typeof V!="string"&&(V=String(V)),V}function e(){if(arguments.length&&typeof arguments[arguments.length-1]=="function")return arguments[arguments.length-1]}var x="local-forage-detect-blob-support",a=void 0,n={},h=Object.prototype.toString,m="readonly",L="readwrite";function R(V){for(var X=V.length,u=new ArrayBuffer(X),W=new Uint8Array(u),E=0;E=43)}}).catch(function(){return!1})}function y(V){return typeof a=="boolean"?c.resolve(a):o(V).then(function(X){return a=X,a})}function H(V){var X=n[V.name],u={};u.promise=new c(function(W,E){u.resolve=W,u.reject=E}),X.deferredOperations.push(u),X.dbReady?X.dbReady=X.dbReady.then(function(){return u.promise}):X.dbReady=u.promise}function r(V){var X=n[V.name],u=X.deferredOperations.pop();if(u)return u.resolve(),u.promise}function N(V,X){var u=n[V.name],W=u.deferredOperations.pop();if(W)return W.reject(X),W.promise}function T(V,X){return new c(function(u,W){if(n[V.name]=n[V.name]||wI(),V.db)if(X)H(V),V.db.close();else return u(V.db);var E=[V.name];X&&E.push(V.version);var S=s.open.apply(s,E);X&&(S.onupgradeneeded=function(k){var K=S.result;try{K.createObjectStore(V.storeName),k.oldVersion<=1&&K.createObjectStore(x)}catch(j){if(j.name!=="ConstraintError")throw j}}),S.onerror=function(k){k.preventDefault(),W(S.error)},S.onsuccess=function(){var k=S.result;k.onversionchange=function(K){K.target.close()},u(k),r(V)}})}function M(V){return T(V,!1)}function q(V){return T(V,!0)}function AI(V,X){if(!V.db)return!0;var u=!V.db.objectStoreNames.contains(V.storeName),W=V.versionV.db.version;if(W&&(V.version,V.version=V.db.version),E||u){if(u){var S=V.db.version+1;S>V.version&&(V.version=S)}return!0}return!1}function aI(V){return new c(function(X,u){var W=new FileReader;W.onerror=u,W.onloadend=function(E){var S=btoa(E.target.result||"");X({__local_forage_encoded_blob:!0,data:S,type:V.type})},W.readAsBinaryString(V)})}function uI(V){var X=R(atob(V.data));return t([X],{type:V.type})}function ZI(V){return V&&V.__local_forage_encoded_blob}function XI(V){var X=this,u=X._initReady().then(function(){var W=n[X._dbInfo.name];if(W&&W.dbReady)return W.dbReady});return b(u,V,V),u}function kI(V){H(V);for(var X=n[V.name],u=X.forages,W=0;W0&&(!V.db||S.name==="InvalidStateError"||S.name==="NotFoundError"))return c.resolve().then(function(){if(!V.db||S.name==="NotFoundError"&&!V.db.objectStoreNames.contains(V.storeName)&&V.version<=V.db.version)return V.db&&(V.version=V.db.version+1),q(V)}).then(function(){return kI(V).then(function(){mI(V,X,u,W-1)})}).catch(u);u(S)}}function wI(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function gg(V){var X=this,u={db:null};if(V)for(var W in V)u[W]=V[W];var E=n[u.name];E||(E=wI(),n[u.name]=E),E.forages.push(X),X._initReady||(X._initReady=X.ready,X.ready=XI);var S=[];function k(){return c.resolve()}for(var K=0;K>4,II[E++]=(k&15)<<4|K>>2,II[E++]=(K&3)<<6|j&63;return P}function Tg(V){var X=new Uint8Array(V),u="",W;for(W=0;W>2],u+=eI[(X[W]&3)<<4|X[W+1]>>4],u+=eI[(X[W+1]&15)<<2|X[W+2]>>6],u+=eI[X[W+2]&63];return X.length%3===2?u=u.substring(0,u.length-1)+"=":X.length%3===1&&(u=u.substring(0,u.length-2)+"=="),u}function Vg(V,X){var u="";if(V&&(u=Rg.call(V)),V&&(u==="[object ArrayBuffer]"||V.buffer&&Rg.call(V.buffer)==="[object ArrayBuffer]")){var W,E=jI;V instanceof ArrayBuffer?(W=V,E+=bg):(W=V.buffer,u==="[object Int8Array]"?E+=dI:u==="[object Uint8Array]"?E+=UI:u==="[object Uint8ClampedArray]"?E+=DI:u==="[object Int16Array]"?E+=Ug:u==="[object Uint16Array]"?E+=ZC:u==="[object Int32Array]"?E+=bC:u==="[object Uint32Array]"?E+=yg:u==="[object Float32Array]"?E+=eC:u==="[object Float64Array]"?E+=VC:X(new Error("Failed to get type for BinaryArray"))),X(E+Tg(W))}else if(u==="[object Blob]"){var S=new FileReader;S.onload=function(){var k=MI+V.type+"~"+Tg(this.result);X(jI+$+k)},S.readAsArrayBuffer(V)}else try{X(JSON.stringify(V))}catch(k){X(null,k)}}function $g(V){if(V.substring(0,YI)!==jI)return JSON.parse(V);var X=V.substring(kg),u=V.substring(YI,kg),W;if(u===$&&Ag.test(X)){var E=X.match(Ag);W=E[1],X=X.substring(E[0].length)}var S=Dg(X);switch(u){case bg:return S;case $:return t([S],{type:W});case dI:return new Int8Array(S);case UI:return new Uint8Array(S);case DI:return new Uint8ClampedArray(S);case Ug:return new Int16Array(S);case ZC:return new Uint16Array(S);case bC:return new Int32Array(S);case yg:return new Uint32Array(S);case eC:return new Float32Array(S);case VC:return new Float64Array(S);default:throw new Error("Unkown type: "+u)}}var xC={serialize:Vg,deserialize:$g,stringToBuffer:Dg,bufferToString:Tg};function uB(V,X,u,W){V.executeSql("CREATE TABLE IF NOT EXISTS "+X.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],u,W)}function WC(V){var X=this,u={db:null};if(V)for(var W in V)u[W]=typeof V[W]!="string"?V[W].toString():V[W];var E=new c(function(S,k){try{u.db=openDatabase(u.name,String(u.version),u.description,u.size)}catch(K){return k(K)}u.db.transaction(function(K){uB(K,u,function(){X._dbInfo=u,S()},function(j,P){k(P)})},k)});return u.serializer=xC,E}function ng(V,X,u,W,E,S){V.executeSql(u,W,E,function(k,K){K.code===K.SYNTAX_ERR?k.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[X.storeName],function(j,P){P.rows.length?S(j,K):uB(j,X,function(){j.executeSql(u,W,E,S)},S)},S):S(k,K)},S)}function WF(V,X){var u=this;V=Z(V);var W=new c(function(E,S){u.ready().then(function(){var k=u._dbInfo;k.db.transaction(function(K){ng(K,k,"SELECT * FROM "+k.storeName+" WHERE key = ? LIMIT 1",[V],function(j,P){var II=P.rows.length?P.rows.item(0).value:null;II&&(II=k.serializer.deserialize(II)),E(II)},function(j,P){S(P)})})}).catch(S)});return d(W,X),W}function FB(V,X){var u=this,W=new c(function(E,S){u.ready().then(function(){var k=u._dbInfo;k.db.transaction(function(K){ng(K,k,"SELECT * FROM "+k.storeName,[],function(j,P){for(var II=P.rows,cI=II.length,TI=0;TI0){k(EF.apply(E,[V,j,u,W-1]));return}K(TI)}})})}).catch(K)});return d(S,u),S}function lQ(V,X,u){return EF.apply(this,[V,X,u,1])}function AA(V,X){var u=this;V=Z(V);var W=new c(function(E,S){u.ready().then(function(){var k=u._dbInfo;k.db.transaction(function(K){ng(K,k,"DELETE FROM "+k.storeName+" WHERE key = ?",[V],function(){E()},function(j,P){S(P)})})}).catch(S)});return d(W,X),W}function nU(V){var X=this,u=new c(function(W,E){X.ready().then(function(){var S=X._dbInfo;S.db.transaction(function(k){ng(k,S,"DELETE FROM "+S.storeName,[],function(){W()},function(K,j){E(j)})})}).catch(E)});return d(u,V),u}function UA(V){var X=this,u=new c(function(W,E){X.ready().then(function(){var S=X._dbInfo;S.db.transaction(function(k){ng(k,S,"SELECT COUNT(key) as c FROM "+S.storeName,[],function(K,j){var P=j.rows.item(0).c;W(P)},function(K,j){E(j)})})}).catch(E)});return d(u,V),u}function aU(V,X){var u=this,W=new c(function(E,S){u.ready().then(function(){var k=u._dbInfo;k.db.transaction(function(K){ng(K,k,"SELECT key FROM "+k.storeName+" WHERE id = ? LIMIT 1",[V+1],function(j,P){var II=P.rows.length?P.rows.item(0).key:null;E(II)},function(j,P){S(P)})})}).catch(S)});return d(W,X),W}function sQ(V){var X=this,u=new c(function(W,E){X.ready().then(function(){var S=X._dbInfo;S.db.transaction(function(k){ng(k,S,"SELECT key FROM "+S.storeName,[],function(K,j){for(var P=[],II=0;II '__WebKitDatabaseInfoTable__'",[],function(E,S){for(var k=[],K=0;K0}function cQ(V){var X=this,u={};if(V)for(var W in V)u[W]=V[W];return u.keyPrefix=hU(V,X._defaultConfig),XU()?(X._dbInfo=u,u.serializer=xC,c.resolve()):c.reject()}function oU(V){var X=this,u=X.ready().then(function(){for(var W=X._dbInfo.keyPrefix,E=localStorage.length-1;E>=0;E--){var S=localStorage.key(E);S.indexOf(W)===0&&localStorage.removeItem(S)}});return d(u,V),u}function ms(V,X){var u=this;V=Z(V);var W=u.ready().then(function(){var E=u._dbInfo,S=localStorage.getItem(E.keyPrefix+V);return S&&(S=E.serializer.deserialize(S)),S});return d(W,X),W}function hs(V,X){var u=this,W=u.ready().then(function(){for(var E=u._dbInfo,S=E.keyPrefix,k=S.length,K=localStorage.length,j=1,P=0;P=0;k--){var K=localStorage.key(k);K.indexOf(S)===0&&localStorage.removeItem(K)}}):E=c.reject("Invalid arguments"),d(E,X),E}var uC={_driver:"localStorageWrapper",_initStorage:cQ,_support:as(),iterate:hs,getItem:ms,setItem:xg,removeItem:bI,clear:oU,length:gI,key:Xs,keys:os,dropInstance:wg},EC=function(X,u){return X===u||typeof X=="number"&&typeof u=="number"&&isNaN(X)&&isNaN(u)},Zg=function(X,u){for(var W=X.length,E=0;E"u"?"undefined":A(u))==="object"){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var W in u){if(W==="storeName"&&(u[W]=u[W].replace(/\W/g,"_")),W==="version"&&typeof u[W]!="number")return new Error("Database version must be a number.");this._config[W]=u[W]}return"driver"in u&&u.driver?this.setDriver(this._config.driver):!0}else return typeof u=="string"?this._config[u]:this._config},V.prototype.defineDriver=function(u,W,E){var S=new c(function(k,K){try{var j=u._driver,P=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!u._driver){K(P);return}for(var II=NB.concat("_initStorage"),cI=0,TI=II.length;cI{(function(C,I){typeof el=="object"&&typeof Qi<"u"?I(el,Zl()):typeof define=="function"&&define.amd?define(["exports","localforage"],I):I(C.localforageSetItems=C.localforageSetItems||{},C.localforage)})(el,function(C,I){"use strict";I="default"in I?I.default:I;function g(t){return g.result?g.result:!t||typeof t.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(g.result=t.getSerializer(),g.result)}function B(t,c){c&&t.then(function(d){c(null,d)},function(d){c(d)})}function F(t,c,d,b){function Z(m,L){var R=m||L;return(!m||typeof m!="function")&&typeof R=="string"&&(m=function(y){return y[R]}),m}var e=[];if(Object.prototype.toString.call(t)==="[object Array]"){c=Z(c,"key"),d=Z(d,"value");for(var x=0,a=t.length;x{(function(C,I){typeof Vl=="object"&&typeof Ui<"u"?I(Vl,Zl()):typeof define=="function"&&define.amd?define(["exports","localforage"],I):I(C.localforageGetItems=C.localforageGetItems||{},C.localforage)})(Vl,function(C,I){"use strict";I="default"in I?I.default:I;function g(b){return g.result?g.result:!b||typeof b.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(g.result=b.getSerializer(),g.result)}function B(b,Z){return Z&&b.then(function(e){Z(null,e)},function(e){Z(e)}),b}function F(b,Z){var e=this,x=e.getItem(b).then(function(a){return{key:b,value:a}});return B(x,Z),x}function Q(b){var Z=this,e=new Promise(function(x,a){for(var n=[],h=0,m=b.length;hn?1:0}var x=new Promise(function(a,n){Z.ready().then(function(){var h=Z._dbInfo,m=h.db.transaction(h.storeName,"readonly").objectStore(h.storeName),L=b.sort(e),R=l.bound(b[0],b[b.length-1],!1,!1),o;if("getAll"in m)o=m.getAll(R),o.onsuccess=function(){var r=o.result;r===void 0&&(r=null),a(r)};else{o=m.openCursor(R);var y={},H=0;o.onsuccess=function(){var r=o.result;if(!r){a(y);return}for(var N=r.key;N>L[H];)if(H++,H===L.length){a(y);return}if(N===L[H]){var T=r.value;T===void 0&&(T=null),y[N]=T,r.continue()}else r.continue(L[H])}}o.onerror=function(){n(o.error)}}).catch(n)});return x}function G(b){var Z=this,e=new Promise(function(x,a){Z.ready().then(function(){return g(Z)}).then(function(n){var h=Z._dbInfo;h.db.transaction(function(m){for(var L=new Array(b.length),R=0,o=b.length;RLs});module.exports=C0(kx);var xB=require("obsidian"),QA=require("@codemirror/state"),Mb=require("@codemirror/view");var cg=(Q=>(Q.ADDITION="addition",Q.DELETION="deletion",Q.SUBSTITUTION="substitution",Q.HIGHLIGHT="highlight",Q.COMMENT="comment",Q))(cg||{}),FG={Addition:"addition",Deletion:"deletion",Substitution:"substitution",Highlight:"highlight",Comment:"comment"};var eg={addition:["{++","++}"],deletion:["{--","--}"],substitution:["{~~","~>","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]},QG={"{++":["++}"],"{--":["--}"],"{~~":["~>","~~}"],"{==":["==}"],"{>>":["<<}"]},AG={addition:"plus-circle",deletion:"minus-square",substitution:"replace",highlight:"highlighter",comment:"message-square"};var EU={a:"author",t:"time",d:"done",s:"style",c:"color"},KC=class{constructor(I,g,B,F,Q,A){this.from=I;this.to=g;this.type=B;this.repr=F;this.text=Q;this.metadata=A;if(A!==void 0){let U=A-I,l=Q.slice(3,U);this.text=Q.slice(0,3)+Q.slice(U+2);try{this.fields=JSON.parse(l);for(let s in this.fields)s in EU&&(this.fields[EU[s]]=this.fields[s],delete this.fields[s])}catch{this.fields={}}}}fields={};replies=[];get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(I=>I.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(I,g){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(I){return I in EU&&(I=EU[I]),I in this.fields&&(delete this.fields[I],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(I,g){return this.fields[I]=g,this.set_metadata(this.fields)}set_metadata(I){return this.fields=I,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(I)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(I)+"@@"}]}has_comment(I){return this.thread.includes(I)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(I){return this.type===I.type&&this.from===I.from&&this.to===I.to&&this.replies.length===I.replies.length&&this.full_text===I.full_text}left_adjacent(I){return this.from===I.to}right_adjacent(I){return this.to===I.from}part_is_empty(I){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(I=!1){return I?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(I,g){return I-=this.range_front,g-=this.range_front,g<=0||I===g?"":this.text.slice(Math.max(3,I),Math.min(this.text.length-3,g))}partially_in_range(I,g){return!(I>this.to||gthis.full_range_back||gg:this.from<=I&&this.to>=g}part_encloses_range(I,g,B){return this.encloses_range(I,g)}accept(I=!0){return this.text}reject(I=!0){return this.text}touches(I){return this.from===I||this.to===I}cursor_inside(I){return this.from<=I&&I<=this.to}cursor_before_range(I){return Ithis.to}cursor_move_inside(I,g=!1){return Math.min(Math.max(g&&this.metadata?this.metadata+2:this.from+3,I),this.to-3)}cursor_pass_syntax(I,g,B=!1){return g?(this.touches_left_bracket(I,!0,!1,B)&&(I=B&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(I,!1,!0)&&(I=this.to)):(this.touches_right_bracket(I,!0,!1)&&(I=this.to-3),this.touches_left_bracket(I,!1,!0,B)&&(I=this.from)),I}cursor_move_through(I,g,B){return B=="unchanged"||!this.cursor_inside(I)||(B=="ignore_completely"?I=g?this.to:this.from:I=this.cursor_pass_syntax(I,g,B=="ignore_metadata")),I}touches_left_bracket(I,g=!1,B=!1,F=!1){return I+(g?0:1)>=this.from&&I+(B?0:1)<=(F&&this.metadata?this.metadata+2:this.from+3)}touches_separator(I,g=!1,B=!1){return!1}touches_right_bracket(I,g=!1,B=!1){return I-(B?0:1)>=this.to-3&&I-(g?0:1)<=this.to}touches_bracket(I,g,B=!1,F=!1){return g?this.touches_left_bracket(I,B,F):this.touches_right_bracket(I,B,F)}postprocess(I=!0,g=0,B="div",F=null,Q){let A=Q??this.text;return!Q&&I&&(this.to>=A.length&&!A.endsWith(eg[this.type].at(-1))?A=this.unwrap_bracket(!0):A=this.unwrap()),`<${B} class='cmtr-${this.repr.toLowerCase()}'>${A}`}apply_offset(I){this.from+=I,this.to+=I,this.metadata!==void 0&&(this.metadata+=I)}split_range(I){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var pF=class extends KC{constructor(I,g,B,F){super(I,g,"addition","Addition",B,F)}accept(){return this.unwrap()}reject(){return""}postprocess(I=!0,g=0,B="div",F=null,Q){let A=Q??this.text;!Q&&I&&(this.to>=A.length&&!A.endsWith(eg[this.type].at(-1))?A=this.unwrap_bracket(!0):A=this.unwrap());let U="cmtr-preview";return g===0?U+=" cmtr-addition":g===2&&(A=""),`<${B} class='${U}'>${A}`}};var GQ=class extends KC{reply_depth=0;attached_comment=null;get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}accept(I=!0){return I?"":this.unwrap()}reject(I=!0){return I?"":this.unwrap()}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(I){this.attach_to_range(I.type==="comment"?I.base_range:I)}attach_to_range(I){I.replies.push(this),this.reply_depth=I.replies.length-(I.type==="comment"?0:1),this.attached_comment=I}constructor(I,g,B,F){super(I,g,"comment","Comment",B,F)}};var iQ=class extends KC{constructor(I,g,B,F){super(I,g,"deletion","Deletion",B,F)}accept(){return""}reject(){return this.unwrap()}postprocess(I=!0,g=0,B="div",F=null,Q){let A=Q??this.text;!Q&&I&&(this.to>=A.length&&!A.endsWith(eg[this.type].at(-1))?A=this.unwrap_bracket(!0):A=this.unwrap());let U="cmtr-preview";return g===0?U+=" cmtr-deletion":g===1&&(A=""),`<${B} class='${U}'>${A}`}};var dQ=class extends KC{constructor(I,g,B,F){super(I,g,"highlight","Highlight",B,F)}};var LB=class extends KC{constructor(g,B,F,Q,A){super(g,F,"substitution","Substitution",Q,A);this.middle=B}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(g,B){return B<=this.middle+2?"deletion":g>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(g,B){return g-=this.range_front,B-=this.range_front,g=Math.max(0,g),B<=0?this.unwrap_parts():B<=this.char_middle?[this.text.slice(3,g)+this.text.slice(B,this.char_middle),this.text.slice(this.char_middle+2,-3)]:g>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,g)+this.text.slice(B,-3)]:[this.text.slice(3,g),this.text.slice(B,-3)]}unwrap_parts_bracket(g,B=0){return g?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(g,B){return g-=this.range_front,B-=this.range_front,B<=0||g===B?"":g>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,g),Math.min(this.text.length-3,B)):B<=this.char_middle?this.text.slice(Math.max(3,g),Math.min(this.char_middle,B)):this.text.slice(Math.max(3,g),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,B))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(g,B=!1,F=!1){return g+(B?1:0)>=this.middle&&g-(F?0:1)<=this.middle+2}contains_separator(g,B){return g<=this.middle+2&&B>=this.middle}contains_part(g,B,F=!0){return F?Bthis.middle+2?!1:void 0:B<=this.middle?!0:g>=this.middle+2?!1:void 0}cursor_pass_syntax(g,B,F=!1){return B?(this.touches_left_bracket(g,!0,!1,F)&&(g=F&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(g,!1,!0)&&(g=this.middle+2),this.touches_right_bracket(g,!1,!0)&&(g=this.to)):(this.touches_right_bracket(g,!0,!1)&&(g=this.to-3),this.touches_separator(g,!1,!0)&&(g=this.middle),this.touches_left_bracket(g,!1,!0,F)&&(g=this.from)),g}part_encloses_range(g,B,F){return F?this.from<=g&&B<=this.middle+2:this.middle<=g&&B<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(g){return g?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(g=!0,B=0,F="div",Q=null,A){let U=A??this.text,l=[U];!A&&g&&(this.to>=U.length&&!U.endsWith(eg.substitution[2])?l=this.unwrap_parts_bracket(!0):this.from<=0&&!U.startsWith(eg.substitution[0])?l=this.unwrap_parts_bracket(!1):l=this.unwrap_parts());let s="cmtr-preview";return l.length===1&&(l[+Q]=l[0],l[+!Q]=""),U="",B===0?(l[0].length&&(U+=`<${F} class='${s} cmtr-deletion'>${l[0]}`),l[1].length&&(U+=`<${F} class='${s} cmtr-addition'>${l[1]}`)):B===1?l[1].length&&(U+=`<${F} class='${s}'>${l[1]}`):l[0].length&&(U+=`<${F} class='${s}'>${l[0]}`),U}apply_offset(g){this.from+=g,this.middle+=g,this.to+=g,this.metadata!==void 0&&(this.metadata+=g)}split_range(g){let B=super.split_range(g);return g<=this.middle?B[0]=eg.substitution[1]+B[0]:B[1]=B[1]+eg.substitution[1],B}cursor_move_inside(g,B=!1){return g=super.cursor_move_inside(g,B),g==this.middle+1&&(g=this.middle+2),g}};var xu=require("@codemirror/state");var B0=class Ws{constructor(I,g){this.low=I,this.high=g}clone(){return new Ws(this.low,this.high)}get max(){return this.clone()}less_than(I){return this.lowI.high?this.high:I.high)}output(){return[this.low,this.high]}static comparable_max(I,g){return I.merge(g)}static comparable_less_than(I,g){return Il&&([U,l]=[l,U]),this.item.key=new B0(U,l)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===Ig}_value_less_than(I){return this.item.value&&I.item.value&&this.item.value.less_than?this.item.value.less_than(I.item.value):this.item.valueI++),I}get keys(){let I=[];return this.tree_walk(this.root,g=>I.push(g.item.key.output?g.item.key.output():g.item.key)),I}get values(){let I=[];return this.tree_walk(this.root,g=>I.push(g.item.value)),I}get items(){let I=[];return this.tree_walk(this.root,g=>I.push({key:g.item.key.output?g.item.key.output():g.item.key,value:g.item.value})),I}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(I,g=I){if(I===void 0)return;let B=new HB(I,g,this.nil_node,this.nil_node,null,zg);return this.tree_insert(B),this.recalc_max(B),B}exist(I,g=I){let B=new HB(I,g);return!!this.tree_search(this.root,B)}remove(I,g=I){let B=new HB(I,g),F=this.tree_search(this.root,B);return F&&this.tree_delete(F),F}search(I,g=(B,F)=>B===F?F.output():B){let B=new HB(I),F=[];return this.tree_search_interval(this.root,B,F),F.map(Q=>g(Q.item.value,Q.item.key))}intersect_any(I){let g=new HB(I);return this.tree_find_any_interval(this.root,g)}forEach(I){this.tree_walk(this.root,g=>I(g.item.key,g.item.value))}map(I){let g=new C;return this.tree_walk(this.root,B=>g.insert(B.item.key,I(B.item.value,B.item.key))),g}*iterate(I,g=(B,F)=>B===F?F.output():B){let B;for(I?B=this.tree_search_nearest_forward(this.root,new HB(I)):this.root&&(B=this.local_minimum(this.root));B;)yield g(B.item.value,B.item.key),B=this.tree_successor(B)}recalc_max(I){let g=I;for(;g.parent!=null;)g.parent.update_max(),g=g.parent}tree_insert(I){let g=this.root,B=null;if(this.root==null||this.root===this.nil_node)this.root=I;else{for(;g!==this.nil_node;)B=g,I.less_than(g)?g=g.left:g=g.right;I.parent=B,I.less_than(B)?B.left=I:B.right=I}this.insert_fixup(I)}insert_fixup(I){let g,B;for(g=I;g!==this.root&&g.parent.color===zg;)g.parent===g.parent.parent.left?(B=g.parent.parent.right,B.color===zg?(g.parent.color=Ig,B.color=Ig,g.parent.parent.color=zg,g=g.parent.parent):(g===g.parent.right&&(g=g.parent,this.rotate_left(g)),g.parent.color=Ig,g.parent.parent.color=zg,this.rotate_right(g.parent.parent))):(B=g.parent.parent.left,B.color===zg?(g.parent.color=Ig,B.color=Ig,g.parent.parent.color=zg,g=g.parent.parent):(g===g.parent.left&&(g=g.parent,this.rotate_right(g)),g.parent.color=Ig,g.parent.parent.color=zg,this.rotate_left(g.parent.parent)));this.root.color=Ig}tree_delete(I){let g,B;I.left===this.nil_node||I.right===this.nil_node?g=I:g=this.tree_successor(I),g.left!==this.nil_node?B=g.left:B=g.right,B.parent=g.parent,g===this.root?this.root=B:(g===g.parent.left?g.parent.left=B:g.parent.right=B,g.parent.update_max()),this.recalc_max(B),g!==I&&(I.copy_data(g),I.update_max(),this.recalc_max(I)),g.color===Ig&&this.delete_fixup(B)}delete_fixup(I){let g=I,B;for(;g!==this.root&&g.parent!=null&&g.color===Ig;)g===g.parent.left?(B=g.parent.right,B.color===zg&&(B.color=Ig,g.parent.color=zg,this.rotate_left(g.parent),B=g.parent.right),B.left.color===Ig&&B.right.color===Ig?(B.color=zg,g=g.parent):(B.right.color===Ig&&(B.color=zg,B.left.color=Ig,this.rotate_right(B),B=g.parent.right),B.color=g.parent.color,g.parent.color=Ig,B.right.color=Ig,this.rotate_left(g.parent),g=this.root)):(B=g.parent.left,B.color===zg&&(B.color=Ig,g.parent.color=zg,this.rotate_right(g.parent),B=g.parent.left),B.left.color===Ig&&B.right.color===Ig?(B.color=zg,g=g.parent):(B.left.color===Ig&&(B.color=zg,B.right.color=Ig,this.rotate_left(B),B=g.parent.left),B.color=g.parent.color,g.parent.color=Ig,B.left.color=Ig,this.rotate_right(g.parent),g=this.root));g.color=Ig}tree_search(I,g){if(!(I==null||I===this.nil_node))return g.equal_to(I)?I:g.less_than(I)?this.tree_search(I.left,g):this.tree_search(I.right,g)}tree_search_nearest_forward(I,g){let B,F=I;for(;F&&F!==this.nil_node;)F.less_than(g)?F.intersect(g)?(B=F,F=F.left):F=F.right:((!B||F.less_than(B))&&(B=F),F=F.left);return B||null}tree_search_interval(I,g,B){I!=null&&I!==this.nil_node&&(I.left!==this.nil_node&&!I.not_intersect_left_subtree(g)&&this.tree_search_interval(I.left,g,B),I.intersect(g)&&B.push(I),I.right!==this.nil_node&&!I.not_intersect_right_subtree(g)&&this.tree_search_interval(I.right,g,B))}tree_find_any_interval(I,g){let B=!1;return I!=null&&I!==this.nil_node&&(I.left!==this.nil_node&&!I.not_intersect_left_subtree(g)&&(B=this.tree_find_any_interval(I.left,g)),B||(B=I.intersect(g)),!B&&I.right!==this.nil_node&&!I.not_intersect_right_subtree(g)&&(B=this.tree_find_any_interval(I.right,g))),B}local_minimum(I){let g=I;for(;g.left!=null&&g.left!==this.nil_node;)g=g.left;return g}local_maximum(I){let g=I;for(;g.right!=null&&g.right!==this.nil_node;)g=g.right;return g}tree_successor(I){let g,B,F;if(I.right!==this.nil_node)g=this.local_minimum(I.right);else{for(B=I,F=I.parent;F!=null&&F.right===B;)B=F,F=F.parent;g=F}return g}rotate_left(I){let g=I.right;I.right=g.left,g.left!==this.nil_node&&(g.left.parent=I),g.parent=I.parent,I===this.root?this.root=g:I===I.parent.left?I.parent.left=g:I.parent.right=g,g.left=I,I.parent=g,I!=null&&I!==this.nil_node&&I.update_max(),g=I.parent,g!=null&&g!==this.nil_node&&g.update_max()}rotate_right(I){let g=I.left;I.left=g.right,g.right!==this.nil_node&&(g.right.parent=I),g.parent=I.parent,I===this.root?this.root=g:I===I.parent.left?I.parent.left=g:I.parent.right=g,g.right=I,I.parent=g,I!==null&&I!==this.nil_node&&I.update_max(),g=I.parent,g!=null&&g!==this.nil_node&&g.update_max()}tree_walk(I,g){I!=null&&I!==this.nil_node&&(this.tree_walk(I.left,g),g(I),this.tree_walk(I.right,g))}testRedBlackProperty(){let I=!0;return this.tree_walk(this.root,function(g){g.color===zg&&(g.left.color===Ig&&g.right.color===Ig||(I=!1))}),I}testBlackHeightProperty(I){let g=0,B=0,F=0;if(I.color===Ig&&g++,I.left!==this.nil_node?B=this.testBlackHeightProperty(I.left):B=1,I.right!==this.nil_node?F=this.testBlackHeightProperty(I.right):F=1,B!==F)throw new Error("Red-black height property violated");return g+=B,g}};var rU=class{ranges;tree;constructor(I){this.ranges=I,this.tree=new NU;for(let g of I)this.tree.insert([g.from,g.to],g)}empty(){return this.ranges.length===0}get(I){return I<0?this.ranges[this.ranges.length+I]:this.ranges[I]}at_cursor(I,g=!1){let B=this.tree.search([I,I]);return B.length?g&&B.length>1?B[1]:B[0]:void 0}contains_range(I,g){return this.tree.intersect_any([I,g])}range_adjacent_to_cursor(I,g,B=!1,F=!1){let Q=g?this.ranges.slice().reverse():this.ranges;return F?Q.find(A=>g?(B?A.from:A.to)g?(B?A.from:A.to)<=I:I<=(B?A.to:A.from))}adjacent_range(I,g,B=!1){let F=this.ranges.findIndex(A=>A===I);if(F===-1)return;let Q=g?this.ranges[F-1]:this.ranges[F+1];if(Q)if(B){if(g?Q.to===I.from:I.to===Q.from)return Q}else return Q}ranges_in_interval(I,g){return this.tree.search([I,g])}ranges_in_intervals(I){let g=new Set;for(let B of I)for(let F of this.tree.search([B.from,B.to]))if(g.add(F),F.base_range){g.add(F.base_range);for(let Q of F.base_range.replies)g.add(Q)}return Array.from(g).sort((B,F)=>B.from-F.from)}unwrap_in_range(I,g=0,B=I.length,F=null){let Q,A;if(F||(F=this.ranges_in_interval(g,B)),F.length===0)return{output:I.sliceString(g,B),from:g,to:B};let U="";g=F.at(-1).to?U+=I.sliceString(F.at(-1).to,B):A=F.at(-1);let s=Q?Q.cursor_pass_syntax(g,!1):g,G=A?A.cursor_pass_syntax(B,!0):B;return(s!==g||g===Q?.from)&&(Q=void 0),(G!==B||B===A?.to)&&(A=void 0),{output:U,from:s,to:G,front_range:Q,back_range:A}}};var rL=require("@codemirror/view");var Yu=require("@codemirror/state");var yu=require("@codemirror/state");function lG(C){return C.ranges.length===1&&C.ranges[0].anchor===C.ranges[0].head}function bQ(C){return C.startState.selection.ranges[0].from!==C.selection.ranges[0].from||C.startState.selection.ranges[0].to!==C.selection.ranges[0].to}function cA(C,I,g){let B=[],F=0;return I.iterChanges((Q,A,U,l,s)=>{B.push({from:Q,to:A,anchor:C.ranges[F].anchor,offset:{removed:A-Q,added:l-U},inserted:s.toString(),deleted:A-Q?g.sliceString(Q,A):"",selection:C.ranges[F].anchor!==C.ranges[F].head}),F{throw new Error("This node type doesn't define a deserialize function")})}add(I){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof I!="function"&&(I=JB.match(I)),g=>{let B=I(g);return B===void 0?null:[this,B]}}};dg.closedBy=new dg({deserialize:C=>C.split(" ")});dg.openedBy=new dg({deserialize:C=>C.split(" ")});dg.group=new dg({deserialize:C=>C.split(" ")});dg.isolate=new dg({deserialize:C=>{if(C&&C!="rtl"&&C!="ltr"&&C!="auto")throw new RangeError("Invalid value for isolate: "+C);return C||"auto"}});dg.contextHash=new dg({perNode:!0});dg.lookAhead=new dg({perNode:!0});dg.mounted=new dg({perNode:!0});var ZQ=class{constructor(I,g,B){this.tree=I,this.overlay=g,this.parser=B}static get(I){return I&&I.props&&I.props[dg.mounted.id]}},Q0=Object.create(null),JB=class C{constructor(I,g,B,F=0){this.name=I,this.props=g,this.id=B,this.flags=F}static define(I){let g=I.props&&I.props.length?Object.create(null):Q0,B=(I.top?1:0)|(I.skipped?2:0)|(I.error?4:0)|(I.name==null?8:0),F=new C(I.name||"",g,I.id,B);if(I.props){for(let Q of I.props)if(Array.isArray(Q)||(Q=Q(F)),Q){if(Q[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");g[Q[0].id]=Q[1]}}return F}prop(I){return this.props[I.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(I){if(typeof I=="string"){if(this.name==I)return!0;let g=this.prop(dg.group);return g?g.indexOf(I)>-1:!1}return this.id==I}static match(I){let g=Object.create(null);for(let B in I)for(let F of B.split(" "))g[F]=I[B];return B=>{for(let F=B.prop(dg.group),Q=-1;Q<(F?F.length:0);Q++){let A=g[Q<0?B.name:F[Q]];if(A)return A}}}};JB.none=new JB("",Object.create(null),0,8);var pU=new WeakMap,cG=new WeakMap,IC;(function(C){C[C.ExcludeBuffers=1]="ExcludeBuffers",C[C.IncludeAnonymous=2]="IncludeAnonymous",C[C.IgnoreMounts=4]="IgnoreMounts",C[C.IgnoreOverlays=8]="IgnoreOverlays"})(IC||(IC={}));var YB=class C{constructor(I,g,B,F,Q){if(this.type=I,this.children=g,this.positions=B,this.length=F,this.props=null,Q&&Q.length){this.props=Object.create(null);for(let[A,U]of Q)this.props[typeof A=="number"?A:A.id]=U}}toString(){let I=ZQ.get(this);if(I&&!I.overlay)return I.tree.toString();let g="";for(let B of this.children){let F=B.toString();F&&(g&&(g+=","),g+=F)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(g.length?"("+g+")":""):g}cursor(I=0){return new dA(this.topNode,I)}cursorAt(I,g=0,B=0){let F=pU.get(this)||this.topNode,Q=new dA(F);return Q.moveTo(I,g),pU.set(this,Q._tree),Q}get topNode(){return new RB(this,0,0,null)}resolve(I,g=0){let B=GA(pU.get(this)||this.topNode,I,g,!1);return pU.set(this,B),B}resolveInner(I,g=0){let B=GA(cG.get(this)||this.topNode,I,g,!0);return cG.set(this,B),B}resolveStack(I,g=0){return A0(this,I,g)}iterate(I){let{enter:g,leave:B,from:F=0,to:Q=this.length}=I,A=I.mode||0,U=(A&IC.IncludeAnonymous)>0;for(let l=this.cursor(A|IC.IncludeAnonymous);;){let s=!1;if(l.from<=Q&&l.to>=F&&(!U&&l.type.isAnonymous||g(l)!==!1)){if(l.firstChild())continue;s=!0}for(;s&&B&&(U||!l.type.isAnonymous)&&B(l),!l.nextSibling();){if(!l.parent())return;s=!0}}}prop(I){return I.perNode?this.props?this.props[I.id]:void 0:this.type.prop(I)}get propValues(){let I=[];if(this.props)for(let g in this.props)I.push([+g,this.props[g]]);return I}balance(I={}){return this.children.length<=8?this:Ys(JB.none,this.children,this.positions,0,this.children.length,0,this.length,(g,B,F)=>new C(this.type,g,B,F,this.propValues),I.makeTree||((g,B,F)=>new C(JB.none,g,B,F)))}static build(I){return U0(I)}};YB.empty=new YB(JB.none,[],[],0);var Es=class C{constructor(I,g){this.buffer=I,this.index=g}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new C(this.buffer,this.index)}},lF=class C{constructor(I,g,B){this.buffer=I,this.length=g,this.set=B}get type(){return JB.none}toString(){let I=[];for(let g=0;g0));l=A[l+3]);return U}slice(I,g,B){let F=this.buffer,Q=new Uint16Array(g-I),A=0;for(let U=I,l=0;U=I&&gI;case 1:return g<=I&&B>I;case 2:return B>I;case 4:return!0}}function GA(C,I,g,B){for(var F;C.from==C.to||(g<1?C.from>=I:C.from>I)||(g>-1?C.to<=I:C.to0?U.length:-1;I!=s;I+=g){let G=U[I],t=l[I]+A.from;if(dG(F,B,t,t+G.length)){if(G instanceof lF){if(Q&IC.ExcludeBuffers)continue;let c=G.findChild(0,G.buffer.length,g,B-t,F);if(c>-1)return new iA(new rs(A,G,I,t),null,c)}else if(Q&IC.IncludeAnonymous||!G.type.isAnonymous||Hs(G)){let c;if(!(Q&IC.IgnoreMounts)&&(c=ZQ.get(G))&&!c.overlay)return new C(c.tree,t,I,A);let d=new C(G,t,I,A);return Q&IC.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(g<0?G.children.length-1:0,g,B,F)}}}if(Q&IC.IncludeAnonymous||!A.type.isAnonymous||(A.index>=0?I=A.index+g:I=g<0?-1:A._parent._tree.children.length,A=A._parent,!A))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(I){return this.nextChild(0,1,I,2)}childBefore(I){return this.nextChild(this._tree.children.length-1,-1,I,-2)}enter(I,g,B=0){let F;if(!(B&IC.IgnoreOverlays)&&(F=ZQ.get(this._tree))&&F.overlay){let Q=I-this.from;for(let{from:A,to:U}of F.overlay)if((g>0?A<=Q:A=Q:U>Q))return new C(F.tree,F.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,I,g,B)}nextSignificantParent(){let I=this;for(;I.type.isAnonymous&&I._parent;)I=I._parent;return I}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function GG(C,I,g,B){let F=C.cursor(),Q=[];if(!F.firstChild())return Q;if(g!=null){for(let A=!1;!A;)if(A=F.type.is(g),!F.nextSibling())return Q}for(;;){if(B!=null&&F.type.is(B))return Q;if(F.type.is(I)&&Q.push(F.node),!F.nextSibling())return B==null?Q:[]}}function Ns(C,I,g=I.length-1){for(let B=C;g>=0;B=B.parent){if(!B)return!1;if(!B.type.isAnonymous){if(I[g]&&I[g]!=B.name)return!1;g--}}return!0}var rs=class{constructor(I,g,B,F){this.parent=I,this.buffer=g,this.index=B,this.start=F}},iA=class C extends YU{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(I,g,B){super(),this.context=I,this._parent=g,this.index=B,this.type=I.buffer.set.types[I.buffer.buffer[B]]}child(I,g,B){let{buffer:F}=this.context,Q=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.context.start,B);return Q<0?null:new C(this.context,this,Q)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(I){return this.child(1,I,2)}childBefore(I){return this.child(-1,I,-2)}enter(I,g,B=0){if(B&IC.ExcludeBuffers)return null;let{buffer:F}=this.context,Q=F.findChild(this.index+4,F.buffer[this.index+3],g>0?1:-1,I-this.context.start,g);return Q<0?null:new C(this.context,this,Q)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(I){return this._parent?null:this.context.parent.nextChild(this.context.index+I,I,0,4)}get nextSibling(){let{buffer:I}=this.context,g=I.buffer[this.index+3];return g<(this._parent?I.buffer[this._parent.index+3]:I.buffer.length)?new C(this.context,this._parent,g):this.externalSibling(1)}get prevSibling(){let{buffer:I}=this.context,g=this._parent?this._parent.index+4:0;return this.index==g?this.externalSibling(-1):new C(this.context,this._parent,I.findChild(g,this.index,-1,0,4))}get tree(){return null}toTree(){let I=[],g=[],{buffer:B}=this.context,F=this.index+4,Q=B.buffer[this.index+3];if(Q>F){let A=B.buffer[this.index+1];I.push(B.slice(F,Q,A)),g.push(0)}return new YB(this.type,I,g,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function bG(C){if(!C.length)return null;let I=0,g=C[0];for(let Q=1;Qg.from||A.to=I){let U=new RB(A.tree,A.overlay[0].from+Q.from,-1,Q);(F||(F=[B])).push(GA(U,I,g,!1))}}return F?bG(F):B}var dA=class{get name(){return this.type.name}constructor(I,g=0){if(this.mode=g,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,I instanceof RB)this.yieldNode(I);else{this._tree=I.context.parent,this.buffer=I.context;for(let B=I._parent;B;B=B._parent)this.stack.unshift(B.index);this.bufferNode=I,this.yieldBuf(I.index)}}yieldNode(I){return I?(this._tree=I,this.type=I.type,this.from=I.from,this.to=I.to,!0):!1}yieldBuf(I,g){this.index=I;let{start:B,buffer:F}=this.buffer;return this.type=g||F.set.types[F.buffer[I]],this.from=B+F.buffer[I+1],this.to=B+F.buffer[I+2],!0}yield(I){return I?I instanceof RB?(this.buffer=null,this.yieldNode(I)):(this.buffer=I.context,this.yieldBuf(I.index,I.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(I,g,B){if(!this.buffer)return this.yield(this._tree.nextChild(I<0?this._tree._tree.children.length-1:0,I,g,B,this.mode));let{buffer:F}=this.buffer,Q=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.buffer.start,B);return Q<0?!1:(this.stack.push(this.index),this.yieldBuf(Q))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(I){return this.enterChild(1,I,2)}childBefore(I){return this.enterChild(-1,I,-2)}enter(I,g,B=this.mode){return this.buffer?B&IC.ExcludeBuffers?!1:this.enterChild(1,I,g):this.yield(this._tree.enter(I,g,B))}parent(){if(!this.buffer)return this.yieldNode(this.mode&IC.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let I=this.mode&IC.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(I)}sibling(I){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+I,I,0,4,this.mode)):!1;let{buffer:g}=this.buffer,B=this.stack.length-1;if(I<0){let F=B<0?0:this.stack[B]+4;if(this.index!=F)return this.yieldBuf(g.findChild(F,this.index,-1,0,4))}else{let F=g.buffer[this.index+3];if(F<(B<0?g.buffer.length:g.buffer[this.stack[B]+3]))return this.yieldBuf(F)}return B<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+I,I,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(I){let g,B,{buffer:F}=this;if(F){if(I>0){if(this.index-1)for(let Q=g+I,A=I<0?-1:B._tree.children.length;Q!=A;Q+=I){let U=B._tree.children[Q];if(this.mode&IC.IncludeAnonymous||U instanceof lF||!U.type.isAnonymous||Hs(U))return!1}return!0}move(I,g){if(g&&this.enterChild(I,0,4))return!0;for(;;){if(this.sibling(I))return!0;if(this.atLastNode(I)||!this.parent())return!1}}next(I=!0){return this.move(1,I)}prev(I=!0){return this.move(-1,I)}moveTo(I,g=0){for(;(this.from==this.to||(g<1?this.from>=I:this.from>I)||(g>-1?this.to<=I:this.to=0;){for(let A=I;A;A=A._parent)if(A.index==F){if(F==this.index)return A;g=A,B=Q+1;break I}F=this.stack[--Q]}for(let F=B;F=0;Q--){if(Q<0)return Ns(this._tree,I,F);let A=B[g.buffer[this.stack[Q]]];if(!A.isAnonymous){if(I[F]&&I[F]!=A.name)return!1;F--}}return!0}};function Hs(C){return C.children.some(I=>I instanceof lF||!I.type.isAnonymous||Hs(I))}function U0(C){var I;let{buffer:g,nodeSet:B,maxBufferLength:F=1024,reused:Q=[],minRepeatType:A=B.types.length}=C,U=Array.isArray(g)?new Es(g,g.length):g,l=B.types,s=0,G=0;function t(m,L,R,o,y,H){let{id:r,start:N,end:T,size:M}=U,q=G,AI=s;for(;M<0;)if(U.next(),M==-1){let kI=Q[r];R.push(kI),o.push(N-m);return}else if(M==-3){s=r;return}else if(M==-4){G=r;return}else throw new RangeError(`Unrecognized record size: ${M}`);let aI=l[r],uI,ZI,XI=N-m;if(T-N<=F&&(ZI=e(U.pos-L,y))){let kI=new Uint16Array(ZI.size-ZI.skip),mI=U.pos-ZI.size,wI=kI.length;for(;U.pos>mI;)wI=x(ZI.start,kI,wI);uI=new lF(kI,T-ZI.start,B),XI=ZI.start-m}else{let kI=U.pos-M;U.next();let mI=[],wI=[],gg=r>=A?r:-1,HI=0,hI=T;for(;U.pos>kI;)gg>=0&&U.id==gg&&U.size>=0?(U.end<=hI-F&&(b(mI,wI,N,HI,U.end,hI,gg,q,AI),HI=mI.length,hI=U.end),U.next()):H>2500?c(N,kI,mI,wI):t(N,kI,mI,wI,gg,H+1);if(gg>=0&&HI>0&&HI-1&&HI>0){let WI=d(aI,AI);uI=Ys(aI,mI,wI,0,mI.length,0,T-N,WI,WI)}else uI=Z(aI,mI,wI,T-N,q-T,AI)}R.push(uI),o.push(XI)}function c(m,L,R,o){let y=[],H=0,r=-1;for(;U.pos>L;){let{id:N,start:T,end:M,size:q}=U;if(q>4)U.next();else{if(r>-1&&T=0;M-=3)N[q++]=y[M],N[q++]=y[M+1]-T,N[q++]=y[M+2]-T,N[q++]=q;R.push(new lF(N,y[2]-T,B)),o.push(T-m)}}function d(m,L){return(R,o,y)=>{let H=0,r=R.length-1,N,T;if(r>=0&&(N=R[r])instanceof YB){if(!r&&N.type==m&&N.length==y)return N;(T=N.prop(dg.lookAhead))&&(H=o[r]+N.length+T)}return Z(m,R,o,y,H,L)}}function b(m,L,R,o,y,H,r,N,T){let M=[],q=[];for(;m.length>o;)M.push(m.pop()),q.push(L.pop()+R-y);m.push(Z(B.types[r],M,q,H-y,N-H,T)),L.push(y-R)}function Z(m,L,R,o,y,H,r){if(H){let N=[dg.contextHash,H];r=r?[N].concat(r):[N]}if(y>25){let N=[dg.lookAhead,y];r=r?[N].concat(r):[N]}return new YB(m,L,R,o,r)}function e(m,L){let R=U.fork(),o=0,y=0,H=0,r=R.end-F,N={size:0,start:0,skip:0};I:for(let T=R.pos-m;R.pos>T;){let M=R.size;if(R.id==L&&M>=0){N.size=o,N.start=y,N.skip=H,H+=4,o+=4,R.next();continue}let q=R.pos-M;if(M<0||q=A?4:0,aI=R.start;for(R.next();R.pos>q;){if(R.size<0)if(R.size==-3)AI+=4;else break I;else R.id>=A&&(AI+=4);R.next()}y=aI,o+=M,H+=AI}return(L<0||o==m)&&(N.size=o,N.start=y,N.skip=H),N.size>4?N:void 0}function x(m,L,R){let{id:o,start:y,end:H,size:r}=U;if(U.next(),r>=0&&o4){let T=U.pos-(r-4);for(;U.pos>T;)R=x(m,L,R)}L[--R]=N,L[--R]=H-m,L[--R]=y-m,L[--R]=o}else r==-3?s=o:r==-4&&(G=o);return R}let a=[],n=[];for(;U.pos>0;)t(C.start||0,C.bufferStart||0,a,n,-1,0);let h=(I=C.length)!==null&&I!==void 0?I:a.length?n[0]+a[0].length:0;return new YB(l[C.topID],a.reverse(),n.reverse(),h)}var iG=new WeakMap;function HU(C,I){if(!C.isAnonymous||I instanceof lF||I.type!=C)return 1;let g=iG.get(I);if(g==null){g=1;for(let B of I.children){if(B.type!=C||!(B instanceof YB)){g=1;break}g+=HU(C,B)}iG.set(I,g)}return g}function Ys(C,I,g,B,F,Q,A,U,l){let s=0;for(let b=B;b=G)break;L+=R}if(n==h+1){if(L>G){let R=b[h];d(R.children,R.positions,0,R.children.length,Z[h]+a);continue}t.push(b[h])}else{let R=Z[n-1]+b[n-1].length-m;t.push(Ys(C,b,Z,h,n,m,R,null,l))}c.push(m+a-Q)}}return d(I,g,B,F,0),(U||l)(t,c,A)}var eQ=class C{constructor(I,g,B,F,Q=!1,A=!1){this.from=I,this.to=g,this.tree=B,this.offset=F,this.open=(Q?1:0)|(A?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(I,g=[],B=!1){let F=[new C(0,I.length,I,0,!1,B)];for(let Q of g)Q.to>I.length&&F.push(Q);return F}static applyChanges(I,g,B=128){if(!g.length)return I;let F=[],Q=1,A=I.length?I[0]:null;for(let U=0,l=0,s=0;;U++){let G=U=B)for(;A&&A.from=c.from||t<=c.to||s){let d=Math.max(c.from,l)-s,b=Math.min(c.to,t)-s;c=d>=b?null:new C(d,b,c.tree,c.offset+s,U>0,!!G)}if(c&&F.push(c),A.to>t)break;A=Q{})(sg||={});var RC=require("@codemirror/state");var QB=RC.Facet.define({combine:C=>C[0]}),VQ=new RC.Compartment,HF=RC.Facet.define({combine:C=>C[0]}),Js=new RC.Compartment,Mg=RC.Facet.define({combine:C=>C[0]}),xQ=new RC.Compartment,nC=RC.Facet.define({combine:C=>C[0]}),uQ=new RC.Compartment,LQ=new RC.Compartment,RQ=RC.StateEffect.define();var gt=require("@codemirror/language");var l0=0,bA=class{constructor(I,g){this.from=I,this.to=g}},Bg=class{constructor(I={}){this.id=l0++,this.perNode=!!I.perNode,this.deserialize=I.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(I){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof I!="function"&&(I=PC.match(I)),g=>{let B=I(g);return B===void 0?null:[this,B]}}};Bg.closedBy=new Bg({deserialize:C=>C.split(" ")});Bg.openedBy=new Bg({deserialize:C=>C.split(" ")});Bg.group=new Bg({deserialize:C=>C.split(" ")});Bg.isolate=new Bg({deserialize:C=>{if(C&&C!="rtl"&&C!="ltr"&&C!="auto")throw new RangeError("Invalid value for isolate: "+C);return C||"auto"}});Bg.contextHash=new Bg({perNode:!0});Bg.lookAhead=new Bg({perNode:!0});Bg.mounted=new Bg({perNode:!0});var nQ=class{constructor(I,g,B){this.tree=I,this.overlay=g,this.parser=B}static get(I){return I&&I.props&&I.props[Bg.mounted.id]}},s0=Object.create(null),PC=class C{constructor(I,g,B,F=0){this.name=I,this.props=g,this.id=B,this.flags=F}static define(I){let g=I.props&&I.props.length?Object.create(null):s0,B=(I.top?1:0)|(I.skipped?2:0)|(I.error?4:0)|(I.name==null?8:0),F=new C(I.name||"",g,I.id,B);if(I.props){for(let Q of I.props)if(Array.isArray(Q)||(Q=Q(F)),Q){if(Q[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");g[Q[0].id]=Q[1]}}return F}prop(I){return this.props[I.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(I){if(typeof I=="string"){if(this.name==I)return!0;let g=this.prop(Bg.group);return g?g.indexOf(I)>-1:!1}return this.id==I}static match(I){let g=Object.create(null);for(let B in I)for(let F of B.split(" "))g[F]=I[B];return B=>{for(let F=B.prop(Bg.group),Q=-1;Q<(F?F.length:0);Q++){let A=g[Q<0?B.name:F[Q]];if(A)return A}}}};PC.none=new PC("",Object.create(null),0,8);var kU=class C{constructor(I){this.types=I;for(let g=0;g0;for(let l=this.cursor(A|pg.IncludeAnonymous);;){let s=!1;if(l.from<=Q&&l.to>=F&&(!U&&l.type.isAnonymous||g(l)!==!1)){if(l.firstChild())continue;s=!0}for(;s&&B&&(U||!l.type.isAnonymous)&&B(l),!l.nextSibling();){if(!l.parent())return;s=!0}}}prop(I){return I.perNode?this.props?this.props[I.id]:void 0:this.type.prop(I)}get propValues(){let I=[];if(this.props)for(let g in this.props)I.push([+g,this.props[g]]);return I}balance(I={}){return this.children.length<=8?this:zs(PC.none,this.children,this.positions,0,this.children.length,0,this.length,(g,B,F)=>new C(this.type,g,B,F,this.propValues),I.makeTree||((g,B,F)=>new C(PC.none,g,B,F)))}static build(I){return c0(I)}};aC.empty=new aC(PC.none,[],[],0);var vs=class C{constructor(I,g){this.buffer=I,this.index=g}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new C(this.buffer,this.index)}},sF=class C{constructor(I,g,B){this.buffer=I,this.length=g,this.set=B}get type(){return PC.none}toString(){let I=[];for(let g=0;g0));l=A[l+3]);return U}slice(I,g,B){let F=this.buffer,Q=new Uint16Array(g-I),A=0;for(let U=I,l=0;U=I&&gI;case 1:return g<=I&&B>I;case 2:return B>I;case 4:return!0}}function ZA(C,I,g,B){for(var F;C.from==C.to||(g<1?C.from>=I:C.from>I)||(g>-1?C.to<=I:C.to0?U.length:-1;I!=s;I+=g){let G=U[I],t=l[I]+A.from;if(xG(F,B,t,t+G.length)){if(G instanceof sF){if(Q&pg.ExcludeBuffers)continue;let c=G.findChild(0,G.buffer.length,g,B-t,F);if(c>-1)return new eA(new Ds(A,G,I,t),null,c)}else if(Q&pg.IncludeAnonymous||!G.type.isAnonymous||fs(G)){let c;if(!(Q&pg.IgnoreMounts)&&(c=nQ.get(G))&&!c.overlay)return new C(c.tree,t,I,A);let d=new C(G,t,I,A);return Q&pg.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(g<0?G.children.length-1:0,g,B,F)}}}if(Q&pg.IncludeAnonymous||!A.type.isAnonymous||(A.index>=0?I=A.index+g:I=g<0?-1:A._parent._tree.children.length,A=A._parent,!A))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(I){return this.nextChild(0,1,I,2)}childBefore(I){return this.nextChild(this._tree.children.length-1,-1,I,-2)}enter(I,g,B=0){let F;if(!(B&pg.IgnoreOverlays)&&(F=nQ.get(this._tree))&&F.overlay){let Q=I-this.from;for(let{from:A,to:U}of F.overlay)if((g>0?A<=Q:A=Q:U>Q))return new C(F.tree,F.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,I,g,B)}nextSignificantParent(){let I=this;for(;I.type.isAnonymous&&I._parent;)I=I._parent;return I}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function eG(C,I,g,B){let F=C.cursor(),Q=[];if(!F.firstChild())return Q;if(g!=null){for(let A=!1;!A;)if(A=F.type.is(g),!F.nextSibling())return Q}for(;;){if(B!=null&&F.type.is(B))return Q;if(F.type.is(I)&&Q.push(F.node),!F.nextSibling())return B==null?Q:[]}}function ks(C,I,g=I.length-1){for(let B=C;g>=0;B=B.parent){if(!B)return!1;if(!B.type.isAnonymous){if(I[g]&&I[g]!=B.name)return!1;g--}}return!0}var Ds=class{constructor(I,g,B,F){this.parent=I,this.buffer=g,this.index=B,this.start=F}},eA=class C extends DU{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(I,g,B){super(),this.context=I,this._parent=g,this.index=B,this.type=I.buffer.set.types[I.buffer.buffer[B]]}child(I,g,B){let{buffer:F}=this.context,Q=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.context.start,B);return Q<0?null:new C(this.context,this,Q)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(I){return this.child(1,I,2)}childBefore(I){return this.child(-1,I,-2)}enter(I,g,B=0){if(B&pg.ExcludeBuffers)return null;let{buffer:F}=this.context,Q=F.findChild(this.index+4,F.buffer[this.index+3],g>0?1:-1,I-this.context.start,g);return Q<0?null:new C(this.context,this,Q)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(I){return this._parent?null:this.context.parent.nextChild(this.context.index+I,I,0,4)}get nextSibling(){let{buffer:I}=this.context,g=I.buffer[this.index+3];return g<(this._parent?I.buffer[this._parent.index+3]:I.buffer.length)?new C(this.context,this._parent,g):this.externalSibling(1)}get prevSibling(){let{buffer:I}=this.context,g=this._parent?this._parent.index+4:0;return this.index==g?this.externalSibling(-1):new C(this.context,this._parent,I.findChild(g,this.index,-1,0,4))}get tree(){return null}toTree(){let I=[],g=[],{buffer:B}=this.context,F=this.index+4,Q=B.buffer[this.index+3];if(Q>F){let A=B.buffer[this.index+1];I.push(B.slice(F,Q,A)),g.push(0)}return new aC(this.type,I,g,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function uG(C){if(!C.length)return null;let I=0,g=C[0];for(let Q=1;Qg.from||A.to=I){let U=new nB(A.tree,A.overlay[0].from+Q.from,-1,Q);(F||(F=[B])).push(ZA(U,I,g,!1))}}return F?uG(F):B}var VA=class{get name(){return this.type.name}constructor(I,g=0){if(this.mode=g,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,I instanceof nB)this.yieldNode(I);else{this._tree=I.context.parent,this.buffer=I.context;for(let B=I._parent;B;B=B._parent)this.stack.unshift(B.index);this.bufferNode=I,this.yieldBuf(I.index)}}yieldNode(I){return I?(this._tree=I,this.type=I.type,this.from=I.from,this.to=I.to,!0):!1}yieldBuf(I,g){this.index=I;let{start:B,buffer:F}=this.buffer;return this.type=g||F.set.types[F.buffer[I]],this.from=B+F.buffer[I+1],this.to=B+F.buffer[I+2],!0}yield(I){return I?I instanceof nB?(this.buffer=null,this.yieldNode(I)):(this.buffer=I.context,this.yieldBuf(I.index,I.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(I,g,B){if(!this.buffer)return this.yield(this._tree.nextChild(I<0?this._tree._tree.children.length-1:0,I,g,B,this.mode));let{buffer:F}=this.buffer,Q=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.buffer.start,B);return Q<0?!1:(this.stack.push(this.index),this.yieldBuf(Q))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(I){return this.enterChild(1,I,2)}childBefore(I){return this.enterChild(-1,I,-2)}enter(I,g,B=this.mode){return this.buffer?B&pg.ExcludeBuffers?!1:this.enterChild(1,I,g):this.yield(this._tree.enter(I,g,B))}parent(){if(!this.buffer)return this.yieldNode(this.mode&pg.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let I=this.mode&pg.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(I)}sibling(I){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+I,I,0,4,this.mode)):!1;let{buffer:g}=this.buffer,B=this.stack.length-1;if(I<0){let F=B<0?0:this.stack[B]+4;if(this.index!=F)return this.yieldBuf(g.findChild(F,this.index,-1,0,4))}else{let F=g.buffer[this.index+3];if(F<(B<0?g.buffer.length:g.buffer[this.stack[B]+3]))return this.yieldBuf(F)}return B<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+I,I,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(I){let g,B,{buffer:F}=this;if(F){if(I>0){if(this.index-1)for(let Q=g+I,A=I<0?-1:B._tree.children.length;Q!=A;Q+=I){let U=B._tree.children[Q];if(this.mode&pg.IncludeAnonymous||U instanceof sF||!U.type.isAnonymous||fs(U))return!1}return!0}move(I,g){if(g&&this.enterChild(I,0,4))return!0;for(;;){if(this.sibling(I))return!0;if(this.atLastNode(I)||!this.parent())return!1}}next(I=!0){return this.move(1,I)}prev(I=!0){return this.move(-1,I)}moveTo(I,g=0){for(;(this.from==this.to||(g<1?this.from>=I:this.from>I)||(g>-1?this.to<=I:this.to=0;){for(let A=I;A;A=A._parent)if(A.index==F){if(F==this.index)return A;g=A,B=Q+1;break I}F=this.stack[--Q]}for(let F=B;F=0;Q--){if(Q<0)return ks(this._tree,I,F);let A=B[g.buffer[this.stack[Q]]];if(!A.isAnonymous){if(I[F]&&I[F]!=A.name)return!1;F--}}return!0}};function fs(C){return C.children.some(I=>I instanceof sF||!I.type.isAnonymous||fs(I))}function c0(C){var I;let{buffer:g,nodeSet:B,maxBufferLength:F=1024,reused:Q=[],minRepeatType:A=B.types.length}=C,U=Array.isArray(g)?new vs(g,g.length):g,l=B.types,s=0,G=0;function t(m,L,R,o,y,H){let{id:r,start:N,end:T,size:M}=U,q=G,AI=s;for(;M<0;)if(U.next(),M==-1){let kI=Q[r];R.push(kI),o.push(N-m);return}else if(M==-3){s=r;return}else if(M==-4){G=r;return}else throw new RangeError(`Unrecognized record size: ${M}`);let aI=l[r],uI,ZI,XI=N-m;if(T-N<=F&&(ZI=e(U.pos-L,y))){let kI=new Uint16Array(ZI.size-ZI.skip),mI=U.pos-ZI.size,wI=kI.length;for(;U.pos>mI;)wI=x(ZI.start,kI,wI);uI=new sF(kI,T-ZI.start,B),XI=ZI.start-m}else{let kI=U.pos-M;U.next();let mI=[],wI=[],gg=r>=A?r:-1,HI=0,hI=T;for(;U.pos>kI;)gg>=0&&U.id==gg&&U.size>=0?(U.end<=hI-F&&(b(mI,wI,N,HI,U.end,hI,gg,q,AI),HI=mI.length,hI=U.end),U.next()):H>2500?c(N,kI,mI,wI):t(N,kI,mI,wI,gg,H+1);if(gg>=0&&HI>0&&HI-1&&HI>0){let WI=d(aI,AI);uI=zs(aI,mI,wI,0,mI.length,0,T-N,WI,WI)}else uI=Z(aI,mI,wI,T-N,q-T,AI)}R.push(uI),o.push(XI)}function c(m,L,R,o){let y=[],H=0,r=-1;for(;U.pos>L;){let{id:N,start:T,end:M,size:q}=U;if(q>4)U.next();else{if(r>-1&&T=0;M-=3)N[q++]=y[M],N[q++]=y[M+1]-T,N[q++]=y[M+2]-T,N[q++]=q;R.push(new sF(N,y[2]-T,B)),o.push(T-m)}}function d(m,L){return(R,o,y)=>{let H=0,r=R.length-1,N,T;if(r>=0&&(N=R[r])instanceof aC){if(!r&&N.type==m&&N.length==y)return N;(T=N.prop(Bg.lookAhead))&&(H=o[r]+N.length+T)}return Z(m,R,o,y,H,L)}}function b(m,L,R,o,y,H,r,N,T){let M=[],q=[];for(;m.length>o;)M.push(m.pop()),q.push(L.pop()+R-y);m.push(Z(B.types[r],M,q,H-y,N-H,T)),L.push(y-R)}function Z(m,L,R,o,y,H,r){if(H){let N=[Bg.contextHash,H];r=r?[N].concat(r):[N]}if(y>25){let N=[Bg.lookAhead,y];r=r?[N].concat(r):[N]}return new aC(m,L,R,o,r)}function e(m,L){let R=U.fork(),o=0,y=0,H=0,r=R.end-F,N={size:0,start:0,skip:0};I:for(let T=R.pos-m;R.pos>T;){let M=R.size;if(R.id==L&&M>=0){N.size=o,N.start=y,N.skip=H,H+=4,o+=4,R.next();continue}let q=R.pos-M;if(M<0||q=A?4:0,aI=R.start;for(R.next();R.pos>q;){if(R.size<0)if(R.size==-3)AI+=4;else break I;else R.id>=A&&(AI+=4);R.next()}y=aI,o+=M,H+=AI}return(L<0||o==m)&&(N.size=o,N.start=y,N.skip=H),N.size>4?N:void 0}function x(m,L,R){let{id:o,start:y,end:H,size:r}=U;if(U.next(),r>=0&&o4){let T=U.pos-(r-4);for(;U.pos>T;)R=x(m,L,R)}L[--R]=N,L[--R]=H-m,L[--R]=y-m,L[--R]=o}else r==-3?s=o:r==-4&&(G=o);return R}let a=[],n=[];for(;U.pos>0;)t(C.start||0,C.bufferStart||0,a,n,-1,0);let h=(I=C.length)!==null&&I!==void 0?I:a.length?n[0]+a[0].length:0;return new aC(l[C.topID],a.reverse(),n.reverse(),h)}var VG=new WeakMap;function vU(C,I){if(!C.isAnonymous||I instanceof sF||I.type!=C)return 1;let g=VG.get(I);if(g==null){g=1;for(let B of I.children){if(B.type!=C||!(B instanceof aC)){g=1;break}g+=vU(C,B)}VG.set(I,g)}return g}function zs(C,I,g,B,F,Q,A,U,l){let s=0;for(let b=B;b=G)break;L+=R}if(n==h+1){if(L>G){let R=b[h];d(R.children,R.positions,0,R.children.length,Z[h]+a);continue}t.push(b[h])}else{let R=Z[n-1]+b[n-1].length-m;t.push(zs(C,b,Z,h,n,m,R,null,l))}c.push(m+a-Q)}}return d(I,g,B,F,0),(U||l)(t,c,A)}var TU=class{startParse(I,g,B){return typeof I=="string"&&(I=new ws(I)),B=B?B.length?B.map(F=>new bA(F.from,F.to)):[new bA(0,0)]:[new bA(0,I.length)],this.createParse(I,g||[],B)}parse(I,g,B){let F=this.startParse(I,g,B);for(;;){let Q=F.advance();if(Q)return Q}}},ws=class{constructor(I){this.string=I}get length(){return this.string.length}chunk(I){return this.string.slice(I)}get lineChunks(){return!1}read(I,g){return this.string.slice(I,g)}};var $u=new Bg({perNode:!0});var Ks=class C{constructor(I,g,B,F,Q,A,U,l,s,G=0,t){this.p=I,this.stack=g,this.state=B,this.reducePos=F,this.pos=Q,this.score=A,this.buffer=U,this.bufferBase=l,this.curContext=s,this.lookAhead=G,this.parent=t}toString(){return`[${this.stack.filter((I,g)=>g%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(I,g,B=0){let F=I.parser.context;return new C(I,[],g,B,B,0,[],0,F?new wU(F,F.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(I,g){this.stack.push(this.state,g,this.bufferBase+this.buffer.length),this.state=I}reduce(I){var g;let B=I>>19,F=I&65535,{parser:Q}=this.p,A=Q.dynamicPrecedence(F);if(A&&(this.score+=A),B==0){this.pushState(Q.getGoto(this.state,F,!0),this.reducePos),F=2e3&&!(!((g=this.p.parser.nodeSet.types[F])===null||g===void 0)&&g.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=s):this.p.lastBigReductionSizeU;)this.stack.pop();this.reduceContext(F,l)}storeNode(I,g,B,F=4,Q=!1){if(I==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&A.buffer[U-4]==0&&A.buffer[U-1]>-1){if(g==B)return;if(A.buffer[U-2]>=g){A.buffer[U-2]=B;return}}}if(!Q||this.pos==B)this.buffer.push(I,g,B,F);else{let A=this.buffer.length;if(A>0&&this.buffer[A-4]!=0)for(;A>0&&this.buffer[A-2]>B;)this.buffer[A]=this.buffer[A-4],this.buffer[A+1]=this.buffer[A-3],this.buffer[A+2]=this.buffer[A-2],this.buffer[A+3]=this.buffer[A-1],A-=4,F>4&&(F-=4);this.buffer[A]=I,this.buffer[A+1]=g,this.buffer[A+2]=B,this.buffer[A+3]=F}}shift(I,g,B,F){if(I&131072)this.pushState(I&65535,this.pos);else if((I&262144)==0){let Q=I,{parser:A}=this.p;(F>this.pos||g<=A.maxNode)&&(this.pos=F,A.stateFlag(Q,1)||(this.reducePos=F)),this.pushState(Q,B),this.shiftContext(g,B),g<=A.maxNode&&this.buffer.push(g,B,F,4)}else this.pos=F,this.shiftContext(g,B),g<=this.p.parser.maxNode&&this.buffer.push(g,B,F,4)}apply(I,g,B,F){I&65536?this.reduce(I):this.shift(I,g,B,F)}useNode(I,g){let B=this.p.reused.length-1;(B<0||this.p.reused[B]!=I)&&(this.p.reused.push(I),B++);let F=this.pos;this.reducePos=this.pos=F+I.length,this.pushState(g,F),this.buffer.push(B,F,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,I,this,this.p.stream.reset(this.pos-I.length)))}split(){let I=this,g=I.buffer.length;for(;g>0&&I.buffer[g-2]>I.reducePos;)g-=4;let B=I.buffer.slice(g),F=I.bufferBase+g;for(;I&&F==I.bufferBase;)I=I.parent;return new C(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,B,F,this.curContext,this.lookAhead,I)}recoverByDelete(I,g){let B=I<=this.p.parser.maxNode;B&&this.storeNode(I,this.pos,g,4),this.storeNode(0,this.pos,g,B?8:4),this.pos=this.reducePos=g,this.score-=190}canShift(I){for(let g=new Ps(this);;){let B=this.p.parser.stateSlot(g.state,4)||this.p.parser.hasAction(g.state,I);if(B==0)return!1;if((B&65536)==0)return!0;g.reduce(B)}}recoverByInsert(I){if(this.stack.length>=300)return[];let g=this.p.parser.nextStates(this.state);if(g.length>8||this.stack.length>=120){let F=[];for(let Q=0,A;Ql&1&&U==A)||F.push(g[Q],A)}g=F}let B=[];for(let F=0;F>19,F=g&65535,Q=this.stack.length-B*3;if(Q<0||I.getGoto(this.stack[Q],F,!1)<0){let A=this.findForcedReduction();if(A==null)return!1;g=A}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(g),!0}findForcedReduction(){let{parser:I}=this.p,g=[],B=(F,Q)=>{if(!g.includes(F))return g.push(F),I.allActions(F,A=>{if(!(A&393216))if(A&65536){let U=(A>>19)-Q;if(U>1){let l=A&65535,s=this.stack.length-U*3;if(s>=0&&I.getGoto(this.stack[s],l,!1)>=0)return U<<19|65536|l}}else{let U=B(A,Q+1);if(U!=null)return U}})};return B(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:I}=this.p;return I.data[I.stateSlot(this.state,1)]==65535&&!I.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(I){if(this.state!=I.state||this.stack.length!=I.stack.length)return!1;for(let g=0;gthis.lookAhead&&(this.emitLookAhead(),this.lookAhead=I)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},wU=class{constructor(I,g){this.tracker=I,this.context=g,this.hash=I.strict?I.hash(g):0}},Ps=class{constructor(I){this.start=I,this.state=I.state,this.stack=I.stack,this.base=this.stack.length}reduce(I){let g=I&65535,B=I>>19;B==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(B-1)*3;let F=this.start.p.parser.getGoto(this.stack[this.base-3],g,!0);this.state=F}},js=class C{constructor(I,g,B){this.stack=I,this.pos=g,this.index=B,this.buffer=I.buffer,this.index==0&&this.maybeNext()}static create(I,g=I.bufferBase+I.buffer.length){return new C(I,g,g-I.bufferBase)}maybeNext(){let I=this.stack.parent;I!=null&&(this.index=this.stack.bufferBase-I.bufferBase,this.stack=I,this.buffer=I.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new C(this.stack,this.pos,this.index)}};function xA(C,I=Uint16Array){if(typeof C!="string")return C;let g=null;for(let B=0,F=0;B=92&&A--,A>=34&&A--;let l=A-32;if(l>=46&&(l-=46,U=!0),Q+=l,U)break;Q*=46}g?g[F++]=Q:g=new I(Q)}return g}var aQ=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},LG=new aQ,Os=class{constructor(I,g){this.input=I,this.ranges=g,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=LG,this.rangeIndex=0,this.pos=this.chunkPos=g[0].from,this.range=g[0],this.end=g[g.length-1].to,this.readNext()}resolveOffset(I,g){let B=this.range,F=this.rangeIndex,Q=this.pos+I;for(;QB.to:Q>=B.to;){if(F==this.ranges.length-1)return null;let A=this.ranges[++F];Q+=A.from-B.to,B=A}return Q}clipPos(I){if(I>=this.range.from&&II)return Math.max(I,g.from);return this.end}peek(I){let g=this.chunkOff+I,B,F;if(g>=0&&g=this.chunk2Pos&&BU.to&&(this.chunk2=this.chunk2.slice(0,U.to-B)),F=this.chunk2.charCodeAt(0)}}return B>=this.token.lookAhead&&(this.token.lookAhead=B+1),F}acceptToken(I,g=0){let B=g?this.resolveOffset(g,-1):this.pos;if(B==null||B=this.chunk2Pos&&this.posthis.range.to?I.slice(0,this.range.to-this.pos):I,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(I=1){for(this.chunkOff+=I;this.pos+I>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();I-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=I,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(I,g){if(g?(this.token=g,g.start=I,g.lookAhead=I+1,g.value=g.extended=-1):this.token=LG,this.pos!=I){if(this.pos=I,I==this.end)return this.setDone(),this;for(;I=this.range.to;)this.range=this.ranges[++this.rangeIndex];I>=this.chunkPos&&I=this.chunkPos&&g<=this.chunkPos+this.chunk.length)return this.chunk.slice(I-this.chunkPos,g-this.chunkPos);if(I>=this.chunk2Pos&&g<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(I-this.chunk2Pos,g-this.chunk2Pos);if(I>=this.range.from&&g<=this.range.to)return this.input.read(I,g);let B="";for(let F of this.ranges){if(F.from>=g)break;F.to>I&&(B+=this.input.read(Math.max(F.from,I),Math.min(F.to,g)))}return B}},tF=class{constructor(I,g){this.data=I,this.id=g}token(I,g){let{parser:B}=g.p;hG(this.data,I,g,this.id,B.data,B.tokenPrecTable)}};tF.prototype.contextual=tF.prototype.fallback=tF.prototype.extend=!1;var kB=class{constructor(I,g,B){this.precTable=g,this.elseToken=B,this.data=typeof I=="string"?xA(I):I}token(I,g){let B=I.pos,F=0;for(;;){let Q=I.next<0,A=I.resolveOffset(1,1);if(hG(this.data,I,g,0,this.data,this.precTable),I.token.value>-1)break;if(this.elseToken==null)return;if(Q||F++,A==null)break;I.reset(A,I.token)}F&&(I.reset(B,I.token),I.acceptToken(this.elseToken,F))}};kB.prototype.contextual=tF.prototype.fallback=tF.prototype.extend=!1;function hG(C,I,g,B,F,Q){let A=0,U=1<0){let b=C[d];if(l.allows(b)&&(I.token.value==-1||I.token.value==b||i0(b,I.token.value,F,Q))){I.acceptToken(b);break}}let G=I.next,t=0,c=C[A+2];if(I.next<0&&c>t&&C[s+c*3-3]==65535){A=C[s+c*3-1];continue I}for(;t>1,b=s+d+(d<<1),Z=C[b],e=C[b+1]||65536;if(G=e)t=d+1;else{A=C[b+2],I.advance();continue I}}break}}function RG(C,I,g){for(let B=I,F;(F=C[B])!=65535;B++)if(F==g)return B-I;return-1}function i0(C,I,g,B){let F=RG(g,B,I);return F<0||RG(g,B,C)I)&&!B.type.isError)return g<0?Math.max(0,Math.min(B.to-1,I-25)):Math.min(C.length,Math.max(B.from+1,I+25));if(g<0?B.prevSibling():B.nextSibling())break;if(!B.parent())return g<0?0:C.length}}var _s=class{constructor(I,g){this.fragments=I,this.nodeSet=g,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let I=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(I){for(this.safeFrom=I.openStart?nG(I.tree,I.from+I.offset,1)-I.offset:I.from,this.safeTo=I.openEnd?nG(I.tree,I.to+I.offset,-1)-I.offset:I.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(I.tree),this.start.push(-I.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(I){if(II)return this.nextStart=A,null;if(Q instanceof aC){if(A==I){if(A=Math.max(this.safeFrom,I)&&(this.trees.push(Q),this.start.push(A),this.index.push(0))}else this.index[g]++,this.nextStart=A+Q.length}}},qs=class{constructor(I,g){this.stream=g,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=I.tokenizers.map(B=>new aQ)}getActions(I){let g=0,B=null,{parser:F}=I.p,{tokenizers:Q}=F,A=F.stateSlot(I.state,3),U=I.curContext?I.curContext.hash:0,l=0;for(let s=0;st.end+25&&(l=Math.max(t.lookAhead,l)),t.value!=0)){let c=g;if(t.extended>-1&&(g=this.addActions(I,t.extended,t.end,g)),g=this.addActions(I,t.value,t.end,g),!G.extend&&(B=t,g>c))break}}for(;this.actions.length>g;)this.actions.pop();return l&&I.setLookAhead(l),!B&&I.pos==this.stream.end&&(B=new aQ,B.value=I.p.parser.eofTerm,B.start=B.end=I.pos,g=this.addActions(I,B.value,B.end,g)),this.mainToken=B,this.actions}getMainToken(I){if(this.mainToken)return this.mainToken;let g=new aQ,{pos:B,p:F}=I;return g.start=B,g.end=Math.min(B+1,F.stream.end),g.value=B==F.stream.end?F.parser.eofTerm:0,g}updateCachedToken(I,g,B){let F=this.stream.clipPos(B.pos);if(g.token(this.stream.reset(F,I),B),I.value>-1){let{parser:Q}=B.p;for(let A=0;A=0&&B.p.parser.dialect.allows(U>>1)){(U&1)==0?I.value=U>>1:I.extended=U>>1;break}}}else I.value=0,I.end=this.stream.clipPos(F+1)}putAction(I,g,B,F){for(let Q=0;QI.bufferLength*4?new _s(B,I.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let I=this.stacks,g=this.minStackPos,B=this.stacks=[],F,Q;if(this.bigReductionCount>300&&I.length==1){let[A]=I;for(;A.forceReduce()&&A.stack.length&&A.stack[A.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let A=0;Ag)B.push(U);else{if(this.advanceStack(U,B,I))continue;{F||(F=[],Q=[]),F.push(U);let l=this.tokens.getMainToken(U);Q.push(l.value,l.end)}}break}}if(!B.length){let A=F&&d0(F);if(A)return this.stackToTree(A);if(this.parser.strict)throw new SyntaxError("No parse at "+g);this.recovering||(this.recovering=5)}if(this.recovering&&F){let A=this.stoppedAt!=null&&F[0].pos>this.stoppedAt?F[0]:this.runRecovery(F,Q,B);if(A)return this.stackToTree(A.forceAll())}if(this.recovering){let A=this.recovering==1?1:this.recovering*3;if(B.length>A)for(B.sort((U,l)=>l.score-U.score);B.length>A;)B.pop();B.some(U=>U.reducePos>g)&&this.recovering--}else if(B.length>1){I:for(let A=0;A500&&s.buffer.length>500)if((U.score-s.score||U.buffer.length-s.buffer.length)>0)B.splice(l--,1);else{B.splice(A--,1);continue I}}}B.length>12&&B.splice(12,B.length-12)}this.minStackPos=B[0].pos;for(let A=1;A ":"";if(this.stoppedAt!=null&&F>this.stoppedAt)return I.forceReduce()?I:null;if(this.fragments){let s=I.curContext&&I.curContext.tracker.strict,G=s?I.curContext.hash:0;for(let t=this.fragments.nodeAt(F);t;){let c=this.parser.nodeSet.types[t.type.id]==t.type?Q.getGoto(I.state,t.type.id):-1;if(c>-1&&t.length&&(!s||(t.prop(Bg.contextHash)||0)==G))return I.useNode(t,c),!0;if(!(t instanceof aC)||t.children.length==0||t.positions[0]>0)break;let d=t.children[0];if(d instanceof aC&&t.positions[0]==0)t=d;else break}}let U=Q.stateSlot(I.state,4);if(U>0)return I.reduce(U),!0;if(I.stack.length>=8400)for(;I.stack.length>6e3&&I.forceReduce(););let l=this.tokens.getActions(I);for(let s=0;sF?g.push(b):B.push(b)}return!1}advanceFully(I,g){let B=I.pos;for(;;){if(!this.advanceStack(I,null,null))return!1;if(I.pos>B)return aG(I,g),!0}}runRecovery(I,g,B){let F=null,Q=!1;for(let A=0;A ":"";if(U.deadEnd&&(Q||(Q=!0,U.restart(),this.advanceFully(U,B))))continue;let t=U.split(),c=G;for(let d=0;t.forceReduce()&&d<10&&!this.advanceFully(t,B);d++)rC&&(c=this.stackID(t)+" -> ");for(let d of U.recoverByInsert(l))this.advanceFully(d,B);this.stream.end>U.pos?(s==U.pos&&(s++,l=0),U.recoverByDelete(l,s),aG(U,B)):(!F||F.scoreI.topRules[U][1]),F=[];for(let U=0;U=0)Q(G,l,U[s++]);else{let t=U[s+-G];for(let c=-G;c>0;c--)Q(U[s++],l,t);s++}}}this.nodeSet=new kU(g.map((U,l)=>PC.define({name:l>=this.minRepeatTerm?void 0:U,id:l,props:F[l],top:B.indexOf(l)>-1,error:l==0,skipped:I.skippedNodes&&I.skippedNodes.indexOf(l)>-1}))),I.propSources&&(this.nodeSet=this.nodeSet.extend(...I.propSources)),this.strict=!1,this.bufferLength=1024;let A=xA(I.tokenData);this.context=I.context,this.specializerSpecs=I.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let U=0;Utypeof U=="number"?new tF(A,U):U),this.topRules=I.topRules,this.dialects=I.dialects||{},this.dynamicPrecedences=I.dynamicPrecedences||null,this.tokenPrecTable=I.tokenPrec,this.termNames=I.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(I,g,B){let F=new $s(this,I,g,B);for(let Q of this.wrappers)F=Q(F,I,g,B);return F}getGoto(I,g,B=!1){let F=this.goto;if(g>=F[0])return-1;for(let Q=F[g+1];;){let A=F[Q++],U=A&1,l=F[Q++];if(U&&B)return l;for(let s=Q+(A>>1);Q0}validAction(I,g){return!!this.allActions(I,B=>B==g?!0:null)}allActions(I,g){let B=this.stateSlot(I,4),F=B?g(B):void 0;for(let Q=this.stateSlot(I,1);F==null;Q+=3){if(this.data[Q]==65535)if(this.data[Q+1]==1)Q=vB(this.data,Q+2);else break;F=g(vB(this.data,Q+1))}return F}nextStates(I){let g=[];for(let B=this.stateSlot(I,1);;B+=3){if(this.data[B]==65535)if(this.data[B+1]==1)B=vB(this.data,B+2);else break;if((this.data[B+2]&1)==0){let F=this.data[B+1];g.some((Q,A)=>A&1&&Q==F)||g.push(this.data[B],F)}}return g}configure(I){let g=Object.assign(Object.create(C.prototype),this);if(I.props&&(g.nodeSet=this.nodeSet.extend(...I.props)),I.top){let B=this.topRules[I.top];if(!B)throw new RangeError(`Invalid top rule name ${I.top}`);g.top=B}return I.tokenizers&&(g.tokenizers=this.tokenizers.map(B=>{let F=I.tokenizers.find(Q=>Q.from==B);return F?F.to:B})),I.specializers&&(g.specializers=this.specializers.slice(),g.specializerSpecs=this.specializerSpecs.map((B,F)=>{let Q=I.specializers.find(U=>U.from==B.external);if(!Q)return B;let A=Object.assign(Object.assign({},B),{external:Q.to});return g.specializers[F]=mG(A),A})),I.contextTracker&&(g.context=I.contextTracker),I.dialect&&(g.dialect=this.parseDialect(I.dialect)),I.strict!=null&&(g.strict=I.strict),I.wrap&&(g.wrappers=g.wrappers.concat(I.wrap)),I.bufferLength!=null&&(g.bufferLength=I.bufferLength),g}hasWrappers(){return this.wrappers.length>0}getName(I){return this.termNames?this.termNames[I]:String(I<=this.maxNode&&this.nodeSet.types[I].name||I)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(I){let g=this.dynamicPrecedences;return g==null?0:g[I]||0}parseDialect(I){let g=Object.keys(this.dialects),B=g.map(()=>!1);if(I)for(let Q of I.split(" ")){let A=g.indexOf(Q);A>=0&&(B[A]=!0)}let F=null;for(let Q=0;QB)&&g.p.parser.stateFlag(g.state,2)&&(!I||I.scoreC.external(g,B)<<1|I}return C.get}var b0=fU.deserialize({version:14,states:")`QQOPOOOfOQO'#C^OqOSO'#C`O|OWO'#CbO!XO`O'#CeO!dOpO'#CgOOOO'#Ck'#CkOOOO'#Ci'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<b.is(RQ)))return this.create(I.state);if(!I.docChanged)return C.inserted_ranges=[],C.deleted_ranges=[],C;let g=[];I.changes.iterChangedRanges((b,Z,e,x)=>g.push({fromA:b,toA:Z,fromB:e,toB:x}));let B=eQ.applyChanges(C.fragments,g),F=I.state.doc.toString(),Q=zU.parser.parse(new oG.DocInput(I.state.doc),B);B=eQ.addTree(Q,B);let A=new Map,U=[],l=new Map,s=new Set;for(let b of g){C.ranges.tree.search([b.fromA,b.toA],(Z,e)=>{C.ranges.tree.remove(e,Z),s.add(Z);for(let x of Z.base_range.thread)l.set(x.from,x);return!0});for(let Z of Ct(Q,F,b.fromB,b.toB))A.set(Z.from,Z);U.push([b.toA,b.toB-b.fromB-(b.toA-b.fromA)])}for(let b of s)b.type==="comment"&&l.delete(b.from);let G=0,t=C.ranges.tree.nil_node;function c(b){if(b!=null&&b!=t){for(c(b.left);U.length&&b.item.key.low>=U[0][0];)G+=U.shift()[1];b.item.value.apply_offset(G),b.item.key.low=b.item.value.from,b.item.key.high=b.item.value.to,c(b.right),b.left!=t&&(b.max.low=b.left.max.low),b.right!=t&&(b.max.high=b.right.max.high)}}c(C.ranges.tree.root);let d=Array.from(A.values());for(let b of d)C.ranges.tree.insert([b.from,b.to],b);for(let b of d)b.type==="comment"&&l.set(b.from,b);if(l.size){let b=[],Z,e=[];for(let x of Array.from(l.values()).sort((a,n)=>a.from-n.from))x.clear_references(),x.replies.length=0,!Z||Z?.right_adjacent(x)?e.push(x):(b.push(e),e=[x]),Z=x;b.push(e);for(let x of b){let a=x[0],n=C.ranges.tree.search([a.from,a.from])[0];n.replies.length=0;for(let h of x.slice(n===a?1:0))h.add_reply(n)}}return C.ranges.ranges=C.ranges.tree.values,{tree:Q,ranges:C.ranges,fragments:B,inserted_ranges:d,deleted_ranges:[...s]}}});function Z0(C,I){let g=sg.PLUGIN_SETTINGS.enable_metadata&&C.firstChild?.type.name.startsWith("MDSep")?C.firstChild.from:void 0,B;if(C.type.name==="Substitution"){let F=g?C.firstChild?.nextSibling:C.firstChild;if(!F||F.type.name!=="MSub")return;B=F.from}return e0(C.from,C.to,C.type.name,I.slice(C.from,C.to),B,g)}function Ct(C,I,g=0,B=I.length){let F=[],Q,A=C.cursor();if(A.childAfter(g-1),A.node.type.name==="CriticMarkup"||A.node.from>B)return F;if(A)do{let U=A.node;if(U.type.name==="\u26A0")continue;let l=Z0(U,I);l&&(l.type==="comment"&&Q&&Q.right_adjacent(l)&&l.add_reply(Q),F.push(l),Q=l)}while(A.nextSibling()&&A.node.from<=B);return F}function Bt(C){let I=C.field(JI).ranges;return I.ranges.length?C.selection.ranges.some(g=>I.contains_range(g.from,g.to)):!1}function uA(C){let I=zU.parser.parse(C);return Ct(I,C)}function e0(C,I,g,B,F,Q){switch(g){case"Addition":return new pF(C,I,B,Q);case"Deletion":return new iQ(C,I,B,Q);case"Substitution":return new LB(C,F,I,B,Q);case"Highlight":return new dQ(C,I,B,Q);case"Comment":return new GQ(C,I,B,Q);default:return new pF(C,I,B,Q)}}var LA={addition:pF,deletion:iQ,highlight:dQ,substitution:LB,comment:GQ};function MU(C){let I={};for(let{path:g,range:B}of C)I[g]||(I[g]=[]),I[g].push(B);return I}var KU=require("@codemirror/state");function yG(C,I,g,B=!1,F=null){let Q=C,A=g.doc.lineAt(Q),U=g.charCategorizer(Q);F===KU.CharCategory.Space&&(F=null);let l=null;for(F;;){if(Q==(I?A.to:A.from)){Q==C&&A.number!=(I?g.doc.lines:1)&&(Q+=I?1:-1);break}let s=(0,KU.findClusterBreak)(A.text,Q-A.from,I)+A.from,G=A.text.slice(Math.min(Q,s)-A.from,Math.max(Q,s)-A.from);if(l=U(G),F!=null&&l!=F)if(F==1&&B)B=!1;else break;(G!=" "||Q!=C)&&(F=l),Q=s}return[Q,F]}function Ft(C,I,g=!1){let B=I.doc.lineAt(C),F=I.charCategorizer(C);return g&&(C-=1),F(B.text.slice(C-B.from,C-B.from+1))}var xL=require("@codemirror/state");function PU(C){return C.annotations.map(I=>I.value).filter(I=>typeof I=="string")}function YF(){let C;return sg.PLUGIN_SETTINGS.add_metadata&&(C={},sg.PLUGIN_SETTINGS.add_author_metadata&&(C.author=sg.PLUGIN_SETTINGS.author||void 0),sg.PLUGIN_SETTINGS.add_timestamp_metadata&&(C.time=Math.floor(Date.now()/1e3)),Object.keys(C).length===0&&(C=void 0)),C}var V0={author:"split"};function jU(C,I,g=V0){if(!I)return{compatible:!0,merged_metadata:C.fields};if(!C.fields)return{compatible:!1,merged_metadata:void 0};let B=Object.assign({},C.fields,I);for(let F of[...new Set(Object.keys(I).concat(Object.keys(C.fields)))])if(I[F]!==C.fields[F]){let Q=g[F];if(Q==="split"||Q==="move_outside")return{compatible:!1,merged_metadata:void 0};Q==="old"&&(B[F]=C.fields[F])}return{compatible:!0,merged_metadata:B}}function SG(C,I,g){if(I.clipboardData&&C.clipboard_remove_syntax){let B=g.state.selection.main,Q=g.state.field(JI).ranges.unwrap_in_range(g.state.doc,B.from,B.to).output;I.clipboardData.setData("text/plain",Q),I.preventDefault()}}var nA=require("@codemirror/state");function x0(C){return C===nA.CharCategory.Space||C===null}function u0(C,I){return C!==null&&C!==nA.CharCategory.Space&&C!==I}function L0(C,I,g){if(g.cursor_inside(C))return g;{let B=g.cursor_before_range(C),F=I.ranges.indexOf(g)+(B?-1:1);for(;F>=0&&FmQ.RangeSet.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}};function Qt(C,I,g){for(;C.value&&C.from<=g;)C.from<=g&&I.push(C.value),C.next()}function rG(C){return Array.isArray(C)?C:[C]}var hQ=class{dom;height=-1;above=0;markers=[];constructor(I,g,B,F){this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(I,g,B,F)}update(I,g,B,F){this.height!=g&&(this.height=g,this.dom.style.height=g+"px"),this.above!=B&&(this.dom.style.marginTop=(this.above=B)?B+"px":""),qU(this.markers,F)||this.setMarkers(I,F)}setMarkers(I,g){let B="cm-gutterElement",F=this.dom.firstChild;for(let Q=0,A=0;;){let U=A,l=Qthis.i;){let g=I.elements.pop();I.dom.removeChild(g.dom),g.destroy()}}},cF=class{constructor(I,g){this.view=I;this.config=g;this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let B in g.domEventHandlers)this.dom.addEventListener(B,F=>{let Q=F.target,A;if(Q!=this.dom&&this.dom.contains(Q)){for(;Q.parentNode!=this.dom;)Q=Q.parentNode;let l=Q.getBoundingClientRect();A=(l.top+l.bottom)/2}else A=F.clientY;let U=I.lineBlockAtHeight(A-I.documentTop);g.domEventHandlers[B](I,U,F)&&F.preventDefault()});this.markers=rG(g.markers(I)),g.initialSpacer&&(this.spacer=new hQ(I,0,0,[g.initialSpacer(I)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}dom;elements=[];markers;spacer=null;update(I){let g=this.markers;if(this.markers=rG(this.config.markers(I.view)),this.spacer&&this.config.updateSpacer){let F=this.config.updateSpacer(this.spacer.markers[0],I);F!=this.spacer.markers[0]&&this.spacer.update(I.view,0,0,[F])}let B=I.view.viewport;return!mQ.RangeSet.eq(this.markers,g,B.from,B.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(I):!1)}destroy(){for(let I of this.elements)I.destroy()}},XQ=class{constructor(I,g,B){this.view=I;this.unfixGutters=g;this.activeGutters=B;this.prevViewport=I.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.style.minHeight=this.view.contentHeight+"px",this.gutters=this.createGutters(I);for(let F of this.gutters)this.dom.appendChild(F.dom);this.fixed=!I.state.facet(this.unfixGutters),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),this.insertGutters(I)}gutters;dom;fixed;prevViewport;createGutters(I){return I.state.facet(this.activeGutters).map(g=>new cF(I,g))}insertGutters(I){I.contentDOM.parentNode.insertBefore(this.dom,I.contentDOM)}insertDetachedGutters(I){I.parentNode.insertBefore(this.dom,I)}getUpdateContexts(){return this.gutters.map(I=>new mA(I,this.view.viewport,-this.view.documentPadding.top))}update(I){if(this.updateGutters(I)){let g=this.prevViewport,B=I.view.viewport,F=Math.min(g.to,B.to)-Math.max(g.from,B.from);this.syncGutters(F<(B.to-B.from)*.8)}I.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(this.unfixGutters)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=I.view.viewport}syncGutters(I){let g=this.dom.nextSibling;I&&this.dom.remove();let B=mQ.RangeSet.iter(this.view.state.facet(pC.gutterLineClass),this.view.viewport.from),F=[],Q=this.getUpdateContexts();for(let A of this.view.viewportLineBlocks)if(F.length&&(F=[]),Array.isArray(A.type)){let U=!0;for(let l of A.type)if(l.type==pC.BlockType.Text&&U){Qt(B,F,l.from);for(let s of Q)s.line(this.view,l,F);U=!1}else if(l.widget)for(let s of Q)s.widget(this.view,l)}else if(A.type==pC.BlockType.Text){Qt(B,F,A.from);for(let U of Q)U.line(this.view,A,F)}for(let A of Q)A.finish();I&&this.insertDetachedGutters(g)}updateGutters(I){let g=I.startState.facet(this.activeGutters),B=I.state.facet(this.activeGutters),F=I.docChanged||I.heightChanged||I.viewportChanged||!mQ.RangeSet.eq(I.startState.facet(pC.gutterLineClass),I.state.facet(pC.gutterLineClass),I.view.viewport.from,I.view.viewport.to);if(g==B)for(let Q of this.gutters)Q.update(I)&&(F=!0);else{F=!0;let Q=[];for(let A of B){let U=g.indexOf(A);U<0?Q.push(new cF(this.view,A)):(this.gutters[U].update(I),Q.push(this.gutters[U]))}for(let A of this.gutters)A.dom.remove(),Q.indexOf(A)<0&&A.destroy();for(let A of Q)this.dom.appendChild(A.dom);this.gutters=Q}return F}destroy(){for(let I of this.gutters)I.destroy();this.dom.remove()}};function $U(C){return pC.ViewPlugin.fromClass(C,{provide:I=>pC.EditorView.scrollMargins.of(g=>{let B=g.plugin(I);return!B||B.gutters.length==0||!B.fixed?null:g.textDirection==pC.Direction.LTR?{left:B.dom.offsetWidth}:{right:B.dom.offsetWidth}})})}function h0(C,I,g){let B=[C];return I&&I.fixed===!1&&B.push(g.of(!0)),B}function Il(C,I,g,B){return[h0(C,{},B),g.of({...m0,...I})]}var Fl=require("@codemirror/state"),fG=require("@codemirror/view"),Kg=require("obsidian");var HG=require("obsidian"),Cl=require("@codemirror/state"),yQ=require("@codemirror/view");function oQ(C,I){let g=Object.keys(I).map(B=>X0(C,B,I[B]));return g.length===1?g[0]:function(){g.forEach(B=>B())}}function X0(C,I,g){let B=C[I],F=C.hasOwnProperty(I),Q=F?B:function(){return Object.getPrototypeOf(C)[I].apply(this,arguments)},A=g(Q);return B&&Object.setPrototypeOf(A,B),Object.setPrototypeOf(U,A),C[I]=U,l;function U(...s){return A===Q&&C[I]===U&&l(),A.apply(this,s)}function l(){C[I]===U&&(F?C[I]=Q:delete C[I]),A!==Q&&(A=Q,Object.setPrototypeOf(U,B||Function))}}function o0(C){let I=C.embedRegistry.embedByExtension.md({app:C,containerEl:document.createElement("div")},null,"");I.editable=!0,I.showEditor();let g=Object.getPrototypeOf(Object.getPrototypeOf(I.editMode));return I.unload(),g.constructor}var pG={cursorLocation:{anchor:0,head:0},value:"",cls:"",placeholder:"",focus:!0,filteredExtensions:[],onEnter:(C,I,g)=>(I&&C.options.onSubmit(C),I),onEscape:C=>{C.options.onBlur(C)},onSubmit:()=>{},onBlur:()=>{},onPaste:()=>{},onChange:()=>{}},gl=class extends o0(app){options;initial_value;scope;constructor(I,g,B){super(I,g,{app:I,onMarkdownScroll:()=>{},getMode:()=>"source"}),this.options={...pG,...B},this.initial_value=this.options.value,this.scope=new HG.Scope(this.app.scope),this.scope.register(["Mod"],"Enter",(F,Q)=>!0),this.owner.editMode=this,this.owner.editor=this.editor,this.set(B.value||"",!0),this.register(oQ(this.app.workspace,{setActiveLeaf:F=>(Q,A)=>{this.activeCM.hasFocus||F.call(this.app.workspace,Q,A)}})),this.options.onBlur!==pG.onBlur&&this.editor?.cm.contentDOM.addEventListener("blur",()=>{this._loaded&&this.options.onBlur(this)}),this.editor?.cm.contentDOM.addEventListener("focusin",()=>{this.app.keymap.pushScope(this.scope),this.app.workspace.activeEditor=this.owner}),this.editorEl.classList.remove("markdown-source-view"),B.cls&&this.editorEl.classList.add(B.cls),B.cursorLocation&&this.editor?.cm.dispatch({selection:Cl.EditorSelection.range(B.cursorLocation.anchor,B.cursorLocation.head)})}onUpdate(I,g){super.onUpdate(I,g),g&&this.options.onChange(I)}buildLocalExtensions(){let I=super.buildLocalExtensions();return this.options.placeholder&&I.push((0,yQ.placeholder)(this.options.placeholder)),I.push(yQ.EditorView.domEventHandlers({paste:g=>{this.options.onPaste(g,this)}})),I.push(Cl.Prec.highest(yQ.keymap.of([{key:"Enter",run:g=>this.options.onEnter(this,!1,!1),shift:g=>this.options.onEnter(this,!1,!0)},{key:"Mod-Enter",run:g=>this.options.onEnter(this,!0,!1),shift:g=>this.options.onEnter(this,!0,!0)},{key:"Escape",run:g=>(this.options.onEscape(this),!0),preventDefault:!0}]))),I}getDynamicExtensions(){return super.getDynamicExtensions().filter(I=>!this.options.filteredExtensions.includes(I))}updateBottomPadding(I){return 0}destroy(){this._loaded&&this.unload(),this.app.keymap.popScope(this.scope),this.app.workspace.activeEditor===this.owner&&(this.app.workspace.activeEditor=null),this.containerEl.empty(),super.destroy()}onunload(){super.onunload(),this.destroy()}onload(){super.onload(),this.options.focus&&this.editor?.focus()}};var y0="0.2.3",YG=4,SQ={version:y0,default_edit_mode:1,default_preview_mode:0,comment_style:"icon",editor_styling:!1,markup_focus:{0:{show_styling:!0,show_syntax:!0,show_metadata:!0,focus_annotation:!0,show_comment:!0},1:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1},2:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1}},diff_gutter:!0,diff_gutter_hide_empty:!0,annotation_gutter:!0,annotation_gutter_included_types:31,annotation_gutter_hide_empty:!0,annotation_gutter_default_fold_state:!1,annotation_gutter_fold_button:!0,annotation_gutter_resize_handle:!0,annotation_gutter_focus_on_click:!0,annotation_gutter_width:300,tag_completion:!0,tag_correcter:!0,clipboard_remove_syntax:!0,edit_info:!0,toolbar_preview_button:!0,toolbar_edit_button:!0,toolbar_show_buttons_labels:!0,status_bar_preview_button:!0,status_bar_edit_button:!0,status_bar_metadata_button:!0,database_workers:2,post_processor:!0,live_preview:!0,alternative_cursor_movement:!0,enable_metadata:!1,enable_author_metadata:!1,enable_timestamp_metadata:!1,enable_completed_metadata:!1,enable_style_metadata:!1,enable_color_metadata:!1,add_metadata:!1,add_author_metadata:!1,add_timestamp_metadata:!1,add_completed_metadata:!1,add_style_metadata:!1,add_color_metadata:!1,author:"",suggestion_mode_operations:{cursor_movement:{addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",highlight:"ignore_metadata",comment:"ignore_completely"},bracket_movement:{addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",highlight:"stay_inside",comment:"stay_inside"}}},JG=new Set(["live_preview","diff_gutter","annotation_gutter","annotation_gutter_focus_on_click","comment_style","tag_completion","tag_correcter"]),vG=new Set(["enable_metadata"]),kG=new Set(["enable_metadata"]),JF=(Q=>(Q[Q.ADDITION=1]="ADDITION",Q[Q.DELETION=2]="DELETION",Q[Q.SUBSTITUTION=4]="SUBSTITUTION",Q[Q.HIGHLIGHT=8]="HIGHLIGHT",Q[Q.COMMENT=16]="COMMENT",Q))(JF||{});var WQ=require("obsidian");var GF=(C=!1)=>{let I=oQ(WQ.Menu.prototype,{onEnter:g=>function(B){let F=this.items[this.selected];return F&&F instanceof WQ.MenuItem&&F.handleEvent(B)||!0},onMenuClick:g=>function(B){if(!C||this.currentSubmenu&&this.currentSubmenu.dom.contains(B.target))B.stopImmediatePropagation();else return g&&g.apply(this,[B])},hide:g=>function(){return this.parentMenu||I(),g&&g.apply(this)}});return I},DG=(C,I,g,B=()=>{})=>oQ(WQ.MarkdownView.prototype,{setState:F=>async function(...Q){return Q[0]&&await C(this,Q[0]),F&&F.apply(this,Q)},getState:F=>function(){let Q=F&&F.apply(this);return Q&&I(this,Q),Q},setData:F=>async function(...Q){Q[1]&&g(this);let A=F&&F.apply(this,Q);return Q[1]&&B(this),A}}),TG=(C,I,g)=>oQ(C.app.plugins,{uninstallPlugin:B=>async(...F)=>{try{F[0]===I&&await g()}catch{}B&&await B.apply(C.app.plugins,F)}});var Ut=class extends Kg.Component{constructor(g,B){super();this.range=g;this.marker=B;this.text=g.unwrap(),this.annotation_container=this.marker.annotation_thread.createDiv({cls:"cmtr-anno-gutter-annotation"}),this.annotation_container.addEventListener("blur",this.renderPreview.bind(this)),this.annotation_container.addEventListener("dblclick",this.renderSource.bind(this)),this.annotation_container.addEventListener("contextmenu",this.onCommentContextmenu.bind(this)),this.range.metadata&&this.renderMetadata(),this.annotation_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-view"}),this.renderPreview()}text;new_text=null;annotation_container;metadata_view=null;annotation_view;currentMode=null;editMode=null;onload(){super.onload()}onunload(){super.onunload(),this.annotation_container.remove(),this.editMode=null}renderMetadata(){if(this.metadata_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-metadata"}),this.range.fields.author){let g=createSpan({cls:"cmtr-anno-gutter-annotation-author-label",text:"Author: "});this.metadata_view.appendChild(g);let B=createSpan({cls:"cmtr-anno-gutter-annotation-author-name",text:this.range.fields.author});this.metadata_view.appendChild(B)}if(this.range.fields.time){if(this.metadata_view.children.length>0){let F=createSpan({cls:"cmtr-anno-gutter-annotation-metadata-separator",text:" \u2022 "});this.metadata_view.appendChild(F)}let g=createSpan({cls:"cmtr-anno-gutter-annotation-time-label",text:"Updated at: "});this.metadata_view.appendChild(g);let B=createSpan({cls:"cmtr-anno-gutter-annotation-time",text:window.moment.unix(this.range.fields.time).format("MMM DD YYYY, HH:mm")});this.metadata_view.appendChild(B)}}renderSource(g){if(this.range.type!=="comment")new Kg.Notice("[Commentator] You can only edit comments.");else{if(g?.stopPropagation(),this.currentMode==="source")return;let{app:B}=this.marker.view.state.field(Kg.editorInfoField);if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!0),this.range.fields.author&&this.range.fields.author!==B.plugins.plugins.commentator.settings.author){new Kg.Notice("[Commentator] You cannot edit comments from other authors.");return}this.annotation_view.empty(),this.editMode=this.addChild(new gl(B,this.annotation_view,{value:this.text,cls:"cmtr-anno-gutter-annotation-editor",onSubmit:F=>{this.new_text=F.get(),this.renderPreview()},filteredExtensions:[B.plugins.plugins.commentator.editorExtensions],onBlur:this.renderPreview.bind(this)})),this.currentMode="source"}}renderPreview(){if(this.currentMode!=="preview")if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!1),this.text===this.new_text||this.new_text===null){let{app:g}=this.marker.view.state.field(Kg.editorInfoField);if(this.new_text=null,this.editMode&&(this.removeChild(this.editMode),this.editMode=null),this.annotation_view.empty(),this.range.type!=="substitution")switch(Kg.MarkdownRenderer.render(g,this.text||" ",this.annotation_view,"",this),this.range.type){case"addition":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Added: "}));break;case"deletion":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Deleted: "}));break;case"highlight":break;case"comment":break}else{let B=this.range.unwrap_parts();Kg.MarkdownRenderer.render(g,B[0]||" ",this.annotation_view,"",this),this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Changed: "}));let F=this.annotation_view.children.length;Kg.MarkdownRenderer.render(g,B[1]||" ",this.annotation_view,"",this),this.annotation_view.children[F].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"To: "}))}this.annotation_view.addClass("cmtr-anno-gutter-annotation-"+this.range.type),this.currentMode="preview"}else this.text=this.new_text,setTimeout(()=>this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:_U("comment",this.new_text)}}))}onCommentContextmenu(g){g.preventDefault(),g.stopPropagation(),GF(!0);let B=new Kg.Menu;this.range.type!=="comment"&&this.range.type!=="highlight"&&(B.addItem(F=>{F.setTitle("Accept changes").setIcon("check").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:wB(this.marker.view.state,this.range.from,this.range.to)})})}),B.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:fB(this.marker.view.state,this.range.from,this.range.to)})})})),this.range.type==="comment"?(this.range.replies.length>0&&B.addItem(F=>{F.setTitle("Close comment thread").setIcon("message-square-off").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.full_range_front,to:this.range.full_range_back,insert:""}})})}),B.addItem(F=>{F.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{jC(this.marker.view,this.range)})}),B.addItem(F=>{F.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(()=>{this.renderSource()})}),B.addItem(F=>{F.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:""}})})})):this.range.type!=="highlight"?(B.addItem(F=>{F.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{jC(this.marker.view,this.range)})}),this.range.replies.length>0&&B.addItem(F=>{F.setTitle("Remove all comments").setIcon("message-square-x").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.replies[0].from,to:this.range.replies[this.range.replies.length-1].to,insert:""}})})})):B.addItem(F=>{F.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{jC(this.marker.view,this.range)})}),B.addItem(F=>{F.setTitle("Fold gutter").setSection("gutter-controls").setIcon("arrow-right-from-line").onClick(()=>{this.marker.view.dispatch({annotations:[iF.of(null)]})})}),B.addItem(F=>{let Q=F.setTitle("Included annotations").setIcon("eye").setSection("gutter-controls").setSubmenu(),A=this.marker.view.state.facet(QB);for(let{title:U,icon:l,value:s}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])Q.addItem(G=>{G.setTitle(U).setIcon(l).setChecked((A&s)!==0).onClick(()=>{A^=s;let t=(A&s)!==0;G.checkIconEl?G.checkIconEl.style.display=t?"flex":"none":G.setChecked(t),this.marker.view.dispatch(this.marker.view.state.update({effects:[VQ.reconfigure(QB.of(A))]}))})})}),B.showAtPosition(g)}},Bl=class extends fG.GutterMarker{constructor(g,B,F,Q=0){super();this.annotation=g;this.annotations=B;this.view=F;this.itr=Q}annotation_thread;component=new Kg.Component;preventUnload=!1;eq(g){return this.itr===g.itr&&this.annotations===g.annotations&&this.annotations[0].equals(g.annotations[0])}onCommentThreadClick(){this.view.dispatch({annotations:[Ql.of({marker:this,index:-1,scroll:!0,focus_markup:!0})]}),this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0)}toDOM(){this.annotation_thread=createDiv({cls:"cmtr-anno-gutter-thread"}),this.annotation_thread.addEventListener("click",this.onCommentThreadClick.bind(this));for(let g of this.annotations)this.component.addChild(new Ut(g,this));return this.component.load(),this.annotation_thread}focus(){this.annotation_thread.focus()}focus_annotation(g=-1,B=!1){g===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0):g>=0&&g{let F=this.view.lineBlockAt(this.annotations[0].from).top-100;this.view.scrollDOM.scrollTo({top:F,behavior:"smooth"})},200)}unfocus_annotation(g=-1){g===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!1):this.annotation_thread.children.item(g).classList.toggle("cmtr-anno-gutter-thread-highlight",!1)}destroy(g){this.component.unload(),this.annotation_thread.remove(),super.destroy(g)}};function wG(C,I,g){let B=C.field(Kg.editorEditorField),F=(g&1)!==0,Q=(g&2)!==0,A=(g&4)!==0,U=(g&8)!==0,l=(g&16)!==0,s=[];for(let G of I){let t=G.full_thread;switch(l||(t=t.slice(0,1)),G.type){case"addition":F||t.shift();break;case"deletion":Q||t.shift();break;case"substitution":A||t.shift();break;case"highlight":U||t.shift();break;case"comment":l||t.shift();break}if(t.length){let c=new Bl(G,t,B,zG);c.preventUnload=!0,s.push(c.range(G.from,G.to))}}return s}var zG=0,TB=Fl.StateField.define({create(C){let I=C.field(JI).ranges.ranges.reduce((g,B)=>{let F=B.base_range;return g.includes(F)||g.push(F),g},[]);return Fl.RangeSet.of(wG(C,I,C.facet(QB)))},update(C,I){let g=I.state.facet(QB);if(I.startState.facet(QB)!==g)return this.create(I.state);if(!I.docChanged)return C;zG+=1;let B=[];for(let Q of I.state.field(JI).inserted_ranges)B.includes(Q.base_range)||B.push(Q.base_range);let F=I.state.field(JI).deleted_ranges.map(Q=>Q.base_range);return C.map(I.changes).update({filter:(Q,A,U)=>{let l=!F.includes(U.annotation);return U.preventUnload=l,l},add:wG(I.state,B.map(Q=>Q.full_thread[0]),g)})}});var MG=require("@codemirror/view"),AB=require("obsidian");function lt(C,I,g=!1){let B=I??C.text;!I&&g&&(C.to>=B.length&&!B.endsWith(eg[C.type].at(-1))?B=C.unwrap_bracket(!0):B=C.unwrap());let F=document.createElement("span");F.classList.add("cmtr-comment-icon"),(0,AB.setIcon)(F,"message-square");let Q=null,A=new AB.Component;return F.onmouseenter=()=>{if(Q)return;Q=document.createElement("div"),Q.classList.add("cmtr-comment-tooltip"),AB.MarkdownRenderer.render(sg.app,B,Q,"",A),A.load(),F.appendChild(Q);let U=F.getBoundingClientRect(),l=Q.getBoundingClientRect();Q.style.left=U.x-l.x+12+"px"},F.onmouseleave=()=>{Q&&(A.unload(),F.removeChild(Q),Q=null)},F}var hA=class extends MG.WidgetType{constructor(g,B=!1){super();this.range=g;this.annotation_gutter=B;this.component=new AB.Component}tooltip=null;icon=null;component;focused=!1;renderTooltip(){if(!this.tooltip){this.tooltip=document.createElement("div"),this.tooltip.classList.add("cmtr-comment-tooltip"),AB.MarkdownRenderer.render(sg.app,this.range.text,this.tooltip,"",this.component),this.component.load(),this.icon.appendChild(this.tooltip);let g=this.icon.getBoundingClientRect(),B=this.tooltip.getBoundingClientRect();this.tooltip.style.left=g.x-B.x-B.width/2+12+"px"}}focusAnnotation(g,B){g.dispatch({annotations:[aB.of({from:this.range.from,to:this.range.to})]})}unrenderTooltip(){!this.focused&&this.tooltip&&(this.component.unload(),this.icon.removeChild(this.tooltip),this.tooltip=null)}toDOM(g){return this.icon=document.createElement("span"),this.icon.classList.add("cmtr-comment-icon"),(0,AB.setIcon)(this.icon,"message-square"),this.annotation_gutter?(this.icon.onclick=B=>this.focusAnnotation(g,B),this.icon.oncontextmenu=B=>{B.preventDefault();let F=new AB.Menu;F.addItem(Q=>{Q.setTitle("Focus annotation").setIcon("eye").onClick(this.focusAnnotation.bind(this,g))}),F.addItem(Q=>{Q.setTitle("Add comment").setIcon("message-square").onClick(A=>{A.preventDefault(),jC(g,this.range)})}),F.showAtMouseEvent(B)}):this.range.length&&(this.icon.onmouseenter=()=>{this.renderTooltip()},this.icon.onclick=()=>{this.renderTooltip(),this.focused=!0},this.icon.onmouseleave=()=>{this.unrenderTooltip(),this.focused=!1}),this.icon}};var vF=require("@codemirror/state"),EQ=require("@codemirror/view");var NQ=vF.StateEffect.define(),XA=vF.StateField.define({create(C){return{from:C.selection.main.from,to:C.selection.main.to}},update(C,I){for(let g of I.effects)if(g.is(NQ))return g.value;return C}}),st=vF.StateField.define({create(C){return EQ.Decoration.none},update(C,I){let g=I.startState.field(XA,!1),B=I.state.field(XA);if(g!==B){let F=I.state.field(JI).ranges.ranges_in_interval(B.from,B.to);return F.length&&F[0].base_range===F.at(-1)?.base_range&&B.from>=F[0].from&&B.to<=F.at(-1).to?vF.RangeSet.of([EQ.Decoration.mark({attributes:{class:"cmtr-focused"}}).range(F[0].full_range_front,F[0].full_range_back)]):EQ.Decoration.none}else return C},provide(C){return EQ.EditorView.decorations.from(C)}});var SA=require("@codemirror/state"),zB=require("@codemirror/view"),ll=require("obsidian");var yA=zB.Decoration.replace({}),tt=(C,I="",g=!1)=>zB.Decoration.mark({attributes:{"data-contents":"string","data-type":"cmtr-"+C.repr.toLowerCase(),class:I,style:g&&C.fields.color?`background-color: #${C.fields.color};`:""}});function HC(C,I,g,B=!1){B||(g===-1?C.push(yA.range(I.from,I.from+3)):g===1?C.push(yA.range(I.to-3,I.to)):C.push(yA.range(I.middle,I.middle+2)))}function oA(C,I,g=!1){!I.metadata||g||C.push(yA.range(I.from+3,I.metadata+2))}function Al(C,I){C.push(yA.range(I.from,I.to))}function kF(C,I,g,B=0,F=!1,Q=!0){let A=F?0:3;B===0?I.empty()||C.push(tt(I,g,Q).range(I.from+A,I.to-A)):B<0?I.part_is_empty(!0)||C.push(tt(I,g,Q).range(I.from+A,I.middle)):B>0&&(I.part_is_empty(!1)||C.push(tt(I,g,Q).range(I.middle+2,I.to-A)))}function ct(C,I,g=""){HC(C,I,-1),oA(C,I),kF(C,I,g),HC(C,I,1)}function Ul(C,I,g,B,F){let Q=[],{show_styling:A,show_syntax:U,show_metadata:l,show_comment:s}=F.markup_focus[B];for(let G of C)if(g===0){let t=I?I.ranges.some(e=>G.partially_in_full_range(e.from,e.to)):void 0,c=`cmtr-inline cmtr-${G.repr.toLowerCase()} `+(G.fields.style||"");G.replies.length&&(c+=" cmtr-has-reply");let d=t?U:void 0,b=t?l:void 0,Z=t?A:void 0;!(s&&t)&&G.type==="comment"&&F.comment_style!=="inline"?F.comment_style==="icon"&&G.base_range===G?Q.push(zB.Decoration.replace({widget:new hA(G,F.annotation_gutter)}).range(G.from,G.to)):Q.push(zB.Decoration.replace({}).range(G.from,G.to)):(HC(Q,G,-1,d),oA(Q,G,b),G.type==="substitution"?(kF(Q,G,c+" cmtr-deletion",-1,!1,Z),HC(Q,G,0,d),kF(Q,G,c+" cmtr-addition",1,!1,Z)):kF(Q,G,c,0,!1,Z),HC(Q,G,1,d))}else g===1?G.type==="addition"?ct(Q,G,"cmtr-accepted"):G.type==="deletion"?Al(Q,G):G.type==="substitution"?(HC(Q,G,-1),oA(Q,G),HC(Q,G,0),kF(Q,G,"cmtr-accepted",1),HC(Q,G,1)):G.type==="comment"?Al(Q,G):ct(Q,G,""):g===2&&(G.type==="addition"?Al(Q,G):G.type==="deletion"?(HC(Q,G,-1),oA(Q,G),kF(Q,G,"cmtr-accepted"),HC(Q,G,1)):G.type==="substitution"?(HC(Q,G,-1),oA(Q,G),kF(Q,G,"cmtr-accepted",-1),HC(Q,G,0),HC(Q,G,1)):G.type==="comment"?Al(Q,G):ct(Q,G,""));return Q}var Gt=C=>SA.StateField.define({create(I){if(!I.field(ll.editorLivePreviewField))return zB.Decoration.none;let B=I.facet(Mg),F=I.facet(nC),Q=I.field(JI);return SA.RangeSet.of(Ul(Q.ranges.ranges,null,B,F,C))},update(I,g){let B=g.state.field(ll.editorLivePreviewField);if(!B)return zB.Decoration.none;let F=g.state.facet(Mg),Q=g.state.facet(nC),A=g.state.field(JI);if(B!==g.startState.field(ll.editorLivePreviewField)||F!==g.startState.facet(Mg)||g.effects.some(U=>U.is(RQ)))return SA.RangeSet.of(Ul(A.ranges.ranges,g.state.selection,F,Q,C));if(g.docChanged||!g.docChanged&&A.inserted_ranges.length){let U=0;return I.update({filter:(l,s,G)=>{for(;U{for(;sC.some(I=>I)}),it=UB.Facet.define(),aB=UB.Annotation.define(),iF=UB.Annotation.define(),Ql=UB.Annotation.define(),tl=UB.Annotation.define(),cl=UB.Annotation.define(),Gl=UB.Annotation.define(),il=UB.Annotation.define(),sl=class extends XQ{previously_focused=void 0;constructor(I){super(I,PG,it),I.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{I.dispatch(I.state.update({effects:[bl.reconfigure([])]}))}))}debouncedMoveGutter=(0,MB.debounce)(this.moveGutter.bind(this),200);createGutters(I){return I.state.facet(it).map(g=>new bt(I,g,this.dom))}insertGutters(I){I.contentDOM.parentNode.insertBefore(this.dom,I.contentDOM.nextSibling)}insertDetachedGutters(I){this.view.contentDOM.parentNode.insertBefore(this.dom,this.view.contentDOM.nextSibling)}getUpdateContexts(){return this.gutters.map(I=>new dt(I,this.view.viewport,-this.view.documentPadding.top))}update(I){for(let g of I.transactions){let B=g.annotation(Ql);if(B){let{marker:F,index:Q,scroll:A=!1,focus_markup:U=!1}=B;this.unfocusAnnotation(),this.focusAnnotation(F,Q,A,U)}}super.update(I)}unfocusAnnotation(){this.previously_focused?.unfocus_annotation(),this.previously_focused=void 0}focusAnnotation(I,g,B=!1,F=!1){this.previously_focused=I,this.debouncedMoveGutter(I),I.focus_annotation(g,B),F&&setTimeout(()=>{this.view.dispatch(this.view.state.update({effects:[NQ.of({from:I.annotation.from,to:I.annotation.full_range_back})]}))})}updateGutters(I){let g=I.transactions.flatMap(B=>B.annotation(aB)).find(B=>B);if((g||I.startState.selection!==I.state.selection)&&this.unfocusAnnotation(),g){let{from:B,to:F,index:Q=-1,scroll:A=!1}=g;I:for(let U of this.gutters[0].elements)if(B>=U.block.from){for(let l of U.markers)if(B>=l.annotation.from&&F<=l.annotation.full_range_back){this.focusAnnotation(l,Q,A);break I}}else if(Bl.markers.includes(I));if(!B)return;let F=B.markers.indexOf(I),Q=B.block.top,A=B.dom.children[F].offsetTop,U=Q-A;if(Math.abs(U)>=10&&U){let l=g.elements[0];l.dom.style.marginTop=parseInt(l.dom.style.marginTop||"0")+U+"px"}}foldGutter(){this.gutters[0].foldGutter()}},dl=$U(sl);function jG(C){return Il(dl,C,it,PG)}var dt=class extends mA{constructor(g,B,F){super(g,B,F);this.gutter=g;this.height=F;this.previous_element_end=F}previous_element_end=0;new_gutter_elements=[];added_elements=[];async addElement(g,B,F){let Q=Math.max(B.top-this.previous_element_end,0),A=Q<=0?this.previous_element_end:B.top;F.sort((G,t)=>G.annotation.from-t.annotation.from);let l=this.gutter.elements[this.i]?.dom.clientHeight||36,s=this.gutter.elements.findIndex(G=>qU(G.markers,F));if(s!==-1){let G=this.gutter.elements[s];for(let t=this.i;t{this.folded=!this.folded,this.view.state.field(MB.editorInfoField).app.workspace.requestSaveLayout(),this.foldGutter()},this.setFoldButtonState(),this.view.dom.prepend(this.fold_button_el)}createResizeHandle(){this.resize_handle_el=createEl("hr",{cls:["cmtr-anno-gutter-resize-handle"]}),this.resize_handle_el.style.display=this.view.state.field(TB).size&&!this.folded?"":"none",this.resize_handle_el.addEventListener("mousedown",g=>{let B=g.clientX,F=(0,MB.debounce)(l=>{this.width=l,this.view.state.field(MB.editorInfoField).app.workspace.requestSaveLayout(),this.dom.style.width=this.width+"px",this.fold_button_el&&(this.fold_button_el.style.right=this.width+KG+"px")},25);this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!0),this.fold_button_el?.classList.toggle("cmtr-anno-gutter-moving",!0),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!0);let Q=parseInt(this.dom.style.width.slice(0,-2)),A=l=>{let s=l.clientX-B;return B=l.clientX,Q-=s,F(Q),!0},U=()=>{document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",U),this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!1),this.fold_button_el?.classList.toggle("cmtr-anno-gutter-moving",!1),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!1)};return document.addEventListener("mousemove",A),document.addEventListener("mouseup",U),!0}),this.gutterDom.appendChild(this.resize_handle_el)}setFoldButtonState(){this.fold_button_el&&(this.folded?(this.fold_button_el.style.right="20px",this.fold_button_el.style.rotate="-180deg",this.fold_button_el.ariaLabel="Unfold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="none")):(this.fold_button_el.style.right=this.width+KG+"px",this.fold_button_el.style.rotate="0deg",this.fold_button_el.ariaLabel="Fold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="")))}foldGutter(){this.setFoldButtonState(),this.folded?this.elements.forEach(g=>{Array.from(g.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(B=>{B.setAttribute("style",`max-height: ${B.clientHeight}px; overflow: hidden;`)})}):this.dom.addEventListener("transitionend",()=>{this.elements.forEach(g=>{Array.from(g.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(B=>{B.setAttribute("style","")})})},{once:!0}),this.dom.style.width=this.folded?"0":this.width+"px"}update(g){let B=super.update(g),F=g.state.field(TB);for(let Q of g.transactions){let A=Q.annotation(iF),U=Q.annotation(tl),l=Q.annotation(cl),s=Q.annotation(Gl),G=Q.annotation(il);U!==void 0&&(this.width=U,!this.hide_on_empty&&!this.folded&&(this.dom.style.width=U+"px",this.setFoldButtonState())),A!==void 0&&(A===null?(this.folded=!this.folded,this.view.state.field(MB.editorInfoField).app.workspace.requestSaveLayout()):this.folded=A,this.foldGutter()),l!==void 0&&(this.hide_on_empty=l,this.hide_on_empty&&F.size===0?this.dom.style.width="0":this.dom.style.width=this.width+"px"),s!==void 0&&(this.add_fold_button=s,this.add_fold_button&&!this.fold_button_el?this.createFoldButton():!this.add_fold_button&&this.fold_button_el&&(this.fold_button_el.remove(),this.fold_button_el=void 0),this.setFoldButtonState()),G!==void 0&&(this.add_resize_handle=G,this.add_resize_handle&&!this.resize_handle_el?this.createResizeHandle():!this.add_resize_handle&&this.resize_handle_el&&(this.resize_handle_el.remove(),this.resize_handle_el=void 0))}return F.size!==g.startState.field(TB).size&&(F.size===0?(this.fold_button_el&&(this.fold_button_el.style.display="none"),this.resize_handle_el&&(this.resize_handle_el.style.display="none"),this.hide_on_empty&&(this.dom.style.width="0")):(this.fold_button_el&&(this.fold_button_el.style.display=""),this.resize_handle_el&&(this.resize_handle_el.style.display=""),this.folded||(this.dom.style.width=this.width+"px"))),B}destroy(){this.fold_button_el?.remove(),this.resize_handle_el?.remove(),super.destroy()}},Zt=class extends hQ{constructor(g,B,F,Q,A=null){super(g,B,F,Q);this.block=A}update(g,B,F,Q,A=null){this.block=A,this.above!=F&&(this.dom.style.marginTop=(this.above=F)?F+"px":""),qU(this.markers,Q)||this.setMarkers(g,Q)}};var _G=C=>[TB,jG({class:"cmtr-anno-gutter "+(C.app.vault.getConfig("cssTheme")==="Minimal"?" is-minimal":""),markers:I=>I.state.field(TB),foldState:C.settings.annotation_gutter_default_fold_state,width:C.settings.annotation_gutter_width,hideOnEmpty:C.settings.annotation_gutter_hide_empty,includeFoldButton:C.settings.annotation_gutter_fold_button,includeResizeHandle:C.settings.annotation_gutter_resize_handle})],bl=new OG.Compartment;function jC(C,I,g=!1){let B=I?I.full_range_back:C.state.selection.main.head,F=I?I.full_thread.length:-1;C.dispatch(C.state.update({changes:{from:B,to:B,insert:_U("comment","")},selection:qG.EditorSelection.cursor(B),scrollIntoView:g})),setTimeout(()=>{C.dispatch(C.state.update({annotations:[aB.of({from:B,to:B,index:F})]}))})}var Ln=require("@codemirror/state");function wB(C,I,g,B=!0){let F=C.field(JI).ranges;return(I||g?F.ranges_in_interval(I??0,g??1/0):F.ranges).filter(Q=>Q.type==="addition"||Q.type==="deletion"||Q.type==="substitution").map(Q=>({from:Q.from,to:B?Q.full_range_back:Q.to,insert:Q.accept()}))}function fB(C,I,g,B=!0){let F=C.field(JI).ranges;return(I||g?F.ranges_in_interval(I??0,g??1/0):F.ranges).filter(Q=>Q.type==="addition"||Q.type==="deletion"||Q.type==="substitution").map(Q=>({from:Q.from,to:B?Q.full_range_back:Q.to,insert:Q.reject()}))}async function lB(C,I,g,B){B.sort((A,U)=>A.from-U.from);let F=await I.vault.read(g),Q=sG(F,C,B);await I.vault.modify(g,Q)}var Vt=require("@codemirror/state");function Ii(C,I){return I==="regular"||I==="clear"?!0:!((C.type==="comment"||C.type==="highlight")&&C.type!==I)}function S0(C,I,g,B={}){return Ii(C,I)?!g||!C.fields?!1:[...new Set(Object.keys(g).concat(Object.keys(C.fields)))].some(F=>g[F]!==C.fields[F]&&(B[F]==="move_outside"||F==="author"&&C.type==="comment")):!0}function W0(C,I){if(C!=="substitution"&&C===I)return C;if(C==="deletion"&&I==="addition")return"substitution";if(C==="substitution"&&I==="addition")return"substitution";if(C==="deletion"&&I==="substitution")return"substitution"}function et(C,I,g,B,F=!1,Q=!1){if(!I||!g||!Ii(I,g))return{};if(!Q&&(F&&I.touches_left_bracket(C,!1,!0,!0)||!F&&I.touches_right_bracket(C,!1,!0)))return{};let{compatible:A,merged_metadata:U}=jU(I,B);if(!A)return{};let l,s;return F?(l=I.range_type(-1/0,C),s=g):(l=g,s=I.range_type(C,1/0)),g=W0(l,s),{type:g,merged_metadata:g?U:void 0}}function $G(C,I,g,B,F,Q,A){let U=C.ranges_in_interval(g,B),l=C.at_cursor(g,!1),s=C.at_cursor(B,!0),G=["",""],t=!1,c=F,d=0,b=0;function Z(x=!1){l?.type&&(l.touches_left_bracket(g,!1,!0,!0)?g=l.from:l.touches_right_bracket(g,!1,!0)?g=l.to:l.type==="substitution"&&(x||l.contains_separator(g,B))?(G[0]=DB("",l.unwrap_slice(0,g),"deletion",l.fields).insert,g=l.from):G[0]=l.split_range(g)[0])}function e(x=!1){if(s?.type)if(s.touches_right_bracket(B,!1,!0))B=s.to;else if(s.touches_left_bracket(B,!1,!0,!0))B=s.from;else if(s.type==="substitution"&&(x||s.contains_separator(g,B))){let a=s.unwrap_slice(B,1/0);G[1]=DB(a,"","addition",s.fields).insert,B=s.to,t=!0}else G[1]=s.split_range(B)[1]}if(Q==="none")B=g,c="";else if(Q==="regular")if(l!==void 0&&l===s){let x=g===B?"":l.unwrap_slice(g,B);if(x){if(g=l.cursor_move_inside(g,!0),B=l.cursor_move_inside(B,!1),l.type==="substitution"){let a=l.contains_part(g,B),n=l.unwrap_parts();if(a){let h=l.unwrap_slice(0,g);d+=h.length,b+=F.length-2;let m=l.unwrap_slice(B,l.middle);x=h+F+m,c=n[1]}else if(a===!1){x=n[0];let h=l.unwrap_slice(l.middle+2,g);d=x.length+h.length;let m=l.unwrap_slice(B,1/0);c=h+F+m}else{let[h,m]=l.unwrap_slice_parts_inverted(g,B);d=h.length,x=h,c=F+m}g=l.from,B=l.to,{insert:c,start_offset:d,end_offset:b}=aA(c,x,l.fields,d,b)}}else{let a=l.cursor_move_inside(g,!0);g=a,B=a,c=F}}else if(g===B?"":C.unwrap_in_range(I,g,B,U).output)Z(),e(),d+=G[0].length,t?c=G[0]+F+G[1]:(b=G[1].length,c=G[0]+G[1]+F);else{let a=l||s,n=a?a.cursor_move_inside(g,!0):g;g=n,B=n,c=F}else if(Q==="clear"){Z(),e();let x=g===B?"":C.unwrap_in_range(I,g,B,U).output;d+=G[0].length,b+=x.length,c=G[0]+x+G[1]}else if(l!==void 0&&l===s&&l.type==="substitution"){let x=l.contains_part(g,B),a=x?g:B,n=et(a,l,Q,A,x,!0);if(n.type){let h="",m=l.unwrap_parts();if(n.type==="addition"){h=m[0];let L=Math.clamp(a-l.middle-2,0,m[1].length);d=m[0].length+L,c=m[1].slice(0,L)+F+m[1].slice(L),{insert:c,start_offset:d,end_offset:b}=aA(c,h,n.merged_metadata,d,b),g=l.from,B=l.to}else if(n.type==="deletion")b=B-g,B=g,c="";else if(x){let L=l.unwrap_slice(0,g),R=l.unwrap_slice(g,B);e(),d=L.length,b=R.length,{insert:c,start_offset:d,end_offset:b}=DB(F,L+R,n.type,n.merged_metadata,d,b),g=l.from}else if(x===!1)h=l.unwrap_slice(g,B),b=h.length,c=F+l.unwrap_slice(B,1/0),F.length||(b-=2),Z(),{insert:c,start_offset:d,end_offset:b}=DB(c,h,n.type,n.merged_metadata,d,b),B=l.to;else{let L=Math.clamp(B-l.middle-2,0,m[1].length);h=m[0]+m[1].slice(0,L),d=g-l.range_start,b=L+(m[0].length-g+l.range_start),c=F+m[1].slice(L),c.length&&!F.length&&(b-=2),{insert:c,start_offset:d,end_offset:b}=aA(c,h,n.merged_metadata,d,b),g=l.from,B=l.to}}else{let h=l.unwrap_slice(g,B);Z(Bl.middle+2),{insert:c,start_offset:d,end_offset:b}=DB(F,h,Q,A,d,b+F.length+h.length)}}else{let x=g===B?"":C.unwrap_in_range(I,g,B,U).output;if(!x){if(Q==="substitution")Q="addition";else if(Q==="deletion")return{from:g,to:g,insert:"",start:g,end:g}}b=x.length;let a=et(g,l,Q,A,!0),n=a.merged_metadata;if(c=F,a.type){if(l.type==="substitution"){let m=l.unwrap_parts();d=m[0].length,b+=m[1].length,x=m[0]+x,c=m[1]+F}else{let m=l.unwrap_slice(0,g);d=m.length,x=m+x}g=l.from,A=n}else Z();let h=et(B,s,Q,A,!1);if(n=h.merged_metadata,h.type){if(s.type==="substitution"){let m=s.unwrap_slice_parts_inverted(g,B);c=F+m[1],x+=m[0]}else c+=s.unwrap_slice(B,1/0);B=s.to,A=n}else e();(a.type==="substitution"||h.type==="substitution")&&(Q="substitution"),{insert:c,start_offset:d,end_offset:b}=DB(c,x,Q,A,d,b)}return d+=G[0].length,c=G[0]+c+G[1],{from:g,to:B,insert:c,start:g+d,end:g+d+b+F.length}}function WA(C,I,g,B,F,Q,A,U=!1){let l=C.ranges_in_interval(g,B),s=l.at(0),G=l.at(-1);s?.touches_left_bracket(g,!0,!0,!0)&&(g=s.from),G?.touches_right_bracket(B,!0,!0)&&(B=G.to);let t=g,c=[];if(!U){for(let b of l)if(S0(b,Q,A)){if(tB&&(B=t);let d=$G(C,I,t,B,F,Q,A);return d&&c.push(d),c}function gi(C,I,g){let B=C.cm.state.field(JI).ranges,F=C.cm.state.selection.ranges,Q=[],A=[];for(let U of F){let l=WA(B,C.cm.state.doc,U.from,U.to,"",I,YF());A.push(...l),Q.push(Vt.EditorSelection.range(l[0].start,l[l.length-1].end))}C.cm.dispatch(C.cm.state.update({changes:A,selection:Vt.EditorSelection.create(Q)}))}var dF=WU(Ci(),1);dF.default.DIFF_DELETE=-1;dF.default.DIFF_INSERT=1;dF.default.DIFF_EQUAL=0;function E0(C,I){let g=new dF.default,B=g.diff_main(C,I);g.diff_cleanupSemantic(B);let F=0,Q=[],A=null;for(let[U,l]of B)U===dF.default.DIFF_EQUAL?(A&&(Q.push(A),A=null),F+=l.length):U===dF.default.DIFF_INSERT?A?A.insert?(Q.push(A),A={from:F,to:F,insert:l}):A.insert+=l:A={from:F,to:F,insert:l}:U===dF.default.DIFF_DELETE&&(A?(Q.push(A),A={from:F,to:F+l.length,insert:""}):A={from:F,to:F+l.length,insert:""},F+=l.length);return A&&Q.push(A),Q}function Bi(C,I){let g=E0(C,I),B="",F=0;for(let Q of g)Q.from>F&&(B+=C.slice(F,Q.from)),Q.insert&&(B+=NG(Q.insert,C.slice(Q.from,Q.to))),F=Q.to;return Ft in s?Zo(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e,Xs=(s,t)=>{for(var e in t||(t={}))gf.call(t,e)&&Qo(s,e,t[e]);if(pf)for(var e of pf(t))fg.call(t,e)&&Qo(s,e,t[e]);return s};var ug=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports);var cg=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ag(t))!gf.call(s,n)&&n!==e&&Zo(s,n,{get:()=>t[n],enumerable:!(i=lg(t,n))||i.enumerable});return s};var dg=(s,t,e)=>(e=s!=null?og(hg(s)):{},cg(t||!s||!s.__esModule?Zo(e,"default",{value:s,enumerable:!0}):e,s));var N=(s,t,e)=>Qo(s,typeof t!="symbol"?t+"":t,e);var sg=ug((Ux,Bn)=>{var C=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},it=-1,st=1,W=0;C.Diff=function(s,t){return[s,t]};C.prototype.diff_main=function(s,t,e,i){typeof i=="undefined"&&(this.Diff_Timeout<=0?i=Number.MAX_VALUE:i=new Date().getTime()+this.Diff_Timeout*1e3);var n=i;if(s==null||t==null)throw new Error("Null input. (diff_main)");if(s==t)return s?[new C.Diff(W,s)]:[];typeof e=="undefined"&&(e=!0);var r=e,o=this.diff_commonPrefix(s,t),l=s.substring(0,o);s=s.substring(o),t=t.substring(o),o=this.diff_commonSuffix(s,t);var a=s.substring(s.length-o);s=s.substring(0,s.length-o),t=t.substring(0,t.length-o);var h=this.diff_compute_(s,t,r,n);return l&&h.unshift(new C.Diff(W,l)),a&&h.push(new C.Diff(W,a)),this.diff_cleanupMerge(h),h};C.prototype.diff_compute_=function(s,t,e,i){var n;if(!s)return[new C.Diff(st,t)];if(!t)return[new C.Diff(it,s)];var r=s.length>t.length?s:t,o=s.length>t.length?t:s,l=r.indexOf(o);if(l!=-1)return n=[new C.Diff(st,r.substring(0,l)),new C.Diff(W,o),new C.Diff(st,r.substring(l+o.length))],s.length>t.length&&(n[0][0]=n[2][0]=it),n;if(o.length==1)return[new C.Diff(it,s),new C.Diff(st,t)];var a=this.diff_halfMatch_(s,t);if(a){var h=a[0],f=a[1],u=a[2],c=a[3],d=a[4],p=this.diff_main(h,u,e,i),g=this.diff_main(f,c,e,i);return p.concat([new C.Diff(W,d)],g)}return e&&s.length>100&&t.length>100?this.diff_lineMode_(s,t,i):this.diff_bisect_(s,t,i)};C.prototype.diff_lineMode_=function(s,t,e){var i=this.diff_linesToChars_(s,t);s=i.chars1,t=i.chars2;var n=i.lineArray,r=this.diff_main(s,t,!1,e);this.diff_charsToLines_(r,n),this.diff_cleanupSemantic(r),r.push(new C.Diff(W,""));for(var o=0,l=0,a=0,h="",f="";o=1&&a>=1){r.splice(o-l-a,l+a),o=o-l-a;for(var u=this.diff_main(h,f,!1,e),c=u.length-1;c>=0;c--)r.splice(o,0,u[c]);o=o+u.length}a=0,l=0,h="",f="";break}o++}return r.pop(),r};C.prototype.diff_bisect_=function(s,t,e){for(var i=s.length,n=t.length,r=Math.ceil((i+n)/2),o=r,l=2*r,a=new Array(l),h=new Array(l),f=0;fe);b++){for(var w=-b+d;w<=b-p;w+=2){var y=o+w,v;w==-b||w!=b&&a[y-1]i)p+=2;else if(x>n)d+=2;else if(c){var S=o+u-w;if(S>=0&&S=k)return this.diff_bisectSplit_(s,t,v,x,e)}}}for(var P=-b+g;P<=b-m;P+=2){var S=o+P,k;P==-b||P!=b&&h[S-1]i)m+=2;else if(R>n)g+=2;else if(!c){var y=o+u-P;if(y>=0&&y=k)return this.diff_bisectSplit_(s,t,v,x,e)}}}}return[new C.Diff(it,s),new C.Diff(st,t)]};C.prototype.diff_bisectSplit_=function(s,t,e,i,n){var r=s.substring(0,e),o=t.substring(0,i),l=s.substring(e),a=t.substring(i),h=this.diff_main(r,o,!1,n),f=this.diff_main(l,a,!1,n);return h.concat(f)};C.prototype.diff_linesToChars_=function(s,t){var e=[],i={};e[0]="";function n(a){for(var h="",f=0,u=-1,c=e.length;ui?s=s.substring(e-i):et.length?s:t,i=s.length>t.length?t:s;if(e.length<4||i.length*2=p.length?[v,x,S,k,y]:null}var o=r(e,i,Math.ceil(e.length/4)),l=r(e,i,Math.ceil(e.length/2)),a;if(!o&&!l)return null;l?o?a=o[4].length>l[4].length?o:l:a=l:a=o;var h,f,u,c;s.length>t.length?(h=a[0],f=a[1],u=a[2],c=a[3]):(u=a[0],c=a[1],h=a[2],f=a[3]);var d=a[4];return[h,f,u,c,d]};C.prototype.diff_cleanupSemantic=function(s){for(var t=!1,e=[],i=0,n=null,r=0,o=0,l=0,a=0,h=0;r0?e[i-1]:-1,o=0,l=0,a=0,h=0,n=null,t=!0)),r++;for(t&&this.diff_cleanupMerge(s),this.diff_cleanupSemanticLossless(s),r=1;r=d?(c>=f.length/2||c>=u.length/2)&&(s.splice(r,0,new C.Diff(W,u.substring(0,c))),s[r-1][1]=f.substring(0,f.length-c),s[r+1][1]=u.substring(c),r++):(d>=f.length/2||d>=u.length/2)&&(s.splice(r,0,new C.Diff(W,f.substring(0,d))),s[r-1][0]=st,s[r-1][1]=u.substring(0,u.length-d),s[r+1][0]=it,s[r+1][1]=f.substring(d),r++),r++}r++}};C.prototype.diff_cleanupSemanticLossless=function(s){function t(d,p){if(!d||!p)return 6;var g=d.charAt(d.length-1),m=p.charAt(0),b=g.match(C.nonAlphaNumericRegex_),w=m.match(C.nonAlphaNumericRegex_),y=b&&g.match(C.whitespaceRegex_),v=w&&m.match(C.whitespaceRegex_),x=y&&g.match(C.linebreakRegex_),S=v&&m.match(C.linebreakRegex_),k=x&&d.match(C.blanklineEndRegex_),P=S&&p.match(C.blanklineStartRegex_);return k||P?5:x||S?4:b&&!y&&v?3:y||v?2:b||w?1:0}for(var e=1;e=u&&(u=c,a=i,h=n,f=r)}s[e-1][1]!=a&&(a?s[e-1][1]=a:(s.splice(e-1,1),e--),s[e][1]=h,f?s[e+1][1]=f:(s.splice(e+1,1),e--))}e++}};C.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;C.whitespaceRegex_=/\\s/;C.linebreakRegex_=/[\\r\\n]/;C.blanklineEndRegex_=/\\n\\r?\\n$/;C.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;C.prototype.diff_cleanupEfficiency=function(s){for(var t=!1,e=[],i=0,n=null,r=0,o=!1,l=!1,a=!1,h=!1;r0?e[i-1]:-1,a=h=!1),t=!0)),r++;t&&this.diff_cleanupMerge(s)};C.prototype.diff_cleanupMerge=function(s){s.push(new C.Diff(W,""));for(var t=0,e=0,i=0,n="",r="",o;t1?(e!==0&&i!==0&&(o=this.diff_commonPrefix(r,n),o!==0&&(t-e-i>0&&s[t-e-i-1][0]==W?s[t-e-i-1][1]+=r.substring(0,o):(s.splice(0,0,new C.Diff(W,r.substring(0,o))),t++),r=r.substring(o),n=n.substring(o)),o=this.diff_commonSuffix(r,n),o!==0&&(s[t][1]=r.substring(r.length-o)+s[t][1],r=r.substring(0,r.length-o),n=n.substring(0,n.length-o))),t-=e+i,s.splice(t,e+i),n.length&&(s.splice(t,0,new C.Diff(it,n)),t++),r.length&&(s.splice(t,0,new C.Diff(st,r)),t++),t++):t!==0&&s[t-1][0]==W?(s[t-1][1]+=s[t][1],s.splice(t,1)):t++,i=0,e=0,n="",r="";break}s[s.length-1][1]===""&&s.pop();var l=!1;for(t=1;tt));o++)n=e,r=i;return s.length!=o&&s[o][0]===it?r:r+(t-n)};C.prototype.diff_prettyHtml=function(s){for(var t=[],e=/&/g,i=//g,r=/\\n/g,o=0;o");switch(l){case st:t[o]=\'\'+h+"";break;case it:t[o]=\'\'+h+"";break;case W:t[o]=""+h+"";break}}return t.join("")};C.prototype.diff_text1=function(s){for(var t=[],e=0;ethis.Match_MaxBits)throw new Error("Pattern too long for this browser.");var i=this.match_alphabet_(t),n=this;function r(v,x){var S=v/t.length,k=Math.abs(e-x);return n.Match_Distance?S+k/n.Match_Distance:k?1:S}var o=this.Match_Threshold,l=s.indexOf(t,e);l!=-1&&(o=Math.min(r(0,l),o),l=s.lastIndexOf(t,e+t.length),l!=-1&&(o=Math.min(r(0,l),o)));var a=1<=p;b--){var w=i[s.charAt(b-1)];if(d===0?m[b]=(m[b+1]<<1|1)&w:m[b]=(m[b+1]<<1|1)&w|((c[b+1]|c[b])<<1|1)|c[b+1],m[b]&a){var y=r(d,b-1);if(y<=o)if(o=y,l=b-1,l>e)p=Math.max(1,2*e-l);else break}}if(r(d+1,e)>o)break;c=m}return l};C.prototype.match_alphabet_=function(s){for(var t={},e=0;e2&&(this.diff_cleanupSemantic(n),this.diff_cleanupEfficiency(n));else if(s&&typeof s=="object"&&typeof t=="undefined"&&typeof e=="undefined")n=s,i=this.diff_text1(n);else if(typeof s=="string"&&t&&typeof t=="object"&&typeof e=="undefined")i=s,n=t;else if(typeof s=="string"&&typeof t=="string"&&e&&typeof e=="object")i=s,n=e;else throw new Error("Unknown call format to patch_make.");if(n.length===0)return[];for(var r=[],o=new C.patch_obj,l=0,a=0,h=0,f=i,u=i,c=0;c=2*this.Patch_Margin&&l&&(this.patch_addContext_(o,f),r.push(o),o=new C.patch_obj,l=0,f=u,a=h);break}d!==st&&(a+=p.length),d!==it&&(h+=p.length)}return l&&(this.patch_addContext_(o,f),r.push(o)),r};C.prototype.patch_deepCopy=function(s){for(var t=[],e=0;ethis.Match_MaxBits?(a=this.match_main(t,l.substring(0,this.Match_MaxBits),o),a!=-1&&(h=this.match_main(t,l.substring(l.length-this.Match_MaxBits),o+l.length-this.Match_MaxBits),(h==-1||a>=h)&&(a=-1))):a=this.match_main(t,l,o),a==-1)n[r]=!1,i-=s[r].length2-s[r].length1;else{n[r]=!0,i=a-o;var f;if(h==-1?f=t.substring(a,a+l.length):f=t.substring(a,h+this.Match_MaxBits),l==f)t=t.substring(0,a)+this.diff_text2(s[r].diffs)+t.substring(a+l.length);else{var u=this.diff_main(l,f,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(u)/l.length>this.Patch_DeleteThreshold)n[r]=!1;else{this.diff_cleanupSemanticLossless(u);for(var c=0,d,p=0;pr[0][1].length){var o=t-r[0][1].length;r[0][1]=e.substring(r[0][1].length)+r[0][1],n.start1-=o,n.start2-=o,n.length1+=o,n.length2+=o}if(n=s[s.length-1],r=n.diffs,r.length==0||r[r.length-1][0]!=W)r.push(new C.Diff(W,e)),n.length1+=t,n.length2+=t;else if(t>r[r.length-1][1].length){var o=t-r[r.length-1][1].length;r[r.length-1][1]+=e.substring(0,o),n.length1+=o,n.length2+=o}return e};C.prototype.patch_splitMax=function(s){for(var t=this.Match_MaxBits,e=0;e2*t?(l.length1+=f.length,n+=f.length,a=!1,l.diffs.push(new C.Diff(h,f)),i.diffs.shift()):(f=f.substring(0,t-l.length1-this.Patch_Margin),l.length1+=f.length,n+=f.length,h===W?(l.length2+=f.length,r+=f.length):a=!1,l.diffs.push(new C.Diff(h,f)),f==i.diffs[0][1]?i.diffs.shift():i.diffs[0][1]=i.diffs[0][1].substring(f.length))}o=this.diff_text2(l.diffs),o=o.substring(o.length-this.Patch_Margin);var u=this.diff_text1(i.diffs).substring(0,this.Patch_Margin);u!==""&&(l.length1+=u.length,l.length2+=u.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===W?l.diffs[l.diffs.length-1][1]+=u:l.diffs.push(new C.Diff(W,u))),a||s.splice(++e,0,l)}}};C.prototype.patch_toText=function(s){for(var t=[],e=0;e","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]};var Js={a:"author",t:"time",d:"done",s:"style",c:"color"},ne=class{constructor(t,e,i,n,r,o){this.from=t;this.to=e;this.type=i;this.repr=n;this.text=r;this.metadata=o;N(this,"fields",{});N(this,"replies",[]);if(o!==void 0){let l=o-t,a=r.slice(3,l);this.text=r.slice(0,3)+r.slice(l+2);try{this.fields=JSON.parse(a);for(let h in this.fields)h in Js&&(this.fields[Js[h]]=this.fields[h],delete this.fields[h])}catch(h){this.fields={}}}}get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(t=>t.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(t,e){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(t){return t in Js&&(t=Js[t]),t in this.fields&&(delete this.fields[t],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(t,e){return this.fields[t]=e,this.set_metadata(this.fields)}set_metadata(t){return this.fields=t,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(t)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(t)+"@@"}]}has_comment(t){return this.thread.includes(t)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(t){return this.type===t.type&&this.from===t.from&&this.to===t.to&&this.replies.length===t.replies.length&&this.full_text===t.full_text}left_adjacent(t){return this.from===t.to}right_adjacent(t){return this.to===t.from}part_is_empty(t){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(t=!1){return t?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(t,e){return t-=this.range_front,e-=this.range_front,e<=0||t===e?"":this.text.slice(Math.max(3,t),Math.min(this.text.length-3,e))}partially_in_range(t,e){return!(t>this.to||ethis.full_range_back||ee:this.from<=t&&this.to>=e}part_encloses_range(t,e,i){return this.encloses_range(t,e)}accept(t=!0){return this.text}reject(t=!0){return this.text}touches(t){return this.from===t||this.to===t}cursor_inside(t){return this.from<=t&&t<=this.to}cursor_before_range(t){return tthis.to}cursor_move_inside(t,e=!1){return Math.min(Math.max(e&&this.metadata?this.metadata+2:this.from+3,t),this.to-3)}cursor_pass_syntax(t,e,i=!1){return e?(this.touches_left_bracket(t,!0,!1,i)&&(t=i&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(t,!1,!0)&&(t=this.to)):(this.touches_right_bracket(t,!0,!1)&&(t=this.to-3),this.touches_left_bracket(t,!1,!0,i)&&(t=this.from)),t}cursor_move_through(t,e,i){return i=="unchanged"||!this.cursor_inside(t)||(i=="ignore_completely"?t=e?this.to:this.from:t=this.cursor_pass_syntax(t,e,i=="ignore_metadata")),t}touches_left_bracket(t,e=!1,i=!1,n=!1){return t+(e?0:1)>=this.from&&t+(i?0:1)<=(n&&this.metadata?this.metadata+2:this.from+3)}touches_separator(t,e=!1,i=!1){return!1}touches_right_bracket(t,e=!1,i=!1){return t-(i?0:1)>=this.to-3&&t-(e?0:1)<=this.to}touches_bracket(t,e,i=!1,n=!1){return e?this.touches_left_bracket(t,i,n):this.touches_right_bracket(t,i,n)}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;return!r&&t&&(this.to>=o.length&&!o.endsWith(Ft[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap()),`<${i} class=\'cmtr-${this.repr.toLowerCase()}\'>${o}`}apply_offset(t){this.from+=t,this.to+=t,this.metadata!==void 0&&(this.metadata+=t)}split_range(t){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var Ai=class extends ne{constructor(t,e,i,n){super(t,e,"addition","Addition",i,n)}accept(){return this.unwrap()}reject(){return""}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(Ft[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-addition":e===2&&(o=""),`<${i} class=\'${l}\'>${o}`}};var Yi=class extends ne{constructor(e,i,n,r){super(e,i,"comment","Comment",n,r);N(this,"reply_depth",0);N(this,"attached_comment",null)}get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}accept(e=!0){return e?"":this.unwrap()}reject(e=!0){return e?"":this.unwrap()}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(e){this.attach_to_range(e.type==="comment"?e.base_range:e)}attach_to_range(e){e.replies.push(this),this.reply_depth=e.replies.length-(e.type==="comment"?0:1),this.attached_comment=e}};var Xi=class extends ne{constructor(t,e,i,n){super(t,e,"deletion","Deletion",i,n)}accept(){return""}reject(){return this.unwrap()}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(Ft[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-deletion":e===1&&(o=""),`<${i} class=\'${l}\'>${o}`}};var Ji=class extends ne{constructor(t,e,i,n){super(t,e,"highlight","Highlight",i,n)}};var Qi=class extends ne{constructor(e,i,n,r,o){super(e,n,"substitution","Substitution",r,o);this.middle=i}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(e,i){return i<=this.middle+2?"deletion":e>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(e,i){return e-=this.range_front,i-=this.range_front,e=Math.max(0,e),i<=0?this.unwrap_parts():i<=this.char_middle?[this.text.slice(3,e)+this.text.slice(i,this.char_middle),this.text.slice(this.char_middle+2,-3)]:e>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,e)+this.text.slice(i,-3)]:[this.text.slice(3,e),this.text.slice(i,-3)]}unwrap_parts_bracket(e,i=0){return e?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(e,i){return e-=this.range_front,i-=this.range_front,i<=0||e===i?"":e>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,e),Math.min(this.text.length-3,i)):i<=this.char_middle?this.text.slice(Math.max(3,e),Math.min(this.char_middle,i)):this.text.slice(Math.max(3,e),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,i))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(e,i=!1,n=!1){return e+(i?1:0)>=this.middle&&e-(n?0:1)<=this.middle+2}contains_separator(e,i){return e<=this.middle+2&&i>=this.middle}contains_part(e,i,n=!0){return n?ithis.middle+2?!1:void 0:i<=this.middle?!0:e>=this.middle+2?!1:void 0}cursor_pass_syntax(e,i,n=!1){return i?(this.touches_left_bracket(e,!0,!1,n)&&(e=n&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(e,!1,!0)&&(e=this.middle+2),this.touches_right_bracket(e,!1,!0)&&(e=this.to)):(this.touches_right_bracket(e,!0,!1)&&(e=this.to-3),this.touches_separator(e,!1,!0)&&(e=this.middle),this.touches_left_bracket(e,!1,!0,n)&&(e=this.from)),e}part_encloses_range(e,i,n){return n?this.from<=e&&i<=this.middle+2:this.middle<=e&&i<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(e){return e?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(e=!0,i=0,n="div",r=null,o){let l=o!=null?o:this.text,a=[l];!o&&e&&(this.to>=l.length&&!l.endsWith(Ft.substitution[2])?a=this.unwrap_parts_bracket(!0):this.from<=0&&!l.startsWith(Ft.substitution[0])?a=this.unwrap_parts_bracket(!1):a=this.unwrap_parts());let h="cmtr-preview";return a.length===1&&(a[+r]=a[0],a[+!r]=""),l="",i===0?(a[0].length&&(l+=`<${n} class=\'${h} cmtr-deletion\'>${a[0]}`),a[1].length&&(l+=`<${n} class=\'${h} cmtr-addition\'>${a[1]}`)):i===1?a[1].length&&(l+=`<${n} class=\'${h}\'>${a[1]}`):a[0].length&&(l+=`<${n} class=\'${h}\'>${a[0]}`),l}apply_offset(e){this.from+=e,this.middle+=e,this.to+=e,this.metadata!==void 0&&(this.metadata+=e)}split_range(e){let i=super.split_range(e);return e<=this.middle?i[0]=Ft.substitution[1]+i[0]:i[1]=i[1]+Ft.substitution[1],i}cursor_move_inside(e,i=!1){return e=super.cursor_move_inside(e,i),e==this.middle+1&&(e=this.middle+2),e}};var el=[],vf=[];(()=>{let s="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(t=>t?parseInt(t,36):1);for(let t=0,e=0;t>1;if(s=vf[i])t=i+1;else return!0;if(t==e)return!1}}function bf(s){return s>=127462&&s<=127487}var wf=8205;function kf(s,t,e=!0,i=!0){return(e?xf:gg)(s,t,i)}function xf(s,t,e){if(t==s.length)return t;t&&Sf(s.charCodeAt(t))&&Cf(s.charCodeAt(t-1))&&t--;let i=tl(s,t);for(t+=yf(i);t=0&&bf(tl(s,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function gg(s,t,e){for(;t>0;){let i=xf(s,t-2,e);if(i=56320&&s<57344}function Cf(s){return s>=55296&&s<56320}function yf(s){return s<65536?1:2}var $=class s{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=sn(this,t,e);let n=[];return this.decompose(0,t,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(e,this.length,n,1),tn.from(n,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=sn(this,t,e);let i=[];return this.decompose(t,e,i,0),tn.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new _i(this),r=new _i(t);for(let o=e,l=e;;){if(n.next(o),r.next(o),o=0,n.lineBreak!=r.lineBreak||n.done!=r.done||n.value!=r.value)return!1;if(l+=n.value.length,n.done||l>=i)return!0}}iter(t=1){return new _i(this,t)}iterRange(t,e=this.length){return new ir(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new nr(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?s.empty:t.length<=32?new $t(t):tn.from($t.split(t,[]))}},$t=class s extends ${constructor(t,e=mg(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.text[r],l=n+o.length;if((e?i:l)>=t)return new nl(n,l,i,o);n=l+1,i++}}decompose(t,e,i,n){let r=t<=0&&e>=this.length?this:new s(Mf(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(n&1){let o=i.pop(),l=er(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new s(l,o.length+r.length));else{let a=l.length>>1;i.push(new s(l.slice(0,a)),new s(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof s))return super.replace(t,e,i);[t,e]=sn(this,t,e);let n=er(this.text,er(i.text,Mf(this.text,0,t)),e),r=this.length+i.length-(e-t);return n.length<=32?new s(n,r):tn.from(s.split(n,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=sn(this,t,e);let n="";for(let r=0,o=0;r<=e&&ot&&o&&(n+=i),tr&&(n+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],n=-1;for(let r of t)i.push(r),n+=r.length+1,i.length==32&&(e.push(new s(i,n)),i=[],n=-1);return n>-1&&e.push(new s(i,n)),e}},tn=class s extends ${constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.children[r],l=n+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,n);n=l+1,i=a+1}}decompose(t,e,i,n){for(let r=0,o=0;o<=e&&r=o){let h=n&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=sn(this,t,e),i.lines=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let f=this.children.slice();return f[n]=a,new s(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=sn(this,t,e);let n="";for(let r=0,o=0;rt&&r&&(n+=i),to&&(n+=l.sliceString(t-o,e-o,i)),o=a+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof s))return 0;let i=0,[n,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;n+=e,r+=e){if(n==o||r==l)return i;let a=this.children[n],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new $t(d,e)}let n=Math.max(32,i>>5),r=n<<1,o=n>>1,l=[],a=0,h=-1,f=[];function u(d){let p;if(d.lines>r&&d instanceof s)for(let g of d.children)u(g);else d.lines>o&&(a>o||!a)?(c(),l.push(d)):d instanceof $t&&a&&(p=f[f.length-1])instanceof $t&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new $t(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>n&&c(),a+=d.lines,h+=d.length+1,f.push(d))}function c(){a!=0&&(l.push(f.length==1?f[0]:s.from(f,h)),h=-1,a=f.length=0)}for(let d of t)u(d);return c(),l.length==1?l[0]:new s(l,e)}};$.empty=new $t([""],0);function mg(s){let t=-1;for(let e of s)t+=e.length+1;return t}function er(s,t,e=0,i=1e9){for(let n=0,r=0,o=!0;r=e&&(a>i&&(l=l.slice(0,i-n)),n0?1:(t instanceof $t?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],r=this.offsets[i],o=r>>1,l=n instanceof $t?n.text.length:n.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(n instanceof $t){let a=n.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=n.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof $t?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},ir=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new _i(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},nr=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&($.prototype[Symbol.iterator]=function(){return this.iter()},_i.prototype[Symbol.iterator]=ir.prototype[Symbol.iterator]=nr.prototype[Symbol.iterator]=function(){return this});var nl=class{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}};function sn(s,t,e){return t=Math.max(0,Math.min(s.length,t)),[t,Math.max(t,Math.min(s.length,e))]}function Se(s,t,e=!0,i=!0){return kf(s,t,e,i)}function bg(s){return s>=56320&&s<57344}function wg(s){return s>=55296&&s<56320}function Ef(s,t){let e=s.charCodeAt(t);if(!wg(e)||t+1==s.length)return e;let i=s.charCodeAt(t+1);return bg(i)?(e-55296<<10)+(i-56320)+65536:e}function Df(s){return s<65536?1:2}var sl=/\\r\\n?|\\n/,Vt=function(s){return s[s.Simple=0]="Simple",s[s.TrackDel=1]="TrackDel",s[s.TrackBefore=2]="TrackBefore",s[s.TrackAfter=3]="TrackAfter",s}(Vt||(Vt={})),Ei=class s{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return r+(t-n);r+=l}else{if(i!=Vt.Simple&&h>=t&&(i==Vt.TrackDel&&nt||i==Vt.TrackBefore&&nt))return null;if(h>t||h==t&&e<0&&!l)return t==n||e<0?r:r+a;r+=a}n=h}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return r}touchesRange(t,e=t){for(let i=0,n=0;i=0&&n<=e&&l>=t)return ne?"cover":!0;n=l}return!1}toString(){let t="";for(let e=0;e=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new s(t)}static create(t){return new s(t)}},Kt=class s extends Ei{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return rl(this,(e,i,n,r,o)=>t=t.replace(n,n+(i-e),o),!1),t}mapDesc(t,e=!1){return ol(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let n=0,r=0;n=0){e[n]=l,e[n+1]=o;let a=n>>1;for(;i.length0&&ai(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l>1].toJSON()))}return t}static of(t,e,i){let n=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!n.length)return;oc||u<0||c>e)throw new RangeError(`Invalid change range ${u} to ${c} (in doc of length ${e})`);let p=d?typeof d=="string"?$.of(d.split(i||sl)):d:$.empty,g=p.length;if(u==c&&g==0)return;uo&&Et(n,u-o,-1),Et(n,c-u,g),ai(r,n,p),o=c}}return h(t),a(!l),l}static empty(t){return new s(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let n=0;nl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length=0&&e<=0&&e==s[n+1]?s[n]+=t:n>=0&&t==0&&s[n]==0?s[n+1]+=e:i?(s[n]+=t,s[n+1]+=e):s.push(t,e)}function ai(s,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i>1])),!(e||o==s.sections.length||s.sections[o+1]<0);)l=s.sections[o++],a=s.sections[o++];t(n,h,r,f,u),n=h,r=f}}}function ol(s,t,e,i=!1){let n=[],r=i?[]:null,o=new Di(s),l=new Di(t);for(let a=-1;;){if(o.done&&l.len||l.done&&o.len)throw new Error("Mismatched change set lengths");if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);Et(n,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let u=Math.min(f,l.len);h+=u,f-=u,l.forward(u)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var Di=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return e>=t.length?$.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?$.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},Zi=class s{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new s(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return B.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return B.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return B.range(t.anchor,t.head)}static create(t,e,i){return new s(t,e,i)}},B=class s{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:s.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new s(t.ranges.map(e=>Zi.fromJSON(e)),t.main)}static single(t,e=t){return new s([s.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nt?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((n,r)=>n.from-r.from),e=t.indexOf(i);for(let n=1;nr.head?s.range(a,l):s.range(l,a))}}return new s(t,e)}};function Pf(s,t){for(let e of s.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var ml=0,L=class s{constructor(t,e,i,n,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=ml++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new s(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:bl),!!t.static,t.enables)}of(t){return new en([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new en(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new en(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function bl(s,t){return s==t||s.length==t.length&&s.every((e,i)=>e===t[i])}var en=class{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=ml++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let u of this.dependencies)u=="doc"?a=!0:u=="selection"?h=!0:(((e=t[u.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[u.id]);return{create(u){return u.values[o]=i(u),1},update(u,c){if(a&&c.docChanged||h&&(c.docChanged||c.selection)||ll(u,f)){let d=i(u);if(l?!Af(d,u.values[o],n):!n(d,u.values[o]))return u.values[o]=d,1}return 0},reconfigure:(u,c)=>{let d,p=c.config.address[r];if(p!=null){let g=or(c,p);if(this.dependencies.every(m=>m instanceof L?c.facet(m)===u.facet(m):m instanceof Ct?c.field(m,!1)==u.field(m,!1):!0)||(l?Af(d=i(u),g,n):n(d=i(u),g)))return u.values[o]=g,0}else d=i(u);return u.values[o]=d,1}}}};function Af(s,t,e){if(s.length!=t.length)return!1;for(let i=0;is[a.id]),n=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=s[t.id]>>1;function l(a){let h=[];for(let f=0;fi===n),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(Qs).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,n)=>{let r=i.values[e],o=this.updateF(r,n);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,n)=>{let r=i.facet(Qs),o=n.facet(Qs),l;return(l=r.find(a=>a.field==this))&&l!=o.find(a=>a.field==this)?(i.values[e]=l.create(i),1):n.config.address[this.id]!=null?(i.values[e]=n.field(this),0):(i.values[e]=this.create(i),1)}}}init(t){return[this,Qs.of({field:this,create:t})]}get extension(){return this}},Ti={lowest:4,low:3,default:2,high:1,highest:0};function Vn(s){return t=>new sr(t,s)}var on={highest:Vn(Ti.highest),high:Vn(Ti.high),default:Vn(Ti.default),low:Vn(Ti.low),lowest:Vn(Ti.lowest)},sr=class{constructor(t,e){this.inner=t,this.prec=e}},se=class s{of(t){return new Wn(this,t)}reconfigure(t){return s.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},Wn=class{constructor(t,e){this.compartment=t,this.inner=e}},rr=class s{constructor(t,e,i,n,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let n=[],r=Object.create(null),o=new Map;for(let c of vg(t,e,o))c instanceof Ct?n.push(c):(r[c.facet.id]||(r[c.facet.id]=[])).push(c);let l=Object.create(null),a=[],h=[];for(let c of n)l[c.id]=h.length<<1,h.push(d=>c.slot(d));let f=i==null?void 0:i.config.facets;for(let c in r){let d=r[c],p=d[0].facet,g=f&&f[c]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,bl(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>yg(m,p,d))}}let u=h.map(c=>c(l));return new s(t,o,u,l,a,r)}};function vg(s,t,e){let i=[[],[],[],[],[]],n=new Map;function r(o,l){let a=n.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof Wn&&e.delete(o.compartment)}if(n.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof Wn){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof sr)r(o.inner,o.prec);else if(o instanceof Ct)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof en)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Ti.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(s,Ti.default),i.reduce((o,l)=>o.concat(l))}function zn(s,t){if(t&1)return 2;let e=t>>1,i=s.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;s.status[e]=4;let n=s.computeSlot(s,s.config.dynamicSlots[e]);return s.status[e]=2|n}function or(s,t){return t&1?s.config.staticValues[t>>1]:s.values[t>>1]}var If=L.define(),al=L.define({combine:s=>s.some(t=>t),static:!0}),Nf=L.define({combine:s=>s.length?s[0]:void 0,static:!0}),Bf=L.define(),Lf=L.define(),Hf=L.define(),Ff=L.define({combine:s=>s.length?s[0]:!1}),Mt=class{constructor(t,e){this.type=t,this.value=e}static define(){return new hl}},hl=class{of(t){return new Mt(this,t)}},fl=class{constructor(t){this.map=t}of(t){return new ot(this,t)}},ot=class s{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new s(this.type,e)}is(t){return this.type==t}static define(t={}){return new fl(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let r=n.map(e);r&&i.push(r)}return i}};ot.reconfigure=ot.define();ot.appendConfig=ot.define();var zt=class s{constructor(t,e,i,n,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&Pf(i,e.newLength),r.some(l=>l.type==s.time)||(this.annotations=r.concat(s.time.of(Date.now())))}static create(t,e,i,n,r,o){return new s(t,e,i,n,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(s.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};zt.time=Mt.define();zt.userEvent=Mt.define();zt.addToHistory=Mt.define();zt.remote=Mt.define();function kg(s,t){let e=[];for(let i=0,n=0;;){let r,o;if(i=s[i]))r=s[i++],o=s[i++];else if(n=0;n--){let r=i[n](s);r instanceof zt?s=r:Array.isArray(r)&&r.length==1&&r[0]instanceof zt?s=r[0]:s=zf(t,nn(r),!1)}return s}function Sg(s){let t=s.startState,e=t.facet(Hf),i=s;for(let n=e.length-1;n>=0;n--){let r=e[n](s);r&&Object.keys(r).length&&(i=Vf(i,ul(t,r,s.changes.newLength),!0))}return i==s?s:zt.create(t,s.changes,s.selection,i.effects,i.annotations,i.scrollIntoView)}var Cg=[];function nn(s){return s==null?Cg:Array.isArray(s)?s:[s]}var xe=function(s){return s[s.Word=0]="Word",s[s.Space=1]="Space",s[s.Other=2]="Other",s}(xe||(xe={})),Mg=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,cl;try{cl=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(s){}function Ag(s){if(cl)return cl.test(s);for(let t=0;t"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||Mg.test(e)))return!0}return!1}function Tg(s){return t=>{if(!/\\S/.test(t))return xe.Space;if(Ag(t))return xe.Word;for(let e=0;e-1)return xe.Word;return xe.Other}}var ut=class s{constructor(t,e,i,n,r,o){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ln.set(h,a)),e=null),n.set(l.value.compartment,l.value.extension)):l.is(ot.reconfigure)?(e=null,i=l.value):l.is(ot.appendConfig)&&(e=null,i=nn(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=rr.resolve(i,n,this),r=new s(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(al)?t.newSelection:t.newSelection.asSingle();new s(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:B.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),r=[i.range],o=nn(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return s.create({doc:t.doc,selection:B.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(t={}){let e=rr.resolve(t.extensions||[],new Map),i=t.doc instanceof $?t.doc:$.of((t.doc||"").split(e.staticFacet(s.lineSeparator)||sl)),n=t.selection?t.selection instanceof B?t.selection:B.single(t.selection.anchor,t.selection.head):B.single(0);return Pf(n,i.length),e.staticFacet(al)||(n=n.asSingle()),new s(e,i,n,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(s.tabSize)}get lineBreak(){return this.facet(s.lineSeparator)||`\n`}get readOnly(){return this.facet(Ff)}phrase(t,...e){for(let i of this.facet(s.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,n)=>{if(n=="$")return"$";let r=+(n||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let n=[];for(let r of this.facet(If))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&n.push(o[t]);return n}charCategorizer(t){return Tg(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=Se(e,o,!1);if(r(e.slice(a,o))!=xe.Word)break;o=a}for(;ls.length?s[0]:4});ut.lineSeparator=Nf;ut.readOnly=Ff;ut.phrases=L.define({compare(s,t){let e=Object.keys(s),i=Object.keys(t);return e.length==i.length&&e.every(n=>s[n]==t[n])}});ut.languageData=If;ut.changeFilter=Bf;ut.transactionFilter=Lf;ut.transactionExtender=Hf;se.reconfigure=ot.define();var $e=class{eq(t){return this==t}range(t,e=t){return Gn.create(t,e,this)}};$e.prototype.startSide=$e.prototype.endSide=0;$e.prototype.point=!1;$e.prototype.mapMode=Vt.TrackDel;var Gn=class s{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new s(t,e,i)}};function dl(s,t){return s.from-t.from||s.value.startSide-t.value.startSide}var pl=class s{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let r=i?this.to:this.from;for(let o=n,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,n){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||c==d&&h.startSide>0&&h.endSide<=0)continue;(d-c||h.endSide-h.startSide)<0||(o<0&&(o=c),h.point&&(l=Math.max(l,d-c)),i.push(h),n.push(c-o),r.push(d-o))}return{mapped:i.length?new s(n,r,i,l):null,pos:o}}},Y=class s{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new s(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(dl)),this.isEmpty)return e.length?s.of(e):this;let l=new lr(this,null,-1).goto(0),a=0,h=[],f=new rn;for(;l.value||a=0){let u=e[a++];f.addInner(u.from,u.to,u.value)||h.push(u)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return Un.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Un.from(t).goto(e)}static compare(t,e,i,n,r=-1){let o=t.filter(u=>u.maxPoint>0||!u.isEmpty&&u.maxPoint>=r),l=e.filter(u=>u.maxPoint>0||!u.isEmpty&&u.maxPoint>=r),a=Tf(o,l,i),h=new Oi(o,a,r),f=new Oi(l,a,r);i.iterGaps((u,c,d)=>Of(h,u,f,c,d,n)),i.empty&&i.length==0&&Of(h,0,f,0,0,n)}static eq(t,e,i=0,n){n==null&&(n=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=Tf(r,o),a=new Oi(r,l,0).goto(i),h=new Oi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!gl(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>n)return!0;a.next(),h.next()}}static spans(t,e,i,n,r=-1){let o=new Oi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),u=o.pointFroml&&(n.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new rn;for(let n of t instanceof Gn?[t]:e?Og(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return s.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=s.empty;n=n.nextLayer)e=new s(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}};Y.empty=new Y([],[],null,-1);function Og(s){if(s.length>1)for(let t=s[0],e=1;e0)return s.slice().sort(dl);t=i}return s}Y.empty.nextLayer=Y.empty;var rn=class s{finishChunk(t){this.chunks.push(new pl(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new s)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(Y.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=Y.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function Tf(s,t,e){let i=new Map;for(let r of s)for(let o=0;o=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new lr(o,e,i,r));return n.length==1?n[0]:new s(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)il(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)il(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),il(this.heap,0)}}};function il(s,t){for(let e=s[t];;){let i=(t<<1)+1;if(i>=s.length)break;let n=s[i];if(i+1=0&&(n=s[i+1],i++),e.compare(n)<0)break;s[i]=e,s[t]=n,t=i}}var Oi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Un.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Zs(this.active,t),Zs(this.activeTo,t),Zs(this.activeRank,t),this.minActive=_f(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:r}=this.cursor;for(;e0;)e++;tr(this.active,e,i),tr(this.activeTo,e,n),tr(this.activeRank,e,r),t&&tr(t,e,this.cursor.from),this.minActive=_f(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&Zs(i,n)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function Of(s,t,e,i,n,r){s.goto(t),e.goto(i);let o=i+n,l=i,a=i-t;for(;;){let h=s.to+a-e.to,f=h||s.endSide-e.endSide,u=f<0?s.to+a:e.to,c=Math.min(u,o);if(s.point||e.point?s.point&&e.point&&(s.point==e.point||s.point.eq(e.point))&&gl(s.activeForPoint(s.to),e.activeForPoint(e.to))||r.comparePoint(l,c,s.point,e.point):c>l&&!gl(s.active,e.active)&&r.compareRange(l,c,s.active,e.active),u>o)break;(h||s.openEnd!=e.openEnd)&&r.boundChange&&r.boundChange(u),l=u,f<=0&&s.next(),f>=0&&e.next()}}function gl(s,t){if(s.length!=t.length)return!1;for(let e=0;e=t;i--)s[i+1]=s[i];s[t]=e}function _f(s,t){let e=-1,i=1e9;for(let n=0;n=t)return n;if(n==s.length)break;r+=s.charCodeAt(n)==9?e-r%e:1,n=Se(s,n)}return i===!0?-1:s.length}var _g=class wl{constructor(t,e){this.low=t,this.high=e}clone(){return new wl(this.low,this.high)}get max(){return this.clone()}less_than(t){return this.lowt.high?this.high:t.high)}output(){return[this.low,this.high]}static comparable_max(t,e){return t.merge(e)}static comparable_less_than(t,e){return ta&&([l,a]=[a,l]),this.item.key=new _g(l,a)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===X}_value_less_than(t){return this.item.value&&t.item.value&&this.item.value.less_than?this.item.value.less_than(t.item.value):this.item.valuet++),t}get keys(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.key.output?e.item.key.output():e.item.key)),t}get values(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.value)),t}get items(){let t=[];return this.tree_walk(this.root,e=>t.push({key:e.item.key.output?e.item.key.output():e.item.key,value:e.item.value})),t}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(t,e=t){if(t===void 0)return;let i=new Ke(t,e,this.nil_node,this.nil_node,null,At);return this.tree_insert(i),this.recalc_max(i),i}exist(t,e=t){let i=new Ke(t,e);return!!this.tree_search(this.root,i)}remove(t,e=t){let i=new Ke(t,e),n=this.tree_search(this.root,i);return n&&this.tree_delete(n),n}search(t,e=(i,n)=>i===n?n.output():i){let i=new Ke(t),n=[];return this.tree_search_interval(this.root,i,n),n.map(r=>e(r.item.value,r.item.key))}intersect_any(t){let e=new Ke(t);return this.tree_find_any_interval(this.root,e)}forEach(t){this.tree_walk(this.root,e=>t(e.item.key,e.item.value))}map(t){let e=new s;return this.tree_walk(this.root,i=>e.insert(i.item.key,t(i.item.value,i.item.key))),e}*iterate(t,e=(i,n)=>i===n?n.output():i){let i;for(t?i=this.tree_search_nearest_forward(this.root,new Ke(t)):this.root&&(i=this.local_minimum(this.root));i;)yield e(i.item.value,i.item.key),i=this.tree_successor(i)}recalc_max(t){let e=t;for(;e.parent!=null;)e.parent.update_max(),e=e.parent}tree_insert(t){let e=this.root,i=null;if(this.root==null||this.root===this.nil_node)this.root=t;else{for(;e!==this.nil_node;)i=e,t.less_than(e)?e=e.left:e=e.right;t.parent=i,t.less_than(i)?i.left=t:i.right=t}this.insert_fixup(t)}insert_fixup(t){let e,i;for(e=t;e!==this.root&&e.parent.color===At;)e.parent===e.parent.parent.left?(i=e.parent.parent.right,i.color===At?(e.parent.color=X,i.color=X,e.parent.parent.color=At,e=e.parent.parent):(e===e.parent.right&&(e=e.parent,this.rotate_left(e)),e.parent.color=X,e.parent.parent.color=At,this.rotate_right(e.parent.parent))):(i=e.parent.parent.left,i.color===At?(e.parent.color=X,i.color=X,e.parent.parent.color=At,e=e.parent.parent):(e===e.parent.left&&(e=e.parent,this.rotate_right(e)),e.parent.color=X,e.parent.parent.color=At,this.rotate_left(e.parent.parent)));this.root.color=X}tree_delete(t){let e,i;t.left===this.nil_node||t.right===this.nil_node?e=t:e=this.tree_successor(t),e.left!==this.nil_node?i=e.left:i=e.right,i.parent=e.parent,e===this.root?this.root=i:(e===e.parent.left?e.parent.left=i:e.parent.right=i,e.parent.update_max()),this.recalc_max(i),e!==t&&(t.copy_data(e),t.update_max(),this.recalc_max(t)),e.color===X&&this.delete_fixup(i)}delete_fixup(t){let e=t,i;for(;e!==this.root&&e.parent!=null&&e.color===X;)e===e.parent.left?(i=e.parent.right,i.color===At&&(i.color=X,e.parent.color=At,this.rotate_left(e.parent),i=e.parent.right),i.left.color===X&&i.right.color===X?(i.color=At,e=e.parent):(i.right.color===X&&(i.color=At,i.left.color=X,this.rotate_right(i),i=e.parent.right),i.color=e.parent.color,e.parent.color=X,i.right.color=X,this.rotate_left(e.parent),e=this.root)):(i=e.parent.left,i.color===At&&(i.color=X,e.parent.color=At,this.rotate_right(e.parent),i=e.parent.left),i.left.color===X&&i.right.color===X?(i.color=At,e=e.parent):(i.left.color===X&&(i.color=At,i.right.color=X,this.rotate_left(i),i=e.parent.left),i.color=e.parent.color,e.parent.color=X,i.left.color=X,this.rotate_right(e.parent),e=this.root));e.color=X}tree_search(t,e){if(!(t==null||t===this.nil_node))return e.equal_to(t)?t:e.less_than(t)?this.tree_search(t.left,e):this.tree_search(t.right,e)}tree_search_nearest_forward(t,e){let i,n=t;for(;n&&n!==this.nil_node;)n.less_than(e)?n.intersect(e)?(i=n,n=n.left):n=n.right:((!i||n.less_than(i))&&(i=n),n=n.left);return i||null}tree_search_interval(t,e,i){t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&this.tree_search_interval(t.left,e,i),t.intersect(e)&&i.push(t),t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&this.tree_search_interval(t.right,e,i))}tree_find_any_interval(t,e){let i=!1;return t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&(i=this.tree_find_any_interval(t.left,e)),i||(i=t.intersect(e)),!i&&t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&(i=this.tree_find_any_interval(t.right,e))),i}local_minimum(t){let e=t;for(;e.left!=null&&e.left!==this.nil_node;)e=e.left;return e}local_maximum(t){let e=t;for(;e.right!=null&&e.right!==this.nil_node;)e=e.right;return e}tree_successor(t){let e,i,n;if(t.right!==this.nil_node)e=this.local_minimum(t.right);else{for(i=t,n=t.parent;n!=null&&n.right===i;)i=n,n=n.parent;e=n}return e}rotate_left(t){let e=t.right;t.right=e.left,e.left!==this.nil_node&&(e.left.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e,t!=null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}rotate_right(t){let e=t.left;t.left=e.right,e.right!==this.nil_node&&(e.right.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.right=t,t.parent=e,t!==null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}tree_walk(t,e){t!=null&&t!==this.nil_node&&(this.tree_walk(t.left,e),e(t),this.tree_walk(t.right,e))}testRedBlackProperty(){let t=!0;return this.tree_walk(this.root,function(e){e.color===At&&(e.left.color===X&&e.right.color===X||(t=!1))}),t}testBlackHeightProperty(t){let e=0,i=0,n=0;if(t.color===X&&e++,t.left!==this.nil_node?i=this.testBlackHeightProperty(t.left):i=1,t.right!==this.nil_node?n=this.testBlackHeightProperty(t.right):n=1,i!==n)throw new Error("Red-black height property violated");return e+=i,e}};var hr=class{constructor(t){N(this,"ranges");N(this,"tree");this.ranges=t,this.tree=new ar;for(let e of t)this.tree.insert([e.from,e.to],e)}empty(){return this.ranges.length===0}get(t){return t<0?this.ranges[this.ranges.length+t]:this.ranges[t]}at_cursor(t,e=!1){let i=this.tree.search([t,t]);return i.length?e&&i.length>1?i[1]:i[0]:void 0}contains_range(t,e){return this.tree.intersect_any([t,e])}range_adjacent_to_cursor(t,e,i=!1,n=!1){let r=e?this.ranges.slice().reverse():this.ranges;return n?r.find(o=>e?(i?o.from:o.to)e?(i?o.from:o.to)<=t:t<=(i?o.to:o.from))}adjacent_range(t,e,i=!1){let n=this.ranges.findIndex(o=>o===t);if(n===-1)return;let r=e?this.ranges[n-1]:this.ranges[n+1];if(r)if(i){if(e?r.to===t.from:t.to===r.from)return r}else return r}ranges_in_interval(t,e){return this.tree.search([t,e])}ranges_in_intervals(t){let e=new Set;for(let i of t)for(let n of this.tree.search([i.from,i.to]))if(e.add(n),n.base_range){e.add(n.base_range);for(let r of n.base_range.replies)e.add(r)}return Array.from(e).sort((i,n)=>i.from-n.from)}unwrap_in_range(t,e=0,i=t.length,n=null){let r,o;if(n||(n=this.ranges_in_interval(e,i)),n.length===0)return{output:t.sliceString(e,i),from:e,to:i};let l="";e=n.at(-1).to?l+=t.sliceString(n.at(-1).to,i):o=n.at(-1);let h=r?r.cursor_pass_syntax(e,!1):e,f=o?o.cursor_pass_syntax(i,!0):i;return(h!==e||e===(r==null?void 0:r.from))&&(r=void 0),(f!==i||i===(o==null?void 0:o.to))&&(o=void 0),{output:l,from:h,to:f,front_range:r,back_range:o}}};var yl="\\u037C",Gf=typeof Symbol=="undefined"?"__"+yl:Symbol.for(yl),vl=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Uf=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},re=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],u=/^@(\\w+)\\b/.exec(o[0]),c=u&&u[1]=="keyframes";if(u&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!u)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(n(d),p,f,c)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||c)&&a.push((i&&!u&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(n(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=Uf[Gf]||1;return Uf[Gf]=t+1,yl+t.toString(36)}static mount(t,e,i){let n=t[vl],r=i&&i.nonce;n?r&&n.setNonce(r):n=new kl(t,r),n.mount(Array.isArray(e)?e:[e],t)}},qf=new Map,kl=class{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let r=qf.get(i);if(r)return t[vl]=r;this.sheet=new n.CSSStyleSheet,qf.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],t[vl]=this}mount(t,e){let i=this.sheet,n=0,r=0;for(let o=0;o-1&&(this.modules.splice(a,1),r--,a=-1),a==-1){if(this.modules.splice(r++,0,l),i)for(let h=0;h",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},Eg=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),Dg=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(pt=0;pt<10;pt++)Ye[48+pt]=Ye[96+pt]=String(pt);var pt;for(pt=1;pt<=24;pt++)Ye[pt+111]="F"+pt;var pt;for(pt=65;pt<=90;pt++)Ye[pt]=String.fromCharCode(pt+32),ln[pt]=String.fromCharCode(pt);var pt;for(fr in Ye)ln.hasOwnProperty(fr)||(ln[fr]=Ye[fr]);var fr;function jf(s){var t=Eg&&s.metaKey&&s.shiftKey&&!s.ctrlKey&&!s.altKey||Dg&&s.shiftKey&&s.key&&s.key.length==1||s.key=="Unidentified",e=!t&&s.key||(s.shiftKey?ln:Ye)[s.keyCode]||s.key||"Unidentified";return e=="Esc"&&(e="Escape"),e=="Del"&&(e="Delete"),e=="Left"&&(e="ArrowLeft"),e=="Up"&&(e="ArrowUp"),e=="Right"&&(e="ArrowRight"),e=="Down"&&(e="ArrowDown"),e}function ts(s){let t;return s.nodeType==11?t=s.getSelection?s:s.ownerDocument:t=s,t.getSelection()}function Al(s,t){return t?s==t||s.contains(t.nodeType!=1?t.parentNode:t):!1}function yr(s,t){if(!t.anchorNode)return!1;try{return Al(s,t.anchorNode)}catch(e){return!1}}function un(s){return s.nodeType==3?Ii(s,0,s.nodeValue.length).getClientRects():s.nodeType==1?s.getClientRects():[]}function Yn(s,t,e,i){return e?$f(s,t,e,i,-1)||$f(s,t,e,i,1):!1}function Pi(s){for(var t=0;;t++)if(s=s.previousSibling,!s)return t}function Sr(s){return s.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\\d|SECTION|PRE)$/.test(s.nodeName)}function $f(s,t,e,i,n){for(;;){if(s==e&&t==i)return!0;if(t==(n<0?0:Oe(s))){if(s.nodeName=="DIV")return!1;let r=s.parentNode;if(!r||r.nodeType!=1)return!1;t=Pi(s)+(n<0?0:1),s=r}else if(s.nodeType==1){if(s=s.childNodes[t+(n<0?-1:0)],s.nodeType==1&&s.contentEditable=="false")return!1;t=n<0?Oe(s):0}else return!1}}function Oe(s){return s.nodeType==3?s.nodeValue.length:s.childNodes.length}function os(s,t){let e=t?s.left:s.right;return{left:e,right:e,top:s.top,bottom:s.bottom}}function Ig(s){let t=s.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:s.innerWidth,top:0,bottom:s.innerHeight}}function Cu(s,t){let e=t.width/s.offsetWidth,i=t.height/s.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-s.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-s.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function Ng(s,t,e,i,n,r,o,l){let a=s.ownerDocument,h=a.defaultView||window;for(let f=s,u=!1;f&&!u;)if(f.nodeType==1){let c,d=f==a.body,p=1,g=1;if(d)c=Ig(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(u=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let w=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Cu(f,w)),c={left:w.left,right:w.left+f.clientWidth*p,top:w.top,bottom:w.top+f.clientHeight*g}}let m=0,b=0;if(n=="nearest")t.top0&&t.bottom>c.bottom+b&&(b=t.bottom-c.bottom+o)):t.bottom>c.bottom&&(b=t.bottom-c.bottom+o,e<0&&t.top-b0&&t.right>c.right+m&&(m=t.right-c.right+r)):t.right>c.right&&(m=t.right-c.right+r,e<0&&t.leftc.bottom||t.leftc.right)&&(t={left:Math.max(t.left,c.left),right:Math.min(t.right,c.right),top:Math.max(t.top,c.top),bottom:Math.min(t.bottom,c.bottom)}),f=f.assignedSlot||f.parentNode}else if(f.nodeType==11)f=f.host;else break}function Bg(s){let t=s.ownerDocument,e,i;for(let n=s.parentNode;n&&!(n==t.body||e&&i);)if(n.nodeType==1)!i&&n.scrollHeight>n.clientHeight&&(i=n),!e&&n.scrollWidth>n.clientWidth&&(e=n),n=n.assignedSlot||n.parentNode;else if(n.nodeType==11)n=n.host;else break;return{x:e,y:i}}var Tl=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?Oe(e):0),i,Math.min(t.focusOffset,i?Oe(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}},an=null;function Mu(s){if(s.setActive)return s.setActive();if(an)return s.focus(an);let t=[];for(let e=s;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(s.focus(an==null?{get preventScroll(){return an={preventScroll:!0},!0}}:void 0),!an){an=!1;for(let e=0;eMath.max(1,s.scrollHeight-s.clientHeight-4)}function Ou(s,t){for(let e=s,i=t;;){if(e.nodeType==3&&i>0)return{node:e,offset:i};if(e.nodeType==1&&i>0){if(e.contentEditable=="false")return null;e=e.childNodes[i-1],i=Oe(e)}else if(e.parentNode&&!Sr(e))i=Pi(e),e=e.parentNode;else return null}}function _u(s,t){for(let e=s,i=t;;){if(e.nodeType==3&&ie)return u.domBoundsAround(t,e,h);if(c>=t&&n==-1&&(n=a,r=h),h>e&&u.dom.parentNode==this.dom){o=a,l=f;break}f=c,h=c+u.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=na){this.markDirty();for(let n=t;nthis.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Eu(s,t,e,i,n,r,o,l,a){let{children:h}=s,f=h.length?h[t]:null,u=r.length?r[r.length-1]:null,c=u?u.breakAfter:o;if(!(t==i&&f&&!o&&!c&&r.length<2&&f.merge(e,n,r.length?u:null,e==0,l,a))){if(i0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e2),D={mac:Qf||/Mac/.test(Wt.platform),windows:/Win/.test(Wt.platform),linux:/Linux|X11/.test(Wt.platform),ie:Ir,ie_version:Ru?Ol.documentMode||6:El?+El[1]:_l?+_l[1]:0,gecko:Xf,gecko_version:Xf?+(/Firefox\\/(\\d+)/.exec(Wt.userAgent)||[0,0])[1]:0,chrome:!!xl,chrome_version:xl?+xl[1]:0,ios:Qf,android:/Android\\b/.test(Wt.userAgent),webkit:Jf,safari:Pu,webkit_version:Jf?+(/\\bAppleWebKit\\/(\\d+)/.exec(Wt.userAgent)||[0,0])[1]:0,tabSize:Ol.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},Fg=256,_e=class s extends nt{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof s)||this.length-(e-t)+i.length>Fg||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new s(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Lt(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return Vg(this.dom,t,e)}},ui=class s extends nt{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let n of e)n.setParent(this)}setAttrs(t){if(Au(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,r,o){return i&&(!(i instanceof s&&i.mark.eq(this.mark))||t&&r<=0||et&&e.push(i=t&&(n=r),i=a,r++}let o=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new s(this.mark,e,o)}domAtPos(t){return Iu(this,t)}coordsAt(t,e){return Bu(this,t,e)}};function Vg(s,t,e){let i=s.nodeValue.length;t>i&&(t=i);let n=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?D.chrome||D.gecko||(t?(n--,o=1):r=0)?0:l.length-1];return D.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?os(a,o<0):a||null}var Mr=class s extends nt{static create(t,e,i){return new s(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=s.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0)?Lt.before(this.dom):Lt.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),r=null;if(!n.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?n.length-1:0;r=n[l],!(t>0?l==0:l==n.length-1||r.top0?Lt.before(this.dom):Lt.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return $.empty}get isHidden(){return!0}};_e.prototype.children=Mr.prototype.children=es.prototype.children=na;function Iu(s,t){let e=s.dom,{children:i}=s,n=0;for(let r=0;nr&&t0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=n;r0&&t instanceof ui&&n.length&&(i=n[n.length-1])instanceof ui&&i.mark.eq(t.mark)?Nu(i,t.children[0],e-1):(n.push(t),t.setParent(s)),s.length+=t.length}function Bu(s,t,e){let i=null,n=-1,r=null,o=-1;function l(h,f){for(let u=0,c=0;u=f&&(d.children.length?l(d,f-c):(!r||r.isHidden&&(e>0||Wg(r,d)))&&(p>f||c==p&&d.getSide()>0)?(r=d,o=f-c):(c-1?1:0)!=n.length-(e&&n.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(n.indexOf(r)==-1||s[r]!==t[r]))return!1;return!0}function Rl(s,t,e){let i=!1;if(t)for(let n in t)e&&n in e||(i=!0,n=="style"?s.style.cssText="":s.removeAttribute(n));if(e)for(let n in e)t&&t[n]==e[n]||(i=!0,n=="style"?s.style.cssText=e[n]:s.setAttribute(n,e[n]));return i}function Gg(s){let t=Object.create(null);for(let e=0;e0?3e8:-4e8:e>0?1e8:-1e8,new ci(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,n;if(t.isBlockGap)i=-5e8,n=4e8;else{let{start:r,end:o}=Lu(t,e);i=(r?e?-3e8:-1:5e8)-1,n=(o?e?2e8:1:-6e8)+1}return new ci(t,i,n,e,t.widget||null,!0)}static line(t){return new ns(t)}static set(t,e=!1){return Y.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};J.none=Y.empty;var is=class s extends J{constructor(t){let{start:e,end:i}=Lu(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof s&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&Ar(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};is.prototype.point=!1;var ns=class s extends J{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof s&&this.spec.class==t.spec.class&&Ar(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};ns.prototype.mapMode=Vt.TrackBefore;ns.prototype.point=!0;var ci=class s extends J{constructor(t,e,i,n,r,o){super(e,i,r,t),this.block=n,this.isReplace=o,this.mapMode=n?e<=0?Vt.TrackBefore:Vt.TrackAfter:Vt.TrackDel}get type(){return this.startSide!=this.endSide?Yt.WidgetRange:this.startSide<=0?Yt.WidgetBefore:Yt.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof s&&Ug(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};ci.prototype.point=!0;function Lu(s,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=s;return e==null&&(e=s.inclusive),i==null&&(i=s.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function Ug(s,t){return s==t||!!(s&&t&&s.compare(t))}function vr(s,t,e,i=0){let n=e.length-1;n>=0&&e[n]+i>=s?e[n]=Math.max(e[n],t):e.push(s,t)}var Tt=class s extends nt{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,n,r,o){if(i){if(!(i instanceof s))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),Du(this,t,e,i?i.children.slice():[],r,o),!0}split(t){let e=new s;if(e.breakAfter=this.breakAfter,this.length==0)return e;let{i,off:n}=this.childPos(t);n&&(e.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let r=i;r0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Ar(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Nu(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Dl(e,this.attrs||{})),i&&(this.attrs=Dl({class:i},this.attrs||{}))}domAtPos(t){return Iu(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Au(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(Rl(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&nt.get(n)instanceof ui;)n=n.lastChild;if(!n||!this.length||n.nodeName!="BR"&&((i=nt.get(n))===null||i===void 0?void 0:i.isEditable)==!1&&(!D.ios||!this.children.some(r=>r instanceof _e))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof _e)||/[^ -~]/.test(i.text))return null;let n=un(i.dom);if(n.length!=1)return null;t+=n[0].width,e=n[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=Bu(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:n}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-n.lineHeight)<2&&n.textHeight=e){if(r instanceof s)return r;if(o>e)break}n=o+r.breakAfter}return null}},Ri=class s extends nt{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0}},ss=class extends Ni{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},Xn=class s{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof Ri&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Tt),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(ur(new es(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof Ri)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(ur(new _e(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof ci){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof ci)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new Ri(i.widget||di.block,l,i));else{let a=Mr.create(i.widget||di.inline,l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=n.length&&(t0),f=!a.isEditable&&(tn.length||i.startSide<=0),u=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(n),h&&(u.append(ur(new es(1),n),r),r=n.length+Math.max(0,r-n.length)),u.append(ur(a,n),r),this.atCursorPos=f,this.pendingBuffer=f?tn.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,n,r){let o=new s(t,e,i,r);return o.openEnd=Y.spans(n,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function ur(s,t){for(let e of t)s=new ui(e,[s],s.length);return s}var di=class extends Ni{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}};di.inline=new di("span");di.block=new di("div");var gt=function(s){return s[s.LTR=0]="LTR",s[s.RTL=1]="RTL",s}(gt||(gt={})),Bi=gt.LTR,sa=gt.RTL;function Hu(s){let t=[];for(let e=0;e=e){if(l.level==i)return o;(r<0||(n!=0?n<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function Vu(s,t){if(s.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(Ce[g+1]==-d){let m=Ce[g+2],b=m&2?n:m&4?m&1?r:n:0;b&&(Z[u]=Z[Ce[g]]=b),l=g;break}}else{if(Ce.length==189)break;Ce[l++]=u,Ce[l++]=c,Ce[l++]=a}else if((p=Z[u])==2||p==1){let g=p==n;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=Ce[m+2];if(b&2)break;if(g)Ce[m+2]|=2;else{if(b&4)break;Ce[m+2]|=4}}}}}function Xg(s,t,e,i){for(let n=0,r=i;n<=e.length;n++){let o=n?e[n-1].to:s,l=na;)p==m&&(p=e[--g].from,m=g?e[g-1].to:s),Z[--p]=d;a=f}else r=h,a++}}}function Il(s,t,e,i,n,r,o){let l=i%2?2:1;if(i%2==n%2)for(let a=t,h=0;aa&&o.push(new Ae(a,g.from,d));let m=g.direction==Bi!=!(d%2);Nl(s,m?i+1:i,n,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?Z[p]!=l:Z[p]==l))break;p++}c?Il(s,a,p,i+1,n,c,o):at;){let f=!0,u=!1;if(!h||a>r[h-1].to){let g=Z[a-1];g!=l&&(f=!1,u=g==16)}let c=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(u)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(Z[m-1]==l)break t;break}}if(c)c.push(g);else{g.toZ.length;)Z[Z.length]=256;let i=[],n=t==Bi?0:1;return Nl(s,n,n,e,0,s.length,i),i}function zu(s){return[new Ae(0,s,0)]}var Wu="";function Qg(s,t,e,i,n){var r;let o=i.head-s.from,l=Ae.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(n,e);if(o==h){let c=l+=n?1:-1;if(c<0||c>=t.length)return null;a=t[l=c],o=a.side(!n,e),h=a.side(n,e)}let f=Se(s.text,o,a.forward(n,e));(fa.to)&&(f=h),Wu=s.text.slice(Math.min(o,f),Math.max(o,f));let u=l==(n?t.length-1:0)?null:t[l+(n?1:-1)];return u&&f==h&&u.level+(n?0:1)s.some(t=>t)}),tm=L.define({combine:s=>s.some(t=>t)}),Xu=L.define(),Jn=class s{constructor(t,e="nearest",i="nearest",n=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new s(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new s(B.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},cr=ot.define({map:(s,t)=>s.map(t)}),Ju=ot.define();function ge(s,t,e){let i=s.facet(ju);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var Xe=L.define({combine:s=>s.length?s[0]:!0}),em=0,qn=L.define(),Je=class s{constructor(t,e,i,n,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:n,provide:r,decorations:o}=e||{};return new s(em++,t,i,n,l=>{let a=[qn.of(l)];return o&&a.push(rs.of(h=>{let f=h.plugin(l);return f?o(f):J.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return s.define(i=>new t(i),e)}},Qn=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(ge(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){ge(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){ge(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},Qu=L.define(),la=L.define(),rs=L.define(),Zu=L.define(),aa=L.define(),tc=L.define();function tu(s,t){let e=s.state.facet(tc);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(s):r),n=[];return Y.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,u=n;for(let c=l.length-1;c>=0;c--,a--){let d=l[c].spec.bidiIsolate,p;if(d==null&&(d=Zg(t.text,h,f)),a>0&&u.length&&(p=u[u.length-1]).to==h&&p.direction==d)p.to=f,u=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};u.push(g),u=g.inner}}}}),n}var ec=L.define();function ic(s){let t=0,e=0,i=0,n=0;for(let r of s.state.facet(ec)){let o=r(s);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(n=Math.max(n,o.bottom)))}return{left:t,right:e,top:i,bottom:n}}var jn=L.define(),Te=class s{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new s(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toAf)break;r+=2}if(!a)return i;new s(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},Tr=class s{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Kt.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let n=[];this.changes.iterChangedRanges((r,o,l,a)=>n.push(new Te(r,o,l,a))),this.changedRanges=n}static create(t,e,i){return new s(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},Or=class extends nt{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=J.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new Tt],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new Te(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(t);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?n=this.domChanged.newSel.head:!am(t.changes,this.hasComposition)&&!t.selectionSet&&(n=t.state.selection.main.head));let r=n>-1?nm(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new Te(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(D.ie||D.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=om(o,l,t.changes);return i=Te.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=D.chrome||D.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||n.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?n[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:u}=l,c,d,p,g;if(i&&i.range.fromBf){let v=Xn.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),x=Xn.build(this.view.state.doc,i.range.toB,u,this.decorations,this.dynamicDecorationMap);d=v.breakAtStart,p=v.openStart,g=x.openEnd;let S=this.compositionView(i);x.breakAtStart?S.breakAfter=1:x.content.length&&S.merge(S.length,S.length,x.content[0],!1,x.openStart,0)&&(S.breakAfter=x.content[0].breakAfter,x.content.shift()),v.content.length&&S.merge(0,0,v.content[v.content.length-1],!0,0,v.openEnd)&&v.content.pop(),c=v.content.concat(S).concat(x.content)}else({content:c,breakAtStart:d,openStart:p,openEnd:g}=Xn.build(this.view.state.doc,f,u,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:w,off:y}=r.findPos(a,-1);Eu(this,w,y,m,b,c,d,p,g)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(t){this.editContextFormatting=this.editContextFormatting.map(t.changes);for(let e of t.transactions)for(let i of e.effects)i.is(Ju)&&(this.editContextFormatting=i.value)}compositionView(t){let e=new _e(t.text.nodeValue);e.flags|=8;for(let{deco:n}of t.marks)e=new ui(n,[e],e.length);let i=new Tt;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=nt.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let r=t.marks.length-1;r>=-1;r--)i=n.childPos(i.off,1),n=n.children[i.i],e(r>=0?t.marks[r].node:t.text,n)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,r=!n&&!(this.view.state.facet(Xe)||this.dom.tabIndex>-1)&&yr(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(D.gecko&&l.empty&&!this.hasComposition&&im(a)){let u=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(u,a.node.childNodes[a.offset]||null)),a=h=new Lt(u,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!Yn(a.node,a.offset,f.anchorNode,f.anchorOffset)||!Yn(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{D.android&&D.chrome&&this.dom.contains(f.focusNode)&&lm(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let u=ts(this.view.root);if(u)if(l.empty){if(D.gecko){let c=sm(a.node,a.offset);if(c&&c!=3){let d=(c==1?Ou:_u)(a.node,a.offset);d&&(a=new Lt(d.node,d.offset))}}u.collapse(a.node,a.offset),l.bidiLevel!=null&&u.caretBidiLevel!==void 0&&(u.caretBidiLevel=l.bidiLevel)}else if(u.extend){u.collapse(a.node,a.offset);try{u.extend(h.node,h.offset)}catch(c){}}else{let c=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),c.setEnd(h.node,h.offset),c.setStart(a.node,a.offset),u.removeAllRanges(),u.addRange(c)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Lt(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Lt(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&Yn(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=ts(t.root),{anchorNode:n,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=Tt.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let u=t.observer.selectionRange;t.docView.posFromDOM(u.anchorNode,u.anchorOffset)!=e.from&&i.collapse(n,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let n=t.offset;!i&&n=0;n--){let r=nt.get(e.childNodes[n]);r instanceof Tt&&(i=r.domAtPos(r.length))}return i?new Lt(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=nt.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(at||l.covers(1))&&(!i||l instanceof Tt&&!(i instanceof Tt&&e>=0)))i=l,n=h;else if(i&&h==t&&a==t&&l instanceof Ri&&Math.abs(e)<2){if(l.deco.startSide<0)break;o&&(i=null)}r=h}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof Tt))return null;for(;n.children.length;){let{i:l,off:a}=n.childPos(i,1);for(;;l++){if(l==n.children.length)return null;if((n=n.children[l]).length)break}i=a}if(!(n instanceof _e))return null;let r=Se(n.text,i);if(r==i)return null;let o=Ii(n.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==gt.LTR;for(let h=0,f=0;fn)break;if(h>=i){let d=u.dom.getBoundingClientRect();if(e.push(d.height),o){let p=u.dom.lastChild,g=p?un(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=c)}}}h=c+u.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?gt.RTL:gt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof Tt){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,n;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=un(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,n=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:n}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Cr(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let r=n==e.viewports.length?null:e.viewports[n],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(J.replace({widget:new ss(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return J.set(t)}updateDeco(){let t=1,e=this.view.state.facet(rs).map(r=>(this.dynamicDecorationMap[t++]=typeof r=="function")?r(this.view):r),i=!1,n=this.view.state.facet(Zu).map((r,o)=>{let l=typeof r=="function";return l&&(i=!0),l?r(this.view):r});for(n.length&&(this.dynamicDecorationMap[t++]=i,e.push(Y.join(n))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];te.anchor?-1:1),n;if(!i)return;!e.empty&&(n=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,n.left),top:Math.min(i.top,n.top),right:Math.max(i.right,n.right),bottom:Math.max(i.bottom,n.bottom)});let r=ic(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;Ng(this.view.scrollDOM,o,e.head{it.from&&(e=!0)}),e}function hm(s,t,e=1){let i=s.charCategorizer(t),n=s.doc.lineAt(t),r=t-n.from;if(n.length==0)return B.cursor(t);r==0?e=1:r==n.length&&(e=-1);let o=r,l=r;e<0?o=Se(n.text,r,!1):l=Se(n.text,r);let a=i(n.text.slice(o,l));for(;o>0;){let h=Se(n.text,o,!1);if(i(n.text.slice(h,o))!=a)break;o=h}for(;ls?t.left-s:Math.max(0,s-t.right)}function um(s,t){return t.top>s?t.top-s:Math.max(0,s-t.bottom)}function Sl(s,t){return s.topt.top+1}function eu(s,t){return ts.bottom?{top:s.top,left:s.left,right:s.right,bottom:t}:s}function Ll(s,t,e){let i,n,r,o,l=!1,a,h,f,u;for(let p=s.firstChild;p;p=p.nextSibling){let g=un(p);for(let m=0;my||o==y&&r>w){i=p,n=b,r=w,o=y;let v=y?e0?m0)}w==0?e>b.bottom&&(!f||f.bottomb.top)&&(h=p,u=b):f&&Sl(f,b)?f=iu(f,b.bottom):u&&Sl(u,b)&&(u=eu(u,b.top))}}if(f&&f.bottom>=e?(i=a,n=f):u&&u.top<=e&&(i=h,n=u),!i)return{node:s,offset:0};let c=Math.max(n.left,Math.min(n.right,t));if(i.nodeType==3)return nu(i,c,e);if(l&&i.contentEditable!="false")return Ll(i,c,e);let d=Array.prototype.indexOf.call(s.childNodes,i)+(t>=(n.left+n.right)/2?1:0);return{node:s,offset:d}}function nu(s,t,e){let i=s.nodeValue.length,n=-1,r=1e9,o=0;for(let l=0;le?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&u=(f.left+f.right)/2,d=c;if((D.chrome||D.gecko)&&Ii(s,l).getBoundingClientRect().left==f.right&&(d=!c),u<=0)return{node:s,offset:l+(d?1:0)};n=l+(d?1:0),r=u}}}return{node:s,offset:n>-1?n:o>0?s.nodeValue.length:0}}function sc(s,t,e,i=-1){var n,r;let o=s.contentDOM.getBoundingClientRect(),l=o.top+s.viewState.paddingTop,a,{docHeight:h}=s.viewState,{x:f,y:u}=t,c=u-l;if(c<0)return 0;if(c>h)return s.state.doc.length;for(let v=s.viewState.heightOracle.textHeight/2,x=!1;a=s.elementAtHeight(c),a.type!=Yt.Text;)for(;c=i>0?a.bottom+v:a.top-v,!(c>=0&&c<=h);){if(x)return e?null:0;x=!0,i=-i}u=l+c;let d=a.from;if(ds.viewport.to)return s.viewport.to==s.state.doc.length?s.state.doc.length:e?null:su(s,o,a,f,u);let p=s.dom.ownerDocument,g=s.root.elementFromPoint?s.root:p,m=g.elementFromPoint(f,u);m&&!s.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,u),m&&!s.contentDOM.contains(m)&&(m=null));let b,w=-1;if(m&&((n=s.docView.nearest(m))===null||n===void 0?void 0:n.isEditable)!=!1){if(p.caretPositionFromPoint){let v=p.caretPositionFromPoint(f,u);v&&({offsetNode:b,offset:w}=v)}else if(p.caretRangeFromPoint){let v=p.caretRangeFromPoint(f,u);v&&({startContainer:b,startOffset:w}=v,(!s.contentDOM.contains(b)||D.safari&&cm(b,w,f)||D.chrome&&dm(b,w,f))&&(b=void 0))}b&&(w=Math.min(Oe(b),w))}if(!b||!s.docView.dom.contains(b)){let v=Tt.find(s.docView,d);if(!v)return c>a.top+a.height/2?a.to:a.from;({node:b,offset:w}=Ll(v.dom,f,u))}let y=s.docView.nearest(b);if(!y)return null;if(y.isWidget&&((r=y.dom)===null||r===void 0?void 0:r.nodeType)==1){let v=y.dom.getBoundingClientRect();return t.ys.defaultLineHeight*1.5){let l=s.viewState.heightOracle.textHeight,a=Math.floor((n-e.top-(s.defaultLineHeight-l)*.5)/l);r+=a*s.viewState.heightOracle.lineLength}let o=s.state.sliceDoc(e.from,e.to);return e.from+Wf(o,r,s.state.tabSize)}function cm(s,t,e){let i;if(s.nodeType!=3||t!=(i=s.nodeValue.length))return!1;for(let n=s.nextSibling;n;n=n.nextSibling)if(n.nodeType!=1||n.nodeName!="BR")return!1;return Ii(s,i-1,i).getBoundingClientRect().left>e}function dm(s,t,e){if(t!=0)return!1;for(let n=s;;){let r=n.parentNode;if(!r||r.nodeType!=1||r.firstChild!=n)return!1;if(r.classList.contains("cm-line"))break;n=r}let i=s.nodeType==1?s.getBoundingClientRect():Ii(s,0,Math.max(s.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function pm(s,t,e){let i=s.lineBlockAt(t);if(Array.isArray(i.type)){let n;for(let r of i.type){if(r.from>t)break;if(!(r.tot)return r;(!n||r.type==Yt.Text&&(n.type!=r.type||(e<0?r.fromt)))&&(n=r)}}return n||i}return i}function gm(s,t,e,i){let n=pm(s,t.head,t.assoc||-1),r=!i||n.type!=Yt.Text||!(s.lineWrapping||n.widgetLineBreaks)?null:s.coordsAtPos(t.assoc<0&&t.head>n.from?t.head-1:t.head);if(r){let o=s.dom.getBoundingClientRect(),l=s.textDirectionAt(n.from),a=s.posAtCoords({x:e==(l==gt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return B.cursor(a,e?-1:1)}return B.cursor(e?n.to:n.from,e?-1:1)}function ru(s,t,e,i){let n=s.state.doc.lineAt(t.head),r=s.bidiSpans(n),o=s.textDirectionAt(n.from);for(let l=t,a=null;;){let h=Qg(n,r,o,l,e),f=Wu;if(!h){if(n.number==(e?s.state.doc.lines:1))return l;f=`\n`,n=s.state.doc.line(n.number+(e?1:-1)),r=s.bidiSpans(n),h=s.visualLineSide(n,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function mm(s,t,e){let i=s.state.charCategorizer(t),n=i(e);return r=>{let o=i(r);return n==xe.Space&&(n=o),n==o}}function bm(s,t,e,i){let n=t.head,r=e?1:-1;if(n==(e?s.state.doc.length:0))return B.cursor(n,t.assoc);let o=t.goalColumn,l,a=s.contentDOM.getBoundingClientRect(),h=s.coordsAtPos(n,t.assoc||-1),f=s.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=s.viewState.lineBlockAt(n);o==null&&(o=Math.min(a.right-a.left,s.defaultCharacterWidth*(n-d.from))),l=(r<0?d.top:d.bottom)+f}let u=a.left+o,c=i!=null?i:s.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(c+d)*r,g=sc(s,{x:u,y:p},!1,r);if(pa.bottom||(r<0?gn)){let m=s.docView.coordsForChar(g),b=!m||p{if(t>r&&tn(s)),e.from,t.head>e.from?-1:1);return i==e.from?e:B.cursor(i,ir)&&this.lineBreak(),n=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=n.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=nt.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(wm(t,i.node,i.offset)?e:0))}};function wm(s,t,e){for(;;){if(!t||e-1;let{impreciseHead:r,impreciseAnchor:o}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:km(t),a=new Hl(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=xm(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!Al(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!Al(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if((D.ios||D.chrome)&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.toDate.now()-100?s.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=n.from,h=null;(r===8||D.android&&t.text.length=n.from&&e.to<=n.to&&(e.from!=n.from||e.to!=n.to)&&n.to-n.from-(e.to-e.from)<=4?e={from:n.from,to:n.to,insert:s.state.doc.slice(n.from,e.from).append(e.insert).append(s.state.doc.slice(e.to,n.to))}:D.chrome&&e&&e.from==e.to&&e.from==n.head&&e.insert.toString()==`\n `&&s.lineWrapping&&(i&&(i=B.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:$.of([" "])}),e)return ha(s,e,i,r);if(i&&!i.main.eq(n)){let o=!1,l="select";return s.inputState.lastSelectionTime>Date.now()-50&&(s.inputState.lastSelectionOrigin=="select"&&(o=!0),l=s.inputState.lastSelectionOrigin),s.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function ha(s,t,e,i=-1){if(D.ios&&s.inputState.flushIOSKey(t))return!0;let n=s.state.selection.main;if(D.android&&(t.to==n.to&&(t.from==n.from||t.from==n.from-1&&s.state.sliceDoc(t.from,n.from)==" ")&&t.insert.length==1&&t.insert.lines==2&&fn(s.contentDOM,"Enter",13)||(t.from==n.from-1&&t.to==n.to&&t.insert.length==0||i==8&&t.insert.lengthn.head)&&fn(s.contentDOM,"Backspace",8)||t.from==n.from&&t.to==n.to+1&&t.insert.length==0&&fn(s.contentDOM,"Delete",46)))return!0;let r=t.insert.toString();s.inputState.composing>=0&&s.inputState.composing++;let o,l=()=>o||(o=ym(s,t,e));return s.state.facet($u).some(a=>a(s,t.from,t.to,r,l))||s.dispatch(l()),!0}function ym(s,t,e){let i,n=s.state,r=n.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&s.inputState.composing<0){let l=r.fromt.to?n.sliceDoc(t.to,r.to):"";i=n.replaceSelection(s.state.toText(l+t.insert.sliceString(0,void 0,s.state.lineBreak)+a))}else{let l=n.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(n.selection.ranges.length>1&&s.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=s.state.sliceDoc(t.from,t.to),f,u=e&&nc(s,e.main.head);if(u){let p=t.insert.length-(t.to-t.from);f={from:u.from,to:u.to-p}}else f=s.state.doc.lineAt(r.head);let c=r.to-t.to,d=r.to-r.from;i=n.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-c,m=g-h.length;if(p.to-p.from!=d||s.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=n.changes({from:m,to:g,insert:t.insert}),w=p.to-r.to;return{changes:b,range:a?B.range(Math.max(0,a.anchor+w),Math.max(0,a.head+w)):p.map(b)}})}else i={changes:l,selection:a&&n.selection.replaceRange(a)}}let o="input.type";return(s.composing||s.inputState.compositionPendingChange&&s.inputState.compositionEndedAt>Date.now()-50)&&(s.inputState.compositionPendingChange=!1,o+=".compose",s.inputState.compositionFirstChange&&(o+=".start",s.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:o,scrollIntoView:!0})}function vm(s,t,e,i){let n=Math.min(s.length,t.length),r=0;for(;r0&&l>0&&s.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function km(s){let t=[];if(s.root.activeElement!=s.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}=s.observer.selectionRange;return e&&(t.push(new _r(e,i)),(n!=e||r!=i)&&t.push(new _r(n,r))),t}function xm(s,t){if(s.length==0)return null;let e=s[0].pos,i=s.length==2?s[1].pos:e;return e>-1&&i>-1?B.single(e+t,i+t):null}var Vl=class{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,D.safari&&t.contentDOM.addEventListener("input",()=>null),D.gecko&&Lm(t.contentDOM.ownerDocument)}handleEvent(t){!_m(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(t.type,t)):this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let n of i.observers)n(this.view,e);for(let n of i.handlers){if(e.defaultPrevented)break;if(n(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Sm(t),i=this.handlers,n=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(n.removeEventListener(r,this.handleEvent),l=null),l||n.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&n.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&t.keyCode!=27&&lc.indexOf(t.keyCode)<0&&(this.tabFocusMode=-1),D.android&&D.chrome&&!t.synthetic&&(t.keyCode==13||t.keyCode==8))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return D.ios&&!t.synthetic&&!t.altKey&&!t.metaKey&&((e=oc.find(i=>i.keyCode==t.keyCode))&&!t.ctrlKey||Cm.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(t){let e=this.pendingIOSKey;return!e||e.key=="Enter"&&t&&t.from0?!0:D.safari&&!D.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.view.observer.update(t),this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function ou(s,t){return(e,i)=>{try{return t.call(s,i,e)}catch(n){ge(e.state,n)}}}function Sm(s){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of s){let n=i.spec;if(n&&n.domEventHandlers)for(let r in n.domEventHandlers){let o=n.domEventHandlers[r];o&&e(r).handlers.push(ou(i.value,o))}if(n&&n.domEventObservers)for(let r in n.domEventObservers){let o=n.domEventObservers[r];o&&e(r).observers.push(ou(i.value,o))}}for(let i in me)e(i).handlers.push(me[i]);for(let i in le)e(i).observers.push(le[i]);return t}var oc=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Cm="dthko",lc=[16,17,18,20,91,92,224,225],dr=6;function pr(s){return Math.max(0,s)*.7+8}function Mm(s,t){return Math.max(Math.abs(s.clientX-t.clientX),Math.abs(s.clientY-t.clientY))}var zl=class{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=Bg(t.contentDOM),this.atoms=t.state.facet(aa).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(ut.allowMultipleSelections)&&Am(t,e),this.dragging=Om(t,e)&&fc(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&Mm(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let e=0,i=0,n=0,r=0,o=this.view.win.innerWidth,l=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:o}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:r,bottom:l}=this.scrollParents.y.getBoundingClientRect());let a=ic(this.view);t.clientX-a.left<=n+dr?e=-pr(n-t.clientX):t.clientX+a.right>=o-dr&&(e=pr(t.clientX-o)),t.clientY-a.top<=r+dr?i=-pr(r-t.clientY):t.clientY+a.bottom>=l-dr&&(i=pr(t.clientY-l)),this.setScrollSpeed(e,i)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:t,y:e}=this.scrollSpeed;t&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=t,t=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(t||e)&&this.view.win.scrollBy(t,e),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;ie.isUserEvent("input.type"))?this.destroy():this.style.update(t)&&setTimeout(()=>this.select(this.lastEvent),20)}};function Am(s,t){let e=s.state.facet(Gu);return e.length?e[0](t):D.mac?t.metaKey:t.ctrlKey}function Tm(s,t){let e=s.state.facet(Uu);return e.length?e[0](t):D.mac?!t.altKey:!t.ctrlKey}function Om(s,t){let{main:e}=s.state.selection;if(e.empty)return!1;let i=ts(s.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function _m(s,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=s.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=nt.get(e))&&i.ignoreEvent(t))return!1;return!0}var me=Object.create(null),le=Object.create(null),ac=D.ie&&D.ie_version<15||D.ios&&D.webkit_version<604;function Em(s){let t=s.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{s.focus(),e.remove(),hc(s,e.value)},50)}function Nr(s,t,e){for(let i of s.facet(t))e=i(e,s);return e}function hc(s,t){t=Nr(s.state,ra,t);let{state:e}=s,i,n=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(Wl!=null&&e.selection.ranges.every(a=>a.empty)&&Wl==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let u=e.toText((o?r.line(n++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:u},range:B.cursor(h.from+u.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(n++);return{changes:{from:a.from,to:a.to,insert:h.text},range:B.cursor(a.from+h.length)}}):i=e.replaceSelection(r);s.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}le.scroll=s=>{s.inputState.lastScrollTop=s.scrollDOM.scrollTop,s.inputState.lastScrollLeft=s.scrollDOM.scrollLeft};me.keydown=(s,t)=>(s.inputState.setSelectionOrigin("select"),t.keyCode==27&&s.inputState.tabFocusMode!=0&&(s.inputState.tabFocusMode=Date.now()+2e3),!1);le.touchstart=(s,t)=>{s.inputState.lastTouchTime=Date.now(),s.inputState.setSelectionOrigin("select.pointer")};le.touchmove=s=>{s.inputState.setSelectionOrigin("select.pointer")};me.mousedown=(s,t)=>{if(s.observer.flush(),s.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of s.state.facet(qu))if(e=i(s,t),e)break;if(!e&&t.button==0&&(e=Pm(s,t)),e){let i=!s.hasFocus;s.inputState.startMouseSelection(new zl(s,t,e,i)),i&&s.observer.ignore(()=>{Mu(s.contentDOM);let r=s.root.activeElement;r&&!r.contains(s.contentDOM)&&r.blur()});let n=s.inputState.mouseSelection;if(n)return n.start(t),n.dragging===!1}return!1};function lu(s,t,e,i){if(i==1)return B.cursor(t,e);if(i==2)return hm(s.state,t,e);{let n=Tt.find(s.docView,t),r=s.state.doc.lineAt(n?n.posAtEnd:t),o=n?n.posAtStart:r.from,l=n?n.posAtEnd:r.to;return lt>=e.top&&t<=e.bottom&&s>=e.left&&s<=e.right;function Dm(s,t,e,i){let n=Tt.find(s.docView,t);if(!n)return 1;let r=t-n.posAtStart;if(r==0)return 1;if(r==n.length)return-1;let o=n.coordsAt(r,-1);if(o&&au(e,i,o))return-1;let l=n.coordsAt(r,1);return l&&au(e,i,l)?1:o&&o.bottom>=i?-1:1}function hu(s,t){let e=s.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:Dm(s,e,t.clientX,t.clientY)}}var Rm=D.ie&&D.ie_version<=11,fu=null,uu=0,cu=0;function fc(s){if(!Rm)return s.detail;let t=fu,e=cu;return fu=s,cu=Date.now(),uu=!t||e>Date.now()-400&&Math.abs(t.clientX-s.clientX)<2&&Math.abs(t.clientY-s.clientY)<2?(uu+1)%3:1}function Pm(s,t){let e=hu(s,t),i=fc(t),n=s.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),n=n.map(r.changes))},get(r,o,l){let a=hu(s,r),h,f=lu(s,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let u=lu(s,e.pos,e.bias,i),c=Math.min(u.from,f.from),d=Math.max(u.to,f.to);f=c1&&(h=Im(n,a.pos))?h:l?n.addRange(f):B.create([f])}}}function Im(s,t){for(let e=0;e=t)return B.create(s.ranges.slice(0,e).concat(s.ranges.slice(e+1)),s.mainIndex==e?0:s.mainIndex-(s.mainIndex>e?1:0))}return null}me.dragstart=(s,t)=>{let{selection:{main:e}}=s.state;if(t.target.draggable){let n=s.docView.nearest(t.target);if(n&&n.isWidget){let r=n.posAtStart,o=r+n.length;(r>=e.to||o<=e.from)&&(e=B.range(r,o))}}let{inputState:i}=s;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",Nr(s.state,oa,s.state.sliceDoc(e.from,e.to))),t.dataTransfer.effectAllowed="copyMove"),!1};me.dragend=s=>(s.inputState.draggedContent=null,!1);function du(s,t,e,i){if(e=Nr(s.state,ra,e),!e)return;let n=s.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=s.inputState,o=i&&r&&Tm(s,t)?{from:r.from,to:r.to}:null,l={from:n,insert:e},a=s.state.changes(o?[o,l]:l);s.focus(),s.dispatch({changes:a,selection:{anchor:a.mapPos(n,-1),head:a.mapPos(n,1)},userEvent:o?"move.drop":"input.drop"}),s.inputState.draggedContent=null}me.drop=(s,t)=>{if(!t.dataTransfer)return!1;if(s.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),n=0,r=()=>{++n==e.length&&du(s,t,i.filter(o=>o!=null).join(s.state.lineBreak),!1)};for(let o=0;o{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return du(s,t,i,!0),!0}return!1};me.paste=(s,t)=>{if(s.state.readOnly)return!0;s.observer.flush();let e=ac?null:t.clipboardData;return e?(hc(s,e.getData("text/plain")||e.getData("text/uri-list")),!0):(Em(s),!1)};function Nm(s,t){let e=s.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),s.focus()},50)}function Bm(s){let t=[],e=[],i=!1;for(let n of s.selection.ranges)n.empty||(t.push(s.sliceDoc(n.from,n.to)),e.push(n));if(!t.length){let n=-1;for(let{from:r}of s.selection.ranges){let o=s.doc.lineAt(r);o.number>n&&(t.push(o.text),e.push({from:o.from,to:Math.min(s.doc.length,o.to+1)})),n=o.number}i=!0}return{text:Nr(s,oa,t.join(s.lineBreak)),ranges:e,linewise:i}}var Wl=null;me.copy=me.cut=(s,t)=>{let{text:e,ranges:i,linewise:n}=Bm(s.state);if(!e&&!n)return!1;Wl=n?e:null,t.type=="cut"&&!s.state.readOnly&&s.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=ac?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(Nm(s,e),!1)};var uc=Mt.define();function cc(s,t){let e=[];for(let i of s.facet(Ku)){let n=i(s,t);n&&e.push(n)}return e.length?s.update({effects:e,annotations:uc.of(!0)}):null}function dc(s){setTimeout(()=>{let t=s.hasFocus;if(t!=s.inputState.notifiedFocused){let e=cc(s.state,t);e?s.dispatch(e):s.update([])}},10)}le.focus=s=>{s.inputState.lastFocusTime=Date.now(),!s.scrollDOM.scrollTop&&(s.inputState.lastScrollTop||s.inputState.lastScrollLeft)&&(s.scrollDOM.scrollTop=s.inputState.lastScrollTop,s.scrollDOM.scrollLeft=s.inputState.lastScrollLeft),dc(s)};le.blur=s=>{s.observer.clearSelectionRange(),dc(s)};le.compositionstart=le.compositionupdate=s=>{s.observer.editContext||(s.inputState.compositionFirstChange==null&&(s.inputState.compositionFirstChange=!0),s.inputState.composing<0&&(s.inputState.composing=0))};le.compositionend=s=>{s.observer.editContext||(s.inputState.composing=-1,s.inputState.compositionEndedAt=Date.now(),s.inputState.compositionPendingKey=!0,s.inputState.compositionPendingChange=s.observer.pendingRecords().length>0,s.inputState.compositionFirstChange=null,D.chrome&&D.android?s.observer.flushSoon():s.inputState.compositionPendingChange?Promise.resolve().then(()=>s.observer.flush()):setTimeout(()=>{s.inputState.composing<0&&s.docView.hasComposition&&s.update([])},50))};le.contextmenu=s=>{s.inputState.lastContextMenu=Date.now()};me.beforeinput=(s,t)=>{var e,i;if(t.inputType=="insertReplacementText"&&s.observer.editContext){let r=(e=t.dataTransfer)===null||e===void 0?void 0:e.getData("text/plain"),o=t.getTargetRanges();if(r&&o.length){let l=o[0],a=s.posAtDOM(l.startContainer,l.startOffset),h=s.posAtDOM(l.endContainer,l.endOffset);return ha(s,{from:a,to:h,insert:s.state.toText(r)},null),!0}}let n;if(D.chrome&&D.android&&(n=oc.find(r=>r.inputType==t.inputType))&&(s.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let r=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var o;(((o=window.visualViewport)===null||o===void 0?void 0:o.height)||0)>r+10&&s.hasFocus&&(s.contentDOM.blur(),s.focus())},100)}return D.ios&&t.inputType=="deleteContentForward"&&s.observer.flushSoon(),D.safari&&t.inputType=="insertText"&&s.inputState.composing>=0&&setTimeout(()=>le.compositionend(s,t),20),!1};var pu=new Set;function Lm(s){pu.has(s)||(pu.add(s),s.addEventListener("copy",()=>{}),s.addEventListener("cut",()=>{}))}var gu=["pre-wrap","normal","pre-line","break-spaces"],cn=!1;function mu(){cn=!1}var Gl=class{constructor(t){this.lineWrapping=t,this.doc=$.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return gu.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t){this.height!=t&&(Math.abs(this.height-t)>xr&&(cn=!0),this.height=t)}replace(t,e,i){return s.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let r=this,o=i.doc;for(let l=n.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:u}=n[l],c=r.lineAt(a,lt.ByPosNoHeight,i.setDoc(e),0,0),d=c.to>=h?c:r.lineAt(h,lt.ByPosNoHeight,i,0,0);for(u+=d.to-h,h=d.to;l>0&&c.from<=n[l-1].toA;)a=n[l-1].fromA,f=n[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,n-=l.size}else if(r>n*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(n=r&&o(this.blockAt(0,i,n,r))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},oe=class s extends Dr{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new Me(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return i.length==1&&(n instanceof s||n instanceof fi&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof fi?n=new s(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):Xt.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(n.heights[n.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},fi=class s extends Xt{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,n=t.doc.lineAt(e+this.length).number,r=n-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:n,perLine:o,perChar:l}}blockAt(t,e,i,n){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let h=n+(t0){let r=i[i.length-1];r instanceof s?i[i.length-1]=new s(r.length+n):i.push(null,new s(n-1))}if(t>0){let r=i[0];r instanceof s?i[0]=new s(t+r.length):i.unshift(new s(t-1),null)}return Xt.of(i)}decomposeLeft(t,e){e.push(new s(t-1),null)}decomposeRight(t,e){e.push(null,new s(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let r=e+this.length;if(n&&n.from<=e+this.length&&n.more){let o=[],l=Math.max(e,n.from),a=-1;for(n.from>e&&o.push(new s(n.from-e-1).updateHeight(t,e));l<=r&&n.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let u=n.heights[n.index++];a==-1?a=u:Math.abs(u-a)>=xr&&(a=-2);let c=new oe(f,u);c.outdated=!1,o.push(c),l+=f+1}l<=r&&o.push(null,new s(r-l).updateHeight(t,l));let h=Xt.of(o);return(a<0||Math.abs(h.height-this.height)>=xr||Math.abs(a-this.heightMetrics(t,e).perLine)>=xr)&&(cn=!0),Er(this,h)}else(i||this.outdated)&&(this.setHeight(t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},ql=class extends Xt{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,n){let r=i+this.left.height;return tl))return h;let f=e==lt.ByPosNoHeight?lt.ByPosNoHeight:lt.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,n,r).join(h)}forEachLine(t,e,i,n,r,o){let l=n+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,lt.ByPos,i,n,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&bu(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t2*e.size||e.size>2*t.size?Xt.of(this.break?[t,null,e]:[t,e]):(this.left=Er(this.left,t),this.right=Er(this.right,e),this.setHeight(t.height+e.height),this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return n&&n.from<=e+r.length&&n.more?a=r=r.updateHeight(t,e,i,n):r.updateHeight(t,e,i),n&&n.from<=l+o.length&&n.more?a=o=o.updateHeight(t,l,i,n):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function bu(s,t){let e,i;s[t]==null&&(e=s[t-1])instanceof fi&&(i=s[t+1])instanceof fi&&s.splice(t-1,3,new fi(e.length+1+i.length))}var Hm=5,jl=class s{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof oe?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new oe(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=Hm)&&this.addLineDeco(n,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new oe(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new fi(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof oe)return t;let e=new oe(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof oe)&&!this.isCovered?this.nodes.push(new oe(0,-1)):(this.writtenTof.clientHeight||f.scrollWidth>f.clientWidth)&&u.overflow!="visible"){let c=f.getBoundingClientRect();r=Math.max(r,c.left),o=Math.min(o,c.right),l=Math.max(l,c.top),a=Math.min(h==s.parentNode?n.innerHeight:a,c.bottom)}h=u.position=="absolute"||u.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function zm(s){let t=s.getBoundingClientRect(),e=s.ownerDocument.defaultView||window;return t.left0&&t.top0}function Wm(s,t){let e=s.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var Zn=class{constructor(t,e,i,n){this.from=t,this.to=e,this.size=i,this.displaySize=n}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new Gl(e),this.stateDeco=t.facet(rs).filter(i=>typeof i!="function"),this.heightMap=Xt.empty().applyChanges(this.stateDeco,$.empty,this.heightOracle.setDoc(t.doc),[new Te(0,0,0,t.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=J.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>n>=r&&n<=o)){let{from:r,to:o}=this.lineBlockAt(n);t.push(new hn(r,o))}}return this.viewports=t.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let t=this.scaler;return this.scaler=this.heightMap.height<=7e6?wu:new Yl(this.heightOracle,this.heightMap,this.viewports),t.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(Kn(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(rs).filter(f=>typeof f!="function");let n=t.changedRanges,r=Te.extendWithRanges(n,Fm(i,this.stateDeco,t?t.changes:Kt.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);mu(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),(this.heightMap.height!=o||cn)&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=o);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,t.flags|=this.updateForViewport(),(h||!t.changes.empty||t.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(t.changes),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(tm)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),n=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?gt.RTL:gt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:v,scaleY:x}=Cu(e,l);(v>.005&&Math.abs(this.scaleX-v)>.005||x>.005&&Math.abs(this.scaleY-x)>.005)&&(this.scaleX=v,this.scaleY=x,h|=16,o=a=!0)}let u=(parseInt(i.paddingTop)||0)*this.scaleY,c=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=u||this.paddingBottom!=c)&&(this.paddingTop=u,this.paddingBottom=c,h|=18),this.editorWidth!=t.scrollDOM.clientWidth&&(n.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=16);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Tu(t.scrollDOM);let p=(this.printing?Wm:Vm)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget&&!zm(t.dom))return 0;let w=l.width;if((this.contentDOMWidth!=w||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=16),a){let v=t.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(v)&&(o=!0),o||n.lineWrapping&&Math.abs(w-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:S,textHeight:k}=t.docView.measureTextSize();o=x>0&&n.refresh(r,x,S,k,w/S,v),o&&(t.docView.minWidth=0,h|=16)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),mu();for(let x of this.viewports){let S=x.from==this.viewport.from?v:t.docView.measureVisibleLineHeights(x);this.heightMap=(o?Xt.empty().applyChanges(this.stateDeco,$.empty,this.heightOracle,[new Te(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(n,0,o,new Ul(x.from,S))}cn&&(h|=2)}let y=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return y&&(h&2&&(h|=this.updateScaler()),this.viewport=this.getViewport(f,this.scrollTarget),h|=this.updateForViewport()),(h&2||y)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new hn(n.lineAt(o-i*1e3,lt.ByHeight,r,0,0).from,n.lineAt(l+(1-i)*1e3,lt.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),u=n.lineAt(h,lt.ByPos,r,0,0),c;e.y=="center"?c=(u.top+u.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&n>o-2*1e3&&r>1,o=n<<1;if(this.defaultTextDirection!=gt.LTR&&!i)return[];let l=[],a=(f,u,c,d)=>{if(u-ff&&bb.from>=c.from&&b.to<=c.to&&Math.abs(b.from-f)b.fromw));if(!m){if(uy.from<=u&&y.to>=u)){let y=e.moveToLineBoundary(B.cursor(u),!1,!0).head;y>f&&(u=y)}let b=this.gapSize(c,f,u,d),w=i||b<2e6?b:2e6;m=new Zn(f,u,b,w)}l.push(m)},h=f=>{if(f.length2e6)for(let S of t)S.from>=f.from&&S.fromf.from&&a(f.from,d,f,u),pe.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(t){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let i=[];Y.spans(e,this.viewport.from,this.viewport.to,{span(r,o){i.push({from:r,to:o})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let r=0;r=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||Kn(this.heightMap.lineAt(t,lt.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return t>=this.viewportLines[0].top&&t<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(e=>e.top<=t&&e.bottom>=t)||Kn(this.heightMap.lineAt(this.scaler.fromDOM(t),lt.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Kn(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},hn=class{constructor(t,e){this.from=t,this.to=e}};function Gm(s,t,e){let i=[],n=s,r=0;return Y.spans(e,s,t,{span(){},point(o,l){o>n&&(i.push({from:n,to:o}),r+=o-n),n=l}},20),n=1)return t[t.length-1].to;let i=Math.floor(s*e);for(let n=0;;n++){let{from:r,to:o}=t[n],l=o-r;if(i<=l)return r+i;i-=l}}function mr(s,t){let e=0;for(let{from:i,to:n}of s.ranges){if(t<=n){e+=t-i;break}e+=n-i}return e/s.total}function Um(s,t){for(let e of s)if(t(e))return e}var wu={toDOM(s){return s},fromDOM(s){return s},scale:1,eq(s){return s==this}},Yl=class s{constructor(t,e,i){let n=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,lt.ByPos,t,0,0).top,f=e.lineAt(a,lt.ByPos,t,0,0).bottom;return n+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(e.height-n);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let r=ee.from==t.viewports[i].from&&e.to==t.viewports[i].to):!1}};function Kn(s,t){if(t.scale==1)return s;let e=t.toDOM(s.top),i=t.toDOM(s.bottom);return new Me(s.from,s.length,e,i-e,Array.isArray(s._content)?s._content.map(n=>Kn(n,t)):s._content)}var br=L.define({combine:s=>s.join(" ")}),Xl=L.define({combine:s=>s.indexOf(!0)>-1}),Jl=re.newName(),pc=re.newName(),gc=re.newName(),mc={"&light":"."+pc,"&dark":"."+gc};function Ql(s,t,e){return new re(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,n=>{if(n=="&")return s;if(!e||!e[n])throw new RangeError(`Unsupported selector: ${n}`);return e[n]}):s+" "+i}})}var qm=Ql("."+Jl,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},mc),jm={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Ml=D.ie&&D.ie_version<=11,Zl=class{constructor(t){this.view=t,this.active=!1,this.editContext=null,this.selectionRange=new Tl,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(D.ie&&D.ie_version<=11||D.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&t.constructor.EDIT_CONTEXT!==!1&&!(D.chrome&&D.chrome_version<126)&&(this.editContext=new ta(t),t.state.facet(Xe)&&(t.contentDOM.editContext=this.editContext.editContext)),Ml&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(t){(t.type=="change"||!t.type)&&!t.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(Xe)?i.root.activeElement!=this.dom:!yr(this.dom,n))return;let r=n.anchorNode&&i.docView.nearest(n.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(D.ie&&D.ie_version<=11||D.android&&D.chrome)&&!i.state.selection.main.empty&&n.focusNode&&Yn(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=ts(t.root);if(!e)return!1;let i=D.safari&&t.root.nodeType==11&&t.root.activeElement==this.dom&&$m(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let n=yr(this.dom,i);return n&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&fn(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(n=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&yr(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new Fl(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=rc(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=yu(e,t.previousSibling||t.target.previousSibling,-1),n=yu(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}update(t){this.editContext&&(this.editContext.update(t),t.startState.facet(Xe)!=t.state.facet(Xe)&&(t.view.contentDOM.editContext=t.state.facet(Xe)?this.editContext.editContext:null))}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function yu(s,t,e){for(;t;){let i=nt.get(t);if(i&&i.parent==s)return i;let n=t.parentNode;t=n!=s.dom?n:e>0?t.nextSibling:t.previousSibling}return null}function vu(s,t){let e=t.startContainer,i=t.startOffset,n=t.endContainer,r=t.endOffset,o=s.docView.domAtPos(s.state.selection.main.anchor);return Yn(o.node,o.offset,n,r)&&([e,i,n,r]=[n,r,e,i]),{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}}function $m(s,t){if(t.getComposedRanges){let n=t.getComposedRanges(s.root)[0];if(n)return vu(s,n)}let e=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),e=n.getTargetRanges()[0]}return s.contentDOM.addEventListener("beforeinput",i,!0),s.dom.ownerDocument.execCommand("indent"),s.contentDOM.removeEventListener("beforeinput",i,!0),e?vu(s,e):null}var ta=class{constructor(t){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(t.state);let e=this.editContext=new window.EditContext({text:t.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,t.state.selection.main.anchor))),selectionEnd:this.toContextPos(t.state.selection.main.head)});this.handlers.textupdate=i=>{let n=t.state.selection.main,{anchor:r,head:o}=n,l=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);t.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:l,drifted:!1});let h={from:l,to:a,insert:$.of(i.text.split(`\n`))};if(h.from==this.from&&rthis.to&&(h.to=r),h.from==h.to&&!h.insert.length){let f=B.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));f.main.eq(n)||t.dispatch({selection:f,userEvent:"select"});return}if((D.mac||D.android)&&h.from==o-1&&/^\\. ?$/.test(i.text)&&t.contentDOM.getAttribute("autocorrect")=="off"&&(h={from:l,to:a,insert:$.of([i.text.replace("."," ")])}),this.pendingContextChange=h,!t.state.readOnly){let f=this.to-this.from+(h.to-h.from+h.insert.length);ha(t,h,B.single(this.toEditorPos(i.selectionStart,f),this.toEditorPos(i.selectionEnd,f)))}this.pendingContextChange&&(this.revertPending(t.state),this.setSelection(t.state))},this.handlers.characterboundsupdate=i=>{let n=[],r=null;for(let o=this.toEditorPos(i.rangeStart),l=this.toEditorPos(i.rangeEnd);o{let n=[];for(let r of i.getTextFormats()){let o=r.underlineStyle,l=r.underlineThickness;if(o!="None"&&l!="None"){let a=this.toEditorPos(r.rangeStart),h=this.toEditorPos(r.rangeEnd);if(a{t.inputState.composing<0&&(t.inputState.composing=0,t.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(t.inputState.composing=-1,t.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(t.state)}};for(let i in this.handlers)e.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=ts(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(t){let e=0,i=!1,n=this.pendingContextChange;return t.changes.iterChanges((r,o,l,a,h)=>{if(i)return;let f=h.length-(o-r);if(n&&o>=n.to)if(n.from==r&&n.to==o&&n.insert.eq(h)){n=this.pendingContextChange=null,e+=f,this.to+=f;return}else n=null,this.revertPending(t.state);if(r+=e,o+=e,o<=this.from)this.from+=f,this.to+=f;else if(rthis.to||this.to-this.from+h.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(r),this.toContextPos(o),h.toString()),this.to+=f}e+=f}),n&&!i&&this.revertPending(t.state),!i}update(t){let e=this.pendingContextChange,i=t.startState.selection.main;this.composing&&(this.composing.drifted||!t.changes.touchesRange(i.from,i.to)&&t.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=t.changes.mapPos(this.composing.editorBase)):!this.applyEdits(t)||!this.rangeIsValid(t.state)?(this.pendingContextChange=null,this.reset(t.state)):(t.docChanged||t.selectionSet||e)&&this.setSelection(t.state),(t.geometryChanged||t.docChanged||t.selectionSet)&&t.view.requestMeasure(this.measureReq)}resetRange(t){let{head:e}=t.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(t.doc.length,e+1e4)}reset(t){this.resetRange(t),this.editContext.updateText(0,this.editContext.text.length,t.doc.sliceString(this.from,this.to)),this.setSelection(t)}revertPending(t){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),t.doc.sliceString(e.from,e.to))}setSelection(t){let{main:e}=t.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),n=this.toContextPos(e.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(t){let{head:e}=t.selection.main;return!(this.from>0&&e-this.from<500||this.to1e4*3)}toEditorPos(t,e=this.to-this.from){t=Math.min(t,e);let i=this.composing;return i&&i.drifted?i.editorBase+(t-i.contextBase):t+this.from}toContextPos(t){let e=this.composing;return e&&e.drifted?e.contextBase+(t-e.editorBase):t-this.from}destroy(){for(let t in this.handlers)this.editContext.removeEventListener(t,this.handlers[t])}},G=class s{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){var e;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:i}=t;this.dispatchTransactions=t.dispatchTransactions||i&&(n=>n.forEach(r=>i(r,this)))||(n=>this.update(n)),this.dispatch=this.dispatch.bind(this),this._root=t.root||Lg(t.parent)||document,this.viewState=new Rr(t.state||ut.create(t)),t.scrollTo&&t.scrollTo.is(cr)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(qn).map(n=>new Qn(n));for(let n of this.plugins)n.update(this);this.observer=new Zl(this),this.inputState=new Vl(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Or(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((e=document.fonts)===null||e===void 0)&&e.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...t){let e=t.length==1&&t[0]instanceof zt?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,n,r=this.state;for(let c of t){if(c.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=c.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(c=>c.annotation(uc))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=cc(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(ut.phrases)!=this.state.facet(ut.phrases))return this.setState(r);n=Tr.create(this,r,t),n.flags|=l;let u=this.viewState.scrollTarget;try{this.updateState=2;for(let c of t){if(u&&(u=u.map(c.changes)),c.scrollIntoView){let{main:d}=c.state.selection;u=new Jn(d.empty?d:B.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of c.effects)d.is(cr)&&(u=d.value.clip(this.state))}this.viewState.update(n,u),this.bidiCache=Pr.update(this.bidiCache,n.changes),n.empty||(this.updatePlugins(n),this.inputState.update(n)),e=this.docView.update(n),this.state.facet(jn)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(c=>c.isUserEvent("select.pointer")))}finally{this.updateState=0}if(n.startState.facet(br)!=n.state.facet(br)&&(this.viewState.mustMeasureContent=!0),(e||i||u||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),e&&this.docViewUpdate(),!n.empty)for(let c of this.state.facet(Bl))try{c(n)}catch(d){ge(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!rc(this,f)&&h.force&&fn(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new Rr(t),this.plugins=t.facet(qn).map(i=>new Qn(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new Or(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(qn),i=t.state.facet(qn);if(e!=i){let n=[];for(let r of i){let o=e.indexOf(r);if(o<0)n.push(new Qn(r));else{let l=this.plugins[o];l.mustUpdate=t,n.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let n of this.plugins)n.mustUpdate=t;for(let n=0;n-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Tu(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(n);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return ge(this.state,p),ku}}),u=Tr.create(this,this.state,[]),c=!1;u.flags|=a,e?e.flags|=a:e=u,this.updateState=2,u.empty||(this.updatePlugins(u),this.inputState.update(u),this.updateAttrs(),c=this.docView.update(u),c&&this.docViewUpdate());for(let d=0;d1||p<-1){n=n+p,i.scrollTop=n/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(Bl))l(e)}get themeClasses(){return Jl+" "+(this.state.facet(Xl)?gc:pc)+" "+this.state.facet(br)}updateAttrs(){let t=xu(this,Qu,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(Xe)?"true":"false",class:"cm-content",style:`${D.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),xu(this,la,e);let i=this.observer.ignore(()=>{let n=Rl(this.contentDOM,this.contentAttrs,e),r=Rl(this.dom,this.editorAttrs,t);return n||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let n of i.effects)if(n.is(s.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=n.value}}mountStyles(){this.styleModules=this.state.facet(jn);let t=this.state.facet(s.cspNonce);re.mount(this.root,this.styleModules.concat(qm).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return Cl(this,t,ru(this,t,e,i))}moveByGroup(t,e){return Cl(this,t,ru(this,t,e,i=>mm(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return B.cursor(r.side(e,n)+t.from,r.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return gm(this,t,e,i)}moveVertically(t,e,i){return Cl(this,t,bm(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),sc(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let n=this.state.doc.lineAt(t),r=this.bidiSpans(n),o=r[Ae.find(r,t-n.from,-1,e)];return os(i,o.dir==gt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(Yu)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Km)return zu(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||Vu(r.isolates,i=tu(this,t))))return r.order;i||(i=tu(this,t));let n=Jg(t.text,e,i);return this.bidiCache.push(new Pr(t.from,t.to,e,i,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||D.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Mu(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return cr.of(new Jn(typeof t=="number"?B.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return cr.of(new Jn(B.cursor(i.from),"start","start",i.top-t,e,!0))}setTabFocusMode(t){t==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof t=="boolean"?this.inputState.tabFocusMode=t?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+t)}static domEventHandlers(t){return Je.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return Je.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=re.newName(),n=[br.of(i),jn.of(Ql(`.${i}`,t))];return e&&e.dark&&n.push(Xl.of(!0)),n}static baseTheme(t){return on.lowest(jn.of(Ql("."+Jl,t,mc)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&nt.get(i)||nt.get(t);return((e=n==null?void 0:n.rootView)===null||e===void 0?void 0:e.view)||null}};G.styleModule=jn;G.inputHandler=$u;G.clipboardInputFilter=ra;G.clipboardOutputFilter=oa;G.scrollHandler=Xu;G.focusChangeEffect=Ku;G.perLineTextDirection=Yu;G.exceptionSink=ju;G.updateListener=Bl;G.editable=Xe;G.mouseSelectionStyle=qu;G.dragMovesSelection=Uu;G.clickAddsSelectionRange=Gu;G.decorations=rs;G.outerDecorations=Zu;G.atomicRanges=aa;G.bidiIsolatedRanges=tc;G.scrollMargins=ec;G.darkTheme=Xl;G.cspNonce=L.define({combine:s=>s.length?s[0]:""});G.contentAttributes=la;G.editorAttributes=Qu;G.lineWrapping=G.contentAttributes.of({class:"cm-lineWrapping"});G.announce=ot.define();var Km=4096,ku={},Pr=class s{constructor(t,e,i,n,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],n=t.length?t[t.length-1].dir:gt.LTR;for(let r=Math.max(0,t.length-10);r=0;n--){let r=i[n],o=typeof r=="function"?r(s):r;o&&Dl(o,e)}return e}var Ym=D.mac?"mac":D.windows?"win":D.linux?"linux":"key";function Xm(s,t){let e=s.split(/-(?!$)/),i=e[e.length-1];i=="Space"&&(i=" ");let n,r,o,l;for(let a=0;ai.concat(n),[]))),e}var hi=null,Zm=4e3;function t0(s,t=Ym){let e=Object.create(null),i=Object.create(null),n=(o,l)=>{let a=i[o];if(a==null)i[o]=l;else if(a!=l)throw new Error("Key binding "+o+" is used both as a regular binding and as a multi-stroke prefix")},r=(o,l,a,h,f)=>{var u,c;let d=e[o]||(e[o]=Object.create(null)),p=l.split(/ (?!$)/).map(b=>Xm(b,t));for(let b=1;b{let v=hi={view:y,prefix:w,scope:o};return setTimeout(()=>{hi==v&&(hi=null)},Zm),!0}]})}let g=p.join(" ");n(g,!1);let m=d[g]||(d[g]={preventDefault:!1,stopPropagation:!1,run:((c=(u=d._any)===null||u===void 0?void 0:u.run)===null||c===void 0?void 0:c.slice())||[]});a&&m.run.push(a),h&&(m.preventDefault=!0),f&&(m.stopPropagation=!0)};for(let o of s){let l=o.scope?o.scope.split(" "):["editor"];if(o.any)for(let h of l){let f=e[h]||(e[h]=Object.create(null));f._any||(f._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:u}=o;for(let c in f)f[c].run.push(d=>u(d,ea))}let a=o[t]||o.key;if(a)for(let h of l)r(h,a,o.run,o.preventDefault,o.stopPropagation),o.shift&&r(h,"Shift-"+a,o.shift,o.preventDefault,o.stopPropagation)}return e}var ea=null;function e0(s,t,e,i){ea=t;let n=jf(t),r=Ef(n,0),o=Df(r)==n.length&&n!=" ",l="",a=!1,h=!1,f=!1;hi&&hi.view==e&&hi.scope==i&&(l=hi.prefix+" ",lc.indexOf(t.keyCode)<0&&(h=!0,hi=null));let u=new Set,c=m=>{if(m){for(let b of m.run)if(!u.has(b)&&(u.add(b),b(e)))return m.stopPropagation&&(f=!0),!0;m.preventDefault&&(m.stopPropagation&&(f=!0),h=!0)}return!1},d=s[i],p,g;return d&&(c(d[l+wr(n,t,!o)])?a=!0:o&&(t.altKey||t.metaKey||t.ctrlKey)&&!(D.windows&&t.ctrlKey&&t.altKey)&&(p=Ye[t.keyCode])&&p!=n?(c(d[l+wr(p,t,!0)])||t.shiftKey&&(g=ln[t.keyCode])!=n&&g!=p&&c(d[l+wr(g,t,!1)]))&&(a=!0):o&&t.shiftKey&&c(d[l+wr(n,t,!0)])&&(a=!0),!a&&c(d._any)&&(a=!0)),h&&(a=!0),a&&f&&t.stopPropagation(),ea=null,a}var ky=/x/.unicode!=null?"gu":"g";var ia=class extends Ni{constructor(t){super(),this.content=t}toDOM(t){let e=document.createElement("span");return e.className="cm-placeholder",e.style.pointerEvents="none",e.appendChild(typeof this.content=="string"?document.createTextNode(this.content):typeof this.content=="function"?this.content(t):this.content.cloneNode(!0)),e.setAttribute("aria-hidden","true"),e}coordsAt(t){let e=t.firstChild?un(t.firstChild):[];if(!e.length)return null;let i=window.getComputedStyle(t.parentNode),n=os(e[0],i.direction!="rtl"),r=parseInt(i.lineHeight);return n.bottom-n.top>r*1.5?{left:n.left,right:n.right,top:n.top,bottom:n.top+r}:n}ignoreEvent(){return!1}};function bc(s){let t=Je.fromClass(class{constructor(e){this.view=e,this.placeholder=s?J.set([J.widget({widget:new ia(s),side:1}).range(0)]):J.none}get decorations(){return this.view.state.doc.length?J.none:this.placeholder}},{decorations:e=>e.decorations});return typeof s=="string"?[t,G.contentAttributes.of({"aria-placeholder":s})]:t}var xy=G.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var be=class extends $e{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};be.prototype.elementClass="";be.prototype.toDOM=void 0;be.prototype.mapMode=Vt.TrackBefore;be.prototype.startSide=be.prototype.endSide=-1;be.prototype.point=!0;var Br=L.define();var i0=0,ls=class{constructor(t,e){this.from=t,this.to=e}},Q=class{constructor(t={}){this.id=i0++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=ae.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};Q.closedBy=new Q({deserialize:s=>s.split(" ")});Q.openedBy=new Q({deserialize:s=>s.split(" ")});Q.group=new Q({deserialize:s=>s.split(" ")});Q.isolate=new Q({deserialize:s=>{if(s&&s!="rtl"&&s!="ltr"&&s!="auto")throw new RangeError("Invalid value for isolate: "+s);return s||"auto"}});Q.contextHash=new Q({perNode:!0});Q.lookAhead=new Q({perNode:!0});Q.mounted=new Q({perNode:!0});var dn=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[Q.mounted.id]}},n0=Object.create(null),ae=class s{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):n0,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),n=new s(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(n)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return n}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(Q.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return i=>{for(let n=i.prop(Q.group),r=-1;r<(n?n.length:0);r++){let o=e[r<0?i.name:n[r]];if(o)return o}}}};ae.none=new ae("",Object.create(null),0,8);var Lr=new WeakMap,wc=new WeakMap,kt;(function(s){s[s.ExcludeBuffers=1]="ExcludeBuffers",s[s.IncludeAnonymous=2]="IncludeAnonymous",s[s.IgnoreMounts=4]="IgnoreMounts",s[s.IgnoreOverlays=8]="IgnoreOverlays"})(kt||(kt={}));var Dt=class s{constructor(t,e,i,n,r){if(this.type=t,this.children=e,this.positions=i,this.length=n,this.props=null,r&&r.length){this.props=Object.create(null);for(let[o,l]of r)this.props[typeof o=="number"?o:o.id]=l}}toString(){let t=dn.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let i of this.children){let n=i.toString();n&&(e&&(e+=","),e+=n)}return this.type.name?(/\\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new fs(this.topNode,t)}cursorAt(t,e=0,i=0){let n=Lr.get(this)||this.topNode,r=new fs(n);return r.moveTo(t,e),Lr.set(this,r._tree),r}get topNode(){return new Ee(this,0,0,null)}resolve(t,e=0){let i=as(Lr.get(this)||this.topNode,t,e,!1);return Lr.set(this,i),i}resolveInner(t,e=0){let i=as(wc.get(this)||this.topNode,t,e,!0);return wc.set(this,i),i}resolveStack(t,e=0){return s0(this,t,e)}iterate(t){let{enter:e,leave:i,from:n=0,to:r=this.length}=t,o=t.mode||0,l=(o&kt.IncludeAnonymous)>0;for(let a=this.cursor(o|kt.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=n&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:ba(ae.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,n)=>new s(this.type,e,i,n,this.propValues),t.makeTree||((e,i,n)=>new s(ae.none,e,i,n)))}static build(t){return r0(t)}};Dt.empty=new Dt(ae.none,[],[],0);var ua=class s{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new s(this.buffer,this.index)}},pi=class s{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return ae.none}toString(){let t=[];for(let e=0;e0));a=o[a+3]);return l}slice(t,e,i){let n=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l=t&&et;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function as(s,t,e,i){for(var n;s.from==s.to||(e<1?s.from>=t:s.from>t)||(e>-1?s.to<=t:s.to0?l.length:-1;t!=h;t+=e){let f=l[t],u=a[t]+o.from;if(kc(n,i,u,u+f.length)){if(f instanceof pi){if(r&kt.ExcludeBuffers)continue;let c=f.findChild(0,f.buffer.length,e,i-u,n);if(c>-1)return new hs(new da(o,f,t,u),null,c)}else if(r&kt.IncludeAnonymous||!f.type.isAnonymous||ma(f)){let c;if(!(r&kt.IgnoreMounts)&&(c=dn.get(f))&&!c.overlay)return new s(c.tree,u,t,o);let d=new s(f,u,t,o);return r&kt.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,n)}}}if(r&kt.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&kt.IgnoreOverlays)&&(n=dn.get(this._tree))&&n.overlay){let r=t-this.from;for(let{from:o,to:l}of n.overlay)if((e>0?o<=r:o=r:l>r))return new s(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function yc(s,t,e,i){let n=s.cursor(),r=[];if(!n.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=n.type.is(e),!n.nextSibling())return r}for(;;){if(i!=null&&n.type.is(i))return r;if(n.type.is(t)&&r.push(n.node),!n.nextSibling())return i==null?r:[]}}function ca(s,t,e=t.length-1){for(let i=s;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var da=class{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}},hs=class s extends Fr{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new s(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&kt.ExcludeBuffers)return null;let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new s(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new s(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new s(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,r=i.buffer[this.index+3];if(r>n){let o=i.buffer[this.index+1];t.push(i.slice(n,r,o)),e.push(0)}return new Dt(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function xc(s){if(!s.length)return null;let t=0,e=s[0];for(let r=1;re.from||o.to=t){let l=new Ee(o.tree,o.overlay[0].from+r.from,-1,r);(n||(n=[i])).push(as(l,t,e,!1))}}return n?xc(n):i}var fs=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof Ee)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[t]],this.from=i+n.buffer[t+1],this.to=i+n.buffer[t+2],!0}yield(t){return t?t instanceof Ee?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:n}=this.buffer,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&kt.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&kt.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&kt.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(e.findChild(n,this.index,-1,0,4))}else{let n=e.buffer[this.index+3];if(n<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:n}=this;if(n){if(t>0){if(this.index-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&kt.IncludeAnonymous||l instanceof pi||!l.type.isAnonymous||ma(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==n){if(n==this.index)return o;e=o,i=r+1;break t}n=this.stack[--r]}for(let n=i;n=0;r--){if(r<0)return ca(this._tree,t,n);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[n]&&t[n]!=o.name)return!1;n--}}return!0}};function ma(s){return s.children.some(t=>t instanceof pi||!t.type.isAnonymous||ma(t))}function r0(s){var t;let{buffer:e,nodeSet:i,maxBufferLength:n=1024,reused:r=[],minRepeatType:o=i.types.length}=s,l=Array.isArray(e)?new ua(e,e.length):e,a=i.types,h=0,f=0;function u(x,S,k,P,R,z){let{id:E,start:M,end:H,size:F}=l,q=f,St=h;for(;F<0;)if(l.next(),F==-1){let vt=r[E];k.push(vt),P.push(M-x);return}else if(F==-3){h=E;return}else if(F==-4){f=E;return}else throw new RangeError(`Unrecognized record size: ${F}`);let pe=a[E],qe,Nt,Ln=M-x;if(H-M<=n&&(Nt=m(l.pos-S,R))){let vt=new Uint16Array(Nt.size-Nt.skip),rt=l.pos-Nt.size,ft=vt.length;for(;l.pos>rt;)ft=b(Nt.start,vt,ft);qe=new pi(vt,H-Nt.start,i),Ln=Nt.start-x}else{let vt=l.pos-F;l.next();let rt=[],ft=[],Bt=E>=o?E:-1,qt=0,je=H;for(;l.pos>vt;)Bt>=0&&l.id==Bt&&l.size>=0?(l.end<=je-n&&(p(rt,ft,M,qt,l.end,je,Bt,q,St),qt=rt.length,je=l.end),l.next()):z>2500?c(M,vt,rt,ft):u(M,vt,rt,ft,Bt,z+1);if(Bt>=0&&qt>0&&qt-1&&qt>0){let Hn=d(pe,St);qe=ba(pe,rt,ft,0,rt.length,0,H-M,Hn,Hn)}else qe=g(pe,rt,ft,H-M,q-H,St)}k.push(qe),P.push(Ln)}function c(x,S,k,P){let R=[],z=0,E=-1;for(;l.pos>S;){let{id:M,start:H,end:F,size:q}=l;if(q>4)l.next();else{if(E>-1&&H=0;F-=3)M[q++]=R[F],M[q++]=R[F+1]-H,M[q++]=R[F+2]-H,M[q++]=q;k.push(new pi(M,R[2]-H,i)),P.push(H-x)}}function d(x,S){return(k,P,R)=>{let z=0,E=k.length-1,M,H;if(E>=0&&(M=k[E])instanceof Dt){if(!E&&M.type==x&&M.length==R)return M;(H=M.prop(Q.lookAhead))&&(z=P[E]+M.length+H)}return g(x,k,P,R,z,S)}}function p(x,S,k,P,R,z,E,M,H){let F=[],q=[];for(;x.length>P;)F.push(x.pop()),q.push(S.pop()+k-R);x.push(g(i.types[E],F,q,z-R,M-z,H)),S.push(R-k)}function g(x,S,k,P,R,z,E){if(z){let M=[Q.contextHash,z];E=E?[M].concat(E):[M]}if(R>25){let M=[Q.lookAhead,R];E=E?[M].concat(E):[M]}return new Dt(x,S,k,P,E)}function m(x,S){let k=l.fork(),P=0,R=0,z=0,E=k.end-n,M={size:0,start:0,skip:0};t:for(let H=k.pos-x;k.pos>H;){let F=k.size;if(k.id==S&&F>=0){M.size=P,M.start=R,M.skip=z,z+=4,P+=4,k.next();continue}let q=k.pos-F;if(F<0||q=o?4:0,pe=k.start;for(k.next();k.pos>q;){if(k.size<0)if(k.size==-3)St+=4;else break t;else k.id>=o&&(St+=4);k.next()}R=pe,P+=F,z+=St}return(S<0||P==x)&&(M.size=P,M.start=R,M.skip=z),M.size>4?M:void 0}function b(x,S,k){let{id:P,start:R,end:z,size:E}=l;if(l.next(),E>=0&&P4){let H=l.pos-(E-4);for(;l.pos>H;)k=b(x,S,k)}S[--k]=M,S[--k]=z-x,S[--k]=R-x,S[--k]=P}else E==-3?h=P:E==-4&&(f=P);return k}let w=[],y=[];for(;l.pos>0;)u(s.start||0,s.bufferStart||0,w,y,-1,0);let v=(t=s.length)!==null&&t!==void 0?t:w.length?y[0]+w[0].length:0;return new Dt(a[s.topID],w.reverse(),y.reverse(),v)}var vc=new WeakMap;function Hr(s,t){if(!s.isAnonymous||t instanceof pi||t.type!=s)return 1;let e=vc.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=s||!(i instanceof Dt)){e=1;break}e+=Hr(s,i)}vc.set(t,e)}return e}function ba(s,t,e,i,n,r,o,l,a){let h=0;for(let p=i;p=f)break;S+=k}if(y==v+1){if(S>f){let k=p[v];d(k.children,k.positions,0,k.children.length,g[v]+w);continue}u.push(p[v])}else{let k=g[y-1]+p[y-1].length-x;u.push(ba(s,p,g,v,y,x,k,null,a))}c.push(x+w-r)}}return d(t,e,i,n,0),(l||a)(u,c,o)}var we=class s{constructor(t,e,i,n,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let n=[new s(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&n.push(r);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l=i)for(;o&&o.from=c.from||u<=c.to||h){let d=Math.max(c.from,a)-h,p=Math.min(c.to,u)-h;c=d>=p?null:new s(d,p,c.tree,c.offset+h,l>0,!!f)}if(c&&n.push(c),o.to>u)break;o=rnew ls(n.from,n.to)):[new ls(0,0)]:[new ls(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let r=n.advance();if(r)return r}}},ga=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var Py=new Q({perNode:!0});var o0=0,ye=class s{constructor(t,e,i,n){this.name=t,this.set=e,this.base=i,this.modified=n,this.id=o0++}toString(){let{name:t}=this;for(let e of this.modified)e.name&&(t=`${e.name}(${t})`);return t}static define(t,e){let i=typeof t=="string"?t:"?";if(t instanceof s&&(e=t),e!=null&&e.base)throw new Error("Can not derive from a modified tag");let n=new s(i,[],null,[]);if(n.set.push(n),e)for(let r of e.set)n.set.push(r);return n}static defineModifier(t){let e=new Ur(t);return i=>i.modified.indexOf(e)>-1?i:Ur.get(i.base||i,i.modified.concat(e).sort((n,r)=>n.id-r.id))}},l0=0,Ur=class s{constructor(t){this.name=t,this.instances=[],this.id=l0++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&a0(e,l.modified));if(i)return i;let n=[],r=new ye(t.name,n,t,e);for(let l of e)l.instances.push(r);let o=h0(e);for(let l of t.set)if(!l.modified.length)for(let a of o)n.push(s.get(l,a));return r}};function a0(s,t){return s.length==t.length&&s.every((e,i)=>e==t[i])}function h0(s){let t=[[]];for(let e=0;ei.length-e.length)}var By=new Q,qr=class{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth{let o=n;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var A=ye.define,zr=A(),gi=A(),Sc=A(gi),Cc=A(gi),mi=A(),Wr=A(mi),wa=A(mi),Pe=A(),Li=A(Pe),De=A(),Re=A(),ya=A(),us=A(ya),Gr=A(),O={comment:zr,lineComment:A(zr),blockComment:A(zr),docComment:A(zr),name:gi,variableName:A(gi),typeName:Sc,tagName:A(Sc),propertyName:Cc,attributeName:A(Cc),className:A(gi),labelName:A(gi),namespace:A(gi),macroName:A(gi),literal:mi,string:Wr,docString:A(Wr),character:A(Wr),attributeValue:A(Wr),number:wa,integer:A(wa),float:A(wa),bool:A(mi),regexp:A(mi),escape:A(mi),color:A(mi),url:A(mi),keyword:De,self:A(De),null:A(De),atom:A(De),unit:A(De),modifier:A(De),operatorKeyword:A(De),controlKeyword:A(De),definitionKeyword:A(De),moduleKeyword:A(De),operator:Re,derefOperator:A(Re),arithmeticOperator:A(Re),logicOperator:A(Re),bitwiseOperator:A(Re),compareOperator:A(Re),updateOperator:A(Re),definitionOperator:A(Re),typeOperator:A(Re),controlOperator:A(Re),punctuation:ya,separator:A(ya),bracket:us,angleBracket:A(us),squareBracket:A(us),paren:A(us),brace:A(us),content:Pe,heading:Li,heading1:A(Li),heading2:A(Li),heading3:A(Li),heading4:A(Li),heading5:A(Li),heading6:A(Li),contentSeparator:A(Pe),list:A(Pe),quote:A(Pe),emphasis:A(Pe),strong:A(Pe),link:A(Pe),monospace:A(Pe),strikethrough:A(Pe),inserted:A(),deleted:A(),changed:A(),invalid:A(),meta:Gr,documentMeta:A(Gr),annotation:A(Gr),processingInstruction:A(Gr),definition:ye.defineModifier("definition"),constant:ye.defineModifier("constant"),function:ye.defineModifier("function"),standard:ye.defineModifier("standard"),local:ye.defineModifier("local"),special:ye.defineModifier("special")};for(let s in O){let t=O[s];t instanceof ye&&(t.name=s)}var Ly=va([{tag:O.link,class:"tok-link"},{tag:O.heading,class:"tok-heading"},{tag:O.emphasis,class:"tok-emphasis"},{tag:O.strong,class:"tok-strong"},{tag:O.keyword,class:"tok-keyword"},{tag:O.atom,class:"tok-atom"},{tag:O.bool,class:"tok-bool"},{tag:O.url,class:"tok-url"},{tag:O.labelName,class:"tok-labelName"},{tag:O.inserted,class:"tok-inserted"},{tag:O.deleted,class:"tok-deleted"},{tag:O.literal,class:"tok-literal"},{tag:O.string,class:"tok-string"},{tag:O.number,class:"tok-number"},{tag:[O.regexp,O.escape,O.special(O.string)],class:"tok-string2"},{tag:O.variableName,class:"tok-variableName"},{tag:O.local(O.variableName),class:"tok-variableName tok-local"},{tag:O.definition(O.variableName),class:"tok-variableName tok-definition"},{tag:O.special(O.variableName),class:"tok-variableName2"},{tag:O.definition(O.propertyName),class:"tok-propertyName tok-definition"},{tag:O.typeName,class:"tok-typeName"},{tag:O.namespace,class:"tok-namespace"},{tag:O.className,class:"tok-className"},{tag:O.macroName,class:"tok-macroName"},{tag:O.propertyName,class:"tok-propertyName"},{tag:O.operator,class:"tok-operator"},{tag:O.comment,class:"tok-comment"},{tag:O.meta,class:"tok-meta"},{tag:O.invalid,class:"tok-invalid"},{tag:O.punctuation,class:"tok-punctuation"}]);var ka,ds=new Q;var f0=new Q,he=class{constructor(t,e,i=[],n=""){this.data=t,this.name=n,ut.prototype.hasOwnProperty("tree")||Object.defineProperty(ut.prototype,"tree",{get(){return Sa(this)}}),this.parser=e,this.extension=[pn.of(this),ut.languageData.of((r,o,l)=>{let a=Mc(r,o,l),h=a.type.prop(ds);if(!h)return[];let f=r.facet(h),u=a.type.prop(f0);if(u){let c=a.resolve(o-a.from,l);for(let d of u)if(d.test(c,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Mc(t,e,i).type.prop(ds)==this.data}findRegions(t){let e=t.facet(pn);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(r,o)=>{if(r.prop(ds)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(Q.mounted);if(l){if(l.tree.prop(ds)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(n(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;a=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},cs=null,Ca=class s{constructor(t,e,i=[],n,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new s(t,e,[],Dt.empty,0,i,[],null)}startParse(){return this.parser.startParse(new ps(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=Dt.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let n=Date.now()+t;t=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(we.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=cs;cs=this;try{return t()}finally{cs=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=Ac(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,u,c)=>a.push({fromA:h,toA:f,fromB:u,toB:c})),i=we.applyChanges(i,a),n=Dt.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),u=t.mapPos(h.to,-1);ft.from&&(this.fragments=Ac(this.fragments,n,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends Vr{createParse(e,i,n){let r=n[0].from,o=n[n.length-1].to;return{parsedPos:r,advance(){let a=cs;if(a){for(let h of n)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new Dt(ae.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return cs}};function Ac(s,t,e){return we.applyChanges(s,[{fromA:t,toA:e,fromB:t,toB:e}])}var gs=class s{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new s(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=Ca.create(t.facet(pn).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new s(i)}};he.state=Ct.define({create:gs.init,update(s,t){for(let e of t.effects)if(e.is(he.setState))return e.value;return t.startState.facet(pn)!=t.state.facet(pn)?gs.init(t.state):s.apply(t)}});var Tc=s=>{let t=setTimeout(()=>s(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Tc=s=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(s,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var xa=typeof navigator!="undefined"&&(!((ka=navigator.scheduling)===null||ka===void 0)&&ka.isInputPending)?()=>navigator.scheduling.isInputPending():null,u0=Je.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(he.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(he.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Tc(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,a=r.context.work(()=>xa&&xa()||Date.now()>o,n+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:he.setState.of(new gs(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>ge(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),pn=L.define({combine(s){return s.length?s[0]:null},enables:s=>[he.state,u0,G.contentAttributes.compute([s],t=>{let e=t.facet(s);return e&&e.name?{"data-language":e.name}:{}})]});var Ma=class s{constructor(t,e){this.specs=t;let i;function n(l){let a=re.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?n(e.all):void 0,o=e.scope;this.scope=o instanceof he?l=>l.prop(ds)==o.data:o?l=>l==o:void 0,this.style=va(t.map(l=>({tag:l.tag,class:l.class||n(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new re(i):null,this.themeType=e.themeType}static define(t,e){return new s(t,e||{})}};var Ky=Ma.define([{tag:O.meta,color:"#404740"},{tag:O.link,textDecoration:"underline"},{tag:O.heading,textDecoration:"underline",fontWeight:"bold"},{tag:O.emphasis,fontStyle:"italic"},{tag:O.strong,fontWeight:"bold"},{tag:O.strikethrough,textDecoration:"line-through"},{tag:O.keyword,color:"#708"},{tag:[O.atom,O.bool,O.url,O.contentSeparator,O.labelName],color:"#219"},{tag:[O.literal,O.inserted],color:"#164"},{tag:[O.string,O.deleted],color:"#a11"},{tag:[O.regexp,O.escape,O.special(O.string)],color:"#e40"},{tag:O.definition(O.variableName),color:"#00f"},{tag:O.local(O.variableName),color:"#30a"},{tag:[O.typeName,O.namespace],color:"#085"},{tag:O.className,color:"#167"},{tag:[O.special(O.variableName),O.macroName],color:"#256"},{tag:O.definition(O.propertyName),color:"#00c"},{tag:O.comment,color:"#940"},{tag:O.invalid,color:"#f00"}]);var Yy=[ae.none];var Xy={rtl:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:gt.RTL}),ltr:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:gt.LTR}),auto:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var fe;(e=>{})(fe||(fe={}));var gn=L.define({combine:s=>s[0]}),Oc=new se,o1=L.define({combine:s=>s[0]}),l1=new se,c0=L.define({combine:s=>s[0]}),a1=new se,d0=L.define({combine:s=>s[0]}),h1=new se,f1=new se,Aa=ot.define();var p0=0,ms=class{constructor(t,e){this.from=t,this.to=e}},j=class{constructor(t={}){this.id=p0++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=Rt.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};j.closedBy=new j({deserialize:s=>s.split(" ")});j.openedBy=new j({deserialize:s=>s.split(" ")});j.group=new j({deserialize:s=>s.split(" ")});j.isolate=new j({deserialize:s=>{if(s&&s!="rtl"&&s!="ltr"&&s!="auto")throw new RangeError("Invalid value for isolate: "+s);return s||"auto"}});j.contextHash=new j({perNode:!0});j.lookAhead=new j({perNode:!0});j.mounted=new j({perNode:!0});var mn=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[j.mounted.id]}},g0=Object.create(null),Rt=class s{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):g0,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),n=new s(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(n)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return n}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(j.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return i=>{for(let n=i.prop(j.group),r=-1;r<(n?n.length:0);r++){let o=e[r<0?i.name:n[r]];if(o)return o}}}};Rt.none=new Rt("",Object.create(null),0,8);var bs=class s{constructor(t){this.types=t;for(let e=0;e0;for(let a=this.cursor(o|mt.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=n&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:Pa(Rt.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,n)=>new s(this.type,e,i,n,this.propValues),t.makeTree||((e,i,n)=>new s(Rt.none,e,i,n)))}static build(t){return b0(t)}};ct.empty=new ct(Rt.none,[],[],0);var Ta=class s{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new s(this.buffer,this.index)}},bi=class s{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return Rt.none}toString(){let t=[];for(let e=0;e0));a=o[a+3]);return l}slice(t,e,i){let n=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l=t&&et;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function ws(s,t,e,i){for(var n;s.from==s.to||(e<1?s.from>=t:s.from>t)||(e>-1?s.to<=t:s.to0?l.length:-1;t!=h;t+=e){let f=l[t],u=a[t]+o.from;if(Rc(n,i,u,u+f.length)){if(f instanceof bi){if(r&mt.ExcludeBuffers)continue;let c=f.findChild(0,f.buffer.length,e,i-u,n);if(c>-1)return new ys(new _a(o,f,t,u),null,c)}else if(r&mt.IncludeAnonymous||!f.type.isAnonymous||Ra(f)){let c;if(!(r&mt.IgnoreMounts)&&(c=mn.get(f))&&!c.overlay)return new s(c.tree,u,t,o);let d=new s(f,u,t,o);return r&mt.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,n)}}}if(r&mt.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&mt.IgnoreOverlays)&&(n=mn.get(this._tree))&&n.overlay){let r=t-this.from;for(let{from:o,to:l}of n.overlay)if((e>0?o<=r:o=r:l>r))return new s(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Ec(s,t,e,i){let n=s.cursor(),r=[];if(!n.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=n.type.is(e),!n.nextSibling())return r}for(;;){if(i!=null&&n.type.is(i))return r;if(n.type.is(t)&&r.push(n.node),!n.nextSibling())return i==null?r:[]}}function Oa(s,t,e=t.length-1){for(let i=s;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var _a=class{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}},ys=class s extends Kr{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new s(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&mt.ExcludeBuffers)return null;let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new s(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new s(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new s(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,r=i.buffer[this.index+3];if(r>n){let o=i.buffer[this.index+1];t.push(i.slice(n,r,o)),e.push(0)}return new ct(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Pc(s){if(!s.length)return null;let t=0,e=s[0];for(let r=1;re.from||o.to=t){let l=new Ie(o.tree,o.overlay[0].from+r.from,-1,r);(n||(n=[i])).push(ws(l,t,e,!1))}}return n?Pc(n):i}var vs=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof Ie)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[t]],this.from=i+n.buffer[t+1],this.to=i+n.buffer[t+2],!0}yield(t){return t?t instanceof Ie?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:n}=this.buffer,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&mt.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&mt.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&mt.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(e.findChild(n,this.index,-1,0,4))}else{let n=e.buffer[this.index+3];if(n<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:n}=this;if(n){if(t>0){if(this.index-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&mt.IncludeAnonymous||l instanceof bi||!l.type.isAnonymous||Ra(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==n){if(n==this.index)return o;e=o,i=r+1;break t}n=this.stack[--r]}for(let n=i;n=0;r--){if(r<0)return Oa(this._tree,t,n);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[n]&&t[n]!=o.name)return!1;n--}}return!0}};function Ra(s){return s.children.some(t=>t instanceof bi||!t.type.isAnonymous||Ra(t))}function b0(s){var t;let{buffer:e,nodeSet:i,maxBufferLength:n=1024,reused:r=[],minRepeatType:o=i.types.length}=s,l=Array.isArray(e)?new Ta(e,e.length):e,a=i.types,h=0,f=0;function u(x,S,k,P,R,z){let{id:E,start:M,end:H,size:F}=l,q=f,St=h;for(;F<0;)if(l.next(),F==-1){let vt=r[E];k.push(vt),P.push(M-x);return}else if(F==-3){h=E;return}else if(F==-4){f=E;return}else throw new RangeError(`Unrecognized record size: ${F}`);let pe=a[E],qe,Nt,Ln=M-x;if(H-M<=n&&(Nt=m(l.pos-S,R))){let vt=new Uint16Array(Nt.size-Nt.skip),rt=l.pos-Nt.size,ft=vt.length;for(;l.pos>rt;)ft=b(Nt.start,vt,ft);qe=new bi(vt,H-Nt.start,i),Ln=Nt.start-x}else{let vt=l.pos-F;l.next();let rt=[],ft=[],Bt=E>=o?E:-1,qt=0,je=H;for(;l.pos>vt;)Bt>=0&&l.id==Bt&&l.size>=0?(l.end<=je-n&&(p(rt,ft,M,qt,l.end,je,Bt,q,St),qt=rt.length,je=l.end),l.next()):z>2500?c(M,vt,rt,ft):u(M,vt,rt,ft,Bt,z+1);if(Bt>=0&&qt>0&&qt-1&&qt>0){let Hn=d(pe,St);qe=Pa(pe,rt,ft,0,rt.length,0,H-M,Hn,Hn)}else qe=g(pe,rt,ft,H-M,q-H,St)}k.push(qe),P.push(Ln)}function c(x,S,k,P){let R=[],z=0,E=-1;for(;l.pos>S;){let{id:M,start:H,end:F,size:q}=l;if(q>4)l.next();else{if(E>-1&&H=0;F-=3)M[q++]=R[F],M[q++]=R[F+1]-H,M[q++]=R[F+2]-H,M[q++]=q;k.push(new bi(M,R[2]-H,i)),P.push(H-x)}}function d(x,S){return(k,P,R)=>{let z=0,E=k.length-1,M,H;if(E>=0&&(M=k[E])instanceof ct){if(!E&&M.type==x&&M.length==R)return M;(H=M.prop(j.lookAhead))&&(z=P[E]+M.length+H)}return g(x,k,P,R,z,S)}}function p(x,S,k,P,R,z,E,M,H){let F=[],q=[];for(;x.length>P;)F.push(x.pop()),q.push(S.pop()+k-R);x.push(g(i.types[E],F,q,z-R,M-z,H)),S.push(R-k)}function g(x,S,k,P,R,z,E){if(z){let M=[j.contextHash,z];E=E?[M].concat(E):[M]}if(R>25){let M=[j.lookAhead,R];E=E?[M].concat(E):[M]}return new ct(x,S,k,P,E)}function m(x,S){let k=l.fork(),P=0,R=0,z=0,E=k.end-n,M={size:0,start:0,skip:0};t:for(let H=k.pos-x;k.pos>H;){let F=k.size;if(k.id==S&&F>=0){M.size=P,M.start=R,M.skip=z,z+=4,P+=4,k.next();continue}let q=k.pos-F;if(F<0||q=o?4:0,pe=k.start;for(k.next();k.pos>q;){if(k.size<0)if(k.size==-3)St+=4;else break t;else k.id>=o&&(St+=4);k.next()}R=pe,P+=F,z+=St}return(S<0||P==x)&&(M.size=P,M.start=R,M.skip=z),M.size>4?M:void 0}function b(x,S,k){let{id:P,start:R,end:z,size:E}=l;if(l.next(),E>=0&&P4){let H=l.pos-(E-4);for(;l.pos>H;)k=b(x,S,k)}S[--k]=M,S[--k]=z-x,S[--k]=R-x,S[--k]=P}else E==-3?h=P:E==-4&&(f=P);return k}let w=[],y=[];for(;l.pos>0;)u(s.start||0,s.bufferStart||0,w,y,-1,0);let v=(t=s.length)!==null&&t!==void 0?t:w.length?y[0]+w[0].length:0;return new ct(a[s.topID],w.reverse(),y.reverse(),v)}var Dc=new WeakMap;function $r(s,t){if(!s.isAnonymous||t instanceof bi||t.type!=s)return 1;let e=Dc.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=s||!(i instanceof ct)){e=1;break}e+=$r(s,i)}Dc.set(t,e)}return e}function Pa(s,t,e,i,n,r,o,l,a){let h=0;for(let p=i;p=f)break;S+=k}if(y==v+1){if(S>f){let k=p[v];d(k.children,k.positions,0,k.children.length,g[v]+w);continue}u.push(p[v])}else{let k=g[y-1]+p[y-1].length-x;u.push(Pa(s,p,g,v,y,x,k,null,a))}c.push(x+w-r)}}return d(t,e,i,n,0),(l||a)(u,c,o)}var Hi=class s{constructor(t,e,i,n,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let n=[new s(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&n.push(r);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l=i)for(;o&&o.from=c.from||u<=c.to||h){let d=Math.max(c.from,a)-h,p=Math.min(c.to,u)-h;c=d>=p?null:new s(d,p,c.tree,c.offset+h,l>0,!!f)}if(c&&n.push(c),o.to>u)break;o=rnew ms(n.from,n.to)):[new ms(0,0)]:[new ms(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let r=n.advance();if(r)return r}}},Da=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var c1=new j({perNode:!0});var K=class s{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=Sn(this,t,e);let n=[];return this.decompose(0,t,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(e,this.length,n,1),yn.from(n,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=Sn(this,t,e);let i=[];return this.decompose(t,e,i,0),yn.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new zi(this),r=new zi(t);for(let o=e,l=e;;){if(n.next(o),r.next(o),o=0,n.lineBreak!=r.lineBreak||n.done!=r.done||n.value!=r.value)return!1;if(l+=n.value.length,n.done||l>=i)return!0}}iter(t=1){return new zi(this,t)}iterRange(t,e=this.length){return new Zr(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new to(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?s.empty:t.length<=32?new Jt(t):yn.from(Jt.split(t,[]))}},Jt=class s extends K{constructor(t,e=w0(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.text[r],l=n+o.length;if((e?i:l)>=t)return new Na(n,l,i,o);n=l+1,i++}}decompose(t,e,i,n){let r=t<=0&&e>=this.length?this:new s(Ic(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(n&1){let o=i.pop(),l=Jr(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new s(l,o.length+r.length));else{let a=l.length>>1;i.push(new s(l.slice(0,a)),new s(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof s))return super.replace(t,e,i);[t,e]=Sn(this,t,e);let n=Jr(this.text,Jr(i.text,Ic(this.text,0,t)),e),r=this.length+i.length-(e-t);return n.length<=32?new s(n,r):yn.from(s.split(n,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=Sn(this,t,e);let n="";for(let r=0,o=0;r<=e&&ot&&o&&(n+=i),tr&&(n+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],n=-1;for(let r of t)i.push(r),n+=r.length+1,i.length==32&&(e.push(new s(i,n)),i=[],n=-1);return n>-1&&e.push(new s(i,n)),e}},yn=class s extends K{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.children[r],l=n+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,n);n=l+1,i=a+1}}decompose(t,e,i,n){for(let r=0,o=0;o<=e&&r=o){let h=n&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=Sn(this,t,e),i.lines=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let f=this.children.slice();return f[n]=a,new s(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=Sn(this,t,e);let n="";for(let r=0,o=0;rt&&r&&(n+=i),to&&(n+=l.sliceString(t-o,e-o,i)),o=a+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof s))return 0;let i=0,[n,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;n+=e,r+=e){if(n==o||r==l)return i;let a=this.children[n],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new Jt(d,e)}let n=Math.max(32,i>>5),r=n<<1,o=n>>1,l=[],a=0,h=-1,f=[];function u(d){let p;if(d.lines>r&&d instanceof s)for(let g of d.children)u(g);else d.lines>o&&(a>o||!a)?(c(),l.push(d)):d instanceof Jt&&a&&(p=f[f.length-1])instanceof Jt&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new Jt(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>n&&c(),a+=d.lines,h+=d.length+1,f.push(d))}function c(){a!=0&&(l.push(f.length==1?f[0]:s.from(f,h)),h=-1,a=f.length=0)}for(let d of t)u(d);return c(),l.length==1?l[0]:new s(l,e)}};K.empty=new Jt([""],0);function w0(s){let t=-1;for(let e of s)t+=e.length+1;return t}function Jr(s,t,e=0,i=1e9){for(let n=0,r=0,o=!0;r=e&&(a>i&&(l=l.slice(0,i-n)),n0?1:(t instanceof Jt?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],r=this.offsets[i],o=r>>1,l=n instanceof Jt?n.text.length:n.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(n instanceof Jt){let a=n.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=n.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof Jt?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},Zr=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new zi(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},to=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&(K.prototype[Symbol.iterator]=function(){return this.iter()},zi.prototype[Symbol.iterator]=Zr.prototype[Symbol.iterator]=to.prototype[Symbol.iterator]=function(){return this});var Na=class{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}};function Sn(s,t,e){return t=Math.max(0,Math.min(s.length,t)),[t,Math.max(t,Math.min(s.length,e))]}var vn="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(s=>s?parseInt(s,36):1);for(let s=1;ss)return vn[t-1]<=s;return!1}function Nc(s){return s>=127462&&s<=127487}var Bc=8205;function Be(s,t,e=!0,i=!0){return(e?Wc:v0)(s,t,i)}function Wc(s,t,e){if(t==s.length)return t;t&&Gc(s.charCodeAt(t))&&Uc(s.charCodeAt(t-1))&&t--;let i=Qr(s,t);for(t+=Ba(i);t=0&&Nc(Qr(s,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function v0(s,t,e){for(;t>0;){let i=Wc(s,t-2,e);if(i=56320&&s<57344}function Uc(s){return s>=55296&&s<56320}function Qr(s,t){let e=s.charCodeAt(t);if(!Uc(e)||t+1==s.length)return e;let i=s.charCodeAt(t+1);return Gc(i)?(e-55296<<10)+(i-56320)+65536:e}function Ba(s){return s<65536?1:2}var La=/\\r\\n?|\\n/,Gt=function(s){return s[s.Simple=0]="Simple",s[s.TrackDel=1]="TrackDel",s[s.TrackBefore=2]="TrackBefore",s[s.TrackAfter=3]="TrackAfter",s}(Gt||(Gt={})),Wi=class s{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return r+(t-n);r+=l}else{if(i!=Gt.Simple&&h>=t&&(i==Gt.TrackDel&&nt||i==Gt.TrackBefore&&nt))return null;if(h>t||h==t&&e<0&&!l)return t==n||e<0?r:r+a;r+=a}n=h}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return r}touchesRange(t,e=t){for(let i=0,n=0;i=0&&n<=e&&l>=t)return ne?"cover":!0;n=l}return!1}toString(){let t="";for(let e=0;e=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new s(t)}static create(t){return new s(t)}},Qt=class s extends Wi{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return Ha(this,(e,i,n,r,o)=>t=t.replace(n,n+(i-e),o),!1),t}mapDesc(t,e=!1){return Fa(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let n=0,r=0;n=0){e[n]=l,e[n+1]=o;let a=n>>1;for(;i.length0&&wi(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l>1].toJSON()))}return t}static of(t,e,i){let n=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!n.length)return;oc||u<0||c>e)throw new RangeError(`Invalid change range ${u} to ${c} (in doc of length ${e})`);let p=d?typeof d=="string"?K.of(d.split(i||La)):d:K.empty,g=p.length;if(u==c&&g==0)return;uo&&Pt(n,u-o,-1),Pt(n,c-u,g),wi(r,n,p),o=c}}return h(t),a(!l),l}static empty(t){return new s(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let n=0;nl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length=0&&e<=0&&e==s[n+1]?s[n]+=t:t==0&&s[n]==0?s[n+1]+=e:i?(s[n]+=t,s[n+1]+=e):s.push(t,e)}function wi(s,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i>1])),!(e||o==s.sections.length||s.sections[o+1]<0);)l=s.sections[o++],a=s.sections[o++];t(n,h,r,f,u),n=h,r=f}}}function Fa(s,t,e,i=!1){let n=[],r=i?[]:null,o=new Gi(s),l=new Gi(t);for(let a=-1;;)if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);Pt(n,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let u=Math.min(f,l.len);h+=u,f-=u,l.forward(u)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var Gi=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return e>=t.length?K.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?K.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},wn=class s{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new s(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return V.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return V.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return V.range(t.anchor,t.head)}static create(t,e,i){return new s(t,e,i)}},V=class s{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:s.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new s(t.ranges.map(e=>wn.fromJSON(e)),t.main)}static single(t,e=t){return new s([s.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nt?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((n,r)=>n.from-r.from),e=t.indexOf(i);for(let n=1;nr.head?s.range(a,l):s.range(l,a))}}return new s(t,e)}};function jc(s,t){for(let e of s.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var Ya=0,U=class s{constructor(t,e,i,n,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=Ya++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new s(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:Xa),!!t.static,t.enables)}of(t){return new kn([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new kn(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new kn(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function Xa(s,t){return s==t||s.length==t.length&&s.every((e,i)=>e===t[i])}var kn=class{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=Ya++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let u of this.dependencies)u=="doc"?a=!0:u=="selection"?h=!0:(((e=t[u.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[u.id]);return{create(u){return u.values[o]=i(u),1},update(u,c){if(a&&c.docChanged||h&&(c.docChanged||c.selection)||Va(u,f)){let d=i(u);if(l?!Lc(d,u.values[o],n):!n(d,u.values[o]))return u.values[o]=d,1}return 0},reconfigure:(u,c)=>{let d,p=c.config.address[r];if(p!=null){let g=so(c,p);if(this.dependencies.every(m=>m instanceof U?c.facet(m)===u.facet(m):m instanceof Qe?c.field(m,!1)==u.field(m,!1):!0)||(l?Lc(d=i(u),g,n):n(d=i(u),g)))return u.values[o]=g,0}else d=i(u);return u.values[o]=d,1}}}};function Lc(s,t,e){if(s.length!=t.length)return!1;for(let i=0;is[a.id]),n=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=s[t.id]>>1;function l(a){let h=[];for(let f=0;fi===n),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(Hc).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,n)=>{let r=i.values[e],o=this.updateF(r,n);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,n)=>n.config.address[this.id]!=null?(i.values[e]=n.field(this),0):(i.values[e]=this.create(i),1)}}init(t){return[this,Hc.of({field:this,create:t})]}get extension(){return this}},Fi={lowest:4,low:3,default:2,high:1,highest:0};function ks(s){return t=>new eo(t,s)}var Ja={highest:ks(Fi.highest),high:ks(Fi.high),default:ks(Fi.default),low:ks(Fi.low),lowest:ks(Fi.lowest)},eo=class{constructor(t,e){this.inner=t,this.prec=e}},io=class s{of(t){return new Ss(this,t)}reconfigure(t){return s.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},Ss=class{constructor(t,e){this.compartment=t,this.inner=e}},no=class s{constructor(t,e,i,n,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let n=[],r=Object.create(null),o=new Map;for(let c of x0(t,e,o))c instanceof Qe?n.push(c):(r[c.facet.id]||(r[c.facet.id]=[])).push(c);let l=Object.create(null),a=[],h=[];for(let c of n)l[c.id]=h.length<<1,h.push(d=>c.slot(d));let f=i==null?void 0:i.config.facets;for(let c in r){let d=r[c],p=d[0].facet,g=f&&f[c]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,Xa(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>k0(m,p,d))}}let u=h.map(c=>c(l));return new s(t,o,u,l,a,r)}};function x0(s,t,e){let i=[[],[],[],[],[]],n=new Map;function r(o,l){let a=n.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof Ss&&e.delete(o.compartment)}if(n.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof Ss){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof eo)r(o.inner,o.prec);else if(o instanceof Qe)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof kn)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Fi.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(s,Fi.default),i.reduce((o,l)=>o.concat(l))}function xs(s,t){if(t&1)return 2;let e=t>>1,i=s.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;s.status[e]=4;let n=s.computeSlot(s,s.config.dynamicSlots[e]);return s.status[e]=2|n}function so(s,t){return t&1?s.config.staticValues[t>>1]:s.values[t>>1]}var $c=U.define(),za=U.define({combine:s=>s.some(t=>t),static:!0}),Kc=U.define({combine:s=>s.length?s[0]:void 0,static:!0}),Yc=U.define(),Xc=U.define(),Jc=U.define(),Qc=U.define({combine:s=>s.length?s[0]:!1}),Ze=class{constructor(t,e){this.type=t,this.value=e}static define(){return new Wa}},Wa=class{of(t){return new Ze(this,t)}},Ga=class{constructor(t){this.map=t}of(t){return new bt(this,t)}},bt=class s{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new s(this.type,e)}is(t){return this.type==t}static define(t={}){return new Ga(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let r=n.map(e);r&&i.push(r)}return i}};bt.reconfigure=bt.define();bt.appendConfig=bt.define();var Ut=class s{constructor(t,e,i,n,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&jc(i,e.newLength),r.some(l=>l.type==s.time)||(this.annotations=r.concat(s.time.of(Date.now())))}static create(t,e,i,n,r,o){return new s(t,e,i,n,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(s.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};Ut.time=Ze.define();Ut.userEvent=Ze.define();Ut.addToHistory=Ze.define();Ut.remote=Ze.define();function S0(s,t){let e=[];for(let i=0,n=0;;){let r,o;if(i=s[i]))r=s[i++],o=s[i++];else if(n=0;n--){let r=i[n](s);r instanceof Ut?s=r:Array.isArray(r)&&r.length==1&&r[0]instanceof Ut?s=r[0]:s=td(t,xn(r),!1)}return s}function M0(s){let t=s.startState,e=t.facet(Jc),i=s;for(let n=e.length-1;n>=0;n--){let r=e[n](s);r&&Object.keys(r).length&&(i=Zc(i,Ua(t,r,s.changes.newLength),!0))}return i==s?s:Ut.create(t,s.changes,s.selection,i.effects,i.annotations,i.scrollIntoView)}var A0=[];function xn(s){return s==null?A0:Array.isArray(s)?s:[s]}var Ne=function(s){return s[s.Word=0]="Word",s[s.Space=1]="Space",s[s.Other=2]="Other",s}(Ne||(Ne={})),T0=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,qa;try{qa=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(s){}function O0(s){if(qa)return qa.test(s);for(let t=0;t"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||T0.test(e)))return!0}return!1}function _0(s){return t=>{if(!/\\S/.test(t))return Ne.Space;if(O0(t))return Ne.Word;for(let e=0;e-1)return Ne.Word;return Ne.Other}}var dt=class s{constructor(t,e,i,n,r,o){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ln.set(h,a)),e=null),n.set(l.value.compartment,l.value.extension)):l.is(bt.reconfigure)?(e=null,i=l.value):l.is(bt.appendConfig)&&(e=null,i=xn(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=no.resolve(i,n,this),r=new s(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(za)?t.newSelection:t.newSelection.asSingle();new s(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:V.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),r=[i.range],o=xn(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return s.create({doc:t.doc,selection:V.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(t={}){let e=no.resolve(t.extensions||[],new Map),i=t.doc instanceof K?t.doc:K.of((t.doc||"").split(e.staticFacet(s.lineSeparator)||La)),n=t.selection?t.selection instanceof V?t.selection:V.single(t.selection.anchor,t.selection.head):V.single(0);return jc(n,i.length),e.staticFacet(za)||(n=n.asSingle()),new s(e,i,n,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(s.tabSize)}get lineBreak(){return this.facet(s.lineSeparator)||`\n`}get readOnly(){return this.facet(Qc)}phrase(t,...e){for(let i of this.facet(s.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,n)=>{if(n=="$")return"$";let r=+(n||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let n=[];for(let r of this.facet($c))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&n.push(o[t]);return n}charCategorizer(t){return _0(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=Be(e,o,!1);if(r(e.slice(a,o))!=Ne.Word)break;o=a}for(;ls.length?s[0]:4});dt.lineSeparator=Kc;dt.readOnly=Qc;dt.phrases=U.define({compare(s,t){let e=Object.keys(s),i=Object.keys(t);return e.length==i.length&&e.every(n=>s[n]==t[n])}});dt.languageData=$c;dt.changeFilter=Yc;dt.transactionFilter=Xc;dt.transactionExtender=Jc;io.reconfigure=bt.define();var ti=class{eq(t){return this==t}range(t,e=t){return Cs.create(t,e,this)}};ti.prototype.startSide=ti.prototype.endSide=0;ti.prototype.point=!1;ti.prototype.mapMode=Gt.TrackDel;var Cs=class s{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new s(t,e,i)}};function ja(s,t){return s.from-t.from||s.value.startSide-t.value.startSide}var $a=class s{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let r=i?this.to:this.from;for(let o=n,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,n){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||c==d&&h.startSide>0&&h.endSide<=0)continue;(d-c||h.endSide-h.startSide)<0||(o<0&&(o=c),h.point&&(l=Math.max(l,d-c)),i.push(h),n.push(c-o),r.push(d-o))}return{mapped:i.length?new s(n,r,i,l):null,pos:o}}},wt=class s{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new s(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(ja)),this.isEmpty)return e.length?s.of(e):this;let l=new ro(this,null,-1).goto(0),a=0,h=[],f=new Cn;for(;l.value||a=0){let u=e[a++];f.addInner(u.from,u.to,u.value)||h.push(u)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return Ms.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Ms.from(t).goto(e)}static compare(t,e,i,n,r=-1){let o=t.filter(u=>u.maxPoint>0||!u.isEmpty&&u.maxPoint>=r),l=e.filter(u=>u.maxPoint>0||!u.isEmpty&&u.maxPoint>=r),a=Fc(o,l,i),h=new Vi(o,a,r),f=new Vi(l,a,r);i.iterGaps((u,c,d)=>Vc(h,u,f,c,d,n)),i.empty&&i.length==0&&Vc(h,0,f,0,0,n)}static eq(t,e,i=0,n){n==null&&(n=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=Fc(r,o),a=new Vi(r,l,0).goto(i),h=new Vi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!Ka(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>n)return!0;a.next(),h.next()}}static spans(t,e,i,n,r=-1){let o=new Vi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),u=o.pointFroml&&(n.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new Cn;for(let n of t instanceof Cs?[t]:e?E0(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return s.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=s.empty;n=n.nextLayer)e=new s(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}};wt.empty=new wt([],[],null,-1);function E0(s){if(s.length>1)for(let t=s[0],e=1;e0)return s.slice().sort(ja);t=i}return s}wt.empty.nextLayer=wt.empty;var Cn=class s{finishChunk(t){this.chunks.push(new $a(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new s)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(wt.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=wt.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function Fc(s,t,e){let i=new Map;for(let r of s)for(let o=0;o=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new ro(o,e,i,r));return n.length==1?n[0]:new s(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)Ia(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)Ia(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Ia(this.heap,0)}}};function Ia(s,t){for(let e=s[t];;){let i=(t<<1)+1;if(i>=s.length)break;let n=s[i];if(i+1=0&&(n=s[i+1],i++),e.compare(n)<0)break;s[i]=e,s[t]=n,t=i}}var Vi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Ms.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Yr(this.active,t),Yr(this.activeTo,t),Yr(this.activeRank,t),this.minActive=zc(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:r}=this.cursor;for(;e0;)e++;Xr(this.active,e,i),Xr(this.activeTo,e,n),Xr(this.activeRank,e,r),t&&Xr(t,e,this.cursor.from),this.minActive=zc(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&Yr(i,n)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function Vc(s,t,e,i,n,r){s.goto(t),e.goto(i);let o=i+n,l=i,a=i-t;for(;;){let h=s.to+a-e.to||s.endSide-e.endSide,f=h<0?s.to+a:e.to,u=Math.min(f,o);if(s.point||e.point?s.point&&e.point&&(s.point==e.point||s.point.eq(e.point))&&Ka(s.activeForPoint(s.to),e.activeForPoint(e.to))||r.comparePoint(l,u,s.point,e.point):u>l&&!Ka(s.active,e.active)&&r.compareRange(l,u,s.active,e.active),f>o)break;l=f,h<=0&&s.next(),h>=0&&e.next()}}function Ka(s,t){if(s.length!=t.length)return!1;for(let e=0;e=t;i--)s[i+1]=s[i];s[t]=e}function zc(s,t){let e=-1,i=1e9;for(let n=0;n=t)return n;if(n==s.length)break;r+=s.charCodeAt(n)==9?e-r%e:1,n=Be(s,n)}return i===!0?-1:s.length}var Qa="\\u037C",id=typeof Symbol=="undefined"?"__"+Qa:Symbol.for(Qa),Za=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),nd=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},ue=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],u=/^@(\\w+)\\b/.exec(o[0]),c=u&&u[1]=="keyframes";if(u&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!u)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(n(d),p,f,c)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||c)&&a.push((i&&!u&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(n(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=nd[id]||1;return nd[id]=t+1,Qa+t.toString(36)}static mount(t,e,i){let n=t[Za],r=i&&i.nonce;n?r&&n.setNonce(r):n=new th(t,r),n.mount(Array.isArray(e)?e:[e])}},sd=new Map,th=class{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let r=sd.get(i);if(r)return t.adoptedStyleSheets=[r.sheet,...t.adoptedStyleSheets],t[Za]=r;this.sheet=new n.CSSStyleSheet,t.adoptedStyleSheets=[this.sheet,...t.adoptedStyleSheets],sd.set(i,this)}else{this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);let r=t.head||t;r.insertBefore(this.styleTag,r.firstChild)}this.modules=[],t[Za]=this}mount(t){let e=this.sheet,i=0,n=0;for(let r=0;r-1&&(this.modules.splice(l,1),n--,l=-1),l==-1){if(this.modules.splice(n++,0,o),e)for(let a=0;a",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},m1=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),b1=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(yt=0;yt<10;yt++)Ui[48+yt]=Ui[96+yt]=String(yt);var yt;for(yt=1;yt<=24;yt++)Ui[yt+111]="F"+yt;var yt;for(yt=65;yt<=90;yt++)Ui[yt]=String.fromCharCode(yt+32),lo[yt]=String.fromCharCode(yt);var yt;for(oo in Ui)lo.hasOwnProperty(oo)||(lo[oo]=Ui[oo]);var oo;function yo(s){let t;return s.nodeType==11?t=s.getSelection?s:s.ownerDocument:t=s,t.getSelection()}function rh(s,t){return t?s==t||s.contains(t.nodeType!=1?t.parentNode:t):!1}function P0(s){let t=s.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}function mo(s,t){if(!t.anchorNode)return!1;try{return rh(s,t.anchorNode)}catch(e){return!1}}function Ns(s){return s.nodeType==3?qi(s,0,s.nodeValue.length).getClientRects():s.nodeType==1?s.getClientRects():[]}function Es(s,t,e,i){return e?rd(s,t,e,i,-1)||rd(s,t,e,i,1):!1}function Bs(s){for(var t=0;;t++)if(s=s.previousSibling,!s)return t}function rd(s,t,e,i,n){for(;;){if(s==e&&t==i)return!0;if(t==(n<0?0:ni(s))){if(s.nodeName=="DIV")return!1;let r=s.parentNode;if(!r||r.nodeType!=1)return!1;t=Bs(s)+(n<0?0:1),s=r}else if(s.nodeType==1){if(s=s.childNodes[t+(n<0?-1:0)],s.nodeType==1&&s.contentEditable=="false")return!1;t=n<0?ni(s):0}else return!1}}function ni(s){return s.nodeType==3?s.nodeValue.length:s.childNodes.length}function Ih(s,t){let e=t?s.left:s.right;return{left:e,right:e,top:s.top,bottom:s.bottom}}function I0(s){return{left:0,right:s.innerWidth,top:0,bottom:s.innerHeight}}function Nd(s,t){let e=t.width/s.offsetWidth,i=t.height/s.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-s.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-s.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function N0(s,t,e,i,n,r,o,l){let a=s.ownerDocument,h=a.defaultView||window;for(let f=s,u=!1;f&&!u;)if(f.nodeType==1){let c,d=f==a.body,p=1,g=1;if(d)c=I0(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(u=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let w=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Nd(f,w)),c={left:w.left,right:w.left+f.clientWidth*p,top:w.top,bottom:w.top+f.clientHeight*g}}let m=0,b=0;if(n=="nearest")t.top0&&t.bottom>c.bottom+b&&(b=t.bottom-c.bottom+b+o)):t.bottom>c.bottom&&(b=t.bottom-c.bottom+o,e<0&&t.top-b0&&t.right>c.right+m&&(m=t.right-c.right+m+r)):t.right>c.right&&(m=t.right-c.right+r,e<0&&t.lefte.clientHeight||e.scrollWidth>e.clientWidth)return e;e=e.assignedSlot||e.parentNode}else if(e.nodeType==11)e=e.host;else break;return null}var oh=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?ni(e):0),i,Math.min(t.focusOffset,i?ni(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}},Mn=null;function Bd(s){if(s.setActive)return s.setActive();if(Mn)return s.focus(Mn);let t=[];for(let e=s;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(s.focus(Mn==null?{get preventScroll(){return Mn={preventScroll:!0},!0}}:void 0),!Mn){Mn=!1;for(let e=0;eMath.max(1,s.scrollHeight-s.clientHeight-4)}var Ht=class s{constructor(t,e,i=!0){this.node=t,this.offset=e,this.precise=i}static before(t,e){return new s(t.parentNode,Bs(t),e)}static after(t,e){return new s(t.parentNode,Bs(t)+1,e)}},Nh=[],ht=class s{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t){let e=this.posAtStart;for(let i of this.children){if(i==t)return e;e+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}sync(t,e){if(this.flags&2){let i=this.dom,n=null,r;for(let o of this.children){if(o.flags&7){if(!o.dom&&(r=n?n.nextSibling:i.firstChild)){let l=s.get(r);(!l||!l.parent&&l.canReuseDOM(o))&&o.reuseDOM(r)}o.sync(t,e),o.flags&=-8}if(r=n?n.nextSibling:i.firstChild,e&&!e.written&&e.node==i&&r!=o.dom&&(e.written=!0),o.dom.parentNode==i)for(;r&&r!=o.dom;)r=ld(r);else i.insertBefore(o.dom,r);n=o.dom}for(r=n?n.nextSibling:i.firstChild,r&&e&&e.node==i&&(e.written=!0);r;)r=ld(r)}else if(this.flags&1)for(let i of this.children)i.flags&7&&(i.sync(t,e),i.flags&=-8)}reuseDOM(t){}localPosFromDOM(t,e){let i;if(t==this.dom)i=this.dom.childNodes[e];else{let n=ni(t)==0?0:e==0?-1:1;for(;;){let r=t.parentNode;if(r==this.dom)break;n==0&&r.firstChild!=r.lastChild&&(t==r.firstChild?n=-1:n=1),t=r}n<0?i=t:i=t.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!s.get(i);)i=i.nextSibling;if(!i)return this.length;for(let n=0,r=0;;n++){let o=this.children[n];if(o.dom==i)return r;r+=o.length+o.breakAfter}}domBoundsAround(t,e,i=0){let n=-1,r=-1,o=-1,l=-1;for(let a=0,h=i,f=i;ae)return u.domBoundsAround(t,e,h);if(c>=t&&n==-1&&(n=a,r=h),h>e&&u.dom.parentNode==this.dom){o=a,l=f;break}f=c,h=c+u.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=Nh){this.markDirty();for(let n=t;nthis.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Fd(s,t,e,i,n,r,o,l,a){let{children:h}=s,f=h.length?h[t]:null,u=r.length?r[r.length-1]:null,c=u?u.breakAfter:o;if(!(t==i&&f&&!o&&!c&&r.length<2&&f.merge(e,n,r.length?u:null,e==0,l,a))){if(i0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e2),I={mac:fd||/Mac/.test(Zt.platform),windows:/Win/.test(Zt.platform),linux:/Linux|X11/.test(Zt.platform),ie:Eo,ie_version:zd?lh.documentMode||6:hh?+hh[1]:ah?+ah[1]:0,gecko:ad,gecko_version:ad?+(/Firefox\\/(\\d+)/.exec(Zt.userAgent)||[0,0])[1]:0,chrome:!!eh,chrome_version:eh?+eh[1]:0,ios:fd,android:/Android\\b/.test(Zt.userAgent),webkit:hd,safari:Wd,webkit_version:hd?+(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:lh.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},F0=256,vi=class s extends ht{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof s)||this.length-(e-t)+i.length>F0||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new s(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Ht(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return V0(this.dom,t,e)}},ki=class s extends ht{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let n of e)n.setParent(this)}setAttrs(t){if(Ld(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,r,o){return i&&(!(i instanceof s&&i.mark.eq(this.mark))||t&&r<=0||et&&e.push(i=t&&(n=r),i=a,r++}let o=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new s(this.mark,e,o)}domAtPos(t){return Gd(this,t)}coordsAt(t,e){return qd(this,t,e)}};function V0(s,t,e){let i=s.nodeValue.length;t>i&&(t=i);let n=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?I.chrome||I.gecko||(t?(n--,o=1):r=0)?0:l.length-1];return I.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?Ih(a,o<0):a||null}var ko=class s extends ht{static create(t,e,i){return new s(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=s.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0)?Ht.before(this.dom):Ht.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),r=null;if(!n.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?n.length-1:0;r=n[l],!(t>0?l==0:l==n.length-1||r.top0?Ht.before(this.dom):Ht.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return K.empty}get isHidden(){return!0}};vi.prototype.children=ko.prototype.children=Ls.prototype.children=Nh;function Gd(s,t){let e=s.dom,{children:i}=s,n=0;for(let r=0;nr&&t0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=n;r0&&t instanceof ki&&n.length&&(i=n[n.length-1])instanceof ki&&i.mark.eq(t.mark)?Ud(i,t.children[0],e-1):(n.push(t),t.setParent(s)),s.length+=t.length}function qd(s,t,e){let i=null,n=-1,r=null,o=-1;function l(h,f){for(let u=0,c=0;u=f&&(d.children.length?l(d,f-c):(!r||r.isHidden&&e>0)&&(p>f||c==p&&d.getSide()>0)?(r=d,o=f-c):(c-1?1:0)!=n.length-(e&&n.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(n.indexOf(r)==-1||s[r]!==t[r]))return!1;return!0}function uh(s,t,e){let i=!1;if(t)for(let n in t)e&&n in e||(i=!0,n=="style"?s.style.cssText="":s.removeAttribute(n));if(e)for(let n in e)t&&t[n]==e[n]||(i=!0,n=="style"?s.style.cssText=e[n]:s.setAttribute(n,e[n]));return i}function W0(s){let t=Object.create(null);for(let e=0;e0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Bh(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Ud(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=fh(e,this.attrs||{})),i&&(this.attrs=fh({class:i},this.attrs||{}))}domAtPos(t){return Gd(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Ld(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(uh(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&ht.get(n)instanceof ki;)n=n.lastChild;if(!n||!this.length||n.nodeName!="BR"&&((i=ht.get(n))===null||i===void 0?void 0:i.isEditable)==!1&&(!I.ios||!this.children.some(r=>r instanceof vi))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof vi)||/[^ -~]/.test(i.text))return null;let n=Ns(i.dom);if(n.length!=1)return null;t+=n[0].width,e=n[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=qd(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:n}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-n.lineHeight)<2&&n.textHeight=e){if(r instanceof s)return r;if(o>e)break}n=o+r.breakAfter}return null}},On=class s extends ht{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0}},_n=class{eq(t){return!1}updateDOM(t,e){return!1}compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(t){return!0}coordsAt(t,e,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(t){}},ei=function(s){return s[s.Text=0]="Text",s[s.WidgetBefore=1]="WidgetBefore",s[s.WidgetAfter=2]="WidgetAfter",s[s.WidgetRange=3]="WidgetRange",s}(ei||(ei={})),It=class extends ti{constructor(t,e,i,n){super(),this.startSide=t,this.endSide=e,this.widget=i,this.spec=n}get heightRelevant(){return!1}static mark(t){return new Hs(t)}static widget(t){let e=Math.max(-1e4,Math.min(1e4,t.side||0)),i=!!t.block;return e+=i&&!t.inlineOrder?e>0?3e8:-4e8:e>0?1e8:-1e8,new xi(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,n;if(t.isBlockGap)i=-5e8,n=4e8;else{let{start:r,end:o}=jd(t,e);i=(r?e?-3e8:-1:5e8)-1,n=(o?e?2e8:1:-6e8)+1}return new xi(t,i,n,e,t.widget||null,!0)}static line(t){return new Fs(t)}static set(t,e=!1){return wt.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};It.none=wt.empty;var Hs=class s extends It{constructor(t){let{start:e,end:i}=jd(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof s&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&Bh(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};Hs.prototype.point=!1;var Fs=class s extends It{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof s&&this.spec.class==t.spec.class&&Bh(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};Fs.prototype.mapMode=Gt.TrackBefore;Fs.prototype.point=!0;var xi=class s extends It{constructor(t,e,i,n,r,o){super(e,i,r,t),this.block=n,this.isReplace=o,this.mapMode=n?e<=0?Gt.TrackBefore:Gt.TrackAfter:Gt.TrackDel}get type(){return this.startSide!=this.endSide?ei.WidgetRange:this.startSide<=0?ei.WidgetBefore:ei.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof s&&G0(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};xi.prototype.point=!0;function jd(s,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=s;return e==null&&(e=s.inclusive),i==null&&(i=s.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function G0(s,t){return s==t||!!(s&&t&&s.compare(t))}function ch(s,t,e,i=0){let n=e.length-1;n>=0&&e[n]+i>=s?e[n]=Math.max(e[n],t):e.push(s,t)}var Ds=class s{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof On&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Ot),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(ao(new Ls(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof On)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(ao(new vi(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof xi){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof xi)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new On(i.widget||new xo("div"),l,i));else{let a=ko.create(i.widget||new xo("span"),l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=n.length&&(t0),f=!a.isEditable&&(tn.length||i.startSide<=0),u=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(n),h&&(u.append(ao(new Ls(1),n),r),r=n.length+Math.max(0,r-n.length)),u.append(ao(a,n),r),this.atCursorPos=f,this.pendingBuffer=f?tn.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,n,r){let o=new s(t,e,i,r);return o.openEnd=wt.spans(n,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function ao(s,t){for(let e of t)s=new ki(e,[s],s.length);return s}var xo=class extends _n{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}},xt=function(s){return s[s.LTR=0]="LTR",s[s.RTL=1]="RTL",s}(xt||(xt={})),ji=xt.LTR,Lh=xt.RTL;function $d(s){let t=[];for(let e=0;e=e){if(l.level==i)return o;(r<0||(n!=0?n<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function Yd(s,t){if(s.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(Le[g+1]==-d){let m=Le[g+2],b=m&2?n:m&4?m&1?r:n:0;b&&(tt[u]=tt[Le[g]]=b),l=g;break}}else{if(Le.length==189)break;Le[l++]=u,Le[l++]=c,Le[l++]=a}else if((p=tt[u])==2||p==1){let g=p==n;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=Le[m+2];if(b&2)break;if(g)Le[m+2]|=2;else{if(b&4)break;Le[m+2]|=4}}}}}function Y0(s,t,e,i){for(let n=0,r=i;n<=e.length;n++){let o=n?e[n-1].to:s,l=na;)p==m&&(p=e[--g].from,m=g?e[g-1].to:s),tt[--p]=d;a=f}else r=h,a++}}}function ph(s,t,e,i,n,r,o){let l=i%2?2:1;if(i%2==n%2)for(let a=t,h=0;aa&&o.push(new Fe(a,g.from,d));let m=g.direction==ji!=!(d%2);gh(s,m?i+1:i,n,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?tt[p]!=l:tt[p]==l))break;p++}c?ph(s,a,p,i+1,n,c,o):at;){let f=!0,u=!1;if(!h||a>r[h-1].to){let g=tt[a-1];g!=l&&(f=!1,u=g==16)}let c=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(u)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(tt[m-1]==l)break t;break}}if(c)c.push(g);else{g.tott.length;)tt[tt.length]=256;let i=[],n=t==ji?0:1;return gh(s,n,n,e,0,s.length,i),i}function Xd(s){return[new Fe(0,s,0)]}var Jd="";function J0(s,t,e,i,n){var r;let o=i.head-s.from,l=Fe.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(n,e);if(o==h){let c=l+=n?1:-1;if(c<0||c>=t.length)return null;a=t[l=c],o=a.side(!n,e),h=a.side(n,e)}let f=Be(s.text,o,a.forward(n,e));(fa.to)&&(f=h),Jd=s.text.slice(Math.min(o,f),Math.max(o,f));let u=l==(n?t.length-1:0)?null:t[l+(n?1:-1)];return u&&f==h&&u.level+(n?0:1)s.some(t=>t)}),Z0=U.define({combine:s=>s.some(t=>t)}),Rs=class s{constructor(t,e="nearest",i="nearest",n=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new s(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new s(V.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},ho=bt.define({map:(s,t)=>s.map(t)});function ii(s,t,e){let i=s.facet(ep);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var Do=U.define({combine:s=>s.length?s[0]:!0}),tb=0,As=U.define(),En=class s{constructor(t,e,i,n,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:n,provide:r,decorations:o}=e||{};return new s(tb++,t,i,n,l=>{let a=[As.of(l)];return o&&a.push(Vs.of(h=>{let f=h.plugin(l);return f?o(f):It.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return s.define(i=>new t(i),e)}},Ps=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(ii(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){ii(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){ii(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},rp=U.define(),Hh=U.define(),Vs=U.define(),op=U.define(),Fh=U.define(),lp=U.define();function cd(s,t){let e=s.state.facet(lp);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(s):r),n=[];return wt.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,u=n;for(let c=l.length-1;c>=0;c--,a--){let d=l[c].spec.bidiIsolate,p;if(d==null&&(d=Q0(t.text,h,f)),a>0&&u.length&&(p=u[u.length-1]).to==h&&p.direction==d)p.to=f,u=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};u.push(g),u=g.inner}}}}),n}var ap=U.define();function hp(s){let t=0,e=0,i=0,n=0;for(let r of s.state.facet(ap)){let o=r(s);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(n=Math.max(n,o.bottom)))}return{left:t,right:e,top:i,bottom:n}}var Ts=U.define(),Ve=class s{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new s(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toAf)break;r+=2}if(!a)return i;new s(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},So=class s{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Qt.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let n=[];this.changes.iterChangedRanges((r,o,l,a)=>n.push(new Ve(r,o,l,a))),this.changedRanges=n}static create(t,e,i){return new s(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&10)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},Co=class extends ht{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new Ot],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new Ve(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let n=-1;this.view.inputState.composing>=0&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?n=this.domChanged.newSel.head:!lb(t.changes,this.hasComposition)&&!t.selectionSet&&(n=t.state.selection.main.head));let r=n>-1?ib(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new Ve(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(I.ie||I.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=rb(o,l,t.changes);return i=Ve.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=I.chrome||I.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||n.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?n[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:u}=l,c,d,p,g;if(i&&i.range.fromBf){let v=Ds.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),x=Ds.build(this.view.state.doc,i.range.toB,u,this.decorations,this.dynamicDecorationMap);d=v.breakAtStart,p=v.openStart,g=x.openEnd;let S=this.compositionView(i);x.breakAtStart?S.breakAfter=1:x.content.length&&S.merge(S.length,S.length,x.content[0],!1,x.openStart,0)&&(S.breakAfter=x.content[0].breakAfter,x.content.shift()),v.content.length&&S.merge(0,0,v.content[v.content.length-1],!0,0,v.openEnd)&&v.content.pop(),c=v.content.concat(S).concat(x.content)}else({content:c,breakAtStart:d,openStart:p,openEnd:g}=Ds.build(this.view.state.doc,f,u,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:w,off:y}=r.findPos(a,-1);Fd(this,w,y,m,b,c,d,p,g)}i&&this.fixCompositionDOM(i)}compositionView(t){let e=new vi(t.text.nodeValue);e.flags|=8;for(let{deco:n}of t.marks)e=new ki(n,[e],e.length);let i=new Ot;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=ht.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let r=t.marks.length-1;r>=-1;r--)i=n.childPos(i.off,1),n=n.children[i.i],e(r>=0?t.marks[r].node:t.text,n)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,r=!n&&mo(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(I.gecko&&l.empty&&!this.hasComposition&&eb(a)){let u=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(u,a.node.childNodes[a.offset]||null)),a=h=new Ht(u,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!Es(a.node,a.offset,f.anchorNode,f.anchorOffset)||!Es(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{I.android&&I.chrome&&this.dom.contains(f.focusNode)&&ob(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let u=yo(this.view.root);if(u)if(l.empty){if(I.gecko){let c=nb(a.node,a.offset);if(c&&c!=3){let d=up(a.node,a.offset,c==1?1:-1);d&&(a=new Ht(d.node,d.offset))}}u.collapse(a.node,a.offset),l.bidiLevel!=null&&u.caretBidiLevel!==void 0&&(u.caretBidiLevel=l.bidiLevel)}else if(u.extend){u.collapse(a.node,a.offset);try{u.extend(h.node,h.offset)}catch(c){}}else{let c=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),c.setEnd(h.node,h.offset),c.setStart(a.node,a.offset),u.removeAllRanges(),u.addRange(c)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Ht(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Ht(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&Es(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=yo(t.root),{anchorNode:n,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=Ot.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let u=t.observer.selectionRange;t.docView.posFromDOM(u.anchorNode,u.anchorOffset)!=e.from&&i.collapse(n,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let n=t.offset;!i&&n=0;n--){let r=ht.get(e.childNodes[n]);r instanceof Ot&&(i=r.domAtPos(r.length))}return i?new Ht(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=ht.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(at||l.covers(1))&&(!i||l instanceof Ot&&!(i instanceof Ot&&e>=0))&&(i=l,n=h),r=h}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof Ot))return null;for(;n.children.length;){let{i:l,off:a}=n.childPos(i,1);for(;;l++){if(l==n.children.length)return null;if((n=n.children[l]).length)break}i=a}if(!(n instanceof vi))return null;let r=Be(n.text,i);if(r==i)return null;let o=qi(n.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==xt.LTR;for(let h=0,f=0;fn)break;if(h>=i){let d=u.dom.getBoundingClientRect();if(e.push(d.height),o){let p=u.dom.lastChild,g=p?Ns(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=c)}}}h=c+u.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?xt.RTL:xt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof Ot){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,n;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=Ns(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,n=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:n}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new vo(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let r=n==e.viewports.length?null:e.viewports[n],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(It.replace({widget:new Mo(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return It.set(t)}updateDeco(){let t=this.view.state.facet(Vs).map((n,r)=>(this.dynamicDecorationMap[r]=typeof n=="function")?n(this.view):n),e=!1,i=this.view.state.facet(op).map((n,r)=>{let o=typeof n=="function";return o&&(e=!0),o?n(this.view):n});i.length&&(this.dynamicDecorationMap[t.length]=e,t.push(wt.join(i)));for(let n=t.length;ne.anchor?-1:1),n;if(!i)return;!e.empty&&(n=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,n.left),top:Math.min(i.top,n.top),right:Math.max(i.right,n.right),bottom:Math.max(i.bottom,n.bottom)});let r=hp(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;N0(this.view.scrollDOM,o,e.head0)i=i.childNodes[n-1],n=ni(i);else break}if(e>=0)for(let i=s,n=t;;){if(i.nodeType==3)return{node:i,offset:n};if(i.nodeType==1&&n=0)i=i.childNodes[n],n=0;else break}return null}function nb(s,t){return s.nodeType!=1?0:(t&&s.childNodes[t-1].contentEditable=="false"?1:0)|(t{it.from&&(e=!0)}),e}function ab(s,t,e=1){let i=s.charCategorizer(t),n=s.doc.lineAt(t),r=t-n.from;if(n.length==0)return V.cursor(t);r==0?e=1:r==n.length&&(e=-1);let o=r,l=r;e<0?o=Be(n.text,r,!1):l=Be(n.text,r);let a=i(n.text.slice(o,l));for(;o>0;){let h=Be(n.text,o,!1);if(i(n.text.slice(h,o))!=a)break;o=h}for(;ls?t.left-s:Math.max(0,s-t.right)}function fb(s,t){return t.top>s?t.top-s:Math.max(0,s-t.bottom)}function ih(s,t){return s.topt.top+1}function dd(s,t){return ts.bottom?{top:s.top,left:s.left,right:s.right,bottom:t}:s}function bh(s,t,e){let i,n,r,o,l=!1,a,h,f,u;for(let p=s.firstChild;p;p=p.nextSibling){let g=Ns(p);for(let m=0;my||o==y&&r>w){i=p,n=b,r=w,o=y;let v=y?e0?m0)}w==0?e>b.bottom&&(!f||f.bottomb.top)&&(h=p,u=b):f&&ih(f,b)?f=pd(f,b.bottom):u&&ih(u,b)&&(u=dd(u,b.top))}}if(f&&f.bottom>=e?(i=a,n=f):u&&u.top<=e&&(i=h,n=u),!i)return{node:s,offset:0};let c=Math.max(n.left,Math.min(n.right,t));if(i.nodeType==3)return gd(i,c,e);if(l&&i.contentEditable!="false")return bh(i,c,e);let d=Array.prototype.indexOf.call(s.childNodes,i)+(t>=(n.left+n.right)/2?1:0);return{node:s,offset:d}}function gd(s,t,e){let i=s.nodeValue.length,n=-1,r=1e9,o=0;for(let l=0;le?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&u=(f.left+f.right)/2,d=c;if((I.chrome||I.gecko)&&qi(s,l).getBoundingClientRect().left==f.right&&(d=!c),u<=0)return{node:s,offset:l+(d?1:0)};n=l+(d?1:0),r=u}}}return{node:s,offset:n>-1?n:o>0?s.nodeValue.length:0}}function cp(s,t,e,i=-1){var n,r;let o=s.contentDOM.getBoundingClientRect(),l=o.top+s.viewState.paddingTop,a,{docHeight:h}=s.viewState,{x:f,y:u}=t,c=u-l;if(c<0)return 0;if(c>h)return s.state.doc.length;for(let v=s.viewState.heightOracle.textHeight/2,x=!1;a=s.elementAtHeight(c),a.type!=ei.Text;)for(;c=i>0?a.bottom+v:a.top-v,!(c>=0&&c<=h);){if(x)return e?null:0;x=!0,i=-i}u=l+c;let d=a.from;if(ds.viewport.to)return s.viewport.to==s.state.doc.length?s.state.doc.length:e?null:md(s,o,a,f,u);let p=s.dom.ownerDocument,g=s.root.elementFromPoint?s.root:p,m=g.elementFromPoint(f,u);m&&!s.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,u),m&&!s.contentDOM.contains(m)&&(m=null));let b,w=-1;if(m&&((n=s.docView.nearest(m))===null||n===void 0?void 0:n.isEditable)!=!1){if(p.caretPositionFromPoint){let v=p.caretPositionFromPoint(f,u);v&&({offsetNode:b,offset:w}=v)}else if(p.caretRangeFromPoint){let v=p.caretRangeFromPoint(f,u);v&&({startContainer:b,startOffset:w}=v,(!s.contentDOM.contains(b)||I.safari&&ub(b,w,f)||I.chrome&&cb(b,w,f))&&(b=void 0))}}if(!b||!s.docView.dom.contains(b)){let v=Ot.find(s.docView,d);if(!v)return c>a.top+a.height/2?a.to:a.from;({node:b,offset:w}=bh(v.dom,f,u))}let y=s.docView.nearest(b);if(!y)return null;if(y.isWidget&&((r=y.dom)===null||r===void 0?void 0:r.nodeType)==1){let v=y.dom.getBoundingClientRect();return t.ys.defaultLineHeight*1.5){let l=s.viewState.heightOracle.textHeight,a=Math.floor((n-e.top-(s.defaultLineHeight-l)*.5)/l);r+=a*s.viewState.heightOracle.lineLength}let o=s.state.sliceDoc(e.from,e.to);return e.from+ed(o,r,s.state.tabSize)}function ub(s,t,e){let i;if(s.nodeType!=3||t!=(i=s.nodeValue.length))return!1;for(let n=s.nextSibling;n;n=n.nextSibling)if(n.nodeType!=1||n.nodeName!="BR")return!1;return qi(s,i-1,i).getBoundingClientRect().left>e}function cb(s,t,e){if(t!=0)return!1;for(let n=s;;){let r=n.parentNode;if(!r||r.nodeType!=1||r.firstChild!=n)return!1;if(r.classList.contains("cm-line"))break;n=r}let i=s.nodeType==1?s.getBoundingClientRect():qi(s,0,Math.max(s.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function db(s,t){let e=s.lineBlockAt(t);if(Array.isArray(e.type)){for(let i of e.type)if(i.to>t||i.to==t&&(i.to==e.to||i.type==ei.Text))return i}return e}function pb(s,t,e,i){let n=db(s,t.head),r=!i||n.type!=ei.Text||!(s.lineWrapping||n.widgetLineBreaks)?null:s.coordsAtPos(t.assoc<0&&t.head>n.from?t.head-1:t.head);if(r){let o=s.dom.getBoundingClientRect(),l=s.textDirectionAt(n.from),a=s.posAtCoords({x:e==(l==xt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return V.cursor(a,e?-1:1)}return V.cursor(e?n.to:n.from,e?-1:1)}function bd(s,t,e,i){let n=s.state.doc.lineAt(t.head),r=s.bidiSpans(n),o=s.textDirectionAt(n.from);for(let l=t,a=null;;){let h=J0(n,r,o,l,e),f=Jd;if(!h){if(n.number==(e?s.state.doc.lines:1))return l;f=`\n`,n=s.state.doc.line(n.number+(e?1:-1)),r=s.bidiSpans(n),h=s.visualLineSide(n,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function gb(s,t,e){let i=s.state.charCategorizer(t),n=i(e);return r=>{let o=i(r);return n==Ne.Space&&(n=o),n==o}}function mb(s,t,e,i){let n=t.head,r=e?1:-1;if(n==(e?s.state.doc.length:0))return V.cursor(n,t.assoc);let o=t.goalColumn,l,a=s.contentDOM.getBoundingClientRect(),h=s.coordsAtPos(n,t.assoc||-1),f=s.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=s.viewState.lineBlockAt(n);o==null&&(o=Math.min(a.right-a.left,s.defaultCharacterWidth*(n-d.from))),l=(r<0?d.top:d.bottom)+f}let u=a.left+o,c=i!=null?i:s.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(c+d)*r,g=cp(s,{x:u,y:p},!1,r);if(pa.bottom||(r<0?gn)){let m=s.docView.coordsForChar(g),b=!m||p{if(t>r&&tn(s)),e.from,t.head>e.from?-1:1);return i==e.from?e:V.cursor(i,inull),I.gecko&&Rb(t.contentDOM.ownerDocument)}handleEvent(t){!Cb(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||this.runHandlers(t.type,t)}runHandlers(t,e){let i=this.handlers[t];if(i){for(let n of i.observers)n(this.view,e);for(let n of i.handlers){if(e.defaultPrevented)break;if(n(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=bb(t),i=this.handlers,n=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(n.removeEventListener(r,this.handleEvent),l=null),l||n.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&n.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&Date.now()i.keyCode==t.keyCode))&&!t.ctrlKey||wb.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(){let t=this.pendingIOSKey;return t?(this.pendingIOSKey=void 0,Tn(this.view.contentDOM,t.key,t.keyCode)):!1}ignoreDuringComposition(t){return/^key/.test(t.type)?this.composing>0?!0:I.safari&&!I.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function wd(s,t){return(e,i)=>{try{return t.call(s,i,e)}catch(n){ii(e.state,n)}}}function bb(s){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of s){let n=i.spec;if(n&&n.domEventHandlers)for(let r in n.domEventHandlers){let o=n.domEventHandlers[r];o&&e(r).handlers.push(wd(i.value,o))}if(n&&n.domEventObservers)for(let r in n.domEventObservers){let o=n.domEventObservers[r];o&&e(r).observers.push(wd(i.value,o))}}for(let i in ve)e(i).handlers.push(ve[i]);for(let i in ke)e(i).observers.push(ke[i]);return t}var dp=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],wb="dthko",yb=[16,17,18,20,91,92,224,225],fo=6;function uo(s){return Math.max(0,s)*.7+8}function vb(s,t){return Math.max(Math.abs(s.clientX-t.clientX),Math.abs(s.clientY-t.clientY))}var yh=class{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParent=B0(t.contentDOM),this.atoms=t.state.facet(Fh).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(dt.allowMultipleSelections)&&kb(t,e),this.dragging=Sb(t,e)&&bp(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){var e;if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&vb(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let i=0,n=0,r=((e=this.scrollParent)===null||e===void 0?void 0:e.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},o=hp(this.view);t.clientX-o.left<=r.left+fo?i=-uo(r.left-t.clientX):t.clientX+o.right>=r.right-fo&&(i=uo(t.clientX-r.right)),t.clientY-o.top<=r.top+fo?n=-uo(r.top-t.clientY):t.clientY+o.bottom>=r.bottom-fo&&(n=uo(t.clientY-r.bottom)),this.setScrollSpeed(i,n)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;ithis.select(this.lastEvent),20)}};function kb(s,t){let e=s.state.facet(Qd);return e.length?e[0](t):I.mac?t.metaKey:t.ctrlKey}function xb(s,t){let e=s.state.facet(Zd);return e.length?e[0](t):I.mac?!t.altKey:!t.ctrlKey}function Sb(s,t){let{main:e}=s.state.selection;if(e.empty)return!1;let i=yo(s.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function Cb(s,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=s.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=ht.get(e))&&i.ignoreEvent(t))return!1;return!0}var ve=Object.create(null),ke=Object.create(null),pp=I.ie&&I.ie_version<15||I.ios&&I.webkit_version<604;function Mb(s){let t=s.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{s.focus(),e.remove(),gp(s,e.value)},50)}function gp(s,t){let{state:e}=s,i,n=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(vh!=null&&e.selection.ranges.every(a=>a.empty)&&vh==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let u=e.toText((o?r.line(n++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:u},range:V.cursor(h.from+u.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(n++);return{changes:{from:a.from,to:a.to,insert:h.text},range:V.cursor(a.from+h.length)}}):i=e.replaceSelection(r);s.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}ke.scroll=s=>{s.inputState.lastScrollTop=s.scrollDOM.scrollTop,s.inputState.lastScrollLeft=s.scrollDOM.scrollLeft};ve.keydown=(s,t)=>(s.inputState.setSelectionOrigin("select"),t.keyCode==27&&(s.inputState.lastEscPress=Date.now()),!1);ke.touchstart=(s,t)=>{s.inputState.lastTouchTime=Date.now(),s.inputState.setSelectionOrigin("select.pointer")};ke.touchmove=s=>{s.inputState.setSelectionOrigin("select.pointer")};ve.mousedown=(s,t)=>{if(s.observer.flush(),s.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of s.state.facet(tp))if(e=i(s,t),e)break;if(!e&&t.button==0&&(e=Ob(s,t)),e){let i=!s.hasFocus;s.inputState.startMouseSelection(new yh(s,t,e,i)),i&&s.observer.ignore(()=>Bd(s.contentDOM));let n=s.inputState.mouseSelection;if(n)return n.start(t),n.dragging===!1}return!1};function yd(s,t,e,i){if(i==1)return V.cursor(t,e);if(i==2)return ab(s.state,t,e);{let n=Ot.find(s.docView,t),r=s.state.doc.lineAt(n?n.posAtEnd:t),o=n?n.posAtStart:r.from,l=n?n.posAtEnd:r.to;return ls>=t.top&&s<=t.bottom,vd=(s,t,e)=>mp(t,e)&&s>=e.left&&s<=e.right;function Ab(s,t,e,i){let n=Ot.find(s.docView,t);if(!n)return 1;let r=t-n.posAtStart;if(r==0)return 1;if(r==n.length)return-1;let o=n.coordsAt(r,-1);if(o&&vd(e,i,o))return-1;let l=n.coordsAt(r,1);return l&&vd(e,i,l)?1:o&&mp(i,o)?-1:1}function kd(s,t){let e=s.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:Ab(s,e,t.clientX,t.clientY)}}var Tb=I.ie&&I.ie_version<=11,xd=null,Sd=0,Cd=0;function bp(s){if(!Tb)return s.detail;let t=xd,e=Cd;return xd=s,Cd=Date.now(),Sd=!t||e>Date.now()-400&&Math.abs(t.clientX-s.clientX)<2&&Math.abs(t.clientY-s.clientY)<2?(Sd+1)%3:1}function Ob(s,t){let e=kd(s,t),i=bp(t),n=s.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),n=n.map(r.changes))},get(r,o,l){let a=kd(s,r),h,f=yd(s,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let u=yd(s,e.pos,e.bias,i),c=Math.min(u.from,f.from),d=Math.max(u.to,f.to);f=c1&&(h=_b(n,a.pos))?h:l?n.addRange(f):V.create([f])}}}function _b(s,t){for(let e=0;e=t)return V.create(s.ranges.slice(0,e).concat(s.ranges.slice(e+1)),s.mainIndex==e?0:s.mainIndex-(s.mainIndex>e?1:0))}return null}ve.dragstart=(s,t)=>{let{selection:{main:e}}=s.state;if(t.target.draggable){let n=s.docView.nearest(t.target);if(n&&n.isWidget){let r=n.posAtStart,o=r+n.length;(r>=e.to||o<=e.from)&&(e=V.range(r,o))}}let{inputState:i}=s;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",s.state.sliceDoc(e.from,e.to)),t.dataTransfer.effectAllowed="copyMove"),!1};ve.dragend=s=>(s.inputState.draggedContent=null,!1);function Md(s,t,e,i){if(!e)return;let n=s.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=s.inputState,o=i&&r&&xb(s,t)?{from:r.from,to:r.to}:null,l={from:n,insert:e},a=s.state.changes(o?[o,l]:l);s.focus(),s.dispatch({changes:a,selection:{anchor:a.mapPos(n,-1),head:a.mapPos(n,1)},userEvent:o?"move.drop":"input.drop"}),s.inputState.draggedContent=null}ve.drop=(s,t)=>{if(!t.dataTransfer)return!1;if(s.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),n=0,r=()=>{++n==e.length&&Md(s,t,i.filter(o=>o!=null).join(s.state.lineBreak),!1)};for(let o=0;o{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return Md(s,t,i,!0),!0}return!1};ve.paste=(s,t)=>{if(s.state.readOnly)return!0;s.observer.flush();let e=pp?null:t.clipboardData;return e?(gp(s,e.getData("text/plain")||e.getData("text/uri-text")),!0):(Mb(s),!1)};function Eb(s,t){let e=s.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),s.focus()},50)}function Db(s){let t=[],e=[],i=!1;for(let n of s.selection.ranges)n.empty||(t.push(s.sliceDoc(n.from,n.to)),e.push(n));if(!t.length){let n=-1;for(let{from:r}of s.selection.ranges){let o=s.doc.lineAt(r);o.number>n&&(t.push(o.text),e.push({from:o.from,to:Math.min(s.doc.length,o.to+1)})),n=o.number}i=!0}return{text:t.join(s.lineBreak),ranges:e,linewise:i}}var vh=null;ve.copy=ve.cut=(s,t)=>{let{text:e,ranges:i,linewise:n}=Db(s.state);if(!e&&!n)return!1;vh=n?e:null,t.type=="cut"&&!s.state.readOnly&&s.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=pp?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(Eb(s,e),!1)};var wp=Ze.define();function yp(s,t){let e=[];for(let i of s.facet(np)){let n=i(s,t);n&&e.push(n)}return e?s.update({effects:e,annotations:wp.of(!0)}):null}function vp(s){setTimeout(()=>{let t=s.hasFocus;if(t!=s.inputState.notifiedFocused){let e=yp(s.state,t);e?s.dispatch(e):s.update([])}},10)}ke.focus=s=>{s.inputState.lastFocusTime=Date.now(),!s.scrollDOM.scrollTop&&(s.inputState.lastScrollTop||s.inputState.lastScrollLeft)&&(s.scrollDOM.scrollTop=s.inputState.lastScrollTop,s.scrollDOM.scrollLeft=s.inputState.lastScrollLeft),vp(s)};ke.blur=s=>{s.observer.clearSelectionRange(),vp(s)};ke.compositionstart=ke.compositionupdate=s=>{s.inputState.compositionFirstChange==null&&(s.inputState.compositionFirstChange=!0),s.inputState.composing<0&&(s.inputState.composing=0)};ke.compositionend=s=>{s.inputState.composing=-1,s.inputState.compositionEndedAt=Date.now(),s.inputState.compositionPendingKey=!0,s.inputState.compositionPendingChange=s.observer.pendingRecords().length>0,s.inputState.compositionFirstChange=null,I.chrome&&I.android?s.observer.flushSoon():s.inputState.compositionPendingChange?Promise.resolve().then(()=>s.observer.flush()):setTimeout(()=>{s.inputState.composing<0&&s.docView.hasComposition&&s.update([])},50)};ke.contextmenu=s=>{s.inputState.lastContextMenu=Date.now()};ve.beforeinput=(s,t)=>{var e;let i;if(I.chrome&&I.android&&(i=dp.find(n=>n.inputType==t.inputType))&&(s.observer.delayAndroidKey(i.key,i.keyCode),i.key=="Backspace"||i.key=="Delete")){let n=((e=window.visualViewport)===null||e===void 0?void 0:e.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>n+10&&s.hasFocus&&(s.contentDOM.blur(),s.focus())},100)}return!1};var Ad=new Set;function Rb(s){Ad.has(s)||(Ad.add(s),s.addEventListener("copy",()=>{}),s.addEventListener("cut",()=>{}))}var Td=["pre-wrap","normal","pre-line","break-spaces"],kh=class{constructor(t){this.lineWrapping=t,this.doc=K.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return Td.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t,e){this.height!=e&&(Math.abs(this.height-e)>wo&&(t.heightChanged=!0),this.height=e)}replace(t,e,i){return s.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let r=this,o=i.doc;for(let l=n.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:u}=n[l],c=r.lineAt(a,at.ByPosNoHeight,i.setDoc(e),0,0),d=c.to>=h?c:r.lineAt(h,at.ByPosNoHeight,i,0,0);for(u+=d.to-h,h=d.to;l>0&&c.from<=n[l-1].toA;)a=n[l-1].fromA,f=n[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,n-=l.size}else if(r>n*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(n=r&&o(this.blockAt(0,i,n,r))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(t,n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},ce=class s extends Ao{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new He(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return i.length==1&&(n instanceof s||n instanceof yi&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof yi?n=new s(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):te.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(t,n.heights[n.index++]):(i||this.outdated)&&this.setHeight(t,Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},yi=class s extends te{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,n=t.doc.lineAt(e+this.length).number,r=n-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:n,perLine:o,perChar:l}}blockAt(t,e,i,n){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let h=n+Math.round(Math.max(0,Math.min(1,(t-i)/this.height))*this.length),f=e.doc.lineAt(h),u=l+f.length*a,c=Math.max(i,t-u/2);return new He(f.from,f.length,c,u,0)}else{let h=Math.max(0,Math.min(o-r,Math.floor((t-i)/l))),{from:f,length:u}=e.doc.line(r+h);return new He(f,u,i+l*h,l,0)}}lineAt(t,e,i,n,r){if(e==at.ByHeight)return this.blockAt(t,i,n,r);if(e==at.ByPosNoHeight){let{from:d,to:p}=i.doc.lineAt(t);return new He(d,p-d,0,0,0)}let{firstLine:o,perLine:l,perChar:a}=this.heightMetrics(i,r),h=i.doc.lineAt(t),f=l+h.length*a,u=h.number-o,c=n+l*u+a*(h.from-r-u);return new He(h.from,h.length,Math.max(n,Math.min(c,n+this.height-f)),f,0)}forEachLine(t,e,i,n,r,o){t=Math.max(t,r),e=Math.min(e,r+this.length);let{firstLine:l,perLine:a,perChar:h}=this.heightMetrics(i,r);for(let f=t,u=n;f<=e;){let c=i.doc.lineAt(f);if(f==t){let p=c.number-l;u+=a*p+h*(t-r-p)}let d=a+h*c.length;o(new He(c.from,c.length,u,d,0)),u+=d,f=c.to+1}}replace(t,e,i){let n=this.length-e;if(n>0){let r=i[i.length-1];r instanceof s?i[i.length-1]=new s(r.length+n):i.push(null,new s(n-1))}if(t>0){let r=i[0];r instanceof s?i[0]=new s(t+r.length):i.unshift(new s(t-1),null)}return te.of(i)}decomposeLeft(t,e){e.push(new s(t-1),null)}decomposeRight(t,e){e.push(null,new s(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let r=e+this.length;if(n&&n.from<=e+this.length&&n.more){let o=[],l=Math.max(e,n.from),a=-1;for(n.from>e&&o.push(new s(n.from-e-1).updateHeight(t,e));l<=r&&n.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let u=n.heights[n.index++];a==-1?a=u:Math.abs(u-a)>=wo&&(a=-2);let c=new ce(f,u);c.outdated=!1,o.push(c),l+=f+1}l<=r&&o.push(null,new s(r-l).updateHeight(t,l));let h=te.of(o);return(a<0||Math.abs(h.height-this.height)>=wo||Math.abs(a-this.heightMetrics(t,e).perLine)>=wo)&&(t.heightChanged=!0),h}else(i||this.outdated)&&(this.setHeight(t,t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Sh=class extends te{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,n){let r=i+this.left.height;return tl))return h;let f=e==at.ByPosNoHeight?at.ByPosNoHeight:at.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,n,r).join(h)}forEachLine(t,e,i,n,r,o){let l=n+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,at.ByPos,i,n,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&Od(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t2*e.size||e.size>2*t.size?te.of(this.break?[t,null,e]:[t,e]):(this.left=t,this.right=e,this.height=t.height+e.height,this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return n&&n.from<=e+r.length&&n.more?a=r=r.updateHeight(t,e,i,n):r.updateHeight(t,e,i),n&&n.from<=l+o.length&&n.more?a=o=o.updateHeight(t,l,i,n):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function Od(s,t){let e,i;s[t]==null&&(e=s[t-1])instanceof yi&&(i=s[t+1])instanceof yi&&s.splice(t-1,3,new yi(e.length+1+i.length))}var Pb=5,Ch=class s{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof ce?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new ce(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=Pb)&&this.addLineDeco(n,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new ce(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new yi(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof ce)return t;let e=new ce(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof ce)&&!this.isCovered?this.nodes.push(new ce(0,-1)):(this.writtenTof.clientHeight||f.scrollWidth>f.clientWidth)&&u.overflow!="visible"){let c=f.getBoundingClientRect();r=Math.max(r,c.left),o=Math.min(o,c.right),l=Math.max(l,c.top),a=h==s.parentNode?c.bottom:Math.min(a,c.bottom)}h=u.position=="absolute"||u.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function Bb(s,t){let e=s.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var Is=class{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new kh(e),this.stateDeco=t.facet(Vs).filter(i=>typeof i!="function"),this.heightMap=te.empty().applyChanges(this.stateDeco,K.empty,this.heightOracle.setDoc(t.doc),[new Ve(0,0,0,t.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=It.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>n>=r&&n<=o)){let{from:r,to:o}=this.lineBlockAt(n);t.push(new An(r,o))}}this.viewports=t.sort((i,n)=>i.from-n.from),this.scaler=this.heightMap.height<=7e6?_d:new Th(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(this.scaler.scale==1?t:Os(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Vs).filter(f=>typeof f!="function");let n=t.changedRanges,r=Ve.extendWithRanges(n,Ib(i,this.stateDeco,t?t.changes:Qt.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),this.heightMap.height!=o&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=!t.changes.empty||t.flags&2||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),h&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(Z0)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),n=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?xt.RTL:xt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:v,scaleY:x}=Nd(e,l);(this.scaleX!=v||this.scaleY!=x)&&(this.scaleX=v,this.scaleY=x,h|=8,o=a=!0)}let u=(parseInt(i.paddingTop)||0)*this.scaleY,c=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=u||this.paddingBottom!=c)&&(this.paddingTop=u,this.paddingBottom=c,h|=10),this.editorWidth!=t.scrollDOM.clientWidth&&(n.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=8);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Hd(t.scrollDOM);let p=(this.printing?Bb:Nb)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget)return 0;let w=l.width;if((this.contentDOMWidth!=w||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=8),a){let v=t.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(v)&&(o=!0),o||n.lineWrapping&&Math.abs(w-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:S,textHeight:k}=t.docView.measureTextSize();o=x>0&&n.refresh(r,x,S,k,w/S,v),o&&(t.docView.minWidth=0,h|=8)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),n.heightChanged=!1;for(let x of this.viewports){let S=x.from==this.viewport.from?v:t.docView.measureVisibleLineHeights(x);this.heightMap=(o?te.empty().applyChanges(this.stateDeco,K.empty,this.heightOracle,[new Ve(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(n,0,o,new xh(x.from,S))}n.heightChanged&&(h|=2)}let y=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return y&&(this.viewport=this.getViewport(f,this.scrollTarget)),this.updateForViewport(),(h&2||y)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new An(n.lineAt(o-i*1e3,at.ByHeight,r,0,0).from,n.lineAt(l+(1-i)*1e3,at.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),u=n.lineAt(h,at.ByPos,r,0,0),c;e.y=="center"?c=(u.top+u.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&n>o-2*1e3&&r>1,o=n<<1;if(this.defaultTextDirection!=xt.LTR&&!i)return[];let l=[],a=(h,f,u,c)=>{if(f-hh&&mm.from>=u.from&&m.to<=u.to&&Math.abs(m.from-h)m.fromb));if(!g){if(fm.from<=f&&m.to>=f)){let m=e.moveToLineBoundary(V.cursor(f),!1,!0).head;m>h&&(f=m)}g=new Is(h,f,this.gapSize(u,h,f,c))}l.push(g)};for(let h of this.viewportLines){if(h.lengthh.from&&a(h.from,c,h,f),de.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];wt.spans(t,this.viewport.from,this.viewport.to,{span(n,r){e.push({from:n,to:r})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some((n,r)=>n.from!=e[r].from||n.to!=e[r].to);return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||Os(this.heightMap.lineAt(t,at.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return Os(this.heightMap.lineAt(this.scaler.fromDOM(t),at.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Os(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},An=class{constructor(t,e){this.from=t,this.to=e}};function Lb(s,t,e){let i=[],n=s,r=0;return wt.spans(e,s,t,{span(){},point(o,l){o>n&&(i.push({from:n,to:o}),r+=o-n),n=l}},20),n=1)return t[t.length-1].to;let i=Math.floor(s*e);for(let n=0;;n++){let{from:r,to:o}=t[n],l=o-r;if(i<=l)return r+i;i-=l}}function po(s,t){let e=0;for(let{from:i,to:n}of s.ranges){if(t<=n){e+=t-i;break}e+=n-i}return e/s.total}function Hb(s,t){for(let e of s)if(t(e))return e}var _d={toDOM(s){return s},fromDOM(s){return s},scale:1},Th=class{constructor(t,e,i){let n=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,at.ByPos,t,0,0).top,f=e.lineAt(a,at.ByPos,t,0,0).bottom;return n+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(e.height-n);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let r=eOs(n,t)):s._content)}var go=U.define({combine:s=>s.join(" ")}),Oh=U.define({combine:s=>s.indexOf(!0)>-1}),_h=ue.newName(),kp=ue.newName(),xp=ue.newName(),Sp={"&light":"."+kp,"&dark":"."+xp};function Eh(s,t,e){return new ue(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,n=>{if(n=="&")return s;if(!e||!e[n])throw new RangeError(`Unsupported selector: ${n}`);return e[n]}):s+" "+i}})}var Fb=Eh("."+_h,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Sp),_s="\\uFFFF",Dh=class{constructor(t,e){this.points=t,this.text="",this.lineSeparator=e.facet(dt.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=_s}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let n=t;;){this.findPointBefore(i,n);let r=this.text.length;this.readNode(n);let o=n.nextSibling;if(o==e)break;let l=ht.get(n),a=ht.get(o);(l&&a?l.breakAfter:(l?l.breakAfter:Ed(n))||Ed(o)&&(n.nodeName!="BR"||n.cmIgnore)&&this.text.length>r)&&this.lineBreak(),n=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=n.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=ht.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(Vb(t,i.node,i.offset)?e:0))}};function Vb(s,t,e){for(;;){if(!t||e-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:Gb(t),a=new Dh(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=Ub(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!rh(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!rh(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if(I.ios&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.toDate.now()-100?s.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=n.from,h=null;(r===8||I.android&&t.text.length=n.from&&e.to<=n.to&&(e.from!=n.from||e.to!=n.to)&&n.to-n.from-(e.to-e.from)<=4?e={from:n.from,to:n.to,insert:s.state.doc.slice(n.from,e.from).append(e.insert).append(s.state.doc.slice(e.to,n.to))}:(I.mac||I.android)&&e&&e.from==e.to&&e.from==n.head-1&&/^\\. ?$/.test(e.insert.toString())&&s.contentDOM.getAttribute("autocorrect")=="off"?(i&&e.insert.length==2&&(i=V.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:K.of([" "])}):I.chrome&&e&&e.from==e.to&&e.from==n.head&&e.insert.toString()==`\n `&&s.lineWrapping&&(i&&(i=V.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:K.of([" "])}),e){if(I.ios&&s.inputState.flushIOSKey()||I.android&&(e.from==n.from&&e.to==n.to&&e.insert.length==1&&e.insert.lines==2&&Tn(s.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||r==8&&e.insert.lengthn.head)&&Tn(s.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&Tn(s.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();s.inputState.composing>=0&&s.inputState.composing++;let l,a=()=>l||(l=zb(s,e,i));return s.state.facet(ip).some(h=>h(s,e.from,e.to,o,a))||s.dispatch(a()),!0}else if(i&&!i.main.eq(n)){let o=!1,l="select";return s.inputState.lastSelectionTime>Date.now()-50&&(s.inputState.lastSelectionOrigin=="select"&&(o=!0),l=s.inputState.lastSelectionOrigin),s.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function zb(s,t,e){let i,n=s.state,r=n.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&s.inputState.composing<0){let l=r.fromt.to?n.sliceDoc(t.to,r.to):"";i=n.replaceSelection(s.state.toText(l+t.insert.sliceString(0,void 0,s.state.lineBreak)+a))}else{let l=n.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(n.selection.ranges.length>1&&s.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=s.state.sliceDoc(t.from,t.to),f,u=e&&fp(s,e.main.head);if(u){let p=t.insert.length-(t.to-t.from);f={from:u.from,to:u.to-p}}else f=s.state.doc.lineAt(r.head);let c=r.to-t.to,d=r.to-r.from;i=n.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-c,m=g-h.length;if(p.to-p.from!=d||s.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=n.changes({from:m,to:g,insert:t.insert}),w=p.to-r.to;return{changes:b,range:a?V.range(Math.max(0,a.anchor+w),Math.max(0,a.head+w)):p.map(b)}})}else i={changes:l,selection:a&&n.selection.replaceRange(a)}}let o="input.type";return(s.composing||s.inputState.compositionPendingChange&&s.inputState.compositionEndedAt>Date.now()-50)&&(s.inputState.compositionPendingChange=!1,o+=".compose",s.inputState.compositionFirstChange&&(o+=".start",s.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:o,scrollIntoView:!0})}function Wb(s,t,e,i){let n=Math.min(s.length,t.length),r=0;for(;r0&&l>0&&s.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function Gb(s){let t=[];if(s.root.activeElement!=s.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}=s.observer.selectionRange;return e&&(t.push(new Oo(e,i)),(n!=e||r!=i)&&t.push(new Oo(n,r))),t}function Ub(s,t){if(s.length==0)return null;let e=s[0].pos,i=s.length==2?s[1].pos:e;return e>-1&&i>-1?V.single(e+t,i+t):null}var qb={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},sh=I.ie&&I.ie_version<=11,Ph=class{constructor(t){this.view=t,this.active=!1,this.selectionRange=new oh,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(I.ie&&I.ie_version<=11||I.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),sh&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500)}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(Do)?i.root.activeElement!=this.dom:!mo(i.dom,n))return;let r=n.anchorNode&&i.docView.nearest(n.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(I.ie&&I.ie_version<=11||I.android&&I.chrome)&&!i.state.selection.main.empty&&n.focusNode&&Es(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=I.safari&&t.root.nodeType==11&&P0(this.dom.ownerDocument)==this.dom&&jb(this.view)||yo(t.root);if(!e||this.selectionRange.eq(e))return!1;let i=mo(this.dom,e);return i&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&Tn(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(n=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&mo(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new Rh(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=Cp(this.view,e);return this.view.state==i&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=Dd(e,t.previousSibling||t.target.previousSibling,-1),n=Dd(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}};function Dd(s,t,e){for(;t;){let i=ht.get(t);if(i&&i.parent==s)return i;let n=t.parentNode;t=n!=s.dom?n:e>0?t.nextSibling:t.previousSibling}return null}function jb(s){let t=null;function e(a){a.preventDefault(),a.stopImmediatePropagation(),t=a.getTargetRanges()[0]}if(s.contentDOM.addEventListener("beforeinput",e,!0),s.dom.ownerDocument.execCommand("indent"),s.contentDOM.removeEventListener("beforeinput",e,!0),!t)return null;let i=t.startContainer,n=t.startOffset,r=t.endContainer,o=t.endOffset,l=s.docView.domAtPos(s.state.selection.main.anchor);return Es(l.node,l.offset,r,o)&&([i,n,r,o]=[r,o,i,n]),{anchorNode:i,anchorOffset:n,focusNode:r,focusOffset:o}}var et=class s{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:e}=t;this.dispatchTransactions=t.dispatchTransactions||e&&(i=>i.forEach(n=>e(n,this)))||(i=>this.update(i)),this.dispatch=this.dispatch.bind(this),this._root=t.root||L0(t.parent)||document,this.viewState=new To(t.state||dt.create(t)),t.scrollTo&&t.scrollTo.is(ho)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(As).map(i=>new Ps(i));for(let i of this.plugins)i.update(this);this.observer=new Ph(this),this.inputState=new wh(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Co(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure()}dispatch(...t){let e=t.length==1&&t[0]instanceof Ut?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,n,r=this.state;for(let c of t){if(c.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=c.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(c=>c.annotation(wp))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=yp(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(dt.phrases)!=this.state.facet(dt.phrases))return this.setState(r);n=So.create(this,r,t),n.flags|=l;let u=this.viewState.scrollTarget;try{this.updateState=2;for(let c of t){if(u&&(u=u.map(c.changes)),c.scrollIntoView){let{main:d}=c.state.selection;u=new Rs(d.empty?d:V.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of c.effects)d.is(ho)&&(u=d.value.clip(this.state))}this.viewState.update(n,u),this.bidiCache=_o.update(this.bidiCache,n.changes),n.empty||(this.updatePlugins(n),this.inputState.update(n)),e=this.docView.update(n),this.state.facet(Ts)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(c=>c.isUserEvent("select.pointer")))}finally{this.updateState=0}if(n.startState.facet(go)!=n.state.facet(go)&&(this.viewState.mustMeasureContent=!0),(e||i||u||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!n.empty)for(let c of this.state.facet(mh))try{c(n)}catch(d){ii(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!Cp(this,f)&&h.force&&Tn(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new To(t),this.plugins=t.facet(As).map(i=>new Ps(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new Co(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(As),i=t.state.facet(As);if(e!=i){let n=[];for(let r of i){let o=e.indexOf(r);if(o<0)n.push(new Ps(r));else{let l=this.plugins[o];l.mustUpdate=t,n.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let n of this.plugins)n.mustUpdate=t;for(let n=0;n-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Hd(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(n);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return ii(this.state,p),Rd}}),u=So.create(this,this.state,[]),c=!1;u.flags|=a,e?e.flags|=a:e=u,this.updateState=2,u.empty||(this.updatePlugins(u),this.inputState.update(u),this.updateAttrs(),c=this.docView.update(u));for(let d=0;d1||p<-1){n=n+p,i.scrollTop=n/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(mh))l(e)}get themeClasses(){return _h+" "+(this.state.facet(Oh)?xp:kp)+" "+this.state.facet(go)}updateAttrs(){let t=Pd(this,rp,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(Do)?"true":"false",class:"cm-content",style:`${I.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Pd(this,Hh,e);let i=this.observer.ignore(()=>{let n=uh(this.contentDOM,this.contentAttrs,e),r=uh(this.dom,this.editorAttrs,t);return n||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let n of i.effects)if(n.is(s.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=n.value}}mountStyles(){this.styleModules=this.state.facet(Ts);let t=this.state.facet(s.cspNonce);ue.mount(this.root,this.styleModules.concat(Fb).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return nh(this,t,bd(this,t,e,i))}moveByGroup(t,e){return nh(this,t,bd(this,t,e,i=>gb(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return V.cursor(r.side(e,n)+t.from,r.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return pb(this,t,e,i)}moveVertically(t,e,i){return nh(this,t,mb(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),cp(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let n=this.state.doc.lineAt(t),r=this.bidiSpans(n),o=r[Fe.find(r,t-n.from,-1,e)];return Ih(i,o.dir==xt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(sp)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>$b)return Xd(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||Yd(r.isolates,i=cd(this,t))))return r.order;i||(i=cd(this,t));let n=X0(t.text,e,i);return this.bidiCache.push(new _o(t.from,t.to,e,i,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||I.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Bd(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return ho.of(new Rs(typeof t=="number"?V.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return ho.of(new Rs(V.cursor(i.from),"start","start",i.top-t,e,!0))}static domEventHandlers(t){return En.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return En.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=ue.newName(),n=[go.of(i),Ts.of(Eh(`.${i}`,t))];return e&&e.dark&&n.push(Oh.of(!0)),n}static baseTheme(t){return Ja.lowest(Ts.of(Eh("."+_h,t,Sp)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&ht.get(i)||ht.get(t);return((e=n==null?void 0:n.rootView)===null||e===void 0?void 0:e.view)||null}};et.styleModule=Ts;et.inputHandler=ip;et.focusChangeEffect=np;et.perLineTextDirection=sp;et.exceptionSink=ep;et.updateListener=mh;et.editable=Do;et.mouseSelectionStyle=tp;et.dragMovesSelection=Zd;et.clickAddsSelectionRange=Qd;et.decorations=Vs;et.outerDecorations=op;et.atomicRanges=Fh;et.bidiIsolatedRanges=lp;et.scrollMargins=ap;et.darkTheme=Oh;et.cspNonce=U.define({combine:s=>s.length?s[0]:""});et.contentAttributes=Hh;et.editorAttributes=rp;et.lineWrapping=et.contentAttributes.of({class:"cm-lineWrapping"});et.announce=bt.define();var $b=4096,Rd={},_o=class s{constructor(t,e,i,n,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],n=t.length?t[t.length-1].dir:xt.LTR;for(let r=Math.max(0,t.length-10);r=0;n--){let r=i[n],o=typeof r=="function"?r(s):r;o&&fh(o,e)}return e}var C1=I.mac?"mac":I.windows?"win":I.linux?"linux":"key";var Kb=!I.ios;var Id={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};Kb&&(Id[".cm-line"].caretColor="transparent !important",Id[".cm-content"]={caretColor:"transparent !important"});var M1=/x/.unicode!=null?"gu":"g";var A1=et.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var si=class extends ti{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};si.prototype.elementClass="";si.prototype.toDOM=void 0;si.prototype.mapMode=Gt.TrackBefore;si.prototype.startSide=si.prototype.endSide=-1;si.prototype.point=!0;var Yb=0,Ue=class s{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=Yb++}static define(t){if(t!=null&&t.base)throw new Error("Can not derive from a modified tag");let e=new s([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new No;return e=>e.modified.indexOf(t)>-1?e:No.get(e.base||e,e.modified.concat(t).sort((i,n)=>i.id-n.id))}},Xb=0,No=class s{constructor(){this.instances=[],this.id=Xb++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&Jb(e,l.modified));if(i)return i;let n=[],r=new Ue(n,t,e);for(let l of e)l.instances.push(r);let o=Qb(e);for(let l of t.set)if(!l.modified.length)for(let a of o)n.push(s.get(l,a));return r}};function Jb(s,t){return s.length==t.length&&s.every((e,i)=>e==t[i])}function Qb(s){let t=[[]];for(let e=0;ei.length-e.length)}function Tp(s){let t=Object.create(null);for(let e in s){let i=s[e];Array.isArray(i)||(i=[i]);for(let n of e.split(" "))if(n){let r=[],o=2,l=n;for(let u=0;;){if(l=="..."&&u>0&&u+3==n.length){o=1;break}let c=/^"(?:[^"\\\\]|\\\\.)*?"|[^\\/!]+/.exec(l);if(!c)throw new RangeError("Invalid path: "+n);if(r.push(c[0]=="*"?"":c[0][0]==\'"\'?JSON.parse(c[0]):c[0]),u+=c[0].length,u==n.length)break;let d=n[u++];if(u==n.length&&d=="!"){o=0;break}if(d!="/")throw new RangeError("Invalid path: "+n);l=n.slice(u)}let a=r.length-1,h=r[a];if(!h)throw new RangeError("Invalid path: "+n);let f=new Ws(i,o,a>0?r.slice(0,a):null);t[h]=f.sort(t[h])}}return Zb.add(t)}var Zb=new j,Ws=class{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth{let o=n;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var T=Ue.define,Ro=T(),Si=T(),Mp=T(Si),Ap=T(Si),Ci=T(),Po=T(Ci),Vh=T(Ci),Ge=T(),$i=T(Ge),ze=T(),We=T(),zh=T(),zs=T(zh),Io=T(),_={comment:Ro,lineComment:T(Ro),blockComment:T(Ro),docComment:T(Ro),name:Si,variableName:T(Si),typeName:Mp,tagName:T(Mp),propertyName:Ap,attributeName:T(Ap),className:T(Si),labelName:T(Si),namespace:T(Si),macroName:T(Si),literal:Ci,string:Po,docString:T(Po),character:T(Po),attributeValue:T(Po),number:Vh,integer:T(Vh),float:T(Vh),bool:T(Ci),regexp:T(Ci),escape:T(Ci),color:T(Ci),url:T(Ci),keyword:ze,self:T(ze),null:T(ze),atom:T(ze),unit:T(ze),modifier:T(ze),operatorKeyword:T(ze),controlKeyword:T(ze),definitionKeyword:T(ze),moduleKeyword:T(ze),operator:We,derefOperator:T(We),arithmeticOperator:T(We),logicOperator:T(We),bitwiseOperator:T(We),compareOperator:T(We),updateOperator:T(We),definitionOperator:T(We),typeOperator:T(We),controlOperator:T(We),punctuation:zh,separator:T(zh),bracket:zs,angleBracket:T(zs),squareBracket:T(zs),paren:T(zs),brace:T(zs),content:Ge,heading:$i,heading1:T($i),heading2:T($i),heading3:T($i),heading4:T($i),heading5:T($i),heading6:T($i),contentSeparator:T(Ge),list:T(Ge),quote:T(Ge),emphasis:T(Ge),strong:T(Ge),link:T(Ge),monospace:T(Ge),strikethrough:T(Ge),inserted:T(),deleted:T(),changed:T(),invalid:T(),meta:Io,documentMeta:T(Io),annotation:T(Io),processingInstruction:T(Io),definition:Ue.defineModifier(),constant:Ue.defineModifier(),function:Ue.defineModifier(),standard:Ue.defineModifier(),local:Ue.defineModifier(),special:Ue.defineModifier()},_1=Wh([{tag:_.link,class:"tok-link"},{tag:_.heading,class:"tok-heading"},{tag:_.emphasis,class:"tok-emphasis"},{tag:_.strong,class:"tok-strong"},{tag:_.keyword,class:"tok-keyword"},{tag:_.atom,class:"tok-atom"},{tag:_.bool,class:"tok-bool"},{tag:_.url,class:"tok-url"},{tag:_.labelName,class:"tok-labelName"},{tag:_.inserted,class:"tok-inserted"},{tag:_.deleted,class:"tok-deleted"},{tag:_.literal,class:"tok-literal"},{tag:_.string,class:"tok-string"},{tag:_.number,class:"tok-number"},{tag:[_.regexp,_.escape,_.special(_.string)],class:"tok-string2"},{tag:_.variableName,class:"tok-variableName"},{tag:_.local(_.variableName),class:"tok-variableName tok-local"},{tag:_.definition(_.variableName),class:"tok-variableName tok-definition"},{tag:_.special(_.variableName),class:"tok-variableName2"},{tag:_.definition(_.propertyName),class:"tok-propertyName tok-definition"},{tag:_.typeName,class:"tok-typeName"},{tag:_.namespace,class:"tok-namespace"},{tag:_.className,class:"tok-className"},{tag:_.macroName,class:"tok-macroName"},{tag:_.propertyName,class:"tok-propertyName"},{tag:_.operator,class:"tok-operator"},{tag:_.comment,class:"tok-comment"},{tag:_.meta,class:"tok-meta"},{tag:_.invalid,class:"tok-invalid"},{tag:_.punctuation,class:"tok-punctuation"}]);var Gh,Dn=new j;function tw(s){return U.define({combine:s?t=>t.concat(s):void 0})}var ew=new j,ee=class{constructor(t,e,i=[],n=""){this.data=t,this.name=n,dt.prototype.hasOwnProperty("tree")||Object.defineProperty(dt.prototype,"tree",{get(){return jh(this)}}),this.parser=e,this.extension=[Rn.of(this),dt.languageData.of((r,o,l)=>{let a=Op(r,o,l),h=a.type.prop(Dn);if(!h)return[];let f=r.facet(h),u=a.type.prop(ew);if(u){let c=a.resolve(o-a.from,l);for(let d of u)if(d.test(c,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Op(t,e,i).type.prop(Dn)==this.data}findRegions(t){let e=t.facet(Rn);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(r,o)=>{if(r.prop(Dn)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(j.mounted);if(l){if(l.tree.prop(Dn)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(n(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;ai.isTop?e:void 0)]}),t.name)}configure(t,e){return new s(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function jh(s){let t=s.field(ee.state,!1);return t?t.tree:ct.empty}var $h=class{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},Gs=null,Kh=class s{constructor(t,e,i=[],n,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new s(t,e,[],ct.empty,0,i,[],null)}startParse(){return this.parser.startParse(new $h(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=ct.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let n=Date.now()+t;t=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(Hi.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=Gs;Gs=this;try{return t()}finally{Gs=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=_p(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,u,c)=>a.push({fromA:h,toA:f,fromB:u,toB:c})),i=Hi.applyChanges(i,a),n=ct.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),u=t.mapPos(h.to,-1);ft.from&&(this.fragments=_p(this.fragments,n,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends bn{createParse(e,i,n){let r=n[0].from,o=n[n.length-1].to;return{parsedPos:r,advance(){let a=Gs;if(a){for(let h of n)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new ct(Rt.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return Gs}};function _p(s,t,e){return Hi.applyChanges(s,[{fromA:t,toA:e,fromB:t,toB:e}])}var Us=class s{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new s(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=Kh.create(t.facet(Rn).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new s(i)}};ee.state=Qe.define({create:Us.init,update(s,t){for(let e of t.effects)if(e.is(ee.setState))return e.value;return t.startState.facet(Rn)!=t.state.facet(Rn)?Us.init(t.state):s.apply(t)}});var Pp=s=>{let t=setTimeout(()=>s(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Pp=s=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(s,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var Uh=typeof navigator!="undefined"&&(!((Gh=navigator.scheduling)===null||Gh===void 0)&&Gh.isInputPending)?()=>navigator.scheduling.isInputPending():null,iw=En.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(ee.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(ee.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Pp(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,a=r.context.work(()=>Uh&&Uh()||Date.now()>o,n+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:ee.setState.of(new Us(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>ii(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),Rn=U.define({combine(s){return s.length?s[0]:null},enables:s=>[ee.state,iw,et.contentAttributes.compute([s],t=>{let e=t.facet(s);return e&&e.name?{"data-language":e.name}:{}})]});var Yh=class s{constructor(t,e){this.specs=t;let i;function n(l){let a=ue.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?n(e.all):void 0,o=e.scope;this.scope=o instanceof ee?l=>l.prop(Dn)==o.data:o?l=>l==o:void 0,this.style=Wh(t.map(l=>({tag:l.tag,class:l.class||n(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new ue(i):null,this.themeType=e.themeType}static define(t,e){return new s(t,e||{})}};var F1=Yh.define([{tag:_.meta,color:"#404740"},{tag:_.link,textDecoration:"underline"},{tag:_.heading,textDecoration:"underline",fontWeight:"bold"},{tag:_.emphasis,fontStyle:"italic"},{tag:_.strong,fontWeight:"bold"},{tag:_.strikethrough,textDecoration:"line-through"},{tag:_.keyword,color:"#708"},{tag:[_.atom,_.bool,_.url,_.contentSeparator,_.labelName],color:"#219"},{tag:[_.literal,_.inserted],color:"#164"},{tag:[_.string,_.deleted],color:"#a11"},{tag:[_.regexp,_.escape,_.special(_.string)],color:"#e40"},{tag:_.definition(_.variableName),color:"#00f"},{tag:_.local(_.variableName),color:"#30a"},{tag:[_.typeName,_.namespace],color:"#085"},{tag:_.className,color:"#167"},{tag:[_.special(_.variableName),_.macroName],color:"#256"},{tag:_.definition(_.propertyName),color:"#00c"},{tag:_.comment,color:"#940"},{tag:_.invalid,color:"#f00"}]);var nw=Object.create(null),Ep=[Rt.none];var Dp=[],Rp=Object.create(null),sw=Object.create(null);for(let[s,t]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])sw[s]=rw(nw,t);function qh(s,t){Dp.indexOf(s)>-1||(Dp.push(s),console.warn(t))}function rw(s,t){let e=[];for(let l of t.split(" ")){let a=[];for(let h of l.split(".")){let f=s[h]||_[h];f?typeof f=="function"?a.length?a=a.map(f):qh(h,`Modifier ${h} used at start of tag`):a.length?qh(h,`Tag ${h} used as modifier`):a=Array.isArray(f)?f:[f]:qh(h,`Unknown highlighting tag ${h}`)}for(let h of a)e.push(h)}if(!e.length)return 0;let i=t.replace(/ /g,"_"),n=i+" "+e.map(l=>l.id),r=Rp[n];if(r)return r.id;let o=Rp[n]=Rt.define({id:Ep.length,name:i,props:[Tp({[i]:e})]});return Ep.push(o),o.id}var V1={rtl:It.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:xt.RTL}),ltr:It.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:xt.LTR}),auto:It.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var Jh=class s{constructor(t,e,i,n,r,o,l,a,h,f=0,u){this.p=t,this.stack=e,this.state=i,this.reducePos=n,this.pos=r,this.score=o,this.buffer=l,this.bufferBase=a,this.curContext=h,this.lookAhead=f,this.parent=u}toString(){return`[${this.stack.filter((t,e)=>e%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let n=t.parser.context;return new s(t,[],e,i,i,0,[],0,n?new Lo(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,n=t&65535,{parser:r}=this.p,o=r.dynamicPrecedence(n);if(o&&(this.score+=o),i==0){this.pushState(r.getGoto(this.state,n,!0),this.reducePos),n=2e3&&!(!((e=this.p.parser.nodeSet.types[n])===null||e===void 0)&&e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=h):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(n,a)}storeNode(t,e,i,n=4,r=!1){if(t==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&o.buffer[l-4]==0&&o.buffer[l-1]>-1){if(e==i)return;if(o.buffer[l-2]>=e){o.buffer[l-2]=i;return}}}if(!r||this.pos==i)this.buffer.push(t,e,i,n);else{let o=this.buffer.length;if(o>0&&this.buffer[o-4]!=0)for(;o>0&&this.buffer[o-2]>i;)this.buffer[o]=this.buffer[o-4],this.buffer[o+1]=this.buffer[o-3],this.buffer[o+2]=this.buffer[o-2],this.buffer[o+3]=this.buffer[o-1],o-=4,n>4&&(n-=4);this.buffer[o]=t,this.buffer[o+1]=e,this.buffer[o+2]=i,this.buffer[o+3]=n}}shift(t,e,i,n){if(t&131072)this.pushState(t&65535,this.pos);else if((t&262144)==0){let r=t,{parser:o}=this.p;(n>this.pos||e<=o.maxNode)&&(this.pos=n,o.stateFlag(r,1)||(this.reducePos=n)),this.pushState(r,i),this.shiftContext(e,i),e<=o.maxNode&&this.buffer.push(e,i,n,4)}else this.pos=n,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,n,4)}apply(t,e,i,n){t&65536?this.reduce(t):this.shift(t,e,i,n)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let n=this.pos;this.reducePos=this.pos=n+t.length,this.pushState(e,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),n=t.bufferBase+e;for(;t&&n==t.bufferBase;)t=t.parent;return new s(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new Qh(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(i==0)return!1;if((i&65536)==0)return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let n=[];for(let r=0,o;ra&1&&l==o)||n.push(e[r],o)}e=n}let i=[];for(let n=0;n>19,n=e&65535,r=this.stack.length-i*3;if(r<0||t.getGoto(this.stack[r],n,!1)<0){let o=this.findForcedReduction();if(o==null)return!1;e=o}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(n,r)=>{if(!e.includes(n))return e.push(n),t.allActions(n,o=>{if(!(o&393216))if(o&65536){let l=(o>>19)-r;if(l>1){let a=o&65535,h=this.stack.length-l*3;if(h>=0&&t.getGoto(this.stack[h],a,!1)>=0)return l<<19|65536|a}}else{let l=i(o,r+1);if(l!=null)return l}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:t}=this.p;return t.data[t.stateSlot(this.state,1)]==65535&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;ethis.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},Lo=class{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}},Qh=class{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=t&65535,i=t>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=n}},Zh=class s{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,this.index==0&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new s(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;t!=null&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new s(this.stack,this.pos,this.index)}};function qs(s,t=Uint16Array){if(typeof s!="string")return s;let e=null;for(let i=0,n=0;i=92&&o--,o>=34&&o--;let a=o-32;if(a>=46&&(a-=46,l=!0),r+=a,l)break;r*=46}e?e[n++]=r:e=new t(r)}return e}var Pn=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},Ip=new Pn,tf=class{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Ip,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,n=this.rangeIndex,r=this.pos+t;for(;ri.to:r>=i.to;){if(n==this.ranges.length-1)return null;let o=this.ranges[++n];r+=o.from-i.to,i=o}return r}clipPos(t){if(t>=this.range.from&&tt)return Math.max(t,e.from);return this.end}peek(t){let e=this.chunkOff+t,i,n;if(e>=0&&e=this.chunk2Pos&&il.to&&(this.chunk2=this.chunk2.slice(0,l.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=Ip,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let n of this.ranges){if(n.from>=e)break;n.to>t&&(i+=this.input.read(Math.max(n.from,t),Math.min(n.to,e)))}return i}},Mi=class{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;Fp(this.data,t,e,this.id,i.data,i.tokenPrecTable)}};Mi.prototype.contextual=Mi.prototype.fallback=Mi.prototype.extend=!1;var oi=class{constructor(t,e,i){this.precTable=e,this.elseToken=i,this.data=typeof t=="string"?qs(t):t}token(t,e){let i=t.pos,n=0;for(;;){let r=t.next<0,o=t.resolveOffset(1,1);if(Fp(this.data,t,e,0,this.data,this.precTable),t.token.value>-1)break;if(this.elseToken==null)return;if(r||n++,o==null)break;t.reset(o,t.token)}n&&(t.reset(i,t.token),t.acceptToken(this.elseToken,n))}};oi.prototype.contextual=Mi.prototype.fallback=Mi.prototype.extend=!1;function Fp(s,t,e,i,n,r){let o=0,l=1<0){let p=s[d];if(a.allows(p)&&(t.token.value==-1||t.token.value==p||lw(p,t.token.value,n,r))){t.acceptToken(p);break}}let f=t.next,u=0,c=s[o+2];if(t.next<0&&c>u&&s[h+c*3-3]==65535){o=s[h+c*3-1];continue t}for(;u>1,p=h+d+(d<<1),g=s[p],m=s[p+1]||65536;if(f=m)u=d+1;else{o=s[p+2],t.advance();continue t}}break}}function Np(s,t,e){for(let i=t,n;(n=s[i])!=65535;i++)if(n==e)return i-t;return-1}function lw(s,t,e,i){let n=Np(e,i,t);return n<0||Np(e,i,s)t)&&!i.type.isError)return e<0?Math.max(0,Math.min(i.to-1,t-25)):Math.min(s.length,Math.max(i.from+1,t+25));if(e<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return e<0?0:s.length}}var ef=class{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?Bp(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?Bp(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(tt)return this.nextStart=o,null;if(r instanceof ct){if(o==t){if(o=Math.max(this.safeFrom,t)&&(this.trees.push(r),this.start.push(o),this.index.push(0))}else this.index[e]++,this.nextStart=o+r.length}}},nf=class{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map(i=>new Pn)}getActions(t){let e=0,i=null,{parser:n}=t.p,{tokenizers:r}=n,o=n.stateSlot(t.state,3),l=t.curContext?t.curContext.hash:0,a=0;for(let h=0;hu.end+25&&(a=Math.max(u.lookAhead,a)),u.value!=0)){let c=e;if(u.extended>-1&&(e=this.addActions(t,u.extended,u.end,e)),e=this.addActions(t,u.value,u.end,e),!f.extend&&(i=u,e>c))break}}for(;this.actions.length>e;)this.actions.pop();return a&&t.setLookAhead(a),!i&&t.pos==this.stream.end&&(i=new Pn,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new Pn,{pos:i,p:n}=t;return e.start=i,e.end=Math.min(i+1,n.stream.end),e.value=i==n.stream.end?n.parser.eofTerm:0,e}updateCachedToken(t,e,i){let n=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(n,t),i),t.value>-1){let{parser:r}=i.p;for(let o=0;o=0&&i.p.parser.dialect.allows(l>>1)){(l&1)==0?t.value=l>>1:t.extended=l>>1;break}}}else t.value=0,t.end=this.stream.clipPos(n+1)}putAction(t,e,i,n){for(let r=0;rt.bufferLength*4?new ef(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t=this.stacks,e=this.minStackPos,i=this.stacks=[],n,r;if(this.bigReductionCount>300&&t.length==1){let[o]=t;for(;o.forceReduce()&&o.stack.length&&o.stack[o.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let o=0;oe)i.push(l);else{if(this.advanceStack(l,i,t))continue;{n||(n=[],r=[]),n.push(l);let a=this.tokens.getMainToken(l);r.push(a.value,a.end)}}break}}if(!i.length){let o=n&&aw(n);if(o)return ie&&console.log("Finish with "+this.stackID(o)),this.stackToTree(o);if(this.parser.strict)throw ie&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+e);this.recovering||(this.recovering=5)}if(this.recovering&&n){let o=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,r,i);if(o)return ie&&console.log("Force-finish "+this.stackID(o)),this.stackToTree(o.forceAll())}if(this.recovering){let o=this.recovering==1?1:this.recovering*3;if(i.length>o)for(i.sort((l,a)=>a.score-l.score);i.length>o;)i.pop();i.some(l=>l.reducePos>e)&&this.recovering--}else if(i.length>1){t:for(let o=0;o500&&h.buffer.length>500)if((l.score-h.score||l.buffer.length-h.buffer.length)>0)i.splice(a--,1);else{i.splice(o--,1);continue t}}}i.length>12&&i.splice(12,i.length-12)}this.minStackPos=i[0].pos;for(let o=1;o ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let h=t.curContext&&t.curContext.tracker.strict,f=h?t.curContext.hash:0;for(let u=this.fragments.nodeAt(n);u;){let c=this.parser.nodeSet.types[u.type.id]==u.type?r.getGoto(t.state,u.type.id):-1;if(c>-1&&u.length&&(!h||(u.prop(j.contextHash)||0)==f))return t.useNode(u,c),ie&&console.log(o+this.stackID(t)+` (via reuse of ${r.getName(u.type.id)})`),!0;if(!(u instanceof ct)||u.children.length==0||u.positions[0]>0)break;let d=u.children[0];if(d instanceof ct&&u.positions[0]==0)u=d;else break}}let l=r.stateSlot(t.state,4);if(l>0)return t.reduce(l),ie&&console.log(o+this.stackID(t)+` (via always-reduce ${r.getName(l&65535)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let a=this.tokens.getActions(t);for(let h=0;hn?e.push(p):i.push(p)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return Lp(t,e),!0}}runRecovery(t,e,i){let n=null,r=!1;for(let o=0;o ":"";if(l.deadEnd&&(r||(r=!0,l.restart(),ie&&console.log(f+this.stackID(l)+" (restarted)"),this.advanceFully(l,i))))continue;let u=l.split(),c=f;for(let d=0;u.forceReduce()&&d<10&&(ie&&console.log(c+this.stackID(u)+" (via force-reduce)"),!this.advanceFully(u,i));d++)ie&&(c=this.stackID(u)+" -> ");for(let d of l.recoverByInsert(a))ie&&console.log(f+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>l.pos?(h==l.pos&&(h++,a=0),l.recoverByDelete(a,h),ie&&console.log(f+this.stackID(l)+` (via recover-delete ${this.parser.getName(a)})`),Lp(l,i)):(!n||n.scoret.topRules[l][1]),n=[];for(let l=0;l=0)r(f,a,l[h++]);else{let u=l[h+-f];for(let c=-f;c>0;c--)r(l[h++],a,u);h++}}}this.nodeSet=new bs(e.map((l,a)=>Rt.define({name:a>=this.minRepeatTerm?void 0:l,id:a,props:n[a],top:i.indexOf(a)>-1,error:a==0,skipped:t.skippedNodes&&t.skippedNodes.indexOf(a)>-1}))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=1024;let o=qs(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let l=0;ltypeof l=="number"?new Mi(o,l):l),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let n=new sf(this,t,e,i);for(let r of this.wrappers)n=r(n,t,e,i);return n}getGoto(t,e,i=!1){let n=this.goto;if(e>=n[0])return-1;for(let r=n[e+1];;){let o=n[r++],l=o&1,a=n[r++];if(l&&i)return a;for(let h=r+(o>>1);r0}validAction(t,e){return!!this.allActions(t,i=>i==e?!0:null)}allActions(t,e){let i=this.stateSlot(t,4),n=i?e(i):void 0;for(let r=this.stateSlot(t,1);n==null;r+=3){if(this.data[r]==65535)if(this.data[r+1]==1)r=ri(this.data,r+2);else break;n=e(ri(this.data,r+1))}return n}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=ri(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];e.some((r,o)=>o&1&&r==n)||e.push(this.data[i],n)}}return e}configure(t){let e=Object.assign(Object.create(s.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map(i=>{let n=t.tokenizers.find(r=>r.from==i);return n?n.to:i})),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map((i,n)=>{let r=t.specializers.find(l=>l.from==i.external);if(!r)return i;let o=Object.assign(Object.assign({},i),{external:r.to});return e.specializers[n]=Hp(o),o})),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),t.strict!=null&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),t.bufferLength!=null&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return e==null?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map(()=>!1);if(t)for(let r of t.split(" ")){let o=e.indexOf(r);o>=0&&(i[o]=!0)}let n=null;for(let r=0;ri)&&e.p.parser.stateFlag(e.state,2)&&(!t||t.scores.external(e,i)<<1|t}return s.get}var hw=Ho.deserialize({version:14,states:")`QQOPOOOfOQO\'#C^OqOSO\'#C`O|OWO\'#CbO!XO`O\'#CeO!dOpO\'#CgOOOO\'#Ck\'#CkOOOO\'#Ci\'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<p.is(Aa)))return this.create(t.state);if(!t.docChanged)return s.inserted_ranges=[],s.deleted_ranges=[],s;let e=[];t.changes.iterChangedRanges((p,g,m,b)=>e.push({fromA:p,toA:g,fromB:m,toB:b}));let i=we.applyChanges(s.fragments,e),n=t.state.doc.toString(),r=Fo.parser.parse(new ps(t.state.doc),i);i=we.addTree(r,i);let o=new Map,l=[],a=new Map,h=new Set;for(let p of e){s.ranges.tree.search([p.fromA,p.toA],(g,m)=>{s.ranges.tree.remove(m,g),h.add(g);for(let b of g.base_range.thread)a.set(b.from,b);return!0});for(let g of of(r,n,p.fromB,p.toB))o.set(g.from,g);l.push([p.toA,p.toB-p.fromB-(p.toA-p.fromA)])}for(let p of h)p.type==="comment"&&a.delete(p.from);let f=0,u=s.ranges.tree.nil_node;function c(p){if(p!=null&&p!=u){for(c(p.left);l.length&&p.item.key.low>=l[0][0];)f+=l.shift()[1];p.item.value.apply_offset(f),p.item.key.low=p.item.value.from,p.item.key.high=p.item.value.to,c(p.right),p.left!=u&&(p.max.low=p.left.max.low),p.right!=u&&(p.max.high=p.right.max.high)}}c(s.ranges.tree.root);let d=Array.from(o.values());for(let p of d)s.ranges.tree.insert([p.from,p.to],p);for(let p of d)p.type==="comment"&&a.set(p.from,p);if(a.size){let p=[],g,m=[];for(let b of Array.from(a.values()).sort((w,y)=>w.from-y.from))b.clear_references(),b.replies.length=0,!g||g!=null&&g.right_adjacent(b)?m.push(b):(p.push(m),m=[b]),g=b;p.push(m);for(let b of p){let w=b[0],y=s.ranges.tree.search([w.from,w.from])[0];y.replies.length=0;for(let v of b.slice(y===w?1:0))v.add_reply(y)}}return s.ranges.ranges=s.ranges.tree.values,{tree:r,ranges:s.ranges,fragments:i,inserted_ranges:d,deleted_ranges:[...h]}}});function fw(s,t){var n,r;let e=fe.PLUGIN_SETTINGS.enable_metadata&&((n=s.firstChild)!=null&&n.type.name.startsWith("MDSep"))?s.firstChild.from:void 0,i;if(s.type.name==="Substitution"){let o=e?(r=s.firstChild)==null?void 0:r.nextSibling:s.firstChild;if(!o||o.type.name!=="MSub")return;i=o.from}return uw(s.from,s.to,s.type.name,t.slice(s.from,s.to),i,e)}function of(s,t,e=0,i=t.length){let n=[],r,o=s.cursor();if(o.childAfter(e-1),o.node.type.name==="CriticMarkup"||o.node.from>i)return n;if(o)do{let l=o.node;if(l.type.name==="\\u26A0")continue;let a=fw(l,t);a&&(a.type==="comment"&&r&&r.right_adjacent(a)&&a.add_reply(r),n.push(a),r=a)}while(o.nextSibling()&&o.node.from<=i);return n}function Vp(s){let t=Fo.parser.parse(s);return of(t,s)}function uw(s,t,e,i,n,r){switch(e){case"Addition":return new Ai(s,t,i,r);case"Deletion":return new Xi(s,t,i,r);case"Substitution":return new Qi(s,n,t,i,r);case"Highlight":return new Ji(s,t,i,r);case"Comment":return new Yi(s,t,i,r);default:return new Ai(s,t,i,r)}}var lv={addition:Ai,deletion:Xi,highlight:Ji,substitution:Qi,comment:Yi};function lf(){let s;return fe.PLUGIN_SETTINGS.add_metadata&&(s={},fe.PLUGIN_SETTINGS.add_author_metadata&&(s.author=fe.PLUGIN_SETTINGS.author||void 0),fe.PLUGIN_SETTINGS.add_timestamp_metadata&&(s.time=Math.floor(Date.now()/1e3)),Object.keys(s).length===0&&(s=void 0)),s}var Iv={addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",comment:"ignore_metadata",highlight:"ignore_metadata"},Nv={addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",comment:"stay_inside",highlight:"stay_inside"};function zp(s,t,e,i,n=0,r=0){if(!e)return{insert:t+s,start_offset:n,end_offset:r};let o=Ft[e],l=i&&Object.keys(i).length?JSON.stringify(i)+"@@":"",a=o[0]+l+(e==="substitution"?t+o[1]+s+o[2]:t+s+o[1]),h=o[0].length+l.length;return n+=h,r+=e==="substitution"?o[1].length:0,{insert:a,start_offset:n,end_offset:r}}function Vo(s,t,e=""){return zp(t,e,s,lf()).insert}var li=require("obsidian");function Wo(s,t){if(s.length!=t.length)return!1;for(let e=0;ethis.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}},Nn=class{constructor(t,e){this.view=t;this.config=e;N(this,"dom");N(this,"elements",[]);N(this,"markers");N(this,"spacer",null);this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,n=>{let r=n.target,o;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let a=r.getBoundingClientRect();o=(a.top+a.bottom)/2}else o=n.clientY;let l=t.lineBlockAtHeight(o-t.documentTop);e.domEventHandlers[i](t,l,n)&&n.preventDefault()});this.markers=Wp(e.markers(t)),e.initialSpacer&&(this.spacer=new In(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(t){let e=this.markers;if(this.markers=Wp(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],t);n!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[n])}let i=t.view.viewport;return!Y.eq(this.markers,e,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(t):!1)}destroy(){for(let t of this.elements)t.destroy()}},zo=class{constructor(t,e,i){this.view=t;this.unfixGutters=e;this.activeGutters=i;N(this,"gutters");N(this,"dom");N(this,"fixed");N(this,"prevViewport");this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.style.minHeight=this.view.contentHeight+"px",this.gutters=this.createGutters(t);for(let n of this.gutters)this.dom.appendChild(n.dom);this.fixed=!t.state.facet(this.unfixGutters),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),this.insertGutters(t)}createGutters(t){return t.state.facet(this.activeGutters).map(e=>new Nn(t,e))}insertGutters(t){t.contentDOM.parentNode.insertBefore(this.dom,t.contentDOM)}insertDetachedGutters(t){t.parentNode.insertBefore(this.dom,t)}getUpdateContexts(){return this.gutters.map(t=>new js(t,this.view.viewport,-this.view.documentPadding.top))}update(t){if(this.updateGutters(t)){let e=this.prevViewport,i=t.view.viewport,n=Math.min(e.to,i.to)-Math.max(e.from,i.from);this.syncGutters(n<(i.to-i.from)*.8)}t.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(this.unfixGutters)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&this.dom.remove();let i=Y.iter(this.view.state.facet(Br),this.view.viewport.from),n=[],r=this.getUpdateContexts();for(let o of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(o.type)){let l=!0;for(let a of o.type)if(a.type==Yt.Text&&l){af(i,n,a.from);for(let h of r)h.line(this.view,a,n);l=!1}else if(a.widget)for(let h of r)h.widget(this.view,a)}else if(o.type==Yt.Text){af(i,n,o.from);for(let l of r)l.line(this.view,o,n)}for(let o of r)o.finish();t&&this.insertDetachedGutters(e)}updateGutters(t){let e=t.startState.facet(this.activeGutters),i=t.state.facet(this.activeGutters),n=t.docChanged||t.heightChanged||t.viewportChanged||!Y.eq(t.startState.facet(Br),t.state.facet(Br),t.view.viewport.from,t.view.viewport.to);if(e==i)for(let r of this.gutters)r.update(t)&&(n=!0);else{n=!0;let r=[];for(let o of i){let l=e.indexOf(o);l<0?r.push(new Nn(this.view,o)):(this.gutters[l].update(t),r.push(this.gutters[l]))}for(let o of this.gutters)o.dom.remove(),r.indexOf(o)<0&&o.destroy();for(let o of r)this.dom.appendChild(o.dom);this.gutters=r}return n}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove()}};function Gp(s){return Je.fromClass(s,{provide:t=>G.scrollMargins.of(e=>{let i=e.plugin(t);return!i||i.gutters.length==0||!i.fixed?null:e.textDirection==gt.LTR?{left:i.dom.offsetWidth}:{right:i.dom.offsetWidth}})})}var _t=require("obsidian");var qp=require("obsidian");function Go(s,t){let e=Object.keys(t).map(i=>dw(s,i,t[i]));return e.length===1?e[0]:function(){e.forEach(i=>i())}}function dw(s,t,e){let i=s[t],n=s.hasOwnProperty(t),r=n?i:function(){return Object.getPrototypeOf(s)[t].apply(this,arguments)},o=e(r);return i&&Object.setPrototypeOf(o,i),Object.setPrototypeOf(l,o),s[t]=l,a;function l(...h){return o===r&&s[t]===l&&a(),o.apply(this,h)}function a(){s[t]===l&&(n?s[t]=r:delete s[t]),o!==r&&(o=r,Object.setPrototypeOf(l,i||Function))}}function pw(s){let t=s.embedRegistry.embedByExtension.md({app:s,containerEl:document.createElement("div")},null,"");t.editable=!0,t.showEditor();let e=Object.getPrototypeOf(Object.getPrototypeOf(t.editMode));return t.unload(),e.constructor}var Up={cursorLocation:{anchor:0,head:0},value:"",cls:"",placeholder:"",focus:!0,filteredExtensions:[],onEnter:(s,t,e)=>(t&&s.options.onSubmit(s),t),onEscape:s=>{s.options.onBlur(s)},onSubmit:()=>{},onBlur:()=>{},onPaste:()=>{},onChange:()=>{}},Uo=class extends pw(app){constructor(e,i,n){var r,o,l;super(e,i,{app:e,onMarkdownScroll:()=>{},getMode:()=>"source"});N(this,"options");N(this,"initial_value");N(this,"scope");this.options=Xs(Xs({},Up),n),this.initial_value=this.options.value,this.scope=new qp.Scope(this.app.scope),this.scope.register(["Mod"],"Enter",(a,h)=>!0),this.owner.editMode=this,this.owner.editor=this.editor,this.set(n.value||"",!0),this.register(Go(this.app.workspace,{setActiveLeaf:a=>(h,f)=>{this.activeCM.hasFocus||a.call(this.app.workspace,h,f)}})),this.options.onBlur!==Up.onBlur&&((r=this.editor)==null||r.cm.contentDOM.addEventListener("blur",()=>{this._loaded&&this.options.onBlur(this)})),(o=this.editor)==null||o.cm.contentDOM.addEventListener("focusin",()=>{this.app.keymap.pushScope(this.scope),this.app.workspace.activeEditor=this.owner}),this.editorEl.classList.remove("markdown-source-view"),n.cls&&this.editorEl.classList.add(n.cls),n.cursorLocation&&((l=this.editor)==null||l.cm.dispatch({selection:B.range(n.cursorLocation.anchor,n.cursorLocation.head)}))}onUpdate(e,i){super.onUpdate(e,i),i&&this.options.onChange(e)}buildLocalExtensions(){let e=super.buildLocalExtensions();return this.options.placeholder&&e.push(bc(this.options.placeholder)),e.push(G.domEventHandlers({paste:i=>{this.options.onPaste(i,this)}})),e.push(on.highest(fa.of([{key:"Enter",run:i=>this.options.onEnter(this,!1,!1),shift:i=>this.options.onEnter(this,!1,!0)},{key:"Mod-Enter",run:i=>this.options.onEnter(this,!0,!1),shift:i=>this.options.onEnter(this,!0,!0)},{key:"Escape",run:i=>(this.options.onEscape(this),!0),preventDefault:!0}]))),e}getDynamicExtensions(){return super.getDynamicExtensions().filter(e=>!this.options.filteredExtensions.includes(e))}updateBottomPadding(e){return 0}destroy(){this._loaded&&this.unload(),this.app.keymap.popScope(this.scope),this.app.workspace.activeEditor===this.owner&&(this.app.workspace.activeEditor=null),this.containerEl.empty(),super.destroy()}onunload(){super.onunload(),this.destroy()}onload(){var e;super.onload(),this.options.focus&&((e=this.editor)==null||e.focus())}};var gw="0.2.3";var pk={version:gw,default_edit_mode:1,default_preview_mode:0,comment_style:"icon",editor_styling:!1,markup_focus:{0:{show_styling:!0,show_syntax:!0,show_metadata:!0,focus_annotation:!0,show_comment:!0},1:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1},2:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1}},diff_gutter:!0,diff_gutter_hide_empty:!0,annotation_gutter:!0,annotation_gutter_included_types:31,annotation_gutter_hide_empty:!0,annotation_gutter_default_fold_state:!1,annotation_gutter_fold_button:!0,annotation_gutter_resize_handle:!0,annotation_gutter_focus_on_click:!0,annotation_gutter_width:300,tag_completion:!0,tag_correcter:!0,clipboard_remove_syntax:!0,edit_info:!0,toolbar_preview_button:!0,toolbar_edit_button:!0,toolbar_show_buttons_labels:!0,status_bar_preview_button:!0,status_bar_edit_button:!0,status_bar_metadata_button:!0,database_workers:2,post_processor:!0,live_preview:!0,alternative_cursor_movement:!0,enable_metadata:!1,enable_author_metadata:!1,enable_timestamp_metadata:!1,enable_completed_metadata:!1,enable_style_metadata:!1,enable_color_metadata:!1,add_metadata:!1,add_author_metadata:!1,add_timestamp_metadata:!1,add_completed_metadata:!1,add_style_metadata:!1,add_color_metadata:!1,author:"",suggestion_mode_operations:{cursor_movement:{addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",highlight:"ignore_metadata",comment:"ignore_completely"},bracket_movement:{addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",highlight:"stay_inside",comment:"stay_inside"}}};var $s=require("obsidian");var jp=(s=!1)=>{let t=Go($s.Menu.prototype,{onEnter:e=>function(i){let n=this.items[this.selected];return n&&n instanceof $s.MenuItem&&n.handleEvent(i)||!0},onMenuClick:e=>function(i){if(!s||this.currentSubmenu&&this.currentSubmenu.dom.contains(i.target))i.stopImmediatePropagation();else return e&&e.apply(this,[i])},hide:e=>function(){return this.parentMenu||t(),e&&e.apply(this)}});return t};var hf=class extends _t.Component{constructor(e,i){super();this.range=e;this.marker=i;N(this,"text");N(this,"new_text",null);N(this,"annotation_container");N(this,"metadata_view",null);N(this,"annotation_view");N(this,"currentMode",null);N(this,"editMode",null);this.text=e.unwrap(),this.annotation_container=this.marker.annotation_thread.createDiv({cls:"cmtr-anno-gutter-annotation"}),this.annotation_container.addEventListener("blur",this.renderPreview.bind(this)),this.annotation_container.addEventListener("dblclick",this.renderSource.bind(this)),this.annotation_container.addEventListener("contextmenu",this.onCommentContextmenu.bind(this)),this.range.metadata&&this.renderMetadata(),this.annotation_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-view"}),this.renderPreview()}onload(){super.onload()}onunload(){super.onunload(),this.annotation_container.remove(),this.editMode=null}renderMetadata(){if(this.metadata_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-metadata"}),this.range.fields.author){let e=createSpan({cls:"cmtr-anno-gutter-annotation-author-label",text:"Author: "});this.metadata_view.appendChild(e);let i=createSpan({cls:"cmtr-anno-gutter-annotation-author-name",text:this.range.fields.author});this.metadata_view.appendChild(i)}if(this.range.fields.time){if(this.metadata_view.children.length>0){let n=createSpan({cls:"cmtr-anno-gutter-annotation-metadata-separator",text:" \\u2022 "});this.metadata_view.appendChild(n)}let e=createSpan({cls:"cmtr-anno-gutter-annotation-time-label",text:"Updated at: "});this.metadata_view.appendChild(e);let i=createSpan({cls:"cmtr-anno-gutter-annotation-time",text:window.moment.unix(this.range.fields.time).format("MMM DD YYYY, HH:mm")});this.metadata_view.appendChild(i)}}renderSource(e){if(this.range.type!=="comment")new _t.Notice("[Commentator] You can only edit comments.");else{if(e==null||e.stopPropagation(),this.currentMode==="source")return;let{app:i}=this.marker.view.state.field(_t.editorInfoField);if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!0),this.range.fields.author&&this.range.fields.author!==i.plugins.plugins.commentator.settings.author){new _t.Notice("[Commentator] You cannot edit comments from other authors.");return}this.annotation_view.empty(),this.editMode=this.addChild(new Uo(i,this.annotation_view,{value:this.text,cls:"cmtr-anno-gutter-annotation-editor",onSubmit:n=>{this.new_text=n.get(),this.renderPreview()},filteredExtensions:[i.plugins.plugins.commentator.editorExtensions],onBlur:this.renderPreview.bind(this)})),this.currentMode="source"}}renderPreview(){if(this.currentMode!=="preview")if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!1),this.text===this.new_text||this.new_text===null){let{app:e}=this.marker.view.state.field(_t.editorInfoField);if(this.new_text=null,this.editMode&&(this.removeChild(this.editMode),this.editMode=null),this.annotation_view.empty(),this.range.type!=="substitution")switch(_t.MarkdownRenderer.render(e,this.text||" ",this.annotation_view,"",this),this.range.type){case"addition":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Added: "}));break;case"deletion":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Deleted: "}));break;case"highlight":break;case"comment":break}else{let i=this.range.unwrap_parts();_t.MarkdownRenderer.render(e,i[0]||" ",this.annotation_view,"",this),this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Changed: "}));let n=this.annotation_view.children.length;_t.MarkdownRenderer.render(e,i[1]||" ",this.annotation_view,"",this),this.annotation_view.children[n].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"To: "}))}this.annotation_view.addClass("cmtr-anno-gutter-annotation-"+this.range.type),this.currentMode="preview"}else this.text=this.new_text,setTimeout(()=>this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:Vo("comment",this.new_text)}}))}onCommentContextmenu(e){e.preventDefault(),e.stopPropagation(),jp(!0);let i=new _t.Menu;this.range.type!=="comment"&&this.range.type!=="highlight"&&(i.addItem(n=>{n.setTitle("Accept changes").setIcon("check").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:Yp(this.marker.view.state,this.range.from,this.range.to)})})}),i.addItem(n=>{n.setTitle("Reject changes").setIcon("cross").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:Xp(this.marker.view.state,this.range.from,this.range.to)})})})),this.range.type==="comment"?(this.range.replies.length>0&&i.addItem(n=>{n.setTitle("Close comment thread").setIcon("message-square-off").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.full_range_front,to:this.range.full_range_back,insert:""}})})}),i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ks(this.marker.view,this.range)})}),i.addItem(n=>{n.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(()=>{this.renderSource()})}),i.addItem(n=>{n.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:""}})})})):this.range.type!=="highlight"?(i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ks(this.marker.view,this.range)})}),this.range.replies.length>0&&i.addItem(n=>{n.setTitle("Remove all comments").setIcon("message-square-x").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.replies[0].from,to:this.range.replies[this.range.replies.length-1].to,insert:""}})})})):i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ks(this.marker.view,this.range)})}),i.addItem(n=>{n.setTitle("Fold gutter").setSection("gutter-controls").setIcon("arrow-right-from-line").onClick(()=>{this.marker.view.dispatch({annotations:[jo.of(null)]})})}),i.addItem(n=>{let r=n.setTitle("Included annotations").setIcon("eye").setSection("gutter-controls").setSubmenu(),o=this.marker.view.state.facet(gn);for(let{title:l,icon:a,value:h}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])r.addItem(f=>{f.setTitle(l).setIcon(a).setChecked((o&h)!==0).onClick(()=>{o^=h;let u=(o&h)!==0;f.checkIconEl?f.checkIconEl.style.display=u?"flex":"none":f.setChecked(u),this.marker.view.dispatch(this.marker.view.state.update({effects:[Oc.reconfigure(gn.of(o))]}))})})}),i.showAtPosition(e)}},qo=class extends be{constructor(e,i,n,r=0){super();this.annotation=e;this.annotations=i;this.view=n;this.itr=r;N(this,"annotation_thread");N(this,"component",new _t.Component);N(this,"preventUnload",!1)}eq(e){return this.itr===e.itr&&this.annotations===e.annotations&&this.annotations[0].equals(e.annotations[0])}onCommentThreadClick(){this.view.dispatch({annotations:[$o.of({marker:this,index:-1,scroll:!0,focus_markup:!0})]}),this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0)}toDOM(){this.annotation_thread=createDiv({cls:"cmtr-anno-gutter-thread"}),this.annotation_thread.addEventListener("click",this.onCommentThreadClick.bind(this));for(let e of this.annotations)this.component.addChild(new hf(e,this));return this.component.load(),this.annotation_thread}focus(){this.annotation_thread.focus()}focus_annotation(e=-1,i=!1){e===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0):e>=0&&e{let n=this.view.lineBlockAt(this.annotations[0].from).top-100;this.view.scrollDOM.scrollTo({top:n,behavior:"smooth"})},200)}unfocus_annotation(e=-1){e===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!1):this.annotation_thread.children.item(e).classList.toggle("cmtr-anno-gutter-thread-highlight",!1)}destroy(e){this.component.unload(),this.annotation_thread.remove(),super.destroy(e)}};function $p(s,t,e){let i=s.field(_t.editorEditorField),n=(e&1)!==0,r=(e&2)!==0,o=(e&4)!==0,l=(e&8)!==0,a=(e&16)!==0,h=[];for(let f of t){let u=f.full_thread;switch(a||(u=u.slice(0,1)),f.type){case"addition":n||u.shift();break;case"deletion":r||u.shift();break;case"substitution":o||u.shift();break;case"highlight":l||u.shift();break;case"comment":a||u.shift();break}if(u.length){let c=new qo(f,u,i,Kp);c.preventUnload=!0,h.push(c.range(f.from,f.to))}}return h}var Kp=0,Ki=Ct.define({create(s){let t=s.field(de).ranges.ranges.reduce((e,i)=>{let n=i.base_range;return e.includes(n)||e.push(n),e},[]);return Y.of($p(s,t,s.facet(gn)))},update(s,t){let e=t.state.facet(gn);if(t.startState.facet(gn)!==e)return this.create(t.state);if(!t.docChanged)return s;Kp+=1;let i=[];for(let r of t.state.field(de).inserted_ranges)i.includes(r.base_range)||i.push(r.base_range);let n=t.state.field(de).deleted_ranges.map(r=>r.base_range);return s.map(t.changes).update({filter:(r,o,l)=>{let a=!n.includes(l.annotation);return l.preventUnload=a,a},add:$p(t.state,i.map(r=>r.full_thread[0]),e)})}});var Ko=require("obsidian");var Yo=ot.define(),ff=Ct.define({create(s){return{from:s.selection.main.from,to:s.selection.main.to}},update(s,t){for(let e of t.effects)if(e.is(Yo))return e.value;return s}}),mw=Ct.define({create(s){return J.none},update(s,t){var n;let e=t.startState.field(ff,!1),i=t.state.field(ff);if(e!==i){let r=t.state.field(de).ranges.ranges_in_interval(i.from,i.to);return r.length&&r[0].base_range===((n=r.at(-1))==null?void 0:n.base_range)&&i.from>=r[0].from&&i.to<=r.at(-1).to?Y.of([J.mark({attributes:{class:"cmtr-focused"}}).range(r[0].full_range_front,r[0].full_range_back)]):J.none}else return s},provide(s){return G.decorations.from(s)}});var ww=require("obsidian");var Qk=J.replace({});var Jp=60,yw=L.define({combine:s=>s.some(t=>t)}),Qp=L.define(),Ys=Mt.define(),jo=Mt.define(),$o=Mt.define(),Zp=Mt.define(),tg=Mt.define(),eg=Mt.define(),ig=Mt.define(),Xo=class extends zo{constructor(e){super(e,yw,Qp);N(this,"previously_focused");N(this,"debouncedMoveGutter",(0,li.debounce)(this.moveGutter.bind(this),200));e.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{e.dispatch(e.state.update({effects:[ng.reconfigure([])]}))}))}createGutters(e){return e.state.facet(Qp).map(i=>new cf(e,i,this.dom))}insertGutters(e){e.contentDOM.parentNode.insertBefore(this.dom,e.contentDOM.nextSibling)}insertDetachedGutters(e){this.view.contentDOM.parentNode.insertBefore(this.dom,this.view.contentDOM.nextSibling)}getUpdateContexts(){return this.gutters.map(e=>new uf(e,this.view.viewport,-this.view.documentPadding.top))}update(e){for(let i of e.transactions){let n=i.annotation($o);if(n){let{marker:r,index:o,scroll:l=!1,focus_markup:a=!1}=n;this.unfocusAnnotation(),this.focusAnnotation(r,o,l,a)}}super.update(e)}unfocusAnnotation(){var e;(e=this.previously_focused)==null||e.unfocus_annotation(),this.previously_focused=void 0}focusAnnotation(e,i,n=!1,r=!1){this.previously_focused=e,this.debouncedMoveGutter(e),e.focus_annotation(i,n),r&&setTimeout(()=>{this.view.dispatch(this.view.state.update({effects:[Yo.of({from:e.annotation.from,to:e.annotation.full_range_back})]}))})}updateGutters(e){let i=e.transactions.flatMap(n=>n.annotation(Ys)).find(n=>n);if((i||e.startState.selection!==e.state.selection)&&this.unfocusAnnotation(),i){let{from:n,to:r,index:o=-1,scroll:l=!1}=i;t:for(let a of this.gutters[0].elements)if(n>=a.block.from){for(let h of a.markers)if(n>=h.annotation.from&&r<=h.annotation.full_range_back){this.focusAnnotation(h,o,l);break t}}else if(nh.markers.includes(e));if(!n)return;let r=n.markers.indexOf(e),o=n.block.top,l=n.dom.children[r].offsetTop,a=o-l;if(Math.abs(a)>=10&&a){let h=i.elements[0];h.dom.style.marginTop=parseInt(h.dom.style.marginTop||"0")+a+"px"}}foldGutter(){this.gutters[0].foldGutter()}},vw=Gp(Xo);var uf=class extends js{constructor(e,i,n){super(e,i,n);this.gutter=e;this.height=n;N(this,"previous_element_end",0);N(this,"new_gutter_elements",[]);N(this,"added_elements",[]);this.previous_element_end=n}async addElement(e,i,n){var f;let r=Math.max(i.top-this.previous_element_end,0),o=r<=0?this.previous_element_end:i.top;n.sort((u,c)=>u.annotation.from-c.annotation.from);let a=((f=this.gutter.elements[this.i])==null?void 0:f.dom.clientHeight)||36,h=this.gutter.elements.findIndex(u=>Wo(u.markers,n));if(h!==-1){let u=this.gutter.elements[h];for(let c=this.i;c{this.folded=!this.folded,this.view.state.field(li.editorInfoField).app.workspace.requestSaveLayout(),this.foldGutter()},this.setFoldButtonState(),this.view.dom.prepend(this.fold_button_el)}createResizeHandle(){this.resize_handle_el=createEl("hr",{cls:["cmtr-anno-gutter-resize-handle"]}),this.resize_handle_el.style.display=this.view.state.field(Ki).size&&!this.folded?"":"none",this.resize_handle_el.addEventListener("mousedown",e=>{var a;let i=e.clientX,n=(0,li.debounce)(h=>{this.width=h,this.view.state.field(li.editorInfoField).app.workspace.requestSaveLayout(),this.dom.style.width=this.width+"px",this.fold_button_el&&(this.fold_button_el.style.right=this.width+Jp+"px")},25);this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!0),(a=this.fold_button_el)==null||a.classList.toggle("cmtr-anno-gutter-moving",!0),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!0);let r=parseInt(this.dom.style.width.slice(0,-2)),o=h=>{let f=h.clientX-i;return i=h.clientX,r-=f,n(r),!0},l=()=>{var h;document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",l),this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!1),(h=this.fold_button_el)==null||h.classList.toggle("cmtr-anno-gutter-moving",!1),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!1)};return document.addEventListener("mousemove",o),document.addEventListener("mouseup",l),!0}),this.gutterDom.appendChild(this.resize_handle_el)}setFoldButtonState(){this.fold_button_el&&(this.folded?(this.fold_button_el.style.right="20px",this.fold_button_el.style.rotate="-180deg",this.fold_button_el.ariaLabel="Unfold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="none")):(this.fold_button_el.style.right=this.width+Jp+"px",this.fold_button_el.style.rotate="0deg",this.fold_button_el.ariaLabel="Fold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="")))}foldGutter(){this.setFoldButtonState(),this.folded?this.elements.forEach(e=>{Array.from(e.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(i=>{i.setAttribute("style",`max-height: ${i.clientHeight}px; overflow: hidden;`)})}):this.dom.addEventListener("transitionend",()=>{this.elements.forEach(e=>{Array.from(e.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(i=>{i.setAttribute("style","")})})},{once:!0}),this.dom.style.width=this.folded?"0":this.width+"px"}update(e){let i=super.update(e),n=e.state.field(Ki);for(let r of e.transactions){let o=r.annotation(jo),l=r.annotation(Zp),a=r.annotation(tg),h=r.annotation(eg),f=r.annotation(ig);l!==void 0&&(this.width=l,!this.hide_on_empty&&!this.folded&&(this.dom.style.width=l+"px",this.setFoldButtonState())),o!==void 0&&(o===null?(this.folded=!this.folded,this.view.state.field(li.editorInfoField).app.workspace.requestSaveLayout()):this.folded=o,this.foldGutter()),a!==void 0&&(this.hide_on_empty=a,this.hide_on_empty&&n.size===0?this.dom.style.width="0":this.dom.style.width=this.width+"px"),h!==void 0&&(this.add_fold_button=h,this.add_fold_button&&!this.fold_button_el?this.createFoldButton():!this.add_fold_button&&this.fold_button_el&&(this.fold_button_el.remove(),this.fold_button_el=void 0),this.setFoldButtonState()),f!==void 0&&(this.add_resize_handle=f,this.add_resize_handle&&!this.resize_handle_el?this.createResizeHandle():!this.add_resize_handle&&this.resize_handle_el&&(this.resize_handle_el.remove(),this.resize_handle_el=void 0))}return n.size!==e.startState.field(Ki).size&&(n.size===0?(this.fold_button_el&&(this.fold_button_el.style.display="none"),this.resize_handle_el&&(this.resize_handle_el.style.display="none"),this.hide_on_empty&&(this.dom.style.width="0")):(this.fold_button_el&&(this.fold_button_el.style.display=""),this.resize_handle_el&&(this.resize_handle_el.style.display=""),this.folded||(this.dom.style.width=this.width+"px"))),i}destroy(){var e,i;(e=this.fold_button_el)==null||e.remove(),(i=this.resize_handle_el)==null||i.remove(),super.destroy()}},df=class extends In{constructor(e,i,n,r,o=null){super(e,i,n,r);this.block=o}update(e,i,n,r,o=null){this.block=o,this.above!=n&&(this.dom.style.marginTop=(this.above=n)?n+"px":""),Wo(this.markers,r)||this.setMarkers(e,r)}};var ng=new se;function Ks(s,t,e=!1){let i=t?t.full_range_back:s.state.selection.main.head,n=t?t.full_thread.length:-1;s.dispatch(s.state.update({changes:{from:i,to:i,insert:Vo("comment","")},selection:B.cursor(i),scrollIntoView:e})),setTimeout(()=>{s.dispatch(s.state.update({annotations:[Ys.of({from:i,to:i,index:n})]}))})}function Yp(s,t,e,i=!0){let n=s.field(de).ranges;return(t||e?n.ranges_in_interval(t!=null?t:0,e!=null?e:1/0):n.ranges).filter(r=>r.type==="addition"||r.type==="deletion"||r.type==="substitution").map(r=>({from:r.from,to:i?r.full_range_back:r.to,insert:r.accept()}))}function Xp(s,t,e,i=!0){let n=s.field(de).ranges;return(t||e?n.ranges_in_interval(t!=null?t:0,e!=null?e:1/0):n.ranges).filter(r=>r.type==="addition"||r.type==="deletion"||r.type==="substitution").map(r=>({from:r.from,to:i?r.full_range_back:r.to,insert:r.reject()}))}var Jo=dg(sg(),1);Jo.default.DIFF_DELETE=-1;Jo.default.DIFF_INSERT=1;Jo.default.DIFF_EQUAL=0;async function rg(s,t){return fe.PLUGIN_SETTINGS=t,await Promise.all(s.map(async e=>Vp(e)))}self.onmessage=async s=>{self.postMessage(await rg(s.data.files,s.data.settings))};\n//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vZGlmZi1tYXRjaC1wYXRjaC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL2RlZmluaXRpb25zLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9yYW5nZXMvYmFzZV9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL2FkZGl0aW9uX3JhbmdlLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9yYW5nZXMvdHlwZXMvY29tbWVudF9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL2RlbGV0aW9uX3JhbmdlLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9yYW5nZXMvdHlwZXMvaGlnaGxpZ2h0X3JhbmdlLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9yYW5nZXMvdHlwZXMvc3Vic3RpdHV0aW9uX3JhbmdlLnRzIiwgIi4uLy4uL0BtYXJpam4vZmluZC1jbHVzdGVyLWJyZWFrL3NyYy9pbmRleC5qcyIsICIuLi8uLi9AY29kZW1pcnJvci9zdGF0ZS9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL0BmbGF0dGVuLWpzL2ludGVydmFsLXRyZWUvZGlzdC9tYWluLm1qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL2dyb3VwZWRfcmFuZ2UudHMiLCAiLi4vLi4vc3R5bGUtbW9kL3NyYy9zdHlsZS1tb2QuanMiLCAiLi4vLi4vdzNjLWtleW5hbWUvaW5kZXguanMiLCAiLi4vLi4vQGNvZGVtaXJyb3Ivdmlldy9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL0BsZXplci9jb21tb24vZGlzdC9pbmRleC5qcyIsICIuLi8uLi9AbGV6ZXIvaGlnaGxpZ2h0L2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vQGNvZGVtaXJyb3IvbGFuZ3VhZ2UvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZ2xvYmFsLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3Ivc2V0dGluZ3MvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvQGxlemVyL2NvbW1vbi9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0Bjb2RlbWlycm9yL3N0YXRlL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvc3R5bGUtbW9kL3NyYy9zdHlsZS1tb2QuanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvdzNjLWtleW5hbWUvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvQGNvZGVtaXJyb3Ivdmlldy9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0BsZXplci9oaWdobGlnaHQvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL25vZGVfbW9kdWxlcy9AY29kZW1pcnJvci9sYW5ndWFnZS9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0BsZXplci9sci9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvZWRpdC11dGlsL3JhbmdlLXBhcnNlci50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvZWRpdC11dGlsL21ldGFkYXRhLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9lZGl0LWhhbmRsZXIvY3Vyc29yLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9lZGl0LXV0aWwvcmFuZ2UtY3JlYXRlLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvcmVuZGVyZXJzL2d1dHRlcnMvYW5ub3RhdGlvbnMtZ3V0dGVyL2Fubm90YXRpb24tZ3V0dGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvcmVuZGVyZXJzL2d1dHRlcnMvYmFzZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL3JlbmRlcmVycy9ndXR0ZXJzL2Fubm90YXRpb25zLWd1dHRlci9tYXJrZXIudHMiLCAiLi4vLi4vLi4vc3JjL3VpL2VtYmVkZGFibGUtZWRpdG9yLnRzIiwgIi4uLy4uL21vbmtleS1hcm91bmQvZGlzdC9pbmRleC5tanMiLCAiLi4vLi4vLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi8uLi8uLi9zcmMvcGF0Y2hlcy50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL3JlbmRlcmVycy9saXZlLXByZXZpZXcvY29tbWVudC13aWRnZXQudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9yZW5kZXJlcnMvbGl2ZS1wcmV2aWV3L2ZvY3VzLXJlbmRlcmVyLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvcmVuZGVyZXJzL2xpdmUtcHJldmlldy9tYXJrdXAtcmVuZGVyZXIudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9yZW5kZXJlcnMvZ3V0dGVycy9hbm5vdGF0aW9ucy1ndXR0ZXIvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL2VkaXQtbG9naWMvYWRkLWNvbW1lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL2VkaXQtbG9naWMvYWx0ZXItc3VnZ2VzdGlvbi50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvZWRpdC1sb2dpYy90ZXh0LWRpZmYudHMiLCAiLi4vLi4vLi4vc3JjL2luZGV4LXdvcmtlci50cyIsICIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvaW5kZXhlci53b3JrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogRGlmZiBNYXRjaCBhbmQgUGF0Y2hcbiAqIENvcHlyaWdodCAyMDE4IFRoZSBkaWZmLW1hdGNoLXBhdGNoIEF1dGhvcnMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2RpZmYtbWF0Y2gtcGF0Y2hcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byB0ZXh0cyB0byBjcmVhdGUgYSBwYXRjaC5cbiAqIEFwcGxpZXMgdGhlIHBhdGNoIG9udG8gYW5vdGhlciB0ZXh0LCBhbGxvd2luZyBmb3IgZXJyb3JzLlxuICogQGF1dGhvciBmcmFzZXJAZ29vZ2xlLmNvbSAoTmVpbCBGcmFzZXIpXG4gKi9cblxuLyoqXG4gKiBDbGFzcyBjb250YWluaW5nIHRoZSBkaWZmLCBtYXRjaCBhbmQgcGF0Y2ggbWV0aG9kcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgZGlmZl9tYXRjaF9wYXRjaCA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIERlZmF1bHRzLlxuICAvLyBSZWRlZmluZSB0aGVzZSBpbiB5b3VyIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLlxuXG4gIC8vIE51bWJlciBvZiBzZWNvbmRzIHRvIG1hcCBhIGRpZmYgYmVmb3JlIGdpdmluZyB1cCAoMCBmb3IgaW5maW5pdHkpLlxuICB0aGlzLkRpZmZfVGltZW91dCA9IDEuMDtcbiAgLy8gQ29zdCBvZiBhbiBlbXB0eSBlZGl0IG9wZXJhdGlvbiBpbiB0ZXJtcyBvZiBlZGl0IGNoYXJhY3RlcnMuXG4gIHRoaXMuRGlmZl9FZGl0Q29zdCA9IDQ7XG4gIC8vIEF0IHdoYXQgcG9pbnQgaXMgbm8gbWF0Y2ggZGVjbGFyZWQgKDAuMCA9IHBlcmZlY3Rpb24sIDEuMCA9IHZlcnkgbG9vc2UpLlxuICB0aGlzLk1hdGNoX1RocmVzaG9sZCA9IDAuNTtcbiAgLy8gSG93IGZhciB0byBzZWFyY2ggZm9yIGEgbWF0Y2ggKDAgPSBleGFjdCBsb2NhdGlvbiwgMTAwMCsgPSBicm9hZCBtYXRjaCkuXG4gIC8vIEEgbWF0Y2ggdGhpcyBtYW55IGNoYXJhY3RlcnMgYXdheSBmcm9tIHRoZSBleHBlY3RlZCBsb2NhdGlvbiB3aWxsIGFkZFxuICAvLyAxLjAgdG8gdGhlIHNjb3JlICgwLjAgaXMgYSBwZXJmZWN0IG1hdGNoKS5cbiAgdGhpcy5NYXRjaF9EaXN0YW5jZSA9IDEwMDA7XG4gIC8vIFdoZW4gZGVsZXRpbmcgYSBsYXJnZSBibG9jayBvZiB0ZXh0IChvdmVyIH42NCBjaGFyYWN0ZXJzKSwgaG93IGNsb3NlIGRvXG4gIC8vIHRoZSBjb250ZW50cyBoYXZlIHRvIGJlIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBjb250ZW50cy4gKDAuMCA9IHBlcmZlY3Rpb24sXG4gIC8vIDEuMCA9IHZlcnkgbG9vc2UpLiAgTm90ZSB0aGF0IE1hdGNoX1RocmVzaG9sZCBjb250cm9scyBob3cgY2xvc2VseSB0aGVcbiAgLy8gZW5kIHBvaW50cyBvZiBhIGRlbGV0ZSBuZWVkIHRvIG1hdGNoLlxuICB0aGlzLlBhdGNoX0RlbGV0ZVRocmVzaG9sZCA9IDAuNTtcbiAgLy8gQ2h1bmsgc2l6ZSBmb3IgY29udGV4dCBsZW5ndGguXG4gIHRoaXMuUGF0Y2hfTWFyZ2luID0gNDtcblxuICAvLyBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gYW4gaW50LlxuICB0aGlzLk1hdGNoX01heEJpdHMgPSAzMjtcbn07XG5cblxuLy8gIERJRkYgRlVOQ1RJT05TXG5cblxuLyoqXG4gKiBUaGUgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgZGlmZiBpcyBhbiBhcnJheSBvZiB0dXBsZXM6XG4gKiBbW0RJRkZfREVMRVRFLCAnSGVsbG8nXSwgW0RJRkZfSU5TRVJULCAnR29vZGJ5ZSddLCBbRElGRl9FUVVBTCwgJyB3b3JsZC4nXV1cbiAqIHdoaWNoIG1lYW5zOiBkZWxldGUgJ0hlbGxvJywgYWRkICdHb29kYnllJyBhbmQga2VlcCAnIHdvcmxkLidcbiAqL1xudmFyIERJRkZfREVMRVRFID0gLTE7XG52YXIgRElGRl9JTlNFUlQgPSAxO1xudmFyIERJRkZfRVFVQUwgPSAwO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBvbmUgZGlmZiB0dXBsZS5cbiAqIH5BdHRlbXB0cyB0byBsb29rIGxpa2UgYSB0d28tZWxlbWVudCBhcnJheSAod2hpY2ggaXMgd2hhdCB0aGlzIHVzZWQgdG8gYmUpLn5cbiAqIENvbnN0cnVjdG9yIHJldHVybnMgYW4gYWN0dWFsIHR3by1lbGVtZW50IGFycmF5LCB0byBhbGxvdyBkZXN0cnVjdGluZyBASmFja3VCXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0phY2t1Qi9kaWZmLW1hdGNoLXBhdGNoL2lzc3Vlcy8xNCBmb3IgZGV0YWlsc1xuICogQHBhcmFtIHtudW1iZXJ9IG9wIE9wZXJhdGlvbiwgb25lIG9mOiBESUZGX0RFTEVURSwgRElGRl9JTlNFUlQsIERJRkZfRVFVQUwuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUZXh0IHRvIGJlIGRlbGV0ZWQsIGluc2VydGVkLCBvciByZXRhaW5lZC5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5kaWZmX21hdGNoX3BhdGNoLkRpZmYgPSBmdW5jdGlvbihvcCwgdGV4dCkge1xuICByZXR1cm4gW29wLCB0ZXh0XTtcbn07XG5cbi8qKlxuICogRmluZCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gdGV4dHMuICBTaW1wbGlmaWVzIHRoZSBwcm9ibGVtIGJ5IHN0cmlwcGluZ1xuICogYW55IGNvbW1vbiBwcmVmaXggb3Igc3VmZml4IG9mZiB0aGUgdGV4dHMgYmVmb3JlIGRpZmZpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfY2hlY2tsaW5lcyBPcHRpb25hbCBzcGVlZHVwIGZsYWcuIElmIHByZXNlbnQgYW5kIGZhbHNlLFxuICogICAgIHRoZW4gZG9uJ3QgcnVuIGEgbGluZS1sZXZlbCBkaWZmIGZpcnN0IHRvIGlkZW50aWZ5IHRoZSBjaGFuZ2VkIGFyZWFzLlxuICogICAgIERlZmF1bHRzIHRvIHRydWUsIHdoaWNoIGRvZXMgYSBmYXN0ZXIsIHNsaWdodGx5IGxlc3Mgb3B0aW1hbCBkaWZmLlxuICogQHBhcmFtIHtudW1iZXI9fSBvcHRfZGVhZGxpbmUgT3B0aW9uYWwgdGltZSB3aGVuIHRoZSBkaWZmIHNob3VsZCBiZSBjb21wbGV0ZVxuICogICAgIGJ5LiAgVXNlZCBpbnRlcm5hbGx5IGZvciByZWN1cnNpdmUgY2FsbHMuICBVc2VycyBzaG91bGQgc2V0IERpZmZUaW1lb3V0XG4gKiAgICAgaW5zdGVhZC5cbiAqIEByZXR1cm4geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX21haW4gPSBmdW5jdGlvbih0ZXh0MSwgdGV4dDIsIG9wdF9jaGVja2xpbmVzLFxuICAgIG9wdF9kZWFkbGluZSkge1xuICAvLyBTZXQgYSBkZWFkbGluZSBieSB3aGljaCB0aW1lIHRoZSBkaWZmIG11c3QgYmUgY29tcGxldGUuXG4gIGlmICh0eXBlb2Ygb3B0X2RlYWRsaW5lID09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHRoaXMuRGlmZl9UaW1lb3V0IDw9IDApIHtcbiAgICAgIG9wdF9kZWFkbGluZSA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdF9kZWFkbGluZSA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpICsgdGhpcy5EaWZmX1RpbWVvdXQgKiAxMDAwO1xuICAgIH1cbiAgfVxuICB2YXIgZGVhZGxpbmUgPSBvcHRfZGVhZGxpbmU7XG5cbiAgLy8gQ2hlY2sgZm9yIG51bGwgaW5wdXRzLlxuICBpZiAodGV4dDEgPT0gbnVsbCB8fCB0ZXh0MiA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOdWxsIGlucHV0LiAoZGlmZl9tYWluKScpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGVxdWFsaXR5IChzcGVlZHVwKS5cbiAgaWYgKHRleHQxID09IHRleHQyKSB7XG4gICAgaWYgKHRleHQxKSB7XG4gICAgICByZXR1cm4gW25ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9FUVVBTCwgdGV4dDEpXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRfY2hlY2tsaW5lcyA9PSAndW5kZWZpbmVkJykge1xuICAgIG9wdF9jaGVja2xpbmVzID0gdHJ1ZTtcbiAgfVxuICB2YXIgY2hlY2tsaW5lcyA9IG9wdF9jaGVja2xpbmVzO1xuXG4gIC8vIFRyaW0gb2ZmIGNvbW1vbiBwcmVmaXggKHNwZWVkdXApLlxuICB2YXIgY29tbW9ubGVuZ3RoID0gdGhpcy5kaWZmX2NvbW1vblByZWZpeCh0ZXh0MSwgdGV4dDIpO1xuICB2YXIgY29tbW9ucHJlZml4ID0gdGV4dDEuc3Vic3RyaW5nKDAsIGNvbW1vbmxlbmd0aCk7XG4gIHRleHQxID0gdGV4dDEuc3Vic3RyaW5nKGNvbW1vbmxlbmd0aCk7XG4gIHRleHQyID0gdGV4dDIuc3Vic3RyaW5nKGNvbW1vbmxlbmd0aCk7XG5cbiAgLy8gVHJpbSBvZmYgY29tbW9uIHN1ZmZpeCAoc3BlZWR1cCkuXG4gIGNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZl9jb21tb25TdWZmaXgodGV4dDEsIHRleHQyKTtcbiAgdmFyIGNvbW1vbnN1ZmZpeCA9IHRleHQxLnN1YnN0cmluZyh0ZXh0MS5sZW5ndGggLSBjb21tb25sZW5ndGgpO1xuICB0ZXh0MSA9IHRleHQxLnN1YnN0cmluZygwLCB0ZXh0MS5sZW5ndGggLSBjb21tb25sZW5ndGgpO1xuICB0ZXh0MiA9IHRleHQyLnN1YnN0cmluZygwLCB0ZXh0Mi5sZW5ndGggLSBjb21tb25sZW5ndGgpO1xuXG4gIC8vIENvbXB1dGUgdGhlIGRpZmYgb24gdGhlIG1pZGRsZSBibG9jay5cbiAgdmFyIGRpZmZzID0gdGhpcy5kaWZmX2NvbXB1dGVfKHRleHQxLCB0ZXh0MiwgY2hlY2tsaW5lcywgZGVhZGxpbmUpO1xuXG4gIC8vIFJlc3RvcmUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICBpZiAoY29tbW9ucHJlZml4KSB7XG4gICAgZGlmZnMudW5zaGlmdChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIGNvbW1vbnByZWZpeCkpO1xuICB9XG4gIGlmIChjb21tb25zdWZmaXgpIHtcbiAgICBkaWZmcy5wdXNoKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9FUVVBTCwgY29tbW9uc3VmZml4KSk7XG4gIH1cbiAgdGhpcy5kaWZmX2NsZWFudXBNZXJnZShkaWZmcyk7XG4gIHJldHVybiBkaWZmcztcbn07XG5cblxuLyoqXG4gKiBGaW5kIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byB0ZXh0cy4gIEFzc3VtZXMgdGhhdCB0aGUgdGV4dHMgZG8gbm90XG4gKiBoYXZlIGFueSBjb21tb24gcHJlZml4IG9yIHN1ZmZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tsaW5lcyBTcGVlZHVwIGZsYWcuICBJZiBmYWxzZSwgdGhlbiBkb24ndCBydW4gYVxuICogICAgIGxpbmUtbGV2ZWwgZGlmZiBmaXJzdCB0byBpZGVudGlmeSB0aGUgY2hhbmdlZCBhcmVhcy5cbiAqICAgICBJZiB0cnVlLCB0aGVuIHJ1biBhIGZhc3Rlciwgc2xpZ2h0bHkgbGVzcyBvcHRpbWFsIGRpZmYuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSB3aGVuIHRoZSBkaWZmIHNob3VsZCBiZSBjb21wbGV0ZSBieS5cbiAqIEByZXR1cm4geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHByaXZhdGVcbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9jb21wdXRlXyA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0MiwgY2hlY2tsaW5lcyxcbiAgICBkZWFkbGluZSkge1xuICB2YXIgZGlmZnM7XG5cbiAgaWYgKCF0ZXh0MSkge1xuICAgIC8vIEp1c3QgYWRkIHNvbWUgdGV4dCAoc3BlZWR1cCkuXG4gICAgcmV0dXJuIFtuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfSU5TRVJULCB0ZXh0MildO1xuICB9XG5cbiAgaWYgKCF0ZXh0Mikge1xuICAgIC8vIEp1c3QgZGVsZXRlIHNvbWUgdGV4dCAoc3BlZWR1cCkuXG4gICAgcmV0dXJuIFtuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfREVMRVRFLCB0ZXh0MSldO1xuICB9XG5cbiAgdmFyIGxvbmd0ZXh0ID0gdGV4dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoID8gdGV4dDEgOiB0ZXh0MjtcbiAgdmFyIHNob3J0dGV4dCA9IHRleHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQyIDogdGV4dDE7XG4gIHZhciBpID0gbG9uZ3RleHQuaW5kZXhPZihzaG9ydHRleHQpO1xuICBpZiAoaSAhPSAtMSkge1xuICAgIC8vIFNob3J0ZXIgdGV4dCBpcyBpbnNpZGUgdGhlIGxvbmdlciB0ZXh0IChzcGVlZHVwKS5cbiAgICBkaWZmcyA9IFtuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfSU5TRVJULCBsb25ndGV4dC5zdWJzdHJpbmcoMCwgaSkpLFxuICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9FUVVBTCwgc2hvcnR0ZXh0KSxcbiAgICAgICAgICAgICBuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfSU5TRVJULFxuICAgICAgICAgICAgICAgICBsb25ndGV4dC5zdWJzdHJpbmcoaSArIHNob3J0dGV4dC5sZW5ndGgpKV07XG4gICAgLy8gU3dhcCBpbnNlcnRpb25zIGZvciBkZWxldGlvbnMgaWYgZGlmZiBpcyByZXZlcnNlZC5cbiAgICBpZiAodGV4dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoKSB7XG4gICAgICBkaWZmc1swXVswXSA9IGRpZmZzWzJdWzBdID0gRElGRl9ERUxFVEU7XG4gICAgfVxuICAgIHJldHVybiBkaWZmcztcbiAgfVxuXG4gIGlmIChzaG9ydHRleHQubGVuZ3RoID09IDEpIHtcbiAgICAvLyBTaW5nbGUgY2hhcmFjdGVyIHN0cmluZy5cbiAgICAvLyBBZnRlciB0aGUgcHJldmlvdXMgc3BlZWR1cCwgdGhlIGNoYXJhY3RlciBjYW4ndCBiZSBhbiBlcXVhbGl0eS5cbiAgICByZXR1cm4gW25ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIHRleHQxKSxcbiAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9JTlNFUlQsIHRleHQyKV07XG4gIH1cblxuICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2JsZW0gY2FuIGJlIHNwbGl0IGluIHR3by5cbiAgdmFyIGhtID0gdGhpcy5kaWZmX2hhbGZNYXRjaF8odGV4dDEsIHRleHQyKTtcbiAgaWYgKGhtKSB7XG4gICAgLy8gQSBoYWxmLW1hdGNoIHdhcyBmb3VuZCwgc29ydCBvdXQgdGhlIHJldHVybiBkYXRhLlxuICAgIHZhciB0ZXh0MV9hID0gaG1bMF07XG4gICAgdmFyIHRleHQxX2IgPSBobVsxXTtcbiAgICB2YXIgdGV4dDJfYSA9IGhtWzJdO1xuICAgIHZhciB0ZXh0Ml9iID0gaG1bM107XG4gICAgdmFyIG1pZF9jb21tb24gPSBobVs0XTtcbiAgICAvLyBTZW5kIGJvdGggcGFpcnMgb2ZmIGZvciBzZXBhcmF0ZSBwcm9jZXNzaW5nLlxuICAgIHZhciBkaWZmc19hID0gdGhpcy5kaWZmX21haW4odGV4dDFfYSwgdGV4dDJfYSwgY2hlY2tsaW5lcywgZGVhZGxpbmUpO1xuICAgIHZhciBkaWZmc19iID0gdGhpcy5kaWZmX21haW4odGV4dDFfYiwgdGV4dDJfYiwgY2hlY2tsaW5lcywgZGVhZGxpbmUpO1xuICAgIC8vIE1lcmdlIHRoZSByZXN1bHRzLlxuICAgIHJldHVybiBkaWZmc19hLmNvbmNhdChbbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCBtaWRfY29tbW9uKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZzX2IpO1xuICB9XG5cbiAgaWYgKGNoZWNrbGluZXMgJiYgdGV4dDEubGVuZ3RoID4gMTAwICYmIHRleHQyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybiB0aGlzLmRpZmZfbGluZU1vZGVfKHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZGlmZl9iaXNlY3RfKHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUpO1xufTtcblxuXG4vKipcbiAqIERvIGEgcXVpY2sgbGluZS1sZXZlbCBkaWZmIG9uIGJvdGggc3RyaW5ncywgdGhlbiByZWRpZmYgdGhlIHBhcnRzIGZvclxuICogZ3JlYXRlciBhY2N1cmFjeS5cbiAqIFRoaXMgc3BlZWR1cCBjYW4gcHJvZHVjZSBub24tbWluaW1hbCBkaWZmcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWFkbGluZSBUaW1lIHdoZW4gdGhlIGRpZmYgc2hvdWxkIGJlIGNvbXBsZXRlIGJ5LlxuICogQHJldHVybiB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2xpbmVNb2RlXyA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUpIHtcbiAgLy8gU2NhbiB0aGUgdGV4dCBvbiBhIGxpbmUtYnktbGluZSBiYXNpcyBmaXJzdC5cbiAgdmFyIGEgPSB0aGlzLmRpZmZfbGluZXNUb0NoYXJzXyh0ZXh0MSwgdGV4dDIpO1xuICB0ZXh0MSA9IGEuY2hhcnMxO1xuICB0ZXh0MiA9IGEuY2hhcnMyO1xuICB2YXIgbGluZWFycmF5ID0gYS5saW5lQXJyYXk7XG5cbiAgdmFyIGRpZmZzID0gdGhpcy5kaWZmX21haW4odGV4dDEsIHRleHQyLCBmYWxzZSwgZGVhZGxpbmUpO1xuXG4gIC8vIENvbnZlcnQgdGhlIGRpZmYgYmFjayB0byBvcmlnaW5hbCB0ZXh0LlxuICB0aGlzLmRpZmZfY2hhcnNUb0xpbmVzXyhkaWZmcywgbGluZWFycmF5KTtcbiAgLy8gRWxpbWluYXRlIGZyZWFrIG1hdGNoZXMgKGUuZy4gYmxhbmsgbGluZXMpXG4gIHRoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWMoZGlmZnMpO1xuXG4gIC8vIFJlZGlmZiBhbnkgcmVwbGFjZW1lbnQgYmxvY2tzLCB0aGlzIHRpbWUgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci5cbiAgLy8gQWRkIGEgZHVtbXkgZW50cnkgYXQgdGhlIGVuZC5cbiAgZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsICcnKSk7XG4gIHZhciBwb2ludGVyID0gMDtcbiAgdmFyIGNvdW50X2RlbGV0ZSA9IDA7XG4gIHZhciBjb3VudF9pbnNlcnQgPSAwO1xuICB2YXIgdGV4dF9kZWxldGUgPSAnJztcbiAgdmFyIHRleHRfaW5zZXJ0ID0gJyc7XG4gIHdoaWxlIChwb2ludGVyIDwgZGlmZnMubGVuZ3RoKSB7XG4gICAgc3dpdGNoIChkaWZmc1twb2ludGVyXVswXSkge1xuICAgICAgY2FzZSBESUZGX0lOU0VSVDpcbiAgICAgICAgY291bnRfaW5zZXJ0Kys7XG4gICAgICAgIHRleHRfaW5zZXJ0ICs9IGRpZmZzW3BvaW50ZXJdWzFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9ERUxFVEU6XG4gICAgICAgIGNvdW50X2RlbGV0ZSsrO1xuICAgICAgICB0ZXh0X2RlbGV0ZSArPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfRVFVQUw6XG4gICAgICAgIC8vIFVwb24gcmVhY2hpbmcgYW4gZXF1YWxpdHksIGNoZWNrIGZvciBwcmlvciByZWR1bmRhbmNpZXMuXG4gICAgICAgIGlmIChjb3VudF9kZWxldGUgPj0gMSAmJiBjb3VudF9pbnNlcnQgPj0gMSkge1xuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgb2ZmZW5kaW5nIHJlY29yZHMgYW5kIGFkZCB0aGUgbWVyZ2VkIG9uZXMuXG4gICAgICAgICAgZGlmZnMuc3BsaWNlKHBvaW50ZXIgLSBjb3VudF9kZWxldGUgLSBjb3VudF9pbnNlcnQsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvdW50X2RlbGV0ZSArIGNvdW50X2luc2VydCk7XG4gICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIgLSBjb3VudF9kZWxldGUgLSBjb3VudF9pbnNlcnQ7XG4gICAgICAgICAgdmFyIHN1YkRpZmYgPVxuICAgICAgICAgICAgICB0aGlzLmRpZmZfbWFpbih0ZXh0X2RlbGV0ZSwgdGV4dF9pbnNlcnQsIGZhbHNlLCBkZWFkbGluZSk7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IHN1YkRpZmYubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCAwLCBzdWJEaWZmW2pdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIgKyBzdWJEaWZmLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb3VudF9pbnNlcnQgPSAwO1xuICAgICAgICBjb3VudF9kZWxldGUgPSAwO1xuICAgICAgICB0ZXh0X2RlbGV0ZSA9ICcnO1xuICAgICAgICB0ZXh0X2luc2VydCA9ICcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcG9pbnRlcisrO1xuICB9XG4gIGRpZmZzLnBvcCgpOyAgLy8gUmVtb3ZlIHRoZSBkdW1teSBlbnRyeSBhdCB0aGUgZW5kLlxuXG4gIHJldHVybiBkaWZmcztcbn07XG5cblxuLyoqXG4gKiBGaW5kIHRoZSAnbWlkZGxlIHNuYWtlJyBvZiBhIGRpZmYsIHNwbGl0IHRoZSBwcm9ibGVtIGluIHR3b1xuICogYW5kIHJldHVybiB0aGUgcmVjdXJzaXZlbHkgY29uc3RydWN0ZWQgZGlmZi5cbiAqIFNlZSBNeWVycyAxOTg2IHBhcGVyOiBBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgSXRzIFZhcmlhdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSBhdCB3aGljaCB0byBiYWlsIGlmIG5vdCB5ZXQgY29tcGxldGUuXG4gKiBAcmV0dXJuIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfYmlzZWN0XyA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUpIHtcbiAgLy8gQ2FjaGUgdGhlIHRleHQgbGVuZ3RocyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLlxuICB2YXIgdGV4dDFfbGVuZ3RoID0gdGV4dDEubGVuZ3RoO1xuICB2YXIgdGV4dDJfbGVuZ3RoID0gdGV4dDIubGVuZ3RoO1xuICB2YXIgbWF4X2QgPSBNYXRoLmNlaWwoKHRleHQxX2xlbmd0aCArIHRleHQyX2xlbmd0aCkgLyAyKTtcbiAgdmFyIHZfb2Zmc2V0ID0gbWF4X2Q7XG4gIHZhciB2X2xlbmd0aCA9IDIgKiBtYXhfZDtcbiAgdmFyIHYxID0gbmV3IEFycmF5KHZfbGVuZ3RoKTtcbiAgdmFyIHYyID0gbmV3IEFycmF5KHZfbGVuZ3RoKTtcbiAgLy8gU2V0dGluZyBhbGwgZWxlbWVudHMgdG8gLTEgaXMgZmFzdGVyIGluIENocm9tZSAmIEZpcmVmb3ggdGhhbiBtaXhpbmdcbiAgLy8gaW50ZWdlcnMgYW5kIHVuZGVmaW5lZC5cbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2X2xlbmd0aDsgeCsrKSB7XG4gICAgdjFbeF0gPSAtMTtcbiAgICB2Mlt4XSA9IC0xO1xuICB9XG4gIHYxW3Zfb2Zmc2V0ICsgMV0gPSAwO1xuICB2Mlt2X29mZnNldCArIDFdID0gMDtcbiAgdmFyIGRlbHRhID0gdGV4dDFfbGVuZ3RoIC0gdGV4dDJfbGVuZ3RoO1xuICAvLyBJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaXMgb2RkLCB0aGVuIHRoZSBmcm9udCBwYXRoIHdpbGwgY29sbGlkZVxuICAvLyB3aXRoIHRoZSByZXZlcnNlIHBhdGguXG4gIHZhciBmcm9udCA9IChkZWx0YSAlIDIgIT0gMCk7XG4gIC8vIE9mZnNldHMgZm9yIHN0YXJ0IGFuZCBlbmQgb2YgayBsb29wLlxuICAvLyBQcmV2ZW50cyBtYXBwaW5nIG9mIHNwYWNlIGJleW9uZCB0aGUgZ3JpZC5cbiAgdmFyIGsxc3RhcnQgPSAwO1xuICB2YXIgazFlbmQgPSAwO1xuICB2YXIgazJzdGFydCA9IDA7XG4gIHZhciBrMmVuZCA9IDA7XG4gIGZvciAodmFyIGQgPSAwOyBkIDwgbWF4X2Q7IGQrKykge1xuICAgIC8vIEJhaWwgb3V0IGlmIGRlYWRsaW5lIGlzIHJlYWNoZWQuXG4gICAgaWYgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgPiBkZWFkbGluZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gV2FsayB0aGUgZnJvbnQgcGF0aCBvbmUgc3RlcC5cbiAgICBmb3IgKHZhciBrMSA9IC1kICsgazFzdGFydDsgazEgPD0gZCAtIGsxZW5kOyBrMSArPSAyKSB7XG4gICAgICB2YXIgazFfb2Zmc2V0ID0gdl9vZmZzZXQgKyBrMTtcbiAgICAgIHZhciB4MTtcbiAgICAgIGlmIChrMSA9PSAtZCB8fCAoazEgIT0gZCAmJiB2MVtrMV9vZmZzZXQgLSAxXSA8IHYxW2sxX29mZnNldCArIDFdKSkge1xuICAgICAgICB4MSA9IHYxW2sxX29mZnNldCArIDFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDEgPSB2MVtrMV9vZmZzZXQgLSAxXSArIDE7XG4gICAgICB9XG4gICAgICB2YXIgeTEgPSB4MSAtIGsxO1xuICAgICAgd2hpbGUgKHgxIDwgdGV4dDFfbGVuZ3RoICYmIHkxIDwgdGV4dDJfbGVuZ3RoICYmXG4gICAgICAgICAgICAgdGV4dDEuY2hhckF0KHgxKSA9PSB0ZXh0Mi5jaGFyQXQoeTEpKSB7XG4gICAgICAgIHgxKys7XG4gICAgICAgIHkxKys7XG4gICAgICB9XG4gICAgICB2MVtrMV9vZmZzZXRdID0geDE7XG4gICAgICBpZiAoeDEgPiB0ZXh0MV9sZW5ndGgpIHtcbiAgICAgICAgLy8gUmFuIG9mZiB0aGUgcmlnaHQgb2YgdGhlIGdyYXBoLlxuICAgICAgICBrMWVuZCArPSAyO1xuICAgICAgfSBlbHNlIGlmICh5MSA+IHRleHQyX2xlbmd0aCkge1xuICAgICAgICAvLyBSYW4gb2ZmIHRoZSBib3R0b20gb2YgdGhlIGdyYXBoLlxuICAgICAgICBrMXN0YXJ0ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZyb250KSB7XG4gICAgICAgIHZhciBrMl9vZmZzZXQgPSB2X29mZnNldCArIGRlbHRhIC0gazE7XG4gICAgICAgIGlmIChrMl9vZmZzZXQgPj0gMCAmJiBrMl9vZmZzZXQgPCB2X2xlbmd0aCAmJiB2MltrMl9vZmZzZXRdICE9IC0xKSB7XG4gICAgICAgICAgLy8gTWlycm9yIHgyIG9udG8gdG9wLWxlZnQgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICAgICAgdmFyIHgyID0gdGV4dDFfbGVuZ3RoIC0gdjJbazJfb2Zmc2V0XTtcbiAgICAgICAgICBpZiAoeDEgPj0geDIpIHtcbiAgICAgICAgICAgIC8vIE92ZXJsYXAgZGV0ZWN0ZWQuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaWZmX2Jpc2VjdFNwbGl0Xyh0ZXh0MSwgdGV4dDIsIHgxLCB5MSwgZGVhZGxpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdhbGsgdGhlIHJldmVyc2UgcGF0aCBvbmUgc3RlcC5cbiAgICBmb3IgKHZhciBrMiA9IC1kICsgazJzdGFydDsgazIgPD0gZCAtIGsyZW5kOyBrMiArPSAyKSB7XG4gICAgICB2YXIgazJfb2Zmc2V0ID0gdl9vZmZzZXQgKyBrMjtcbiAgICAgIHZhciB4MjtcbiAgICAgIGlmIChrMiA9PSAtZCB8fCAoazIgIT0gZCAmJiB2MltrMl9vZmZzZXQgLSAxXSA8IHYyW2syX29mZnNldCArIDFdKSkge1xuICAgICAgICB4MiA9IHYyW2syX29mZnNldCArIDFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDIgPSB2MltrMl9vZmZzZXQgLSAxXSArIDE7XG4gICAgICB9XG4gICAgICB2YXIgeTIgPSB4MiAtIGsyO1xuICAgICAgd2hpbGUgKHgyIDwgdGV4dDFfbGVuZ3RoICYmIHkyIDwgdGV4dDJfbGVuZ3RoICYmXG4gICAgICAgICAgICAgdGV4dDEuY2hhckF0KHRleHQxX2xlbmd0aCAtIHgyIC0gMSkgPT1cbiAgICAgICAgICAgICB0ZXh0Mi5jaGFyQXQodGV4dDJfbGVuZ3RoIC0geTIgLSAxKSkge1xuICAgICAgICB4MisrO1xuICAgICAgICB5MisrO1xuICAgICAgfVxuICAgICAgdjJbazJfb2Zmc2V0XSA9IHgyO1xuICAgICAgaWYgKHgyID4gdGV4dDFfbGVuZ3RoKSB7XG4gICAgICAgIC8vIFJhbiBvZmYgdGhlIGxlZnQgb2YgdGhlIGdyYXBoLlxuICAgICAgICBrMmVuZCArPSAyO1xuICAgICAgfSBlbHNlIGlmICh5MiA+IHRleHQyX2xlbmd0aCkge1xuICAgICAgICAvLyBSYW4gb2ZmIHRoZSB0b3Agb2YgdGhlIGdyYXBoLlxuICAgICAgICBrMnN0YXJ0ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKCFmcm9udCkge1xuICAgICAgICB2YXIgazFfb2Zmc2V0ID0gdl9vZmZzZXQgKyBkZWx0YSAtIGsyO1xuICAgICAgICBpZiAoazFfb2Zmc2V0ID49IDAgJiYgazFfb2Zmc2V0IDwgdl9sZW5ndGggJiYgdjFbazFfb2Zmc2V0XSAhPSAtMSkge1xuICAgICAgICAgIHZhciB4MSA9IHYxW2sxX29mZnNldF07XG4gICAgICAgICAgdmFyIHkxID0gdl9vZmZzZXQgKyB4MSAtIGsxX29mZnNldDtcbiAgICAgICAgICAvLyBNaXJyb3IgeDIgb250byB0b3AtbGVmdCBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgICAgICB4MiA9IHRleHQxX2xlbmd0aCAtIHgyO1xuICAgICAgICAgIGlmICh4MSA+PSB4Mikge1xuICAgICAgICAgICAgLy8gT3ZlcmxhcCBkZXRlY3RlZC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpZmZfYmlzZWN0U3BsaXRfKHRleHQxLCB0ZXh0MiwgeDEsIHkxLCBkZWFkbGluZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIERpZmYgdG9vayB0b28gbG9uZyBhbmQgaGl0IHRoZSBkZWFkbGluZSBvclxuICAvLyBudW1iZXIgb2YgZGlmZnMgZXF1YWxzIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBubyBjb21tb25hbGl0eSBhdCBhbGwuXG4gIHJldHVybiBbbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0RFTEVURSwgdGV4dDEpLFxuICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9JTlNFUlQsIHRleHQyKV07XG59O1xuXG5cbi8qKlxuICogR2l2ZW4gdGhlIGxvY2F0aW9uIG9mIHRoZSAnbWlkZGxlIHNuYWtlJywgc3BsaXQgdGhlIGRpZmYgaW4gdHdvIHBhcnRzXG4gKiBhbmQgcmVjdXJzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB4IEluZGV4IG9mIHNwbGl0IHBvaW50IGluIHRleHQxLlxuICogQHBhcmFtIHtudW1iZXJ9IHkgSW5kZXggb2Ygc3BsaXQgcG9pbnQgaW4gdGV4dDIuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSBhdCB3aGljaCB0byBiYWlsIGlmIG5vdCB5ZXQgY29tcGxldGUuXG4gKiBAcmV0dXJuIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfYmlzZWN0U3BsaXRfID0gZnVuY3Rpb24odGV4dDEsIHRleHQyLCB4LCB5LFxuICAgIGRlYWRsaW5lKSB7XG4gIHZhciB0ZXh0MWEgPSB0ZXh0MS5zdWJzdHJpbmcoMCwgeCk7XG4gIHZhciB0ZXh0MmEgPSB0ZXh0Mi5zdWJzdHJpbmcoMCwgeSk7XG4gIHZhciB0ZXh0MWIgPSB0ZXh0MS5zdWJzdHJpbmcoeCk7XG4gIHZhciB0ZXh0MmIgPSB0ZXh0Mi5zdWJzdHJpbmcoeSk7XG5cbiAgLy8gQ29tcHV0ZSBib3RoIGRpZmZzIHNlcmlhbGx5LlxuICB2YXIgZGlmZnMgPSB0aGlzLmRpZmZfbWFpbih0ZXh0MWEsIHRleHQyYSwgZmFsc2UsIGRlYWRsaW5lKTtcbiAgdmFyIGRpZmZzYiA9IHRoaXMuZGlmZl9tYWluKHRleHQxYiwgdGV4dDJiLCBmYWxzZSwgZGVhZGxpbmUpO1xuXG4gIHJldHVybiBkaWZmcy5jb25jYXQoZGlmZnNiKTtcbn07XG5cblxuLyoqXG4gKiBTcGxpdCB0d28gdGV4dHMgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzLiAgUmVkdWNlIHRoZSB0ZXh0cyB0byBhIHN0cmluZyBvZlxuICogaGFzaGVzIHdoZXJlIGVhY2ggVW5pY29kZSBjaGFyYWN0ZXIgcmVwcmVzZW50cyBvbmUgbGluZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy5cbiAqIEByZXR1cm4ge3tjaGFyczE6IHN0cmluZywgY2hhcnMyOiBzdHJpbmcsIGxpbmVBcnJheTogIUFycmF5LjxzdHJpbmc+fX1cbiAqICAgICBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZW5jb2RlZCB0ZXh0MSwgdGhlIGVuY29kZWQgdGV4dDIgYW5kXG4gKiAgICAgdGhlIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzLlxuICogICAgIFRoZSB6ZXJvdGggZWxlbWVudCBvZiB0aGUgYXJyYXkgb2YgdW5pcXVlIHN0cmluZ3MgaXMgaW50ZW50aW9uYWxseSBibGFuay5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfbGluZXNUb0NoYXJzXyA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0Mikge1xuICB2YXIgbGluZUFycmF5ID0gW107ICAvLyBlLmcuIGxpbmVBcnJheVs0XSA9PSAnSGVsbG9cXG4nXG4gIHZhciBsaW5lSGFzaCA9IHt9OyAgIC8vIGUuZy4gbGluZUhhc2hbJ0hlbGxvXFxuJ10gPT0gNFxuXG4gIC8vICdcXHgwMCcgaXMgYSB2YWxpZCBjaGFyYWN0ZXIsIGJ1dCB2YXJpb3VzIGRlYnVnZ2VycyBkb24ndCBsaWtlIGl0LlxuICAvLyBTbyB3ZSdsbCBpbnNlcnQgYSBqdW5rIGVudHJ5IHRvIGF2b2lkIGdlbmVyYXRpbmcgYSBudWxsIGNoYXJhY3Rlci5cbiAgbGluZUFycmF5WzBdID0gJyc7XG5cbiAgLyoqXG4gICAqIFNwbGl0IGEgdGV4dCBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuICBSZWR1Y2UgdGhlIHRleHRzIHRvIGEgc3RyaW5nIG9mXG4gICAqIGhhc2hlcyB3aGVyZSBlYWNoIFVuaWNvZGUgY2hhcmFjdGVyIHJlcHJlc2VudHMgb25lIGxpbmUuXG4gICAqIE1vZGlmaWVzIGxpbmVhcnJheSBhbmQgbGluZWhhc2ggdGhyb3VnaCBiZWluZyBhIGNsb3N1cmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFN0cmluZyB0byBlbmNvZGUuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRW5jb2RlZCBzdHJpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBkaWZmX2xpbmVzVG9DaGFyc011bmdlXyh0ZXh0KSB7XG4gICAgdmFyIGNoYXJzID0gJyc7XG4gICAgLy8gV2FsayB0aGUgdGV4dCwgcHVsbGluZyBvdXQgYSBzdWJzdHJpbmcgZm9yIGVhY2ggbGluZS5cbiAgICAvLyB0ZXh0LnNwbGl0KCdcXG4nKSB3b3VsZCB3b3VsZCB0ZW1wb3JhcmlseSBkb3VibGUgb3VyIG1lbW9yeSBmb290cHJpbnQuXG4gICAgLy8gTW9kaWZ5aW5nIHRleHQgd291bGQgY3JlYXRlIG1hbnkgbGFyZ2Ugc3RyaW5ncyB0byBnYXJiYWdlIGNvbGxlY3QuXG4gICAgdmFyIGxpbmVTdGFydCA9IDA7XG4gICAgdmFyIGxpbmVFbmQgPSAtMTtcbiAgICAvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhcmlhYmxlIGlzIGZhc3RlciB0aGFuIGxvb2tpbmcgaXQgdXAuXG4gICAgdmFyIGxpbmVBcnJheUxlbmd0aCA9IGxpbmVBcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKGxpbmVFbmQgPCB0ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICAgIGxpbmVFbmQgPSB0ZXh0LmluZGV4T2YoJ1xcbicsIGxpbmVTdGFydCk7XG4gICAgICBpZiAobGluZUVuZCA9PSAtMSkge1xuICAgICAgICBsaW5lRW5kID0gdGV4dC5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgICAgdmFyIGxpbmUgPSB0ZXh0LnN1YnN0cmluZyhsaW5lU3RhcnQsIGxpbmVFbmQgKyAxKTtcblxuICAgICAgaWYgKGxpbmVIYXNoLmhhc093blByb3BlcnR5ID8gbGluZUhhc2guaGFzT3duUHJvcGVydHkobGluZSkgOlxuICAgICAgICAgIChsaW5lSGFzaFtsaW5lXSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBjaGFycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxpbmVIYXNoW2xpbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsaW5lQXJyYXlMZW5ndGggPT0gbWF4TGluZXMpIHtcbiAgICAgICAgICAvLyBCYWlsIG91dCBhdCA2NTUzNSBiZWNhdXNlXG4gICAgICAgICAgLy8gU3RyaW5nLmZyb21DaGFyQ29kZSg2NTUzNikgPT0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKVxuICAgICAgICAgIGxpbmUgPSB0ZXh0LnN1YnN0cmluZyhsaW5lU3RhcnQpO1xuICAgICAgICAgIGxpbmVFbmQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjaGFycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxpbmVBcnJheUxlbmd0aCk7XG4gICAgICAgIGxpbmVIYXNoW2xpbmVdID0gbGluZUFycmF5TGVuZ3RoO1xuICAgICAgICBsaW5lQXJyYXlbbGluZUFycmF5TGVuZ3RoKytdID0gbGluZTtcbiAgICAgIH1cbiAgICAgIGxpbmVTdGFydCA9IGxpbmVFbmQgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gY2hhcnM7XG4gIH1cbiAgLy8gQWxsb2NhdGUgMi8zcmRzIG9mIHRoZSBzcGFjZSBmb3IgdGV4dDEsIHRoZSByZXN0IGZvciB0ZXh0Mi5cbiAgdmFyIG1heExpbmVzID0gNDAwMDA7XG4gIHZhciBjaGFyczEgPSBkaWZmX2xpbmVzVG9DaGFyc011bmdlXyh0ZXh0MSk7XG4gIG1heExpbmVzID0gNjU1MzU7XG4gIHZhciBjaGFyczIgPSBkaWZmX2xpbmVzVG9DaGFyc011bmdlXyh0ZXh0Mik7XG4gIHJldHVybiB7Y2hhcnMxOiBjaGFyczEsIGNoYXJzMjogY2hhcnMyLCBsaW5lQXJyYXk6IGxpbmVBcnJheX07XG59O1xuXG5cbi8qKlxuICogUmVoeWRyYXRlIHRoZSB0ZXh0IGluIGEgZGlmZiBmcm9tIGEgc3RyaW5nIG9mIGxpbmUgaGFzaGVzIHRvIHJlYWwgbGluZXMgb2ZcbiAqIHRleHQuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHBhcmFtIHshQXJyYXkuPHN0cmluZz59IGxpbmVBcnJheSBBcnJheSBvZiB1bmlxdWUgc3RyaW5ncy5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfY2hhcnNUb0xpbmVzXyA9IGZ1bmN0aW9uKGRpZmZzLCBsaW5lQXJyYXkpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGFycyA9IGRpZmZzW2ldWzFdO1xuICAgIHZhciB0ZXh0ID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjaGFycy5sZW5ndGg7IGorKykge1xuICAgICAgdGV4dFtqXSA9IGxpbmVBcnJheVtjaGFycy5jaGFyQ29kZUF0KGopXTtcbiAgICB9XG4gICAgZGlmZnNbaV1bMV0gPSB0ZXh0LmpvaW4oJycpO1xuICB9XG59O1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSBjb21tb24gcHJlZml4IG9mIHR3byBzdHJpbmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29tbW9uIHRvIHRoZSBzdGFydCBvZiBlYWNoXG4gKiAgICAgc3RyaW5nLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NvbW1vblByZWZpeCA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0Mikge1xuICAvLyBRdWljayBjaGVjayBmb3IgY29tbW9uIG51bGwgY2FzZXMuXG4gIGlmICghdGV4dDEgfHwgIXRleHQyIHx8IHRleHQxLmNoYXJBdCgwKSAhPSB0ZXh0Mi5jaGFyQXQoMCkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICAvLyBCaW5hcnkgc2VhcmNoLlxuICAvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cHM6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAwNy8xMC8wOS9cbiAgdmFyIHBvaW50ZXJtaW4gPSAwO1xuICB2YXIgcG9pbnRlcm1heCA9IE1hdGgubWluKHRleHQxLmxlbmd0aCwgdGV4dDIubGVuZ3RoKTtcbiAgdmFyIHBvaW50ZXJtaWQgPSBwb2ludGVybWF4O1xuICB2YXIgcG9pbnRlcnN0YXJ0ID0gMDtcbiAgd2hpbGUgKHBvaW50ZXJtaW4gPCBwb2ludGVybWlkKSB7XG4gICAgaWYgKHRleHQxLnN1YnN0cmluZyhwb2ludGVyc3RhcnQsIHBvaW50ZXJtaWQpID09XG4gICAgICAgIHRleHQyLnN1YnN0cmluZyhwb2ludGVyc3RhcnQsIHBvaW50ZXJtaWQpKSB7XG4gICAgICBwb2ludGVybWluID0gcG9pbnRlcm1pZDtcbiAgICAgIHBvaW50ZXJzdGFydCA9IHBvaW50ZXJtaW47XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvaW50ZXJtYXggPSBwb2ludGVybWlkO1xuICAgIH1cbiAgICBwb2ludGVybWlkID0gTWF0aC5mbG9vcigocG9pbnRlcm1heCAtIHBvaW50ZXJtaW4pIC8gMiArIHBvaW50ZXJtaW4pO1xuICB9XG4gIHJldHVybiBwb2ludGVybWlkO1xufTtcblxuXG4vKipcbiAqIERldGVybWluZSB0aGUgY29tbW9uIHN1ZmZpeCBvZiB0d28gc3RyaW5ncy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgZW5kIG9mIGVhY2ggc3RyaW5nLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NvbW1vblN1ZmZpeCA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0Mikge1xuICAvLyBRdWljayBjaGVjayBmb3IgY29tbW9uIG51bGwgY2FzZXMuXG4gIGlmICghdGV4dDEgfHwgIXRleHQyIHx8XG4gICAgICB0ZXh0MS5jaGFyQXQodGV4dDEubGVuZ3RoIC0gMSkgIT0gdGV4dDIuY2hhckF0KHRleHQyLmxlbmd0aCAtIDEpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgLy8gQmluYXJ5IHNlYXJjaC5cbiAgLy8gUGVyZm9ybWFuY2UgYW5hbHlzaXM6IGh0dHBzOi8vbmVpbC5mcmFzZXIubmFtZS9uZXdzLzIwMDcvMTAvMDkvXG4gIHZhciBwb2ludGVybWluID0gMDtcbiAgdmFyIHBvaW50ZXJtYXggPSBNYXRoLm1pbih0ZXh0MS5sZW5ndGgsIHRleHQyLmxlbmd0aCk7XG4gIHZhciBwb2ludGVybWlkID0gcG9pbnRlcm1heDtcbiAgdmFyIHBvaW50ZXJlbmQgPSAwO1xuICB3aGlsZSAocG9pbnRlcm1pbiA8IHBvaW50ZXJtaWQpIHtcbiAgICBpZiAodGV4dDEuc3Vic3RyaW5nKHRleHQxLmxlbmd0aCAtIHBvaW50ZXJtaWQsIHRleHQxLmxlbmd0aCAtIHBvaW50ZXJlbmQpID09XG4gICAgICAgIHRleHQyLnN1YnN0cmluZyh0ZXh0Mi5sZW5ndGggLSBwb2ludGVybWlkLCB0ZXh0Mi5sZW5ndGggLSBwb2ludGVyZW5kKSkge1xuICAgICAgcG9pbnRlcm1pbiA9IHBvaW50ZXJtaWQ7XG4gICAgICBwb2ludGVyZW5kID0gcG9pbnRlcm1pbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRlcm1heCA9IHBvaW50ZXJtaWQ7XG4gICAgfVxuICAgIHBvaW50ZXJtaWQgPSBNYXRoLmZsb29yKChwb2ludGVybWF4IC0gcG9pbnRlcm1pbikgLyAyICsgcG9pbnRlcm1pbik7XG4gIH1cbiAgcmV0dXJuIHBvaW50ZXJtaWQ7XG59O1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBzdWZmaXggb2Ygb25lIHN0cmluZyBpcyB0aGUgcHJlZml4IG9mIGFub3RoZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb21tb24gdG8gdGhlIGVuZCBvZiB0aGUgZmlyc3RcbiAqICAgICBzdHJpbmcgYW5kIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfY29tbW9uT3ZlcmxhcF8gPSBmdW5jdGlvbih0ZXh0MSwgdGV4dDIpIHtcbiAgLy8gQ2FjaGUgdGhlIHRleHQgbGVuZ3RocyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLlxuICB2YXIgdGV4dDFfbGVuZ3RoID0gdGV4dDEubGVuZ3RoO1xuICB2YXIgdGV4dDJfbGVuZ3RoID0gdGV4dDIubGVuZ3RoO1xuICAvLyBFbGltaW5hdGUgdGhlIG51bGwgY2FzZS5cbiAgaWYgKHRleHQxX2xlbmd0aCA9PSAwIHx8IHRleHQyX2xlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgLy8gVHJ1bmNhdGUgdGhlIGxvbmdlciBzdHJpbmcuXG4gIGlmICh0ZXh0MV9sZW5ndGggPiB0ZXh0Ml9sZW5ndGgpIHtcbiAgICB0ZXh0MSA9IHRleHQxLnN1YnN0cmluZyh0ZXh0MV9sZW5ndGggLSB0ZXh0Ml9sZW5ndGgpO1xuICB9IGVsc2UgaWYgKHRleHQxX2xlbmd0aCA8IHRleHQyX2xlbmd0aCkge1xuICAgIHRleHQyID0gdGV4dDIuc3Vic3RyaW5nKDAsIHRleHQxX2xlbmd0aCk7XG4gIH1cbiAgdmFyIHRleHRfbGVuZ3RoID0gTWF0aC5taW4odGV4dDFfbGVuZ3RoLCB0ZXh0Ml9sZW5ndGgpO1xuICAvLyBRdWljayBjaGVjayBmb3IgdGhlIHdvcnN0IGNhc2UuXG4gIGlmICh0ZXh0MSA9PSB0ZXh0Mikge1xuICAgIHJldHVybiB0ZXh0X2xlbmd0aDtcbiAgfVxuXG4gIC8vIFN0YXJ0IGJ5IGxvb2tpbmcgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciBtYXRjaFxuICAvLyBhbmQgaW5jcmVhc2UgbGVuZ3RoIHVudGlsIG5vIG1hdGNoIGlzIGZvdW5kLlxuICAvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cHM6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAxMC8xMS8wNC9cbiAgdmFyIGJlc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gMTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcGF0dGVybiA9IHRleHQxLnN1YnN0cmluZyh0ZXh0X2xlbmd0aCAtIGxlbmd0aCk7XG4gICAgdmFyIGZvdW5kID0gdGV4dDIuaW5kZXhPZihwYXR0ZXJuKTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHtcbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH1cbiAgICBsZW5ndGggKz0gZm91bmQ7XG4gICAgaWYgKGZvdW5kID09IDAgfHwgdGV4dDEuc3Vic3RyaW5nKHRleHRfbGVuZ3RoIC0gbGVuZ3RoKSA9PVxuICAgICAgICB0ZXh0Mi5zdWJzdHJpbmcoMCwgbGVuZ3RoKSkge1xuICAgICAgYmVzdCA9IGxlbmd0aDtcbiAgICAgIGxlbmd0aCsrO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIERvIHRoZSB0d28gdGV4dHMgc2hhcmUgYSBzdWJzdHJpbmcgd2hpY2ggaXMgYXQgbGVhc3QgaGFsZiB0aGUgbGVuZ3RoIG9mIHRoZVxuICogbG9uZ2VyIHRleHQ/XG4gKiBUaGlzIHNwZWVkdXAgY2FuIHByb2R1Y2Ugbm9uLW1pbmltYWwgZGlmZnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gRml2ZSBlbGVtZW50IEFycmF5LCBjb250YWluaW5nIHRoZSBwcmVmaXggb2ZcbiAqICAgICB0ZXh0MSwgdGhlIHN1ZmZpeCBvZiB0ZXh0MSwgdGhlIHByZWZpeCBvZiB0ZXh0MiwgdGhlIHN1ZmZpeCBvZlxuICogICAgIHRleHQyIGFuZCB0aGUgY29tbW9uIG1pZGRsZS4gIE9yIG51bGwgaWYgdGhlcmUgd2FzIG5vIG1hdGNoLlxuICogQHByaXZhdGVcbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9oYWxmTWF0Y2hfID0gZnVuY3Rpb24odGV4dDEsIHRleHQyKSB7XG4gIGlmICh0aGlzLkRpZmZfVGltZW91dCA8PSAwKSB7XG4gICAgLy8gRG9uJ3QgcmlzayByZXR1cm5pbmcgYSBub24tb3B0aW1hbCBkaWZmIGlmIHdlIGhhdmUgdW5saW1pdGVkIHRpbWUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGxvbmd0ZXh0ID0gdGV4dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoID8gdGV4dDEgOiB0ZXh0MjtcbiAgdmFyIHNob3J0dGV4dCA9IHRleHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQyIDogdGV4dDE7XG4gIGlmIChsb25ndGV4dC5sZW5ndGggPCA0IHx8IHNob3J0dGV4dC5sZW5ndGggKiAyIDwgbG9uZ3RleHQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7ICAvLyBQb2ludGxlc3MuXG4gIH1cbiAgdmFyIGRtcCA9IHRoaXM7ICAvLyAndGhpcycgYmVjb21lcyAnd2luZG93JyBpbiBhIGNsb3N1cmUuXG5cbiAgLyoqXG4gICAqIERvZXMgYSBzdWJzdHJpbmcgb2Ygc2hvcnR0ZXh0IGV4aXN0IHdpdGhpbiBsb25ndGV4dCBzdWNoIHRoYXQgdGhlIHN1YnN0cmluZ1xuICAgKiBpcyBhdCBsZWFzdCBoYWxmIHRoZSBsZW5ndGggb2YgbG9uZ3RleHQ/XG4gICAqIENsb3N1cmUsIGJ1dCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IGV4dGVybmFsIHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvbmd0ZXh0IExvbmdlciBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaG9ydHRleHQgU2hvcnRlciBzdHJpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpIFN0YXJ0IGluZGV4IG9mIHF1YXJ0ZXIgbGVuZ3RoIHN1YnN0cmluZyB3aXRoaW4gbG9uZ3RleHQuXG4gICAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSBGaXZlIGVsZW1lbnQgQXJyYXksIGNvbnRhaW5pbmcgdGhlIHByZWZpeCBvZlxuICAgKiAgICAgbG9uZ3RleHQsIHRoZSBzdWZmaXggb2YgbG9uZ3RleHQsIHRoZSBwcmVmaXggb2Ygc2hvcnR0ZXh0LCB0aGUgc3VmZml4XG4gICAqICAgICBvZiBzaG9ydHRleHQgYW5kIHRoZSBjb21tb24gbWlkZGxlLiAgT3IgbnVsbCBpZiB0aGVyZSB3YXMgbm8gbWF0Y2guXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBkaWZmX2hhbGZNYXRjaElfKGxvbmd0ZXh0LCBzaG9ydHRleHQsIGkpIHtcbiAgICAvLyBTdGFydCB3aXRoIGEgMS80IGxlbmd0aCBzdWJzdHJpbmcgYXQgcG9zaXRpb24gaSBhcyBhIHNlZWQuXG4gICAgdmFyIHNlZWQgPSBsb25ndGV4dC5zdWJzdHJpbmcoaSwgaSArIE1hdGguZmxvb3IobG9uZ3RleHQubGVuZ3RoIC8gNCkpO1xuICAgIHZhciBqID0gLTE7XG4gICAgdmFyIGJlc3RfY29tbW9uID0gJyc7XG4gICAgdmFyIGJlc3RfbG9uZ3RleHRfYSwgYmVzdF9sb25ndGV4dF9iLCBiZXN0X3Nob3J0dGV4dF9hLCBiZXN0X3Nob3J0dGV4dF9iO1xuICAgIHdoaWxlICgoaiA9IHNob3J0dGV4dC5pbmRleE9mKHNlZWQsIGogKyAxKSkgIT0gLTEpIHtcbiAgICAgIHZhciBwcmVmaXhMZW5ndGggPSBkbXAuZGlmZl9jb21tb25QcmVmaXgobG9uZ3RleHQuc3Vic3RyaW5nKGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydHRleHQuc3Vic3RyaW5nKGopKTtcbiAgICAgIHZhciBzdWZmaXhMZW5ndGggPSBkbXAuZGlmZl9jb21tb25TdWZmaXgobG9uZ3RleHQuc3Vic3RyaW5nKDAsIGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydHRleHQuc3Vic3RyaW5nKDAsIGopKTtcbiAgICAgIGlmIChiZXN0X2NvbW1vbi5sZW5ndGggPCBzdWZmaXhMZW5ndGggKyBwcmVmaXhMZW5ndGgpIHtcbiAgICAgICAgYmVzdF9jb21tb24gPSBzaG9ydHRleHQuc3Vic3RyaW5nKGogLSBzdWZmaXhMZW5ndGgsIGopICtcbiAgICAgICAgICAgIHNob3J0dGV4dC5zdWJzdHJpbmcoaiwgaiArIHByZWZpeExlbmd0aCk7XG4gICAgICAgIGJlc3RfbG9uZ3RleHRfYSA9IGxvbmd0ZXh0LnN1YnN0cmluZygwLCBpIC0gc3VmZml4TGVuZ3RoKTtcbiAgICAgICAgYmVzdF9sb25ndGV4dF9iID0gbG9uZ3RleHQuc3Vic3RyaW5nKGkgKyBwcmVmaXhMZW5ndGgpO1xuICAgICAgICBiZXN0X3Nob3J0dGV4dF9hID0gc2hvcnR0ZXh0LnN1YnN0cmluZygwLCBqIC0gc3VmZml4TGVuZ3RoKTtcbiAgICAgICAgYmVzdF9zaG9ydHRleHRfYiA9IHNob3J0dGV4dC5zdWJzdHJpbmcoaiArIHByZWZpeExlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiZXN0X2NvbW1vbi5sZW5ndGggKiAyID49IGxvbmd0ZXh0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtiZXN0X2xvbmd0ZXh0X2EsIGJlc3RfbG9uZ3RleHRfYixcbiAgICAgICAgICAgICAgYmVzdF9zaG9ydHRleHRfYSwgYmVzdF9zaG9ydHRleHRfYiwgYmVzdF9jb21tb25dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgc2Vjb25kIHF1YXJ0ZXIgaXMgdGhlIHNlZWQgZm9yIGEgaGFsZi1tYXRjaC5cbiAgdmFyIGhtMSA9IGRpZmZfaGFsZk1hdGNoSV8obG9uZ3RleHQsIHNob3J0dGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5jZWlsKGxvbmd0ZXh0Lmxlbmd0aCAvIDQpKTtcbiAgLy8gQ2hlY2sgYWdhaW4gYmFzZWQgb24gdGhlIHRoaXJkIHF1YXJ0ZXIuXG4gIHZhciBobTIgPSBkaWZmX2hhbGZNYXRjaElfKGxvbmd0ZXh0LCBzaG9ydHRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY2VpbChsb25ndGV4dC5sZW5ndGggLyAyKSk7XG4gIHZhciBobTtcbiAgaWYgKCFobTEgJiYgIWhtMikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKCFobTIpIHtcbiAgICBobSA9IGhtMTtcbiAgfSBlbHNlIGlmICghaG0xKSB7XG4gICAgaG0gPSBobTI7XG4gIH0gZWxzZSB7XG4gICAgLy8gQm90aCBtYXRjaGVkLiAgU2VsZWN0IHRoZSBsb25nZXN0LlxuICAgIGhtID0gaG0xWzRdLmxlbmd0aCA+IGhtMls0XS5sZW5ndGggPyBobTEgOiBobTI7XG4gIH1cblxuICAvLyBBIGhhbGYtbWF0Y2ggd2FzIGZvdW5kLCBzb3J0IG91dCB0aGUgcmV0dXJuIGRhdGEuXG4gIHZhciB0ZXh0MV9hLCB0ZXh0MV9iLCB0ZXh0Ml9hLCB0ZXh0Ml9iO1xuICBpZiAodGV4dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoKSB7XG4gICAgdGV4dDFfYSA9IGhtWzBdO1xuICAgIHRleHQxX2IgPSBobVsxXTtcbiAgICB0ZXh0Ml9hID0gaG1bMl07XG4gICAgdGV4dDJfYiA9IGhtWzNdO1xuICB9IGVsc2Uge1xuICAgIHRleHQyX2EgPSBobVswXTtcbiAgICB0ZXh0Ml9iID0gaG1bMV07XG4gICAgdGV4dDFfYSA9IGhtWzJdO1xuICAgIHRleHQxX2IgPSBobVszXTtcbiAgfVxuICB2YXIgbWlkX2NvbW1vbiA9IGhtWzRdO1xuICByZXR1cm4gW3RleHQxX2EsIHRleHQxX2IsIHRleHQyX2EsIHRleHQyX2IsIG1pZF9jb21tb25dO1xufTtcblxuXG4vKipcbiAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGVkaXRzIGJ5IGVsaW1pbmF0aW5nIHNlbWFudGljYWxseSB0cml2aWFsIGVxdWFsaXRpZXMuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBTZW1hbnRpYyA9IGZ1bmN0aW9uKGRpZmZzKSB7XG4gIHZhciBjaGFuZ2VzID0gZmFsc2U7XG4gIHZhciBlcXVhbGl0aWVzID0gW107ICAvLyBTdGFjayBvZiBpbmRpY2VzIHdoZXJlIGVxdWFsaXRpZXMgYXJlIGZvdW5kLlxuICB2YXIgZXF1YWxpdGllc0xlbmd0aCA9IDA7ICAvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhciBpcyBmYXN0ZXIgaW4gSlMuXG4gIC8qKiBAdHlwZSB7P3N0cmluZ30gKi9cbiAgdmFyIGxhc3RFcXVhbGl0eSA9IG51bGw7XG4gIC8vIEFsd2F5cyBlcXVhbCB0byBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXV1bMV1cbiAgdmFyIHBvaW50ZXIgPSAwOyAgLy8gSW5kZXggb2YgY3VycmVudCBwb3NpdGlvbi5cbiAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjaGFuZ2VkIHByaW9yIHRvIHRoZSBlcXVhbGl0eS5cbiAgdmFyIGxlbmd0aF9pbnNlcnRpb25zMSA9IDA7XG4gIHZhciBsZW5ndGhfZGVsZXRpb25zMSA9IDA7XG4gIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2hhbmdlZCBhZnRlciB0aGUgZXF1YWxpdHkuXG4gIHZhciBsZW5ndGhfaW5zZXJ0aW9uczIgPSAwO1xuICB2YXIgbGVuZ3RoX2RlbGV0aW9uczIgPSAwO1xuICB3aGlsZSAocG9pbnRlciA8IGRpZmZzLmxlbmd0aCkge1xuICAgIGlmIChkaWZmc1twb2ludGVyXVswXSA9PSBESUZGX0VRVUFMKSB7ICAvLyBFcXVhbGl0eSBmb3VuZC5cbiAgICAgIGVxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCsrXSA9IHBvaW50ZXI7XG4gICAgICBsZW5ndGhfaW5zZXJ0aW9uczEgPSBsZW5ndGhfaW5zZXJ0aW9uczI7XG4gICAgICBsZW5ndGhfZGVsZXRpb25zMSA9IGxlbmd0aF9kZWxldGlvbnMyO1xuICAgICAgbGVuZ3RoX2luc2VydGlvbnMyID0gMDtcbiAgICAgIGxlbmd0aF9kZWxldGlvbnMyID0gMDtcbiAgICAgIGxhc3RFcXVhbGl0eSA9IGRpZmZzW3BvaW50ZXJdWzFdO1xuICAgIH0gZWxzZSB7ICAvLyBBbiBpbnNlcnRpb24gb3IgZGVsZXRpb24uXG4gICAgICBpZiAoZGlmZnNbcG9pbnRlcl1bMF0gPT0gRElGRl9JTlNFUlQpIHtcbiAgICAgICAgbGVuZ3RoX2luc2VydGlvbnMyICs9IGRpZmZzW3BvaW50ZXJdWzFdLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbmd0aF9kZWxldGlvbnMyICs9IGRpZmZzW3BvaW50ZXJdWzFdLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIEVsaW1pbmF0ZSBhbiBlcXVhbGl0eSB0aGF0IGlzIHNtYWxsZXIgb3IgZXF1YWwgdG8gdGhlIGVkaXRzIG9uIGJvdGhcbiAgICAgIC8vIHNpZGVzIG9mIGl0LlxuICAgICAgaWYgKGxhc3RFcXVhbGl0eSAmJiAobGFzdEVxdWFsaXR5Lmxlbmd0aCA8PVxuICAgICAgICAgIE1hdGgubWF4KGxlbmd0aF9pbnNlcnRpb25zMSwgbGVuZ3RoX2RlbGV0aW9uczEpKSAmJlxuICAgICAgICAgIChsYXN0RXF1YWxpdHkubGVuZ3RoIDw9IE1hdGgubWF4KGxlbmd0aF9pbnNlcnRpb25zMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfZGVsZXRpb25zMikpKSB7XG4gICAgICAgIC8vIER1cGxpY2F0ZSByZWNvcmQuXG4gICAgICAgIGRpZmZzLnNwbGljZShlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXSwgMCxcbiAgICAgICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIGxhc3RFcXVhbGl0eSkpO1xuICAgICAgICAvLyBDaGFuZ2Ugc2Vjb25kIGNvcHkgdG8gaW5zZXJ0LlxuICAgICAgICBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXSArIDFdWzBdID0gRElGRl9JTlNFUlQ7XG4gICAgICAgIC8vIFRocm93IGF3YXkgdGhlIGVxdWFsaXR5IHdlIGp1c3QgZGVsZXRlZC5cbiAgICAgICAgZXF1YWxpdGllc0xlbmd0aC0tO1xuICAgICAgICAvLyBUaHJvdyBhd2F5IHRoZSBwcmV2aW91cyBlcXVhbGl0eSAoaXQgbmVlZHMgdG8gYmUgcmVldmFsdWF0ZWQpLlxuICAgICAgICBlcXVhbGl0aWVzTGVuZ3RoLS07XG4gICAgICAgIHBvaW50ZXIgPSBlcXVhbGl0aWVzTGVuZ3RoID4gMCA/IGVxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdIDogLTE7XG4gICAgICAgIGxlbmd0aF9pbnNlcnRpb25zMSA9IDA7ICAvLyBSZXNldCB0aGUgY291bnRlcnMuXG4gICAgICAgIGxlbmd0aF9kZWxldGlvbnMxID0gMDtcbiAgICAgICAgbGVuZ3RoX2luc2VydGlvbnMyID0gMDtcbiAgICAgICAgbGVuZ3RoX2RlbGV0aW9uczIgPSAwO1xuICAgICAgICBsYXN0RXF1YWxpdHkgPSBudWxsO1xuICAgICAgICBjaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcG9pbnRlcisrO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBkaWZmLlxuICBpZiAoY2hhbmdlcykge1xuICAgIHRoaXMuZGlmZl9jbGVhbnVwTWVyZ2UoZGlmZnMpO1xuICB9XG4gIHRoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWNMb3NzbGVzcyhkaWZmcyk7XG5cbiAgLy8gRmluZCBhbnkgb3ZlcmxhcHMgYmV0d2VlbiBkZWxldGlvbnMgYW5kIGluc2VydGlvbnMuXG4gIC8vIGUuZzogPGRlbD5hYmN4eHg8L2RlbD48aW5zPnh4eGRlZjwvaW5zPlxuICAvLyAgIC0+IDxkZWw+YWJjPC9kZWw+eHh4PGlucz5kZWY8L2lucz5cbiAgLy8gZS5nOiA8ZGVsPnh4eGFiYzwvZGVsPjxpbnM+ZGVmeHh4PC9pbnM+XG4gIC8vICAgLT4gPGlucz5kZWY8L2lucz54eHg8ZGVsPmFiYzwvZGVsPlxuICAvLyBPbmx5IGV4dHJhY3QgYW4gb3ZlcmxhcCBpZiBpdCBpcyBhcyBiaWcgYXMgdGhlIGVkaXQgYWhlYWQgb3IgYmVoaW5kIGl0LlxuICBwb2ludGVyID0gMTtcbiAgd2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGgpIHtcbiAgICBpZiAoZGlmZnNbcG9pbnRlciAtIDFdWzBdID09IERJRkZfREVMRVRFICYmXG4gICAgICAgIGRpZmZzW3BvaW50ZXJdWzBdID09IERJRkZfSU5TRVJUKSB7XG4gICAgICB2YXIgZGVsZXRpb24gPSBkaWZmc1twb2ludGVyIC0gMV1bMV07XG4gICAgICB2YXIgaW5zZXJ0aW9uID0gZGlmZnNbcG9pbnRlcl1bMV07XG4gICAgICB2YXIgb3ZlcmxhcF9sZW5ndGgxID0gdGhpcy5kaWZmX2NvbW1vbk92ZXJsYXBfKGRlbGV0aW9uLCBpbnNlcnRpb24pO1xuICAgICAgdmFyIG92ZXJsYXBfbGVuZ3RoMiA9IHRoaXMuZGlmZl9jb21tb25PdmVybGFwXyhpbnNlcnRpb24sIGRlbGV0aW9uKTtcbiAgICAgIGlmIChvdmVybGFwX2xlbmd0aDEgPj0gb3ZlcmxhcF9sZW5ndGgyKSB7XG4gICAgICAgIGlmIChvdmVybGFwX2xlbmd0aDEgPj0gZGVsZXRpb24ubGVuZ3RoIC8gMiB8fFxuICAgICAgICAgICAgb3ZlcmxhcF9sZW5ndGgxID49IGluc2VydGlvbi5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgLy8gT3ZlcmxhcCBmb3VuZC4gIEluc2VydCBhbiBlcXVhbGl0eSBhbmQgdHJpbSB0aGUgc3Vycm91bmRpbmcgZWRpdHMuXG4gICAgICAgICAgZGlmZnMuc3BsaWNlKHBvaW50ZXIsIDAsIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9FUVVBTCxcbiAgICAgICAgICAgICAgaW5zZXJ0aW9uLnN1YnN0cmluZygwLCBvdmVybGFwX2xlbmd0aDEpKSk7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciAtIDFdWzFdID1cbiAgICAgICAgICAgICAgZGVsZXRpb24uc3Vic3RyaW5nKDAsIGRlbGV0aW9uLmxlbmd0aCAtIG92ZXJsYXBfbGVuZ3RoMSk7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzFdID0gaW5zZXJ0aW9uLnN1YnN0cmluZyhvdmVybGFwX2xlbmd0aDEpO1xuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG92ZXJsYXBfbGVuZ3RoMiA+PSBkZWxldGlvbi5sZW5ndGggLyAyIHx8XG4gICAgICAgICAgICBvdmVybGFwX2xlbmd0aDIgPj0gaW5zZXJ0aW9uLmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICAvLyBSZXZlcnNlIG92ZXJsYXAgZm91bmQuXG4gICAgICAgICAgLy8gSW5zZXJ0IGFuIGVxdWFsaXR5IGFuZCBzd2FwIGFuZCB0cmltIHRoZSBzdXJyb3VuZGluZyBlZGl0cy5cbiAgICAgICAgICBkaWZmcy5zcGxpY2UocG9pbnRlciwgMCwgbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLFxuICAgICAgICAgICAgICBkZWxldGlvbi5zdWJzdHJpbmcoMCwgb3ZlcmxhcF9sZW5ndGgyKSkpO1xuICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9IERJRkZfSU5TRVJUO1xuICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSAxXVsxXSA9XG4gICAgICAgICAgICAgIGluc2VydGlvbi5zdWJzdHJpbmcoMCwgaW5zZXJ0aW9uLmxlbmd0aCAtIG92ZXJsYXBfbGVuZ3RoMik7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzBdID0gRElGRl9ERUxFVEU7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzFdID1cbiAgICAgICAgICAgICAgZGVsZXRpb24uc3Vic3RyaW5nKG92ZXJsYXBfbGVuZ3RoMik7XG4gICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwb2ludGVyKys7XG4gICAgfVxuICAgIHBvaW50ZXIrKztcbiAgfVxufTtcblxuXG4vKipcbiAqIExvb2sgZm9yIHNpbmdsZSBlZGl0cyBzdXJyb3VuZGVkIG9uIGJvdGggc2lkZXMgYnkgZXF1YWxpdGllc1xuICogd2hpY2ggY2FuIGJlIHNoaWZ0ZWQgc2lkZXdheXMgdG8gYWxpZ24gdGhlIGVkaXQgdG8gYSB3b3JkIGJvdW5kYXJ5LlxuICogZS5nOiBUaGUgYzxpbnM+YXQgYzwvaW5zPmFtZS4gLT4gVGhlIDxpbnM+Y2F0IDwvaW5zPmNhbWUuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBTZW1hbnRpY0xvc3NsZXNzID0gZnVuY3Rpb24oZGlmZnMpIHtcbiAgLyoqXG4gICAqIEdpdmVuIHR3byBzdHJpbmdzLCBjb21wdXRlIGEgc2NvcmUgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIGludGVybmFsXG4gICAqIGJvdW5kYXJ5IGZhbGxzIG9uIGxvZ2ljYWwgYm91bmRhcmllcy5cbiAgICogU2NvcmVzIHJhbmdlIGZyb20gNiAoYmVzdCkgdG8gMCAod29yc3QpLlxuICAgKiBDbG9zdXJlLCBidXQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBleHRlcm5hbCB2YXJpYWJsZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvbmUgRmlyc3Qgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHdvIFNlY29uZCBzdHJpbmcuXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNjb3JlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gZGlmZl9jbGVhbnVwU2VtYW50aWNTY29yZV8ob25lLCB0d28pIHtcbiAgICBpZiAoIW9uZSB8fCAhdHdvKSB7XG4gICAgICAvLyBFZGdlcyBhcmUgdGhlIGJlc3QuXG4gICAgICByZXR1cm4gNjtcbiAgICB9XG5cbiAgICAvLyBFYWNoIHBvcnQgb2YgdGhpcyBmdW5jdGlvbiBiZWhhdmVzIHNsaWdodGx5IGRpZmZlcmVudGx5IGR1ZSB0b1xuICAgIC8vIHN1YnRsZSBkaWZmZXJlbmNlcyBpbiBlYWNoIGxhbmd1YWdlJ3MgZGVmaW5pdGlvbiBvZiB0aGluZ3MgbGlrZVxuICAgIC8vICd3aGl0ZXNwYWNlJy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24ncyBwdXJwb3NlIGlzIGxhcmdlbHkgY29zbWV0aWMsXG4gICAgLy8gdGhlIGNob2ljZSBoYXMgYmVlbiBtYWRlIHRvIHVzZSBlYWNoIGxhbmd1YWdlJ3MgbmF0aXZlIGZlYXR1cmVzXG4gICAgLy8gcmF0aGVyIHRoYW4gZm9yY2UgdG90YWwgY29uZm9ybWl0eS5cbiAgICB2YXIgY2hhcjEgPSBvbmUuY2hhckF0KG9uZS5sZW5ndGggLSAxKTtcbiAgICB2YXIgY2hhcjIgPSB0d28uY2hhckF0KDApO1xuICAgIHZhciBub25BbHBoYU51bWVyaWMxID0gY2hhcjEubWF0Y2goZGlmZl9tYXRjaF9wYXRjaC5ub25BbHBoYU51bWVyaWNSZWdleF8pO1xuICAgIHZhciBub25BbHBoYU51bWVyaWMyID0gY2hhcjIubWF0Y2goZGlmZl9tYXRjaF9wYXRjaC5ub25BbHBoYU51bWVyaWNSZWdleF8pO1xuICAgIHZhciB3aGl0ZXNwYWNlMSA9IG5vbkFscGhhTnVtZXJpYzEgJiZcbiAgICAgICAgY2hhcjEubWF0Y2goZGlmZl9tYXRjaF9wYXRjaC53aGl0ZXNwYWNlUmVnZXhfKTtcbiAgICB2YXIgd2hpdGVzcGFjZTIgPSBub25BbHBoYU51bWVyaWMyICYmXG4gICAgICAgIGNoYXIyLm1hdGNoKGRpZmZfbWF0Y2hfcGF0Y2gud2hpdGVzcGFjZVJlZ2V4Xyk7XG4gICAgdmFyIGxpbmVCcmVhazEgPSB3aGl0ZXNwYWNlMSAmJlxuICAgICAgICBjaGFyMS5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmxpbmVicmVha1JlZ2V4Xyk7XG4gICAgdmFyIGxpbmVCcmVhazIgPSB3aGl0ZXNwYWNlMiAmJlxuICAgICAgICBjaGFyMi5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmxpbmVicmVha1JlZ2V4Xyk7XG4gICAgdmFyIGJsYW5rTGluZTEgPSBsaW5lQnJlYWsxICYmXG4gICAgICAgIG9uZS5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmJsYW5rbGluZUVuZFJlZ2V4Xyk7XG4gICAgdmFyIGJsYW5rTGluZTIgPSBsaW5lQnJlYWsyICYmXG4gICAgICAgIHR3by5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmJsYW5rbGluZVN0YXJ0UmVnZXhfKTtcblxuICAgIGlmIChibGFua0xpbmUxIHx8IGJsYW5rTGluZTIpIHtcbiAgICAgIC8vIEZpdmUgcG9pbnRzIGZvciBibGFuayBsaW5lcy5cbiAgICAgIHJldHVybiA1O1xuICAgIH0gZWxzZSBpZiAobGluZUJyZWFrMSB8fCBsaW5lQnJlYWsyKSB7XG4gICAgICAvLyBGb3VyIHBvaW50cyBmb3IgbGluZSBicmVha3MuXG4gICAgICByZXR1cm4gNDtcbiAgICB9IGVsc2UgaWYgKG5vbkFscGhhTnVtZXJpYzEgJiYgIXdoaXRlc3BhY2UxICYmIHdoaXRlc3BhY2UyKSB7XG4gICAgICAvLyBUaHJlZSBwb2ludHMgZm9yIGVuZCBvZiBzZW50ZW5jZXMuXG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2UgaWYgKHdoaXRlc3BhY2UxIHx8IHdoaXRlc3BhY2UyKSB7XG4gICAgICAvLyBUd28gcG9pbnRzIGZvciB3aGl0ZXNwYWNlLlxuICAgICAgcmV0dXJuIDI7XG4gICAgfSBlbHNlIGlmIChub25BbHBoYU51bWVyaWMxIHx8IG5vbkFscGhhTnVtZXJpYzIpIHtcbiAgICAgIC8vIE9uZSBwb2ludCBmb3Igbm9uLWFscGhhbnVtZXJpYy5cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBwb2ludGVyID0gMTtcbiAgLy8gSW50ZW50aW9uYWxseSBpZ25vcmUgdGhlIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnQgKGRvbid0IG5lZWQgY2hlY2tpbmcpLlxuICB3aGlsZSAocG9pbnRlciA8IGRpZmZzLmxlbmd0aCAtIDEpIHtcbiAgICBpZiAoZGlmZnNbcG9pbnRlciAtIDFdWzBdID09IERJRkZfRVFVQUwgJiZcbiAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzBdID09IERJRkZfRVFVQUwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzaW5nbGUgZWRpdCBzdXJyb3VuZGVkIGJ5IGVxdWFsaXRpZXMuXG4gICAgICB2YXIgZXF1YWxpdHkxID0gZGlmZnNbcG9pbnRlciAtIDFdWzFdO1xuICAgICAgdmFyIGVkaXQgPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgIHZhciBlcXVhbGl0eTIgPSBkaWZmc1twb2ludGVyICsgMV1bMV07XG5cbiAgICAgIC8vIEZpcnN0LCBzaGlmdCB0aGUgZWRpdCBhcyBmYXIgbGVmdCBhcyBwb3NzaWJsZS5cbiAgICAgIHZhciBjb21tb25PZmZzZXQgPSB0aGlzLmRpZmZfY29tbW9uU3VmZml4KGVxdWFsaXR5MSwgZWRpdCk7XG4gICAgICBpZiAoY29tbW9uT2Zmc2V0KSB7XG4gICAgICAgIHZhciBjb21tb25TdHJpbmcgPSBlZGl0LnN1YnN0cmluZyhlZGl0Lmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG4gICAgICAgIGVxdWFsaXR5MSA9IGVxdWFsaXR5MS5zdWJzdHJpbmcoMCwgZXF1YWxpdHkxLmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG4gICAgICAgIGVkaXQgPSBjb21tb25TdHJpbmcgKyBlZGl0LnN1YnN0cmluZygwLCBlZGl0Lmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG4gICAgICAgIGVxdWFsaXR5MiA9IGNvbW1vblN0cmluZyArIGVxdWFsaXR5MjtcbiAgICAgIH1cblxuICAgICAgLy8gU2Vjb25kLCBzdGVwIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgcmlnaHQsIGxvb2tpbmcgZm9yIHRoZSBiZXN0IGZpdC5cbiAgICAgIHZhciBiZXN0RXF1YWxpdHkxID0gZXF1YWxpdHkxO1xuICAgICAgdmFyIGJlc3RFZGl0ID0gZWRpdDtcbiAgICAgIHZhciBiZXN0RXF1YWxpdHkyID0gZXF1YWxpdHkyO1xuICAgICAgdmFyIGJlc3RTY29yZSA9IGRpZmZfY2xlYW51cFNlbWFudGljU2NvcmVfKGVxdWFsaXR5MSwgZWRpdCkgK1xuICAgICAgICAgIGRpZmZfY2xlYW51cFNlbWFudGljU2NvcmVfKGVkaXQsIGVxdWFsaXR5Mik7XG4gICAgICB3aGlsZSAoZWRpdC5jaGFyQXQoMCkgPT09IGVxdWFsaXR5Mi5jaGFyQXQoMCkpIHtcbiAgICAgICAgZXF1YWxpdHkxICs9IGVkaXQuY2hhckF0KDApO1xuICAgICAgICBlZGl0ID0gZWRpdC5zdWJzdHJpbmcoMSkgKyBlcXVhbGl0eTIuY2hhckF0KDApO1xuICAgICAgICBlcXVhbGl0eTIgPSBlcXVhbGl0eTIuc3Vic3RyaW5nKDEpO1xuICAgICAgICB2YXIgc2NvcmUgPSBkaWZmX2NsZWFudXBTZW1hbnRpY1Njb3JlXyhlcXVhbGl0eTEsIGVkaXQpICtcbiAgICAgICAgICAgIGRpZmZfY2xlYW51cFNlbWFudGljU2NvcmVfKGVkaXQsIGVxdWFsaXR5Mik7XG4gICAgICAgIC8vIFRoZSA+PSBlbmNvdXJhZ2VzIHRyYWlsaW5nIHJhdGhlciB0aGFuIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBlZGl0cy5cbiAgICAgICAgaWYgKHNjb3JlID49IGJlc3RTY29yZSkge1xuICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xuICAgICAgICAgIGJlc3RFcXVhbGl0eTEgPSBlcXVhbGl0eTE7XG4gICAgICAgICAgYmVzdEVkaXQgPSBlZGl0O1xuICAgICAgICAgIGJlc3RFcXVhbGl0eTIgPSBlcXVhbGl0eTI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRpZmZzW3BvaW50ZXIgLSAxXVsxXSAhPSBiZXN0RXF1YWxpdHkxKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYW4gaW1wcm92ZW1lbnQsIHNhdmUgaXQgYmFjayB0byB0aGUgZGlmZi5cbiAgICAgICAgaWYgKGJlc3RFcXVhbGl0eTEpIHtcbiAgICAgICAgICBkaWZmc1twb2ludGVyIC0gMV1bMV0gPSBiZXN0RXF1YWxpdHkxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyIC0gMSwgMSk7XG4gICAgICAgICAgcG9pbnRlci0tO1xuICAgICAgICB9XG4gICAgICAgIGRpZmZzW3BvaW50ZXJdWzFdID0gYmVzdEVkaXQ7XG4gICAgICAgIGlmIChiZXN0RXF1YWxpdHkyKSB7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzFdID0gYmVzdEVxdWFsaXR5MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaWZmcy5zcGxpY2UocG9pbnRlciArIDEsIDEpO1xuICAgICAgICAgIHBvaW50ZXItLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwb2ludGVyKys7XG4gIH1cbn07XG5cbi8vIERlZmluZSBzb21lIHJlZ2V4IHBhdHRlcm5zIGZvciBtYXRjaGluZyBib3VuZGFyaWVzLlxuZGlmZl9tYXRjaF9wYXRjaC5ub25BbHBoYU51bWVyaWNSZWdleF8gPSAvW15hLXpBLVowLTldLztcbmRpZmZfbWF0Y2hfcGF0Y2gud2hpdGVzcGFjZVJlZ2V4XyA9IC9cXHMvO1xuZGlmZl9tYXRjaF9wYXRjaC5saW5lYnJlYWtSZWdleF8gPSAvW1xcclxcbl0vO1xuZGlmZl9tYXRjaF9wYXRjaC5ibGFua2xpbmVFbmRSZWdleF8gPSAvXFxuXFxyP1xcbiQvO1xuZGlmZl9tYXRjaF9wYXRjaC5ibGFua2xpbmVTdGFydFJlZ2V4XyA9IC9eXFxyP1xcblxccj9cXG4vO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGVkaXRzIGJ5IGVsaW1pbmF0aW5nIG9wZXJhdGlvbmFsbHkgdHJpdmlhbCBlcXVhbGl0aWVzLlxuICogQHBhcmFtIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9jbGVhbnVwRWZmaWNpZW5jeSA9IGZ1bmN0aW9uKGRpZmZzKSB7XG4gIHZhciBjaGFuZ2VzID0gZmFsc2U7XG4gIHZhciBlcXVhbGl0aWVzID0gW107ICAvLyBTdGFjayBvZiBpbmRpY2VzIHdoZXJlIGVxdWFsaXRpZXMgYXJlIGZvdW5kLlxuICB2YXIgZXF1YWxpdGllc0xlbmd0aCA9IDA7ICAvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhciBpcyBmYXN0ZXIgaW4gSlMuXG4gIC8qKiBAdHlwZSB7P3N0cmluZ30gKi9cbiAgdmFyIGxhc3RFcXVhbGl0eSA9IG51bGw7XG4gIC8vIEFsd2F5cyBlcXVhbCB0byBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXV1bMV1cbiAgdmFyIHBvaW50ZXIgPSAwOyAgLy8gSW5kZXggb2YgY3VycmVudCBwb3NpdGlvbi5cbiAgLy8gSXMgdGhlcmUgYW4gaW5zZXJ0aW9uIG9wZXJhdGlvbiBiZWZvcmUgdGhlIGxhc3QgZXF1YWxpdHkuXG4gIHZhciBwcmVfaW5zID0gZmFsc2U7XG4gIC8vIElzIHRoZXJlIGEgZGVsZXRpb24gb3BlcmF0aW9uIGJlZm9yZSB0aGUgbGFzdCBlcXVhbGl0eS5cbiAgdmFyIHByZV9kZWwgPSBmYWxzZTtcbiAgLy8gSXMgdGhlcmUgYW4gaW5zZXJ0aW9uIG9wZXJhdGlvbiBhZnRlciB0aGUgbGFzdCBlcXVhbGl0eS5cbiAgdmFyIHBvc3RfaW5zID0gZmFsc2U7XG4gIC8vIElzIHRoZXJlIGEgZGVsZXRpb24gb3BlcmF0aW9uIGFmdGVyIHRoZSBsYXN0IGVxdWFsaXR5LlxuICB2YXIgcG9zdF9kZWwgPSBmYWxzZTtcbiAgd2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGgpIHtcbiAgICBpZiAoZGlmZnNbcG9pbnRlcl1bMF0gPT0gRElGRl9FUVVBTCkgeyAgLy8gRXF1YWxpdHkgZm91bmQuXG4gICAgICBpZiAoZGlmZnNbcG9pbnRlcl1bMV0ubGVuZ3RoIDwgdGhpcy5EaWZmX0VkaXRDb3N0ICYmXG4gICAgICAgICAgKHBvc3RfaW5zIHx8IHBvc3RfZGVsKSkge1xuICAgICAgICAvLyBDYW5kaWRhdGUgZm91bmQuXG4gICAgICAgIGVxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCsrXSA9IHBvaW50ZXI7XG4gICAgICAgIHByZV9pbnMgPSBwb3N0X2lucztcbiAgICAgICAgcHJlX2RlbCA9IHBvc3RfZGVsO1xuICAgICAgICBsYXN0RXF1YWxpdHkgPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhIGNhbmRpZGF0ZSwgYW5kIGNhbiBuZXZlciBiZWNvbWUgb25lLlxuICAgICAgICBlcXVhbGl0aWVzTGVuZ3RoID0gMDtcbiAgICAgICAgbGFzdEVxdWFsaXR5ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHBvc3RfaW5zID0gcG9zdF9kZWwgPSBmYWxzZTtcbiAgICB9IGVsc2UgeyAgLy8gQW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uLlxuICAgICAgaWYgKGRpZmZzW3BvaW50ZXJdWzBdID09IERJRkZfREVMRVRFKSB7XG4gICAgICAgIHBvc3RfZGVsID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc3RfaW5zID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qXG4gICAgICAgKiBGaXZlIHR5cGVzIHRvIGJlIHNwbGl0OlxuICAgICAgICogPGlucz5BPC9pbnM+PGRlbD5CPC9kZWw+WFk8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD5cbiAgICAgICAqIDxpbnM+QTwvaW5zPlg8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD5cbiAgICAgICAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlg8aW5zPkM8L2lucz5cbiAgICAgICAqIDxpbnM+QTwvZGVsPlg8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD5cbiAgICAgICAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlg8ZGVsPkM8L2RlbD5cbiAgICAgICAqL1xuICAgICAgaWYgKGxhc3RFcXVhbGl0eSAmJiAoKHByZV9pbnMgJiYgcHJlX2RlbCAmJiBwb3N0X2lucyAmJiBwb3N0X2RlbCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGFzdEVxdWFsaXR5Lmxlbmd0aCA8IHRoaXMuRGlmZl9FZGl0Q29zdCAvIDIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZV9pbnMgKyBwcmVfZGVsICsgcG9zdF9pbnMgKyBwb3N0X2RlbCkgPT0gMykpKSB7XG4gICAgICAgIC8vIER1cGxpY2F0ZSByZWNvcmQuXG4gICAgICAgIGRpZmZzLnNwbGljZShlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXSwgMCxcbiAgICAgICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIGxhc3RFcXVhbGl0eSkpO1xuICAgICAgICAvLyBDaGFuZ2Ugc2Vjb25kIGNvcHkgdG8gaW5zZXJ0LlxuICAgICAgICBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXSArIDFdWzBdID0gRElGRl9JTlNFUlQ7XG4gICAgICAgIGVxdWFsaXRpZXNMZW5ndGgtLTsgIC8vIFRocm93IGF3YXkgdGhlIGVxdWFsaXR5IHdlIGp1c3QgZGVsZXRlZDtcbiAgICAgICAgbGFzdEVxdWFsaXR5ID0gbnVsbDtcbiAgICAgICAgaWYgKHByZV9pbnMgJiYgcHJlX2RlbCkge1xuICAgICAgICAgIC8vIE5vIGNoYW5nZXMgbWFkZSB3aGljaCBjb3VsZCBhZmZlY3QgcHJldmlvdXMgZW50cnksIGtlZXAgZ29pbmcuXG4gICAgICAgICAgcG9zdF9pbnMgPSBwb3N0X2RlbCA9IHRydWU7XG4gICAgICAgICAgZXF1YWxpdGllc0xlbmd0aCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXF1YWxpdGllc0xlbmd0aC0tOyAgLy8gVGhyb3cgYXdheSB0aGUgcHJldmlvdXMgZXF1YWxpdHkuXG4gICAgICAgICAgcG9pbnRlciA9IGVxdWFsaXRpZXNMZW5ndGggPiAwID9cbiAgICAgICAgICAgICAgZXF1YWxpdGllc1tlcXVhbGl0aWVzTGVuZ3RoIC0gMV0gOiAtMTtcbiAgICAgICAgICBwb3N0X2lucyA9IHBvc3RfZGVsID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHBvaW50ZXIrKztcbiAgfVxuXG4gIGlmIChjaGFuZ2VzKSB7XG4gICAgdGhpcy5kaWZmX2NsZWFudXBNZXJnZShkaWZmcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBSZW9yZGVyIGFuZCBtZXJnZSBsaWtlIGVkaXQgc2VjdGlvbnMuICBNZXJnZSBlcXVhbGl0aWVzLlxuICogQW55IGVkaXQgc2VjdGlvbiBjYW4gbW92ZSBhcyBsb25nIGFzIGl0IGRvZXNuJ3QgY3Jvc3MgYW4gZXF1YWxpdHkuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBNZXJnZSA9IGZ1bmN0aW9uKGRpZmZzKSB7XG4gIC8vIEFkZCBhIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuXG4gIGRpZmZzLnB1c2gobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCAnJykpO1xuICB2YXIgcG9pbnRlciA9IDA7XG4gIHZhciBjb3VudF9kZWxldGUgPSAwO1xuICB2YXIgY291bnRfaW5zZXJ0ID0gMDtcbiAgdmFyIHRleHRfZGVsZXRlID0gJyc7XG4gIHZhciB0ZXh0X2luc2VydCA9ICcnO1xuICB2YXIgY29tbW9ubGVuZ3RoO1xuICB3aGlsZSAocG9pbnRlciA8IGRpZmZzLmxlbmd0aCkge1xuICAgIHN3aXRjaCAoZGlmZnNbcG9pbnRlcl1bMF0pIHtcbiAgICAgIGNhc2UgRElGRl9JTlNFUlQ6XG4gICAgICAgIGNvdW50X2luc2VydCsrO1xuICAgICAgICB0ZXh0X2luc2VydCArPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9ERUxFVEU6XG4gICAgICAgIGNvdW50X2RlbGV0ZSsrO1xuICAgICAgICB0ZXh0X2RlbGV0ZSArPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9FUVVBTDpcbiAgICAgICAgLy8gVXBvbiByZWFjaGluZyBhbiBlcXVhbGl0eSwgY2hlY2sgZm9yIHByaW9yIHJlZHVuZGFuY2llcy5cbiAgICAgICAgaWYgKGNvdW50X2RlbGV0ZSArIGNvdW50X2luc2VydCA+IDEpIHtcbiAgICAgICAgICBpZiAoY291bnRfZGVsZXRlICE9PSAwICYmIGNvdW50X2luc2VydCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gRmFjdG9yIG91dCBhbnkgY29tbW9uIHByZWZpeGllcy5cbiAgICAgICAgICAgIGNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZl9jb21tb25QcmVmaXgodGV4dF9pbnNlcnQsIHRleHRfZGVsZXRlKTtcbiAgICAgICAgICAgIGlmIChjb21tb25sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgaWYgKChwb2ludGVyIC0gY291bnRfZGVsZXRlIC0gY291bnRfaW5zZXJ0KSA+IDAgJiZcbiAgICAgICAgICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSBjb3VudF9kZWxldGUgLSBjb3VudF9pbnNlcnQgLSAxXVswXSA9PVxuICAgICAgICAgICAgICAgICAgRElGRl9FUVVBTCkge1xuICAgICAgICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSBjb3VudF9kZWxldGUgLSBjb3VudF9pbnNlcnQgLSAxXVsxXSArPVxuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luc2VydC5zdWJzdHJpbmcoMCwgY29tbW9ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaWZmcy5zcGxpY2UoMCwgMCwgbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luc2VydC5zdWJzdHJpbmcoMCwgY29tbW9ubGVuZ3RoKSkpO1xuICAgICAgICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0ZXh0X2luc2VydCA9IHRleHRfaW5zZXJ0LnN1YnN0cmluZyhjb21tb25sZW5ndGgpO1xuICAgICAgICAgICAgICB0ZXh0X2RlbGV0ZSA9IHRleHRfZGVsZXRlLnN1YnN0cmluZyhjb21tb25sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmFjdG9yIG91dCBhbnkgY29tbW9uIHN1ZmZpeGllcy5cbiAgICAgICAgICAgIGNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZl9jb21tb25TdWZmaXgodGV4dF9pbnNlcnQsIHRleHRfZGVsZXRlKTtcbiAgICAgICAgICAgIGlmIChjb21tb25sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgZGlmZnNbcG9pbnRlcl1bMV0gPSB0ZXh0X2luc2VydC5zdWJzdHJpbmcodGV4dF9pbnNlcnQubGVuZ3RoIC1cbiAgICAgICAgICAgICAgICAgIGNvbW1vbmxlbmd0aCkgKyBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgICAgICAgICAgdGV4dF9pbnNlcnQgPSB0ZXh0X2luc2VydC5zdWJzdHJpbmcoMCwgdGV4dF9pbnNlcnQubGVuZ3RoIC1cbiAgICAgICAgICAgICAgICAgIGNvbW1vbmxlbmd0aCk7XG4gICAgICAgICAgICAgIHRleHRfZGVsZXRlID0gdGV4dF9kZWxldGUuc3Vic3RyaW5nKDAsIHRleHRfZGVsZXRlLmxlbmd0aCAtXG4gICAgICAgICAgICAgICAgICBjb21tb25sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIG9mZmVuZGluZyByZWNvcmRzIGFuZCBhZGQgdGhlIG1lcmdlZCBvbmVzLlxuICAgICAgICAgIHBvaW50ZXIgLT0gY291bnRfZGVsZXRlICsgY291bnRfaW5zZXJ0O1xuICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCBjb3VudF9kZWxldGUgKyBjb3VudF9pbnNlcnQpO1xuICAgICAgICAgIGlmICh0ZXh0X2RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCAwLFxuICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIHRleHRfZGVsZXRlKSk7XG4gICAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ZXh0X2luc2VydC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCAwLFxuICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9JTlNFUlQsIHRleHRfaW5zZXJ0KSk7XG4gICAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludGVyICE9PSAwICYmIGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9PSBESUZGX0VRVUFMKSB7XG4gICAgICAgICAgLy8gTWVyZ2UgdGhpcyBlcXVhbGl0eSB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgICAgZGlmZnNbcG9pbnRlciAtIDFdWzFdICs9IGRpZmZzW3BvaW50ZXJdWzFdO1xuICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgIH1cbiAgICAgICAgY291bnRfaW5zZXJ0ID0gMDtcbiAgICAgICAgY291bnRfZGVsZXRlID0gMDtcbiAgICAgICAgdGV4dF9kZWxldGUgPSAnJztcbiAgICAgICAgdGV4dF9pbnNlcnQgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChkaWZmc1tkaWZmcy5sZW5ndGggLSAxXVsxXSA9PT0gJycpIHtcbiAgICBkaWZmcy5wb3AoKTsgIC8vIFJlbW92ZSB0aGUgZHVtbXkgZW50cnkgYXQgdGhlIGVuZC5cbiAgfVxuXG4gIC8vIFNlY29uZCBwYXNzOiBsb29rIGZvciBzaW5nbGUgZWRpdHMgc3Vycm91bmRlZCBvbiBib3RoIHNpZGVzIGJ5IGVxdWFsaXRpZXNcbiAgLy8gd2hpY2ggY2FuIGJlIHNoaWZ0ZWQgc2lkZXdheXMgdG8gZWxpbWluYXRlIGFuIGVxdWFsaXR5LlxuICAvLyBlLmc6IEE8aW5zPkJBPC9pbnM+QyAtPiA8aW5zPkFCPC9pbnM+QUNcbiAgdmFyIGNoYW5nZXMgPSBmYWxzZTtcbiAgcG9pbnRlciA9IDE7XG4gIC8vIEludGVudGlvbmFsbHkgaWdub3JlIHRoZSBmaXJzdCBhbmQgbGFzdCBlbGVtZW50IChkb24ndCBuZWVkIGNoZWNraW5nKS5cbiAgd2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggLSAxKSB7XG4gICAgaWYgKGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9PSBESUZGX0VRVUFMICYmXG4gICAgICAgIGRpZmZzW3BvaW50ZXIgKyAxXVswXSA9PSBESUZGX0VRVUFMKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc2luZ2xlIGVkaXQgc3Vycm91bmRlZCBieSBlcXVhbGl0aWVzLlxuICAgICAgaWYgKGRpZmZzW3BvaW50ZXJdWzFdLnN1YnN0cmluZyhkaWZmc1twb2ludGVyXVsxXS5sZW5ndGggLVxuICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSAxXVsxXS5sZW5ndGgpID09IGRpZmZzW3BvaW50ZXIgLSAxXVsxXSkge1xuICAgICAgICAvLyBTaGlmdCB0aGUgZWRpdCBvdmVyIHRoZSBwcmV2aW91cyBlcXVhbGl0eS5cbiAgICAgICAgZGlmZnNbcG9pbnRlcl1bMV0gPSBkaWZmc1twb2ludGVyIC0gMV1bMV0gK1xuICAgICAgICAgICAgZGlmZnNbcG9pbnRlcl1bMV0uc3Vic3RyaW5nKDAsIGRpZmZzW3BvaW50ZXJdWzFdLmxlbmd0aCAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZnNbcG9pbnRlciAtIDFdWzFdLmxlbmd0aCk7XG4gICAgICAgIGRpZmZzW3BvaW50ZXIgKyAxXVsxXSA9IGRpZmZzW3BvaW50ZXIgLSAxXVsxXSArIGRpZmZzW3BvaW50ZXIgKyAxXVsxXTtcbiAgICAgICAgZGlmZnMuc3BsaWNlKHBvaW50ZXIgLSAxLCAxKTtcbiAgICAgICAgY2hhbmdlcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGRpZmZzW3BvaW50ZXJdWzFdLnN1YnN0cmluZygwLCBkaWZmc1twb2ludGVyICsgMV1bMV0ubGVuZ3RoKSA9PVxuICAgICAgICAgIGRpZmZzW3BvaW50ZXIgKyAxXVsxXSkge1xuICAgICAgICAvLyBTaGlmdCB0aGUgZWRpdCBvdmVyIHRoZSBuZXh0IGVxdWFsaXR5LlxuICAgICAgICBkaWZmc1twb2ludGVyIC0gMV1bMV0gKz0gZGlmZnNbcG9pbnRlciArIDFdWzFdO1xuICAgICAgICBkaWZmc1twb2ludGVyXVsxXSA9XG4gICAgICAgICAgICBkaWZmc1twb2ludGVyXVsxXS5zdWJzdHJpbmcoZGlmZnNbcG9pbnRlciArIDFdWzFdLmxlbmd0aCkgK1xuICAgICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzFdO1xuICAgICAgICBkaWZmcy5zcGxpY2UocG9pbnRlciArIDEsIDEpO1xuICAgICAgICBjaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcG9pbnRlcisrO1xuICB9XG4gIC8vIElmIHNoaWZ0cyB3ZXJlIG1hZGUsIHRoZSBkaWZmIG5lZWRzIHJlb3JkZXJpbmcgYW5kIGFub3RoZXIgc2hpZnQgc3dlZXAuXG4gIGlmIChjaGFuZ2VzKSB7XG4gICAgdGhpcy5kaWZmX2NsZWFudXBNZXJnZShkaWZmcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBsb2MgaXMgYSBsb2NhdGlvbiBpbiB0ZXh0MSwgY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBlcXVpdmFsZW50IGxvY2F0aW9uIGluXG4gKiB0ZXh0Mi5cbiAqIGUuZy4gJ1RoZSBjYXQnIHZzICdUaGUgYmlnIGNhdCcsIDEtPjEsIDUtPjhcbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gbG9jIExvY2F0aW9uIHdpdGhpbiB0ZXh0MS5cbiAqIEByZXR1cm4ge251bWJlcn0gTG9jYXRpb24gd2l0aGluIHRleHQyLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX3hJbmRleCA9IGZ1bmN0aW9uKGRpZmZzLCBsb2MpIHtcbiAgdmFyIGNoYXJzMSA9IDA7XG4gIHZhciBjaGFyczIgPSAwO1xuICB2YXIgbGFzdF9jaGFyczEgPSAwO1xuICB2YXIgbGFzdF9jaGFyczIgPSAwO1xuICB2YXIgeDtcbiAgZm9yICh4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgaWYgKGRpZmZzW3hdWzBdICE9PSBESUZGX0lOU0VSVCkgeyAgLy8gRXF1YWxpdHkgb3IgZGVsZXRpb24uXG4gICAgICBjaGFyczEgKz0gZGlmZnNbeF1bMV0ubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAoZGlmZnNbeF1bMF0gIT09IERJRkZfREVMRVRFKSB7ICAvLyBFcXVhbGl0eSBvciBpbnNlcnRpb24uXG4gICAgICBjaGFyczIgKz0gZGlmZnNbeF1bMV0ubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAoY2hhcnMxID4gbG9jKSB7ICAvLyBPdmVyc2hvdCB0aGUgbG9jYXRpb24uXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbGFzdF9jaGFyczEgPSBjaGFyczE7XG4gICAgbGFzdF9jaGFyczIgPSBjaGFyczI7XG4gIH1cbiAgLy8gV2FzIHRoZSBsb2NhdGlvbiB3YXMgZGVsZXRlZD9cbiAgaWYgKGRpZmZzLmxlbmd0aCAhPSB4ICYmIGRpZmZzW3hdWzBdID09PSBESUZGX0RFTEVURSkge1xuICAgIHJldHVybiBsYXN0X2NoYXJzMjtcbiAgfVxuICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXIgbGVuZ3RoLlxuICByZXR1cm4gbGFzdF9jaGFyczIgKyAobG9jIC0gbGFzdF9jaGFyczEpO1xufTtcblxuXG4vKipcbiAqIENvbnZlcnQgYSBkaWZmIGFycmF5IGludG8gYSBwcmV0dHkgSFRNTCByZXBvcnQuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHJlcHJlc2VudGF0aW9uLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX3ByZXR0eUh0bWwgPSBmdW5jdGlvbihkaWZmcykge1xuICB2YXIgaHRtbCA9IFtdO1xuICB2YXIgcGF0dGVybl9hbXAgPSAvJi9nO1xuICB2YXIgcGF0dGVybl9sdCA9IC88L2c7XG4gIHZhciBwYXR0ZXJuX2d0ID0gLz4vZztcbiAgdmFyIHBhdHRlcm5fcGFyYSA9IC9cXG4vZztcbiAgZm9yICh2YXIgeCA9IDA7IHggPCBkaWZmcy5sZW5ndGg7IHgrKykge1xuICAgIHZhciBvcCA9IGRpZmZzW3hdWzBdOyAgICAvLyBPcGVyYXRpb24gKGluc2VydCwgZGVsZXRlLCBlcXVhbClcbiAgICB2YXIgZGF0YSA9IGRpZmZzW3hdWzFdOyAgLy8gVGV4dCBvZiBjaGFuZ2UuXG4gICAgdmFyIHRleHQgPSBkYXRhLnJlcGxhY2UocGF0dGVybl9hbXAsICcmYW1wOycpLnJlcGxhY2UocGF0dGVybl9sdCwgJyZsdDsnKVxuICAgICAgICAucmVwbGFjZShwYXR0ZXJuX2d0LCAnJmd0OycpLnJlcGxhY2UocGF0dGVybl9wYXJhLCAnJnBhcmE7PGJyPicpO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgRElGRl9JTlNFUlQ6XG4gICAgICAgIGh0bWxbeF0gPSAnPGlucyBzdHlsZT1cImJhY2tncm91bmQ6I2U2ZmZlNjtcIj4nICsgdGV4dCArICc8L2lucz4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9ERUxFVEU6XG4gICAgICAgIGh0bWxbeF0gPSAnPGRlbCBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZTZlNjtcIj4nICsgdGV4dCArICc8L2RlbD4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9FUVVBTDpcbiAgICAgICAgaHRtbFt4XSA9ICc8c3Bhbj4nICsgdGV4dCArICc8L3NwYW4+JztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBodG1sLmpvaW4oJycpO1xufTtcblxuXG4vKipcbiAqIENvbXB1dGUgYW5kIHJldHVybiB0aGUgc291cmNlIHRleHQgKGFsbCBlcXVhbGl0aWVzIGFuZCBkZWxldGlvbnMpLlxuICogQHBhcmFtIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiAqIEByZXR1cm4ge3N0cmluZ30gU291cmNlIHRleHQuXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfdGV4dDEgPSBmdW5jdGlvbihkaWZmcykge1xuICB2YXIgdGV4dCA9IFtdO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgaWYgKGRpZmZzW3hdWzBdICE9PSBESUZGX0lOU0VSVCkge1xuICAgICAgdGV4dFt4XSA9IGRpZmZzW3hdWzFdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGV4dC5qb2luKCcnKTtcbn07XG5cblxuLyoqXG4gKiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGRlc3RpbmF0aW9uIHRleHQgKGFsbCBlcXVhbGl0aWVzIGFuZCBpbnNlcnRpb25zKS5cbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IERlc3RpbmF0aW9uIHRleHQuXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfdGV4dDIgPSBmdW5jdGlvbihkaWZmcykge1xuICB2YXIgdGV4dCA9IFtdO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgaWYgKGRpZmZzW3hdWzBdICE9PSBESUZGX0RFTEVURSkge1xuICAgICAgdGV4dFt4XSA9IGRpZmZzW3hdWzFdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGV4dC5qb2luKCcnKTtcbn07XG5cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBMZXZlbnNodGVpbiBkaXN0YW5jZTsgdGhlIG51bWJlciBvZiBpbnNlcnRlZCwgZGVsZXRlZCBvclxuICogc3Vic3RpdHV0ZWQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE51bWJlciBvZiBjaGFuZ2VzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2xldmVuc2h0ZWluID0gZnVuY3Rpb24oZGlmZnMpIHtcbiAgdmFyIGxldmVuc2h0ZWluID0gMDtcbiAgdmFyIGluc2VydGlvbnMgPSAwO1xuICB2YXIgZGVsZXRpb25zID0gMDtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCBkaWZmcy5sZW5ndGg7IHgrKykge1xuICAgIHZhciBvcCA9IGRpZmZzW3hdWzBdO1xuICAgIHZhciBkYXRhID0gZGlmZnNbeF1bMV07XG4gICAgc3dpdGNoIChvcCkge1xuICAgICAgY2FzZSBESUZGX0lOU0VSVDpcbiAgICAgICAgaW5zZXJ0aW9ucyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfREVMRVRFOlxuICAgICAgICBkZWxldGlvbnMgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUZGX0VRVUFMOlxuICAgICAgICAvLyBBIGRlbGV0aW9uIGFuZCBhbiBpbnNlcnRpb24gaXMgb25lIHN1YnN0aXR1dGlvbi5cbiAgICAgICAgbGV2ZW5zaHRlaW4gKz0gTWF0aC5tYXgoaW5zZXJ0aW9ucywgZGVsZXRpb25zKTtcbiAgICAgICAgaW5zZXJ0aW9ucyA9IDA7XG4gICAgICAgIGRlbGV0aW9ucyA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBsZXZlbnNodGVpbiArPSBNYXRoLm1heChpbnNlcnRpb25zLCBkZWxldGlvbnMpO1xuICByZXR1cm4gbGV2ZW5zaHRlaW47XG59O1xuXG5cbi8qKlxuICogQ3J1c2ggdGhlIGRpZmYgaW50byBhbiBlbmNvZGVkIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIG9wZXJhdGlvbnNcbiAqIHJlcXVpcmVkIHRvIHRyYW5zZm9ybSB0ZXh0MSBpbnRvIHRleHQyLlxuICogRS5nLiA9M1xcdC0yXFx0K2luZyAgLT4gS2VlcCAzIGNoYXJzLCBkZWxldGUgMiBjaGFycywgaW5zZXJ0ICdpbmcnLlxuICogT3BlcmF0aW9ucyBhcmUgdGFiLXNlcGFyYXRlZC4gIEluc2VydGVkIHRleHQgaXMgZXNjYXBlZCB1c2luZyAleHggbm90YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHJldHVybiB7c3RyaW5nfSBEZWx0YSB0ZXh0LlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX3RvRGVsdGEgPSBmdW5jdGlvbihkaWZmcykge1xuICB2YXIgdGV4dCA9IFtdO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgc3dpdGNoIChkaWZmc1t4XVswXSkge1xuICAgICAgY2FzZSBESUZGX0lOU0VSVDpcbiAgICAgICAgdGV4dFt4XSA9ICcrJyArIGVuY29kZVVSSShkaWZmc1t4XVsxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUZGX0RFTEVURTpcbiAgICAgICAgdGV4dFt4XSA9ICctJyArIGRpZmZzW3hdWzFdLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfRVFVQUw6XG4gICAgICAgIHRleHRbeF0gPSAnPScgKyBkaWZmc1t4XVsxXS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGV4dC5qb2luKCdcXHQnKS5yZXBsYWNlKC8lMjAvZywgJyAnKTtcbn07XG5cblxuLyoqXG4gKiBHaXZlbiB0aGUgb3JpZ2luYWwgdGV4dDEsIGFuZCBhbiBlbmNvZGVkIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlXG4gKiBvcGVyYXRpb25zIHJlcXVpcmVkIHRvIHRyYW5zZm9ybSB0ZXh0MSBpbnRvIHRleHQyLCBjb21wdXRlIHRoZSBmdWxsIGRpZmYuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgU291cmNlIHN0cmluZyBmb3IgdGhlIGRpZmYuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVsdGEgRGVsdGEgdGV4dC5cbiAqIEByZXR1cm4geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHRocm93cyB7IUVycm9yfSBJZiBpbnZhbGlkIGlucHV0LlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2Zyb21EZWx0YSA9IGZ1bmN0aW9uKHRleHQxLCBkZWx0YSkge1xuICB2YXIgZGlmZnMgPSBbXTtcbiAgdmFyIGRpZmZzTGVuZ3RoID0gMDsgIC8vIEtlZXBpbmcgb3VyIG93biBsZW5ndGggdmFyIGlzIGZhc3RlciBpbiBKUy5cbiAgdmFyIHBvaW50ZXIgPSAwOyAgLy8gQ3Vyc29yIGluIHRleHQxXG4gIHZhciB0b2tlbnMgPSBkZWx0YS5zcGxpdCgvXFx0L2cpO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykge1xuICAgIC8vIEVhY2ggdG9rZW4gYmVnaW5zIHdpdGggYSBvbmUgY2hhcmFjdGVyIHBhcmFtZXRlciB3aGljaCBzcGVjaWZpZXMgdGhlXG4gICAgLy8gb3BlcmF0aW9uIG9mIHRoaXMgdG9rZW4gKGRlbGV0ZSwgaW5zZXJ0LCBlcXVhbGl0eSkuXG4gICAgdmFyIHBhcmFtID0gdG9rZW5zW3hdLnN1YnN0cmluZygxKTtcbiAgICBzd2l0Y2ggKHRva2Vuc1t4XS5jaGFyQXQoMCkpIHtcbiAgICAgIGNhc2UgJysnOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGRpZmZzW2RpZmZzTGVuZ3RoKytdID1cbiAgICAgICAgICAgICAgbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0lOU0VSVCwgZGVjb2RlVVJJKHBhcmFtKSk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgLy8gTWFsZm9ybWVkIFVSSSBzZXF1ZW5jZS5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgZXNjYXBlIGluIGRpZmZfZnJvbURlbHRhOiAnICsgcGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLSc6XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJz0nOlxuICAgICAgICB2YXIgbiA9IHBhcnNlSW50KHBhcmFtLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihuKSB8fCBuIDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBudW1iZXIgaW4gZGlmZl9mcm9tRGVsdGE6ICcgKyBwYXJhbSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRleHQgPSB0ZXh0MS5zdWJzdHJpbmcocG9pbnRlciwgcG9pbnRlciArPSBuKTtcbiAgICAgICAgaWYgKHRva2Vuc1t4XS5jaGFyQXQoMCkgPT0gJz0nKSB7XG4gICAgICAgICAgZGlmZnNbZGlmZnNMZW5ndGgrK10gPSBuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIHRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpZmZzW2RpZmZzTGVuZ3RoKytdID0gbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0RFTEVURSwgdGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBCbGFuayB0b2tlbnMgYXJlIG9rIChmcm9tIGEgdHJhaWxpbmcgXFx0KS5cbiAgICAgICAgLy8gQW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvci5cbiAgICAgICAgaWYgKHRva2Vuc1t4XSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkaWZmIG9wZXJhdGlvbiBpbiBkaWZmX2Zyb21EZWx0YTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vuc1t4XSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHBvaW50ZXIgIT0gdGV4dDEubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEZWx0YSBsZW5ndGggKCcgKyBwb2ludGVyICtcbiAgICAgICAgJykgZG9lcyBub3QgZXF1YWwgc291cmNlIHRleHQgbGVuZ3RoICgnICsgdGV4dDEubGVuZ3RoICsgJykuJyk7XG4gIH1cbiAgcmV0dXJuIGRpZmZzO1xufTtcblxuXG4vLyAgTUFUQ0ggRlVOQ1RJT05TXG5cblxuLyoqXG4gKiBMb2NhdGUgdGhlIGJlc3QgaW5zdGFuY2Ugb2YgJ3BhdHRlcm4nIGluICd0ZXh0JyBuZWFyICdsb2MnLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHRleHQgdG8gc2VhcmNoLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsb2MgVGhlIGxvY2F0aW9uIHRvIHNlYXJjaCBhcm91bmQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEJlc3QgbWF0Y2ggaW5kZXggb3IgLTEuXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLm1hdGNoX21haW4gPSBmdW5jdGlvbih0ZXh0LCBwYXR0ZXJuLCBsb2MpIHtcbiAgLy8gQ2hlY2sgZm9yIG51bGwgaW5wdXRzLlxuICBpZiAodGV4dCA9PSBudWxsIHx8IHBhdHRlcm4gPT0gbnVsbCB8fCBsb2MgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTnVsbCBpbnB1dC4gKG1hdGNoX21haW4pJyk7XG4gIH1cblxuICBsb2MgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsb2MsIHRleHQubGVuZ3RoKSk7XG4gIGlmICh0ZXh0ID09IHBhdHRlcm4pIHtcbiAgICAvLyBTaG9ydGN1dCAocG90ZW50aWFsbHkgbm90IGd1YXJhbnRlZWQgYnkgdGhlIGFsZ29yaXRobSlcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIGlmICghdGV4dC5sZW5ndGgpIHtcbiAgICAvLyBOb3RoaW5nIHRvIG1hdGNoLlxuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmICh0ZXh0LnN1YnN0cmluZyhsb2MsIGxvYyArIHBhdHRlcm4ubGVuZ3RoKSA9PSBwYXR0ZXJuKSB7XG4gICAgLy8gUGVyZmVjdCBtYXRjaCBhdCB0aGUgcGVyZmVjdCBzcG90ISAgKEluY2x1ZGVzIGNhc2Ugb2YgbnVsbCBwYXR0ZXJuKVxuICAgIHJldHVybiBsb2M7XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gYSBmdXp6eSBjb21wYXJlLlxuICAgIHJldHVybiB0aGlzLm1hdGNoX2JpdGFwXyh0ZXh0LCBwYXR0ZXJuLCBsb2MpO1xuICB9XG59O1xuXG5cbi8qKlxuICogTG9jYXRlIHRoZSBiZXN0IGluc3RhbmNlIG9mICdwYXR0ZXJuJyBpbiAndGV4dCcgbmVhciAnbG9jJyB1c2luZyB0aGVcbiAqIEJpdGFwIGFsZ29yaXRobS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gbG9jIFRoZSBsb2NhdGlvbiB0byBzZWFyY2ggYXJvdW5kLlxuICogQHJldHVybiB7bnVtYmVyfSBCZXN0IG1hdGNoIGluZGV4IG9yIC0xLlxuICogQHByaXZhdGVcbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUubWF0Y2hfYml0YXBfID0gZnVuY3Rpb24odGV4dCwgcGF0dGVybiwgbG9jKSB7XG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA+IHRoaXMuTWF0Y2hfTWF4Qml0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignUGF0dGVybiB0b28gbG9uZyBmb3IgdGhpcyBicm93c2VyLicpO1xuICB9XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgYWxwaGFiZXQuXG4gIHZhciBzID0gdGhpcy5tYXRjaF9hbHBoYWJldF8ocGF0dGVybik7XG5cbiAgdmFyIGRtcCA9IHRoaXM7ICAvLyAndGhpcycgYmVjb21lcyAnd2luZG93JyBpbiBhIGNsb3N1cmUuXG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYW5kIHJldHVybiB0aGUgc2NvcmUgZm9yIGEgbWF0Y2ggd2l0aCBlIGVycm9ycyBhbmQgeCBsb2NhdGlvbi5cbiAgICogQWNjZXNzZXMgbG9jIGFuZCBwYXR0ZXJuIHRocm91Z2ggYmVpbmcgYSBjbG9zdXJlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZSBOdW1iZXIgb2YgZXJyb3JzIGluIG1hdGNoLlxuICAgKiBAcGFyYW0ge251bWJlcn0geCBMb2NhdGlvbiBvZiBtYXRjaC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBPdmVyYWxsIHNjb3JlIGZvciBtYXRjaCAoMC4wID0gZ29vZCwgMS4wID0gYmFkKS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoX2JpdGFwU2NvcmVfKGUsIHgpIHtcbiAgICB2YXIgYWNjdXJhY3kgPSBlIC8gcGF0dGVybi5sZW5ndGg7XG4gICAgdmFyIHByb3hpbWl0eSA9IE1hdGguYWJzKGxvYyAtIHgpO1xuICAgIGlmICghZG1wLk1hdGNoX0Rpc3RhbmNlKSB7XG4gICAgICAvLyBEb2RnZSBkaXZpZGUgYnkgemVybyBlcnJvci5cbiAgICAgIHJldHVybiBwcm94aW1pdHkgPyAxLjAgOiBhY2N1cmFjeTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VyYWN5ICsgKHByb3hpbWl0eSAvIGRtcC5NYXRjaF9EaXN0YW5jZSk7XG4gIH1cblxuICAvLyBIaWdoZXN0IHNjb3JlIGJleW9uZCB3aGljaCB3ZSBnaXZlIHVwLlxuICB2YXIgc2NvcmVfdGhyZXNob2xkID0gdGhpcy5NYXRjaF9UaHJlc2hvbGQ7XG4gIC8vIElzIHRoZXJlIGEgbmVhcmJ5IGV4YWN0IG1hdGNoPyAoc3BlZWR1cClcbiAgdmFyIGJlc3RfbG9jID0gdGV4dC5pbmRleE9mKHBhdHRlcm4sIGxvYyk7XG4gIGlmIChiZXN0X2xvYyAhPSAtMSkge1xuICAgIHNjb3JlX3RocmVzaG9sZCA9IE1hdGgubWluKG1hdGNoX2JpdGFwU2NvcmVfKDAsIGJlc3RfbG9jKSwgc2NvcmVfdGhyZXNob2xkKTtcbiAgICAvLyBXaGF0IGFib3V0IGluIHRoZSBvdGhlciBkaXJlY3Rpb24/IChzcGVlZHVwKVxuICAgIGJlc3RfbG9jID0gdGV4dC5sYXN0SW5kZXhPZihwYXR0ZXJuLCBsb2MgKyBwYXR0ZXJuLmxlbmd0aCk7XG4gICAgaWYgKGJlc3RfbG9jICE9IC0xKSB7XG4gICAgICBzY29yZV90aHJlc2hvbGQgPVxuICAgICAgICAgIE1hdGgubWluKG1hdGNoX2JpdGFwU2NvcmVfKDAsIGJlc3RfbG9jKSwgc2NvcmVfdGhyZXNob2xkKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbml0aWFsaXNlIHRoZSBiaXQgYXJyYXlzLlxuICB2YXIgbWF0Y2htYXNrID0gMSA8PCAocGF0dGVybi5sZW5ndGggLSAxKTtcbiAgYmVzdF9sb2MgPSAtMTtcblxuICB2YXIgYmluX21pbiwgYmluX21pZDtcbiAgdmFyIGJpbl9tYXggPSBwYXR0ZXJuLmxlbmd0aCArIHRleHQubGVuZ3RoO1xuICB2YXIgbGFzdF9yZDtcbiAgZm9yICh2YXIgZCA9IDA7IGQgPCBwYXR0ZXJuLmxlbmd0aDsgZCsrKSB7XG4gICAgLy8gU2NhbiBmb3IgdGhlIGJlc3QgbWF0Y2g7IGVhY2ggaXRlcmF0aW9uIGFsbG93cyBmb3Igb25lIG1vcmUgZXJyb3IuXG4gICAgLy8gUnVuIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgaG93IGZhciBmcm9tICdsb2MnIHdlIGNhbiBzdHJheSBhdCB0aGlzXG4gICAgLy8gZXJyb3IgbGV2ZWwuXG4gICAgYmluX21pbiA9IDA7XG4gICAgYmluX21pZCA9IGJpbl9tYXg7XG4gICAgd2hpbGUgKGJpbl9taW4gPCBiaW5fbWlkKSB7XG4gICAgICBpZiAobWF0Y2hfYml0YXBTY29yZV8oZCwgbG9jICsgYmluX21pZCkgPD0gc2NvcmVfdGhyZXNob2xkKSB7XG4gICAgICAgIGJpbl9taW4gPSBiaW5fbWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmluX21heCA9IGJpbl9taWQ7XG4gICAgICB9XG4gICAgICBiaW5fbWlkID0gTWF0aC5mbG9vcigoYmluX21heCAtIGJpbl9taW4pIC8gMiArIGJpbl9taW4pO1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHJlc3VsdCBmcm9tIHRoaXMgaXRlcmF0aW9uIGFzIHRoZSBtYXhpbXVtIGZvciB0aGUgbmV4dC5cbiAgICBiaW5fbWF4ID0gYmluX21pZDtcbiAgICB2YXIgc3RhcnQgPSBNYXRoLm1heCgxLCBsb2MgLSBiaW5fbWlkICsgMSk7XG4gICAgdmFyIGZpbmlzaCA9IE1hdGgubWluKGxvYyArIGJpbl9taWQsIHRleHQubGVuZ3RoKSArIHBhdHRlcm4ubGVuZ3RoO1xuXG4gICAgdmFyIHJkID0gQXJyYXkoZmluaXNoICsgMik7XG4gICAgcmRbZmluaXNoICsgMV0gPSAoMSA8PCBkKSAtIDE7XG4gICAgZm9yICh2YXIgaiA9IGZpbmlzaDsgaiA+PSBzdGFydDsgai0tKSB7XG4gICAgICAvLyBUaGUgYWxwaGFiZXQgKHMpIGlzIGEgc3BhcnNlIGhhc2gsIHNvIHRoZSBmb2xsb3dpbmcgbGluZSBnZW5lcmF0ZXNcbiAgICAgIC8vIHdhcm5pbmdzLlxuICAgICAgdmFyIGNoYXJNYXRjaCA9IHNbdGV4dC5jaGFyQXQoaiAtIDEpXTtcbiAgICAgIGlmIChkID09PSAwKSB7ICAvLyBGaXJzdCBwYXNzOiBleGFjdCBtYXRjaC5cbiAgICAgICAgcmRbal0gPSAoKHJkW2ogKyAxXSA8PCAxKSB8IDEpICYgY2hhck1hdGNoO1xuICAgICAgfSBlbHNlIHsgIC8vIFN1YnNlcXVlbnQgcGFzc2VzOiBmdXp6eSBtYXRjaC5cbiAgICAgICAgcmRbal0gPSAoKChyZFtqICsgMV0gPDwgMSkgfCAxKSAmIGNoYXJNYXRjaCkgfFxuICAgICAgICAgICAgICAgICgoKGxhc3RfcmRbaiArIDFdIHwgbGFzdF9yZFtqXSkgPDwgMSkgfCAxKSB8XG4gICAgICAgICAgICAgICAgbGFzdF9yZFtqICsgMV07XG4gICAgICB9XG4gICAgICBpZiAocmRbal0gJiBtYXRjaG1hc2spIHtcbiAgICAgICAgdmFyIHNjb3JlID0gbWF0Y2hfYml0YXBTY29yZV8oZCwgaiAtIDEpO1xuICAgICAgICAvLyBUaGlzIG1hdGNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBiZXR0ZXIgdGhhbiBhbnkgZXhpc3RpbmcgbWF0Y2guXG4gICAgICAgIC8vIEJ1dCBjaGVjayBhbnl3YXkuXG4gICAgICAgIGlmIChzY29yZSA8PSBzY29yZV90aHJlc2hvbGQpIHtcbiAgICAgICAgICAvLyBUb2xkIHlvdSBzby5cbiAgICAgICAgICBzY29yZV90aHJlc2hvbGQgPSBzY29yZTtcbiAgICAgICAgICBiZXN0X2xvYyA9IGogLSAxO1xuICAgICAgICAgIGlmIChiZXN0X2xvYyA+IGxvYykge1xuICAgICAgICAgICAgLy8gV2hlbiBwYXNzaW5nIGxvYywgZG9uJ3QgZXhjZWVkIG91ciBjdXJyZW50IGRpc3RhbmNlIGZyb20gbG9jLlxuICAgICAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgxLCAyICogbG9jIC0gYmVzdF9sb2MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IHBhc3NlZCBsb2MsIGRvd25oaWxsIGZyb20gaGVyZSBvbiBpbi5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBObyBob3BlIGZvciBhIChiZXR0ZXIpIG1hdGNoIGF0IGdyZWF0ZXIgZXJyb3IgbGV2ZWxzLlxuICAgIGlmIChtYXRjaF9iaXRhcFNjb3JlXyhkICsgMSwgbG9jKSA+IHNjb3JlX3RocmVzaG9sZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxhc3RfcmQgPSByZDtcbiAgfVxuICByZXR1cm4gYmVzdF9sb2M7XG59O1xuXG5cbi8qKlxuICogSW5pdGlhbGlzZSB0aGUgYWxwaGFiZXQgZm9yIHRoZSBCaXRhcCBhbGdvcml0aG0uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiBUaGUgdGV4dCB0byBlbmNvZGUuXG4gKiBAcmV0dXJuIHshT2JqZWN0fSBIYXNoIG9mIGNoYXJhY3RlciBsb2NhdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5tYXRjaF9hbHBoYWJldF8gPSBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gIHZhciBzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGg7IGkrKykge1xuICAgIHNbcGF0dGVybi5jaGFyQXQoaSldID0gMDtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcbiAgICBzW3BhdHRlcm4uY2hhckF0KGkpXSB8PSAxIDw8IChwYXR0ZXJuLmxlbmd0aCAtIGkgLSAxKTtcbiAgfVxuICByZXR1cm4gcztcbn07XG5cblxuLy8gIFBBVENIIEZVTkNUSU9OU1xuXG5cbi8qKlxuICogSW5jcmVhc2UgdGhlIGNvbnRleHQgdW50aWwgaXQgaXMgdW5pcXVlLFxuICogYnV0IGRvbid0IGxldCB0aGUgcGF0dGVybiBleHBhbmQgYmV5b25kIE1hdGNoX01heEJpdHMuXG4gKiBAcGFyYW0geyFkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29ian0gcGF0Y2ggVGhlIHBhdGNoIHRvIGdyb3cuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBTb3VyY2UgdGV4dC5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLnBhdGNoX2FkZENvbnRleHRfID0gZnVuY3Rpb24ocGF0Y2gsIHRleHQpIHtcbiAgaWYgKHRleHQubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHBhdGNoLnN0YXJ0MiA9PT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKCdwYXRjaCBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IHRleHQuc3Vic3RyaW5nKHBhdGNoLnN0YXJ0MiwgcGF0Y2guc3RhcnQyICsgcGF0Y2gubGVuZ3RoMSk7XG4gIHZhciBwYWRkaW5nID0gMDtcblxuICAvLyBMb29rIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgbWF0Y2hlcyBvZiBwYXR0ZXJuIGluIHRleHQuICBJZiB0d28gZGlmZmVyZW50XG4gIC8vIG1hdGNoZXMgYXJlIGZvdW5kLCBpbmNyZWFzZSB0aGUgcGF0dGVybiBsZW5ndGguXG4gIHdoaWxlICh0ZXh0LmluZGV4T2YocGF0dGVybikgIT0gdGV4dC5sYXN0SW5kZXhPZihwYXR0ZXJuKSAmJlxuICAgICAgICAgcGF0dGVybi5sZW5ndGggPCB0aGlzLk1hdGNoX01heEJpdHMgLSB0aGlzLlBhdGNoX01hcmdpbiAtXG4gICAgICAgICB0aGlzLlBhdGNoX01hcmdpbikge1xuICAgIHBhZGRpbmcgKz0gdGhpcy5QYXRjaF9NYXJnaW47XG4gICAgcGF0dGVybiA9IHRleHQuc3Vic3RyaW5nKHBhdGNoLnN0YXJ0MiAtIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLnN0YXJ0MiArIHBhdGNoLmxlbmd0aDEgKyBwYWRkaW5nKTtcbiAgfVxuICAvLyBBZGQgb25lIGNodW5rIGZvciBnb29kIGx1Y2suXG4gIHBhZGRpbmcgKz0gdGhpcy5QYXRjaF9NYXJnaW47XG5cbiAgLy8gQWRkIHRoZSBwcmVmaXguXG4gIHZhciBwcmVmaXggPSB0ZXh0LnN1YnN0cmluZyhwYXRjaC5zdGFydDIgLSBwYWRkaW5nLCBwYXRjaC5zdGFydDIpO1xuICBpZiAocHJlZml4KSB7XG4gICAgcGF0Y2guZGlmZnMudW5zaGlmdChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIHByZWZpeCkpO1xuICB9XG4gIC8vIEFkZCB0aGUgc3VmZml4LlxuICB2YXIgc3VmZml4ID0gdGV4dC5zdWJzdHJpbmcocGF0Y2guc3RhcnQyICsgcGF0Y2gubGVuZ3RoMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLnN0YXJ0MiArIHBhdGNoLmxlbmd0aDEgKyBwYWRkaW5nKTtcbiAgaWYgKHN1ZmZpeCkge1xuICAgIHBhdGNoLmRpZmZzLnB1c2gobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCBzdWZmaXgpKTtcbiAgfVxuXG4gIC8vIFJvbGwgYmFjayB0aGUgc3RhcnQgcG9pbnRzLlxuICBwYXRjaC5zdGFydDEgLT0gcHJlZml4Lmxlbmd0aDtcbiAgcGF0Y2guc3RhcnQyIC09IHByZWZpeC5sZW5ndGg7XG4gIC8vIEV4dGVuZCB0aGUgbGVuZ3Rocy5cbiAgcGF0Y2gubGVuZ3RoMSArPSBwcmVmaXgubGVuZ3RoICsgc3VmZml4Lmxlbmd0aDtcbiAgcGF0Y2gubGVuZ3RoMiArPSBwcmVmaXgubGVuZ3RoICsgc3VmZml4Lmxlbmd0aDtcbn07XG5cblxuLyoqXG4gKiBDb21wdXRlIGEgbGlzdCBvZiBwYXRjaGVzIHRvIHR1cm4gdGV4dDEgaW50byB0ZXh0Mi5cbiAqIFVzZSBkaWZmcyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGNvbXB1dGUgaXQgb3Vyc2VsdmVzLlxuICogVGhlcmUgYXJlIGZvdXIgd2F5cyB0byBjYWxsIHRoaXMgZnVuY3Rpb24sIGRlcGVuZGluZyBvbiB3aGF0IGRhdGEgaXNcbiAqIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyOlxuICogTWV0aG9kIDE6XG4gKiBhID0gdGV4dDEsIGIgPSB0ZXh0MlxuICogTWV0aG9kIDI6XG4gKiBhID0gZGlmZnNcbiAqIE1ldGhvZCAzIChvcHRpbWFsKTpcbiAqIGEgPSB0ZXh0MSwgYiA9IGRpZmZzXG4gKiBNZXRob2QgNCAoZGVwcmVjYXRlZCwgdXNlIG1ldGhvZCAzKTpcbiAqIGEgPSB0ZXh0MSwgYiA9IHRleHQyLCBjID0gZGlmZnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3whQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBhIHRleHQxIChtZXRob2RzIDEsMyw0KSBvclxuICogQXJyYXkgb2YgZGlmZiB0dXBsZXMgZm9yIHRleHQxIHRvIHRleHQyIChtZXRob2QgMikuXG4gKiBAcGFyYW0ge3N0cmluZ3whQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+PX0gb3B0X2IgdGV4dDIgKG1ldGhvZHMgMSw0KSBvclxuICogQXJyYXkgb2YgZGlmZiB0dXBsZXMgZm9yIHRleHQxIHRvIHRleHQyIChtZXRob2QgMykgb3IgdW5kZWZpbmVkIChtZXRob2QgMikuXG4gKiBAcGFyYW0ge3N0cmluZ3whQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+PX0gb3B0X2MgQXJyYXkgb2YgZGlmZiB0dXBsZXNcbiAqIGZvciB0ZXh0MSB0byB0ZXh0MiAobWV0aG9kIDQpIG9yIHVuZGVmaW5lZCAobWV0aG9kcyAxLDIsMykuXG4gKiBAcmV0dXJuIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iaj59IEFycmF5IG9mIFBhdGNoIG9iamVjdHMuXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLnBhdGNoX21ha2UgPSBmdW5jdGlvbihhLCBvcHRfYiwgb3B0X2MpIHtcbiAgdmFyIHRleHQxLCBkaWZmcztcbiAgaWYgKHR5cGVvZiBhID09ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRfYiA9PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIG9wdF9jID09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTWV0aG9kIDE6IHRleHQxLCB0ZXh0MlxuICAgIC8vIENvbXB1dGUgZGlmZnMgZnJvbSB0ZXh0MSBhbmQgdGV4dDIuXG4gICAgdGV4dDEgPSAvKiogQHR5cGUge3N0cmluZ30gKi8oYSk7XG4gICAgZGlmZnMgPSB0aGlzLmRpZmZfbWFpbih0ZXh0MSwgLyoqIEB0eXBlIHtzdHJpbmd9ICovKG9wdF9iKSwgdHJ1ZSk7XG4gICAgaWYgKGRpZmZzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWMoZGlmZnMpO1xuICAgICAgdGhpcy5kaWZmX2NsZWFudXBFZmZpY2llbmN5KGRpZmZzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYSAmJiB0eXBlb2YgYSA9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3B0X2IgPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBvcHRfYyA9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIE1ldGhvZCAyOiBkaWZmc1xuICAgIC8vIENvbXB1dGUgdGV4dDEgZnJvbSBkaWZmcy5cbiAgICBkaWZmcyA9IC8qKiBAdHlwZSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gKi8oYSk7XG4gICAgdGV4dDEgPSB0aGlzLmRpZmZfdGV4dDEoZGlmZnMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhID09ICdzdHJpbmcnICYmIG9wdF9iICYmIHR5cGVvZiBvcHRfYiA9PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIG9wdF9jID09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTWV0aG9kIDM6IHRleHQxLCBkaWZmc1xuICAgIHRleHQxID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovKGEpO1xuICAgIGRpZmZzID0gLyoqIEB0eXBlIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSAqLyhvcHRfYik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGEgPT0gJ3N0cmluZycgJiYgdHlwZW9mIG9wdF9iID09ICdzdHJpbmcnICYmXG4gICAgICBvcHRfYyAmJiB0eXBlb2Ygb3B0X2MgPT0gJ29iamVjdCcpIHtcbiAgICAvLyBNZXRob2QgNDogdGV4dDEsIHRleHQyLCBkaWZmc1xuICAgIC8vIHRleHQyIGlzIG5vdCB1c2VkLlxuICAgIHRleHQxID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovKGEpO1xuICAgIGRpZmZzID0gLyoqIEB0eXBlIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSAqLyhvcHRfYyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGNhbGwgZm9ybWF0IHRvIHBhdGNoX21ha2UuJyk7XG4gIH1cblxuICBpZiAoZGlmZnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdOyAgLy8gR2V0IHJpZCBvZiB0aGUgbnVsbCBjYXNlLlxuICB9XG4gIHZhciBwYXRjaGVzID0gW107XG4gIHZhciBwYXRjaCA9IG5ldyBkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iaigpO1xuICB2YXIgcGF0Y2hEaWZmTGVuZ3RoID0gMDsgIC8vIEtlZXBpbmcgb3VyIG93biBsZW5ndGggdmFyIGlzIGZhc3RlciBpbiBKUy5cbiAgdmFyIGNoYXJfY291bnQxID0gMDsgIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIGludG8gdGhlIHRleHQxIHN0cmluZy5cbiAgdmFyIGNoYXJfY291bnQyID0gMDsgIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIGludG8gdGhlIHRleHQyIHN0cmluZy5cbiAgLy8gU3RhcnQgd2l0aCB0ZXh0MSAocHJlcGF0Y2hfdGV4dCkgYW5kIGFwcGx5IHRoZSBkaWZmcyB1bnRpbCB3ZSBhcnJpdmUgYXRcbiAgLy8gdGV4dDIgKHBvc3RwYXRjaF90ZXh0KS4gIFdlIHJlY3JlYXRlIHRoZSBwYXRjaGVzIG9uZSBieSBvbmUgdG8gZGV0ZXJtaW5lXG4gIC8vIGNvbnRleHQgaW5mby5cbiAgdmFyIHByZXBhdGNoX3RleHQgPSB0ZXh0MTtcbiAgdmFyIHBvc3RwYXRjaF90ZXh0ID0gdGV4dDE7XG4gIGZvciAodmFyIHggPSAwOyB4IDwgZGlmZnMubGVuZ3RoOyB4KyspIHtcbiAgICB2YXIgZGlmZl90eXBlID0gZGlmZnNbeF1bMF07XG4gICAgdmFyIGRpZmZfdGV4dCA9IGRpZmZzW3hdWzFdO1xuXG4gICAgaWYgKCFwYXRjaERpZmZMZW5ndGggJiYgZGlmZl90eXBlICE9PSBESUZGX0VRVUFMKSB7XG4gICAgICAvLyBBIG5ldyBwYXRjaCBzdGFydHMgaGVyZS5cbiAgICAgIHBhdGNoLnN0YXJ0MSA9IGNoYXJfY291bnQxO1xuICAgICAgcGF0Y2guc3RhcnQyID0gY2hhcl9jb3VudDI7XG4gICAgfVxuXG4gICAgc3dpdGNoIChkaWZmX3R5cGUpIHtcbiAgICAgIGNhc2UgRElGRl9JTlNFUlQ6XG4gICAgICAgIHBhdGNoLmRpZmZzW3BhdGNoRGlmZkxlbmd0aCsrXSA9IGRpZmZzW3hdO1xuICAgICAgICBwYXRjaC5sZW5ndGgyICs9IGRpZmZfdGV4dC5sZW5ndGg7XG4gICAgICAgIHBvc3RwYXRjaF90ZXh0ID0gcG9zdHBhdGNoX3RleHQuc3Vic3RyaW5nKDAsIGNoYXJfY291bnQyKSArIGRpZmZfdGV4dCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHBhdGNoX3RleHQuc3Vic3RyaW5nKGNoYXJfY291bnQyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfREVMRVRFOlxuICAgICAgICBwYXRjaC5sZW5ndGgxICs9IGRpZmZfdGV4dC5sZW5ndGg7XG4gICAgICAgIHBhdGNoLmRpZmZzW3BhdGNoRGlmZkxlbmd0aCsrXSA9IGRpZmZzW3hdO1xuICAgICAgICBwb3N0cGF0Y2hfdGV4dCA9IHBvc3RwYXRjaF90ZXh0LnN1YnN0cmluZygwLCBjaGFyX2NvdW50MikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RwYXRjaF90ZXh0LnN1YnN0cmluZyhjaGFyX2NvdW50MiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZfdGV4dC5sZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9FUVVBTDpcbiAgICAgICAgaWYgKGRpZmZfdGV4dC5sZW5ndGggPD0gMiAqIHRoaXMuUGF0Y2hfTWFyZ2luICYmXG4gICAgICAgICAgICBwYXRjaERpZmZMZW5ndGggJiYgZGlmZnMubGVuZ3RoICE9IHggKyAxKSB7XG4gICAgICAgICAgLy8gU21hbGwgZXF1YWxpdHkgaW5zaWRlIGEgcGF0Y2guXG4gICAgICAgICAgcGF0Y2guZGlmZnNbcGF0Y2hEaWZmTGVuZ3RoKytdID0gZGlmZnNbeF07XG4gICAgICAgICAgcGF0Y2gubGVuZ3RoMSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIHBhdGNoLmxlbmd0aDIgKz0gZGlmZl90ZXh0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmX3RleHQubGVuZ3RoID49IDIgKiB0aGlzLlBhdGNoX01hcmdpbikge1xuICAgICAgICAgIC8vIFRpbWUgZm9yIGEgbmV3IHBhdGNoLlxuICAgICAgICAgIGlmIChwYXRjaERpZmZMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2hfYWRkQ29udGV4dF8ocGF0Y2gsIHByZXBhdGNoX3RleHQpO1xuICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHBhdGNoKTtcbiAgICAgICAgICAgIHBhdGNoID0gbmV3IGRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqKCk7XG4gICAgICAgICAgICBwYXRjaERpZmZMZW5ndGggPSAwO1xuICAgICAgICAgICAgLy8gVW5saWtlIFVuaWRpZmYsIG91ciBwYXRjaCBsaXN0cyBoYXZlIGEgcm9sbGluZyBjb250ZXh0LlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9kaWZmLW1hdGNoLXBhdGNoL3dpa2kvVW5pZGlmZlxuICAgICAgICAgICAgLy8gVXBkYXRlIHByZXBhdGNoIHRleHQgJiBwb3MgdG8gcmVmbGVjdCB0aGUgYXBwbGljYXRpb24gb2YgdGhlXG4gICAgICAgICAgICAvLyBqdXN0IGNvbXBsZXRlZCBwYXRjaC5cbiAgICAgICAgICAgIHByZXBhdGNoX3RleHQgPSBwb3N0cGF0Y2hfdGV4dDtcbiAgICAgICAgICAgIGNoYXJfY291bnQxID0gY2hhcl9jb3VudDI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBjaGFyYWN0ZXIgY291bnQuXG4gICAgaWYgKGRpZmZfdHlwZSAhPT0gRElGRl9JTlNFUlQpIHtcbiAgICAgIGNoYXJfY291bnQxICs9IGRpZmZfdGV4dC5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChkaWZmX3R5cGUgIT09IERJRkZfREVMRVRFKSB7XG4gICAgICBjaGFyX2NvdW50MiArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgIH1cbiAgfVxuICAvLyBQaWNrIHVwIHRoZSBsZWZ0b3ZlciBwYXRjaCBpZiBub3QgZW1wdHkuXG4gIGlmIChwYXRjaERpZmZMZW5ndGgpIHtcbiAgICB0aGlzLnBhdGNoX2FkZENvbnRleHRfKHBhdGNoLCBwcmVwYXRjaF90ZXh0KTtcbiAgICBwYXRjaGVzLnB1c2gocGF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIHBhdGNoZXM7XG59O1xuXG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgcGF0Y2hlcywgcmV0dXJuIGFub3RoZXIgYXJyYXkgdGhhdCBpcyBpZGVudGljYWwuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqPn0gcGF0Y2hlcyBBcnJheSBvZiBQYXRjaCBvYmplY3RzLlxuICogQHJldHVybiB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmo+fSBBcnJheSBvZiBQYXRjaCBvYmplY3RzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9kZWVwQ29weSA9IGZ1bmN0aW9uKHBhdGNoZXMpIHtcbiAgLy8gTWFraW5nIGRlZXAgY29waWVzIGlzIGhhcmQgaW4gSmF2YVNjcmlwdC5cbiAgdmFyIHBhdGNoZXNDb3B5ID0gW107XG4gIGZvciAodmFyIHggPSAwOyB4IDwgcGF0Y2hlcy5sZW5ndGg7IHgrKykge1xuICAgIHZhciBwYXRjaCA9IHBhdGNoZXNbeF07XG4gICAgdmFyIHBhdGNoQ29weSA9IG5ldyBkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iaigpO1xuICAgIHBhdGNoQ29weS5kaWZmcyA9IFtdO1xuICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcGF0Y2guZGlmZnMubGVuZ3RoOyB5KyspIHtcbiAgICAgIHBhdGNoQ29weS5kaWZmc1t5XSA9XG4gICAgICAgICAgbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihwYXRjaC5kaWZmc1t5XVswXSwgcGF0Y2guZGlmZnNbeV1bMV0pO1xuICAgIH1cbiAgICBwYXRjaENvcHkuc3RhcnQxID0gcGF0Y2guc3RhcnQxO1xuICAgIHBhdGNoQ29weS5zdGFydDIgPSBwYXRjaC5zdGFydDI7XG4gICAgcGF0Y2hDb3B5Lmxlbmd0aDEgPSBwYXRjaC5sZW5ndGgxO1xuICAgIHBhdGNoQ29weS5sZW5ndGgyID0gcGF0Y2gubGVuZ3RoMjtcbiAgICBwYXRjaGVzQ29weVt4XSA9IHBhdGNoQ29weTtcbiAgfVxuICByZXR1cm4gcGF0Y2hlc0NvcHk7XG59O1xuXG5cbi8qKlxuICogTWVyZ2UgYSBzZXQgb2YgcGF0Y2hlcyBvbnRvIHRoZSB0ZXh0LiAgUmV0dXJuIGEgcGF0Y2hlZCB0ZXh0LCBhcyB3ZWxsXG4gKiBhcyBhIGxpc3Qgb2YgdHJ1ZS9mYWxzZSB2YWx1ZXMgaW5kaWNhdGluZyB3aGljaCBwYXRjaGVzIHdlcmUgYXBwbGllZC5cbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmo+fSBwYXRjaGVzIEFycmF5IG9mIFBhdGNoIG9iamVjdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBPbGQgdGV4dC5cbiAqIEByZXR1cm4geyFBcnJheS48c3RyaW5nfCFBcnJheS48Ym9vbGVhbj4+fSBUd28gZWxlbWVudCBBcnJheSwgY29udGFpbmluZyB0aGVcbiAqICAgICAgbmV3IHRleHQgYW5kIGFuIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9hcHBseSA9IGZ1bmN0aW9uKHBhdGNoZXMsIHRleHQpIHtcbiAgaWYgKHBhdGNoZXMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm4gW3RleHQsIFtdXTtcbiAgfVxuXG4gIC8vIERlZXAgY29weSB0aGUgcGF0Y2hlcyBzbyB0aGF0IG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gb3JpZ2luYWxzLlxuICBwYXRjaGVzID0gdGhpcy5wYXRjaF9kZWVwQ29weShwYXRjaGVzKTtcblxuICB2YXIgbnVsbFBhZGRpbmcgPSB0aGlzLnBhdGNoX2FkZFBhZGRpbmcocGF0Y2hlcyk7XG4gIHRleHQgPSBudWxsUGFkZGluZyArIHRleHQgKyBudWxsUGFkZGluZztcblxuICB0aGlzLnBhdGNoX3NwbGl0TWF4KHBhdGNoZXMpO1xuICAvLyBkZWx0YSBrZWVwcyB0cmFjayBvZiB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGV4cGVjdGVkIGFuZCBhY3R1YWwgbG9jYXRpb25cbiAgLy8gb2YgdGhlIHByZXZpb3VzIHBhdGNoLiAgSWYgdGhlcmUgYXJlIHBhdGNoZXMgZXhwZWN0ZWQgYXQgcG9zaXRpb25zIDEwIGFuZFxuICAvLyAyMCwgYnV0IHRoZSBmaXJzdCBwYXRjaCB3YXMgZm91bmQgYXQgMTIsIGRlbHRhIGlzIDIgYW5kIHRoZSBzZWNvbmQgcGF0Y2hcbiAgLy8gaGFzIGFuIGVmZmVjdGl2ZSBleHBlY3RlZCBwb3NpdGlvbiBvZiAyMi5cbiAgdmFyIGRlbHRhID0gMDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCBwYXRjaGVzLmxlbmd0aDsgeCsrKSB7XG4gICAgdmFyIGV4cGVjdGVkX2xvYyA9IHBhdGNoZXNbeF0uc3RhcnQyICsgZGVsdGE7XG4gICAgdmFyIHRleHQxID0gdGhpcy5kaWZmX3RleHQxKHBhdGNoZXNbeF0uZGlmZnMpO1xuICAgIHZhciBzdGFydF9sb2M7XG4gICAgdmFyIGVuZF9sb2MgPSAtMTtcbiAgICBpZiAodGV4dDEubGVuZ3RoID4gdGhpcy5NYXRjaF9NYXhCaXRzKSB7XG4gICAgICAvLyBwYXRjaF9zcGxpdE1heCB3aWxsIG9ubHkgcHJvdmlkZSBhbiBvdmVyc2l6ZWQgcGF0dGVybiBpbiB0aGUgY2FzZSBvZlxuICAgICAgLy8gYSBtb25zdGVyIGRlbGV0ZS5cbiAgICAgIHN0YXJ0X2xvYyA9IHRoaXMubWF0Y2hfbWFpbih0ZXh0LCB0ZXh0MS5zdWJzdHJpbmcoMCwgdGhpcy5NYXRjaF9NYXhCaXRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9sb2MpO1xuICAgICAgaWYgKHN0YXJ0X2xvYyAhPSAtMSkge1xuICAgICAgICBlbmRfbG9jID0gdGhpcy5tYXRjaF9tYWluKHRleHQsXG4gICAgICAgICAgICB0ZXh0MS5zdWJzdHJpbmcodGV4dDEubGVuZ3RoIC0gdGhpcy5NYXRjaF9NYXhCaXRzKSxcbiAgICAgICAgICAgIGV4cGVjdGVkX2xvYyArIHRleHQxLmxlbmd0aCAtIHRoaXMuTWF0Y2hfTWF4Qml0cyk7XG4gICAgICAgIGlmIChlbmRfbG9jID09IC0xIHx8IHN0YXJ0X2xvYyA+PSBlbmRfbG9jKSB7XG4gICAgICAgICAgLy8gQ2FuJ3QgZmluZCB2YWxpZCB0cmFpbGluZyBjb250ZXh0LiAgRHJvcCB0aGlzIHBhdGNoLlxuICAgICAgICAgIHN0YXJ0X2xvYyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0X2xvYyA9IHRoaXMubWF0Y2hfbWFpbih0ZXh0LCB0ZXh0MSwgZXhwZWN0ZWRfbG9jKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0X2xvYyA9PSAtMSkge1xuICAgICAgLy8gTm8gbWF0Y2ggZm91bmQuICA6KFxuICAgICAgcmVzdWx0c1t4XSA9IGZhbHNlO1xuICAgICAgLy8gU3VidHJhY3QgdGhlIGRlbHRhIGZvciB0aGlzIGZhaWxlZCBwYXRjaCBmcm9tIHN1YnNlcXVlbnQgcGF0Y2hlcy5cbiAgICAgIGRlbHRhIC09IHBhdGNoZXNbeF0ubGVuZ3RoMiAtIHBhdGNoZXNbeF0ubGVuZ3RoMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm91bmQgYSBtYXRjaC4gIDopXG4gICAgICByZXN1bHRzW3hdID0gdHJ1ZTtcbiAgICAgIGRlbHRhID0gc3RhcnRfbG9jIC0gZXhwZWN0ZWRfbG9jO1xuICAgICAgdmFyIHRleHQyO1xuICAgICAgaWYgKGVuZF9sb2MgPT0gLTEpIHtcbiAgICAgICAgdGV4dDIgPSB0ZXh0LnN1YnN0cmluZyhzdGFydF9sb2MsIHN0YXJ0X2xvYyArIHRleHQxLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0MiA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0X2xvYywgZW5kX2xvYyArIHRoaXMuTWF0Y2hfTWF4Qml0cyk7XG4gICAgICB9XG4gICAgICBpZiAodGV4dDEgPT0gdGV4dDIpIHtcbiAgICAgICAgLy8gUGVyZmVjdCBtYXRjaCwganVzdCBzaG92ZSB0aGUgcmVwbGFjZW1lbnQgdGV4dCBpbi5cbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0X2xvYykgK1xuICAgICAgICAgICAgICAgdGhpcy5kaWZmX3RleHQyKHBhdGNoZXNbeF0uZGlmZnMpICtcbiAgICAgICAgICAgICAgIHRleHQuc3Vic3RyaW5nKHN0YXJ0X2xvYyArIHRleHQxLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbXBlcmZlY3QgbWF0Y2guICBSdW4gYSBkaWZmIHRvIGdldCBhIGZyYW1ld29yayBvZiBlcXVpdmFsZW50XG4gICAgICAgIC8vIGluZGljZXMuXG4gICAgICAgIHZhciBkaWZmcyA9IHRoaXMuZGlmZl9tYWluKHRleHQxLCB0ZXh0MiwgZmFsc2UpO1xuICAgICAgICBpZiAodGV4dDEubGVuZ3RoID4gdGhpcy5NYXRjaF9NYXhCaXRzICYmXG4gICAgICAgICAgICB0aGlzLmRpZmZfbGV2ZW5zaHRlaW4oZGlmZnMpIC8gdGV4dDEubGVuZ3RoID5cbiAgICAgICAgICAgIHRoaXMuUGF0Y2hfRGVsZXRlVGhyZXNob2xkKSB7XG4gICAgICAgICAgLy8gVGhlIGVuZCBwb2ludHMgbWF0Y2gsIGJ1dCB0aGUgY29udGVudCBpcyB1bmFjY2VwdGFibHkgYmFkLlxuICAgICAgICAgIHJlc3VsdHNbeF0gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRpZmZfY2xlYW51cFNlbWFudGljTG9zc2xlc3MoZGlmZnMpO1xuICAgICAgICAgIHZhciBpbmRleDEgPSAwO1xuICAgICAgICAgIHZhciBpbmRleDI7XG4gICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBwYXRjaGVzW3hdLmRpZmZzLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgICB2YXIgbW9kID0gcGF0Y2hlc1t4XS5kaWZmc1t5XTtcbiAgICAgICAgICAgIGlmIChtb2RbMF0gIT09IERJRkZfRVFVQUwpIHtcbiAgICAgICAgICAgICAgaW5kZXgyID0gdGhpcy5kaWZmX3hJbmRleChkaWZmcywgaW5kZXgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb2RbMF0gPT09IERJRkZfSU5TRVJUKSB7ICAvLyBJbnNlcnRpb25cbiAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0X2xvYyArIGluZGV4MikgKyBtb2RbMV0gK1xuICAgICAgICAgICAgICAgICAgICAgdGV4dC5zdWJzdHJpbmcoc3RhcnRfbG9jICsgaW5kZXgyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kWzBdID09PSBESUZGX0RFTEVURSkgeyAgLy8gRGVsZXRpb25cbiAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0X2xvYyArIGluZGV4MikgK1xuICAgICAgICAgICAgICAgICAgICAgdGV4dC5zdWJzdHJpbmcoc3RhcnRfbG9jICsgdGhpcy5kaWZmX3hJbmRleChkaWZmcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDEgKyBtb2RbMV0ubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9kWzBdICE9PSBESUZGX0RFTEVURSkge1xuICAgICAgICAgICAgICBpbmRleDEgKz0gbW9kWzFdLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU3RyaXAgdGhlIHBhZGRpbmcgb2ZmLlxuICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcobnVsbFBhZGRpbmcubGVuZ3RoLCB0ZXh0Lmxlbmd0aCAtIG51bGxQYWRkaW5nLmxlbmd0aCk7XG4gIHJldHVybiBbdGV4dCwgcmVzdWx0c107XG59O1xuXG5cbi8qKlxuICogQWRkIHNvbWUgcGFkZGluZyBvbiB0ZXh0IHN0YXJ0IGFuZCBlbmQgc28gdGhhdCBlZGdlcyBjYW4gbWF0Y2ggc29tZXRoaW5nLlxuICogSW50ZW5kZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gcGF0Y2hfYXBwbHkuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqPn0gcGF0Y2hlcyBBcnJheSBvZiBQYXRjaCBvYmplY3RzLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGFkZGluZyBzdHJpbmcgYWRkZWQgdG8gZWFjaCBzaWRlLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9hZGRQYWRkaW5nID0gZnVuY3Rpb24ocGF0Y2hlcykge1xuICB2YXIgcGFkZGluZ0xlbmd0aCA9IHRoaXMuUGF0Y2hfTWFyZ2luO1xuICB2YXIgbnVsbFBhZGRpbmcgPSAnJztcbiAgZm9yICh2YXIgeCA9IDE7IHggPD0gcGFkZGluZ0xlbmd0aDsgeCsrKSB7XG4gICAgbnVsbFBhZGRpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh4KTtcbiAgfVxuXG4gIC8vIEJ1bXAgYWxsIHRoZSBwYXRjaGVzIGZvcndhcmQuXG4gIGZvciAodmFyIHggPSAwOyB4IDwgcGF0Y2hlcy5sZW5ndGg7IHgrKykge1xuICAgIHBhdGNoZXNbeF0uc3RhcnQxICs9IHBhZGRpbmdMZW5ndGg7XG4gICAgcGF0Y2hlc1t4XS5zdGFydDIgKz0gcGFkZGluZ0xlbmd0aDtcbiAgfVxuXG4gIC8vIEFkZCBzb21lIHBhZGRpbmcgb24gc3RhcnQgb2YgZmlyc3QgZGlmZi5cbiAgdmFyIHBhdGNoID0gcGF0Y2hlc1swXTtcbiAgdmFyIGRpZmZzID0gcGF0Y2guZGlmZnM7XG4gIGlmIChkaWZmcy5sZW5ndGggPT0gMCB8fCBkaWZmc1swXVswXSAhPSBESUZGX0VRVUFMKSB7XG4gICAgLy8gQWRkIG51bGxQYWRkaW5nIGVxdWFsaXR5LlxuICAgIGRpZmZzLnVuc2hpZnQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCBudWxsUGFkZGluZykpO1xuICAgIHBhdGNoLnN0YXJ0MSAtPSBwYWRkaW5nTGVuZ3RoOyAgLy8gU2hvdWxkIGJlIDAuXG4gICAgcGF0Y2guc3RhcnQyIC09IHBhZGRpbmdMZW5ndGg7ICAvLyBTaG91bGQgYmUgMC5cbiAgICBwYXRjaC5sZW5ndGgxICs9IHBhZGRpbmdMZW5ndGg7XG4gICAgcGF0Y2gubGVuZ3RoMiArPSBwYWRkaW5nTGVuZ3RoO1xuICB9IGVsc2UgaWYgKHBhZGRpbmdMZW5ndGggPiBkaWZmc1swXVsxXS5sZW5ndGgpIHtcbiAgICAvLyBHcm93IGZpcnN0IGVxdWFsaXR5LlxuICAgIHZhciBleHRyYUxlbmd0aCA9IHBhZGRpbmdMZW5ndGggLSBkaWZmc1swXVsxXS5sZW5ndGg7XG4gICAgZGlmZnNbMF1bMV0gPSBudWxsUGFkZGluZy5zdWJzdHJpbmcoZGlmZnNbMF1bMV0ubGVuZ3RoKSArIGRpZmZzWzBdWzFdO1xuICAgIHBhdGNoLnN0YXJ0MSAtPSBleHRyYUxlbmd0aDtcbiAgICBwYXRjaC5zdGFydDIgLT0gZXh0cmFMZW5ndGg7XG4gICAgcGF0Y2gubGVuZ3RoMSArPSBleHRyYUxlbmd0aDtcbiAgICBwYXRjaC5sZW5ndGgyICs9IGV4dHJhTGVuZ3RoO1xuICB9XG5cbiAgLy8gQWRkIHNvbWUgcGFkZGluZyBvbiBlbmQgb2YgbGFzdCBkaWZmLlxuICBwYXRjaCA9IHBhdGNoZXNbcGF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgZGlmZnMgPSBwYXRjaC5kaWZmcztcbiAgaWYgKGRpZmZzLmxlbmd0aCA9PSAwIHx8IGRpZmZzW2RpZmZzLmxlbmd0aCAtIDFdWzBdICE9IERJRkZfRVFVQUwpIHtcbiAgICAvLyBBZGQgbnVsbFBhZGRpbmcgZXF1YWxpdHkuXG4gICAgZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIG51bGxQYWRkaW5nKSk7XG4gICAgcGF0Y2gubGVuZ3RoMSArPSBwYWRkaW5nTGVuZ3RoO1xuICAgIHBhdGNoLmxlbmd0aDIgKz0gcGFkZGluZ0xlbmd0aDtcbiAgfSBlbHNlIGlmIChwYWRkaW5nTGVuZ3RoID4gZGlmZnNbZGlmZnMubGVuZ3RoIC0gMV1bMV0ubGVuZ3RoKSB7XG4gICAgLy8gR3JvdyBsYXN0IGVxdWFsaXR5LlxuICAgIHZhciBleHRyYUxlbmd0aCA9IHBhZGRpbmdMZW5ndGggLSBkaWZmc1tkaWZmcy5sZW5ndGggLSAxXVsxXS5sZW5ndGg7XG4gICAgZGlmZnNbZGlmZnMubGVuZ3RoIC0gMV1bMV0gKz0gbnVsbFBhZGRpbmcuc3Vic3RyaW5nKDAsIGV4dHJhTGVuZ3RoKTtcbiAgICBwYXRjaC5sZW5ndGgxICs9IGV4dHJhTGVuZ3RoO1xuICAgIHBhdGNoLmxlbmd0aDIgKz0gZXh0cmFMZW5ndGg7XG4gIH1cblxuICByZXR1cm4gbnVsbFBhZGRpbmc7XG59O1xuXG5cbi8qKlxuICogTG9vayB0aHJvdWdoIHRoZSBwYXRjaGVzIGFuZCBicmVhayB1cCBhbnkgd2hpY2ggYXJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtXG4gKiBsaW1pdCBvZiB0aGUgbWF0Y2ggYWxnb3JpdGhtLlxuICogSW50ZW5kZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gcGF0Y2hfYXBwbHkuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqPn0gcGF0Y2hlcyBBcnJheSBvZiBQYXRjaCBvYmplY3RzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9zcGxpdE1heCA9IGZ1bmN0aW9uKHBhdGNoZXMpIHtcbiAgdmFyIHBhdGNoX3NpemUgPSB0aGlzLk1hdGNoX01heEJpdHM7XG4gIGZvciAodmFyIHggPSAwOyB4IDwgcGF0Y2hlcy5sZW5ndGg7IHgrKykge1xuICAgIGlmIChwYXRjaGVzW3hdLmxlbmd0aDEgPD0gcGF0Y2hfc2l6ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBiaWdwYXRjaCA9IHBhdGNoZXNbeF07XG4gICAgLy8gUmVtb3ZlIHRoZSBiaWcgb2xkIHBhdGNoLlxuICAgIHBhdGNoZXMuc3BsaWNlKHgtLSwgMSk7XG4gICAgdmFyIHN0YXJ0MSA9IGJpZ3BhdGNoLnN0YXJ0MTtcbiAgICB2YXIgc3RhcnQyID0gYmlncGF0Y2guc3RhcnQyO1xuICAgIHZhciBwcmVjb250ZXh0ID0gJyc7XG4gICAgd2hpbGUgKGJpZ3BhdGNoLmRpZmZzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gQ3JlYXRlIG9uZSBvZiBzZXZlcmFsIHNtYWxsZXIgcGF0Y2hlcy5cbiAgICAgIHZhciBwYXRjaCA9IG5ldyBkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iaigpO1xuICAgICAgdmFyIGVtcHR5ID0gdHJ1ZTtcbiAgICAgIHBhdGNoLnN0YXJ0MSA9IHN0YXJ0MSAtIHByZWNvbnRleHQubGVuZ3RoO1xuICAgICAgcGF0Y2guc3RhcnQyID0gc3RhcnQyIC0gcHJlY29udGV4dC5sZW5ndGg7XG4gICAgICBpZiAocHJlY29udGV4dCAhPT0gJycpIHtcbiAgICAgICAgcGF0Y2gubGVuZ3RoMSA9IHBhdGNoLmxlbmd0aDIgPSBwcmVjb250ZXh0Lmxlbmd0aDtcbiAgICAgICAgcGF0Y2guZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIHByZWNvbnRleHQpKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChiaWdwYXRjaC5kaWZmcy5sZW5ndGggIT09IDAgJiZcbiAgICAgICAgICAgICBwYXRjaC5sZW5ndGgxIDwgcGF0Y2hfc2l6ZSAtIHRoaXMuUGF0Y2hfTWFyZ2luKSB7XG4gICAgICAgIHZhciBkaWZmX3R5cGUgPSBiaWdwYXRjaC5kaWZmc1swXVswXTtcbiAgICAgICAgdmFyIGRpZmZfdGV4dCA9IGJpZ3BhdGNoLmRpZmZzWzBdWzFdO1xuICAgICAgICBpZiAoZGlmZl90eXBlID09PSBESUZGX0lOU0VSVCkge1xuICAgICAgICAgIC8vIEluc2VydGlvbnMgYXJlIGhhcm1sZXNzLlxuICAgICAgICAgIHBhdGNoLmxlbmd0aDIgKz0gZGlmZl90ZXh0Lmxlbmd0aDtcbiAgICAgICAgICBzdGFydDIgKz0gZGlmZl90ZXh0Lmxlbmd0aDtcbiAgICAgICAgICBwYXRjaC5kaWZmcy5wdXNoKGJpZ3BhdGNoLmRpZmZzLnNoaWZ0KCkpO1xuICAgICAgICAgIGVtcHR5ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlmZl90eXBlID09PSBESUZGX0RFTEVURSAmJiBwYXRjaC5kaWZmcy5sZW5ndGggPT0gMSAmJlxuICAgICAgICAgICAgICAgICAgIHBhdGNoLmRpZmZzWzBdWzBdID09IERJRkZfRVFVQUwgJiZcbiAgICAgICAgICAgICAgICAgICBkaWZmX3RleHQubGVuZ3RoID4gMiAqIHBhdGNoX3NpemUpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbGFyZ2UgZGVsZXRpb24uICBMZXQgaXQgcGFzcyBpbiBvbmUgY2h1bmsuXG4gICAgICAgICAgcGF0Y2gubGVuZ3RoMSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIHN0YXJ0MSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIGVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgcGF0Y2guZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKGRpZmZfdHlwZSwgZGlmZl90ZXh0KSk7XG4gICAgICAgICAgYmlncGF0Y2guZGlmZnMuc2hpZnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWxldGlvbiBvciBlcXVhbGl0eS4gIE9ubHkgdGFrZSBhcyBtdWNoIGFzIHdlIGNhbiBzdG9tYWNoLlxuICAgICAgICAgIGRpZmZfdGV4dCA9IGRpZmZfdGV4dC5zdWJzdHJpbmcoMCxcbiAgICAgICAgICAgICAgcGF0Y2hfc2l6ZSAtIHBhdGNoLmxlbmd0aDEgLSB0aGlzLlBhdGNoX01hcmdpbik7XG4gICAgICAgICAgcGF0Y2gubGVuZ3RoMSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIHN0YXJ0MSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIGlmIChkaWZmX3R5cGUgPT09IERJRkZfRVFVQUwpIHtcbiAgICAgICAgICAgIHBhdGNoLmxlbmd0aDIgKz0gZGlmZl90ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIHN0YXJ0MiArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbXB0eSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRjaC5kaWZmcy5wdXNoKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoZGlmZl90eXBlLCBkaWZmX3RleHQpKTtcbiAgICAgICAgICBpZiAoZGlmZl90ZXh0ID09IGJpZ3BhdGNoLmRpZmZzWzBdWzFdKSB7XG4gICAgICAgICAgICBiaWdwYXRjaC5kaWZmcy5zaGlmdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiaWdwYXRjaC5kaWZmc1swXVsxXSA9XG4gICAgICAgICAgICAgICAgYmlncGF0Y2guZGlmZnNbMF1bMV0uc3Vic3RyaW5nKGRpZmZfdGV4dC5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ29tcHV0ZSB0aGUgaGVhZCBjb250ZXh0IGZvciB0aGUgbmV4dCBwYXRjaC5cbiAgICAgIHByZWNvbnRleHQgPSB0aGlzLmRpZmZfdGV4dDIocGF0Y2guZGlmZnMpO1xuICAgICAgcHJlY29udGV4dCA9XG4gICAgICAgICAgcHJlY29udGV4dC5zdWJzdHJpbmcocHJlY29udGV4dC5sZW5ndGggLSB0aGlzLlBhdGNoX01hcmdpbik7XG4gICAgICAvLyBBcHBlbmQgdGhlIGVuZCBjb250ZXh0IGZvciB0aGlzIHBhdGNoLlxuICAgICAgdmFyIHBvc3Rjb250ZXh0ID0gdGhpcy5kaWZmX3RleHQxKGJpZ3BhdGNoLmRpZmZzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgdGhpcy5QYXRjaF9NYXJnaW4pO1xuICAgICAgaWYgKHBvc3Rjb250ZXh0ICE9PSAnJykge1xuICAgICAgICBwYXRjaC5sZW5ndGgxICs9IHBvc3Rjb250ZXh0Lmxlbmd0aDtcbiAgICAgICAgcGF0Y2gubGVuZ3RoMiArPSBwb3N0Y29udGV4dC5sZW5ndGg7XG4gICAgICAgIGlmIChwYXRjaC5kaWZmcy5sZW5ndGggIT09IDAgJiZcbiAgICAgICAgICAgIHBhdGNoLmRpZmZzW3BhdGNoLmRpZmZzLmxlbmd0aCAtIDFdWzBdID09PSBESUZGX0VRVUFMKSB7XG4gICAgICAgICAgcGF0Y2guZGlmZnNbcGF0Y2guZGlmZnMubGVuZ3RoIC0gMV1bMV0gKz0gcG9zdGNvbnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0Y2guZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIHBvc3Rjb250ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZW1wdHkpIHtcbiAgICAgICAgcGF0Y2hlcy5zcGxpY2UoKyt4LCAwLCBwYXRjaCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5cbi8qKlxuICogVGFrZSBhIGxpc3Qgb2YgcGF0Y2hlcyBhbmQgcmV0dXJuIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmo+fSBwYXRjaGVzIEFycmF5IG9mIFBhdGNoIG9iamVjdHMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRleHQgcmVwcmVzZW50YXRpb24gb2YgcGF0Y2hlcy5cbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUucGF0Y2hfdG9UZXh0ID0gZnVuY3Rpb24ocGF0Y2hlcykge1xuICB2YXIgdGV4dCA9IFtdO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IHBhdGNoZXMubGVuZ3RoOyB4KyspIHtcbiAgICB0ZXh0W3hdID0gcGF0Y2hlc1t4XTtcbiAgfVxuICByZXR1cm4gdGV4dC5qb2luKCcnKTtcbn07XG5cblxuLyoqXG4gKiBQYXJzZSBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgcGF0Y2hlcyBhbmQgcmV0dXJuIGEgbGlzdCBvZiBQYXRjaCBvYmplY3RzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRsaW5lIFRleHQgcmVwcmVzZW50YXRpb24gb2YgcGF0Y2hlcy5cbiAqIEByZXR1cm4geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqPn0gQXJyYXkgb2YgUGF0Y2ggb2JqZWN0cy5cbiAqIEB0aHJvd3MgeyFFcnJvcn0gSWYgaW52YWxpZCBpbnB1dC5cbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUucGF0Y2hfZnJvbVRleHQgPSBmdW5jdGlvbih0ZXh0bGluZSkge1xuICB2YXIgcGF0Y2hlcyA9IFtdO1xuICBpZiAoIXRleHRsaW5lKSB7XG4gICAgcmV0dXJuIHBhdGNoZXM7XG4gIH1cbiAgdmFyIHRleHQgPSB0ZXh0bGluZS5zcGxpdCgnXFxuJyk7XG4gIHZhciB0ZXh0UG9pbnRlciA9IDA7XG4gIHZhciBwYXRjaEhlYWRlciA9IC9eQEAgLShcXGQrKSw/KFxcZCopIFxcKyhcXGQrKSw/KFxcZCopIEBAJC87XG4gIHdoaWxlICh0ZXh0UG9pbnRlciA8IHRleHQubGVuZ3RoKSB7XG4gICAgdmFyIG0gPSB0ZXh0W3RleHRQb2ludGVyXS5tYXRjaChwYXRjaEhlYWRlcik7XG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0Y2ggc3RyaW5nOiAnICsgdGV4dFt0ZXh0UG9pbnRlcl0pO1xuICAgIH1cbiAgICB2YXIgcGF0Y2ggPSBuZXcgZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmooKTtcbiAgICBwYXRjaGVzLnB1c2gocGF0Y2gpO1xuICAgIHBhdGNoLnN0YXJ0MSA9IHBhcnNlSW50KG1bMV0sIDEwKTtcbiAgICBpZiAobVsyXSA9PT0gJycpIHtcbiAgICAgIHBhdGNoLnN0YXJ0MS0tO1xuICAgICAgcGF0Y2gubGVuZ3RoMSA9IDE7XG4gICAgfSBlbHNlIGlmIChtWzJdID09ICcwJykge1xuICAgICAgcGF0Y2gubGVuZ3RoMSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoLnN0YXJ0MS0tO1xuICAgICAgcGF0Y2gubGVuZ3RoMSA9IHBhcnNlSW50KG1bMl0sIDEwKTtcbiAgICB9XG5cbiAgICBwYXRjaC5zdGFydDIgPSBwYXJzZUludChtWzNdLCAxMCk7XG4gICAgaWYgKG1bNF0gPT09ICcnKSB7XG4gICAgICBwYXRjaC5zdGFydDItLTtcbiAgICAgIHBhdGNoLmxlbmd0aDIgPSAxO1xuICAgIH0gZWxzZSBpZiAobVs0XSA9PSAnMCcpIHtcbiAgICAgIHBhdGNoLmxlbmd0aDIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaC5zdGFydDItLTtcbiAgICAgIHBhdGNoLmxlbmd0aDIgPSBwYXJzZUludChtWzRdLCAxMCk7XG4gICAgfVxuICAgIHRleHRQb2ludGVyKys7XG5cbiAgICB3aGlsZSAodGV4dFBvaW50ZXIgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgdmFyIHNpZ24gPSB0ZXh0W3RleHRQb2ludGVyXS5jaGFyQXQoMCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbGluZSA9IGRlY29kZVVSSSh0ZXh0W3RleHRQb2ludGVyXS5zdWJzdHJpbmcoMSkpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgLy8gTWFsZm9ybWVkIFVSSSBzZXF1ZW5jZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGVzY2FwZSBpbiBwYXRjaF9mcm9tVGV4dDogJyArIGxpbmUpO1xuICAgICAgfVxuICAgICAgaWYgKHNpZ24gPT0gJy0nKSB7XG4gICAgICAgIC8vIERlbGV0aW9uLlxuICAgICAgICBwYXRjaC5kaWZmcy5wdXNoKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIGxpbmUpKTtcbiAgICAgIH0gZWxzZSBpZiAoc2lnbiA9PSAnKycpIHtcbiAgICAgICAgLy8gSW5zZXJ0aW9uLlxuICAgICAgICBwYXRjaC5kaWZmcy5wdXNoKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9JTlNFUlQsIGxpbmUpKTtcbiAgICAgIH0gZWxzZSBpZiAoc2lnbiA9PSAnICcpIHtcbiAgICAgICAgLy8gTWlub3IgZXF1YWxpdHkuXG4gICAgICAgIHBhdGNoLmRpZmZzLnB1c2gobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCBsaW5lKSk7XG4gICAgICB9IGVsc2UgaWYgKHNpZ24gPT0gJ0AnKSB7XG4gICAgICAgIC8vIFN0YXJ0IG9mIG5leHQgcGF0Y2guXG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIGlmIChzaWduID09PSAnJykge1xuICAgICAgICAvLyBCbGFuayBsaW5lPyAgV2hhdGV2ZXIuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXVEY/XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXRjaCBtb2RlIFwiJyArIHNpZ24gKyAnXCIgaW46ICcgKyBsaW5lKTtcbiAgICAgIH1cbiAgICAgIHRleHRQb2ludGVyKys7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXRjaGVzO1xufTtcblxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBvbmUgcGF0Y2ggb3BlcmF0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqID0gZnVuY3Rpb24oKSB7XG4gIC8qKiBAdHlwZSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gKi9cbiAgdGhpcy5kaWZmcyA9IFtdO1xuICAvKiogQHR5cGUgez9udW1iZXJ9ICovXG4gIHRoaXMuc3RhcnQxID0gbnVsbDtcbiAgLyoqIEB0eXBlIHs/bnVtYmVyfSAqL1xuICB0aGlzLnN0YXJ0MiA9IG51bGw7XG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICB0aGlzLmxlbmd0aDEgPSAwO1xuICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgdGhpcy5sZW5ndGgyID0gMDtcbn07XG5cblxuLyoqXG4gKiBFbXVsYXRlIEdOVSBkaWZmJ3MgZm9ybWF0LlxuICogSGVhZGVyOiBAQCAtMzgyLDggKzQ4MSw5IEBAXG4gKiBJbmRpY2VzIGFyZSBwcmludGVkIGFzIDEtYmFzZWQsIG5vdCAwLWJhc2VkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgR05VIGRpZmYgc3RyaW5nLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iai5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvb3JkczEsIGNvb3JkczI7XG4gIGlmICh0aGlzLmxlbmd0aDEgPT09IDApIHtcbiAgICBjb29yZHMxID0gdGhpcy5zdGFydDEgKyAnLDAnO1xuICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoMSA9PSAxKSB7XG4gICAgY29vcmRzMSA9IHRoaXMuc3RhcnQxICsgMTtcbiAgfSBlbHNlIHtcbiAgICBjb29yZHMxID0gKHRoaXMuc3RhcnQxICsgMSkgKyAnLCcgKyB0aGlzLmxlbmd0aDE7XG4gIH1cbiAgaWYgKHRoaXMubGVuZ3RoMiA9PT0gMCkge1xuICAgIGNvb3JkczIgPSB0aGlzLnN0YXJ0MiArICcsMCc7XG4gIH0gZWxzZSBpZiAodGhpcy5sZW5ndGgyID09IDEpIHtcbiAgICBjb29yZHMyID0gdGhpcy5zdGFydDIgKyAxO1xuICB9IGVsc2Uge1xuICAgIGNvb3JkczIgPSAodGhpcy5zdGFydDIgKyAxKSArICcsJyArIHRoaXMubGVuZ3RoMjtcbiAgfVxuICB2YXIgdGV4dCA9IFsnQEAgLScgKyBjb29yZHMxICsgJyArJyArIGNvb3JkczIgKyAnIEBAXFxuJ107XG4gIHZhciBvcDtcbiAgLy8gRXNjYXBlIHRoZSBib2R5IG9mIHRoZSBwYXRjaCB3aXRoICV4eCBub3RhdGlvbi5cbiAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgc3dpdGNoICh0aGlzLmRpZmZzW3hdWzBdKSB7XG4gICAgICBjYXNlIERJRkZfSU5TRVJUOlxuICAgICAgICBvcCA9ICcrJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfREVMRVRFOlxuICAgICAgICBvcCA9ICctJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfRVFVQUw6XG4gICAgICAgIG9wID0gJyAnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGV4dFt4ICsgMV0gPSBvcCArIGVuY29kZVVSSSh0aGlzLmRpZmZzW3hdWzFdKSArICdcXG4nO1xuICB9XG4gIHJldHVybiB0ZXh0LmpvaW4oJycpLnJlcGxhY2UoLyUyMC9nLCAnICcpO1xufTtcblxuXG4vLyBUaGUgZm9sbG93aW5nIGV4cG9ydCBjb2RlIHdhcyBhZGRlZCBieSBARm9yYmVzTGluZGVzYXlcbm1vZHVsZS5leHBvcnRzID0gZGlmZl9tYXRjaF9wYXRjaDtcbm1vZHVsZS5leHBvcnRzWydkaWZmX21hdGNoX3BhdGNoJ10gPSBkaWZmX21hdGNoX3BhdGNoO1xubW9kdWxlLmV4cG9ydHNbJ0RJRkZfREVMRVRFJ10gPSBESUZGX0RFTEVURTtcbm1vZHVsZS5leHBvcnRzWydESUZGX0lOU0VSVCddID0gRElGRl9JTlNFUlQ7XG5tb2R1bGUuZXhwb3J0c1snRElGRl9FUVVBTCddID0gRElGRl9FUVVBTDsiLCAidHlwZSBFbnVtRGljdGlvbmFyeTxUIGV4dGVuZHMgc3RyaW5nIHwgc3ltYm9sIHwgbnVtYmVyLCBVPiA9IHtcblx0W0sgaW4gVF06IFU7XG59O1xuXG5leHBvcnQgdHlwZSBTVFJJTkdfU1VHR0VTVElPTl9UWVBFID0gXCJBZGRpdGlvblwiIHwgXCJEZWxldGlvblwiIHwgXCJTdWJzdGl0dXRpb25cIiB8IFwiSGlnaGxpZ2h0XCIgfCBcIkNvbW1lbnRcIjtcblxuZXhwb3J0IHR5cGUgTUVUQURBVEFfVFlQRSA9IFwiYXV0aG9yXCIgfCBcImRhdGVcIiB8IFwiY29tcGxldGVkXCIgfCBcInVyZ2VuY3lcIiB8IFwic3R5bGVcIjtcblxuLy8gRklYTUU6IENoYW5nZWQgdG8gc3RyaW5nIHR5cGVzLCBidXQgYmV5b25kIGlkZWFsIC0tLSBmYXIgdG9vIG11Y2ggYmxvYXRcbmV4cG9ydCBlbnVtIFN1Z2dlc3Rpb25UeXBlIHtcblx0QURESVRJT04gPSBcImFkZGl0aW9uXCIsXG5cdERFTEVUSU9OID0gXCJkZWxldGlvblwiLFxuXHRTVUJTVElUVVRJT04gPSBcInN1YnN0aXR1dGlvblwiLFxuXHRISUdITElHSFQgPSBcImhpZ2hsaWdodFwiLFxuXHRDT01NRU5UID0gXCJjb21tZW50XCIsXG59XG5cbmV4cG9ydCB0eXBlIFJhbmdlVHlwZSA9IFN1Z2dlc3Rpb25UeXBlIHwgXCJcIjtcblxuZXhwb3J0IGNvbnN0IENNX1N1Z2dlc3Rpb25UeXBlczogRW51bURpY3Rpb25hcnk8c3RyaW5nLCBTdWdnZXN0aW9uVHlwZT4gPSB7XG5cdFwiQWRkaXRpb25cIjogU3VnZ2VzdGlvblR5cGUuQURESVRJT04sXG5cdFwiRGVsZXRpb25cIjogU3VnZ2VzdGlvblR5cGUuREVMRVRJT04sXG5cdFwiU3Vic3RpdHV0aW9uXCI6IFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTixcblx0XCJIaWdobGlnaHRcIjogU3VnZ2VzdGlvblR5cGUuSElHSExJR0hULFxuXHRcIkNvbW1lbnRcIjogU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCxcbn07XG5cbmV4cG9ydCBjb25zdCBDTV9TeW50YXg6IEVudW1EaWN0aW9uYXJ5PFN1Z2dlc3Rpb25UeXBlLCBbc3RyaW5nLCBzdHJpbmddPiA9IHtcblx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogW1wiK1wiLCBcIitcIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IFtcIi1cIiwgXCItXCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogW1wiflwiLCBcIn5cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBbXCI9XCIsIFwiPVwiXSxcblx0W1N1Z2dlc3Rpb25UeXBlLkNPTU1FTlRdOiBbXCI+XCIsIFwiPFwiXSxcbn07XG5cbmV4cG9ydCBjb25zdCBDTV9BbGxfQnJhY2tldHM6IEVudW1EaWN0aW9uYXJ5PFN1Z2dlc3Rpb25UeXBlLCBzdHJpbmdbXT4gPSB7XG5cdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IFtcInsrK1wiLCBcIisrfVwiXSxcblx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogW1wiey0tXCIsIFwiLS19XCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogW1wie35+XCIsIFwifj5cIiwgXCJ+fn1cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBbXCJ7PT1cIiwgXCI9PX1cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogW1wiez4+XCIsIFwiPDx9XCJdLFxufTtcblxuZXhwb3J0IGNvbnN0IENNX0JyYWNrZXRzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XG5cdFwieysrXCI6IFtcIisrfVwiXSxcblx0XCJ7LS1cIjogW1wiLS19XCJdLFxuXHRcInt+flwiOiBbXCJ+PlwiLCBcIn5+fVwiXSxcblx0XCJ7PT1cIjogW1wiPT19XCJdLFxuXHRcIns+PlwiOiBbXCI8PH1cIl0sXG59O1xuXG5leHBvcnQgY29uc3QgU1VHR0VTVElPTl9JQ09OX01BUFBFUiA9IHtcblx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogXCJwbHVzLWNpcmNsZVwiLFxuXHRbU3VnZ2VzdGlvblR5cGUuREVMRVRJT05dOiBcIm1pbnVzLXNxdWFyZVwiLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogXCJyZXBsYWNlXCIsXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBcImhpZ2hsaWdodGVyXCIsXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogXCJtZXNzYWdlLXNxdWFyZVwiLFxufTtcbiIsICJpbXBvcnQgeyBQcmV2aWV3TW9kZSwgUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTiB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBFZGl0b3JDaGFuZ2UgfSBmcm9tIFwiLi4vZWRpdC1oYW5kbGVyXCI7XG5pbXBvcnQgeyBDTV9BbGxfQnJhY2tldHMsIHR5cGUgU1RSSU5HX1NVR0dFU1RJT05fVFlQRSwgdHlwZSBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIENvbW1lbnRSYW5nZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IHNob3J0SGFuZE1hcHBpbmcgPSB7XG5cdFwiYVwiOiBcImF1dGhvclwiLFxuXHRcInRcIjogXCJ0aW1lXCIsXG5cdFwiZFwiOiBcImRvbmVcIixcblx0XCJzXCI6IFwic3R5bGVcIixcblx0XCJjXCI6IFwiY29sb3JcIixcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFGaWVsZHMge1xuXHRhdXRob3I/OiBzdHJpbmc7XG5cdHRpbWU/OiBudW1iZXI7XG5cdGRvbmU/OiBib29sZWFuO1xuXHRzdHlsZT86IHN0cmluZztcblx0Y29sb3I/OiBzdHJpbmc7XG5cdFtwcm9wOiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCB0eXBlIENyaXRpY01hcmt1cFJhbmdlRW50cnkgPSB7IHBhdGg6IHN0cmluZywgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlIH07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGZpZWxkczogTWV0YWRhdGFGaWVsZHMgPSB7fTtcblx0cmVwbGllczogQ29tbWVudFJhbmdlW10gPSBbXTtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG5cdFx0cHVibGljIGZyb206IG51bWJlcixcblx0XHRwdWJsaWMgdG86IG51bWJlcixcblx0XHRwdWJsaWMgdHlwZTogU3VnZ2VzdGlvblR5cGUsXG5cdFx0cHVibGljIHJlcHI6IFNUUklOR19TVUdHRVNUSU9OX1RZUEUsXG5cdFx0cHVibGljIHRleHQ6IHN0cmluZyxcblx0XHRwdWJsaWMgbWV0YWRhdGE/OiBudW1iZXIsXG5cdCkge1xuXHRcdGlmIChtZXRhZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBtZXRhZGF0YV9zZXBhcmF0b3IgPSBtZXRhZGF0YSAtIGZyb207XG5cdFx0XHRjb25zdCBtZXRhZGF0YV90ZXh0ID0gdGV4dC5zbGljZSgzLCBtZXRhZGF0YV9zZXBhcmF0b3IpO1xuXHRcdFx0dGhpcy50ZXh0ID0gdGV4dC5zbGljZSgwLCAzKSArIHRleHQuc2xpY2UobWV0YWRhdGFfc2VwYXJhdG9yICsgMik7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUT0RPOiBEZXRlcm1pbmUgd2hldGhlciBtZXRhZGF0YSBzcGVjaWZpY2F0aW9uIHNob3VsZCBoYXZlIHF1b3RlcyBhcm91bmQga2V5d29yZHNcblx0XHRcdFx0Ly8gICArIENsZWFuZXIsIHNob3J0ZXJcblx0XHRcdFx0Ly8gICAtIE5vdCB2YWxpZCBKU09OXG5cdFx0XHRcdC8vIFRPRE86IEpTIGNhbiBiZSBpbmplY3RlZCBoZXJlLCBwb3NzaWJsZSBzZWN1cml0eSByaXNrXG5cdFx0XHRcdC8vIHRoaXMuZmllbGRzID0gSlNPTi5wYXJzZShgeyR7bWV0YWRhdGFfdGV4dH19YCk7XG5cdFx0XHRcdHRoaXMuZmllbGRzID0gSlNPTi5wYXJzZShtZXRhZGF0YV90ZXh0KTtcblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gdGhpcy5maWVsZHMpIHtcblx0XHRcdFx0XHRpZiAoa2V5IGluIHNob3J0SGFuZE1hcHBpbmcpIHtcblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmUgKFRoaXMgaXMgYSBwYWluIHRvIHR5cGUsIHRoZSB0cy1pZ25vcmUgaXMgMTAwJSB3b3J0aCBpdClcblx0XHRcdFx0XHRcdHRoaXMuZmllbGRzW3Nob3J0SGFuZE1hcHBpbmdba2V5XV0gPSB0aGlzLmZpZWxkc1trZXldO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuZmllbGRzW2tleSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5maWVsZHNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHQvLyBUT0RPOiBNYXJrIGFzIGludmFsaWQgbWFya2Rvd24gKHRoaXMgY2FuIGhhcHBlbiB3aGVuIHNlcGFyYXRvciBAQCBleGlzdHMsIGJ1dCB7fSBpcyBub3QgZ2l2ZW5cblx0XHRcdFx0dGhpcy5maWVsZHMgPSB7fTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRnZXQgYmFzZV9yYW5nZSgpOiBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRnZXQgZnVsbF90aHJlYWQoKTogQ3JpdGljTWFya3VwUmFuZ2VbXSB7XG5cdFx0cmV0dXJuIFt0aGlzLCAuLi50aGlzLnJlcGxpZXNdO1xuXHR9XG5cblx0Z2V0IHRocmVhZCgpOiBDb21tZW50UmFuZ2VbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLnJlcGxpZXNdO1xuXHR9XG5cblx0Z2V0IGxlbmd0aCgpIHtcblx0XHRyZXR1cm4gdGhpcy50byAtIHRoaXMuZnJvbSAtIDY7XG5cdH1cblxuXHRnZXQgZnVsbF90ZXh0KCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQgKyB0aGlzLnJlcGxpZXMubWFwKHJlcGx5ID0+IHJlcGx5LnRleHQpLmpvaW4oXCJcIik7XG5cdH1cblxuXHQvKipcblx0ICogTG9jYXRpb246IHsqKntcIm1ldGFcIjogXCJkYXRhXCJ9QEBcdTI1OTFzb21lO3RleHQqKn0sIHsqKlx1MjU5MXNvbWUgdGV4dCoqfVxuXHQgKi9cblx0Z2V0IHJhbmdlX3N0YXJ0KCkge1xuXHRcdHJldHVybiB0aGlzLm1ldGFkYXRhID8gdGhpcy5tZXRhZGF0YSArIDIgOiB0aGlzLmZyb20gKyAzO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvY2F0aW9uOiB7Kip7XCJtZXRhXCI6IFwiZGF0YVwifVx1MjU5MUBAc29tZTt0ZXh0Kip9LCBcdTI1OTF7Kipzb21lIHRleHQqKn1cblx0ICovXG5cdGdldCByYW5nZV9mcm9udCgpIHtcblx0XHRyZXR1cm4gdGhpcy5tZXRhZGF0YSA/IHRoaXMubWV0YWRhdGEgLSAxIDogdGhpcy5mcm9tO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvY2F0aW9uOiBcdTI1OTF7Kipzb21lO3RleHQqKn17Pj5jb21tZW50PDx9LCBcdTI1OTF7Kipzb21lIHRleHQqKn1cblx0ICovXG5cdGdldCBmdWxsX3JhbmdlX2Zyb250KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZV9yYW5nZS5mcm9tO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvY2F0aW9uOiB7Kipzb21lO3RleHQqKn17Pj5jb21tZW50PDx9XHUyNTkxLCB7Kipzb21lIHRleHQqKn1cdTI1OTFcblx0ICovXG5cdGdldCBmdWxsX3JhbmdlX2JhY2soKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlX3JhbmdlLnJlcGxpZXMubGVuZ3RoID9cblx0XHRcdHRoaXMuYmFzZV9yYW5nZS5yZXBsaWVzW3RoaXMuYmFzZV9yYW5nZS5yZXBsaWVzLmxlbmd0aCAtIDFdLnRvIDpcblx0XHRcdHRoaXMudG87XG5cdH1cblxuXHRyYW5nZV90eXBlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IFN1Z2dlc3Rpb25UeXBlIHtcblx0XHRyZXR1cm4gdGhpcy50eXBlO1xuXHR9XG5cblx0cmVtb3ZlX21ldGFkYXRhKCk6IEVkaXRvckNoYW5nZVtdIHtcblx0XHRpZiAoIXRoaXMubWV0YWRhdGEpIHJldHVybiBbXTtcblx0XHRyZXR1cm4gW3tcblx0XHRcdGZyb206IHRoaXMuZnJvbSArIDMsXG5cdFx0XHR0bzogdGhpcy5tZXRhZGF0YSArIDIsXG5cdFx0XHRpbnNlcnQ6IFwiXCIsXG5cdFx0fV07XG5cdH1cblxuXHRkZWxldGVfbWV0YWRhdGEoa2V5OiBzdHJpbmcpOiBFZGl0b3JDaGFuZ2VbXSB7XG5cdFx0aWYgKGtleSBpbiBzaG9ydEhhbmRNYXBwaW5nKSBrZXkgPSBzaG9ydEhhbmRNYXBwaW5nW2tleSBhcyBrZXlvZiB0eXBlb2Ygc2hvcnRIYW5kTWFwcGluZ107XG5cblx0XHRpZiAoa2V5IGluIHRoaXMuZmllbGRzKSB7XG5cdFx0XHRkZWxldGUgdGhpcy5maWVsZHNba2V5IGFzIGtleW9mIHR5cGVvZiB0aGlzLmZpZWxkc107XG5cdFx0XHRpZiAoT2JqZWN0LmtleXModGhpcy5maWVsZHMpLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0dGhpcy5yZW1vdmVfbWV0YWRhdGEoKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5zZXRfbWV0YWRhdGEodGhpcy5maWVsZHMpO1xuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRhZGRfbWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogRWRpdG9yQ2hhbmdlW10ge1xuXHRcdHRoaXMuZmllbGRzW2tleSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5maWVsZHNdID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXMuc2V0X21ldGFkYXRhKHRoaXMuZmllbGRzKTtcblx0fVxuXG5cdHNldF9tZXRhZGF0YShmaWVsZHM6IE1ldGFkYXRhRmllbGRzKTogRWRpdG9yQ2hhbmdlW10ge1xuXHRcdC8vIFRPRE86IFBvc3NpYmx5IHJlZHVuZGFudCBhc3NpZ25tZW50LCByYW5nZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCByZS1jb25zdHJ1Y3RlZCB3aXRoIHRoZSBFZGl0b3JDaGFuZ2Vcblx0XHR0aGlzLmZpZWxkcyA9IGZpZWxkcztcblx0XHRpZiAodGhpcy5tZXRhZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gW3tcblx0XHRcdFx0ZnJvbTogdGhpcy5mcm9tICsgMyxcblx0XHRcdFx0dG86IHRoaXMubWV0YWRhdGEsXG5cdFx0XHRcdGluc2VydDogSlNPTi5zdHJpbmdpZnkoZmllbGRzKSxcblx0XHRcdH1dO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gW3tcblx0XHRcdFx0ZnJvbTogdGhpcy5mcm9tICsgMyxcblx0XHRcdFx0dG86IHRoaXMuZnJvbSArIDMsXG5cdFx0XHRcdGluc2VydDogSlNPTi5zdHJpbmdpZnkoZmllbGRzKSArIFwiQEBcIixcblx0XHRcdH1dO1xuXHRcdH1cblx0fVxuXG5cdGhhc19jb21tZW50KHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnRocmVhZC5pbmNsdWRlcyhyYW5nZSBhcyBDb21tZW50UmFuZ2UpO1xuXHR9XG5cblx0Y29weSgpOiBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpLCB0aGlzKTtcblx0fVxuXG5cdGVxdWFscyhvdGhlcjogQ3JpdGljTWFya3VwUmFuZ2UpIHtcblx0XHRyZXR1cm4gdGhpcy50eXBlID09PSBvdGhlci50eXBlICYmIHRoaXMuZnJvbSA9PT0gb3RoZXIuZnJvbSAmJiB0aGlzLnRvID09PSBvdGhlci50byAmJlxuXHRcdFx0dGhpcy5yZXBsaWVzLmxlbmd0aCA9PT0gb3RoZXIucmVwbGllcy5sZW5ndGggJiYgdGhpcy5mdWxsX3RleHQgPT09IG90aGVyLmZ1bGxfdGV4dDtcblx0fVxuXG5cdGxlZnRfYWRqYWNlbnQob3RoZXI6IENyaXRpY01hcmt1cFJhbmdlKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSA9PT0gb3RoZXIudG87XG5cdH1cblxuXHRyaWdodF9hZGphY2VudChvdGhlcjogQ3JpdGljTWFya3VwUmFuZ2UpIHtcblx0XHRyZXR1cm4gdGhpcy50byA9PT0gb3RoZXIuZnJvbTtcblx0fVxuXG5cdHBhcnRfaXNfZW1wdHkobGVmdDogYm9vbGVhbikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGVtcHR5KCkge1xuXHRcdHJldHVybiA2ID09PSB0aGlzLnRvIC0gdGhpcy5mcm9tO1xuXHR9XG5cblx0dW53cmFwKCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQuc2xpY2UoMywgLTMpO1xuXHR9XG5cblx0dW53cmFwX2JyYWNrZXQobGVmdCA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGxlZnQgPyB0aGlzLnRleHQuc2xpY2UoMykgOiB0aGlzLnRleHQuc2xpY2UoMCwgLTMpO1xuXHR9XG5cblx0dW53cmFwX3BhcnRzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gW3RoaXMudW53cmFwKCldO1xuXHR9XG5cblx0dW53cmFwX3NsaWNlKGZyb206IG51bWJlciwgdG86IG51bWJlcikge1xuXHRcdGZyb20gLT0gdGhpcy5yYW5nZV9mcm9udDtcblx0XHR0byAtPSB0aGlzLnJhbmdlX2Zyb250O1xuXHRcdGlmICh0byA8PSAwIHx8IGZyb20gPT09IHRvKSByZXR1cm4gXCJcIjtcblxuXHRcdHJldHVybiB0aGlzLnRleHQuc2xpY2UoTWF0aC5tYXgoMywgZnJvbSksIE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSAzLCB0bykpO1xuXHR9XG5cblx0cGFydGlhbGx5X2luX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG5cdFx0Ly8gcmV0dXJuIHRoaXMuZnJvbSA8IGVuZCAmJiBzdGFydCA8IHRoaXMudG87XG5cdFx0cmV0dXJuICEoc3RhcnQgPiB0aGlzLnRvIHx8IGVuZCA8IHRoaXMuZnJvbSk7XG5cdH1cblxuXHRwYXJ0aWFsbHlfaW5fZnVsbF9yYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuXHRcdHJldHVybiAhKHN0YXJ0ID4gdGhpcy5mdWxsX3JhbmdlX2JhY2sgfHwgZW5kIDwgdGhpcy5mdWxsX3JhbmdlX2Zyb250KTtcblx0fVxuXG5cdGVuY2xvc2VzX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBzdHJpY3QgPSBmYWxzZSkge1xuXHRcdGlmIChzdHJpY3QpIHJldHVybiB0aGlzLmZyb20gPCBzdGFydCAmJiB0aGlzLnRvID4gZW5kO1xuXHRcdHJldHVybiB0aGlzLmZyb20gPD0gc3RhcnQgJiYgdGhpcy50byA+PSBlbmQ7XG5cdH1cblxuXHRwYXJ0X2VuY2xvc2VzX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBsZWZ0OiBib29sZWFuKSB7XG5cdFx0cmV0dXJuIHRoaXMuZW5jbG9zZXNfcmFuZ2Uoc3RhcnQsIGVuZCk7XG5cdH1cblxuXHRhY2NlcHQocmVtb3ZlQ29tbWVudHMgPSB0cnVlKSB7XG5cdFx0cmV0dXJuIHRoaXMudGV4dDtcblx0fVxuXG5cdHJlamVjdChyZW1vdmVDb21tZW50cyA9IHRydWUpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0O1xuXHR9XG5cblx0dG91Y2hlcyhjdXJzb3I6IG51bWJlcikge1xuXHRcdHJldHVybiB0aGlzLmZyb20gPT09IGN1cnNvciB8fCB0aGlzLnRvID09PSBjdXJzb3I7XG5cdH1cblxuXHRjdXJzb3JfaW5zaWRlKGN1cnNvcjogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSA8PSBjdXJzb3IgJiYgY3Vyc29yIDw9IHRoaXMudG87XG5cdH1cblxuXHRjdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcjogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIGN1cnNvciA8IHRoaXMuZnJvbTtcblx0fVxuXG5cdGN1cnNvcl9hZnRlcl9yYW5nZShjdXJzb3I6IG51bWJlcikge1xuXHRcdHJldHVybiBjdXJzb3IgPiB0aGlzLnRvO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1vdmVzIGEgY3Vyc29yIGluc2lkZSB0aGUgZmlyc3Qgbm9uLXN5bnRheC9tZXRhZGF0YSBpZiBpdCBpcyBlaXRoZXIgb3V0c2lkZSB0aGUgcmFuZ2UsIG9yIGluc2lkZSBzeW50YXhcblx0ICogQHBhcmFtIGN1cnNvciBDdXJzb3IgdG8gbW92ZVxuXHQgKiBAcGFyYW0gc2tpcF9tZXRhZGF0YSBXaGV0aGVyIHRvIHNraXAgbWV0YWRhdGFcblx0ICogQHJlbWFyayBDdXJzb3Igd2lsbCBqdW1wIHRvIHJhbmdlIHJlZ2FyZGxlc3Mgd2hldGhlciBpdCBpcyBhZGphY2VudCB0byB0aGUgcmFuZ2Ugb3Igbm90XG5cdCAqL1xuXHRjdXJzb3JfbW92ZV9pbnNpZGUoY3Vyc29yOiBudW1iZXIsIHNraXBfbWV0YWRhdGEgPSBmYWxzZSkge1xuXHRcdHJldHVybiBNYXRoLm1pbihcblx0XHRcdE1hdGgubWF4KChza2lwX21ldGFkYXRhICYmIHRoaXMubWV0YWRhdGEpID8gdGhpcy5tZXRhZGF0YSArIDIgOiB0aGlzLmZyb20gKyAzLCBjdXJzb3IpLFxuXHRcdFx0dGhpcy50byAtIDMsXG5cdFx0KTtcblx0fVxuXG5cdGN1cnNvcl9wYXNzX3N5bnRheChjdXJzb3I6IG51bWJlciwgcmlnaHQ6IGJvb2xlYW4sIHNraXBfbWV0YWRhdGE6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdGlmIChyaWdodCkge1xuXHRcdFx0aWYgKHRoaXMudG91Y2hlc19sZWZ0X2JyYWNrZXQoY3Vyc29yLCB0cnVlLCBmYWxzZSwgc2tpcF9tZXRhZGF0YSkpXG5cdFx0XHRcdGN1cnNvciA9IChza2lwX21ldGFkYXRhICYmIHRoaXMubWV0YWRhdGEpID8gKHRoaXMubWV0YWRhdGEhICsgMikgOiAodGhpcy5mcm9tICsgMyk7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX3JpZ2h0X2JyYWNrZXQoY3Vyc29yLCBmYWxzZSwgdHJ1ZSkpXG5cdFx0XHRcdGN1cnNvciA9IHRoaXMudG87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIHRydWUsIGZhbHNlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy50byAtIDM7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3IsIGZhbHNlLCB0cnVlLCBza2lwX21ldGFkYXRhKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy5mcm9tO1xuXHRcdH1cblx0XHRyZXR1cm4gY3Vyc29yO1xuXHR9XG5cblx0Y3Vyc29yX21vdmVfdGhyb3VnaChjdXJzb3I6IG51bWJlciwgcmlnaHQ6IGJvb2xlYW4sIG1vdmVtZW50OiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OKSB7XG5cdFx0aWYgKG1vdmVtZW50ID09IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uVU5DSEFOR0VEIHx8ICF0aGlzLmN1cnNvcl9pbnNpZGUoY3Vyc29yKSkgeyAvKiBObyBhY3Rpb24gKi8gfVxuXHRcdGVsc2UgaWYgKG1vdmVtZW50ID09IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uSUdOT1JFX0NPTVBMRVRFTFkpXG5cdFx0XHRjdXJzb3IgPSByaWdodCA/IHRoaXMudG8gOiB0aGlzLmZyb207XG5cdFx0ZWxzZVxuXHRcdFx0Y3Vyc29yID0gdGhpcy5jdXJzb3JfcGFzc19zeW50YXgoY3Vyc29yLCByaWdodCwgbW92ZW1lbnQgPT0gUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfTUVUQURBVEEpO1xuXHRcdHJldHVybiBjdXJzb3I7XG5cdH1cblxuXHR0b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3I6IG51bWJlciwgb3V0c2lkZV9sb29zZSA9IGZhbHNlLCBpbnNpZGVfbG9vc2UgPSBmYWxzZSwgaW5jbHVkZV9tZXRhZGF0YSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGN1cnNvciArIChvdXRzaWRlX2xvb3NlID8gMCA6IDEpID49IHRoaXMuZnJvbSAmJlxuXHRcdFx0Y3Vyc29yICsgKGluc2lkZV9sb29zZSA/IDAgOiAxKSA8PVxuXHRcdFx0XHQoKGluY2x1ZGVfbWV0YWRhdGEgJiYgdGhpcy5tZXRhZGF0YSkgPyB0aGlzLm1ldGFkYXRhICsgMiA6IHRoaXMuZnJvbSArIDMpO1xuXHR9XG5cblx0dG91Y2hlc19zZXBhcmF0b3IoY3Vyc29yOiBudW1iZXIsIGxlZnRfbG9vc2UgPSBmYWxzZSwgcmlnaHRfbG9vc2UgPSBmYWxzZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3I6IG51bWJlciwgb3V0c2lkZV9sb29zZSA9IGZhbHNlLCBpbnNpZGVfbG9vc2UgPSBmYWxzZSkge1xuXHRcdHJldHVybiBjdXJzb3IgLSAoaW5zaWRlX2xvb3NlID8gMCA6IDEpID49IHRoaXMudG8gLSAzICYmIGN1cnNvciAtIChvdXRzaWRlX2xvb3NlID8gMCA6IDEpIDw9IHRoaXMudG87XG5cdH1cblxuXHR0b3VjaGVzX2JyYWNrZXQoY3Vyc29yOiBudW1iZXIsIGxlZnQ6IGJvb2xlYW4sIG91dHNpZGVfbG9vc2UgPSBmYWxzZSwgaW5zaWRlX2xvb3NlID0gZmFsc2UpIHtcblx0XHRyZXR1cm4gbGVmdCA/XG5cdFx0XHR0aGlzLnRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvciwgb3V0c2lkZV9sb29zZSwgaW5zaWRlX2xvb3NlKSA6XG5cdFx0XHR0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIG91dHNpZGVfbG9vc2UsIGluc2lkZV9sb29zZSk7XG5cdH1cblxuXHRwb3N0cHJvY2Vzcyhcblx0XHR1bndyYXA6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdHByZXZpZXdNb2RlOiBQcmV2aWV3TW9kZSA9IFByZXZpZXdNb2RlLkFMTCxcblx0XHR0YWc6IGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcCA9IFwiZGl2XCIsXG5cdFx0bGVmdDogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuXHRcdHRleHQ/OiBzdHJpbmcsXG5cdCk6IHN0cmluZyB8IEhUTUxFbGVtZW50IHtcblx0XHRsZXQgc3RyID0gdGV4dCA/PyB0aGlzLnRleHQ7XG5cdFx0aWYgKCF0ZXh0ICYmIHVud3JhcCkge1xuXHRcdFx0aWYgKHRoaXMudG8gPj0gc3RyLmxlbmd0aCAmJiAhc3RyLmVuZHNXaXRoKENNX0FsbF9CcmFja2V0c1t0aGlzLnR5cGVdLmF0KC0xKSEpKVxuXHRcdFx0XHRzdHIgPSB0aGlzLnVud3JhcF9icmFja2V0KHRydWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzdHIgPSB0aGlzLnVud3JhcCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gYDwke3RhZ30gY2xhc3M9J2NtdHItJHt0aGlzLnJlcHIudG9Mb3dlckNhc2UoKX0nPiR7c3RyfTwvJHt0YWd9PmA7XG5cdH1cblxuXHRhcHBseV9vZmZzZXQob2Zmc2V0OiBudW1iZXIpIHtcblx0XHR0aGlzLmZyb20gKz0gb2Zmc2V0O1xuXHRcdHRoaXMudG8gKz0gb2Zmc2V0O1xuXHRcdGlmICh0aGlzLm1ldGFkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMubWV0YWRhdGEgKz0gb2Zmc2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgcmVxdWlyZWQgY2hhcmFjdGVycyB0byBmaXggYSByYW5nZSB3aGVuIHNwbGl0dGluZyBhIHJhbmdlIGF0IGdpdmVuIGN1cnNvciBwb3NpdGlvblxuXHQgKiBAcGFyYW0gY3Vyc29yIEN1cnNvciBwb3NpdGlvbiB0byBzcGxpdCBhdFxuXHQgKi9cblx0c3BsaXRfcmFuZ2UoY3Vyc29yOiBudW1iZXIpOiBbc3RyaW5nLCBzdHJpbmddIHtcblx0XHRyZXR1cm4gW3RoaXMudGV4dC5zbGljZSgtMyksIHRoaXMudGV4dC5zbGljZSgwLCAzKSArICh0aGlzLm1ldGFkYXRhID8gSlNPTi5zdHJpbmdpZnkodGhpcy5maWVsZHMpICsgXCJAQFwiIDogXCJcIildO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgUHJldmlld01vZGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4uL2Jhc2VfcmFuZ2VcIjtcbmltcG9ydCB7IENNX0FsbF9CcmFja2V0cywgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZGl0aW9uUmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlciwgdGV4dDogc3RyaW5nLCBtZXRhZGF0YT86IG51bWJlcikge1xuXHRcdHN1cGVyKGZyb20sIHRvLCBTdWdnZXN0aW9uVHlwZS5BRERJVElPTiwgXCJBZGRpdGlvblwiLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cblxuXHRhY2NlcHQoKSB7XG5cdFx0cmV0dXJuIHRoaXMudW53cmFwKCk7XG5cdH1cblxuXHRyZWplY3QoKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRwb3N0cHJvY2Vzcyhcblx0XHR1bndyYXA6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdHByZXZpZXdNb2RlOiBQcmV2aWV3TW9kZSA9IFByZXZpZXdNb2RlLkFMTCxcblx0XHR0YWc6IGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcCA9IFwiZGl2XCIsXG5cdFx0bGVmdDogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuXHRcdHRleHQ/OiBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzdHIgPSB0ZXh0ID8/IHRoaXMudGV4dDtcblx0XHRpZiAoIXRleHQgJiYgdW53cmFwKSB7XG5cdFx0XHRpZiAodGhpcy50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW3RoaXMudHlwZV0uYXQoLTEpISkpXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwX2JyYWNrZXQodHJ1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwKCk7XG5cdFx0fVxuXG5cdFx0bGV0IGNscyA9IFwiY210ci1wcmV2aWV3XCI7XG5cdFx0aWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BTEwpXG5cdFx0XHRjbHMgKz0gXCIgY210ci1hZGRpdGlvblwiO1xuXHRcdGVsc2UgaWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5SRUpFQ1QpXG5cdFx0XHRzdHIgPSBcIlwiO1xuXG5cdFx0cmV0dXJuIGA8JHt0YWd9IGNsYXNzPScke2Nsc30nPiR7c3RyfTwvJHt0YWd9PmA7XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuLi9iYXNlX3JhbmdlXCI7XG5pbXBvcnQgeyBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29tbWVudFJhbmdlIGV4dGVuZHMgQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRyZXBseV9kZXB0aCA9IDA7XG5cdGF0dGFjaGVkX2NvbW1lbnQ6IENyaXRpY01hcmt1cFJhbmdlIHwgbnVsbCA9IG51bGw7XG5cblx0Z2V0IGJhc2VfcmFuZ2UoKTogQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRcdHJldHVybiB0aGlzLmF0dGFjaGVkX2NvbW1lbnQgfHwgdGhpcztcblx0fVxuXG5cdGdldCB0aHJlYWQoKTogQ29tbWVudFJhbmdlW10ge1xuXHRcdHJldHVybiB0aGlzLmF0dGFjaGVkX2NvbW1lbnQgPyBbLi4udGhpcy5hdHRhY2hlZF9jb21tZW50LnRocmVhZF0gOiBbdGhpcywgLi4udGhpcy5yZXBsaWVzXTtcblx0fVxuXG5cdGFjY2VwdChyZW1vdmVDb21tZW50czogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuXHRcdGlmIChyZW1vdmVDb21tZW50cykge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnVud3JhcCgpO1xuXHRcdH1cblx0fVxuXG5cdHJlamVjdChyZW1vdmVDb21tZW50czogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuXHRcdGlmIChyZW1vdmVDb21tZW50cykge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnVud3JhcCgpO1xuXHRcdH1cblx0fVxuXG5cdGNsZWFyX3JlZmVyZW5jZXMoKSB7XG5cdFx0dGhpcy5hdHRhY2hlZF9jb21tZW50ID0gbnVsbDtcblx0XHR0aGlzLnJlcGx5X2RlcHRoID0gMDtcblx0fVxuXG5cdGFkZF9yZXBseShyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UpIHtcblx0XHR0aGlzLmF0dGFjaF90b19yYW5nZShyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5DT01NRU5UID8gKHJhbmdlIGFzIENvbW1lbnRSYW5nZSkuYmFzZV9yYW5nZSA6IHJhbmdlKTtcblx0fVxuXG5cdGF0dGFjaF90b19yYW5nZShyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UpIHtcblx0XHRyYW5nZS5yZXBsaWVzLnB1c2godGhpcyk7XG5cdFx0dGhpcy5yZXBseV9kZXB0aCA9IHJhbmdlLnJlcGxpZXMubGVuZ3RoIC0gKHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQgPyAwIDogMSk7XG5cdFx0dGhpcy5hdHRhY2hlZF9jb21tZW50ID0gcmFuZ2U7XG5cdH1cblxuXHRjb25zdHJ1Y3Rvcihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHRleHQ6IHN0cmluZywgbWV0YWRhdGE/OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcm9tLCB0bywgU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCwgXCJDb21tZW50XCIsIHRleHQsIG1ldGFkYXRhKTtcblx0fVxufVxuIiwgImltcG9ydCB7IFByZXZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuLi9iYXNlX3JhbmdlXCI7XG5pbXBvcnQgeyBDTV9BbGxfQnJhY2tldHMsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWxldGlvblJhbmdlIGV4dGVuZHMgQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRjb25zdHJ1Y3Rvcihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHRleHQ6IHN0cmluZywgbWV0YWRhdGE/OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcm9tLCB0bywgU3VnZ2VzdGlvblR5cGUuREVMRVRJT04sIFwiRGVsZXRpb25cIiwgdGV4dCwgbWV0YWRhdGEpO1xuXHR9XG5cblx0YWNjZXB0KCkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0cmVqZWN0KCkge1xuXHRcdHJldHVybiB0aGlzLnVud3JhcCgpO1xuXHR9XG5cblx0cG9zdHByb2Nlc3MoXG5cdFx0dW53cmFwOiBib29sZWFuID0gdHJ1ZSxcblx0XHRwcmV2aWV3TW9kZTogUHJldmlld01vZGUgPSBQcmV2aWV3TW9kZS5BTEwsXG5cdFx0dGFnOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAgPSBcImRpdlwiLFxuXHRcdGxlZnQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbCxcblx0XHR0ZXh0Pzogc3RyaW5nLFxuXHQpIHtcblx0XHRsZXQgc3RyID0gdGV4dCA/PyB0aGlzLnRleHQ7XG5cdFx0aWYgKCF0ZXh0ICYmIHVud3JhcCkge1xuXHRcdFx0aWYgKHRoaXMudG8gPj0gc3RyLmxlbmd0aCAmJiAhc3RyLmVuZHNXaXRoKENNX0FsbF9CcmFja2V0c1t0aGlzLnR5cGVdLmF0KC0xKSEpKVxuXHRcdFx0XHRzdHIgPSB0aGlzLnVud3JhcF9icmFja2V0KHRydWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzdHIgPSB0aGlzLnVud3JhcCgpO1xuXHRcdH1cblxuXHRcdGxldCBjbHMgPSBcImNtdHItcHJldmlld1wiO1xuXHRcdGlmIChwcmV2aWV3TW9kZSA9PT0gUHJldmlld01vZGUuQUxMKVxuXHRcdFx0Y2xzICs9IFwiIGNtdHItZGVsZXRpb25cIjtcblx0XHRlbHNlIGlmIChwcmV2aWV3TW9kZSA9PT0gUHJldmlld01vZGUuQUNDRVBUKVxuXHRcdFx0c3RyID0gXCJcIjtcblxuXHRcdHJldHVybiBgPCR7dGFnfSBjbGFzcz0nJHtjbHN9Jz4ke3N0cn08LyR7dGFnfT5gO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UgfSBmcm9tIFwiLi4vYmFzZV9yYW5nZVwiO1xuaW1wb3J0IHsgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIEhpZ2hsaWdodFJhbmdlIGV4dGVuZHMgQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRjb25zdHJ1Y3Rvcihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHRleHQ6IHN0cmluZywgbWV0YWRhdGE/OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcm9tLCB0bywgU3VnZ2VzdGlvblR5cGUuSElHSExJR0hULCBcIkhpZ2hsaWdodFwiLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBQcmV2aWV3TW9kZSB9IGZyb20gXCIuLi8uLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UgfSBmcm9tIFwiLi4vYmFzZV9yYW5nZVwiO1xuaW1wb3J0IHsgQ01fQWxsX0JyYWNrZXRzLCBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgU3Vic3RpdHV0aW9uUmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgcHVibGljIG1pZGRsZTogbnVtYmVyLCB0bzogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIG1ldGFkYXRhPzogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJvbSwgdG8sIFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTiwgXCJTdWJzdGl0dXRpb25cIiwgdGV4dCwgbWV0YWRhdGEpO1xuXHR9XG5cblx0Z2V0IGxlbmd0aCgpIHtcblx0XHRyZXR1cm4gdGhpcy50byAtIHRoaXMuZnJvbSAtIDg7XG5cdH1cblxuXHRnZXQgY2hhcl9taWRkbGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWlkZGxlIC0gdGhpcy5yYW5nZV9mcm9udDtcblx0fVxuXG5cdHJhbmdlX3R5cGUoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIHRvIDw9IHRoaXMubWlkZGxlICsgMiA/XG5cdFx0XHRTdWdnZXN0aW9uVHlwZS5ERUxFVElPTiA6XG5cdFx0XHRmcm9tID49IHRoaXMubWlkZGxlID9cblx0XHRcdFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OIDpcblx0XHRcdFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTjtcblx0fVxuXG5cdHVud3JhcCgpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKDMsIHRoaXMuY2hhcl9taWRkbGUpICsgdGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCAtMyk7XG5cdH1cblxuXHR1bndyYXBfcGFydHMoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdHRoaXMudGV4dC5zbGljZSh0aGlzLmNoYXJfbWlkZGxlICsgMiwgLTMpLFxuXHRcdF07XG5cdH1cblxuXHR1bndyYXBfc2xpY2VfcGFydHNfaW52ZXJ0ZWQoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSB7XG5cdFx0ZnJvbSAtPSB0aGlzLnJhbmdlX2Zyb250O1xuXHRcdHRvIC09IHRoaXMucmFuZ2VfZnJvbnQ7XG5cblx0XHRmcm9tID0gTWF0aC5tYXgoMCwgZnJvbSk7XG5cblx0XHRpZiAodG8gPD0gMCkgcmV0dXJuIHRoaXMudW53cmFwX3BhcnRzKCk7XG5cdFx0aWYgKHRvIDw9IHRoaXMuY2hhcl9taWRkbGUpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCBmcm9tKSArIHRoaXMudGV4dC5zbGljZSh0bywgdGhpcy5jaGFyX21pZGRsZSksXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSh0aGlzLmNoYXJfbWlkZGxlICsgMiwgLTMpLFxuXHRcdFx0XTtcblx0XHR9XG5cdFx0aWYgKGZyb20gPj0gdGhpcy5jaGFyX21pZGRsZSArIDIpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCBmcm9tKSArIHRoaXMudGV4dC5zbGljZSh0bywgLTMpLFxuXHRcdFx0XTtcblx0XHR9XG5cdFx0cmV0dXJuIFtcblx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCBmcm9tKSxcblx0XHRcdHRoaXMudGV4dC5zbGljZSh0bywgLTMpLFxuXHRcdF07XG5cdH1cblxuXHR1bndyYXBfcGFydHNfYnJhY2tldChsZWZ0OiBib29sZWFuLCBvZmZzZXQgPSAwKSB7XG5cdFx0aWYgKGxlZnQpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyKSxcblx0XHRcdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSgwLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCAtMyksXG5cdFx0XHRdO1xuXHRcdH1cblx0fVxuXG5cdHVud3JhcF9zbGljZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcblx0XHRmcm9tIC09IHRoaXMucmFuZ2VfZnJvbnQ7XG5cdFx0dG8gLT0gdGhpcy5yYW5nZV9mcm9udDtcblx0XHRpZiAodG8gPD0gMCB8fCBmcm9tID09PSB0bykgcmV0dXJuIFwiXCI7XG5cblx0XHRpZiAoZnJvbSA+PSB0aGlzLmNoYXJfbWlkZGxlKVxuXHRcdFx0cmV0dXJuIHRoaXMudGV4dC5zbGljZShNYXRoLm1heCh0aGlzLmNoYXJfbWlkZGxlICsgMiwgZnJvbSksIE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSAzLCB0bykpO1xuXHRcdGlmICh0byA8PSB0aGlzLmNoYXJfbWlkZGxlKVxuXHRcdFx0cmV0dXJuIHRoaXMudGV4dC5zbGljZShNYXRoLm1heCgzLCBmcm9tKSwgTWF0aC5taW4odGhpcy5jaGFyX21pZGRsZSwgdG8pKTtcblx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKE1hdGgubWF4KDMsIGZyb20pLCB0aGlzLmNoYXJfbWlkZGxlKSArXG5cdFx0XHR0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIsIE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSAzLCB0bykpO1xuXHR9XG5cblx0YWNjZXB0KCkge1xuXHRcdHJldHVybiB0aGlzLnVud3JhcF9wYXJ0cygpWzFdO1xuXHR9XG5cblx0cmVqZWN0KCkge1xuXHRcdHJldHVybiB0aGlzLnVud3JhcF9wYXJ0cygpWzBdO1xuXHR9XG5cblx0dG91Y2hlc19zZXBhcmF0b3IoY3Vyc29yOiBudW1iZXIsIGxlZnRfbG9vc2UgPSBmYWxzZSwgcmlnaHRfbG9vc2UgPSBmYWxzZSkge1xuXHRcdHJldHVybiBjdXJzb3IgKyAobGVmdF9sb29zZSA/IDEgOiAwKSA+PSB0aGlzLm1pZGRsZSAmJiBjdXJzb3IgLSAocmlnaHRfbG9vc2UgPyAwIDogMSkgPD0gdGhpcy5taWRkbGUgKyAyO1xuXHR9XG5cblx0Y29udGFpbnNfc2VwYXJhdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlcikge1xuXHRcdHJldHVybiBmcm9tIDw9IHRoaXMubWlkZGxlICsgMiAmJiB0byA+PSB0aGlzLm1pZGRsZTtcblx0fVxuXG5cdGNvbnRhaW5zX3BhcnQoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBzdHJpY3QgPSB0cnVlKSB7XG5cdFx0aWYgKHN0cmljdClcblx0XHRcdHJldHVybiB0byA8IHRoaXMubWlkZGxlID8gdHJ1ZSA6IGZyb20gPiB0aGlzLm1pZGRsZSArIDIgPyBmYWxzZSA6IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gdG8gPD0gdGhpcy5taWRkbGUgPyB0cnVlIDogZnJvbSA+PSB0aGlzLm1pZGRsZSArIDIgPyBmYWxzZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdGN1cnNvcl9wYXNzX3N5bnRheChjdXJzb3I6IG51bWJlciwgcmlnaHQ6IGJvb2xlYW4sIHNraXBfbWV0YWRhdGE6IGJvb2xlYW4gPSBmYWxzZSk6IG51bWJlciB7XG5cdFx0aWYgKHJpZ2h0KSB7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3IsIHRydWUsIGZhbHNlLCBza2lwX21ldGFkYXRhKSlcblx0XHRcdFx0Y3Vyc29yID0gKHNraXBfbWV0YWRhdGEgJiYgdGhpcy5tZXRhZGF0YSkgPyAodGhpcy5tZXRhZGF0YSEgKyAyKSA6ICh0aGlzLmZyb20gKyAzKTtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfc2VwYXJhdG9yKGN1cnNvciwgZmFsc2UsIHRydWUpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLm1pZGRsZSArIDI7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX3JpZ2h0X2JyYWNrZXQoY3Vyc29yLCBmYWxzZSwgdHJ1ZSkpXG5cdFx0XHRcdGN1cnNvciA9IHRoaXMudG87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIHRydWUsIGZhbHNlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy50byAtIDM7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX3NlcGFyYXRvcihjdXJzb3IsIGZhbHNlLCB0cnVlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy5taWRkbGU7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3IsIGZhbHNlLCB0cnVlLCBza2lwX21ldGFkYXRhKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy5mcm9tO1xuXHRcdH1cblx0XHRyZXR1cm4gY3Vyc29yO1xuXHR9XG5cblx0cGFydF9lbmNsb3Nlc19yYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgbGVmdDogYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGlmIChsZWZ0KVxuXHRcdFx0cmV0dXJuIHRoaXMuZnJvbSA8PSBzdGFydCAmJiBlbmQgPD0gdGhpcy5taWRkbGUgKyAyO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0aGlzLm1pZGRsZSA8PSBzdGFydCAmJiBlbmQgPD0gdGhpcy50bztcblx0fVxuXG5cdGVtcHR5KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmZyb20gKyAzID09PSB0aGlzLm1pZGRsZSAmJiB0aGlzLm1pZGRsZSArIDIgPT09IHRoaXMudG8gLSAzO1xuXHR9XG5cblx0cGFydF9pc19lbXB0eShsZWZ0OiBib29sZWFuKSB7XG5cdFx0cmV0dXJuIGxlZnQgPyB0aGlzLmZyb20gKyAzID09PSB0aGlzLm1pZGRsZSA6IHRoaXMubWlkZGxlICsgMiA9PT0gdGhpcy50byAtIDM7XG5cdH1cblxuXHRwb3N0cHJvY2Vzcyhcblx0XHR1bndyYXA6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdHByZXZpZXdNb2RlOiBQcmV2aWV3TW9kZSA9IFByZXZpZXdNb2RlLkFMTCxcblx0XHR0YWc6IGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcCA9IFwiZGl2XCIsXG5cdFx0bGVmdDogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuXHRcdHRleHQ/OiBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzdHIgPSB0ZXh0ID8/IHRoaXMudGV4dDtcblx0XHRsZXQgcGFydHM6IHN0cmluZ1tdID0gW3N0cl07XG5cdFx0aWYgKCF0ZXh0ICYmIHVud3JhcCkge1xuXHRcdFx0Ly8gUmFuZ2UgaXMgbGFyZ2VyIHRoYW4gd2hhdCBpcyBhY3R1YWxseSBnaXZlbiAobm8gZW5kIGJyYWNrZXQgZm91bmQgd2l0aGluIHRleHQpXG5cdFx0XHRpZiAodGhpcy50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl1bMl0pKVxuXHRcdFx0XHRwYXJ0cyA9IHRoaXMudW53cmFwX3BhcnRzX2JyYWNrZXQodHJ1ZSk7XG5cdFx0XHRlbHNlIGlmICh0aGlzLmZyb20gPD0gMCAmJiAhc3RyLnN0YXJ0c1dpdGgoQ01fQWxsX0JyYWNrZXRzW1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl1bMF0pKVxuXHRcdFx0XHRwYXJ0cyA9IHRoaXMudW53cmFwX3BhcnRzX2JyYWNrZXQoZmFsc2UpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRwYXJ0cyA9IHRoaXMudW53cmFwX3BhcnRzKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xzID0gXCJjbXRyLXByZXZpZXdcIjtcblx0XHRpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRwYXJ0c1srKGxlZnQgYXMgYm9vbGVhbildID0gcGFydHNbMF07XG5cdFx0XHRwYXJ0c1srIWxlZnRdID0gXCJcIjtcblx0XHR9XG5cblx0XHRzdHIgPSBcIlwiO1xuXHRcdGlmIChwcmV2aWV3TW9kZSA9PT0gUHJldmlld01vZGUuQUxMKSB7XG5cdFx0XHRpZiAocGFydHNbMF0ubGVuZ3RoKVxuXHRcdFx0XHRzdHIgKz0gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSBjbXRyLWRlbGV0aW9uJz4ke3BhcnRzWzBdfTwvJHt0YWd9PmA7XG5cdFx0XHRpZiAocGFydHNbMV0ubGVuZ3RoKVxuXHRcdFx0XHRzdHIgKz0gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSBjbXRyLWFkZGl0aW9uJz4ke3BhcnRzWzFdfTwvJHt0YWd9PmA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChwcmV2aWV3TW9kZSA9PT0gUHJldmlld01vZGUuQUNDRVBUKSB7XG5cdFx0XHRcdGlmIChwYXJ0c1sxXS5sZW5ndGgpXG5cdFx0XHRcdFx0c3RyICs9IGA8JHt0YWd9IGNsYXNzPScke2Nsc30nPiR7cGFydHNbMV19PC8ke3RhZ30+YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChwYXJ0c1swXS5sZW5ndGgpXG5cdFx0XHRcdFx0c3RyICs9IGA8JHt0YWd9IGNsYXNzPScke2Nsc30nPiR7cGFydHNbMF19PC8ke3RhZ30+YDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHN0cjtcblx0fVxuXG5cdGFwcGx5X29mZnNldChvZmZzZXQ6IG51bWJlcikge1xuXHRcdHRoaXMuZnJvbSArPSBvZmZzZXQ7XG5cdFx0dGhpcy5taWRkbGUgKz0gb2Zmc2V0O1xuXHRcdHRoaXMudG8gKz0gb2Zmc2V0O1xuXHRcdGlmICh0aGlzLm1ldGFkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMubWV0YWRhdGEgKz0gb2Zmc2V0O1xuXHR9XG5cblx0c3BsaXRfcmFuZ2UoY3Vyc29yOiBudW1iZXIpOiBbc3RyaW5nLCBzdHJpbmddIHtcblx0XHRjb25zdCByYW5nZSA9IHN1cGVyLnNwbGl0X3JhbmdlKGN1cnNvcik7XG5cdFx0aWYgKGN1cnNvciA8PSB0aGlzLm1pZGRsZSlcblx0XHRcdHJhbmdlWzBdID0gQ01fQWxsX0JyYWNrZXRzLnN1YnN0aXR1dGlvblsxXSArIHJhbmdlWzBdO1xuXHRcdGVsc2Vcblx0XHRcdHJhbmdlWzFdID0gcmFuZ2VbMV0gKyBDTV9BbGxfQnJhY2tldHMuc3Vic3RpdHV0aW9uWzFdO1xuXHRcdHJldHVybiByYW5nZTtcblx0fVxuXG5cdGN1cnNvcl9tb3ZlX2luc2lkZShjdXJzb3I6IG51bWJlciwgc2tpcF9tZXRhZGF0YSA9IGZhbHNlKSB7XG5cdFx0Y3Vyc29yID0gc3VwZXIuY3Vyc29yX21vdmVfaW5zaWRlKGN1cnNvciwgc2tpcF9tZXRhZGF0YSk7XG5cdFx0aWYgKGN1cnNvciA9PSB0aGlzLm1pZGRsZSArIDEpXG5cdFx0XHRjdXJzb3IgPSB0aGlzLm1pZGRsZSArIDI7XG5cdFx0cmV0dXJuIGN1cnNvcjtcblx0fVxufVxuIiwgIi8vIFRoZXNlIGFyZSBmaWxsZWQgd2l0aCByYW5nZXMgKHJhbmdlRnJvbVtpXSB1cCB0byBidXQgbm90IGluY2x1ZGluZ1xuLy8gcmFuZ2VUb1tpXSkgb2YgY29kZSBwb2ludHMgdGhhdCBjb3VudCBhcyBleHRlbmRpbmcgY2hhcmFjdGVycy5cbmxldCByYW5nZUZyb20gPSBbXSwgcmFuZ2VUbyA9IFtdXG5cbjsoKCkgPT4ge1xuICAvLyBDb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBHcmFwaGVtZV9DbHVzdGVyX0JyZWFrPUV4dGVuZFxuICAvLyBpbmZvcm1hdGlvbiBmcm9tXG4gIC8vIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzE2LjAuMC91Y2QvYXV4aWxpYXJ5L0dyYXBoZW1lQnJlYWtQcm9wZXJ0eS50eHQuXG4gIC8vIEVhY2ggcGFpciBvZiBlbGVtZW50cyByZXByZXNlbnRzIGEgcmFuZ2UsIGFzIGFuIG9mZmV0IGZyb20gdGhlXG4gIC8vIHByZXZpb3VzIHJhbmdlIGFuZCBhIGxlbmd0aC4gTnVtYmVycyBhcmUgaW4gYmFzZS0zNiwgd2l0aCB0aGUgZW1wdHlcbiAgLy8gc3RyaW5nIGJlaW5nIGEgc2hvcnRoYW5kIGZvciAxLlxuICBsZXQgbnVtYmVycyA9IFwibGMsMzQsN24sNyw3YiwxOSwsLCwyLCwyLCwsMjAsYiwxYyxsLGcsLDJ0LDcsMiw2LDIsMiwsNCx6LCx1LHIsMmosYiwxbSw5LDksLG8sNCwsOSwsMywsNSwxNywzLDNiLGYsLHcsMWosLCwsNCw4LDQsLDMsNyxhLDIsdCwsMW0sLCwsMiw0LDgsLDksLGEsMixxLCwyLDIsMWwsLDQsMiw0LDIsMiwzLDMsLHUsMiwzLCxiLDIsMWwsLDQsNSwsMiw0LCxrLDIsbSw2LCwsMW0sLCwyLCw0LDgsLDcsMyxhLDIsdSwsMW4sLCwsYywsOSwsMTQsLDMsLDFsLDMsNSwzLCw0LDcsMixiLDIsdCwsMW0sLDIsLDIsLDMsLDUsMiw3LDIsYiwyLHMsMiwxbCwyLCwsMiw0LDgsLDksLGEsMix0LCwyMCwsNCwsMiwzLCwsOCwsMjksLDIsNyxjLDgsMnEsLDIsOSxiLDYsMjIsMixyLCwsLCwsMWosZSwsNSwsMiw1LGIsLDEwLDksLDJ1LDQsLDYsLDIsMiwyLHAsMiw0LDMsZyw0LGQsLDIsMiw2LCxmLCxqaiwzLHFhLDMsdCwzLHQsMix1LDIsMXMsMiwsNyw4LCwyLGIsOSwsMTksMywzYiwyLHksLDNhLDMsNCwyLDksLDYsMyw2MywyLDIsLDFtLCwsNywsLCwsMiw4LDYsYSwyLCwxYyxoLDFyLDQsMWMsNywsLDUsLDE0LDksYywyLHcsNCwyLDIsLDMsMWssLCwyLDMsLCwzLDFtLDgsMiwyLDQ4LDMsLGQsLDcsNCwsNiwsMywyLDVpLDFtLCw1LGVrLCw1Zix4LDJkYSwzLDN4LCwybyx3LGZlLDYsMngsMixuOXcsNCwsYSx3LDIsMjgsMiw3aywsMywsNCwscCwyLDUsLDQ3LDIscSxpLGQsLDEyLDgscCxiLDFhLDMsMWMsLDIsNCwyLDIsMTMsLDF2LDYsMiwyLDIsMixjLCw4LCwxYiwsMWYsLCwzLDIsMiw1LDIsLCwxNiwyLDgsLDZtLCwyLCw0LCxmbjQsLGtoLGcsZyxnLGE2LDIsZ3QsLDZhLCw0NSw1LDFhZSwzLCwyLDUsNCwxNCwzLDQsLDRsLDIsZngsNCxhciwyLDQ5LGIsNHcsLDFpLGYsMWssMywxZCw0LDIsMiwxeCwzLDEwLDUsLDgsMXEsLGMsMiwxZyw5LGEsNCwyLCwybiwzLDIsLCwyLDYsLDRnLCwzLDgsbCwyLDFsLDIsLCwsLG0sLGUsNywzLDUsNWYsOCwyLDMsLCxuLCwyOSwsMiw2LCwsMiwsLDIsLDIsNmosLDIsNCw2LDIsLDIsciwyLDJkLDgsMiwsLDIsMnksLCwsMiw2LCwsMnQsMywyLDQsLDUsNzcsOSwsMiw2dCwsYSwyLCwsNCwsNDAsNCwyLDIsNCwsdyxhLDE0LDYsMiw0LDgsLDksNiwyLDMsMWEsZCwsMixiYSw3LCw2LCwsMmEsbSwyLDcsLDIsLDIsM2UsNiwzLCwsMiwsNywsLDIwLDIsMywsLCw5biwyLGYwYiw1LDFuLDcsdDQsLDFyLDQsMjksLGY1aywyLDQzcSwsLDMsNCw1LDgsOCwyLDcsdSw0LDQ0LDMsMWl6LDFqLDQsMWUsOCwsZSwsbSw1LCxmLDExcyw3LCxoLDIsNywsMiwsNSw3OSw3LGM1LDQsMTVzLDcsMzEsNywyNDAsNSxneDdrLDJvLDNrLDZvXCIuc3BsaXQoXCIsXCIpLm1hcChzID0+IHMgPyBwYXJzZUludChzLCAzNikgOiAxKVxuICBmb3IgKGxldCBpID0gMCwgbiA9IDA7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKVxuICAgIChpICUgMiA/IHJhbmdlVG8gOiByYW5nZUZyb20pLnB1c2gobiA9IG4gKyBudW1iZXJzW2ldKVxufSkoKVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlbmRpbmdDaGFyKGNvZGUpIHtcbiAgaWYgKGNvZGUgPCA3NjgpIHJldHVybiBmYWxzZVxuICBmb3IgKGxldCBmcm9tID0gMCwgdG8gPSByYW5nZUZyb20ubGVuZ3RoOzspIHtcbiAgICBsZXQgbWlkID0gKGZyb20gKyB0bykgPj4gMVxuICAgIGlmIChjb2RlIDwgcmFuZ2VGcm9tW21pZF0pIHRvID0gbWlkXG4gICAgZWxzZSBpZiAoY29kZSA+PSByYW5nZVRvW21pZF0pIGZyb20gPSBtaWQgKyAxXG4gICAgZWxzZSByZXR1cm4gdHJ1ZVxuICAgIGlmIChmcm9tID09IHRvKSByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlZ2lvbmFsSW5kaWNhdG9yKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUgPj0gMHgxRjFFNiAmJiBjb2RlIDw9IDB4MUYxRkZcbn1cblxuZnVuY3Rpb24gY2hlY2soY29kZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlRnJvbS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyYW5nZVRvW2ldID4gY29kZSkgcmV0dXJuIHJhbmdlRnJvbVtpXSA8PSBjb2RlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IFpXSiA9IDB4MjAwZFxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENsdXN0ZXJCcmVhayhzdHIsIHBvcywgZm9yd2FyZCA9IHRydWUsIGluY2x1ZGVFeHRlbmRpbmcgPSB0cnVlKSB7XG4gIHJldHVybiAoZm9yd2FyZCA/IG5leHRDbHVzdGVyQnJlYWsgOiBwcmV2Q2x1c3RlckJyZWFrKShzdHIsIHBvcywgaW5jbHVkZUV4dGVuZGluZylcbn1cblxuZnVuY3Rpb24gbmV4dENsdXN0ZXJCcmVhayhzdHIsIHBvcywgaW5jbHVkZUV4dGVuZGluZykge1xuICBpZiAocG9zID09IHN0ci5sZW5ndGgpIHJldHVybiBwb3NcbiAgLy8gSWYgcG9zIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBzdXJyb2dhdGUgcGFpciwgbW92ZSB0byBpdHMgc3RhcnRcbiAgaWYgKHBvcyAmJiBzdXJyb2dhdGVMb3coc3RyLmNoYXJDb2RlQXQocG9zKSkgJiYgc3Vycm9nYXRlSGlnaChzdHIuY2hhckNvZGVBdChwb3MgLSAxKSkpIHBvcy0tXG4gIGxldCBwcmV2ID0gY29kZVBvaW50QXQoc3RyLCBwb3MpXG4gIHBvcyArPSBjb2RlUG9pbnRTaXplKHByZXYpXG4gIHdoaWxlIChwb3MgPCBzdHIubGVuZ3RoKSB7XG4gICAgbGV0IG5leHQgPSBjb2RlUG9pbnRBdChzdHIsIHBvcylcbiAgICBpZiAocHJldiA9PSBaV0ogfHwgbmV4dCA9PSBaV0ogfHwgaW5jbHVkZUV4dGVuZGluZyAmJiBpc0V4dGVuZGluZ0NoYXIobmV4dCkpIHtcbiAgICAgIHBvcyArPSBjb2RlUG9pbnRTaXplKG5leHQpXG4gICAgICBwcmV2ID0gbmV4dFxuICAgIH0gZWxzZSBpZiAoaXNSZWdpb25hbEluZGljYXRvcihuZXh0KSkge1xuICAgICAgbGV0IGNvdW50QmVmb3JlID0gMCwgaSA9IHBvcyAtIDJcbiAgICAgIHdoaWxlIChpID49IDAgJiYgaXNSZWdpb25hbEluZGljYXRvcihjb2RlUG9pbnRBdChzdHIsIGkpKSkgeyBjb3VudEJlZm9yZSsrOyBpIC09IDIgfVxuICAgICAgaWYgKGNvdW50QmVmb3JlICUgMiA9PSAwKSBicmVha1xuICAgICAgZWxzZSBwb3MgKz0gMlxuICAgIH0gZWxzZSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcG9zXG59XG5cbmZ1bmN0aW9uIHByZXZDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGluY2x1ZGVFeHRlbmRpbmcpIHtcbiAgd2hpbGUgKHBvcyA+IDApIHtcbiAgICBsZXQgZm91bmQgPSBuZXh0Q2x1c3RlckJyZWFrKHN0ciwgcG9zIC0gMiwgaW5jbHVkZUV4dGVuZGluZylcbiAgICBpZiAoZm91bmQgPCBwb3MpIHJldHVybiBmb3VuZFxuICAgIHBvcy0tXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuZnVuY3Rpb24gY29kZVBvaW50QXQoc3RyLCBwb3MpIHtcbiAgbGV0IGNvZGUwID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICBpZiAoIXN1cnJvZ2F0ZUhpZ2goY29kZTApIHx8IHBvcyArIDEgPT0gc3RyLmxlbmd0aCkgcmV0dXJuIGNvZGUwXG4gIGxldCBjb2RlMSA9IHN0ci5jaGFyQ29kZUF0KHBvcyArIDEpXG4gIGlmICghc3Vycm9nYXRlTG93KGNvZGUxKSkgcmV0dXJuIGNvZGUwXG4gIHJldHVybiAoKGNvZGUwIC0gMHhkODAwKSA8PCAxMCkgKyAoY29kZTEgLSAweGRjMDApICsgMHgxMDAwMFxufVxuXG5mdW5jdGlvbiBzdXJyb2dhdGVMb3coY2gpIHsgcmV0dXJuIGNoID49IDB4REMwMCAmJiBjaCA8IDB4RTAwMCB9XG5mdW5jdGlvbiBzdXJyb2dhdGVIaWdoKGNoKSB7IHJldHVybiBjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDAgfVxuZnVuY3Rpb24gY29kZVBvaW50U2l6ZShjb2RlKSB7IHJldHVybiBjb2RlIDwgMHgxMDAwMCA/IDEgOiAyIH1cbiIsICJpbXBvcnQgeyBmaW5kQ2x1c3RlckJyZWFrIGFzIGZpbmRDbHVzdGVyQnJlYWskMSB9IGZyb20gJ0BtYXJpam4vZmluZC1jbHVzdGVyLWJyZWFrJztcblxuLyoqXG5UaGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGRvY3VtZW50cy4gQG5vbmFic3RyYWN0XG4qL1xuY2xhc3MgVGV4dCB7XG4gICAgLyoqXG4gICAgR2V0IHRoZSBsaW5lIGRlc2NyaXB0aW9uIGFyb3VuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBsaW5lQXQocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPCAwIHx8IHBvcyA+IHRoaXMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgcG9zaXRpb24gJHtwb3N9IGluIGRvY3VtZW50IG9mIGxlbmd0aCAke3RoaXMubGVuZ3RofWApO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5uZXIocG9zLCBmYWxzZSwgMSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBnaXZlbiAoMS1iYXNlZCkgbGluZSBudW1iZXIuXG4gICAgKi9cbiAgICBsaW5lKG4pIHtcbiAgICAgICAgaWYgKG4gPCAxIHx8IG4gPiB0aGlzLmxpbmVzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgbGluZSBudW1iZXIgJHtufSBpbiAke3RoaXMubGluZXN9LWxpbmUgZG9jdW1lbnRgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUlubmVyKG4sIHRydWUsIDEsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIGEgcmFuZ2Ugb2YgdGhlIHRleHQgd2l0aCB0aGUgZ2l2ZW4gY29udGVudC5cbiAgICAqL1xuICAgIHJlcGxhY2UoZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2UoMCwgZnJvbSwgcGFydHMsIDIgLyogT3Blbi5UbyAqLyk7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aClcbiAgICAgICAgICAgIHRleHQuZGVjb21wb3NlKDAsIHRleHQubGVuZ3RoLCBwYXJ0cywgMSAvKiBPcGVuLkZyb20gKi8gfCAyIC8qIE9wZW4uVG8gKi8pO1xuICAgICAgICB0aGlzLmRlY29tcG9zZSh0bywgdGhpcy5sZW5ndGgsIHBhcnRzLCAxIC8qIE9wZW4uRnJvbSAqLyk7XG4gICAgICAgIHJldHVybiBUZXh0Tm9kZS5mcm9tKHBhcnRzLCB0aGlzLmxlbmd0aCAtICh0byAtIGZyb20pICsgdGV4dC5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBlbmQgYW5vdGhlciBkb2N1bWVudCB0byB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGFwcGVuZChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKHRoaXMubGVuZ3RoLCB0aGlzLmxlbmd0aCwgb3RoZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBnaXZlbiBwb2ludHMuXG4gICAgKi9cbiAgICBzbGljZShmcm9tLCB0byA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG4gICAgICAgIHRoaXMuZGVjb21wb3NlKGZyb20sIHRvLCBwYXJ0cywgMCk7XG4gICAgICAgIHJldHVybiBUZXh0Tm9kZS5mcm9tKHBhcnRzLCB0byAtIGZyb20pO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhpcyB0ZXh0IGlzIGVxdWFsIHRvIGFub3RoZXIgaW5zdGFuY2UuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgPT0gdGhpcylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob3RoZXIubGVuZ3RoICE9IHRoaXMubGVuZ3RoIHx8IG90aGVyLmxpbmVzICE9IHRoaXMubGluZXMpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMuc2NhbklkZW50aWNhbChvdGhlciwgMSksIGVuZCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5zY2FuSWRlbnRpY2FsKG90aGVyLCAtMSk7XG4gICAgICAgIGxldCBhID0gbmV3IFJhd1RleHRDdXJzb3IodGhpcyksIGIgPSBuZXcgUmF3VGV4dEN1cnNvcihvdGhlcik7XG4gICAgICAgIGZvciAobGV0IHNraXAgPSBzdGFydCwgcG9zID0gc3RhcnQ7Oykge1xuICAgICAgICAgICAgYS5uZXh0KHNraXApO1xuICAgICAgICAgICAgYi5uZXh0KHNraXApO1xuICAgICAgICAgICAgc2tpcCA9IDA7XG4gICAgICAgICAgICBpZiAoYS5saW5lQnJlYWsgIT0gYi5saW5lQnJlYWsgfHwgYS5kb25lICE9IGIuZG9uZSB8fCBhLnZhbHVlICE9IGIudmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcG9zICs9IGEudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGEuZG9uZSB8fCBwb3MgPj0gZW5kKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgdGV4dC4gV2hlbiBgZGlyYCBpcyBgLTFgLCBpdGVyYXRpb24gaGFwcGVuc1xuICAgIGZyb20gZW5kIHRvIHN0YXJ0LiBUaGlzIHdpbGwgcmV0dXJuIGxpbmVzIGFuZCB0aGUgYnJlYWtzIGJldHdlZW5cbiAgICB0aGVtIGFzIHNlcGFyYXRlIHN0cmluZ3MuXG4gICAgKi9cbiAgICBpdGVyKGRpciA9IDEpIHsgcmV0dXJuIG5ldyBSYXdUZXh0Q3Vyc29yKHRoaXMsIGRpcik7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgYSByYW5nZSBvZiB0aGUgdGV4dC4gV2hlbiBgZnJvbWAgPiBgdG9gLCB0aGVcbiAgICBpdGVyYXRvciB3aWxsIHJ1biBpbiByZXZlcnNlLlxuICAgICovXG4gICAgaXRlclJhbmdlKGZyb20sIHRvID0gdGhpcy5sZW5ndGgpIHsgcmV0dXJuIG5ldyBQYXJ0aWFsVGV4dEN1cnNvcih0aGlzLCBmcm9tLCB0byk7IH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBjdXJzb3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBnaXZlbiByYW5nZSBvZiBsaW5lcyxcbiAgICBfd2l0aG91dF8gcmV0dXJuaW5nIHRoZSBsaW5lIGJyZWFrcyBiZXR3ZWVuLCBhbmQgeWllbGRpbmcgZW1wdHlcbiAgICBzdHJpbmdzIGZvciBlbXB0eSBsaW5lcy5cbiAgICBcbiAgICBXaGVuIGBmcm9tYCBhbmQgYHRvYCBhcmUgZ2l2ZW4sIHRoZXkgc2hvdWxkIGJlIDEtYmFzZWQgbGluZSBudW1iZXJzLlxuICAgICovXG4gICAgaXRlckxpbmVzKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBpbm5lcjtcbiAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgaW5uZXIgPSB0aGlzLml0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0byA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHRvID0gdGhpcy5saW5lcyArIDE7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmxpbmUoZnJvbSkuZnJvbTtcbiAgICAgICAgICAgIGlubmVyID0gdGhpcy5pdGVyUmFuZ2Uoc3RhcnQsIE1hdGgubWF4KHN0YXJ0LCB0byA9PSB0aGlzLmxpbmVzICsgMSA/IHRoaXMubGVuZ3RoIDogdG8gPD0gMSA/IDAgOiB0aGlzLmxpbmUodG8gLSAxKS50bykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTGluZUN1cnNvcihpbm5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgZG9jdW1lbnQgYXMgYSBzdHJpbmcsIHVzaW5nIG5ld2xpbmUgY2hhcmFjdGVycyB0b1xuICAgIHNlcGFyYXRlIGxpbmVzLlxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLnNsaWNlU3RyaW5nKDApOyB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGUgZG9jdW1lbnQgdG8gYW4gYXJyYXkgb2YgbGluZXMgKHdoaWNoIGNhbiBiZVxuICAgIGRlc2VyaWFsaXplZCBhZ2FpbiB2aWEgW2BUZXh0Lm9mYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UZXh0Xm9mKSkuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmZsYXR0ZW4obGluZXMpO1xuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBgVGV4dGAgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBsaW5lcy5cbiAgICAqL1xuICAgIHN0YXRpYyBvZih0ZXh0KSB7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBIGRvY3VtZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbGluZVwiKTtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDEgJiYgIXRleHRbMF0pXG4gICAgICAgICAgICByZXR1cm4gVGV4dC5lbXB0eTtcbiAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoIDw9IDMyIC8qIFRyZWUuQnJhbmNoICovID8gbmV3IFRleHRMZWFmKHRleHQpIDogVGV4dE5vZGUuZnJvbShUZXh0TGVhZi5zcGxpdCh0ZXh0LCBbXSkpO1xuICAgIH1cbn1cbi8vIExlYXZlcyBzdG9yZSBhbiBhcnJheSBvZiBsaW5lIHN0cmluZ3MuIFRoZXJlIGFyZSBhbHdheXMgbGluZSBicmVha3Ncbi8vIGJldHdlZW4gdGhlc2Ugc3RyaW5ncy4gTGVhdmVzIGFyZSBsaW1pdGVkIGluIHNpemUgYW5kIGhhdmUgdG8gYmVcbi8vIGNvbnRhaW5lZCBpbiBUZXh0Tm9kZSBpbnN0YW5jZXMgZm9yIGJpZ2dlciBkb2N1bWVudHMuXG5jbGFzcyBUZXh0TGVhZiBleHRlbmRzIFRleHQge1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIGxlbmd0aCA9IHRleHRMZW5ndGgodGV4dCkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgfVxuICAgIGdldCBsaW5lcygpIHsgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7IH1cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiBudWxsOyB9XG4gICAgbGluZUlubmVyKHRhcmdldCwgaXNMaW5lLCBsaW5lLCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdHJpbmcgPSB0aGlzLnRleHRbaV0sIGVuZCA9IG9mZnNldCArIHN0cmluZy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoKGlzTGluZSA/IGxpbmUgOiBlbmQpID49IHRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmUob2Zmc2V0LCBlbmQsIGxpbmUsIHN0cmluZyk7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQgKyAxO1xuICAgICAgICAgICAgbGluZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlY29tcG9zZShmcm9tLCB0bywgdGFyZ2V0LCBvcGVuKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gZnJvbSA8PSAwICYmIHRvID49IHRoaXMubGVuZ3RoID8gdGhpc1xuICAgICAgICAgICAgOiBuZXcgVGV4dExlYWYoc2xpY2VUZXh0KHRoaXMudGV4dCwgZnJvbSwgdG8pLCBNYXRoLm1pbih0bywgdGhpcy5sZW5ndGgpIC0gTWF0aC5tYXgoMCwgZnJvbSkpO1xuICAgICAgICBpZiAob3BlbiAmIDEgLyogT3Blbi5Gcm9tICovKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IHRhcmdldC5wb3AoKTtcbiAgICAgICAgICAgIGxldCBqb2luZWQgPSBhcHBlbmRUZXh0KHRleHQudGV4dCwgcHJldi50ZXh0LnNsaWNlKCksIDAsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChqb2luZWQubGVuZ3RoIDw9IDMyIC8qIFRyZWUuQnJhbmNoICovKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKGpvaW5lZCwgcHJldi5sZW5ndGggKyB0ZXh0Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1pZCA9IGpvaW5lZC5sZW5ndGggPj4gMTtcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYoam9pbmVkLnNsaWNlKDAsIG1pZCkpLCBuZXcgVGV4dExlYWYoam9pbmVkLnNsaWNlKG1pZCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFRleHRMZWFmKSlcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKGZyb20sIHRvLCB0ZXh0KTtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgbGluZXMgPSBhcHBlbmRUZXh0KHRoaXMudGV4dCwgYXBwZW5kVGV4dCh0ZXh0LnRleHQsIHNsaWNlVGV4dCh0aGlzLnRleHQsIDAsIGZyb20pKSwgdG8pO1xuICAgICAgICBsZXQgbmV3TGVuID0gdGhpcy5sZW5ndGggKyB0ZXh0Lmxlbmd0aCAtICh0byAtIGZyb20pO1xuICAgICAgICBpZiAobGluZXMubGVuZ3RoIDw9IDMyIC8qIFRyZWUuQnJhbmNoICovKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0TGVhZihsaW5lcywgbmV3TGVuKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20oVGV4dExlYWYuc3BsaXQobGluZXMsIFtdKSwgbmV3TGVuKTtcbiAgICB9XG4gICAgc2xpY2VTdHJpbmcoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCwgbGluZVNlcCA9IFwiXFxuXCIpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDA7IHBvcyA8PSB0byAmJiBpIDwgdGhpcy50ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHRoaXMudGV4dFtpXSwgZW5kID0gcG9zICsgbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBpKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lU2VwO1xuICAgICAgICAgICAgaWYgKGZyb20gPCBlbmQgJiYgdG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUuc2xpY2UoTWF0aC5tYXgoMCwgZnJvbSAtIHBvcyksIHRvIC0gcG9zKTtcbiAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmxhdHRlbih0YXJnZXQpIHtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0aGlzLnRleHQpXG4gICAgICAgICAgICB0YXJnZXQucHVzaChsaW5lKTtcbiAgICB9XG4gICAgc2NhbklkZW50aWNhbCgpIHsgcmV0dXJuIDA7IH1cbiAgICBzdGF0aWMgc3BsaXQodGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBwYXJ0ID0gW10sIGxlbiA9IC0xO1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRleHQpIHtcbiAgICAgICAgICAgIHBhcnQucHVzaChsaW5lKTtcbiAgICAgICAgICAgIGxlbiArPSBsaW5lLmxlbmd0aCArIDE7XG4gICAgICAgICAgICBpZiAocGFydC5sZW5ndGggPT0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYocGFydCwgbGVuKSk7XG4gICAgICAgICAgICAgICAgcGFydCA9IFtdO1xuICAgICAgICAgICAgICAgIGxlbiA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsZW4gPiAtMSlcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihwYXJ0LCBsZW4pKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG59XG4vLyBOb2RlcyBwcm92aWRlIHRoZSB0cmVlIHN0cnVjdHVyZSBvZiB0aGUgYFRleHRgIHR5cGUuIFRoZXkgc3RvcmUgYVxuLy8gbnVtYmVyIG9mIG90aGVyIG5vZGVzIG9yIGxlYXZlcywgdGFraW5nIGNhcmUgdG8gYmFsYW5jZSB0aGVtc2VsdmVzXG4vLyBvbiBjaGFuZ2VzLiBUaGVyZSBhcmUgaW1wbGllZCBsaW5lIGJyZWFrcyBfYmV0d2Vlbl8gdGhlIGNoaWxkcmVuIG9mXG4vLyBhIG5vZGUgKGJ1dCBub3QgYmVmb3JlIHRoZSBmaXJzdCBvciBhZnRlciB0aGUgbGFzdCBjaGlsZCkuXG5jbGFzcyBUZXh0Tm9kZSBleHRlbmRzIFRleHQge1xuICAgIGNvbnN0cnVjdG9yKGNoaWxkcmVuLCBsZW5ndGgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5saW5lcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgdGhpcy5saW5lcyArPSBjaGlsZC5saW5lcztcbiAgICB9XG4gICAgbGluZUlubmVyKHRhcmdldCwgaXNMaW5lLCBsaW5lLCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLmxlbmd0aCwgZW5kTGluZSA9IGxpbmUgKyBjaGlsZC5saW5lcyAtIDE7XG4gICAgICAgICAgICBpZiAoKGlzTGluZSA/IGVuZExpbmUgOiBlbmQpID49IHRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQubGluZUlubmVyKHRhcmdldCwgaXNMaW5lLCBsaW5lLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kICsgMTtcbiAgICAgICAgICAgIGxpbmUgPSBlbmRMaW5lICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWNvbXBvc2UoZnJvbSwgdG8sIHRhcmdldCwgb3Blbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgcG9zIDw9IHRvICYmIGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZnJvbSA8PSBlbmQgJiYgdG8gPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkT3BlbiA9IG9wZW4gJiAoKHBvcyA8PSBmcm9tID8gMSAvKiBPcGVuLkZyb20gKi8gOiAwKSB8IChlbmQgPj0gdG8gPyAyIC8qIE9wZW4uVG8gKi8gOiAwKSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBmcm9tICYmIGVuZCA8PSB0byAmJiAhY2hpbGRPcGVuKVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5kZWNvbXBvc2UoZnJvbSAtIHBvcywgdG8gLSBwb3MsIHRhcmdldCwgY2hpbGRPcGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGlmICh0ZXh0LmxpbmVzIDwgdGhpcy5saW5lcylcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAvLyBGYXN0IHBhdGg6IGlmIHRoZSBjaGFuZ2Ugb25seSBhZmZlY3RzIG9uZSBjaGlsZCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgLy8gY2hpbGQncyBzaXplIHJlbWFpbnMgaW4gdGhlIGFjY2VwdGFibGUgcmFuZ2UsIG9ubHkgdXBkYXRlXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChmcm9tID49IHBvcyAmJiB0byA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBjaGlsZC5yZXBsYWNlKGZyb20gLSBwb3MsIHRvIC0gcG9zLCB0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsTGluZXMgPSB0aGlzLmxpbmVzIC0gY2hpbGQubGluZXMgKyB1cGRhdGVkLmxpbmVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZC5saW5lcyA8ICh0b3RhbExpbmVzID4+ICg1IC8qIFRyZWUuQnJhbmNoU2hpZnQgKi8gLSAxKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQubGluZXMgPiAodG90YWxMaW5lcyA+PiAoNSAvKiBUcmVlLkJyYW5jaFNoaWZ0ICovICsgMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29weSA9IHRoaXMuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlbaV0gPSB1cGRhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0Tm9kZShjb3B5LCB0aGlzLmxlbmd0aCAtICh0byAtIGZyb20pICsgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKHBvcywgZW5kLCB1cGRhdGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UoZnJvbSwgdG8sIHRleHQpO1xuICAgIH1cbiAgICBzbGljZVN0cmluZyhmcm9tLCB0byA9IHRoaXMubGVuZ3RoLCBsaW5lU2VwID0gXCJcXG5cIikge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHBvcyA8PSB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBpKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lU2VwO1xuICAgICAgICAgICAgaWYgKGZyb20gPCBlbmQgJiYgdG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNoaWxkLnNsaWNlU3RyaW5nKGZyb20gLSBwb3MsIHRvIC0gcG9zLCBsaW5lU2VwKTtcbiAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmxhdHRlbih0YXJnZXQpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIGNoaWxkLmZsYXR0ZW4odGFyZ2V0KTtcbiAgICB9XG4gICAgc2NhbklkZW50aWNhbChvdGhlciwgZGlyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVGV4dE5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBsZW5ndGggPSAwO1xuICAgICAgICBsZXQgW2lBLCBpQiwgZUEsIGVCXSA9IGRpciA+IDAgPyBbMCwgMCwgdGhpcy5jaGlsZHJlbi5sZW5ndGgsIG90aGVyLmNoaWxkcmVuLmxlbmd0aF1cbiAgICAgICAgICAgIDogW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgb3RoZXIuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgLTEsIC0xXTtcbiAgICAgICAgZm9yICg7OyBpQSArPSBkaXIsIGlCICs9IGRpcikge1xuICAgICAgICAgICAgaWYgKGlBID09IGVBIHx8IGlCID09IGVCKVxuICAgICAgICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgICAgICBsZXQgY2hBID0gdGhpcy5jaGlsZHJlbltpQV0sIGNoQiA9IG90aGVyLmNoaWxkcmVuW2lCXTtcbiAgICAgICAgICAgIGlmIChjaEEgIT0gY2hCKVxuICAgICAgICAgICAgICAgIHJldHVybiBsZW5ndGggKyBjaEEuc2NhbklkZW50aWNhbChjaEIsIGRpcik7XG4gICAgICAgICAgICBsZW5ndGggKz0gY2hBLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGZyb20oY2hpbGRyZW4sIGxlbmd0aCA9IGNoaWxkcmVuLnJlZHVjZSgobCwgY2gpID0+IGwgKyBjaC5sZW5ndGggKyAxLCAtMSkpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gMDtcbiAgICAgICAgZm9yIChsZXQgY2ggb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBsaW5lcyArPSBjaC5saW5lcztcbiAgICAgICAgaWYgKGxpbmVzIDwgMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgIGxldCBmbGF0ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBjaCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjaC5mbGF0dGVuKGZsYXQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0TGVhZihmbGF0LCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjaHVuayA9IE1hdGgubWF4KDMyIC8qIFRyZWUuQnJhbmNoICovLCBsaW5lcyA+PiA1IC8qIFRyZWUuQnJhbmNoU2hpZnQgKi8pLCBtYXhDaHVuayA9IGNodW5rIDw8IDEsIG1pbkNodW5rID0gY2h1bmsgPj4gMTtcbiAgICAgICAgbGV0IGNodW5rZWQgPSBbXSwgY3VycmVudExpbmVzID0gMCwgY3VycmVudExlbiA9IC0xLCBjdXJyZW50Q2h1bmsgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkKGNoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbGFzdDtcbiAgICAgICAgICAgIGlmIChjaGlsZC5saW5lcyA+IG1heENodW5rICYmIGNoaWxkIGluc3RhbmNlb2YgVGV4dE5vZGUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBub2RlIG9mIGNoaWxkLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgICAgICBhZGQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZC5saW5lcyA+IG1pbkNodW5rICYmIChjdXJyZW50TGluZXMgPiBtaW5DaHVuayB8fCAhY3VycmVudExpbmVzKSkge1xuICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgY2h1bmtlZC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dExlYWYgJiYgY3VycmVudExpbmVzICYmXG4gICAgICAgICAgICAgICAgKGxhc3QgPSBjdXJyZW50Q2h1bmtbY3VycmVudENodW5rLmxlbmd0aCAtIDFdKSBpbnN0YW5jZW9mIFRleHRMZWFmICYmXG4gICAgICAgICAgICAgICAgY2hpbGQubGluZXMgKyBsYXN0LmxpbmVzIDw9IDMyIC8qIFRyZWUuQnJhbmNoICovKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVzICs9IGNoaWxkLmxpbmVzO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMZW4gKz0gY2hpbGQubGVuZ3RoICsgMTtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q2h1bmtbY3VycmVudENodW5rLmxlbmd0aCAtIDFdID0gbmV3IFRleHRMZWFmKGxhc3QudGV4dC5jb25jYXQoY2hpbGQudGV4dCksIGxhc3QubGVuZ3RoICsgMSArIGNoaWxkLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudExpbmVzICsgY2hpbGQubGluZXMgPiBjaHVuaylcbiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZXMgKz0gY2hpbGQubGluZXM7XG4gICAgICAgICAgICAgICAgY3VycmVudExlbiArPSBjaGlsZC5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuay5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZXMgPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjaHVua2VkLnB1c2goY3VycmVudENodW5rLmxlbmd0aCA9PSAxID8gY3VycmVudENodW5rWzBdIDogVGV4dE5vZGUuZnJvbShjdXJyZW50Q2h1bmssIGN1cnJlbnRMZW4pKTtcbiAgICAgICAgICAgIGN1cnJlbnRMZW4gPSAtMTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lcyA9IGN1cnJlbnRDaHVuay5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgYWRkKGNoaWxkKTtcbiAgICAgICAgZmx1c2goKTtcbiAgICAgICAgcmV0dXJuIGNodW5rZWQubGVuZ3RoID09IDEgPyBjaHVua2VkWzBdIDogbmV3IFRleHROb2RlKGNodW5rZWQsIGxlbmd0aCk7XG4gICAgfVxufVxuVGV4dC5lbXB0eSA9IC8qQF9fUFVSRV9fKi9uZXcgVGV4dExlYWYoW1wiXCJdLCAwKTtcbmZ1bmN0aW9uIHRleHRMZW5ndGgodGV4dCkge1xuICAgIGxldCBsZW5ndGggPSAtMTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHRleHQpXG4gICAgICAgIGxlbmd0aCArPSBsaW5lLmxlbmd0aCArIDE7XG4gICAgcmV0dXJuIGxlbmd0aDtcbn1cbmZ1bmN0aW9uIGFwcGVuZFRleHQodGV4dCwgdGFyZ2V0LCBmcm9tID0gMCwgdG8gPSAxZTkpIHtcbiAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMCwgZmlyc3QgPSB0cnVlOyBpIDwgdGV4dC5sZW5ndGggJiYgcG9zIDw9IHRvOyBpKyspIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0ZXh0W2ldLCBlbmQgPSBwb3MgKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA+PSBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoZW5kID4gdG8pXG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgdG8gLSBwb3MpO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20pXG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoZnJvbSAtIHBvcyk7XG4gICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gc2xpY2VUZXh0KHRleHQsIGZyb20sIHRvKSB7XG4gICAgcmV0dXJuIGFwcGVuZFRleHQodGV4dCwgW1wiXCJdLCBmcm9tLCB0byk7XG59XG5jbGFzcyBSYXdUZXh0Q3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0LCBkaXIgPSAxKSB7XG4gICAgICAgIHRoaXMuZGlyID0gZGlyO1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5saW5lQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbdGV4dF07XG4gICAgICAgIHRoaXMub2Zmc2V0cyA9IFtkaXIgPiAwID8gMSA6ICh0ZXh0IGluc3RhbmNlb2YgVGV4dExlYWYgPyB0ZXh0LnRleHQubGVuZ3RoIDogdGV4dC5jaGlsZHJlbi5sZW5ndGgpIDw8IDFdO1xuICAgIH1cbiAgICBuZXh0SW5uZXIoc2tpcCwgZGlyKSB7XG4gICAgICAgIHRoaXMuZG9uZSA9IHRoaXMubGluZUJyZWFrID0gZmFsc2U7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMubm9kZXNbbGFzdF0sIG9mZnNldFZhbHVlID0gdGhpcy5vZmZzZXRzW2xhc3RdLCBvZmZzZXQgPSBvZmZzZXRWYWx1ZSA+PiAxO1xuICAgICAgICAgICAgbGV0IHNpemUgPSB0b3AgaW5zdGFuY2VvZiBUZXh0TGVhZiA/IHRvcC50ZXh0Lmxlbmd0aCA6IHRvcC5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09IChkaXIgPiAwID8gc2l6ZSA6IDApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXIgPiAwKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdCAtIDFdKys7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgob2Zmc2V0VmFsdWUgJiAxKSA9PSAoZGlyID4gMCA/IDAgOiAxKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XSArPSBkaXI7XG4gICAgICAgICAgICAgICAgaWYgKHNraXAgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlxcblwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodG9wIGluc3RhbmNlb2YgVGV4dExlYWYpIHtcbiAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHN0cmluZ1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdG9wLnRleHRbb2Zmc2V0ICsgKGRpciA8IDAgPyAtMSA6IDApXTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdF0gKz0gZGlyO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0Lmxlbmd0aCA+IE1hdGgubWF4KDAsIHNraXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBza2lwID09IDAgPyBuZXh0IDogZGlyID4gMCA/IG5leHQuc2xpY2Uoc2tpcCkgOiBuZXh0LnNsaWNlKDAsIG5leHQubGVuZ3RoIC0gc2tpcCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwIC09IG5leHQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0b3AuY2hpbGRyZW5bb2Zmc2V0ICsgKGRpciA8IDAgPyAtMSA6IDApXTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcCA+IG5leHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNraXAgLT0gbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XSArPSBkaXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyIDwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XS0tO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0cy5wdXNoKGRpciA+IDAgPyAxIDogKG5leHQgaW5zdGFuY2VvZiBUZXh0TGVhZiA/IG5leHQudGV4dC5sZW5ndGggOiBuZXh0LmNoaWxkcmVuLmxlbmd0aCkgPDwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG5leHQoc2tpcCA9IDApIHtcbiAgICAgICAgaWYgKHNraXAgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJbm5lcigtc2tpcCwgKC10aGlzLmRpcikpO1xuICAgICAgICAgICAgc2tpcCA9IHRoaXMudmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRJbm5lcihza2lwLCB0aGlzLmRpcik7XG4gICAgfVxufVxuY2xhc3MgUGFydGlhbFRleHRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnNvciA9IG5ldyBSYXdUZXh0Q3Vyc29yKHRleHQsIHN0YXJ0ID4gZW5kID8gLTEgOiAxKTtcbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydCA+IGVuZCA/IHRleHQubGVuZ3RoIDogMDtcbiAgICAgICAgdGhpcy5mcm9tID0gTWF0aC5taW4oc3RhcnQsIGVuZCk7XG4gICAgICAgIHRoaXMudG8gPSBNYXRoLm1heChzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgbmV4dElubmVyKHNraXAsIGRpcikge1xuICAgICAgICBpZiAoZGlyIDwgMCA/IHRoaXMucG9zIDw9IHRoaXMuZnJvbSA6IHRoaXMucG9zID49IHRoaXMudG8pIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHNraXAgKz0gTWF0aC5tYXgoMCwgZGlyIDwgMCA/IHRoaXMucG9zIC0gdGhpcy50byA6IHRoaXMuZnJvbSAtIHRoaXMucG9zKTtcbiAgICAgICAgbGV0IGxpbWl0ID0gZGlyIDwgMCA/IHRoaXMucG9zIC0gdGhpcy5mcm9tIDogdGhpcy50byAtIHRoaXMucG9zO1xuICAgICAgICBpZiAoc2tpcCA+IGxpbWl0KVxuICAgICAgICAgICAgc2tpcCA9IGxpbWl0O1xuICAgICAgICBsaW1pdCAtPSBza2lwO1xuICAgICAgICBsZXQgeyB2YWx1ZSB9ID0gdGhpcy5jdXJzb3IubmV4dChza2lwKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gKHZhbHVlLmxlbmd0aCArIHNraXApICogZGlyO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUubGVuZ3RoIDw9IGxpbWl0ID8gdmFsdWUgOiBkaXIgPCAwID8gdmFsdWUuc2xpY2UodmFsdWUubGVuZ3RoIC0gbGltaXQpIDogdmFsdWUuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgICB0aGlzLmRvbmUgPSAhdGhpcy52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG5leHQoc2tpcCA9IDApIHtcbiAgICAgICAgaWYgKHNraXAgPCAwKVxuICAgICAgICAgICAgc2tpcCA9IE1hdGgubWF4KHNraXAsIHRoaXMuZnJvbSAtIHRoaXMucG9zKTtcbiAgICAgICAgZWxzZSBpZiAoc2tpcCA+IDApXG4gICAgICAgICAgICBza2lwID0gTWF0aC5taW4oc2tpcCwgdGhpcy50byAtIHRoaXMucG9zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dElubmVyKHNraXAsIHRoaXMuY3Vyc29yLmRpcik7XG4gICAgfVxuICAgIGdldCBsaW5lQnJlYWsoKSB7IHJldHVybiB0aGlzLmN1cnNvci5saW5lQnJlYWsgJiYgdGhpcy52YWx1ZSAhPSBcIlwiOyB9XG59XG5jbGFzcyBMaW5lQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcihpbm5lcikge1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IHRydWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBsZXQgeyBkb25lLCBsaW5lQnJlYWssIHZhbHVlIH0gPSB0aGlzLmlubmVyLm5leHQoc2tpcCk7XG4gICAgICAgIGlmIChkb25lICYmIHRoaXMuYWZ0ZXJCcmVhaykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb25lKSB7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGluZUJyZWFrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hZnRlckJyZWFrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldCBsaW5lQnJlYWsoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuaWYgKHR5cGVvZiBTeW1ib2wgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgIFRleHQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLml0ZXIoKTsgfTtcbiAgICBSYXdUZXh0Q3Vyc29yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gUGFydGlhbFRleHRDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPVxuICAgICAgICBMaW5lQ3Vyc29yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcbn1cbi8qKlxuVGhpcyB0eXBlIGRlc2NyaWJlcyBhIGxpbmUgaW4gdGhlIGRvY3VtZW50LiBJdCBpcyBjcmVhdGVkXG5vbi1kZW1hbmQgd2hlbiBsaW5lcyBhcmUgW3F1ZXJpZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dC5saW5lQXQpLlxuKi9cbmNsYXNzIExpbmUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIChfYmVmb3JlXyB0aGUgbGluZSBicmVhayxcbiAgICBvciBhdCB0aGUgZW5kIG9mIGRvY3VtZW50IGZvciB0aGUgbGFzdCBsaW5lKS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGlzIGxpbmUncyBsaW5lIG51bWJlciAoMS1iYXNlZCkuXG4gICAgKi9cbiAgICBudW1iZXIsIFxuICAgIC8qKlxuICAgIFRoZSBsaW5lJ3MgY29udGVudC5cbiAgICAqL1xuICAgIHRleHQpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGxlbmd0aCBvZiB0aGUgbGluZSAobm90IGluY2x1ZGluZyBhbnkgbGluZSBicmVhayBhZnRlciBpdCkuXG4gICAgKi9cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy50byAtIHRoaXMuZnJvbTsgfVxufVxuZnVuY3Rpb24gY2xpcCh0ZXh0LCBmcm9tLCB0bykge1xuICAgIGZyb20gPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0ZXh0Lmxlbmd0aCwgZnJvbSkpO1xuICAgIHJldHVybiBbZnJvbSwgTWF0aC5tYXgoZnJvbSwgTWF0aC5taW4odGV4dC5sZW5ndGgsIHRvKSldO1xufVxuXG4vKipcblJldHVybnMgYSBuZXh0IGdyYXBoZW1lIGNsdXN0ZXIgYnJlYWsgX2FmdGVyXyAobm90IGVxdWFsIHRvKVxuYHBvc2AsIGlmIGBmb3J3YXJkYCBpcyB0cnVlLCBvciBiZWZvcmUgb3RoZXJ3aXNlLiBSZXR1cm5zIGBwb3NgXG5pdHNlbGYgaWYgbm8gZnVydGhlciBjbHVzdGVyIGJyZWFrIGlzIGF2YWlsYWJsZSBpbiB0aGUgc3RyaW5nLlxuTW92ZXMgYWNyb3NzIHN1cnJvZ2F0ZSBwYWlycywgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgKHdoZW5cbmBpbmNsdWRlRXh0ZW5kaW5nYCBpcyB0cnVlKSwgY2hhcmFjdGVycyBqb2luZWQgd2l0aCB6ZXJvLXdpZHRoXG5qb2luZXJzLCBhbmQgZmxhZyBlbW9qaS5cbiovXG5mdW5jdGlvbiBmaW5kQ2x1c3RlckJyZWFrKHN0ciwgcG9zLCBmb3J3YXJkID0gdHJ1ZSwgaW5jbHVkZUV4dGVuZGluZyA9IHRydWUpIHtcbiAgICByZXR1cm4gZmluZENsdXN0ZXJCcmVhayQxKHN0ciwgcG9zLCBmb3J3YXJkLCBpbmNsdWRlRXh0ZW5kaW5nKTtcbn1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUxvdyhjaCkgeyByZXR1cm4gY2ggPj0gMHhEQzAwICYmIGNoIDwgMHhFMDAwOyB9XG5mdW5jdGlvbiBzdXJyb2dhdGVIaWdoKGNoKSB7IHJldHVybiBjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDA7IH1cbi8qKlxuRmluZCB0aGUgY29kZSBwb2ludCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gYSBzdHJpbmcgKGxpa2UgdGhlXG5bYGNvZGVQb2ludEF0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2NvZGVQb2ludEF0KVxuc3RyaW5nIG1ldGhvZCkuXG4qL1xuZnVuY3Rpb24gY29kZVBvaW50QXQoc3RyLCBwb3MpIHtcbiAgICBsZXQgY29kZTAgPSBzdHIuY2hhckNvZGVBdChwb3MpO1xuICAgIGlmICghc3Vycm9nYXRlSGlnaChjb2RlMCkgfHwgcG9zICsgMSA9PSBzdHIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gY29kZTA7XG4gICAgbGV0IGNvZGUxID0gc3RyLmNoYXJDb2RlQXQocG9zICsgMSk7XG4gICAgaWYgKCFzdXJyb2dhdGVMb3coY29kZTEpKVxuICAgICAgICByZXR1cm4gY29kZTA7XG4gICAgcmV0dXJuICgoY29kZTAgLSAweGQ4MDApIDw8IDEwKSArIChjb2RlMSAtIDB4ZGMwMCkgKyAweDEwMDAwO1xufVxuLyoqXG5HaXZlbiBhIFVuaWNvZGUgY29kZXBvaW50LCByZXR1cm4gdGhlIEphdmFTY3JpcHQgc3RyaW5nIHRoYXRcbnJlc3ByZXNlbnRzIGl0IChsaWtlXG5bYFN0cmluZy5mcm9tQ29kZVBvaW50YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2Zyb21Db2RlUG9pbnQpKS5cbiovXG5mdW5jdGlvbiBmcm9tQ29kZVBvaW50KGNvZGUpIHtcbiAgICBpZiAoY29kZSA8PSAweGZmZmYpXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgIGNvZGUgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZSA+PiAxMCkgKyAweGQ4MDAsIChjb2RlICYgMTAyMykgKyAweGRjMDApO1xufVxuLyoqXG5UaGUgYW1vdW50IG9mIHBvc2l0aW9ucyBhIGNoYXJhY3RlciB0YWtlcyB1cCBpbiBhIEphdmFTY3JpcHQgc3RyaW5nLlxuKi9cbmZ1bmN0aW9uIGNvZGVQb2ludFNpemUoY29kZSkgeyByZXR1cm4gY29kZSA8IDB4MTAwMDAgPyAxIDogMjsgfVxuXG5jb25zdCBEZWZhdWx0U3BsaXQgPSAvXFxyXFxuP3xcXG4vO1xuLyoqXG5EaXN0aW5ndWlzaGVzIGRpZmZlcmVudCB3YXlzIGluIHdoaWNoIHBvc2l0aW9ucyBjYW4gYmUgbWFwcGVkLlxuKi9cbnZhciBNYXBNb2RlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoTWFwTW9kZSkge1xuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRvIGEgdmFsaWQgbmV3IHBvc2l0aW9uLCBldmVuIHdoZW4gaXRzIGNvbnRleHRcbiAgICB3YXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlNpbXBsZVwiXSA9IDBdID0gXCJTaW1wbGVcIjtcbiAgICAvKipcbiAgICBSZXR1cm4gbnVsbCBpZiBkZWxldGlvbiBoYXBwZW5zIGFjcm9zcyB0aGUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBNYXBNb2RlW01hcE1vZGVbXCJUcmFja0RlbFwiXSA9IDFdID0gXCJUcmFja0RlbFwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIHRoZSBjaGFyYWN0ZXIgX2JlZm9yZV8gdGhlIHBvc2l0aW9uIGlzIGRlbGV0ZWQuXG4gICAgKi9cbiAgICBNYXBNb2RlW01hcE1vZGVbXCJUcmFja0JlZm9yZVwiXSA9IDJdID0gXCJUcmFja0JlZm9yZVwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIHRoZSBjaGFyYWN0ZXIgX2FmdGVyXyB0aGUgcG9zaXRpb24gaXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrQWZ0ZXJcIl0gPSAzXSA9IFwiVHJhY2tBZnRlclwiO1xucmV0dXJuIE1hcE1vZGV9KShNYXBNb2RlIHx8IChNYXBNb2RlID0ge30pKTtcbi8qKlxuQSBjaGFuZ2UgZGVzY3JpcHRpb24gaXMgYSB2YXJpYW50IG9mIFtjaGFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNldClcbnRoYXQgZG9lc24ndCBzdG9yZSB0aGUgaW5zZXJ0ZWQgdGV4dC4gQXMgc3VjaCwgaXQgY2FuJ3QgYmVcbmFwcGxpZWQsIGJ1dCBpcyBjaGVhcGVyIHRvIHN0b3JlIGFuZCBtYW5pcHVsYXRlLlxuKi9cbmNsYXNzIENoYW5nZURlc2Mge1xuICAgIC8vIFNlY3Rpb25zIGFyZSBlbmNvZGVkIGFzIHBhaXJzIG9mIGludGVnZXJzLiBUaGUgZmlyc3QgaXMgdGhlXG4gICAgLy8gbGVuZ3RoIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LCBhbmQgdGhlIHNlY29uZCBpcyAtMSBmb3JcbiAgICAvLyB1bmFmZmVjdGVkIHNlY3Rpb25zLCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgcmVwbGFjZW1lbnQgY29udGVudFxuICAgIC8vIG90aGVyd2lzZS4gU28gYW4gaW5zZXJ0aW9uIHdvdWxkIGJlICgwLCBuPjApLCBhIGRlbGV0aW9uIChuPjAsXG4gICAgLy8gMCksIGFuZCBhIHJlcGxhY2VtZW50IHR3byBwb3NpdGl2ZSBudW1iZXJzLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZWN0aW9ucykge1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnNlY3Rpb25zW2ldO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCBhZnRlciB0aGUgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IG5ld0xlbmd0aCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGlucyA9IHRoaXMuc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGlucyA8IDAgPyB0aGlzLnNlY3Rpb25zW2ldIDogaW5zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEZhbHNlIHdoZW4gdGhlcmUgYXJlIGFjdHVhbCBjaGFuZ2VzIGluIHRoaXMgc2V0LlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5zZWN0aW9ucy5sZW5ndGggPT0gMCB8fCB0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PSAyICYmIHRoaXMuc2VjdGlvbnNbMV0gPCAwOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB1bmNoYW5nZWQgcGFydHMgbGVmdCBieSB0aGVzZSBjaGFuZ2VzLiBgcG9zQWBcbiAgICBwcm92aWRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHJhbmdlIGluIHRoZSBvbGQgZG9jdW1lbnQsIGBwb3NCYFxuICAgIHRoZSBuZXcgcG9zaXRpb24gaW4gdGhlIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBpdGVyR2FwcyhmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3NBID0gMCwgcG9zQiA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2krK10sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgIGlmIChpbnMgPCAwKSB7XG4gICAgICAgICAgICAgICAgZihwb3NBLCBwb3NCLCBsZW4pO1xuICAgICAgICAgICAgICAgIHBvc0IgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBpbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NBICs9IGxlbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBjaGFuZ2VkIGJ5IHRoZXNlIGNoYW5nZXMuIChTZWVcbiAgICBbYENoYW5nZVNldC5pdGVyQ2hhbmdlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0Lml0ZXJDaGFuZ2VzKSBmb3IgYVxuICAgIHZhcmlhbnQgdGhhdCBhbHNvIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBpbnNlcnRlZCB0ZXh0LilcbiAgICBgZnJvbUFgL2B0b0FgIHByb3ZpZGVzIHRoZSBleHRlbnQgb2YgdGhlIGNoYW5nZSBpbiB0aGUgc3RhcnRpbmdcbiAgICBkb2N1bWVudCwgYGZyb21CYC9gdG9CYCB0aGUgZXh0ZW50IG9mIHRoZSByZXBsYWNlbWVudCBpbiB0aGVcbiAgICBjaGFuZ2VkIGRvY3VtZW50LlxuICAgIFxuICAgIFdoZW4gYGluZGl2aWR1YWxgIGlzIHRydWUsIGFkamFjZW50IGNoYW5nZXMgKHdoaWNoIGFyZSBrZXB0XG4gICAgc2VwYXJhdGUgZm9yIFtwb3NpdGlvbiBtYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MubWFwUG9zKSkgYXJlXG4gICAgcmVwb3J0ZWQgc2VwYXJhdGVseS5cbiAgICAqL1xuICAgIGl0ZXJDaGFuZ2VkUmFuZ2VzKGYsIGluZGl2aWR1YWwgPSBmYWxzZSkge1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCBmLCBpbmRpdmlkdWFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGludmVydGVkIGZvcm0gb2YgdGhlc2UgY2hhbmdlcy5cbiAgICAqL1xuICAgIGdldCBpbnZlcnRlZERlc2MoKSB7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApXG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChsZW4sIGlucyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChpbnMsIGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKHNlY3Rpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcHV0ZSB0aGUgY29tYmluZWQgZWZmZWN0IG9mIGFwcGx5aW5nIGFub3RoZXIgc2V0IG9mIGNoYW5nZXNcbiAgICBhZnRlciB0aGlzIG9uZS4gVGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgdGhpcyBzZXQgc2hvdWxkXG4gICAgbWF0Y2ggdGhlIGxlbmd0aCBiZWZvcmUgYG90aGVyYC5cbiAgICAqL1xuICAgIGNvbXBvc2VEZXNjKG90aGVyKSB7IHJldHVybiB0aGlzLmVtcHR5ID8gb3RoZXIgOiBvdGhlci5lbXB0eSA/IHRoaXMgOiBjb21wb3NlU2V0cyh0aGlzLCBvdGhlcik7IH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyBkZXNjcmlwdGlvbiwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHNhbWUgZG9jdW1lbnRcbiAgICBhcyBgb3RoZXJgLCBvdmVyIGFub3RoZXIgc2V0IG9mIGNoYW5nZXMsIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgYXBwbGllZCBhZnRlciBpdC4gV2hlbiBgYmVmb3JlYCBpcyB0cnVlLCBtYXAgYXMgaWYgdGhlIGNoYW5nZXNcbiAgICBpbiBgdGhpc2AgaGFwcGVuZWQgYmVmb3JlIHRoZSBvbmVzIGluIGBvdGhlcmAuXG4gICAgKi9cbiAgICBtYXBEZXNjKG90aGVyLCBiZWZvcmUgPSBmYWxzZSkgeyByZXR1cm4gb3RoZXIuZW1wdHkgPyB0aGlzIDogbWFwU2V0KHRoaXMsIG90aGVyLCBiZWZvcmUpOyB9XG4gICAgbWFwUG9zKHBvcywgYXNzb2MgPSAtMSwgbW9kZSA9IE1hcE1vZGUuU2ltcGxlKSB7XG4gICAgICAgIGxldCBwb3NBID0gMCwgcG9zQiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK10sIGVuZEEgPSBwb3NBICsgbGVuO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5kQSA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc0IgKyAocG9zIC0gcG9zQSk7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSAhPSBNYXBNb2RlLlNpbXBsZSAmJiBlbmRBID49IHBvcyAmJlxuICAgICAgICAgICAgICAgICAgICAobW9kZSA9PSBNYXBNb2RlLlRyYWNrRGVsICYmIHBvc0EgPCBwb3MgJiYgZW5kQSA+IHBvcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBNYXBNb2RlLlRyYWNrQmVmb3JlICYmIHBvc0EgPCBwb3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT0gTWFwTW9kZS5UcmFja0FmdGVyICYmIGVuZEEgPiBwb3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZW5kQSA+IHBvcyB8fCBlbmRBID09IHBvcyAmJiBhc3NvYyA8IDAgJiYgIWxlbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA9PSBwb3NBIHx8IGFzc29jIDwgMCA/IHBvc0IgOiBwb3NCICsgaW5zO1xuICAgICAgICAgICAgICAgIHBvc0IgKz0gaW5zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zQSA9IGVuZEE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+IHBvc0EpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUG9zaXRpb24gJHtwb3N9IGlzIG91dCBvZiByYW5nZSBmb3IgY2hhbmdlc2V0IG9mIGxlbmd0aCAke3Bvc0F9YCk7XG4gICAgICAgIHJldHVybiBwb3NCO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoZXNlIGNoYW5nZXMgdG91Y2ggYSBnaXZlbiByYW5nZS4gV2hlbiBvbmUgb2YgdGhlXG4gICAgY2hhbmdlcyBlbnRpcmVseSBjb3ZlcnMgdGhlIHJhbmdlLCB0aGUgc3RyaW5nIGBcImNvdmVyXCJgIGlzXG4gICAgcmV0dXJuZWQuXG4gICAgKi9cbiAgICB0b3VjaGVzUmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGggJiYgcG9zIDw9IHRvOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdLCBlbmQgPSBwb3MgKyBsZW47XG4gICAgICAgICAgICBpZiAoaW5zID49IDAgJiYgcG9zIDw9IHRvICYmIGVuZCA+PSBmcm9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3MgPCBmcm9tICYmIGVuZCA+IHRvID8gXCJjb3ZlclwiIDogdHJ1ZTtcbiAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IChyZXN1bHQgPyBcIiBcIiA6IFwiXCIpICsgbGVuICsgKGlucyA+PSAwID8gXCI6XCIgKyBpbnMgOiBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBjaGFuZ2UgZGVzYyB0byBhIEpTT04tcmVwcmVzZW50YWJsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHsgcmV0dXJuIHRoaXMuc2VjdGlvbnM7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2UgZGVzYyBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIChhcyBwcm9kdWNlZFxuICAgIGJ5IFtgdG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VEZXNjLnRvSlNPTikuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikgfHwganNvbi5sZW5ndGggJSAyIHx8IGpzb24uc29tZShhID0+IHR5cGVvZiBhICE9IFwibnVtYmVyXCIpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQ2hhbmdlRGVzY1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc2VjdGlvbnMpIHsgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKHNlY3Rpb25zKTsgfVxufVxuLyoqXG5BIGNoYW5nZSBzZXQgcmVwcmVzZW50cyBhIGdyb3VwIG9mIG1vZGlmaWNhdGlvbnMgdG8gYSBkb2N1bWVudC4gSXRcbnN0b3JlcyB0aGUgZG9jdW1lbnQgbGVuZ3RoLCBhbmQgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBkb2N1bWVudHNcbndpdGggZXhhY3RseSB0aGF0IGxlbmd0aC5cbiovXG5jbGFzcyBDaGFuZ2VTZXQgZXh0ZW5kcyBDaGFuZ2VEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9ucywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnNlcnRlZCkge1xuICAgICAgICBzdXBlcihzZWN0aW9ucyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0ZWQgPSBpbnNlcnRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwbHkgdGhlIGNoYW5nZXMgdG8gYSBkb2N1bWVudCwgcmV0dXJuaW5nIHRoZSBtb2RpZmllZFxuICAgIGRvY3VtZW50LlxuICAgICovXG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPSBkb2MubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBcHBseWluZyBjaGFuZ2Ugc2V0IHRvIGEgZG9jdW1lbnQgd2l0aCB0aGUgd3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCAoZnJvbUEsIHRvQSwgZnJvbUIsIF90b0IsIHRleHQpID0+IGRvYyA9IGRvYy5yZXBsYWNlKGZyb21CLCBmcm9tQiArICh0b0EgLSBmcm9tQSksIHRleHQpLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBkb2M7XG4gICAgfVxuICAgIG1hcERlc2Mob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBHaXZlbiB0aGUgZG9jdW1lbnQgYXMgaXQgZXhpc3RlZCBfYmVmb3JlXyB0aGUgY2hhbmdlcywgcmV0dXJuIGFcbiAgICBjaGFuZ2Ugc2V0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW52ZXJzZSBvZiB0aGlzIHNldCwgd2hpY2ggY291bGRcbiAgICBiZSB1c2VkIHRvIGdvIGZyb20gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgdGhlIGNoYW5nZXMgYmFjayB0b1xuICAgIHRoZSBkb2N1bWVudCBhcyBpdCBleGlzdGVkIGJlZm9yZSB0aGUgY2hhbmdlcy5cbiAgICAqL1xuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucy5zbGljZSgpLCBpbnNlcnRlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IHNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gc2VjdGlvbnNbaV0sIGlucyA9IHNlY3Rpb25zW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpbnMgPj0gMCkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zW2ldID0gaW5zO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zW2kgKyAxXSA9IGxlbjtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpID4+IDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydGVkLmxlbmd0aCA8IGluZGV4KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC5wdXNoKFRleHQuZW1wdHkpO1xuICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2gobGVuID8gZG9jLnNsaWNlKHBvcywgcG9zICsgbGVuKSA6IFRleHQuZW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21iaW5lIHR3byBzdWJzZXF1ZW50IGNoYW5nZSBzZXRzIGludG8gYSBzaW5nbGUgc2V0LiBgb3RoZXJgXG4gICAgbXVzdCBzdGFydCBpbiB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgYHRoaXNgLiBJZiBgdGhpc2AgZ29lc1xuICAgIGBkb2NBYCBcdTIxOTIgYGRvY0JgIGFuZCBgb3RoZXJgIHJlcHJlc2VudHMgYGRvY0JgIFx1MjE5MiBgZG9jQ2AsIHRoZVxuICAgIHJldHVybmVkIHZhbHVlIHdpbGwgcmVwcmVzZW50IHRoZSBjaGFuZ2UgYGRvY0FgIFx1MjE5MiBgZG9jQ2AuXG4gICAgKi9cbiAgICBjb21wb3NlKG90aGVyKSB7IHJldHVybiB0aGlzLmVtcHR5ID8gb3RoZXIgOiBvdGhlci5lbXB0eSA/IHRoaXMgOiBjb21wb3NlU2V0cyh0aGlzLCBvdGhlciwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBHaXZlbiBhbm90aGVyIGNoYW5nZSBzZXQgc3RhcnRpbmcgaW4gdGhlIHNhbWUgZG9jdW1lbnQsIG1hcHMgdGhpc1xuICAgIGNoYW5nZSBzZXQgb3ZlciB0aGUgb3RoZXIsIHByb2R1Y2luZyBhIG5ldyBjaGFuZ2Ugc2V0IHRoYXQgY2FuIGJlXG4gICAgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgYXBwbHlpbmcgYG90aGVyYC4gV2hlblxuICAgIGBiZWZvcmVgIGlzIGB0cnVlYCwgb3JkZXIgY2hhbmdlcyBhcyBpZiBgdGhpc2AgY29tZXMgYmVmb3JlXG4gICAgYG90aGVyYCwgb3RoZXJ3aXNlICh0aGUgZGVmYXVsdCkgdHJlYXQgYG90aGVyYCBhcyBjb21pbmcgZmlyc3QuXG4gICAgXG4gICAgR2l2ZW4gdHdvIGNoYW5nZXMgYEFgIGFuZCBgQmAsIGBBLmNvbXBvc2UoQi5tYXAoQSkpYCBhbmRcbiAgICBgQi5jb21wb3NlKEEubWFwKEIsIHRydWUpKWAgd2lsbCBwcm9kdWNlIHRoZSBzYW1lIGRvY3VtZW50LiBUaGlzXG4gICAgcHJvdmlkZXMgYSBiYXNpYyBmb3JtIG9mIFtvcGVyYXRpb25hbFxuICAgIHRyYW5zZm9ybWF0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVyYXRpb25hbF90cmFuc2Zvcm1hdGlvbiksXG4gICAgYW5kIGNhbiBiZSB1c2VkIGZvciBjb2xsYWJvcmF0aXZlIGVkaXRpbmcuXG4gICAgKi9cbiAgICBtYXAob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBvdGhlci5lbXB0eSA/IHRoaXMgOiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIGNoYW5nZWQgcmFuZ2VzIGluIHRoZSBkb2N1bWVudCwgY2FsbGluZyBgZmAgZm9yXG4gICAgZWFjaCwgd2l0aCB0aGUgcmFuZ2UgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50IChgZnJvbUFgLWB0b0FgKVxuICAgIGFuZCB0aGUgcmFuZ2UgdGhhdCByZXBsYWNlcyBpdCBpbiB0aGUgbmV3IGRvY3VtZW50XG4gICAgKGBmcm9tQmAtYHRvQmApLlxuICAgIFxuICAgIFdoZW4gYGluZGl2aWR1YWxgIGlzIHRydWUsIGFkamFjZW50IGNoYW5nZXMgYXJlIHJlcG9ydGVkXG4gICAgc2VwYXJhdGVseS5cbiAgICAqL1xuICAgIGl0ZXJDaGFuZ2VzKGYsIGluZGl2aWR1YWwgPSBmYWxzZSkge1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCBmLCBpbmRpdmlkdWFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW2NoYW5nZSBkZXNjcmlwdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VEZXNjKSBmb3IgdGhpcyBjaGFuZ2VcbiAgICBzZXQuXG4gICAgKi9cbiAgICBnZXQgZGVzYygpIHsgcmV0dXJuIENoYW5nZURlc2MuY3JlYXRlKHRoaXMuc2VjdGlvbnMpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaWx0ZXIocmFuZ2VzKSB7XG4gICAgICAgIGxldCByZXN1bHRTZWN0aW9ucyA9IFtdLCByZXN1bHRJbnNlcnRlZCA9IFtdLCBmaWx0ZXJlZFNlY3Rpb25zID0gW107XG4gICAgICAgIGxldCBpdGVyID0gbmV3IFNlY3Rpb25JdGVyKHRoaXMpO1xuICAgICAgICBkb25lOiBmb3IgKGxldCBpID0gMCwgcG9zID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGkgPT0gcmFuZ2VzLmxlbmd0aCA/IDFlOSA6IHJhbmdlc1tpKytdO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IG5leHQgfHwgcG9zID09IG5leHQgJiYgaXRlci5sZW4gPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyLmRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvbmU7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGl0ZXIubGVuLCBuZXh0IC0gcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKGZpbHRlcmVkU2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgICAgIGxldCBpbnMgPSBpdGVyLmlucyA9PSAtMSA/IC0xIDogaXRlci5vZmYgPT0gMCA/IGl0ZXIuaW5zIDogMDtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHJlc3VsdFNlY3Rpb25zLCBsZW4sIGlucyk7XG4gICAgICAgICAgICAgICAgaWYgKGlucyA+IDApXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChyZXN1bHRJbnNlcnRlZCwgcmVzdWx0U2VjdGlvbnMsIGl0ZXIudGV4dCk7XG4gICAgICAgICAgICAgICAgaXRlci5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbmQgPSByYW5nZXNbaSsrXTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlci5kb25lKVxuICAgICAgICAgICAgICAgICAgICBicmVhayBkb25lO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBNYXRoLm1pbihpdGVyLmxlbiwgZW5kIC0gcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHJlc3VsdFNlY3Rpb25zLCBsZW4sIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKGZpbHRlcmVkU2VjdGlvbnMsIGxlbiwgaXRlci5pbnMgPT0gLTEgPyAtMSA6IGl0ZXIub2ZmID09IDAgPyBpdGVyLmlucyA6IDApO1xuICAgICAgICAgICAgICAgIGl0ZXIuZm9yd2FyZChsZW4pO1xuICAgICAgICAgICAgICAgIHBvcyArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogbmV3IENoYW5nZVNldChyZXN1bHRTZWN0aW9ucywgcmVzdWx0SW5zZXJ0ZWQpLFxuICAgICAgICAgICAgZmlsdGVyZWQ6IENoYW5nZURlc2MuY3JlYXRlKGZpbHRlcmVkU2VjdGlvbnMpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIGNoYW5nZSBzZXQgdG8gYSBKU09OLXJlcHJlc2VudGFibGUgdmFsdWUuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2ldLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpbnMgPCAwKVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gobGVuKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlucyA9PSAwKVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goW2xlbl0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goW2xlbl0uY29uY2F0KHRoaXMuaW5zZXJ0ZWRbaSA+PiAxXS50b0pTT04oKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cztcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY2hhbmdlIHNldCBmb3IgdGhlIGdpdmVuIGNoYW5nZXMsIGZvciBhIGRvY3VtZW50IG9mIHRoZVxuICAgIGdpdmVuIGxlbmd0aCwgdXNpbmcgYGxpbmVTZXBgIGFzIGxpbmUgc2VwYXJhdG9yLlxuICAgICovXG4gICAgc3RhdGljIG9mKGNoYW5nZXMsIGxlbmd0aCwgbGluZVNlcCkge1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSBbXSwgaW5zZXJ0ZWQgPSBbXSwgcG9zID0gMDtcbiAgICAgICAgbGV0IHRvdGFsID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb24gZmx1c2goZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhc2VjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChwb3MgPCBsZW5ndGgpXG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuZ3RoIC0gcG9zLCAtMSk7XG4gICAgICAgICAgICBsZXQgc2V0ID0gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsLmNvbXBvc2Uoc2V0Lm1hcCh0b3RhbCkpIDogc2V0O1xuICAgICAgICAgICAgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGluc2VydGVkID0gW107XG4gICAgICAgICAgICBwb3MgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3Moc3BlYykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWIgb2Ygc3BlYylcbiAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhzdWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIENoYW5nZVNldCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGVjLmxlbmd0aCAhPSBsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3RoIChnb3QgJHtzcGVjLmxlbmd0aH0sIGV4cGVjdGVkICR7bGVuZ3RofSlgKTtcbiAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgPyB0b3RhbC5jb21wb3NlKHNwZWMubWFwKHRvdGFsKSkgOiBzcGVjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gPSBmcm9tLCBpbnNlcnQgfSA9IHNwZWM7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPiB0byB8fCBmcm9tIDwgMCB8fCB0byA+IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY2hhbmdlIHJhbmdlICR7ZnJvbX0gdG8gJHt0b30gKGluIGRvYyBvZiBsZW5ndGggJHtsZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIGxldCBpbnNUZXh0ID0gIWluc2VydCA/IFRleHQuZW1wdHkgOiB0eXBlb2YgaW5zZXJ0ID09IFwic3RyaW5nXCIgPyBUZXh0Lm9mKGluc2VydC5zcGxpdChsaW5lU2VwIHx8IERlZmF1bHRTcGxpdCkpIDogaW5zZXJ0O1xuICAgICAgICAgICAgICAgIGxldCBpbnNMZW4gPSBpbnNUZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA9PSB0byAmJiBpbnNMZW4gPT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgcG9zKVxuICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBmcm9tIC0gcG9zLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgdG8gLSBmcm9tLCBpbnNMZW4pO1xuICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnRlZCwgc2VjdGlvbnMsIGluc1RleHQpO1xuICAgICAgICAgICAgICAgIHBvcyA9IHRvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MoY2hhbmdlcyk7XG4gICAgICAgIGZsdXNoKCF0b3RhbCk7XG4gICAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGVtcHR5IGNoYW5nZXNldCBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLlxuICAgICovXG4gICAgc3RhdGljIGVtcHR5KGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChsZW5ndGggPyBbbGVuZ3RoLCAtMV0gOiBbXSwgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2VzZXQgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbiAoYXMgcHJvZHVjZWQgYnlcbiAgICBbYHRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0LnRvSlNPTikuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBDaGFuZ2VTZXRcIik7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnRlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYXJ0ID0ganNvbltpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFydCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChwYXJ0LCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwYXJ0KSB8fCB0eXBlb2YgcGFydFswXSAhPSBcIm51bWJlclwiIHx8IHBhcnQuc29tZSgoZSwgaSkgPT4gaSAmJiB0eXBlb2YgZSAhPSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIENoYW5nZVNldFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcnQubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHBhcnRbMF0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydGVkLmxlbmd0aCA8IGkpXG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWRbaV0gPSBUZXh0Lm9mKHBhcnQuc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2gocGFydFswXSwgaW5zZXJ0ZWRbaV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVTZXQoc2VjdGlvbnMsIGluc2VydGVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnMsIGZvcmNlSm9pbiA9IGZhbHNlKSB7XG4gICAgaWYgKGxlbiA9PSAwICYmIGlucyA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IGxhc3QgPSBzZWN0aW9ucy5sZW5ndGggLSAyO1xuICAgIGlmIChsYXN0ID49IDAgJiYgaW5zIDw9IDAgJiYgaW5zID09IHNlY3Rpb25zW2xhc3QgKyAxXSlcbiAgICAgICAgc2VjdGlvbnNbbGFzdF0gKz0gbGVuO1xuICAgIGVsc2UgaWYgKGxhc3QgPj0gMCAmJiBsZW4gPT0gMCAmJiBzZWN0aW9uc1tsYXN0XSA9PSAwKVxuICAgICAgICBzZWN0aW9uc1tsYXN0ICsgMV0gKz0gaW5zO1xuICAgIGVsc2UgaWYgKGZvcmNlSm9pbikge1xuICAgICAgICBzZWN0aW9uc1tsYXN0XSArPSBsZW47XG4gICAgICAgIHNlY3Rpb25zW2xhc3QgKyAxXSArPSBpbnM7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgc2VjdGlvbnMucHVzaChsZW4sIGlucyk7XG59XG5mdW5jdGlvbiBhZGRJbnNlcnQodmFsdWVzLCBzZWN0aW9ucywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgaW5kZXggPSAoc2VjdGlvbnMubGVuZ3RoIC0gMikgPj4gMTtcbiAgICBpZiAoaW5kZXggPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0gPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdLmFwcGVuZCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB3aGlsZSAodmFsdWVzLmxlbmd0aCA8IGluZGV4KVxuICAgICAgICAgICAgdmFsdWVzLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpdGVyQ2hhbmdlcyhkZXNjLCBmLCBpbmRpdmlkdWFsKSB7XG4gICAgbGV0IGluc2VydGVkID0gZGVzYy5pbnNlcnRlZDtcbiAgICBmb3IgKGxldCBwb3NBID0gMCwgcG9zQiA9IDAsIGkgPSAwOyBpIDwgZGVzYy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgIGxldCBsZW4gPSBkZXNjLnNlY3Rpb25zW2krK10sIGlucyA9IGRlc2Muc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgIHBvc0EgKz0gbGVuO1xuICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZW5kQSA9IHBvc0EsIGVuZEIgPSBwb3NCLCB0ZXh0ID0gVGV4dC5lbXB0eTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBlbmRBICs9IGxlbjtcbiAgICAgICAgICAgICAgICBlbmRCICs9IGlucztcbiAgICAgICAgICAgICAgICBpZiAoaW5zICYmIGluc2VydGVkKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5hcHBlbmQoaW5zZXJ0ZWRbKGkgLSAyKSA+PiAxXSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGl2aWR1YWwgfHwgaSA9PSBkZXNjLnNlY3Rpb25zLmxlbmd0aCB8fCBkZXNjLnNlY3Rpb25zW2kgKyAxXSA8IDApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGxlbiA9IGRlc2Muc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgICAgICBpbnMgPSBkZXNjLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmKHBvc0EsIGVuZEEsIHBvc0IsIGVuZEIsIHRleHQpO1xuICAgICAgICAgICAgcG9zQSA9IGVuZEE7XG4gICAgICAgICAgICBwb3NCID0gZW5kQjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG1hcFNldChzZXRBLCBzZXRCLCBiZWZvcmUsIG1rU2V0ID0gZmFsc2UpIHtcbiAgICAvLyBQcm9kdWNlIGEgY29weSBvZiBzZXRBIHRoYXQgYXBwbGllcyB0byB0aGUgZG9jdW1lbnQgYWZ0ZXIgc2V0QlxuICAgIC8vIGhhcyBiZWVuIGFwcGxpZWQgKGFzc3VtaW5nIGJvdGggc3RhcnQgYXQgdGhlIHNhbWUgZG9jdW1lbnQpLlxuICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnQgPSBta1NldCA/IFtdIDogbnVsbDtcbiAgICBsZXQgYSA9IG5ldyBTZWN0aW9uSXRlcihzZXRBKSwgYiA9IG5ldyBTZWN0aW9uSXRlcihzZXRCKTtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYm90aCBzZXRzIGluIHBhcmFsbGVsLiBpbnNlcnRlZCB0cmFja3MsIGZvciBjaGFuZ2VzXG4gICAgLy8gaW4gQSB0aGF0IGhhdmUgdG8gYmUgcHJvY2Vzc2VkIHBpZWNlLWJ5LXBpZWNlLCB3aGV0aGVyIHRoZWlyXG4gICAgLy8gY29udGVudCBoYXMgYmVlbiBpbnNlcnRlZCBhbHJlYWR5LCBhbmQgcmVmZXJzIHRvIHRoZSBzZWN0aW9uXG4gICAgLy8gaW5kZXguXG4gICAgZm9yIChsZXQgaW5zZXJ0ZWQgPSAtMTs7KSB7XG4gICAgICAgIGlmIChhLmRvbmUgJiYgYi5sZW4gfHwgYi5kb25lICYmIGEubGVuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3Roc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA9PSAtMSAmJiBiLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgLy8gTW92ZSBhY3Jvc3MgcmFuZ2VzIHNraXBwZWQgYnkgYm90aCBzZXRzLlxuICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGEubGVuLCBiLmxlbik7XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIC0xKTtcbiAgICAgICAgICAgIGEuZm9yd2FyZChsZW4pO1xuICAgICAgICAgICAgYi5mb3J3YXJkKGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYi5pbnMgPj0gMCAmJiAoYS5pbnMgPCAwIHx8IGluc2VydGVkID09IGEuaSB8fCBhLm9mZiA9PSAwICYmIChiLmxlbiA8IGEubGVuIHx8IGIubGVuID09IGEubGVuICYmICFiZWZvcmUpKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIGNoYW5nZSBpbiBCIHRoYXQgY29tZXMgYmVmb3JlIHRoZSBuZXh0IGNoYW5nZSBpblxuICAgICAgICAgICAgLy8gQSAob3JkZXJlZCBieSBzdGFydCBwb3MsIHRoZW4gbGVuLCB0aGVuIGJlZm9yZSBmbGFnKSwgc2tpcFxuICAgICAgICAgICAgLy8gdGhhdCAoYW5kIHByb2Nlc3MgYW55IGNoYW5nZXMgaW4gQSBpdCBjb3ZlcnMpLlxuICAgICAgICAgICAgbGV0IGxlbiA9IGIubGVuO1xuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYi5pbnMsIC0xKTtcbiAgICAgICAgICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgICAgICAgICBsZXQgcGllY2UgPSBNYXRoLm1pbihhLmxlbiwgbGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoYS5pbnMgPj0gMCAmJiBpbnNlcnRlZCA8IGEuaSAmJiBhLmxlbiA8PSBwaWVjZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCAwLCBhLmlucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYS50ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgPSBhLmk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGEuZm9yd2FyZChwaWVjZSk7XG4gICAgICAgICAgICAgICAgbGVuIC09IHBpZWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYi5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5pbnMgPj0gMCkge1xuICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgcGFydCBvZiBhIGNoYW5nZSBpbiBBIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dFxuICAgICAgICAgICAgLy8gbm9uLWRlbGV0aW9uIGNoYW5nZSBpbiBCIChpZiBvdmVybGFwcGluZykuXG4gICAgICAgICAgICBsZXQgbGVuID0gMCwgbGVmdCA9IGEubGVuO1xuICAgICAgICAgICAgd2hpbGUgKGxlZnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYi5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBpZWNlID0gTWF0aC5taW4obGVmdCwgYi5sZW4pO1xuICAgICAgICAgICAgICAgICAgICBsZW4gKz0gcGllY2U7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gcGllY2U7XG4gICAgICAgICAgICAgICAgICAgIGIuZm9yd2FyZChwaWVjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaW5zID09IDAgJiYgYi5sZW4gPCBsZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gYi5sZW47XG4gICAgICAgICAgICAgICAgICAgIGIubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnNlcnRlZCA8IGEuaSA/IGEuaW5zIDogMCk7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0ICYmIGluc2VydGVkIDwgYS5pKVxuICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBhLnRleHQpO1xuICAgICAgICAgICAgaW5zZXJ0ZWQgPSBhLmk7XG4gICAgICAgICAgICBhLmZvcndhcmQoYS5sZW4gLSBsZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmRvbmUgJiYgYi5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0ID8gQ2hhbmdlU2V0LmNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0KSA6IENoYW5nZURlc2MuY3JlYXRlKHNlY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGhzXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcG9zZVNldHMoc2V0QSwgc2V0QiwgbWtTZXQgPSBmYWxzZSkge1xuICAgIGxldCBzZWN0aW9ucyA9IFtdO1xuICAgIGxldCBpbnNlcnQgPSBta1NldCA/IFtdIDogbnVsbDtcbiAgICBsZXQgYSA9IG5ldyBTZWN0aW9uSXRlcihzZXRBKSwgYiA9IG5ldyBTZWN0aW9uSXRlcihzZXRCKTtcbiAgICBmb3IgKGxldCBvcGVuID0gZmFsc2U7Oykge1xuICAgICAgICBpZiAoYS5kb25lICYmIGIuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGluc2VydCA/IENoYW5nZVNldC5jcmVhdGVTZXQoc2VjdGlvbnMsIGluc2VydCkgOiBDaGFuZ2VEZXNjLmNyZWF0ZShzZWN0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5pbnMgPT0gMCkgeyAvLyBEZWxldGlvbiBpbiBBXG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBhLmxlbiwgMCwgb3Blbik7XG4gICAgICAgICAgICBhLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiLmxlbiA9PSAwICYmICFiLmRvbmUpIHsgLy8gSW5zZXJ0aW9uIGluIEJcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIDAsIGIuaW5zLCBvcGVuKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnQpXG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGIudGV4dCk7XG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmRvbmUgfHwgYi5kb25lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3Roc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSBNYXRoLm1pbihhLmxlbjIsIGIubGVuKSwgc2VjdGlvbkxlbiA9IHNlY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChhLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGxldCBpbnNCID0gYi5pbnMgPT0gLTEgPyAtMSA6IGIub2ZmID8gMCA6IGIuaW5zO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGxlbiwgaW5zQiwgb3Blbik7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydCAmJiBpbnNCKVxuICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYi50ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGIuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYS5vZmYgPyAwIDogYS5sZW4sIGxlbiwgb3Blbik7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGEudGV4dEJpdChsZW4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGEub2ZmID8gMCA6IGEubGVuLCBiLm9mZiA/IDAgOiBiLmlucywgb3Blbik7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydCAmJiAhYi5vZmYpXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBiLnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3BlbiA9IChhLmlucyA+IGxlbiB8fCBiLmlucyA+PSAwICYmIGIubGVuID4gbGVuKSAmJiAob3BlbiB8fCBzZWN0aW9ucy5sZW5ndGggPiBzZWN0aW9uTGVuKTtcbiAgICAgICAgICAgIGEuZm9yd2FyZDIobGVuKTtcbiAgICAgICAgICAgIGIuZm9yd2FyZChsZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU2VjdGlvbkl0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHNldCkge1xuICAgICAgICB0aGlzLnNldCA9IHNldDtcbiAgICAgICAgdGhpcy5pID0gMDtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGxldCB7IHNlY3Rpb25zIH0gPSB0aGlzLnNldDtcbiAgICAgICAgaWYgKHRoaXMuaSA8IHNlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sZW4gPSBzZWN0aW9uc1t0aGlzLmkrK107XG4gICAgICAgICAgICB0aGlzLmlucyA9IHNlY3Rpb25zW3RoaXMuaSsrXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGVuID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW5zID0gLTI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmYgPSAwO1xuICAgIH1cbiAgICBnZXQgZG9uZSgpIHsgcmV0dXJuIHRoaXMuaW5zID09IC0yOyB9XG4gICAgZ2V0IGxlbjIoKSB7IHJldHVybiB0aGlzLmlucyA8IDAgPyB0aGlzLmxlbiA6IHRoaXMuaW5zOyB9XG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICAgIGxldCB7IGluc2VydGVkIH0gPSB0aGlzLnNldCwgaW5kZXggPSAodGhpcy5pIC0gMikgPj4gMTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IGluc2VydGVkLmxlbmd0aCA/IFRleHQuZW1wdHkgOiBpbnNlcnRlZFtpbmRleF07XG4gICAgfVxuICAgIHRleHRCaXQobGVuKSB7XG4gICAgICAgIGxldCB7IGluc2VydGVkIH0gPSB0aGlzLnNldCwgaW5kZXggPSAodGhpcy5pIC0gMikgPj4gMTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IGluc2VydGVkLmxlbmd0aCAmJiAhbGVuID8gVGV4dC5lbXB0eVxuICAgICAgICAgICAgOiBpbnNlcnRlZFtpbmRleF0uc2xpY2UodGhpcy5vZmYsIGxlbiA9PSBudWxsID8gdW5kZWZpbmVkIDogdGhpcy5vZmYgKyBsZW4pO1xuICAgIH1cbiAgICBmb3J3YXJkKGxlbikge1xuICAgICAgICBpZiAobGVuID09IHRoaXMubGVuKVxuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sZW4gLT0gbGVuO1xuICAgICAgICAgICAgdGhpcy5vZmYgKz0gbGVuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvcndhcmQyKGxlbikge1xuICAgICAgICBpZiAodGhpcy5pbnMgPT0gLTEpXG4gICAgICAgICAgICB0aGlzLmZvcndhcmQobGVuKTtcbiAgICAgICAgZWxzZSBpZiAobGVuID09IHRoaXMuaW5zKVxuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnMgLT0gbGVuO1xuICAgICAgICAgICAgdGhpcy5vZmYgKz0gbGVuO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbkEgc2luZ2xlIHNlbGVjdGlvbiByYW5nZS4gV2hlblxuW2BhbGxvd011bHRpcGxlU2VsZWN0aW9uc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVeYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpXG5pcyBlbmFibGVkLCBhIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU2VsZWN0aW9uKSBtYXkgaG9sZFxubXVsdGlwbGUgcmFuZ2VzLiBCeSBkZWZhdWx0LCBzZWxlY3Rpb25zIGhvbGQgZXhhY3RseSBvbmUgcmFuZ2UuXG4qL1xuY2xhc3MgU2VsZWN0aW9uUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgdG8sIGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgYW5jaG9yIG9mIHRoZSByYW5nZVx1MjAxNHRoZSBzaWRlIHRoYXQgZG9lc24ndCBtb3ZlIHdoZW4geW91XG4gICAgZXh0ZW5kIGl0LlxuICAgICovXG4gICAgZ2V0IGFuY2hvcigpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiAzMiAvKiBSYW5nZUZsYWcuSW52ZXJ0ZWQgKi8gPyB0aGlzLnRvIDogdGhpcy5mcm9tOyB9XG4gICAgLyoqXG4gICAgVGhlIGhlYWQgb2YgdGhlIHJhbmdlLCB3aGljaCBpcyBtb3ZlZCB3aGVuIHRoZSByYW5nZSBpc1xuICAgIFtleHRlbmRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZS5leHRlbmQpLlxuICAgICovXG4gICAgZ2V0IGhlYWQoKSB7IHJldHVybiB0aGlzLmZsYWdzICYgMzIgLyogUmFuZ2VGbGFnLkludmVydGVkICovID8gdGhpcy5mcm9tIDogdGhpcy50bzsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiBgYW5jaG9yYCBhbmQgYGhlYWRgIGFyZSBhdCB0aGUgc2FtZSBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGdldCBlbXB0eSgpIHsgcmV0dXJuIHRoaXMuZnJvbSA9PSB0aGlzLnRvOyB9XG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBhIGN1cnNvciB0aGF0IGlzIGV4cGxpY2l0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgIGNoYXJhY3RlciBvbiBvbmUgb2YgaXRzIHNpZGVzLCB0aGlzIHJldHVybnMgdGhlIHNpZGUuIC0xIG1lYW5zXG4gICAgdGhlIGNoYXJhY3RlciBiZWZvcmUgaXRzIHBvc2l0aW9uLCAxIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIsIGFuZCAwXG4gICAgbWVhbnMgbm8gYXNzb2NpYXRpb24uXG4gICAgKi9cbiAgICBnZXQgYXNzb2MoKSB7IHJldHVybiB0aGlzLmZsYWdzICYgOCAvKiBSYW5nZUZsYWcuQXNzb2NCZWZvcmUgKi8gPyAtMSA6IHRoaXMuZmxhZ3MgJiAxNiAvKiBSYW5nZUZsYWcuQXNzb2NBZnRlciAqLyA/IDEgOiAwOyB9XG4gICAgLyoqXG4gICAgVGhlIGJpZGlyZWN0aW9uYWwgdGV4dCBsZXZlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjdXJzb3IsIGlmXG4gICAgYW55LlxuICAgICovXG4gICAgZ2V0IGJpZGlMZXZlbCgpIHtcbiAgICAgICAgbGV0IGxldmVsID0gdGhpcy5mbGFncyAmIDcgLyogUmFuZ2VGbGFnLkJpZGlMZXZlbE1hc2sgKi87XG4gICAgICAgIHJldHVybiBsZXZlbCA9PSA3ID8gbnVsbCA6IGxldmVsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZ29hbCBjb2x1bW4gKHN0b3JlZCB2ZXJ0aWNhbCBvZmZzZXQpIGFzc29jaWF0ZWQgd2l0aCBhXG4gICAgY3Vyc29yLiBUaGlzIGlzIHVzZWQgdG8gcHJlc2VydmUgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIHdoZW5cbiAgICBbbW92aW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5tb3ZlVmVydGljYWxseSkgYWNyb3NzXG4gICAgbGluZXMgb2YgZGlmZmVyZW50IGxlbmd0aC5cbiAgICAqL1xuICAgIGdldCBnb2FsQ29sdW1uKCkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmZsYWdzID4+IDYgLyogUmFuZ2VGbGFnLkdvYWxDb2x1bW5PZmZzZXQgKi87XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PSAxNjc3NzIxNSAvKiBSYW5nZUZsYWcuTm9Hb2FsQ29sdW1uICovID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIHJhbmdlIHRocm91Z2ggYSBjaGFuZ2UsIHByb2R1Y2luZyBhIHZhbGlkIHJhbmdlIGluIHRoZVxuICAgIHVwZGF0ZWQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBtYXAoY2hhbmdlLCBhc3NvYyA9IC0xKSB7XG4gICAgICAgIGxldCBmcm9tLCB0bztcbiAgICAgICAgaWYgKHRoaXMuZW1wdHkpIHtcbiAgICAgICAgICAgIGZyb20gPSB0byA9IGNoYW5nZS5tYXBQb3ModGhpcy5mcm9tLCBhc3NvYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmcm9tID0gY2hhbmdlLm1hcFBvcyh0aGlzLmZyb20sIDEpO1xuICAgICAgICAgICAgdG8gPSBjaGFuZ2UubWFwUG9zKHRoaXMudG8sIC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbSA9PSB0aGlzLmZyb20gJiYgdG8gPT0gdGhpcy50byA/IHRoaXMgOiBuZXcgU2VsZWN0aW9uUmFuZ2UoZnJvbSwgdG8sIHRoaXMuZmxhZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBFeHRlbmQgdGhpcyByYW5nZSB0byBjb3ZlciBhdCBsZWFzdCBgZnJvbWAgdG8gYHRvYC5cbiAgICAqL1xuICAgIGV4dGVuZChmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgaWYgKGZyb20gPD0gdGhpcy5hbmNob3IgJiYgdG8gPj0gdGhpcy5hbmNob3IpXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgbGV0IGhlYWQgPSBNYXRoLmFicyhmcm9tIC0gdGhpcy5hbmNob3IpID4gTWF0aC5hYnModG8gLSB0aGlzLmFuY2hvcikgPyBmcm9tIDogdG87XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UodGhpcy5hbmNob3IsIGhlYWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgcmFuZ2UgdG8gYW5vdGhlciByYW5nZS5cbiAgICAqL1xuICAgIGVxKG90aGVyLCBpbmNsdWRlQXNzb2MgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmNob3IgPT0gb3RoZXIuYW5jaG9yICYmIHRoaXMuaGVhZCA9PSBvdGhlci5oZWFkICYmXG4gICAgICAgICAgICAoIWluY2x1ZGVBc3NvYyB8fCAhdGhpcy5lbXB0eSB8fCB0aGlzLmFzc29jID09IG90aGVyLmFzc29jKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgSlNPTi1zZXJpYWxpemFibGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7IHJldHVybiB7IGFuY2hvcjogdGhpcy5hbmNob3IsIGhlYWQ6IHRoaXMuaGVhZCB9OyB9XG4gICAgLyoqXG4gICAgQ29udmVydCBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSByYW5nZSB0byBhIGBTZWxlY3Rpb25SYW5nZWBcbiAgICBpbnN0YW5jZS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbiB8fCB0eXBlb2YganNvbi5hbmNob3IgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5oZWFkICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgU2VsZWN0aW9uUmFuZ2VcIik7XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoanNvbi5hbmNob3IsIGpzb24uaGVhZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShmcm9tLCB0bywgZmxhZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25SYW5nZShmcm9tLCB0bywgZmxhZ3MpO1xuICAgIH1cbn1cbi8qKlxuQW4gZWRpdG9yIHNlbGVjdGlvbiBob2xkcyBvbmUgb3IgbW9yZSBzZWxlY3Rpb24gcmFuZ2VzLlxuKi9cbmNsYXNzIEVkaXRvclNlbGVjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHJhbmdlcyBpbiB0aGUgc2VsZWN0aW9uLCBzb3J0ZWQgYnkgcG9zaXRpb24uIFJhbmdlcyBjYW5ub3RcbiAgICBvdmVybGFwIChidXQgdGhleSBtYXkgdG91Y2gsIGlmIHRoZXkgYXJlbid0IGVtcHR5KS5cbiAgICAqL1xuICAgIHJhbmdlcywgXG4gICAgLyoqXG4gICAgVGhlIGluZGV4IG9mIHRoZSBfbWFpbl8gcmFuZ2UgaW4gdGhlIHNlbGVjdGlvbiAod2hpY2ggaXNcbiAgICB1c3VhbGx5IHRoZSByYW5nZSB0aGF0IHdhcyBhZGRlZCBsYXN0KS5cbiAgICAqL1xuICAgIG1haW5JbmRleCkge1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5tYWluSW5kZXggPSBtYWluSW5kZXg7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCBhIHNlbGVjdGlvbiB0aHJvdWdoIGEgY2hhbmdlLiBVc2VkIHRvIGFkanVzdCB0aGUgc2VsZWN0aW9uXG4gICAgcG9zaXRpb24gZm9yIGNoYW5nZXMuXG4gICAgKi9cbiAgICBtYXAoY2hhbmdlLCBhc3NvYyA9IC0xKSB7XG4gICAgICAgIGlmIChjaGFuZ2UuZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUodGhpcy5yYW5nZXMubWFwKHIgPT4gci5tYXAoY2hhbmdlLCBhc3NvYykpLCB0aGlzLm1haW5JbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBzZWxlY3Rpb24gdG8gYW5vdGhlciBzZWxlY3Rpb24uIEJ5IGRlZmF1bHQsIHJhbmdlc1xuICAgIGFyZSBjb21wYXJlZCBvbmx5IGJ5IHBvc2l0aW9uLiBXaGVuIGBpbmNsdWRlQXNzb2NgIGlzIHRydWUsXG4gICAgY3Vyc29yIHJhbmdlcyBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZVxuICAgIFtgYXNzb2NgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvblJhbmdlLmFzc29jKSB2YWx1ZS5cbiAgICAqL1xuICAgIGVxKG90aGVyLCBpbmNsdWRlQXNzb2MgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5yYW5nZXMubGVuZ3RoICE9IG90aGVyLnJhbmdlcy5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMubWFpbkluZGV4ICE9IG90aGVyLm1haW5JbmRleClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5yYW5nZXNbaV0uZXEob3RoZXIucmFuZ2VzW2ldLCBpbmNsdWRlQXNzb2MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcHJpbWFyeSBzZWxlY3Rpb24gcmFuZ2UuIFVzdWFsbHksIHlvdSBzaG91bGQgbWFrZSBzdXJlXG4gICAgeW91ciBjb2RlIGFwcGxpZXMgdG8gX2FsbF8gcmFuZ2VzLCBieSB1c2luZyBtZXRob2RzIGxpa2VcbiAgICBbYGNoYW5nZUJ5UmFuZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYW5nZUJ5UmFuZ2UpLlxuICAgICovXG4gICAgZ2V0IG1haW4oKSB7IHJldHVybiB0aGlzLnJhbmdlc1t0aGlzLm1haW5JbmRleF07IH1cbiAgICAvKipcbiAgICBNYWtlIHN1cmUgdGhlIHNlbGVjdGlvbiBvbmx5IGhhcyBvbmUgcmFuZ2UuIFJldHVybnMgYSBzZWxlY3Rpb25cbiAgICBob2xkaW5nIG9ubHkgdGhlIG1haW4gcmFuZ2UgZnJvbSB0aGlzIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIGFzU2luZ2xlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXMubGVuZ3RoID09IDEgPyB0aGlzIDogbmV3IEVkaXRvclNlbGVjdGlvbihbdGhpcy5tYWluXSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dGVuZCB0aGlzIHNlbGVjdGlvbiB3aXRoIGFuIGV4dHJhIHJhbmdlLlxuICAgICovXG4gICAgYWRkUmFuZ2UocmFuZ2UsIG1haW4gPSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKFtyYW5nZV0uY29uY2F0KHRoaXMucmFuZ2VzKSwgbWFpbiA/IDAgOiB0aGlzLm1haW5JbmRleCArIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIGEgZ2l2ZW4gcmFuZ2Ugd2l0aCBhbm90aGVyIHJhbmdlLCBhbmQgdGhlbiBub3JtYWxpemUgdGhlXG4gICAgc2VsZWN0aW9uIHRvIG1lcmdlIGFuZCBzb3J0IHJhbmdlcyBpZiBuZWNlc3NhcnkuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2UocmFuZ2UsIHdoaWNoID0gdGhpcy5tYWluSW5kZXgpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IHRoaXMucmFuZ2VzLnNsaWNlKCk7XG4gICAgICAgIHJhbmdlc1t3aGljaF0gPSByYW5nZTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCB0aGlzLm1haW5JbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhpcyBzZWxlY3Rpb24gdG8gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHNlcmlhbGl6ZWQgdG9cbiAgICBKU09OLlxuICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyByYW5nZXM6IHRoaXMucmFuZ2VzLm1hcChyID0+IHIudG9KU09OKCkpLCBtYWluOiB0aGlzLm1haW5JbmRleCB9O1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZWxlY3Rpb24gZnJvbSBhIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIUFycmF5LmlzQXJyYXkoanNvbi5yYW5nZXMpIHx8IHR5cGVvZiBqc29uLm1haW4gIT0gXCJudW1iZXJcIiB8fCBqc29uLm1haW4gPj0ganNvbi5yYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVkaXRvclNlbGVjdGlvblwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24oanNvbi5yYW5nZXMubWFwKChyKSA9PiBTZWxlY3Rpb25SYW5nZS5mcm9tSlNPTihyKSksIGpzb24ubWFpbik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlbGVjdGlvbiBob2xkaW5nIGEgc2luZ2xlIHJhbmdlLlxuICAgICovXG4gICAgc3RhdGljIHNpbmdsZShhbmNob3IsIGhlYWQgPSBhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24oW0VkaXRvclNlbGVjdGlvbi5yYW5nZShhbmNob3IsIGhlYWQpXSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFNvcnQgYW5kIG1lcmdlIHRoZSBnaXZlbiBzZXQgb2YgcmFuZ2VzLCBjcmVhdGluZyBhIHZhbGlkXG4gICAgc2VsZWN0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShyYW5nZXMsIG1haW5JbmRleCA9IDApIHtcbiAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQSBzZWxlY3Rpb24gbmVlZHMgYXQgbGVhc3Qgb25lIHJhbmdlXCIpO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5ID8gcmFuZ2UuZnJvbSA8PSBwb3MgOiByYW5nZS5mcm9tIDwgcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ubm9ybWFsaXplZChyYW5nZXMuc2xpY2UoKSwgbWFpbkluZGV4KTtcbiAgICAgICAgICAgIHBvcyA9IHJhbmdlLnRvO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU2VsZWN0aW9uKHJhbmdlcywgbWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY3Vyc29yIHNlbGVjdGlvbiByYW5nZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uIFlvdSBjYW5cbiAgICBzYWZlbHkgaWdub3JlIHRoZSBvcHRpb25hbCBhcmd1bWVudHMgaW4gbW9zdCBzaXR1YXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGN1cnNvcihwb3MsIGFzc29jID0gMCwgYmlkaUxldmVsLCBnb2FsQ29sdW1uKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25SYW5nZS5jcmVhdGUocG9zLCBwb3MsIChhc3NvYyA9PSAwID8gMCA6IGFzc29jIDwgMCA/IDggLyogUmFuZ2VGbGFnLkFzc29jQmVmb3JlICovIDogMTYgLyogUmFuZ2VGbGFnLkFzc29jQWZ0ZXIgKi8pIHxcbiAgICAgICAgICAgIChiaWRpTGV2ZWwgPT0gbnVsbCA/IDcgOiBNYXRoLm1pbig2LCBiaWRpTGV2ZWwpKSB8XG4gICAgICAgICAgICAoKGdvYWxDb2x1bW4gIT09IG51bGwgJiYgZ29hbENvbHVtbiAhPT0gdm9pZCAwID8gZ29hbENvbHVtbiA6IDE2Nzc3MjE1IC8qIFJhbmdlRmxhZy5Ob0dvYWxDb2x1bW4gKi8pIDw8IDYgLyogUmFuZ2VGbGFnLkdvYWxDb2x1bW5PZmZzZXQgKi8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VsZWN0aW9uIHJhbmdlLlxuICAgICovXG4gICAgc3RhdGljIHJhbmdlKGFuY2hvciwgaGVhZCwgZ29hbENvbHVtbiwgYmlkaUxldmVsKSB7XG4gICAgICAgIGxldCBmbGFncyA9ICgoZ29hbENvbHVtbiAhPT0gbnVsbCAmJiBnb2FsQ29sdW1uICE9PSB2b2lkIDAgPyBnb2FsQ29sdW1uIDogMTY3NzcyMTUgLyogUmFuZ2VGbGFnLk5vR29hbENvbHVtbiAqLykgPDwgNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLykgfFxuICAgICAgICAgICAgKGJpZGlMZXZlbCA9PSBudWxsID8gNyA6IE1hdGgubWluKDYsIGJpZGlMZXZlbCkpO1xuICAgICAgICByZXR1cm4gaGVhZCA8IGFuY2hvciA/IFNlbGVjdGlvblJhbmdlLmNyZWF0ZShoZWFkLCBhbmNob3IsIDMyIC8qIFJhbmdlRmxhZy5JbnZlcnRlZCAqLyB8IDE2IC8qIFJhbmdlRmxhZy5Bc3NvY0FmdGVyICovIHwgZmxhZ3MpXG4gICAgICAgICAgICA6IFNlbGVjdGlvblJhbmdlLmNyZWF0ZShhbmNob3IsIGhlYWQsIChoZWFkID4gYW5jaG9yID8gOCAvKiBSYW5nZUZsYWcuQXNzb2NCZWZvcmUgKi8gOiAwKSB8IGZsYWdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgbm9ybWFsaXplZChyYW5nZXMsIG1haW5JbmRleCA9IDApIHtcbiAgICAgICAgbGV0IG1haW4gPSByYW5nZXNbbWFpbkluZGV4XTtcbiAgICAgICAgcmFuZ2VzLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSk7XG4gICAgICAgIG1haW5JbmRleCA9IHJhbmdlcy5pbmRleE9mKG1haW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gcmFuZ2VzW2ldLCBwcmV2ID0gcmFuZ2VzW2kgLSAxXTtcbiAgICAgICAgICAgIGlmIChyYW5nZS5lbXB0eSA/IHJhbmdlLmZyb20gPD0gcHJldi50byA6IHJhbmdlLmZyb20gPCBwcmV2LnRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBwcmV2LmZyb20sIHRvID0gTWF0aC5tYXgocmFuZ2UudG8sIHByZXYudG8pO1xuICAgICAgICAgICAgICAgIGlmIChpIDw9IG1haW5JbmRleClcbiAgICAgICAgICAgICAgICAgICAgbWFpbkluZGV4LS07XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnNwbGljZSgtLWksIDIsIHJhbmdlLmFuY2hvciA+IHJhbmdlLmhlYWQgPyBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UodG8sIGZyb20pIDogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24ocmFuZ2VzLCBtYWluSW5kZXgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0aW9uKHNlbGVjdGlvbiwgZG9jTGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc2VsZWN0aW9uLnJhbmdlcylcbiAgICAgICAgaWYgKHJhbmdlLnRvID4gZG9jTGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTZWxlY3Rpb24gcG9pbnRzIG91dHNpZGUgb2YgZG9jdW1lbnRcIik7XG59XG5cbmxldCBuZXh0SUQgPSAwO1xuLyoqXG5BIGZhY2V0IGlzIGEgbGFiZWxlZCB2YWx1ZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlZGl0b3JcbnN0YXRlLiBJdCB0YWtlcyBpbnB1dHMgZnJvbSBhbnkgbnVtYmVyIG9mIGV4dGVuc2lvbnMsIGFuZCBjb21iaW5lc1xudGhvc2UgaW50byBhIHNpbmdsZSBvdXRwdXQgdmFsdWUuXG5cbkV4YW1wbGVzIG9mIHVzZXMgb2YgZmFjZXRzIGFyZSB0aGUgW3RhYlxuc2l6ZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50YWJTaXplKSwgW2VkaXRvclxuYXR0cmlidXRlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZWRpdG9yQXR0cmlidXRlcyksIGFuZCBbdXBkYXRlXG5saXN0ZW5lcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnVwZGF0ZUxpc3RlbmVyKS5cblxuTm90ZSB0aGF0IGBGYWNldGAgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFueXdoZXJlIHdoZXJlXG5bYEZhY2V0UmVhZGVyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5GYWNldFJlYWRlcikgaXMgZXhwZWN0ZWQuXG4qL1xuY2xhc3MgRmFjZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tYmluZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlSW5wdXQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGFyZSwgaXNTdGF0aWMsIGVuYWJsZXMpIHtcbiAgICAgICAgdGhpcy5jb21iaW5lID0gY29tYmluZTtcbiAgICAgICAgdGhpcy5jb21wYXJlSW5wdXQgPSBjb21wYXJlSW5wdXQ7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG4gICAgICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gbmV4dElEKys7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IGNvbWJpbmUoW10pO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSB0eXBlb2YgZW5hYmxlcyA9PSBcImZ1bmN0aW9uXCIgPyBlbmFibGVzKHRoaXMpIDogZW5hYmxlcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIGZhY2V0IHJlYWRlciBmb3IgdGhpcyBmYWNldCwgd2hpY2ggY2FuIGJlIHVzZWQgdG9cbiAgICBbcmVhZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5mYWNldCkgaXQgYnV0IG5vdCB0byBkZWZpbmUgdmFsdWVzIGZvciBpdC5cbiAgICAqL1xuICAgIGdldCByZWFkZXIoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IGZhY2V0LlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShjb25maWcgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0KGNvbmZpZy5jb21iaW5lIHx8ICgoYSkgPT4gYSksIGNvbmZpZy5jb21wYXJlSW5wdXQgfHwgKChhLCBiKSA9PiBhID09PSBiKSwgY29uZmlnLmNvbXBhcmUgfHwgKCFjb25maWcuY29tYmluZSA/IHNhbWVBcnJheSA6IChhLCBiKSA9PiBhID09PSBiKSwgISFjb25maWcuc3RhdGljLCBjb25maWcuZW5hYmxlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhpcyBmYWNldC5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXRQcm92aWRlcihbXSwgdGhpcywgMCAvKiBQcm92aWRlci5TdGF0aWMgKi8sIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGNvbXB1dGVzIGEgdmFsdWUgZm9yIHRoZSBmYWNldCBmcm9tIGFcbiAgICBzdGF0ZS4gWW91IG11c3QgdGFrZSBjYXJlIHRvIGRlY2xhcmUgdGhlIHBhcnRzIG9mIHRoZSBzdGF0ZSB0aGF0XG4gICAgdGhpcyB2YWx1ZSBkZXBlbmRzIG9uLCBzaW5jZSB5b3VyIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGFnYWluXG4gICAgZm9yIGEgbmV3IHN0YXRlIHdoZW4gb25lIG9mIHRob3NlIHBhcnRzIGNoYW5nZWQuXG4gICAgXG4gICAgSW4gY2FzZXMgd2hlcmUgeW91ciB2YWx1ZSBkZXBlbmRzIG9ubHkgb24gYSBzaW5nbGUgZmllbGQsIHlvdSdsbFxuICAgIHdhbnQgdG8gdXNlIHRoZSBbYGZyb21gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0LmZyb20pIG1ldGhvZCBpbnN0ZWFkLlxuICAgICovXG4gICAgY29tcHV0ZShkZXBzLCBnZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjb21wdXRlIGEgc3RhdGljIGZhY2V0XCIpO1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0UHJvdmlkZXIoZGVwcywgdGhpcywgMSAvKiBQcm92aWRlci5TaW5nbGUgKi8sIGdldCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBjb21wdXRlcyB6ZXJvIG9yIG1vcmUgdmFsdWVzIGZvciB0aGlzXG4gICAgZmFjZXQgZnJvbSBhIHN0YXRlLlxuICAgICovXG4gICAgY29tcHV0ZU4oZGVwcywgZ2V0KSB7XG4gICAgICAgIGlmICh0aGlzLmlzU3RhdGljKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY29tcHV0ZSBhIHN0YXRpYyBmYWNldFwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldFByb3ZpZGVyKGRlcHMsIHRoaXMsIDIgLyogUHJvdmlkZXIuTXVsdGkgKi8sIGdldCk7XG4gICAgfVxuICAgIGZyb20oZmllbGQsIGdldCkge1xuICAgICAgICBpZiAoIWdldClcbiAgICAgICAgICAgIGdldCA9IHggPT4geDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZShbZmllbGRdLCBzdGF0ZSA9PiBnZXQoc3RhdGUuZmllbGQoZmllbGQpKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZUFycmF5KGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PSBiIHx8IGEubGVuZ3RoID09IGIubGVuZ3RoICYmIGEuZXZlcnkoKGUsIGkpID0+IGUgPT09IGJbaV0pO1xufVxuY2xhc3MgRmFjZXRQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoZGVwZW5kZW5jaWVzLCBmYWNldCwgdHlwZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7XG4gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlkID0gbmV4dElEKys7XG4gICAgfVxuICAgIGR5bmFtaWNTbG90KGFkZHJlc3Nlcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBnZXR0ZXIgPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgY29tcGFyZSA9IHRoaXMuZmFjZXQuY29tcGFyZUlucHV0O1xuICAgICAgICBsZXQgaWQgPSB0aGlzLmlkLCBpZHggPSBhZGRyZXNzZXNbaWRdID4+IDEsIG11bHRpID0gdGhpcy50eXBlID09IDIgLyogUHJvdmlkZXIuTXVsdGkgKi87XG4gICAgICAgIGxldCBkZXBEb2MgPSBmYWxzZSwgZGVwU2VsID0gZmFsc2UsIGRlcEFkZHJzID0gW107XG4gICAgICAgIGZvciAobGV0IGRlcCBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgaWYgKGRlcCA9PSBcImRvY1wiKVxuICAgICAgICAgICAgICAgIGRlcERvYyA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChkZXAgPT0gXCJzZWxlY3Rpb25cIilcbiAgICAgICAgICAgICAgICBkZXBTZWwgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoKCgoX2EgPSBhZGRyZXNzZXNbZGVwLmlkXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMSkgJiAxKSA9PSAwKVxuICAgICAgICAgICAgICAgIGRlcEFkZHJzLnB1c2goYWRkcmVzc2VzW2RlcC5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjcmVhdGUoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IGdldHRlcihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZShzdGF0ZSwgdHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGRlcERvYyAmJiB0ci5kb2NDaGFuZ2VkKSB8fCAoZGVwU2VsICYmICh0ci5kb2NDaGFuZ2VkIHx8IHRyLnNlbGVjdGlvbikpIHx8IGVuc3VyZUFsbChzdGF0ZSwgZGVwQWRkcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGkgPyAhY29tcGFyZUFycmF5KG5ld1ZhbCwgc3RhdGUudmFsdWVzW2lkeF0sIGNvbXBhcmUpIDogIWNvbXBhcmUobmV3VmFsLCBzdGF0ZS52YWx1ZXNbaWR4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gbmV3VmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlY29uZmlndXJlOiAoc3RhdGUsIG9sZFN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhbCwgb2xkQWRkciA9IG9sZFN0YXRlLmNvbmZpZy5hZGRyZXNzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAob2xkQWRkciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvbGRWYWwgPSBnZXRBZGRyKG9sZFN0YXRlLCBvbGRBZGRyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzLmV2ZXJ5KGRlcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVwIGluc3RhbmNlb2YgRmFjZXQgPyBvbGRTdGF0ZS5mYWNldChkZXApID09PSBzdGF0ZS5mYWNldChkZXApIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXAgaW5zdGFuY2VvZiBTdGF0ZUZpZWxkID8gb2xkU3RhdGUuZmllbGQoZGVwLCBmYWxzZSkgPT0gc3RhdGUuZmllbGQoZGVwLCBmYWxzZSkgOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KSB8fCAobXVsdGkgPyBjb21wYXJlQXJyYXkobmV3VmFsID0gZ2V0dGVyKHN0YXRlKSwgb2xkVmFsLCBjb21wYXJlKSA6IGNvbXBhcmUobmV3VmFsID0gZ2V0dGVyKHN0YXRlKSwgb2xkVmFsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbCA9IGdldHRlcihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gbmV3VmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wYXJlQXJyYXkoYSwgYiwgY29tcGFyZSkge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFjb21wYXJlKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZW5zdXJlQWxsKHN0YXRlLCBhZGRycykge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgYWRkciBvZiBhZGRycylcbiAgICAgICAgaWYgKGVuc3VyZUFkZHIoc3RhdGUsIGFkZHIpICYgMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi8pXG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGR5bmFtaWNGYWNldFNsb3QoYWRkcmVzc2VzLCBmYWNldCwgcHJvdmlkZXJzKSB7XG4gICAgbGV0IHByb3ZpZGVyQWRkcnMgPSBwcm92aWRlcnMubWFwKHAgPT4gYWRkcmVzc2VzW3AuaWRdKTtcbiAgICBsZXQgcHJvdmlkZXJUeXBlcyA9IHByb3ZpZGVycy5tYXAocCA9PiBwLnR5cGUpO1xuICAgIGxldCBkeW5hbWljID0gcHJvdmlkZXJBZGRycy5maWx0ZXIocCA9PiAhKHAgJiAxKSk7XG4gICAgbGV0IGlkeCA9IGFkZHJlc3Nlc1tmYWNldC5pZF0gPj4gMTtcbiAgICBmdW5jdGlvbiBnZXQoc3RhdGUpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3ZpZGVyQWRkcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldEFkZHIoc3RhdGUsIHByb3ZpZGVyQWRkcnNbaV0pO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyVHlwZXNbaV0gPT0gMiAvKiBQcm92aWRlci5NdWx0aSAqLylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWNldC5jb21iaW5lKHZhbHVlcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgYWRkciBvZiBwcm92aWRlckFkZHJzKVxuICAgICAgICAgICAgICAgIGVuc3VyZUFkZHIoc3RhdGUsIGFkZHIpO1xuICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBnZXQoc3RhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICB9LFxuICAgICAgICB1cGRhdGUoc3RhdGUsIHRyKSB7XG4gICAgICAgICAgICBpZiAoIWVuc3VyZUFsbChzdGF0ZSwgZHluYW1pYykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXQoc3RhdGUpO1xuICAgICAgICAgICAgaWYgKGZhY2V0LmNvbXBhcmUodmFsdWUsIHN0YXRlLnZhbHVlc1tpZHhdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH0sXG4gICAgICAgIHJlY29uZmlndXJlKHN0YXRlLCBvbGRTdGF0ZSkge1xuICAgICAgICAgICAgbGV0IGRlcENoYW5nZWQgPSBlbnN1cmVBbGwoc3RhdGUsIHByb3ZpZGVyQWRkcnMpO1xuICAgICAgICAgICAgbGV0IG9sZFByb3ZpZGVycyA9IG9sZFN0YXRlLmNvbmZpZy5mYWNldHNbZmFjZXQuaWRdLCBvbGRWYWx1ZSA9IG9sZFN0YXRlLmZhY2V0KGZhY2V0KTtcbiAgICAgICAgICAgIGlmIChvbGRQcm92aWRlcnMgJiYgIWRlcENoYW5nZWQgJiYgc2FtZUFycmF5KHByb3ZpZGVycywgb2xkUHJvdmlkZXJzKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkVmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXQoc3RhdGUpO1xuICAgICAgICAgICAgaWYgKGZhY2V0LmNvbXBhcmUodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkVmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmNvbnN0IGluaXRGaWVsZCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBzdGF0aWM6IHRydWUgfSk7XG4vKipcbkZpZWxkcyBjYW4gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiBhbiBlZGl0b3Igc3RhdGUsIGFuZFxua2VlcCBpdCBpbiBzeW5jIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN0YXRlLlxuKi9cbmNsYXNzIFN0YXRlRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaWQsIGNyZWF0ZUYsIHVwZGF0ZUYsIGNvbXBhcmVGLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmNyZWF0ZUYgPSBjcmVhdGVGO1xuICAgICAgICB0aGlzLnVwZGF0ZUYgPSB1cGRhdGVGO1xuICAgICAgICB0aGlzLmNvbXBhcmVGID0gY29tcGFyZUY7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm92aWRlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgc3RhdGUgZmllbGQuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKGNvbmZpZykge1xuICAgICAgICBsZXQgZmllbGQgPSBuZXcgU3RhdGVGaWVsZChuZXh0SUQrKywgY29uZmlnLmNyZWF0ZSwgY29uZmlnLnVwZGF0ZSwgY29uZmlnLmNvbXBhcmUgfHwgKChhLCBiKSA9PiBhID09PSBiKSwgY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlKVxuICAgICAgICAgICAgZmllbGQucHJvdmlkZXMgPSBjb25maWcucHJvdmlkZShmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG4gICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgIGxldCBpbml0ID0gc3RhdGUuZmFjZXQoaW5pdEZpZWxkKS5maW5kKGkgPT4gaS5maWVsZCA9PSB0aGlzKTtcbiAgICAgICAgcmV0dXJuICgoaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LmNyZWF0ZSkgfHwgdGhpcy5jcmVhdGVGKShzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2xvdChhZGRyZXNzZXMpIHtcbiAgICAgICAgbGV0IGlkeCA9IGFkZHJlc3Nlc1t0aGlzLmlkXSA+PiAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlOiAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHRoaXMuY3JlYXRlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlOiAoc3RhdGUsIHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG9sZFZhbCA9IHN0YXRlLnZhbHVlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudXBkYXRlRihvbGRWYWwsIHRyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYXJlRihvbGRWYWwsIHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjb25maWd1cmU6IChzdGF0ZSwgb2xkU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdCA9IHN0YXRlLmZhY2V0KGluaXRGaWVsZCksIG9sZEluaXQgPSBvbGRTdGF0ZS5mYWNldChpbml0RmllbGQpLCByZUluaXQ7XG4gICAgICAgICAgICAgICAgaWYgKChyZUluaXQgPSBpbml0LmZpbmQoaSA9PiBpLmZpZWxkID09IHRoaXMpKSAmJiByZUluaXQgIT0gb2xkSW5pdC5maW5kKGkgPT4gaS5maWVsZCA9PSB0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHJlSW5pdC5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5jb25maWcuYWRkcmVzc1t0aGlzLmlkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkU3RhdGUuZmllbGQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHRoaXMuY3JlYXRlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyB0aGlzIGZpZWxkIGFuZCBvdmVycmlkZXMgdGhlXG4gICAgd2F5IGl0IGlzIGluaXRpYWxpemVkLiBDYW4gYmUgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gcHJvdmlkZSBhXG4gICAgbm9uLWRlZmF1bHQgc3RhcnRpbmcgdmFsdWUgZm9yIHRoZSBmaWVsZC5cbiAgICAqL1xuICAgIGluaXQoY3JlYXRlKSB7XG4gICAgICAgIHJldHVybiBbdGhpcywgaW5pdEZpZWxkLm9mKHsgZmllbGQ6IHRoaXMsIGNyZWF0ZSB9KV07XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXRlIGZpZWxkIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhc1xuICAgIFtgRXh0ZW5zaW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FeHRlbnNpb24pIHZhbHVlcyB0byBlbmFibGUgdGhlIGZpZWxkIGluIGFcbiAgICBnaXZlbiBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBleHRlbnNpb24oKSB7IHJldHVybiB0aGlzOyB9XG59XG5jb25zdCBQcmVjXyA9IHsgbG93ZXN0OiA0LCBsb3c6IDMsIGRlZmF1bHQ6IDIsIGhpZ2g6IDEsIGhpZ2hlc3Q6IDAgfTtcbmZ1bmN0aW9uIHByZWModmFsdWUpIHtcbiAgICByZXR1cm4gKGV4dCkgPT4gbmV3IFByZWNFeHRlbnNpb24oZXh0LCB2YWx1ZSk7XG59XG4vKipcbkJ5IGRlZmF1bHQgZXh0ZW5zaW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmRcbmluIHRoZSBmbGF0dGVuZWQgZm9ybSBvZiBuZXN0ZWQgYXJyYXkgdGhhdCB3YXMgcHJvdmlkZWQuXG5JbmRpdmlkdWFsIGV4dGVuc2lvbiB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIGEgcHJlY2VkZW5jZSB0b1xub3ZlcnJpZGUgdGhpcy4gRXh0ZW5zaW9ucyB0aGF0IGRvIG5vdCBoYXZlIGEgcHJlY2VkZW5jZSBzZXQgZ2V0XG50aGUgcHJlY2VkZW5jZSBvZiB0aGUgbmVhcmVzdCBwYXJlbnQgd2l0aCBhIHByZWNlZGVuY2UsIG9yXG5bYGRlZmF1bHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlByZWMuZGVmYXVsdCkgaWYgdGhlcmUgaXMgbm8gc3VjaCBwYXJlbnQuIFRoZVxuZmluYWwgb3JkZXJpbmcgb2YgZXh0ZW5zaW9ucyBpcyBkZXRlcm1pbmVkIGJ5IGZpcnN0IHNvcnRpbmcgYnlcbnByZWNlZGVuY2UgYW5kIHRoZW4gYnkgb3JkZXIgd2l0aGluIGVhY2ggcHJlY2VkZW5jZS5cbiovXG5jb25zdCBQcmVjID0ge1xuICAgIC8qKlxuICAgIFRoZSBoaWdoZXN0IHByZWNlZGVuY2UgbGV2ZWwsIGZvciBleHRlbnNpb25zIHRoYXQgc2hvdWxkIGVuZCB1cFxuICAgIG5lYXIgdGhlIHN0YXJ0IG9mIHRoZSBwcmVjZWRlbmNlIG9yZGVyaW5nLlxuICAgICovXG4gICAgaGlnaGVzdDogLypAX19QVVJFX18qL3ByZWMoUHJlY18uaGlnaGVzdCksXG4gICAgLyoqXG4gICAgQSBoaWdoZXItdGhhbi1kZWZhdWx0IHByZWNlZGVuY2UsIGZvciBleHRlbnNpb25zIHRoYXQgc2hvdWxkXG4gICAgY29tZSBiZWZvcmUgdGhvc2Ugd2l0aCBkZWZhdWx0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBoaWdoOiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5oaWdoKSxcbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCBwcmVjZWRlbmNlLCB3aGljaCBpcyBhbHNvIHVzZWQgZm9yIGV4dGVuc2lvbnNcbiAgICB3aXRob3V0IGFuIGV4cGxpY2l0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBkZWZhdWx0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5kZWZhdWx0KSxcbiAgICAvKipcbiAgICBBIGxvd2VyLXRoYW4tZGVmYXVsdCBwcmVjZWRlbmNlLlxuICAgICovXG4gICAgbG93OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5sb3cpLFxuICAgIC8qKlxuICAgIFRoZSBsb3dlc3QgcHJlY2VkZW5jZSBsZXZlbC4gTWVhbnQgZm9yIHRoaW5ncyB0aGF0IHNob3VsZCBlbmQgdXBcbiAgICBuZWFyIHRoZSBlbmQgb2YgdGhlIGV4dGVuc2lvbiBvcmRlci5cbiAgICAqL1xuICAgIGxvd2VzdDogLypAX19QVVJFX18qL3ByZWMoUHJlY18ubG93ZXN0KVxufTtcbmNsYXNzIFByZWNFeHRlbnNpb24ge1xuICAgIGNvbnN0cnVjdG9yKGlubmVyLCBwcmVjKSB7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5wcmVjID0gcHJlYztcbiAgICB9XG59XG4vKipcbkV4dGVuc2lvbiBjb21wYXJ0bWVudHMgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIGNvbmZpZ3VyYXRpb25cbmR5bmFtaWMuIEJ5IFt3cmFwcGluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Db21wYXJ0bWVudC5vZikgcGFydCBvZiB5b3VyXG5jb25maWd1cmF0aW9uIGluIGEgY29tcGFydG1lbnQsIHlvdSBjYW4gbGF0ZXJcbltyZXBsYWNlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50LnJlY29uZmlndXJlKSB0aGF0IHBhcnQgdGhyb3VnaCBhXG50cmFuc2FjdGlvbi5cbiovXG5jbGFzcyBDb21wYXJ0bWVudCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY29tcGFydG1lbnQgdG8gYWRkIHRvIHlvdXIgW3N0YXRlXG4gICAgY29uZmlndXJhdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZUNvbmZpZy5leHRlbnNpb25zKS5cbiAgICAqL1xuICAgIG9mKGV4dCkgeyByZXR1cm4gbmV3IENvbXBhcnRtZW50SW5zdGFuY2UodGhpcywgZXh0KTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBbZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5lZmZlY3RzKSB0aGF0XG4gICAgcmVjb25maWd1cmVzIHRoaXMgY29tcGFydG1lbnQuXG4gICAgKi9cbiAgICByZWNvbmZpZ3VyZShjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZS5vZih7IGNvbXBhcnRtZW50OiB0aGlzLCBleHRlbnNpb246IGNvbnRlbnQgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBjb21wYXJ0bWVudCBpbiB0aGUgc3RhdGUsIG9yXG4gICAgYHVuZGVmaW5lZGAgaWYgaXQgaXNuJ3QgcHJlc2VudC5cbiAgICAqL1xuICAgIGdldChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gc3RhdGUuY29uZmlnLmNvbXBhcnRtZW50cy5nZXQodGhpcyk7XG4gICAgfVxufVxuY2xhc3MgQ29tcGFydG1lbnRJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IoY29tcGFydG1lbnQsIGlubmVyKSB7XG4gICAgICAgIHRoaXMuY29tcGFydG1lbnQgPSBjb21wYXJ0bWVudDtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgIH1cbn1cbmNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIGNvbXBhcnRtZW50cywgZHluYW1pY1Nsb3RzLCBhZGRyZXNzLCBzdGF0aWNWYWx1ZXMsIGZhY2V0cykge1xuICAgICAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgICAgICB0aGlzLmNvbXBhcnRtZW50cyA9IGNvbXBhcnRtZW50cztcbiAgICAgICAgdGhpcy5keW5hbWljU2xvdHMgPSBkeW5hbWljU2xvdHM7XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIHRoaXMuc3RhdGljVmFsdWVzID0gc3RhdGljVmFsdWVzO1xuICAgICAgICB0aGlzLmZhY2V0cyA9IGZhY2V0cztcbiAgICAgICAgdGhpcy5zdGF0dXNUZW1wbGF0ZSA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXNUZW1wbGF0ZS5sZW5ndGggPCBkeW5hbWljU2xvdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZW1wbGF0ZS5wdXNoKDAgLyogU2xvdFN0YXR1cy5VbnJlc29sdmVkICovKTtcbiAgICB9XG4gICAgc3RhdGljRmFjZXQoZmFjZXQpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmFkZHJlc3NbZmFjZXQuaWRdO1xuICAgICAgICByZXR1cm4gYWRkciA9PSBudWxsID8gZmFjZXQuZGVmYXVsdCA6IHRoaXMuc3RhdGljVmFsdWVzW2FkZHIgPj4gMV07XG4gICAgfVxuICAgIHN0YXRpYyByZXNvbHZlKGJhc2UsIGNvbXBhcnRtZW50cywgb2xkU3RhdGUpIHtcbiAgICAgICAgbGV0IGZpZWxkcyA9IFtdO1xuICAgICAgICBsZXQgZmFjZXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IG5ld0NvbXBhcnRtZW50cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChsZXQgZXh0IG9mIGZsYXR0ZW4oYmFzZSwgY29tcGFydG1lbnRzLCBuZXdDb21wYXJ0bWVudHMpKSB7XG4gICAgICAgICAgICBpZiAoZXh0IGluc3RhbmNlb2YgU3RhdGVGaWVsZClcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChleHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIChmYWNldHNbZXh0LmZhY2V0LmlkXSB8fCAoZmFjZXRzW2V4dC5mYWNldC5pZF0gPSBbXSkpLnB1c2goZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWRkcmVzcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBzdGF0aWNWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IGR5bmFtaWNTbG90cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGFkZHJlc3NbZmllbGQuaWRdID0gZHluYW1pY1Nsb3RzLmxlbmd0aCA8PCAxO1xuICAgICAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goYSA9PiBmaWVsZC5zbG90KGEpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2xkRmFjZXRzID0gb2xkU3RhdGUgPT09IG51bGwgfHwgb2xkU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9sZFN0YXRlLmNvbmZpZy5mYWNldHM7XG4gICAgICAgIGZvciAobGV0IGlkIGluIGZhY2V0cykge1xuICAgICAgICAgICAgbGV0IHByb3ZpZGVycyA9IGZhY2V0c1tpZF0sIGZhY2V0ID0gcHJvdmlkZXJzWzBdLmZhY2V0O1xuICAgICAgICAgICAgbGV0IG9sZFByb3ZpZGVycyA9IG9sZEZhY2V0cyAmJiBvbGRGYWNldHNbaWRdIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVycy5ldmVyeShwID0+IHAudHlwZSA9PSAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLykpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzW2ZhY2V0LmlkXSA9IChzdGF0aWNWYWx1ZXMubGVuZ3RoIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICBpZiAoc2FtZUFycmF5KG9sZFByb3ZpZGVycywgcHJvdmlkZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChvbGRTdGF0ZS5mYWNldChmYWNldCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmFjZXQuY29tYmluZShwcm92aWRlcnMubWFwKHAgPT4gcC52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChvbGRTdGF0ZSAmJiBmYWNldC5jb21wYXJlKHZhbHVlLCBvbGRTdGF0ZS5mYWNldChmYWNldCkpID8gb2xkU3RhdGUuZmFjZXQoZmFjZXQpIDogdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgb2YgcHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwLnR5cGUgPT0gMCAvKiBQcm92aWRlci5TdGF0aWMgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbcC5pZF0gPSAoc3RhdGljVmFsdWVzLmxlbmd0aCA8PCAxKSB8IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChwLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbcC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU2xvdHMucHVzaChhID0+IHAuZHluYW1pY1Nsb3QoYSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZHJlc3NbZmFjZXQuaWRdID0gZHluYW1pY1Nsb3RzLmxlbmd0aCA8PCAxO1xuICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGEgPT4gZHluYW1pY0ZhY2V0U2xvdChhLCBmYWNldCwgcHJvdmlkZXJzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGR5bmFtaWMgPSBkeW5hbWljU2xvdHMubWFwKGYgPT4gZihhZGRyZXNzKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmlndXJhdGlvbihiYXNlLCBuZXdDb21wYXJ0bWVudHMsIGR5bmFtaWMsIGFkZHJlc3MsIHN0YXRpY1ZhbHVlcywgZmFjZXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmbGF0dGVuKGV4dGVuc2lvbiwgY29tcGFydG1lbnRzLCBuZXdDb21wYXJ0bWVudHMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW1tdLCBbXSwgW10sIFtdLCBbXV07XG4gICAgbGV0IHNlZW4gPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gaW5uZXIoZXh0LCBwcmVjKSB7XG4gICAgICAgIGxldCBrbm93biA9IHNlZW4uZ2V0KGV4dCk7XG4gICAgICAgIGlmIChrbm93biAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa25vd24gPD0gcHJlYylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgZm91bmQgPSByZXN1bHRba25vd25dLmluZGV4T2YoZXh0KTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrbm93bl0uc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEluc3RhbmNlKVxuICAgICAgICAgICAgICAgIG5ld0NvbXBhcnRtZW50cy5kZWxldGUoZXh0LmNvbXBhcnRtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuLnNldChleHQsIHByZWMpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHQpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBlIG9mIGV4dClcbiAgICAgICAgICAgICAgICBpbm5lcihlLCBwcmVjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEluc3RhbmNlKSB7XG4gICAgICAgICAgICBpZiAobmV3Q29tcGFydG1lbnRzLmhhcyhleHQuY29tcGFydG1lbnQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBEdXBsaWNhdGUgdXNlIG9mIGNvbXBhcnRtZW50IGluIGV4dGVuc2lvbnNgKTtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29tcGFydG1lbnRzLmdldChleHQuY29tcGFydG1lbnQpIHx8IGV4dC5pbm5lcjtcbiAgICAgICAgICAgIG5ld0NvbXBhcnRtZW50cy5zZXQoZXh0LmNvbXBhcnRtZW50LCBjb250ZW50KTtcbiAgICAgICAgICAgIGlubmVyKGNvbnRlbnQsIHByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIFByZWNFeHRlbnNpb24pIHtcbiAgICAgICAgICAgIGlubmVyKGV4dC5pbm5lciwgZXh0LnByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIFN0YXRlRmllbGQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcmVjXS5wdXNoKGV4dCk7XG4gICAgICAgICAgICBpZiAoZXh0LnByb3ZpZGVzKVxuICAgICAgICAgICAgICAgIGlubmVyKGV4dC5wcm92aWRlcywgcHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgRmFjZXRQcm92aWRlcikge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWNdLnB1c2goZXh0KTtcbiAgICAgICAgICAgIGlmIChleHQuZmFjZXQuZXh0ZW5zaW9ucylcbiAgICAgICAgICAgICAgICBpbm5lcihleHQuZmFjZXQuZXh0ZW5zaW9ucywgUHJlY18uZGVmYXVsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGV4dC5leHRlbnNpb247XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgZXh0ZW5zaW9uIHZhbHVlIGluIGV4dGVuc2lvbiBzZXQgKCR7ZXh0fSkuIFRoaXMgc29tZXRpbWVzIGhhcHBlbnMgYmVjYXVzZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgQGNvZGVtaXJyb3Ivc3RhdGUgYXJlIGxvYWRlZCwgYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MuYCk7XG4gICAgICAgICAgICBpbm5lcihjb250ZW50LCBwcmVjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbm5lcihleHRlbnNpb24sIFByZWNfLmRlZmF1bHQpO1xuICAgIHJldHVybiByZXN1bHQucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVBZGRyKHN0YXRlLCBhZGRyKSB7XG4gICAgaWYgKGFkZHIgJiAxKVxuICAgICAgICByZXR1cm4gMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovO1xuICAgIGxldCBpZHggPSBhZGRyID4+IDE7XG4gICAgbGV0IHN0YXR1cyA9IHN0YXRlLnN0YXR1c1tpZHhdO1xuICAgIGlmIChzdGF0dXMgPT0gNCAvKiBTbG90U3RhdHVzLkNvbXB1dGluZyAqLylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3ljbGljIGRlcGVuZGVuY3kgYmV0d2VlbiBmaWVsZHMgYW5kL29yIGZhY2V0c1wiKTtcbiAgICBpZiAoc3RhdHVzICYgMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovKVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIHN0YXRlLnN0YXR1c1tpZHhdID0gNCAvKiBTbG90U3RhdHVzLkNvbXB1dGluZyAqLztcbiAgICBsZXQgY2hhbmdlZCA9IHN0YXRlLmNvbXB1dGVTbG90KHN0YXRlLCBzdGF0ZS5jb25maWcuZHluYW1pY1Nsb3RzW2lkeF0pO1xuICAgIHJldHVybiBzdGF0ZS5zdGF0dXNbaWR4XSA9IDIgLyogU2xvdFN0YXR1cy5Db21wdXRlZCAqLyB8IGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBnZXRBZGRyKHN0YXRlLCBhZGRyKSB7XG4gICAgcmV0dXJuIGFkZHIgJiAxID8gc3RhdGUuY29uZmlnLnN0YXRpY1ZhbHVlc1thZGRyID4+IDFdIDogc3RhdGUudmFsdWVzW2FkZHIgPj4gMV07XG59XG5cbmNvbnN0IGxhbmd1YWdlRGF0YSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHYgPT4gdiksXG4gICAgc3RhdGljOiB0cnVlXG59KTtcbmNvbnN0IGxpbmVTZXBhcmF0b3IgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IHVuZGVmaW5lZCxcbiAgICBzdGF0aWM6IHRydWVcbn0pO1xuY29uc3QgY2hhbmdlRmlsdGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgdHJhbnNhY3Rpb25GaWx0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB0cmFuc2FjdGlvbkV4dGVuZGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgcmVhZE9ubHkgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IGZhbHNlXG59KTtcblxuLyoqXG5Bbm5vdGF0aW9ucyBhcmUgdGFnZ2VkIHZhbHVlcyB0aGF0IGFyZSB1c2VkIHRvIGFkZCBtZXRhZGF0YSB0b1xudHJhbnNhY3Rpb25zIGluIGFuIGV4dGVuc2libGUgd2F5LiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIG1vZGVsXG50aGluZ3MgdGhhdCBlZmZlY3QgdGhlIGVudGlyZSB0cmFuc2FjdGlvbiAoc3VjaCBhcyBpdHMgW3RpbWVcbnN0YW1wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnRpbWUpIG9yIGluZm9ybWF0aW9uIGFib3V0IGl0c1xuW29yaWdpbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbl51c2VyRXZlbnQpKS4gRm9yIGVmZmVjdHMgdGhhdCBoYXBwZW5cbl9hbG9uZ3NpZGVfIHRoZSBvdGhlciBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRyYW5zYWN0aW9uLCBbc3RhdGVcbmVmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3QpIGFyZSBtb3JlIGFwcHJvcHJpYXRlLlxuKi9cbmNsYXNzIEFubm90YXRpb24ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGFubm90YXRpb24gdHlwZS5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGFubm90YXRpb24uXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5ldyB0eXBlIG9mIGFubm90YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKCkgeyByZXR1cm4gbmV3IEFubm90YXRpb25UeXBlKCk7IH1cbn1cbi8qKlxuTWFya2VyIHRoYXQgaWRlbnRpZmllcyBhIHR5cGUgb2YgW2Fubm90YXRpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQW5ub3RhdGlvbikuXG4qL1xuY2xhc3MgQW5ub3RhdGlvblR5cGUge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGFubm90YXRpb24uXG4gICAgKi9cbiAgICBvZih2YWx1ZSkgeyByZXR1cm4gbmV3IEFubm90YXRpb24odGhpcywgdmFsdWUpOyB9XG59XG4vKipcblJlcHJlc2VudGF0aW9uIG9mIGEgdHlwZSBvZiBzdGF0ZSBlZmZlY3QuIERlZmluZWQgd2l0aFxuW2BTdGF0ZUVmZmVjdC5kZWZpbmVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0XmRlZmluZSkuXG4qL1xuY2xhc3MgU3RhdGVFZmZlY3RUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBgYW55YCB0eXBlcyBpbiB0aGVzZSBmdW5jdGlvbiB0eXBlcyBhcmUgdGhlcmUgdG8gd29ya1xuICAgIC8vIGFyb3VuZCBUeXBlU2NyaXB0IGlzc3VlICMzNzYzMSwgd2hlcmUgdGhlIHR5cGUgZ3VhcmQgb25cbiAgICAvLyBgU3RhdGVFZmZlY3QuaXNgIG15c3RlcmlvdXNseSBzdG9wcyB3b3JraW5nIHdoZW4gdGhlc2UgcHJvcGVybHlcbiAgICAvLyBoYXZlIHR5cGUgYFZhbHVlYC5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW3N0YXRlIGVmZmVjdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdCkgaW5zdGFuY2Ugb2YgdGhpc1xuICAgIHR5cGUuXG4gICAgKi9cbiAgICBvZih2YWx1ZSkgeyByZXR1cm4gbmV3IFN0YXRlRWZmZWN0KHRoaXMsIHZhbHVlKTsgfVxufVxuLyoqXG5TdGF0ZSBlZmZlY3RzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhZGRpdGlvbmFsIGVmZmVjdHNcbmFzc29jaWF0ZWQgd2l0aCBhIFt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5lZmZlY3RzKS4gVGhleVxuYXJlIG9mdGVuIHVzZWZ1bCB0byBtb2RlbCBjaGFuZ2VzIHRvIGN1c3RvbSBbc3RhdGVcbmZpZWxkc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkKSwgd2hlbiB0aG9zZSBjaGFuZ2VzIGFyZW4ndCBpbXBsaWNpdCBpblxuZG9jdW1lbnQgb3Igc2VsZWN0aW9uIGNoYW5nZXMuXG4qL1xuY2xhc3MgU3RhdGVFZmZlY3Qge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgb2YgdGhpcyBlZmZlY3QuXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIGVmZmVjdCB0aHJvdWdoIGEgcG9zaXRpb24gbWFwcGluZy4gV2lsbCByZXR1cm5cbiAgICBgdW5kZWZpbmVkYCB3aGVuIHRoYXQgZW5kcyB1cCBkZWxldGluZyB0aGUgZWZmZWN0LlxuICAgICovXG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMudHlwZS5tYXAodGhpcy52YWx1ZSwgbWFwcGluZyk7XG4gICAgICAgIHJldHVybiBtYXBwZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1hcHBlZCA9PSB0aGlzLnZhbHVlID8gdGhpcyA6IG5ldyBTdGF0ZUVmZmVjdCh0aGlzLnR5cGUsIG1hcHBlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoaXMgZWZmZWN0IG9iamVjdCBpcyBvZiBhIGdpdmVuXG4gICAgW3R5cGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3RUeXBlKS5cbiAgICAqL1xuICAgIGlzKHR5cGUpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlOyB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IGVmZmVjdCB0eXBlLiBUaGUgdHlwZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSB0eXBlXG4gICAgb2YgdmFsdWVzIHRoYXQgaGlzIGVmZmVjdCBob2xkcy4gSXQgc2hvdWxkIGJlIGEgdHlwZSB0aGF0XG4gICAgZG9lc24ndCBpbmNsdWRlIGB1bmRlZmluZWRgLCBzaW5jZSB0aGF0IGlzIHVzZWQgaW5cbiAgICBbbWFwcGluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdC5tYXApIHRvIGluZGljYXRlIHRoYXQgYW4gZWZmZWN0IGlzXG4gICAgcmVtb3ZlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdGVFZmZlY3RUeXBlKHNwZWMubWFwIHx8ICh2ID0+IHYpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGFuIGFycmF5IG9mIGVmZmVjdHMgdGhyb3VnaCBhIGNoYW5nZSBzZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgbWFwRWZmZWN0cyhlZmZlY3RzLCBtYXBwaW5nKSB7XG4gICAgICAgIGlmICghZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZWZmZWN0cztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgZWZmZWN0cykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGVmZmVjdC5tYXAobWFwcGluZyk7XG4gICAgICAgICAgICBpZiAobWFwcGVkKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1hcHBlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcblRoaXMgZWZmZWN0IGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHRoZSByb290IGV4dGVuc2lvbnMgb2ZcbnRoZSBlZGl0b3IuIERvaW5nIHRoaXMgd2lsbCBkaXNjYXJkIGFueSBleHRlbnNpb25zXG5bYXBwZW5kZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3ReYXBwZW5kQ29uZmlnKSwgYnV0IGRvZXMgbm90IHJlc2V0XG50aGUgY29udGVudCBvZiBbcmVjb25maWd1cmVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50LnJlY29uZmlndXJlKVxuY29tcGFydG1lbnRzLlxuKi9cblN0YXRlRWZmZWN0LnJlY29uZmlndXJlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5BcHBlbmQgZXh0ZW5zaW9ucyB0byB0aGUgdG9wLWxldmVsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGVkaXRvci5cbiovXG5TdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcbkNoYW5nZXMgdG8gdGhlIGVkaXRvciBzdGF0ZSBhcmUgZ3JvdXBlZCBpbnRvIHRyYW5zYWN0aW9ucy5cblR5cGljYWxseSwgYSB1c2VyIGFjdGlvbiBjcmVhdGVzIGEgc2luZ2xlIHRyYW5zYWN0aW9uLCB3aGljaCBtYXlcbmNvbnRhaW4gYW55IG51bWJlciBvZiBkb2N1bWVudCBjaGFuZ2VzLCBtYXkgY2hhbmdlIHRoZSBzZWxlY3Rpb24sXG5vciBoYXZlIG90aGVyIGVmZmVjdHMuIENyZWF0ZSBhIHRyYW5zYWN0aW9uIGJ5IGNhbGxpbmdcbltgRWRpdG9yU3RhdGUudXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpLCBvciBpbW1lZGlhdGVseVxuZGlzcGF0Y2ggb25lIGJ5IGNhbGxpbmdcbltgRWRpdG9yVmlldy5kaXNwYXRjaGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRpc3BhdGNoKS5cbiovXG5jbGFzcyBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXRlIGZyb20gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHN0YXJ0cy5cbiAgICAqL1xuICAgIHN0YXJ0U3RhdGUsIFxuICAgIC8qKlxuICAgIFRoZSBkb2N1bWVudCBjaGFuZ2VzIG1hZGUgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGNoYW5nZXMsIFxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24gc2V0IGJ5IHRoaXMgdHJhbnNhY3Rpb24sIG9yIHVuZGVmaW5lZCBpZiBpdFxuICAgIGRvZXNuJ3QgZXhwbGljaXRseSBzZXQgYSBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzZWxlY3Rpb24sIFxuICAgIC8qKlxuICAgIFRoZSBlZmZlY3RzIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGVmZmVjdHMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYW5ub3RhdGlvbnMsIFxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3IGFmdGVyIHRoaXNcbiAgICB0cmFuc2FjdGlvbiBpcyBkaXNwYXRjaGVkLlxuICAgICovXG4gICAgc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgdGhpcy5zdGFydFN0YXRlID0gc3RhcnRTdGF0ZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuZWZmZWN0cyA9IGVmZmVjdHM7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3O1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuX2RvYyA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fc3RhdGUgPSBudWxsO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKVxuICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBjaGFuZ2VzLm5ld0xlbmd0aCk7XG4gICAgICAgIGlmICghYW5ub3RhdGlvbnMuc29tZSgoYSkgPT4gYS50eXBlID09IFRyYW5zYWN0aW9uLnRpbWUpKVxuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChUcmFuc2FjdGlvbi50aW1lLm9mKERhdGUubm93KCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHN0YXJ0U3RhdGUsIGNoYW5nZXMsIHNlbGVjdGlvbiwgZWZmZWN0cywgYW5ub3RhdGlvbnMsIHNjcm9sbEludG9WaWV3KSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oc3RhcnRTdGF0ZSwgY2hhbmdlcywgc2VsZWN0aW9uLCBlZmZlY3RzLCBhbm5vdGF0aW9ucywgc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbmV3IGRvY3VtZW50IHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gQ29udHJhcnkgdG9cbiAgICBbYC5zdGF0ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc3RhdGUpYC5kb2NgLCBhY2Nlc3NpbmcgdGhpcyB3b24ndFxuICAgIGZvcmNlIHRoZSBlbnRpcmUgbmV3IHN0YXRlIHRvIGJlIGNvbXB1dGVkIHJpZ2h0IGF3YXksIHNvIGl0IGlzXG4gICAgcmVjb21tZW5kZWQgdGhhdCBbdHJhbnNhY3Rpb25cbiAgICBmaWx0ZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRyYW5zYWN0aW9uRmlsdGVyKSB1c2UgdGhpcyBnZXR0ZXJcbiAgICB3aGVuIHRoZXkgbmVlZCB0byBsb29rIGF0IHRoZSBuZXcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgbmV3RG9jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jIHx8ICh0aGlzLl9kb2MgPSB0aGlzLmNoYW5nZXMuYXBwbHkodGhpcy5zdGFydFN0YXRlLmRvYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbmV3IHNlbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUgdHJhbnNhY3Rpb24uIElmXG4gICAgW2B0aGlzLnNlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc2VsZWN0aW9uKSBpcyB1bmRlZmluZWQsXG4gICAgdGhpcyB3aWxsIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU2VsZWN0aW9uLm1hcCkgdGhlIHN0YXJ0IHN0YXRlJ3NcbiAgICBjdXJyZW50IHNlbGVjdGlvbiB0aHJvdWdoIHRoZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IG5ld1NlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFwKHRoaXMuY2hhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgc3RhdGUgY3JlYXRlZCBieSB0aGUgdHJhbnNhY3Rpb24uIENvbXB1dGVkIG9uIGRlbWFuZFxuICAgIChidXQgcmV0YWluZWQgZm9yIHN1YnNlcXVlbnQgYWNjZXNzKSwgc28gaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvXG4gICAgYWNjZXNzIGl0IGluIFt0cmFuc2FjdGlvblxuICAgIGZpbHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedHJhbnNhY3Rpb25GaWx0ZXIpIHdoZW4gcG9zc2libGUuXG4gICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdGUpXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U3RhdGUuYXBwbHlUcmFuc2FjdGlvbih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHR5cGUsIGlmIGFueS5cbiAgICAqL1xuICAgIGFubm90YXRpb24odHlwZSkge1xuICAgICAgICBmb3IgKGxldCBhbm4gb2YgdGhpcy5hbm5vdGF0aW9ucylcbiAgICAgICAgICAgIGlmIChhbm4udHlwZSA9PSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBhbm4udmFsdWU7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiBjaGFuZ2VkIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkgeyByZXR1cm4gIXRoaXMuY2hhbmdlcy5lbXB0eTsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNhY3Rpb24gcmVjb25maWd1cmVzIHRoZSBzdGF0ZVxuICAgICh0aHJvdWdoIGEgW2NvbmZpZ3VyYXRpb24gY29tcGFydG1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQpIG9yXG4gICAgd2l0aCBhIHRvcC1sZXZlbCBjb25maWd1cmF0aW9uXG4gICAgW2VmZmVjdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdF5yZWNvbmZpZ3VyZSkuXG4gICAgKi9cbiAgICBnZXQgcmVjb25maWd1cmVkKCkgeyByZXR1cm4gdGhpcy5zdGFydFN0YXRlLmNvbmZpZyAhPSB0aGlzLnN0YXRlLmNvbmZpZzsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGEgW3VzZXJcbiAgICBldmVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbl51c2VyRXZlbnQpIGFubm90YXRpb24gdGhhdCBpcyBlcXVhbCB0b1xuICAgIG9yIG1vcmUgc3BlY2lmaWMgdGhhbiBgZXZlbnRgLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRyYW5zYWN0aW9uXG4gICAgaGFzIGBcInNlbGVjdC5wb2ludGVyXCJgIGFzIHVzZXIgZXZlbnQsIGBcInNlbGVjdFwiYCBhbmRcbiAgICBgXCJzZWxlY3QucG9pbnRlclwiYCB3aWxsIG1hdGNoIGl0LlxuICAgICovXG4gICAgaXNVc2VyRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLmFubm90YXRpb24oVHJhbnNhY3Rpb24udXNlckV2ZW50KTtcbiAgICAgICAgcmV0dXJuICEhKGUgJiYgKGUgPT0gZXZlbnQgfHwgZS5sZW5ndGggPiBldmVudC5sZW5ndGggJiYgZS5zbGljZSgwLCBldmVudC5sZW5ndGgpID09IGV2ZW50ICYmIGVbZXZlbnQubGVuZ3RoXSA9PSBcIi5cIikpO1xuICAgIH1cbn1cbi8qKlxuQW5ub3RhdGlvbiB1c2VkIHRvIHN0b3JlIHRyYW5zYWN0aW9uIHRpbWVzdGFtcHMuIEF1dG9tYXRpY2FsbHlcbmFkZGVkIHRvIGV2ZXJ5IHRyYW5zYWN0aW9uLCBob2xkaW5nIGBEYXRlLm5vdygpYC5cbiovXG5UcmFuc2FjdGlvbi50aW1lID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG4vKipcbkFubm90YXRpb24gdXNlZCB0byBhc3NvY2lhdGUgYSB0cmFuc2FjdGlvbiB3aXRoIGEgdXNlciBpbnRlcmZhY2VcbmV2ZW50LiBIb2xkcyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgZXZlbnQsIHVzaW5nIGFcbmRvdC1zZXBhcmF0ZWQgZm9ybWF0IHRvIHN1cHBvcnQgYXR0YWNoaW5nIG1vcmUgc3BlY2lmaWNcbmluZm9ybWF0aW9uLiBUaGUgZXZlbnRzIHVzZWQgYnkgdGhlIGNvcmUgbGlicmFyaWVzIGFyZTpcblxuIC0gYFwiaW5wdXRcImAgd2hlbiBjb250ZW50IGlzIGVudGVyZWRcbiAgIC0gYFwiaW5wdXQudHlwZVwiYCBmb3IgdHlwZWQgaW5wdXRcbiAgICAgLSBgXCJpbnB1dC50eXBlLmNvbXBvc2VcImAgZm9yIGNvbXBvc2l0aW9uXG4gICAtIGBcImlucHV0LnBhc3RlXCJgIGZvciBwYXN0ZWQgaW5wdXRcbiAgIC0gYFwiaW5wdXQuZHJvcFwiYCB3aGVuIGFkZGluZyBjb250ZW50IHdpdGggZHJhZy1hbmQtZHJvcFxuICAgLSBgXCJpbnB1dC5jb21wbGV0ZVwiYCB3aGVuIGF1dG9jb21wbGV0aW5nXG4gLSBgXCJkZWxldGVcImAgd2hlbiB0aGUgdXNlciBkZWxldGVzIGNvbnRlbnRcbiAgIC0gYFwiZGVsZXRlLnNlbGVjdGlvblwiYCB3aGVuIGRlbGV0aW5nIHRoZSBzZWxlY3Rpb25cbiAgIC0gYFwiZGVsZXRlLmZvcndhcmRcImAgd2hlbiBkZWxldGluZyBmb3J3YXJkIGZyb20gdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuYmFja3dhcmRcImAgd2hlbiBkZWxldGluZyBiYWNrd2FyZCBmcm9tIHRoZSBzZWxlY3Rpb25cbiAgIC0gYFwiZGVsZXRlLmN1dFwiYCB3aGVuIGN1dHRpbmcgdG8gdGhlIGNsaXBib2FyZFxuIC0gYFwibW92ZVwiYCB3aGVuIGNvbnRlbnQgaXMgbW92ZWRcbiAgIC0gYFwibW92ZS5kcm9wXCJgIHdoZW4gY29udGVudCBpcyBtb3ZlZCB3aXRoaW4gdGhlIGVkaXRvciB0aHJvdWdoIGRyYWctYW5kLWRyb3BcbiAtIGBcInNlbGVjdFwiYCB3aGVuIGV4cGxpY2l0bHkgY2hhbmdpbmcgdGhlIHNlbGVjdGlvblxuICAgLSBgXCJzZWxlY3QucG9pbnRlclwiYCB3aGVuIHNlbGVjdGluZyB3aXRoIGEgbW91c2Ugb3Igb3RoZXIgcG9pbnRpbmcgZGV2aWNlXG4gLSBgXCJ1bmRvXCJgIGFuZCBgXCJyZWRvXCJgIGZvciBoaXN0b3J5IGFjdGlvbnNcblxuVXNlIFtgaXNVc2VyRXZlbnRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLmlzVXNlckV2ZW50KSB0byBjaGVja1xud2hldGhlciB0aGUgYW5ub3RhdGlvbiBtYXRjaGVzIGEgZ2l2ZW4gZXZlbnQuXG4qL1xuVHJhbnNhY3Rpb24udXNlckV2ZW50ID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG4vKipcbkFubm90YXRpb24gaW5kaWNhdGluZyB3aGV0aGVyIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvXG50aGUgdW5kbyBoaXN0b3J5IG9yIG5vdC5cbiovXG5UcmFuc2FjdGlvbi5hZGRUb0hpc3RvcnkgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiBpbmRpY2F0aW5nICh3aGVuIHByZXNlbnQgYW5kIHRydWUpIHRoYXQgYSB0cmFuc2FjdGlvblxucmVwcmVzZW50cyBhIGNoYW5nZSBtYWRlIGJ5IHNvbWUgb3RoZXIgYWN0b3IsIG5vdCB0aGUgdXNlci4gVGhpc1xuaXMgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHRhZyBvdGhlciBwZW9wbGUncyBjaGFuZ2VzIGluXG5jb2xsYWJvcmF0aXZlIGVkaXRpbmcuXG4qL1xuVHJhbnNhY3Rpb24ucmVtb3RlID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG5mdW5jdGlvbiBqb2luUmFuZ2VzKGEsIGIpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaUEgPSAwLCBpQiA9IDA7Oykge1xuICAgICAgICBsZXQgZnJvbSwgdG87XG4gICAgICAgIGlmIChpQSA8IGEubGVuZ3RoICYmIChpQiA9PSBiLmxlbmd0aCB8fCBiW2lCXSA+PSBhW2lBXSkpIHtcbiAgICAgICAgICAgIGZyb20gPSBhW2lBKytdO1xuICAgICAgICAgICAgdG8gPSBhW2lBKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlCIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZyb20gPSBiW2lCKytdO1xuICAgICAgICAgICAgdG8gPSBiW2lCKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCB8fCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdIDwgZnJvbSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyb20sIHRvKTtcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA8IHRvKVxuICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IHRvO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlVHJhbnNhY3Rpb24oYSwgYiwgc2VxdWVudGlhbCkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgbWFwRm9yQSwgbWFwRm9yQiwgY2hhbmdlcztcbiAgICBpZiAoc2VxdWVudGlhbCkge1xuICAgICAgICBtYXBGb3JBID0gYi5jaGFuZ2VzO1xuICAgICAgICBtYXBGb3JCID0gQ2hhbmdlU2V0LmVtcHR5KGIuY2hhbmdlcy5sZW5ndGgpO1xuICAgICAgICBjaGFuZ2VzID0gYS5jaGFuZ2VzLmNvbXBvc2UoYi5jaGFuZ2VzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1hcEZvckEgPSBiLmNoYW5nZXMubWFwKGEuY2hhbmdlcyk7XG4gICAgICAgIG1hcEZvckIgPSBhLmNoYW5nZXMubWFwRGVzYyhiLmNoYW5nZXMsIHRydWUpO1xuICAgICAgICBjaGFuZ2VzID0gYS5jaGFuZ2VzLmNvbXBvc2UobWFwRm9yQSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXMsXG4gICAgICAgIHNlbGVjdGlvbjogYi5zZWxlY3Rpb24gPyBiLnNlbGVjdGlvbi5tYXAobWFwRm9yQikgOiAoX2EgPSBhLnNlbGVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChtYXBGb3JBKSxcbiAgICAgICAgZWZmZWN0czogU3RhdGVFZmZlY3QubWFwRWZmZWN0cyhhLmVmZmVjdHMsIG1hcEZvckEpLmNvbmNhdChTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGIuZWZmZWN0cywgbWFwRm9yQikpLFxuICAgICAgICBhbm5vdGF0aW9uczogYS5hbm5vdGF0aW9ucy5sZW5ndGggPyBhLmFubm90YXRpb25zLmNvbmNhdChiLmFubm90YXRpb25zKSA6IGIuYW5ub3RhdGlvbnMsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiBhLnNjcm9sbEludG9WaWV3IHx8IGIuc2Nyb2xsSW50b1ZpZXdcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zYWN0aW9uSW5uZXIoc3RhdGUsIHNwZWMsIGRvY1NpemUpIHtcbiAgICBsZXQgc2VsID0gc3BlYy5zZWxlY3Rpb24sIGFubm90YXRpb25zID0gYXNBcnJheShzcGVjLmFubm90YXRpb25zKTtcbiAgICBpZiAoc3BlYy51c2VyRXZlbnQpXG4gICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KFRyYW5zYWN0aW9uLnVzZXJFdmVudC5vZihzcGVjLnVzZXJFdmVudCkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXM6IHNwZWMuY2hhbmdlcyBpbnN0YW5jZW9mIENoYW5nZVNldCA/IHNwZWMuY2hhbmdlc1xuICAgICAgICAgICAgOiBDaGFuZ2VTZXQub2Yoc3BlYy5jaGFuZ2VzIHx8IFtdLCBkb2NTaXplLCBzdGF0ZS5mYWNldChsaW5lU2VwYXJhdG9yKSksXG4gICAgICAgIHNlbGVjdGlvbjogc2VsICYmIChzZWwgaW5zdGFuY2VvZiBFZGl0b3JTZWxlY3Rpb24gPyBzZWwgOiBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKHNlbC5hbmNob3IsIHNlbC5oZWFkKSksXG4gICAgICAgIGVmZmVjdHM6IGFzQXJyYXkoc3BlYy5lZmZlY3RzKSxcbiAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiAhIXNwZWMuc2Nyb2xsSW50b1ZpZXdcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zYWN0aW9uKHN0YXRlLCBzcGVjcywgZmlsdGVyKSB7XG4gICAgbGV0IHMgPSByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgc3BlY3MubGVuZ3RoID8gc3BlY3NbMF0gOiB7fSwgc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgaWYgKHNwZWNzLmxlbmd0aCAmJiBzcGVjc1swXS5maWx0ZXIgPT09IGZhbHNlKVxuICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNwZWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzcGVjc1tpXS5maWx0ZXIgPT09IGZhbHNlKVxuICAgICAgICAgICAgZmlsdGVyID0gZmFsc2U7XG4gICAgICAgIGxldCBzZXEgPSAhIXNwZWNzW2ldLnNlcXVlbnRpYWw7XG4gICAgICAgIHMgPSBtZXJnZVRyYW5zYWN0aW9uKHMsIHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBzcGVjc1tpXSwgc2VxID8gcy5jaGFuZ2VzLm5ld0xlbmd0aCA6IHN0YXRlLmRvYy5sZW5ndGgpLCBzZXEpO1xuICAgIH1cbiAgICBsZXQgdHIgPSBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIHMuY2hhbmdlcywgcy5zZWxlY3Rpb24sIHMuZWZmZWN0cywgcy5hbm5vdGF0aW9ucywgcy5zY3JvbGxJbnRvVmlldyk7XG4gICAgcmV0dXJuIGV4dGVuZFRyYW5zYWN0aW9uKGZpbHRlciA/IGZpbHRlclRyYW5zYWN0aW9uKHRyKSA6IHRyKTtcbn1cbi8vIEZpbmlzaCBhIHRyYW5zYWN0aW9uIGJ5IGFwcGx5aW5nIGZpbHRlcnMgaWYgbmVjZXNzYXJ5LlxuZnVuY3Rpb24gZmlsdGVyVHJhbnNhY3Rpb24odHIpIHtcbiAgICBsZXQgc3RhdGUgPSB0ci5zdGFydFN0YXRlO1xuICAgIC8vIENoYW5nZSBmaWx0ZXJzXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZm9yIChsZXQgZmlsdGVyIG9mIHN0YXRlLmZhY2V0KGNoYW5nZUZpbHRlcikpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZmlsdGVyKHRyKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHRydWUgPyB2YWx1ZSA6IGpvaW5SYW5nZXMocmVzdWx0LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgbGV0IGNoYW5nZXMsIGJhY2s7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBiYWNrID0gdHIuY2hhbmdlcy5pbnZlcnRlZERlc2M7XG4gICAgICAgICAgICBjaGFuZ2VzID0gQ2hhbmdlU2V0LmVtcHR5KHN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZpbHRlcmVkID0gdHIuY2hhbmdlcy5maWx0ZXIocmVzdWx0KTtcbiAgICAgICAgICAgIGNoYW5nZXMgPSBmaWx0ZXJlZC5jaGFuZ2VzO1xuICAgICAgICAgICAgYmFjayA9IGZpbHRlcmVkLmZpbHRlcmVkLm1hcERlc2MoZmlsdGVyZWQuY2hhbmdlcykuaW52ZXJ0ZWREZXNjO1xuICAgICAgICB9XG4gICAgICAgIHRyID0gVHJhbnNhY3Rpb24uY3JlYXRlKHN0YXRlLCBjaGFuZ2VzLCB0ci5zZWxlY3Rpb24gJiYgdHIuc2VsZWN0aW9uLm1hcChiYWNrKSwgU3RhdGVFZmZlY3QubWFwRWZmZWN0cyh0ci5lZmZlY3RzLCBiYWNrKSwgdHIuYW5ub3RhdGlvbnMsIHRyLnNjcm9sbEludG9WaWV3KTtcbiAgICB9XG4gICAgLy8gVHJhbnNhY3Rpb24gZmlsdGVyc1xuICAgIGxldCBmaWx0ZXJzID0gc3RhdGUuZmFjZXQodHJhbnNhY3Rpb25GaWx0ZXIpO1xuICAgIGZvciAobGV0IGkgPSBmaWx0ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IGZpbHRlcnNbaV0odHIpO1xuICAgICAgICBpZiAoZmlsdGVyZWQgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIHRyID0gZmlsdGVyZWQ7XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyZWQpICYmIGZpbHRlcmVkLmxlbmd0aCA9PSAxICYmIGZpbHRlcmVkWzBdIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pXG4gICAgICAgICAgICB0ciA9IGZpbHRlcmVkWzBdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ciA9IHJlc29sdmVUcmFuc2FjdGlvbihzdGF0ZSwgYXNBcnJheShmaWx0ZXJlZCksIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyO1xufVxuZnVuY3Rpb24gZXh0ZW5kVHJhbnNhY3Rpb24odHIpIHtcbiAgICBsZXQgc3RhdGUgPSB0ci5zdGFydFN0YXRlLCBleHRlbmRlcnMgPSBzdGF0ZS5mYWNldCh0cmFuc2FjdGlvbkV4dGVuZGVyKSwgc3BlYyA9IHRyO1xuICAgIGZvciAobGV0IGkgPSBleHRlbmRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGV4dGVuc2lvbiA9IGV4dGVuZGVyc1tpXSh0cik7XG4gICAgICAgIGlmIChleHRlbnNpb24gJiYgT2JqZWN0LmtleXMoZXh0ZW5zaW9uKS5sZW5ndGgpXG4gICAgICAgICAgICBzcGVjID0gbWVyZ2VUcmFuc2FjdGlvbihzcGVjLCByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgZXh0ZW5zaW9uLCB0ci5jaGFuZ2VzLm5ld0xlbmd0aCksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gc3BlYyA9PSB0ciA/IHRyIDogVHJhbnNhY3Rpb24uY3JlYXRlKHN0YXRlLCB0ci5jaGFuZ2VzLCB0ci5zZWxlY3Rpb24sIHNwZWMuZWZmZWN0cywgc3BlYy5hbm5vdGF0aW9ucywgc3BlYy5zY3JvbGxJbnRvVmlldyk7XG59XG5jb25zdCBub25lID0gW107XG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBub25lIDogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbi8qKlxuVGhlIGNhdGVnb3JpZXMgcHJvZHVjZWQgYnkgYSBbY2hhcmFjdGVyXG5jYXRlZ29yaXplcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIpLiBUaGVzZSBhcmUgdXNlZFxuZG8gdGhpbmdzIGxpa2Ugc2VsZWN0aW5nIGJ5IHdvcmQuXG4qL1xudmFyIENoYXJDYXRlZ29yeSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENoYXJDYXRlZ29yeSkge1xuICAgIC8qKlxuICAgIFdvcmQgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIENoYXJDYXRlZ29yeVtDaGFyQ2F0ZWdvcnlbXCJXb3JkXCJdID0gMF0gPSBcIldvcmRcIjtcbiAgICAvKipcbiAgICBXaGl0ZXNwYWNlLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIlNwYWNlXCJdID0gMV0gPSBcIlNwYWNlXCI7XG4gICAgLyoqXG4gICAgQW55dGhpbmcgZWxzZS5cbiAgICAqL1xuICAgIENoYXJDYXRlZ29yeVtDaGFyQ2F0ZWdvcnlbXCJPdGhlclwiXSA9IDJdID0gXCJPdGhlclwiO1xucmV0dXJuIENoYXJDYXRlZ29yeX0pKENoYXJDYXRlZ29yeSB8fCAoQ2hhckNhdGVnb3J5ID0ge30pKTtcbmNvbnN0IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyID0gL1tcXHUwMGRmXFx1MDU4N1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTMwNDAtXFx1MzA5ZlxcdTMwYTAtXFx1MzBmZlxcdTM0MDAtXFx1NGRiNVxcdTRlMDAtXFx1OWZjY1xcdWFjMDAtXFx1ZDdhZl0vO1xubGV0IHdvcmRDaGFyO1xudHJ5IHtcbiAgICB3b3JkQ2hhciA9IC8qQF9fUFVSRV9fKi9uZXcgUmVnRXhwKFwiW1xcXFxwe0FscGhhYmV0aWN9XFxcXHB7TnVtYmVyfV9dXCIsIFwidVwiKTtcbn1cbmNhdGNoIChfKSB7IH1cbmZ1bmN0aW9uIGhhc1dvcmRDaGFyKHN0cikge1xuICAgIGlmICh3b3JkQ2hhcilcbiAgICAgICAgcmV0dXJuIHdvcmRDaGFyLnRlc3Qoc3RyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2ggPSBzdHJbaV07XG4gICAgICAgIGlmICgvXFx3Ly50ZXN0KGNoKSB8fCBjaCA+IFwiXFx4ODBcIiAmJiAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBtYWtlQ2F0ZWdvcml6ZXIod29yZENoYXJzKSB7XG4gICAgcmV0dXJuIChjaGFyKSA9PiB7XG4gICAgICAgIGlmICghL1xcUy8udGVzdChjaGFyKSlcbiAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuU3BhY2U7XG4gICAgICAgIGlmIChoYXNXb3JkQ2hhcihjaGFyKSlcbiAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuV29yZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JkQ2hhcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoY2hhci5pbmRleE9mKHdvcmRDaGFyc1tpXSkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hhckNhdGVnb3J5LldvcmQ7XG4gICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuT3RoZXI7XG4gICAgfTtcbn1cblxuLyoqXG5UaGUgZWRpdG9yIHN0YXRlIGNsYXNzIGlzIGEgcGVyc2lzdGVudCAoaW1tdXRhYmxlKSBkYXRhIHN0cnVjdHVyZS5cblRvIHVwZGF0ZSBhIHN0YXRlLCB5b3UgW2NyZWF0ZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpIGFcblt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbiksIHdoaWNoIHByb2R1Y2VzIGEgX25ld18gc3RhdGVcbmluc3RhbmNlLCB3aXRob3V0IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuXG5BcyBzdWNoLCBfbmV2ZXJfIG11dGF0ZSBwcm9wZXJ0aWVzIG9mIGEgc3RhdGUgZGlyZWN0bHkuIFRoYXQnbGxcbmp1c3QgYnJlYWsgdGhpbmdzLlxuKi9cbmNsYXNzIEVkaXRvclN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbmZpZywgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBkb2MsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHNlbGVjdGlvbiwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB2YWx1ZXMsIGNvbXB1dGVTbG90LCB0cikge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBjb25maWcuc3RhdHVzVGVtcGxhdGUuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5jb21wdXRlU2xvdCA9IGNvbXB1dGVTbG90O1xuICAgICAgICAvLyBGaWxsIGluIHRoZSBjb21wdXRlZCBzdGF0ZSBpbW1lZGlhdGVseSwgc28gdGhhdCBmdXJ0aGVyIHF1ZXJpZXNcbiAgICAgICAgLy8gZm9yIGl0IG1hZGUgZHVyaW5nIHRoZSB1cGRhdGUgcmV0dXJuIHRoaXMgc3RhdGVcbiAgICAgICAgaWYgKHRyKVxuICAgICAgICAgICAgdHIuX3N0YXRlID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmZpZy5keW5hbWljU2xvdHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGkgPDwgMSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVNsb3QgPSBudWxsO1xuICAgIH1cbiAgICBmaWVsZChmaWVsZCwgcmVxdWlyZSA9IHRydWUpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmNvbmZpZy5hZGRyZXNzW2ZpZWxkLmlkXTtcbiAgICAgICAgaWYgKGFkZHIgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJGaWVsZCBpcyBub3QgcHJlc2VudCBpbiB0aGlzIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGFkZHIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRkcih0aGlzLCBhZGRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSB0aGF0IHVwZGF0ZXMgdGhpc1xuICAgIHN0YXRlLiBBbnkgbnVtYmVyIG9mIFt0cmFuc2FjdGlvbiBzcGVjc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMpXG4gICAgY2FuIGJlIHBhc3NlZC4gVW5sZXNzXG4gICAgW2BzZXF1ZW50aWFsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuc2VxdWVudGlhbCkgaXMgc2V0LCB0aGVcbiAgICBbY2hhbmdlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuY2hhbmdlcykgKGlmIGFueSkgb2YgZWFjaCBzcGVjXG4gICAgYXJlIGFzc3VtZWQgdG8gc3RhcnQgaW4gdGhlIF9jdXJyZW50XyBkb2N1bWVudCAobm90IHRoZSBkb2N1bWVudFxuICAgIHByb2R1Y2VkIGJ5IHByZXZpb3VzIHNwZWNzKSwgYW5kIGl0c1xuICAgIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbikgYW5kXG4gICAgW2VmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIGFyZSBhc3N1bWVkIHRvIHJlZmVyXG4gICAgdG8gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgaXRzIF9vd25fIGNoYW5nZXMuIFRoZSByZXN1bHRpbmdcbiAgICB0cmFuc2FjdGlvbiBjb250YWlucyB0aGUgY29tYmluZWQgZWZmZWN0IG9mIGFsbCB0aGUgZGlmZmVyZW50XG4gICAgc3BlY3MuIEZvciBbc2VsZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZWxlY3Rpb24pLCBsYXRlclxuICAgIHNwZWNzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGVhcmxpZXIgb25lcy5cbiAgICAqL1xuICAgIHVwZGF0ZSguLi5zcGVjcykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zYWN0aW9uKHRoaXMsIHNwZWNzLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhcHBseVRyYW5zYWN0aW9uKHRyKSB7XG4gICAgICAgIGxldCBjb25mID0gdGhpcy5jb25maWcsIHsgYmFzZSwgY29tcGFydG1lbnRzIH0gPSBjb25mO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZikge1xuICAgICAgICAgICAgICAgICAgICBjb21wYXJ0bWVudHMgPSBuZXcgTWFwO1xuICAgICAgICAgICAgICAgICAgICBjb25mLmNvbXBhcnRtZW50cy5mb3JFYWNoKCh2YWwsIGtleSkgPT4gY29tcGFydG1lbnRzLnNldChrZXksIHZhbCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25mID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnRzLnNldChlZmZlY3QudmFsdWUuY29tcGFydG1lbnQsIGVmZmVjdC52YWx1ZS5leHRlbnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWZmZWN0LmlzKFN0YXRlRWZmZWN0LnJlY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJhc2UgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3QuaXMoU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJhc2UgPSBhc0FycmF5KGJhc2UpLmNvbmNhdChlZmZlY3QudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydFZhbHVlcztcbiAgICAgICAgaWYgKCFjb25mKSB7XG4gICAgICAgICAgICBjb25mID0gQ29uZmlndXJhdGlvbi5yZXNvbHZlKGJhc2UsIGNvbXBhcnRtZW50cywgdGhpcyk7XG4gICAgICAgICAgICBsZXQgaW50ZXJtZWRpYXRlU3RhdGUgPSBuZXcgRWRpdG9yU3RhdGUoY29uZiwgdGhpcy5kb2MsIHRoaXMuc2VsZWN0aW9uLCBjb25mLmR5bmFtaWNTbG90cy5tYXAoKCkgPT4gbnVsbCksIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC5yZWNvbmZpZ3VyZShzdGF0ZSwgdGhpcyksIG51bGwpO1xuICAgICAgICAgICAgc3RhcnRWYWx1ZXMgPSBpbnRlcm1lZGlhdGVTdGF0ZS52YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydFZhbHVlcyA9IHRyLnN0YXJ0U3RhdGUudmFsdWVzLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHRyLnN0YXJ0U3RhdGUuZmFjZXQoYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpID8gdHIubmV3U2VsZWN0aW9uIDogdHIubmV3U2VsZWN0aW9uLmFzU2luZ2xlKCk7XG4gICAgICAgIG5ldyBFZGl0b3JTdGF0ZShjb25mLCB0ci5uZXdEb2MsIHNlbGVjdGlvbiwgc3RhcnRWYWx1ZXMsIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC51cGRhdGUoc3RhdGUsIHRyKSwgdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbdHJhbnNhY3Rpb24gc3BlY10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMpIHRoYXRcbiAgICByZXBsYWNlcyBldmVyeSBzZWxlY3Rpb24gcmFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29udGVudC5cbiAgICAqL1xuICAgIHJlcGxhY2VTZWxlY3Rpb24odGV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLnRvVGV4dCh0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiAoeyBjaGFuZ2VzOiB7IGZyb206IHJhbmdlLmZyb20sIHRvOiByYW5nZS50bywgaW5zZXJ0OiB0ZXh0IH0sXG4gICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgdGV4dC5sZW5ndGgpIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIGNoYW5nZXMgYW5kIGEgbmV3IHNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBnaXZlblxuICAgIGZ1bmN0aW9uIGZvciBlYWNoIHJhbmdlIGluIHRoZSBhY3RpdmUgc2VsZWN0aW9uLiBUaGUgZnVuY3Rpb25cbiAgICBjYW4gcmV0dXJuIGFuIG9wdGlvbmFsIHNldCBvZiBjaGFuZ2VzIChpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZVxuICAgIG9mIHRoZSBzdGFydCBkb2N1bWVudCksIHBsdXMgYW4gdXBkYXRlZCByYW5nZSAoaW4gdGhlIGNvb3JkaW5hdGVcbiAgICBzcGFjZSBvZiB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgdGhlIGNhbGwncyBvd24gY2hhbmdlcykuIFRoaXNcbiAgICBtZXRob2Qgd2lsbCBtZXJnZSBhbGwgdGhlIGNoYW5nZXMgYW5kIHJhbmdlcyBpbnRvIGEgc2luZ2xlXG4gICAgY2hhbmdlc2V0IGFuZCBzZWxlY3Rpb24sIGFuZCByZXR1cm4gaXQgYXMgYSBbdHJhbnNhY3Rpb25cbiAgICBzcGVjXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYyksIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG9cbiAgICBbYHVwZGF0ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudXBkYXRlKS5cbiAgICAqL1xuICAgIGNoYW5nZUJ5UmFuZ2UoZikge1xuICAgICAgICBsZXQgc2VsID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIGxldCByZXN1bHQxID0gZihzZWwucmFuZ2VzWzBdKTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSB0aGlzLmNoYW5nZXMocmVzdWx0MS5jaGFuZ2VzKSwgcmFuZ2VzID0gW3Jlc3VsdDEucmFuZ2VdO1xuICAgICAgICBsZXQgZWZmZWN0cyA9IGFzQXJyYXkocmVzdWx0MS5lZmZlY3RzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZihzZWwucmFuZ2VzW2ldKTtcbiAgICAgICAgICAgIGxldCBuZXdDaGFuZ2VzID0gdGhpcy5jaGFuZ2VzKHJlc3VsdC5jaGFuZ2VzKSwgbmV3TWFwcGVkID0gbmV3Q2hhbmdlcy5tYXAoY2hhbmdlcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGk7IGorKylcbiAgICAgICAgICAgICAgICByYW5nZXNbal0gPSByYW5nZXNbal0ubWFwKG5ld01hcHBlZCk7XG4gICAgICAgICAgICBsZXQgbWFwQnkgPSBjaGFuZ2VzLm1hcERlc2MobmV3Q2hhbmdlcywgdHJ1ZSk7XG4gICAgICAgICAgICByYW5nZXMucHVzaChyZXN1bHQucmFuZ2UubWFwKG1hcEJ5KSk7XG4gICAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5jb21wb3NlKG5ld01hcHBlZCk7XG4gICAgICAgICAgICBlZmZlY3RzID0gU3RhdGVFZmZlY3QubWFwRWZmZWN0cyhlZmZlY3RzLCBuZXdNYXBwZWQpLmNvbmNhdChTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGFzQXJyYXkocmVzdWx0LmVmZmVjdHMpLCBtYXBCeSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgc2VsLm1haW5JbmRleCksXG4gICAgICAgICAgICBlZmZlY3RzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFtjaGFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNldCkgZnJvbSB0aGUgZ2l2ZW4gY2hhbmdlXG4gICAgZGVzY3JpcHRpb24sIHRha2luZyB0aGUgc3RhdGUncyBkb2N1bWVudCBsZW5ndGggYW5kIGxpbmVcbiAgICBzZXBhcmF0b3IgaW50byBhY2NvdW50LlxuICAgICovXG4gICAgY2hhbmdlcyhzcGVjID0gW10pIHtcbiAgICAgICAgaWYgKHNwZWMgaW5zdGFuY2VvZiBDaGFuZ2VTZXQpXG4gICAgICAgICAgICByZXR1cm4gc3BlYztcbiAgICAgICAgcmV0dXJuIENoYW5nZVNldC5vZihzcGVjLCB0aGlzLmRvYy5sZW5ndGgsIHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcikpO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2luZyB0aGUgc3RhdGUncyBbbGluZVxuICAgIHNlcGFyYXRvcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5saW5lU2VwYXJhdG9yKSwgY3JlYXRlIGFcbiAgICBbYFRleHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQpIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIHRvVGV4dChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFRleHQub2Yoc3RyaW5nLnNwbGl0KHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcikgfHwgRGVmYXVsdFNwbGl0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50IGFzIGEgc3RyaW5nLlxuICAgICovXG4gICAgc2xpY2VEb2MoZnJvbSA9IDAsIHRvID0gdGhpcy5kb2MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5zbGljZVN0cmluZyhmcm9tLCB0bywgdGhpcy5saW5lQnJlYWspO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIGEgc3RhdGUgW2ZhY2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0KS5cbiAgICAqL1xuICAgIGZhY2V0KGZhY2V0KSB7XG4gICAgICAgIGxldCBhZGRyID0gdGhpcy5jb25maWcuYWRkcmVzc1tmYWNldC5pZF07XG4gICAgICAgIGlmIChhZGRyID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXQuZGVmYXVsdDtcbiAgICAgICAgZW5zdXJlQWRkcih0aGlzLCBhZGRyKTtcbiAgICAgICAgcmV0dXJuIGdldEFkZHIodGhpcywgYWRkcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhpcyBzdGF0ZSB0byBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdC4gV2hlbiBjdXN0b21cbiAgICBmaWVsZHMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQsIHlvdSBjYW4gcGFzcyB0aGVtIGluIGFzIGFuIG9iamVjdFxuICAgIG1hcHBpbmcgcHJvcGVydHkgbmFtZXMgKGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LCB3aGljaCBzaG91bGRcbiAgICBub3QgdXNlIGBkb2NgIG9yIGBzZWxlY3Rpb25gKSB0byBmaWVsZHMuXG4gICAgKi9cbiAgICB0b0pTT04oZmllbGRzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBkb2M6IHRoaXMuc2xpY2VEb2MoKSxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24udG9KU09OKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZpZWxkcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmllbGRzW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0YXRlRmllbGQgJiYgdGhpcy5jb25maWcuYWRkcmVzc1t2YWx1ZS5pZF0gIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsdWUuc3BlYy50b0pTT04odGhpcy5maWVsZChmaWVsZHNbcHJvcF0pLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBzdGF0ZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBXaGVuIGN1c3RvbVxuICAgIGZpZWxkcyBzaG91bGQgYmUgZGVzZXJpYWxpemVkLCBwYXNzIHRoZSBzYW1lIG9iamVjdCB5b3UgcGFzc2VkXG4gICAgdG8gW2B0b0pTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnRvSlNPTikgd2hlbiBzZXJpYWxpemluZyBhc1xuICAgIHRoaXJkIGFyZ3VtZW50LlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbmZpZyA9IHt9LCBmaWVsZHMpIHtcbiAgICAgICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uLmRvYyAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVkaXRvclN0YXRlXCIpO1xuICAgICAgICBsZXQgZmllbGRJbml0ID0gW107XG4gICAgICAgIGlmIChmaWVsZHMpXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoanNvbiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW3Byb3BdLCB2YWx1ZSA9IGpzb25bcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSW5pdC5wdXNoKGZpZWxkLmluaXQoc3RhdGUgPT4gZmllbGQuc3BlYy5mcm9tSlNPTih2YWx1ZSwgc3RhdGUpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgICAgIGRvYzoganNvbi5kb2MsXG4gICAgICAgICAgICBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5mcm9tSlNPTihqc29uLnNlbGVjdGlvbiksXG4gICAgICAgICAgICBleHRlbnNpb25zOiBjb25maWcuZXh0ZW5zaW9ucyA/IGZpZWxkSW5pdC5jb25jYXQoW2NvbmZpZy5leHRlbnNpb25zXSkgOiBmaWVsZEluaXRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZS4gWW91J2xsIHVzdWFsbHkgb25seSBuZWVkIHRoaXMgd2hlblxuICAgIGluaXRpYWxpemluZyBhbiBlZGl0b3JcdTIwMTR1cGRhdGVkIHN0YXRlcyBhcmUgY3JlYXRlZCBieSBhcHBseWluZ1xuICAgIHRyYW5zYWN0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoY29uZmlnID0ge30pIHtcbiAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLnJlc29sdmUoY29uZmlnLmV4dGVuc2lvbnMgfHwgW10sIG5ldyBNYXApO1xuICAgICAgICBsZXQgZG9jID0gY29uZmlnLmRvYyBpbnN0YW5jZW9mIFRleHQgPyBjb25maWcuZG9jXG4gICAgICAgICAgICA6IFRleHQub2YoKGNvbmZpZy5kb2MgfHwgXCJcIikuc3BsaXQoY29uZmlndXJhdGlvbi5zdGF0aWNGYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBEZWZhdWx0U3BsaXQpKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9ICFjb25maWcuc2VsZWN0aW9uID8gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZSgwKVxuICAgICAgICAgICAgOiBjb25maWcuc2VsZWN0aW9uIGluc3RhbmNlb2YgRWRpdG9yU2VsZWN0aW9uID8gY29uZmlnLnNlbGVjdGlvblxuICAgICAgICAgICAgICAgIDogRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShjb25maWcuc2VsZWN0aW9uLmFuY2hvciwgY29uZmlnLnNlbGVjdGlvbi5oZWFkKTtcbiAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBkb2MubGVuZ3RoKTtcbiAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uLnN0YXRpY0ZhY2V0KGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKSlcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5hc1NpbmdsZSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclN0YXRlKGNvbmZpZ3VyYXRpb24sIGRvYywgc2VsZWN0aW9uLCBjb25maWd1cmF0aW9uLmR5bmFtaWNTbG90cy5tYXAoKCkgPT4gbnVsbCksIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC5jcmVhdGUoc3RhdGUpLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNpemUgKGluIGNvbHVtbnMpIG9mIGEgdGFiIGluIHRoZSBkb2N1bWVudCwgZGV0ZXJtaW5lZCBieVxuICAgIHRoZSBbYHRhYlNpemVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpIGZhY2V0LlxuICAgICovXG4gICAgZ2V0IHRhYlNpemUoKSB7IHJldHVybiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLnRhYlNpemUpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwcm9wZXIgW2xpbmUtYnJlYWtdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVebGluZVNlcGFyYXRvcilcbiAgICBzdHJpbmcgZm9yIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgbGluZUJyZWFrKCkgeyByZXR1cm4gdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBcIlxcblwiOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhlIGVkaXRvciBpc1xuICAgIFtjb25maWd1cmVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnJlYWRPbmx5KSB0byBiZSByZWFkLW9ubHkuXG4gICAgKi9cbiAgICBnZXQgcmVhZE9ubHkoKSB7IHJldHVybiB0aGlzLmZhY2V0KHJlYWRPbmx5KTsgfVxuICAgIC8qKlxuICAgIExvb2sgdXAgYSB0cmFuc2xhdGlvbiBmb3IgdGhlIGdpdmVuIHBocmFzZSAodmlhIHRoZVxuICAgIFtgcGhyYXNlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVecGhyYXNlcykgZmFjZXQpLCBvciByZXR1cm4gdGhlXG4gICAgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLlxuICAgIFxuICAgIElmIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwYXNzZWQsIHRoZXkgd2lsbCBiZSBpbnNlcnRlZCBpblxuICAgIHBsYWNlIG9mIG1hcmtlcnMgbGlrZSBgJDFgIChmb3IgdGhlIGZpcnN0IHZhbHVlKSBhbmQgYCQyYCwgZXRjLlxuICAgIEEgc2luZ2xlIGAkYCBpcyBlcXVpdmFsZW50IHRvIGAkMWAsIGFuZCBgJCRgIHdpbGwgcHJvZHVjZSBhXG4gICAgbGl0ZXJhbCBkb2xsYXIgc2lnbi5cbiAgICAqL1xuICAgIHBocmFzZShwaHJhc2UsIC4uLmluc2VydCkge1xuICAgICAgICBmb3IgKGxldCBtYXAgb2YgdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5waHJhc2VzKSlcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWFwLCBwaHJhc2UpKSB7XG4gICAgICAgICAgICAgICAgcGhyYXNlID0gbWFwW3BocmFzZV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChpbnNlcnQubGVuZ3RoKVxuICAgICAgICAgICAgcGhyYXNlID0gcGhyYXNlLnJlcGxhY2UoL1xcJChcXCR8XFxkKikvZywgKG0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBcIiRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJFwiO1xuICAgICAgICAgICAgICAgIGxldCBuID0gKyhpIHx8IDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhbiB8fCBuID4gaW5zZXJ0Lmxlbmd0aCA/IG0gOiBpbnNlcnRbbiAtIDFdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwaHJhc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIHZhbHVlcyBmb3IgYSBnaXZlbiBsYW5ndWFnZSBkYXRhIGZpZWxkLCBwcm92aWRlZCBieSB0aGVcbiAgICB0aGUgW2BsYW5ndWFnZURhdGFgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmxhbmd1YWdlRGF0YSkgZmFjZXQuXG4gICAgXG4gICAgRXhhbXBsZXMgb2YgbGFuZ3VhZ2UgZGF0YSBmaWVsZHMgYXJlLi4uXG4gICAgXG4gICAgLSBbYFwiY29tbWVudFRva2Vuc1wiYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNjb21tYW5kcy5Db21tZW50VG9rZW5zKSBmb3Igc3BlY2lmeWluZ1xuICAgICAgY29tbWVudCBzeW50YXguXG4gICAgLSBbYFwiYXV0b2NvbXBsZXRlXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2F1dG9jb21wbGV0ZS5hdXRvY29tcGxldGlvbl5jb25maWcub3ZlcnJpZGUpXG4gICAgICBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBsZXRpb24gc291cmNlcy5cbiAgICAtIFtgXCJ3b3JkQ2hhcnNcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhckNhdGVnb3JpemVyKSBmb3IgYWRkaW5nXG4gICAgICBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB3b3JkcyBpbiB0aGlzXG4gICAgICBsYW5ndWFnZS5cbiAgICAtIFtgXCJjbG9zZUJyYWNrZXRzXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2F1dG9jb21wbGV0ZS5DbG9zZUJyYWNrZXRDb25maWcpIGNvbnRyb2xzXG4gICAgICBicmFja2V0IGNsb3NpbmcgYmVoYXZpb3IuXG4gICAgKi9cbiAgICBsYW5ndWFnZURhdGFBdChuYW1lLCBwb3MsIHNpZGUgPSAtMSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHByb3ZpZGVyIG9mIHRoaXMuZmFjZXQobGFuZ3VhZ2VEYXRhKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcmVzdWx0IG9mIHByb3ZpZGVyKHRoaXMsIHBvcywgc2lkZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgbmFtZSkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHJlc3VsdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gY2F0ZWdvcml6ZSBzdHJpbmdzIChleHBlY3RlZCB0b1xuICAgIHJlcHJlc2VudCBhIHNpbmdsZSBbZ3JhcGhlbWUgY2x1c3Rlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5maW5kQ2x1c3RlckJyZWFrKSlcbiAgICBpbnRvIG9uZSBvZjpcbiAgICBcbiAgICAgLSBXb3JkIChjb250YWlucyBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIG9yIGEgY2hhcmFjdGVyXG4gICAgICAgZXhwbGljaXRseSBsaXN0ZWQgaW4gdGhlIGxvY2FsIGxhbmd1YWdlJ3MgYFwid29yZENoYXJzXCJgXG4gICAgICAgbGFuZ3VhZ2UgZGF0YSwgd2hpY2ggc2hvdWxkIGJlIGEgc3RyaW5nKVxuICAgICAtIFNwYWNlIChjb250YWlucyBvbmx5IHdoaXRlc3BhY2UpXG4gICAgIC0gT3RoZXIgKGFueXRoaW5nIGVsc2UpXG4gICAgKi9cbiAgICBjaGFyQ2F0ZWdvcml6ZXIoYXQpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VDYXRlZ29yaXplcih0aGlzLmxhbmd1YWdlRGF0YUF0KFwid29yZENoYXJzXCIsIGF0KS5qb2luKFwiXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgd29yZCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIG1lYW5pbmcgdGhlIHJhbmdlXG4gICAgY29udGFpbmluZyBhbGwgW3dvcmRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhckNhdGVnb3J5LldvcmQpIGNoYXJhY3RlcnNcbiAgICBhcm91bmQgaXQuIElmIG5vIHdvcmQgY2hhcmFjdGVycyBhcmUgYWRqYWNlbnQgdG8gdGhlIHBvc2l0aW9uLFxuICAgIHRoaXMgcmV0dXJucyBudWxsLlxuICAgICovXG4gICAgd29yZEF0KHBvcykge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tLCBsZW5ndGggfSA9IHRoaXMuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBsZXQgY2F0ID0gdGhpcy5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gcG9zIC0gZnJvbSwgZW5kID0gcG9zIC0gZnJvbTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgbGV0IHByZXYgPSBmaW5kQ2x1c3RlckJyZWFrKHRleHQsIHN0YXJ0LCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoY2F0KHRleHQuc2xpY2UocHJldiwgc3RhcnQpKSAhPSBDaGFyQ2F0ZWdvcnkuV29yZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0YXJ0ID0gcHJldjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZW5kIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGZpbmRDbHVzdGVyQnJlYWsodGV4dCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChjYXQodGV4dC5zbGljZShlbmQsIG5leHQpKSAhPSBDaGFyQ2F0ZWdvcnkuV29yZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGVuZCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0ID09IGVuZCA/IG51bGwgOiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2Uoc3RhcnQgKyBmcm9tLCBlbmQgKyBmcm9tKTtcbiAgICB9XG59XG4vKipcbkEgZmFjZXQgdGhhdCwgd2hlbiBlbmFibGVkLCBjYXVzZXMgdGhlIGVkaXRvciB0byBhbGxvdyBtdWx0aXBsZVxucmFuZ2VzIHRvIGJlIHNlbGVjdGVkLiBCZSBjYXJlZnVsIHRob3VnaCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZVxuZWRpdG9yIHJlbGllcyBvbiB0aGUgbmF0aXZlIERPTSBzZWxlY3Rpb24sIHdoaWNoIGNhbm5vdCBoYW5kbGVcbm11bHRpcGxlIHNlbGVjdGlvbnMuIEFuIGV4dGVuc2lvbiBsaWtlXG5bYGRyYXdTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuZHJhd1NlbGVjdGlvbikgY2FuIGJlIHVzZWQgdG8gbWFrZVxuc2Vjb25kYXJ5IHNlbGVjdGlvbnMgdmlzaWJsZSB0byB0aGUgdXNlci5cbiovXG5FZGl0b3JTdGF0ZS5hbGxvd011bHRpcGxlU2VsZWN0aW9ucyA9IGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zO1xuLyoqXG5Db25maWd1cmVzIHRoZSB0YWIgc2l6ZSB0byB1c2UgaW4gdGhpcyBzdGF0ZS4gVGhlIGZpcnN0XG4oaGlnaGVzdC1wcmVjZWRlbmNlKSB2YWx1ZSBvZiB0aGUgZmFjZXQgaXMgdXNlZC4gSWYgbm8gdmFsdWUgaXNcbmdpdmVuLCB0aGlzIGRlZmF1bHRzIHRvIDQuXG4qL1xuRWRpdG9yU3RhdGUudGFiU2l6ZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogNFxufSk7XG4vKipcblRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuIEJ5IGRlZmF1bHQsIGFueSBvZiBgXCJcXG5cImAsIGBcIlxcclxcblwiYFxuYW5kIGBcIlxcclwiYCBpcyB0cmVhdGVkIGFzIGEgc2VwYXJhdG9yIHdoZW4gc3BsaXR0aW5nIGxpbmVzLCBhbmRcbmxpbmVzIGFyZSBqb2luZWQgd2l0aCBgXCJcXG5cImAuXG5cbldoZW4geW91IGNvbmZpZ3VyZSBhIHZhbHVlIGhlcmUsIG9ubHkgdGhhdCBwcmVjaXNlIHNlcGFyYXRvclxud2lsbCBiZSB1c2VkLCBhbGxvd2luZyB5b3UgdG8gcm91bmQtdHJpcCBkb2N1bWVudHMgdGhyb3VnaCB0aGVcbmVkaXRvciB3aXRob3V0IG5vcm1hbGl6aW5nIGxpbmUgc2VwYXJhdG9ycy5cbiovXG5FZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yID0gbGluZVNlcGFyYXRvcjtcbi8qKlxuVGhpcyBmYWNldCBjb250cm9scyB0aGUgdmFsdWUgb2YgdGhlXG5bYHJlYWRPbmx5YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5yZWFkT25seSkgZ2V0dGVyLCB3aGljaCBpc1xuY29uc3VsdGVkIGJ5IGNvbW1hbmRzIGFuZCBleHRlbnNpb25zIHRoYXQgaW1wbGVtZW50IGVkaXRpbmdcbmZ1bmN0aW9uYWxpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhleSBzaG91bGQgYXBwbHkuIEl0XG5kZWZhdWx0cyB0byBmYWxzZSwgYnV0IHdoZW4gaXRzIGhpZ2hlc3QtcHJlY2VkZW5jZSB2YWx1ZSBpc1xuYHRydWVgLCBzdWNoIGZ1bmN0aW9uYWxpdHkgZGlzYWJsZXMgaXRzZWxmLlxuXG5Ob3QgdG8gYmUgY29uZnVzZWQgd2l0aFxuW2BFZGl0b3JWaWV3LmVkaXRhYmxlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZWRpdGFibGUpLCB3aGljaFxuY29udHJvbHMgd2hldGhlciB0aGUgZWRpdG9yJ3MgRE9NIGlzIHNldCB0byBiZSBlZGl0YWJsZSAoYW5kXG50aHVzIGZvY3VzYWJsZSkuXG4qL1xuRWRpdG9yU3RhdGUucmVhZE9ubHkgPSByZWFkT25seTtcbi8qKlxuUmVnaXN0ZXJzIHRyYW5zbGF0aW9uIHBocmFzZXMuIFRoZVxuW2BwaHJhc2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnBocmFzZSkgbWV0aG9kIHdpbGwgbG9vayB0aHJvdWdoXG5hbGwgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGggdGhpcyBmYWNldCB0byBmaW5kIHRyYW5zbGF0aW9ucyBmb3Jcbml0cyBhcmd1bWVudC5cbiovXG5FZGl0b3JTdGF0ZS5waHJhc2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tcGFyZShhLCBiKSB7XG4gICAgICAgIGxldCBrQSA9IE9iamVjdC5rZXlzKGEpLCBrQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga0EubGVuZ3RoID09IGtCLmxlbmd0aCAmJiBrQS5ldmVyeShrID0+IGFba10gPT0gYltrXSk7XG4gICAgfVxufSk7XG4vKipcbkEgZmFjZXQgdXNlZCB0byByZWdpc3RlciBbbGFuZ3VhZ2VcbmRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpIHByb3ZpZGVycy5cbiovXG5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGEgPSBsYW5ndWFnZURhdGE7XG4vKipcbkZhY2V0IHVzZWQgdG8gcmVnaXN0ZXIgY2hhbmdlIGZpbHRlcnMsIHdoaWNoIGFyZSBjYWxsZWQgZm9yIGVhY2hcbnRyYW5zYWN0aW9uICh1bmxlc3MgZXhwbGljaXRseVxuW2Rpc2FibGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpKSwgYW5kIGNhbiBzdXBwcmVzc1xucGFydCBvZiB0aGUgdHJhbnNhY3Rpb24ncyBjaGFuZ2VzLlxuXG5TdWNoIGEgZnVuY3Rpb24gY2FuIHJldHVybiBgdHJ1ZWAgdG8gaW5kaWNhdGUgdGhhdCBpdCBkb2Vzbid0XG53YW50IHRvIGRvIGFueXRoaW5nLCBgZmFsc2VgIHRvIGNvbXBsZXRlbHkgc3RvcCB0aGUgY2hhbmdlcyBpblxudGhlIHRyYW5zYWN0aW9uLCBvciBhIHNldCBvZiByYW5nZXMgaW4gd2hpY2ggY2hhbmdlcyBzaG91bGQgYmVcbnN1cHByZXNzZWQuIFN1Y2ggcmFuZ2VzIGFyZSByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBudW1iZXJzLFxud2l0aCBlYWNoIHBhaXIgb2YgdHdvIG51bWJlcnMgaW5kaWNhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhXG5yYW5nZS4gU28gZm9yIGV4YW1wbGUgYFsxMCwgMjAsIDEwMCwgMTEwXWAgc3VwcHJlc3NlcyBjaGFuZ2VzXG5iZXR3ZWVuIDEwIGFuZCAyMCwgYW5kIGJldHdlZW4gMTAwIGFuZCAxMTAuXG4qL1xuRWRpdG9yU3RhdGUuY2hhbmdlRmlsdGVyID0gY2hhbmdlRmlsdGVyO1xuLyoqXG5GYWNldCB1c2VkIHRvIHJlZ2lzdGVyIGEgaG9vayB0aGF0IGdldHMgYSBjaGFuY2UgdG8gdXBkYXRlIG9yXG5yZXBsYWNlIHRyYW5zYWN0aW9uIHNwZWNzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkLiBUaGlzIHdpbGxcbm9ubHkgYmUgYXBwbGllZCBmb3IgdHJhbnNhY3Rpb25zIHRoYXQgZG9uJ3QgaGF2ZVxuW2BmaWx0ZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpIHNldCB0byBgZmFsc2VgLiBZb3VcbmNhbiBlaXRoZXIgcmV0dXJuIGEgc2luZ2xlIHRyYW5zYWN0aW9uIHNwZWMgKHBvc3NpYmx5IHRoZSBpbnB1dFxudHJhbnNhY3Rpb24pLCBvciBhbiBhcnJheSBvZiBzcGVjcyAod2hpY2ggd2lsbCBiZSBjb21iaW5lZCBpblxudGhlIHNhbWUgd2F5IGFzIHRoZSBhcmd1bWVudHMgdG9cbltgRWRpdG9yU3RhdGUudXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpKS5cblxuV2hlbiBwb3NzaWJsZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gYXZvaWQgYWNjZXNzaW5nXG5bYFRyYW5zYWN0aW9uLnN0YXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zdGF0ZSkgaW4gYSBmaWx0ZXIsXG5zaW5jZSBpdCB3aWxsIGZvcmNlIGNyZWF0aW9uIG9mIGEgc3RhdGUgdGhhdCB3aWxsIHRoZW4gYmVcbmRpc2NhcmRlZCBhZ2FpbiwgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGFjdHVhbGx5IGZpbHRlcmVkLlxuXG4oVGhpcyBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4gSW5kaXNjcmltaW5hdGVseVxubW9kaWZ5aW5nIHRyYW5zYWN0aW9uIGlzIGxpa2VseSB0byBicmVhayBzb21ldGhpbmcgb3IgZGVncmFkZVxudGhlIHVzZXIgZXhwZXJpZW5jZS4pXG4qL1xuRWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIgPSB0cmFuc2FjdGlvbkZpbHRlcjtcbi8qKlxuVGhpcyBpcyBhIG1vcmUgbGltaXRlZCBmb3JtIG9mXG5bYHRyYW5zYWN0aW9uRmlsdGVyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50cmFuc2FjdGlvbkZpbHRlciksXG53aGljaCBjYW4gb25seSBhZGRcblthbm5vdGF0aW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuYW5ub3RhdGlvbnMpIGFuZFxuW2VmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpLiBfQnV0XywgdGhpcyB0eXBlXG5vZiBmaWx0ZXIgcnVucyBldmVuIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgZGlzYWJsZWQgcmVndWxhclxuW2ZpbHRlcmluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZmlsdGVyKSwgbWFraW5nIGl0IHN1aXRhYmxlXG5mb3IgZWZmZWN0cyB0aGF0IGRvbid0IG5lZWQgdG8gdG91Y2ggdGhlIGNoYW5nZXMgb3Igc2VsZWN0aW9uLFxuYnV0IGRvIHdhbnQgdG8gcHJvY2VzcyBldmVyeSB0cmFuc2FjdGlvbi5cblxuRXh0ZW5kZXJzIHJ1biBfYWZ0ZXJfIGZpbHRlcnMsIHdoZW4gYm90aCBhcmUgcHJlc2VudC5cbiovXG5FZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkV4dGVuZGVyID0gdHJhbnNhY3Rpb25FeHRlbmRlcjtcbkNvbXBhcnRtZW50LnJlY29uZmlndXJlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuXG4vKipcblV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbWJpbmluZyBiZWhhdmlvcnMgdG8gZmlsbCBpbiBhIGNvbmZpZ1xub2JqZWN0IGZyb20gYW4gYXJyYXkgb2YgcHJvdmlkZWQgY29uZmlncy4gYGRlZmF1bHRzYCBzaG91bGQgaG9sZFxuZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMgaW4gYENvbmZpZ2AuXG5cblRoZSBmdW5jdGlvbiB3aWxsLCBieSBkZWZhdWx0LCBlcnJvclxud2hlbiBhIGZpZWxkIGdldHMgdHdvIHZhbHVlcyB0aGF0IGFyZW4ndCBgPT09YC1lcXVhbCwgYnV0IHlvdSBjYW5cbnByb3ZpZGUgY29tYmluZSBmdW5jdGlvbnMgcGVyIGZpZWxkIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuKi9cbmZ1bmN0aW9uIGNvbWJpbmVDb25maWcoY29uZmlncywgZGVmYXVsdHMsIC8vIFNob3VsZCBob2xkIG9ubHkgdGhlIG9wdGlvbmFsIHByb3BlcnRpZXMgb2YgQ29uZmlnLCBidXQgSSBoYXZlbid0IG1hbmFnZWQgdG8gZXhwcmVzcyB0aGF0XG5jb21iaW5lID0ge30pIHtcbiAgICBsZXQgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgY29uZmlnIG9mIGNvbmZpZ3MpXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBjb25maWdba2V5XSwgY3VycmVudCA9IHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudCA9PT0gdmFsdWUgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgOyAvLyBObyBjb25mbGljdFxuICAgICAgICAgICAgZWxzZSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoY29tYmluZSwga2V5KSlcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGNvbWJpbmVba2V5XShjdXJyZW50LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlnIG1lcmdlIGNvbmZsaWN0IGZvciBmaWVsZCBcIiArIGtleSk7XG4gICAgICAgIH1cbiAgICBmb3IgKGxldCBrZXkgaW4gZGVmYXVsdHMpXG4gICAgICAgIGlmIChyZXN1bHRba2V5XSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkZWZhdWx0c1trZXldO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuRWFjaCByYW5nZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2YWx1ZSwgd2hpY2ggbXVzdCBpbmhlcml0IGZyb21cbnRoaXMgY2xhc3MuXG4qL1xuY2xhc3MgUmFuZ2VWYWx1ZSB7XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHZhbHVlIHdpdGggYW5vdGhlciB2YWx1ZS4gVXNlZCB3aGVuIGNvbXBhcmluZ1xuICAgIHJhbmdlc2V0cy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY29tcGFyZXMgYnkgaWRlbnRpdHkuXG4gICAgVW5sZXNzIHlvdSBhcmUgb25seSBjcmVhdGluZyBhIGZpeGVkIG51bWJlciBvZiB1bmlxdWUgaW5zdGFuY2VzXG4gICAgb2YgeW91ciB2YWx1ZSB0eXBlLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBpbXBsZW1lbnQgdGhpc1xuICAgIHByb3Blcmx5LlxuICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMgPT0gb3RoZXI7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbcmFuZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIHdpdGggdGhpcyB2YWx1ZS5cbiAgICAqL1xuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkgeyByZXR1cm4gUmFuZ2UuY3JlYXRlKGZyb20sIHRvLCB0aGlzKTsgfVxufVxuUmFuZ2VWYWx1ZS5wcm90b3R5cGUuc3RhcnRTaWRlID0gUmFuZ2VWYWx1ZS5wcm90b3R5cGUuZW5kU2lkZSA9IDA7XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5wb2ludCA9IGZhbHNlO1xuUmFuZ2VWYWx1ZS5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tEZWw7XG4vKipcbkEgcmFuZ2UgYXNzb2NpYXRlcyBhIHZhbHVlIHdpdGggYSByYW5nZSBvZiBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgSXRzIGVuZCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmFuZ2UuXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKGZyb20sIHRvLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY21wUmFuZ2UoYSwgYikge1xuICAgIHJldHVybiBhLmZyb20gLSBiLmZyb20gfHwgYS52YWx1ZS5zdGFydFNpZGUgLSBiLnZhbHVlLnN0YXJ0U2lkZTtcbn1cbmNsYXNzIENodW5rIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgdmFsdWUsIFxuICAgIC8vIENodW5rcyBhcmUgbWFya2VkIHdpdGggdGhlIGxhcmdlc3QgcG9pbnQgdGhhdCBvY2N1cnNcbiAgICAvLyBpbiB0aGVtIChvciAtMSBmb3Igbm8gcG9pbnRzKSwgc28gdGhhdCBzY2FucyB0aGF0IGFyZVxuICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBwb2ludHMgKHN1Y2ggYXMgdGhlXG4gICAgLy8gaGVpZ2h0bWFwLXJlbGF0ZWQgbG9naWMpIGNhbiBza2lwIHJhbmdlLW9ubHkgY2h1bmtzLlxuICAgIG1heFBvaW50KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gbWF4UG9pbnQ7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRvW3RoaXMudG8ubGVuZ3RoIC0gMV07IH1cbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNpZGUuIFVzZSB0aGUgcmFuZ2VzJ1xuICAgIC8vIGBmcm9tYCBwb3Mgd2hlbiBgZW5kID09IGZhbHNlYCwgYHRvYCB3aGVuIGBlbmQgPT0gdHJ1ZWAuXG4gICAgZmluZEluZGV4KHBvcywgc2lkZSwgZW5kLCBzdGFydEF0ID0gMCkge1xuICAgICAgICBsZXQgYXJyID0gZW5kID8gdGhpcy50byA6IHRoaXMuZnJvbTtcbiAgICAgICAgZm9yIChsZXQgbG8gPSBzdGFydEF0LCBoaSA9IGFyci5sZW5ndGg7Oykge1xuICAgICAgICAgICAgaWYgKGxvID09IGhpKVxuICAgICAgICAgICAgICAgIHJldHVybiBsbztcbiAgICAgICAgICAgIGxldCBtaWQgPSAobG8gKyBoaSkgPj4gMTtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYXJyW21pZF0gLSBwb3MgfHwgKGVuZCA/IHRoaXMudmFsdWVbbWlkXS5lbmRTaWRlIDogdGhpcy52YWx1ZVttaWRdLnN0YXJ0U2lkZSkgLSBzaWRlO1xuICAgICAgICAgICAgaWYgKG1pZCA9PSBsbylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlmZiA+PSAwID8gbG8gOiBoaTtcbiAgICAgICAgICAgIGlmIChkaWZmID49IDApXG4gICAgICAgICAgICAgICAgaGkgPSBtaWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbG8gPSBtaWQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJldHdlZW4ob2Zmc2V0LCBmcm9tLCB0bywgZikge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5maW5kSW5kZXgoZnJvbSwgLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8sIHRydWUpLCBlID0gdGhpcy5maW5kSW5kZXgodG8sIDEwMDAwMDAwMDAgLyogQy5GYXIgKi8sIGZhbHNlLCBpKTsgaSA8IGU7IGkrKylcbiAgICAgICAgICAgIGlmIChmKHRoaXMuZnJvbVtpXSArIG9mZnNldCwgdGhpcy50b1tpXSArIG9mZnNldCwgdGhpcy52YWx1ZVtpXSkgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbWFwKG9mZnNldCwgY2hhbmdlcykge1xuICAgICAgICBsZXQgdmFsdWUgPSBbXSwgZnJvbSA9IFtdLCB0byA9IFtdLCBuZXdQb3MgPSAtMSwgbWF4UG9pbnQgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmFsID0gdGhpcy52YWx1ZVtpXSwgY3VyRnJvbSA9IHRoaXMuZnJvbVtpXSArIG9mZnNldCwgY3VyVG8gPSB0aGlzLnRvW2ldICsgb2Zmc2V0LCBuZXdGcm9tLCBuZXdUbztcbiAgICAgICAgICAgIGlmIChjdXJGcm9tID09IGN1clRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5zdGFydFNpZGUsIHZhbC5tYXBNb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5ld0Zyb20gPSBuZXdUbyA9IG1hcHBlZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsLnN0YXJ0U2lkZSAhPSB2YWwuZW5kU2lkZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdUbyA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1RvIDwgbmV3RnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld0Zyb20gPSBjaGFuZ2VzLm1hcFBvcyhjdXJGcm9tLCB2YWwuc3RhcnRTaWRlKTtcbiAgICAgICAgICAgICAgICBuZXdUbyA9IGNoYW5nZXMubWFwUG9zKGN1clRvLCB2YWwuZW5kU2lkZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Zyb20gPiBuZXdUbyB8fCBuZXdGcm9tID09IG5ld1RvICYmIHZhbC5zdGFydFNpZGUgPiAwICYmIHZhbC5lbmRTaWRlIDw9IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChuZXdUbyAtIG5ld0Zyb20gfHwgdmFsLmVuZFNpZGUgLSB2YWwuc3RhcnRTaWRlKSA8IDApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAobmV3UG9zIDwgMClcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSBuZXdGcm9tO1xuICAgICAgICAgICAgaWYgKHZhbC5wb2ludClcbiAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBuZXdUbyAtIG5ld0Zyb20pO1xuICAgICAgICAgICAgdmFsdWUucHVzaCh2YWwpO1xuICAgICAgICAgICAgZnJvbS5wdXNoKG5ld0Zyb20gLSBuZXdQb3MpO1xuICAgICAgICAgICAgdG8ucHVzaChuZXdUbyAtIG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFwcGVkOiB2YWx1ZS5sZW5ndGggPyBuZXcgQ2h1bmsoZnJvbSwgdG8sIHZhbHVlLCBtYXhQb2ludCkgOiBudWxsLCBwb3M6IG5ld1BvcyB9O1xuICAgIH1cbn1cbi8qKlxuQSByYW5nZSBzZXQgc3RvcmVzIGEgY29sbGVjdGlvbiBvZiBbcmFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlKSBpbiBhXG53YXkgdGhhdCBtYWtlcyB0aGVtIGVmZmljaWVudCB0byBbbWFwXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0Lm1hcCkgYW5kXG5bdXBkYXRlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0LnVwZGF0ZSkuIFRoaXMgaXMgYW4gaW1tdXRhYmxlIGRhdGFcbnN0cnVjdHVyZS5cbiovXG5jbGFzcyBSYW5nZVNldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVua1BvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVuaywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBuZXh0TGF5ZXIsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF4UG9pbnQpIHtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IGNodW5rUG9zO1xuICAgICAgICB0aGlzLmNodW5rID0gY2h1bms7XG4gICAgICAgIHRoaXMubmV4dExheWVyID0gbmV4dExheWVyO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gbWF4UG9pbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjaHVua1BvcywgY2h1bmssIG5leHRMYXllciwgbWF4UG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVNldChjaHVua1BvcywgY2h1bmssIG5leHRMYXllciwgbWF4UG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5jaHVuay5sZW5ndGggLSAxO1xuICAgICAgICByZXR1cm4gbGFzdCA8IDAgPyAwIDogTWF0aC5tYXgodGhpcy5jaHVua0VuZChsYXN0KSwgdGhpcy5uZXh0TGF5ZXIubGVuZ3RoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiByYW5nZXMgaW4gdGhlIHNldC5cbiAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBzaXplID0gdGhpcy5uZXh0TGF5ZXIuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgY2h1bmsgb2YgdGhpcy5jaHVuaylcbiAgICAgICAgICAgIHNpemUgKz0gY2h1bmsudmFsdWUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVua0VuZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaHVua1Bvc1tpbmRleF0gKyB0aGlzLmNodW5rW2luZGV4XS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgcmFuZ2Ugc2V0LCBvcHRpb25hbGx5IGFkZGluZyBuZXcgcmFuZ2VzIG9yIGZpbHRlcmluZ1xuICAgIG91dCBleGlzdGluZyBvbmVzLlxuICAgIFxuICAgIChOb3RlOiBUaGUgdHlwZSBwYXJhbWV0ZXIgaXMganVzdCB0aGVyZSBhcyBhIGtsdWRnZSB0byB3b3JrXG4gICAgYXJvdW5kIFR5cGVTY3JpcHQgdmFyaWFuY2UgaXNzdWVzIHRoYXQgcHJldmVudGVkIGBSYW5nZVNldDxYPmBcbiAgICBmcm9tIGJlaW5nIGEgc3VidHlwZSBvZiBgUmFuZ2VTZXQ8WT5gIHdoZW4gYFhgIGlzIGEgc3VidHlwZSBvZlxuICAgIGBZYC4pXG4gICAgKi9cbiAgICB1cGRhdGUodXBkYXRlU3BlYykge1xuICAgICAgICBsZXQgeyBhZGQgPSBbXSwgc29ydCA9IGZhbHNlLCBmaWx0ZXJGcm9tID0gMCwgZmlsdGVyVG8gPSB0aGlzLmxlbmd0aCB9ID0gdXBkYXRlU3BlYztcbiAgICAgICAgbGV0IGZpbHRlciA9IHVwZGF0ZVNwZWMuZmlsdGVyO1xuICAgICAgICBpZiAoYWRkLmxlbmd0aCA9PSAwICYmICFmaWx0ZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHNvcnQpXG4gICAgICAgICAgICBhZGQgPSBhZGQuc2xpY2UoKS5zb3J0KGNtcFJhbmdlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBhZGQubGVuZ3RoID8gUmFuZ2VTZXQub2YoYWRkKSA6IHRoaXM7XG4gICAgICAgIGxldCBjdXIgPSBuZXcgTGF5ZXJDdXJzb3IodGhpcywgbnVsbCwgLTEpLmdvdG8oMCksIGkgPSAwLCBzcGlsbCA9IFtdO1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgd2hpbGUgKGN1ci52YWx1ZSB8fCBpIDwgYWRkLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGkgPCBhZGQubGVuZ3RoICYmIChjdXIuZnJvbSAtIGFkZFtpXS5mcm9tIHx8IGN1ci5zdGFydFNpZGUgLSBhZGRbaV0udmFsdWUuc3RhcnRTaWRlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gYWRkW2krK107XG4gICAgICAgICAgICAgICAgaWYgKCFidWlsZGVyLmFkZElubmVyKHJhbmdlLmZyb20sIHJhbmdlLnRvLCByYW5nZS52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHNwaWxsLnB1c2gocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyLnJhbmdlSW5kZXggPT0gMSAmJiBjdXIuY2h1bmtJbmRleCA8IHRoaXMuY2h1bmsubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKGkgPT0gYWRkLmxlbmd0aCB8fCB0aGlzLmNodW5rRW5kKGN1ci5jaHVua0luZGV4KSA8IGFkZFtpXS5mcm9tKSAmJlxuICAgICAgICAgICAgICAgICghZmlsdGVyIHx8IGZpbHRlckZyb20gPiB0aGlzLmNodW5rRW5kKGN1ci5jaHVua0luZGV4KSB8fCBmaWx0ZXJUbyA8IHRoaXMuY2h1bmtQb3NbY3VyLmNodW5rSW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ2h1bmsodGhpcy5jaHVua1Bvc1tjdXIuY2h1bmtJbmRleF0sIHRoaXMuY2h1bmtbY3VyLmNodW5rSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGN1ci5uZXh0Q2h1bmsoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlckZyb20gPiBjdXIudG8gfHwgZmlsdGVyVG8gPCBjdXIuZnJvbSB8fCBmaWx0ZXIoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuYWRkSW5uZXIoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwaWxsLnB1c2goUmFuZ2UuY3JlYXRlKGN1ci5mcm9tLCBjdXIudG8sIGN1ci52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXIubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmZpbmlzaElubmVyKHRoaXMubmV4dExheWVyLmlzRW1wdHkgJiYgIXNwaWxsLmxlbmd0aCA/IFJhbmdlU2V0LmVtcHR5XG4gICAgICAgICAgICA6IHRoaXMubmV4dExheWVyLnVwZGF0ZSh7IGFkZDogc3BpbGwsIGZpbHRlciwgZmlsdGVyRnJvbSwgZmlsdGVyVG8gfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyByYW5nZSBzZXQgdGhyb3VnaCBhIHNldCBvZiBjaGFuZ2VzLCByZXR1cm4gdGhlIG5ldyBzZXQuXG4gICAgKi9cbiAgICBtYXAoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5lbXB0eSB8fCB0aGlzLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IGNodW5rcyA9IFtdLCBjaHVua1BvcyA9IFtdLCBtYXhQb2ludCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuY2h1bmtQb3NbaV0sIGNodW5rID0gdGhpcy5jaHVua1tpXTtcbiAgICAgICAgICAgIGxldCB0b3VjaCA9IGNoYW5nZXMudG91Y2hlc1JhbmdlKHN0YXJ0LCBzdGFydCArIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAodG91Y2ggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbWF4UG9pbnQgPSBNYXRoLm1heChtYXhQb2ludCwgY2h1bmsubWF4UG9pbnQpO1xuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICBjaHVua1Bvcy5wdXNoKGNoYW5nZXMubWFwUG9zKHN0YXJ0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3VjaCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCB7IG1hcHBlZCwgcG9zIH0gPSBjaHVuay5tYXAoc3RhcnQsIGNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnQgPSBNYXRoLm1heChtYXhQb2ludCwgbWFwcGVkLm1heFBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2gobWFwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtQb3MucHVzaChwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dCA9IHRoaXMubmV4dExheWVyLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgcmV0dXJuIGNodW5rcy5sZW5ndGggPT0gMCA/IG5leHQgOiBuZXcgUmFuZ2VTZXQoY2h1bmtQb3MsIGNodW5rcywgbmV4dCB8fCBSYW5nZVNldC5lbXB0eSwgbWF4UG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyB0aGF0IHRvdWNoIHRoZSByZWdpb24gYGZyb21gIHRvIGB0b2AsXG4gICAgY2FsbGluZyBgZmAgZm9yIGVhY2guIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSByYW5nZXMgd2lsbFxuICAgIGJlIHJlcG9ydGVkIGluIGFueSBzcGVjaWZpYyBvcmRlci4gV2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJuc1xuICAgIGBmYWxzZWAsIGl0ZXJhdGlvbiBzdG9wcy5cbiAgICAqL1xuICAgIGJldHdlZW4oZnJvbSwgdG8sIGYpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmNodW5rUG9zW2ldLCBjaHVuayA9IHRoaXMuY2h1bmtbaV07XG4gICAgICAgICAgICBpZiAodG8gPj0gc3RhcnQgJiYgZnJvbSA8PSBzdGFydCArIGNodW5rLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIGNodW5rLmJldHdlZW4oc3RhcnQsIGZyb20gLSBzdGFydCwgdG8gLSBzdGFydCwgZikgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHRMYXllci5iZXR3ZWVuKGZyb20sIHRvLCBmKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSByYW5nZXMgaW4gdGhpcyBzZXQsIGluIG9yZGVyLCBpbmNsdWRpbmcgYWxsXG4gICAgcmFuZ2VzIHRoYXQgZW5kIGF0IG9yIGFmdGVyIGBmcm9tYC5cbiAgICAqL1xuICAgIGl0ZXIoZnJvbSA9IDApIHtcbiAgICAgICAgcmV0dXJuIEhlYXBDdXJzb3IuZnJvbShbdGhpc10pLmdvdG8oZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlzRW1wdHkoKSB7IHJldHVybiB0aGlzLm5leHRMYXllciA9PSB0aGlzOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSByYW5nZXMgaW4gYSBjb2xsZWN0aW9uIG9mIHNldHMsIGluIG9yZGVyLFxuICAgIHN0YXJ0aW5nIGZyb20gYGZyb21gLlxuICAgICovXG4gICAgc3RhdGljIGl0ZXIoc2V0cywgZnJvbSA9IDApIHtcbiAgICAgICAgcmV0dXJuIEhlYXBDdXJzb3IuZnJvbShzZXRzKS5nb3RvKGZyb20pO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdHdvIGdyb3VwcyBvZiBzZXRzLCBjYWxsaW5nIG1ldGhvZHMgb24gYGNvbXBhcmF0b3JgXG4gICAgdG8gbm90aWZ5IGl0IG9mIHBvc3NpYmxlIGRpZmZlcmVuY2VzLlxuICAgICovXG4gICAgc3RhdGljIGNvbXBhcmUob2xkU2V0cywgbmV3U2V0cywgXG4gICAgLyoqXG4gICAgVGhpcyBpbmRpY2F0ZXMgaG93IHRoZSB1bmRlcmx5aW5nIGRhdGEgY2hhbmdlZCBiZXR3ZWVuIHRoZXNlXG4gICAgcmFuZ2VzLCBhbmQgaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIHRoZSBpdGVyYXRpb24uXG4gICAgKi9cbiAgICB0ZXh0RGlmZiwgY29tcGFyYXRvciwgXG4gICAgLyoqXG4gICAgQ2FuIGJlIHVzZWQgdG8gaWdub3JlIGFsbCBub24tcG9pbnQgcmFuZ2VzLCBhbmQgcG9pbnRzIGJlbG93XG4gICAgdGhlIGdpdmVuIHNpemUuIFdoZW4gLTEsIGFsbCByYW5nZXMgYXJlIGNvbXBhcmVkLlxuICAgICovXG4gICAgbWluUG9pbnRTaXplID0gLTEpIHtcbiAgICAgICAgbGV0IGEgPSBvbGRTZXRzLmZpbHRlcihzZXQgPT4gc2V0Lm1heFBvaW50ID4gMCB8fCAhc2V0LmlzRW1wdHkgJiYgc2V0Lm1heFBvaW50ID49IG1pblBvaW50U2l6ZSk7XG4gICAgICAgIGxldCBiID0gbmV3U2V0cy5maWx0ZXIoc2V0ID0+IHNldC5tYXhQb2ludCA+IDAgfHwgIXNldC5pc0VtcHR5ICYmIHNldC5tYXhQb2ludCA+PSBtaW5Qb2ludFNpemUpO1xuICAgICAgICBsZXQgc2hhcmVkQ2h1bmtzID0gZmluZFNoYXJlZENodW5rcyhhLCBiLCB0ZXh0RGlmZik7XG4gICAgICAgIGxldCBzaWRlQSA9IG5ldyBTcGFuQ3Vyc29yKGEsIHNoYXJlZENodW5rcywgbWluUG9pbnRTaXplKTtcbiAgICAgICAgbGV0IHNpZGVCID0gbmV3IFNwYW5DdXJzb3IoYiwgc2hhcmVkQ2h1bmtzLCBtaW5Qb2ludFNpemUpO1xuICAgICAgICB0ZXh0RGlmZi5pdGVyR2FwcygoZnJvbUEsIGZyb21CLCBsZW5ndGgpID0+IGNvbXBhcmUoc2lkZUEsIGZyb21BLCBzaWRlQiwgZnJvbUIsIGxlbmd0aCwgY29tcGFyYXRvcikpO1xuICAgICAgICBpZiAodGV4dERpZmYuZW1wdHkgJiYgdGV4dERpZmYubGVuZ3RoID09IDApXG4gICAgICAgICAgICBjb21wYXJlKHNpZGVBLCAwLCBzaWRlQiwgMCwgMCwgY29tcGFyYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHR3byBncm91cHMgb2YgcmFuZ2Ugc2V0cywgcmV0dXJuaW5nIHRydWVcbiAgICBpZiB0aGV5IGFyZSBlcXVpdmFsZW50IGluIHRoZSBnaXZlbiByYW5nZS5cbiAgICAqL1xuICAgIHN0YXRpYyBlcShvbGRTZXRzLCBuZXdTZXRzLCBmcm9tID0gMCwgdG8pIHtcbiAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICB0byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi8gLSAxO1xuICAgICAgICBsZXQgYSA9IG9sZFNldHMuZmlsdGVyKHNldCA9PiAhc2V0LmlzRW1wdHkgJiYgbmV3U2V0cy5pbmRleE9mKHNldCkgPCAwKTtcbiAgICAgICAgbGV0IGIgPSBuZXdTZXRzLmZpbHRlcihzZXQgPT4gIXNldC5pc0VtcHR5ICYmIG9sZFNldHMuaW5kZXhPZihzZXQpIDwgMCk7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgc2hhcmVkQ2h1bmtzID0gZmluZFNoYXJlZENodW5rcyhhLCBiKTtcbiAgICAgICAgbGV0IHNpZGVBID0gbmV3IFNwYW5DdXJzb3IoYSwgc2hhcmVkQ2h1bmtzLCAwKS5nb3RvKGZyb20pLCBzaWRlQiA9IG5ldyBTcGFuQ3Vyc29yKGIsIHNoYXJlZENodW5rcywgMCkuZ290byhmcm9tKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHNpZGVBLnRvICE9IHNpZGVCLnRvIHx8XG4gICAgICAgICAgICAgICAgIXNhbWVWYWx1ZXMoc2lkZUEuYWN0aXZlLCBzaWRlQi5hY3RpdmUpIHx8XG4gICAgICAgICAgICAgICAgc2lkZUEucG9pbnQgJiYgKCFzaWRlQi5wb2ludCB8fCAhc2lkZUEucG9pbnQuZXEoc2lkZUIucG9pbnQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2lkZUEudG8gPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHNpZGVBLm5leHQoKTtcbiAgICAgICAgICAgIHNpZGVCLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgYSBncm91cCBvZiByYW5nZSBzZXRzIGF0IHRoZSBzYW1lIHRpbWUsIG5vdGlmeWluZ1xuICAgIHRoZSBpdGVyYXRvciBhYm91dCB0aGUgcmFuZ2VzIGNvdmVyaW5nIGV2ZXJ5IGdpdmVuIHBpZWNlIG9mXG4gICAgY29udGVudC4gUmV0dXJucyB0aGUgb3BlbiBjb3VudCAoc2VlXG4gICAgW2BTcGFuSXRlcmF0b3Iuc3BhbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3Bhbkl0ZXJhdG9yLnNwYW4pKSBhdCB0aGUgZW5kXG4gICAgb2YgdGhlIGl0ZXJhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBzcGFucyhzZXRzLCBmcm9tLCB0bywgaXRlcmF0b3IsIFxuICAgIC8qKlxuICAgIFdoZW4gZ2l2ZW4gYW5kIGdyZWF0ZXIgdGhhbiAtMSwgb25seSBwb2ludHMgb2YgYXQgbGVhc3QgdGhpc1xuICAgIHNpemUgYXJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAqL1xuICAgIG1pblBvaW50U2l6ZSA9IC0xKSB7XG4gICAgICAgIGxldCBjdXJzb3IgPSBuZXcgU3BhbkN1cnNvcihzZXRzLCBudWxsLCBtaW5Qb2ludFNpemUpLmdvdG8oZnJvbSksIHBvcyA9IGZyb207XG4gICAgICAgIGxldCBvcGVuUmFuZ2VzID0gY3Vyc29yLm9wZW5TdGFydDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGN1clRvID0gTWF0aC5taW4oY3Vyc29yLnRvLCB0byk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yLnBvaW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGl2ZSA9IGN1cnNvci5hY3RpdmVGb3JQb2ludChjdXJzb3IudG8pO1xuICAgICAgICAgICAgICAgIGxldCBvcGVuQ291bnQgPSBjdXJzb3IucG9pbnRGcm9tIDwgZnJvbSA/IGFjdGl2ZS5sZW5ndGggKyAxXG4gICAgICAgICAgICAgICAgICAgIDogY3Vyc29yLnBvaW50LnN0YXJ0U2lkZSA8IDAgPyBhY3RpdmUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKGFjdGl2ZS5sZW5ndGgsIG9wZW5SYW5nZXMpO1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnBvaW50KHBvcywgY3VyVG8sIGN1cnNvci5wb2ludCwgYWN0aXZlLCBvcGVuQ291bnQsIGN1cnNvci5wb2ludFJhbmspO1xuICAgICAgICAgICAgICAgIG9wZW5SYW5nZXMgPSBNYXRoLm1pbihjdXJzb3Iub3BlbkVuZChjdXJUbyksIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyVG8gPiBwb3MpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5zcGFuKHBvcywgY3VyVG8sIGN1cnNvci5hY3RpdmUsIG9wZW5SYW5nZXMpO1xuICAgICAgICAgICAgICAgIG9wZW5SYW5nZXMgPSBjdXJzb3Iub3BlbkVuZChjdXJUbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3Vyc29yLnRvID4gdG8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5SYW5nZXMgKyAoY3Vyc29yLnBvaW50ICYmIGN1cnNvci50byA+IHRvID8gMSA6IDApO1xuICAgICAgICAgICAgcG9zID0gY3Vyc29yLnRvO1xuICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSByYW5nZSBzZXQgZm9yIHRoZSBnaXZlbiByYW5nZSBvciBhcnJheSBvZiByYW5nZXMuIEJ5XG4gICAgZGVmYXVsdCwgdGhpcyBleHBlY3RzIHRoZSByYW5nZXMgdG8gYmUgX3NvcnRlZF8gKGJ5IHN0YXJ0XG4gICAgcG9zaXRpb24gYW5kLCBpZiB0d28gc3RhcnQgYXQgdGhlIHNhbWUgcG9zaXRpb24sXG4gICAgYHZhbHVlLnN0YXJ0U2lkZWApLiBZb3UgY2FuIHBhc3MgYHRydWVgIGFzIHNlY29uZCBhcmd1bWVudCB0b1xuICAgIGNhdXNlIHRoZSBtZXRob2QgdG8gc29ydCB0aGVtLlxuICAgICovXG4gICAgc3RhdGljIG9mKHJhbmdlcywgc29ydCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBidWlsZCA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2YgcmFuZ2VzIGluc3RhbmNlb2YgUmFuZ2UgPyBbcmFuZ2VzXSA6IHNvcnQgPyBsYXp5U29ydChyYW5nZXMpIDogcmFuZ2VzKVxuICAgICAgICAgICAgYnVpbGQuYWRkKHJhbmdlLmZyb20sIHJhbmdlLnRvLCByYW5nZS52YWx1ZSk7XG4gICAgICAgIHJldHVybiBidWlsZC5maW5pc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSm9pbiBhbiBhcnJheSBvZiByYW5nZSBzZXRzIGludG8gYSBzaW5nbGUgc2V0LlxuICAgICovXG4gICAgc3RhdGljIGpvaW4oc2V0cykge1xuICAgICAgICBpZiAoIXNldHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFJhbmdlU2V0LmVtcHR5O1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2V0c1tzZXRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBmb3IgKGxldCBpID0gc2V0cy5sZW5ndGggLSAyOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXIgPSBzZXRzW2ldOyBsYXllciAhPSBSYW5nZVNldC5lbXB0eTsgbGF5ZXIgPSBsYXllci5uZXh0TGF5ZXIpXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFJhbmdlU2V0KGxheWVyLmNodW5rUG9zLCBsYXllci5jaHVuaywgcmVzdWx0LCBNYXRoLm1heChsYXllci5tYXhQb2ludCwgcmVzdWx0Lm1heFBvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgcmFuZ2VzLlxuKi9cblJhbmdlU2V0LmVtcHR5ID0gLypAX19QVVJFX18qL25ldyBSYW5nZVNldChbXSwgW10sIG51bGwsIC0xKTtcbmZ1bmN0aW9uIGxhenlTb3J0KHJhbmdlcykge1xuICAgIGlmIChyYW5nZXMubGVuZ3RoID4gMSlcbiAgICAgICAgZm9yIChsZXQgcHJldiA9IHJhbmdlc1swXSwgaSA9IDE7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSByYW5nZXNbaV07XG4gICAgICAgICAgICBpZiAoY21wUmFuZ2UocHJldiwgY3VyKSA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlcy5zbGljZSgpLnNvcnQoY21wUmFuZ2UpO1xuICAgICAgICAgICAgcHJldiA9IGN1cjtcbiAgICAgICAgfVxuICAgIHJldHVybiByYW5nZXM7XG59XG5SYW5nZVNldC5lbXB0eS5uZXh0TGF5ZXIgPSBSYW5nZVNldC5lbXB0eTtcbi8qKlxuQSByYW5nZSBzZXQgYnVpbGRlciBpcyBhIGRhdGEgc3RydWN0dXJlIHRoYXQgaGVscHMgYnVpbGQgdXAgYVxuW3JhbmdlIHNldF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZVNldCkgZGlyZWN0bHksIHdpdGhvdXQgZmlyc3QgYWxsb2NhdGluZ1xuYW4gYXJyYXkgb2YgW2BSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIG9iamVjdHMuXG4qL1xuY2xhc3MgUmFuZ2VTZXRCdWlsZGVyIHtcbiAgICBmaW5pc2hDaHVuayhuZXdBcnJheXMpIHtcbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChuZXcgQ2h1bmsodGhpcy5mcm9tLCB0aGlzLnRvLCB0aGlzLnZhbHVlLCB0aGlzLm1heFBvaW50KSk7XG4gICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaCh0aGlzLmNodW5rU3RhcnQpO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5zZXRNYXhQb2ludCA9IE1hdGgubWF4KHRoaXMuc2V0TWF4UG9pbnQsIHRoaXMubWF4UG9pbnQpO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gLTE7XG4gICAgICAgIGlmIChuZXdBcnJheXMpIHtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IFtdO1xuICAgICAgICAgICAgdGhpcy50byA9IFtdO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBlbXB0eSBidWlsZGVyLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtQb3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1N0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEZyb20gPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgdGhpcy5sYXN0VG8gPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgdGhpcy5mcm9tID0gW107XG4gICAgICAgIHRoaXMudG8gPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gLTE7XG4gICAgICAgIHRoaXMuc2V0TWF4UG9pbnQgPSAtMTtcbiAgICAgICAgdGhpcy5uZXh0TGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSByYW5nZS4gUmFuZ2VzIHNob3VsZCBiZSBhZGRlZCBpbiBzb3J0ZWQgKGJ5IGBmcm9tYCBhbmRcbiAgICBgdmFsdWUuc3RhcnRTaWRlYCkgb3JkZXIuXG4gICAgKi9cbiAgICBhZGQoZnJvbSwgdG8sIHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5hZGRJbm5lcihmcm9tLCB0bywgdmFsdWUpKVxuICAgICAgICAgICAgKHRoaXMubmV4dExheWVyIHx8ICh0aGlzLm5leHRMYXllciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIpKS5hZGQoZnJvbSwgdG8sIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRJbm5lcihmcm9tLCB0bywgdmFsdWUpIHtcbiAgICAgICAgbGV0IGRpZmYgPSBmcm9tIC0gdGhpcy5sYXN0VG8gfHwgdmFsdWUuc3RhcnRTaWRlIC0gdGhpcy5sYXN0LmVuZFNpZGU7XG4gICAgICAgIGlmIChkaWZmIDw9IDAgJiYgKGZyb20gLSB0aGlzLmxhc3RGcm9tIHx8IHZhbHVlLnN0YXJ0U2lkZSAtIHRoaXMubGFzdC5zdGFydFNpZGUpIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJhbmdlcyBtdXN0IGJlIGFkZGVkIHNvcnRlZCBieSBgZnJvbWAgcG9zaXRpb24gYW5kIGBzdGFydFNpZGVgXCIpO1xuICAgICAgICBpZiAoZGlmZiA8IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmZyb20ubGVuZ3RoID09IDI1MCAvKiBDLkNodW5rU2l6ZSAqLylcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQ2h1bmsodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rU3RhcnQgPCAwKVxuICAgICAgICAgICAgdGhpcy5jaHVua1N0YXJ0ID0gZnJvbTtcbiAgICAgICAgdGhpcy5mcm9tLnB1c2goZnJvbSAtIHRoaXMuY2h1bmtTdGFydCk7XG4gICAgICAgIHRoaXMudG8ucHVzaCh0byAtIHRoaXMuY2h1bmtTdGFydCk7XG4gICAgICAgIHRoaXMubGFzdCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxhc3RGcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy5sYXN0VG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgaWYgKHZhbHVlLnBvaW50KVxuICAgICAgICAgICAgdGhpcy5tYXhQb2ludCA9IE1hdGgubWF4KHRoaXMubWF4UG9pbnQsIHRvIC0gZnJvbSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZENodW5rKGZyb20sIGNodW5rKSB7XG4gICAgICAgIGlmICgoZnJvbSAtIHRoaXMubGFzdFRvIHx8IGNodW5rLnZhbHVlWzBdLnN0YXJ0U2lkZSAtIHRoaXMubGFzdC5lbmRTaWRlKSA8IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmZyb20ubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuayh0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRNYXhQb2ludCA9IE1hdGgubWF4KHRoaXMuc2V0TWF4UG9pbnQsIGNodW5rLm1heFBvaW50KTtcbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaChmcm9tKTtcbiAgICAgICAgbGV0IGxhc3QgPSBjaHVuay52YWx1ZS5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmxhc3QgPSBjaHVuay52YWx1ZVtsYXN0XTtcbiAgICAgICAgdGhpcy5sYXN0RnJvbSA9IGNodW5rLmZyb21bbGFzdF0gKyBmcm9tO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IGNodW5rLnRvW2xhc3RdICsgZnJvbTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmlzaCB0aGUgcmFuZ2Ugc2V0LiBSZXR1cm5zIHRoZSBuZXcgc2V0LiBUaGUgYnVpbGRlciBjYW4ndCBiZVxuICAgIHVzZWQgYW55bW9yZSBhZnRlciB0aGlzIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAqL1xuICAgIGZpbmlzaCgpIHsgcmV0dXJuIHRoaXMuZmluaXNoSW5uZXIoUmFuZ2VTZXQuZW1wdHkpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5pc2hJbm5lcihuZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLmZyb20ubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuayhmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBsZXQgcmVzdWx0ID0gUmFuZ2VTZXQuY3JlYXRlKHRoaXMuY2h1bmtQb3MsIHRoaXMuY2h1bmtzLCB0aGlzLm5leHRMYXllciA/IHRoaXMubmV4dExheWVyLmZpbmlzaElubmVyKG5leHQpIDogbmV4dCwgdGhpcy5zZXRNYXhQb2ludCk7XG4gICAgICAgIHRoaXMuZnJvbSA9IG51bGw7IC8vIE1ha2Ugc3VyZSBmdXJ0aGVyIGBhZGRgIGNhbGxzIHByb2R1Y2UgZXJyb3JzXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZFNoYXJlZENodW5rcyhhLCBiLCB0ZXh0RGlmZikge1xuICAgIGxldCBpbkEgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChsZXQgc2V0IG9mIGEpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0LmNodW5rLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHNldC5jaHVua1tpXS5tYXhQb2ludCA8PSAwKVxuICAgICAgICAgICAgICAgIGluQS5zZXQoc2V0LmNodW5rW2ldLCBzZXQuY2h1bmtQb3NbaV0pO1xuICAgIGxldCBzaGFyZWQgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChsZXQgc2V0IG9mIGIpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0LmNodW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQga25vd24gPSBpbkEuZ2V0KHNldC5jaHVua1tpXSk7XG4gICAgICAgICAgICBpZiAoa25vd24gIT0gbnVsbCAmJiAodGV4dERpZmYgPyB0ZXh0RGlmZi5tYXBQb3Moa25vd24pIDoga25vd24pID09IHNldC5jaHVua1Bvc1tpXSAmJlxuICAgICAgICAgICAgICAgICEodGV4dERpZmYgPT09IG51bGwgfHwgdGV4dERpZmYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHREaWZmLnRvdWNoZXNSYW5nZShrbm93biwga25vd24gKyBzZXQuY2h1bmtbaV0ubGVuZ3RoKSkpXG4gICAgICAgICAgICAgICAgc2hhcmVkLmFkZChzZXQuY2h1bmtbaV0pO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHNoYXJlZDtcbn1cbmNsYXNzIExheWVyQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihsYXllciwgc2tpcCwgbWluUG9pbnQsIHJhbmsgPSAwKSB7XG4gICAgICAgIHRoaXMubGF5ZXIgPSBsYXllcjtcbiAgICAgICAgdGhpcy5za2lwID0gc2tpcDtcbiAgICAgICAgdGhpcy5taW5Qb2ludCA9IG1pblBvaW50O1xuICAgICAgICB0aGlzLnJhbmsgPSByYW5rO1xuICAgIH1cbiAgICBnZXQgc3RhcnRTaWRlKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuc3RhcnRTaWRlIDogMDsgfVxuICAgIGdldCBlbmRTaWRlKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuZW5kU2lkZSA6IDA7IH1cbiAgICBnb3RvKHBvcywgc2lkZSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovKSB7XG4gICAgICAgIHRoaXMuY2h1bmtJbmRleCA9IHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuZ290b0lubmVyKHBvcywgc2lkZSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ290b0lubmVyKHBvcywgc2lkZSwgZm9yd2FyZCkge1xuICAgICAgICB3aGlsZSAodGhpcy5jaHVua0luZGV4IDwgdGhpcy5sYXllci5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEodGhpcy5za2lwICYmIHRoaXMuc2tpcC5oYXMobmV4dCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmxheWVyLmNodW5rRW5kKHRoaXMuY2h1bmtJbmRleCkgPCBwb3MgfHxcbiAgICAgICAgICAgICAgICBuZXh0Lm1heFBvaW50IDwgdGhpcy5taW5Qb2ludCkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB0aGlzLmNodW5rSW5kZXgrKztcbiAgICAgICAgICAgIGZvcndhcmQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaHVua0luZGV4IDwgdGhpcy5sYXllci5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByYW5nZUluZGV4ID0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdLmZpbmRJbmRleChwb3MgLSB0aGlzLmxheWVyLmNodW5rUG9zW3RoaXMuY2h1bmtJbmRleF0sIHNpZGUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFmb3J3YXJkIHx8IHRoaXMucmFuZ2VJbmRleCA8IHJhbmdlSW5kZXgpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZUluZGV4KHJhbmdlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBmb3J3YXJkKHBvcywgc2lkZSkge1xuICAgICAgICBpZiAoKHRoaXMudG8gLSBwb3MgfHwgdGhpcy5lbmRTaWRlIC0gc2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy5nb3RvSW5uZXIocG9zLCBzaWRlLCB0cnVlKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2h1bmtJbmRleCA9PSB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRoaXMudG8gPSAxMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGNodW5rUG9zID0gdGhpcy5sYXllci5jaHVua1Bvc1t0aGlzLmNodW5rSW5kZXhdLCBjaHVuayA9IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XTtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IGNodW5rUG9zICsgY2h1bmsuZnJvbVt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgICAgICAgICAgdGhpcy50byA9IGNodW5rUG9zICsgY2h1bmsudG9bdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gY2h1bmsudmFsdWVbdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlSW5kZXgodGhpcy5yYW5nZUluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWluUG9pbnQgPCAwIHx8IHRoaXMudmFsdWUucG9pbnQgJiYgdGhpcy50byAtIHRoaXMuZnJvbSA+PSB0aGlzLm1pblBvaW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRSYW5nZUluZGV4KGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA9PSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF0udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rSW5kZXgrKztcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXApIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5jaHVua0luZGV4IDwgdGhpcy5sYXllci5jaHVuay5sZW5ndGggJiYgdGhpcy5za2lwLmhhcyh0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF0pKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNodW5rSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSBpbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXh0Q2h1bmsoKSB7XG4gICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgY29tcGFyZShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tIC0gb3RoZXIuZnJvbSB8fCB0aGlzLnN0YXJ0U2lkZSAtIG90aGVyLnN0YXJ0U2lkZSB8fCB0aGlzLnJhbmsgLSBvdGhlci5yYW5rIHx8XG4gICAgICAgICAgICB0aGlzLnRvIC0gb3RoZXIudG8gfHwgdGhpcy5lbmRTaWRlIC0gb3RoZXIuZW5kU2lkZTtcbiAgICB9XG59XG5jbGFzcyBIZWFwQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihoZWFwKSB7XG4gICAgICAgIHRoaXMuaGVhcCA9IGhlYXA7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHNldHMsIHNraXAgPSBudWxsLCBtaW5Qb2ludCA9IC0xKSB7XG4gICAgICAgIGxldCBoZWFwID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgY3VyID0gc2V0c1tpXTsgIWN1ci5pc0VtcHR5OyBjdXIgPSBjdXIubmV4dExheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1ci5tYXhQb2ludCA+PSBtaW5Qb2ludClcbiAgICAgICAgICAgICAgICAgICAgaGVhcC5wdXNoKG5ldyBMYXllckN1cnNvcihjdXIsIHNraXAsIG1pblBvaW50LCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYXAubGVuZ3RoID09IDEgPyBoZWFwWzBdIDogbmV3IEhlYXBDdXJzb3IoaGVhcCk7XG4gICAgfVxuICAgIGdldCBzdGFydFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5zdGFydFNpZGUgOiAwOyB9XG4gICAgZ290byhwb3MsIHNpZGUgPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLykge1xuICAgICAgICBmb3IgKGxldCBjdXIgb2YgdGhpcy5oZWFwKVxuICAgICAgICAgICAgY3VyLmdvdG8ocG9zLCBzaWRlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaGVhcC5sZW5ndGggPj4gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBoZWFwQnViYmxlKHRoaXMuaGVhcCwgaSk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZm9yd2FyZChwb3MsIHNpZGUpIHtcbiAgICAgICAgZm9yIChsZXQgY3VyIG9mIHRoaXMuaGVhcClcbiAgICAgICAgICAgIGN1ci5mb3J3YXJkKHBvcywgc2lkZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmhlYXAubGVuZ3RoID4+IDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgaGVhcEJ1YmJsZSh0aGlzLmhlYXAsIGkpO1xuICAgICAgICBpZiAoKHRoaXMudG8gLSBwb3MgfHwgdGhpcy52YWx1ZS5lbmRTaWRlIC0gc2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmhlYXAubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRoaXMudG8gPSAxMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJhbmsgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLmhlYXBbMF07XG4gICAgICAgICAgICB0aGlzLmZyb20gPSB0b3AuZnJvbTtcbiAgICAgICAgICAgIHRoaXMudG8gPSB0b3AudG87XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdG9wLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5yYW5rID0gdG9wLnJhbms7XG4gICAgICAgICAgICBpZiAodG9wLnZhbHVlKVxuICAgICAgICAgICAgICAgIHRvcC5uZXh0KCk7XG4gICAgICAgICAgICBoZWFwQnViYmxlKHRoaXMuaGVhcCwgMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBoZWFwQnViYmxlKGhlYXAsIGluZGV4KSB7XG4gICAgZm9yIChsZXQgY3VyID0gaGVhcFtpbmRleF07Oykge1xuICAgICAgICBsZXQgY2hpbGRJbmRleCA9IChpbmRleCA8PCAxKSArIDE7XG4gICAgICAgIGlmIChjaGlsZEluZGV4ID49IGhlYXAubGVuZ3RoKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBjaGlsZCA9IGhlYXBbY2hpbGRJbmRleF07XG4gICAgICAgIGlmIChjaGlsZEluZGV4ICsgMSA8IGhlYXAubGVuZ3RoICYmIGNoaWxkLmNvbXBhcmUoaGVhcFtjaGlsZEluZGV4ICsgMV0pID49IDApIHtcbiAgICAgICAgICAgIGNoaWxkID0gaGVhcFtjaGlsZEluZGV4ICsgMV07XG4gICAgICAgICAgICBjaGlsZEluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1ci5jb21wYXJlKGNoaWxkKSA8IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaGVhcFtjaGlsZEluZGV4XSA9IGN1cjtcbiAgICAgICAgaGVhcFtpbmRleF0gPSBjaGlsZDtcbiAgICAgICAgaW5kZXggPSBjaGlsZEluZGV4O1xuICAgIH1cbn1cbmNsYXNzIFNwYW5DdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHNldHMsIHNraXAsIG1pblBvaW50KSB7XG4gICAgICAgIHRoaXMubWluUG9pbnQgPSBtaW5Qb2ludDtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVUbyA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZVJhbmsgPSBbXTtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSAtMTtcbiAgICAgICAgLy8gQSBjdXJyZW50bHkgYWN0aXZlIHBvaW50IHJhbmdlLCBpZiBhbnlcbiAgICAgICAgdGhpcy5wb2ludCA9IG51bGw7XG4gICAgICAgIHRoaXMucG9pbnRGcm9tID0gMDtcbiAgICAgICAgdGhpcy5wb2ludFJhbmsgPSAwO1xuICAgICAgICB0aGlzLnRvID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgIHRoaXMuZW5kU2lkZSA9IDA7XG4gICAgICAgIC8vIFRoZSBhbW91bnQgb2Ygb3BlbiBhY3RpdmUgcmFuZ2VzIGF0IHRoZSBzdGFydCBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgIC8vIE5vdCBpbmNsdWRpbmcgcG9pbnRzLlxuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLmN1cnNvciA9IEhlYXBDdXJzb3IuZnJvbShzZXRzLCBza2lwLCBtaW5Qb2ludCk7XG4gICAgfVxuICAgIGdvdG8ocG9zLCBzaWRlID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8pIHtcbiAgICAgICAgdGhpcy5jdXJzb3IuZ290byhwb3MsIHNpZGUpO1xuICAgICAgICB0aGlzLmFjdGl2ZS5sZW5ndGggPSB0aGlzLmFjdGl2ZVRvLmxlbmd0aCA9IHRoaXMuYWN0aXZlUmFuay5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IC0xO1xuICAgICAgICB0aGlzLnRvID0gcG9zO1xuICAgICAgICB0aGlzLmVuZFNpZGUgPSBzaWRlO1xuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGZvcndhcmQocG9zLCBzaWRlKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLm1pbkFjdGl2ZSA+IC0xICYmICh0aGlzLmFjdGl2ZVRvW3RoaXMubWluQWN0aXZlXSAtIHBvcyB8fCB0aGlzLmFjdGl2ZVt0aGlzLm1pbkFjdGl2ZV0uZW5kU2lkZSAtIHNpZGUpIDwgMClcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWN0aXZlKHRoaXMubWluQWN0aXZlKTtcbiAgICAgICAgdGhpcy5jdXJzb3IuZm9yd2FyZChwb3MsIHNpZGUpO1xuICAgIH1cbiAgICByZW1vdmVBY3RpdmUoaW5kZXgpIHtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlLCBpbmRleCk7XG4gICAgICAgIHJlbW92ZSh0aGlzLmFjdGl2ZVRvLCBpbmRleCk7XG4gICAgICAgIHJlbW92ZSh0aGlzLmFjdGl2ZVJhbmssIGluZGV4KTtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSBmaW5kTWluSW5kZXgodGhpcy5hY3RpdmUsIHRoaXMuYWN0aXZlVG8pO1xuICAgIH1cbiAgICBhZGRBY3RpdmUodHJhY2tPcGVuKSB7XG4gICAgICAgIGxldCBpID0gMCwgeyB2YWx1ZSwgdG8sIHJhbmsgfSA9IHRoaXMuY3Vyc29yO1xuICAgICAgICAvLyBPcmdhbml6ZSBhY3RpdmUgbWFya3MgYnkgcmFuayBmaXJzdCwgdGhlbiBieSBzaXplXG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5hY3RpdmVSYW5rLmxlbmd0aCAmJiAocmFuayAtIHRoaXMuYWN0aXZlUmFua1tpXSB8fCB0byAtIHRoaXMuYWN0aXZlVG9baV0pID4gMClcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlLCBpLCB2YWx1ZSk7XG4gICAgICAgIGluc2VydCh0aGlzLmFjdGl2ZVRvLCBpLCB0byk7XG4gICAgICAgIGluc2VydCh0aGlzLmFjdGl2ZVJhbmssIGksIHJhbmspO1xuICAgICAgICBpZiAodHJhY2tPcGVuKVxuICAgICAgICAgICAgaW5zZXJ0KHRyYWNrT3BlbiwgaSwgdGhpcy5jdXJzb3IuZnJvbSk7XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gZmluZE1pbkluZGV4KHRoaXMuYWN0aXZlLCB0aGlzLmFjdGl2ZVRvKTtcbiAgICB9XG4gICAgLy8gQWZ0ZXIgY2FsbGluZyB0aGlzLCBpZiBgdGhpcy5wb2ludGAgIT0gbnVsbCwgdGhlIG5leHQgcmFuZ2UgaXMgYVxuICAgIC8vIHBvaW50LiBPdGhlcndpc2UsIGl0J3MgYSByZWd1bGFyIHJhbmdlLCBjb3ZlcmVkIGJ5IGB0aGlzLmFjdGl2ZWAuXG4gICAgbmV4dCgpIHtcbiAgICAgICAgbGV0IGZyb20gPSB0aGlzLnRvLCB3YXNQb2ludCA9IHRoaXMucG9pbnQ7XG4gICAgICAgIHRoaXMucG9pbnQgPSBudWxsO1xuICAgICAgICBsZXQgdHJhY2tPcGVuID0gdGhpcy5vcGVuU3RhcnQgPCAwID8gW10gOiBudWxsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgYSA9IHRoaXMubWluQWN0aXZlO1xuICAgICAgICAgICAgaWYgKGEgPiAtMSAmJiAodGhpcy5hY3RpdmVUb1thXSAtIHRoaXMuY3Vyc29yLmZyb20gfHwgdGhpcy5hY3RpdmVbYV0uZW5kU2lkZSAtIHRoaXMuY3Vyc29yLnN0YXJ0U2lkZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlVG9bYV0gPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmFjdGl2ZVRvW2FdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSB0aGlzLmFjdGl2ZVthXS5lbmRTaWRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBY3RpdmUoYSk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrT3BlbilcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHRyYWNrT3BlbiwgYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5jdXJzb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5lbmRTaWRlID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY3Vyc29yLmZyb20gPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuY3Vyc29yLmZyb207XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRTaWRlID0gdGhpcy5jdXJzb3Iuc3RhcnRTaWRlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRWYWwgPSB0aGlzLmN1cnNvci52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRWYWwucG9pbnQpIHsgLy8gT3BlbmluZyBhIHJhbmdlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWN0aXZlKHRyYWNrT3Blbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAod2FzUG9pbnQgJiYgdGhpcy5jdXJzb3IudG8gPT0gdGhpcy50byAmJiB0aGlzLmN1cnNvci5mcm9tIDwgdGhpcy5jdXJzb3IudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGFueSBub24tZW1wdHkgcG9pbnRzIHRoYXQgZW5kIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIHRoZSBwcmV2IHBvaW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIE5ldyBwb2ludFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50ID0gbmV4dFZhbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludEZyb20gPSB0aGlzLmN1cnNvci5mcm9tO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50UmFuayA9IHRoaXMuY3Vyc29yLnJhbms7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmN1cnNvci50bztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRTaWRlID0gbmV4dFZhbC5lbmRTaWRlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9yd2FyZCh0aGlzLnRvLCB0aGlzLmVuZFNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNrT3Blbikge1xuICAgICAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRyYWNrT3Blbi5sZW5ndGggLSAxOyBpID49IDAgJiYgdHJhY2tPcGVuW2ldIDwgZnJvbTsgaS0tKVxuICAgICAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWN0aXZlRm9yUG9pbnQodG8pIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gICAgICAgIGxldCBhY3RpdmUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVSYW5rW2ldIDwgdGhpcy5wb2ludFJhbmspXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVUb1tpXSA+IHRvIHx8IHRoaXMuYWN0aXZlVG9baV0gPT0gdG8gJiYgdGhpcy5hY3RpdmVbaV0uZW5kU2lkZSA+PSB0aGlzLnBvaW50LmVuZFNpZGUpXG4gICAgICAgICAgICAgICAgYWN0aXZlLnB1c2godGhpcy5hY3RpdmVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3RpdmUucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBvcGVuRW5kKHRvKSB7XG4gICAgICAgIGxldCBvcGVuID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlVG8ubGVuZ3RoIC0gMTsgaSA+PSAwICYmIHRoaXMuYWN0aXZlVG9baV0gPiB0bzsgaS0tKVxuICAgICAgICAgICAgb3BlbisrO1xuICAgICAgICByZXR1cm4gb3BlbjtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wYXJlKGEsIHN0YXJ0QSwgYiwgc3RhcnRCLCBsZW5ndGgsIGNvbXBhcmF0b3IpIHtcbiAgICBhLmdvdG8oc3RhcnRBKTtcbiAgICBiLmdvdG8oc3RhcnRCKTtcbiAgICBsZXQgZW5kQiA9IHN0YXJ0QiArIGxlbmd0aDtcbiAgICBsZXQgcG9zID0gc3RhcnRCLCBkUG9zID0gc3RhcnRCIC0gc3RhcnRBO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IGRFbmQgPSAoYS50byArIGRQb3MpIC0gYi50bywgZGlmZiA9IGRFbmQgfHwgYS5lbmRTaWRlIC0gYi5lbmRTaWRlO1xuICAgICAgICBsZXQgZW5kID0gZGlmZiA8IDAgPyBhLnRvICsgZFBvcyA6IGIudG8sIGNsaXBFbmQgPSBNYXRoLm1pbihlbmQsIGVuZEIpO1xuICAgICAgICBpZiAoYS5wb2ludCB8fCBiLnBvaW50KSB7XG4gICAgICAgICAgICBpZiAoIShhLnBvaW50ICYmIGIucG9pbnQgJiYgKGEucG9pbnQgPT0gYi5wb2ludCB8fCBhLnBvaW50LmVxKGIucG9pbnQpKSAmJlxuICAgICAgICAgICAgICAgIHNhbWVWYWx1ZXMoYS5hY3RpdmVGb3JQb2ludChhLnRvKSwgYi5hY3RpdmVGb3JQb2ludChiLnRvKSkpKVxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZVBvaW50KHBvcywgY2xpcEVuZCwgYS5wb2ludCwgYi5wb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2xpcEVuZCA+IHBvcyAmJiAhc2FtZVZhbHVlcyhhLmFjdGl2ZSwgYi5hY3RpdmUpKVxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZVJhbmdlKHBvcywgY2xpcEVuZCwgYS5hY3RpdmUsIGIuYWN0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID4gZW5kQilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoKGRFbmQgfHwgYS5vcGVuRW5kICE9IGIub3BlbkVuZCkgJiYgY29tcGFyYXRvci5ib3VuZENoYW5nZSlcbiAgICAgICAgICAgIGNvbXBhcmF0b3IuYm91bmRDaGFuZ2UoZW5kKTtcbiAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICBpZiAoZGlmZiA8PSAwKVxuICAgICAgICAgICAgYS5uZXh0KCk7XG4gICAgICAgIGlmIChkaWZmID49IDApXG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lVmFsdWVzKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChhW2ldICE9IGJbaV0gJiYgIWFbaV0uZXEoYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZW1vdmUoYXJyYXksIGluZGV4KSB7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4LCBlID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA8IGU7IGkrKylcbiAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtpICsgMV07XG4gICAgYXJyYXkucG9wKCk7XG59XG5mdW5jdGlvbiBpbnNlcnQoYXJyYXksIGluZGV4LCB2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IGluZGV4OyBpLS0pXG4gICAgICAgIGFycmF5W2kgKyAxXSA9IGFycmF5W2ldO1xuICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gZmluZE1pbkluZGV4KHZhbHVlLCBhcnJheSkge1xuICAgIGxldCBmb3VuZCA9IC0xLCBmb3VuZFBvcyA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKChhcnJheVtpXSAtIGZvdW5kUG9zIHx8IHZhbHVlW2ldLmVuZFNpZGUgLSB2YWx1ZVtmb3VuZF0uZW5kU2lkZSkgPCAwKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICBmb3VuZFBvcyA9IGFycmF5W2ldO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG4vKipcbkNvdW50IHRoZSBjb2x1bW4gcG9zaXRpb24gYXQgdGhlIGdpdmVuIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcsXG50YWtpbmcgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgYW5kIHRhYiBzaXplIGludG8gYWNjb3VudC5cbiovXG5mdW5jdGlvbiBjb3VudENvbHVtbihzdHJpbmcsIHRhYlNpemUsIHRvID0gc3RyaW5nLmxlbmd0aCkge1xuICAgIGxldCBuID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvICYmIGkgPCBzdHJpbmcubGVuZ3RoOykge1xuICAgICAgICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSkge1xuICAgICAgICAgICAgbiArPSB0YWJTaXplIC0gKG4gJSB0YWJTaXplKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG4rKztcbiAgICAgICAgICAgIGkgPSBmaW5kQ2x1c3RlckJyZWFrKHN0cmluZywgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG4vKipcbkZpbmQgdGhlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBjb2x1bW4gcG9zaXRpb24gaW4gYVxuc3RyaW5nLCB0YWtpbmcgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgYW5kIHRhYiBzaXplIGludG8gYWNjb3VudC4gQnlcbmRlZmF1bHQsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIHJldHVybmVkIHdoZW4gaXQgaXMgdG9vIHNob3J0IHRvXG5yZWFjaCB0aGUgY29sdW1uLiBQYXNzIGBzdHJpY3RgIHRydWUgdG8gbWFrZSBpdCByZXR1cm4gLTEgaW4gdGhhdFxuc2l0dWF0aW9uLlxuKi9cbmZ1bmN0aW9uIGZpbmRDb2x1bW4oc3RyaW5nLCBjb2wsIHRhYlNpemUsIHN0cmljdCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gMDs7KSB7XG4gICAgICAgIGlmIChuID49IGNvbClcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICBpZiAoaSA9PSBzdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIG4gKz0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSA/IHRhYlNpemUgLSAobiAlIHRhYlNpemUpIDogMTtcbiAgICAgICAgaSA9IGZpbmRDbHVzdGVyQnJlYWsoc3RyaW5nLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmljdCA9PT0gdHJ1ZSA/IC0xIDogc3RyaW5nLmxlbmd0aDtcbn1cblxuZXhwb3J0IHsgQW5ub3RhdGlvbiwgQW5ub3RhdGlvblR5cGUsIENoYW5nZURlc2MsIENoYW5nZVNldCwgQ2hhckNhdGVnb3J5LCBDb21wYXJ0bWVudCwgRWRpdG9yU2VsZWN0aW9uLCBFZGl0b3JTdGF0ZSwgRmFjZXQsIExpbmUsIE1hcE1vZGUsIFByZWMsIFJhbmdlLCBSYW5nZVNldCwgUmFuZ2VTZXRCdWlsZGVyLCBSYW5nZVZhbHVlLCBTZWxlY3Rpb25SYW5nZSwgU3RhdGVFZmZlY3QsIFN0YXRlRWZmZWN0VHlwZSwgU3RhdGVGaWVsZCwgVGV4dCwgVHJhbnNhY3Rpb24sIGNvZGVQb2ludEF0LCBjb2RlUG9pbnRTaXplLCBjb21iaW5lQ29uZmlnLCBjb3VudENvbHVtbiwgZmluZENsdXN0ZXJCcmVhaywgZmluZENvbHVtbiwgZnJvbUNvZGVQb2ludCB9O1xuIiwgIi8qKlxuICogQ3JlYXRlZCBieSBBbGV4IEJvbCBvbiA0LzEvMjAxNy5cbiAqL1xuXG4vKipcbiAqIEludGVydmFsIGlzIGEgcGFpciBvZiBudW1iZXJzIG9yIGEgcGFpciBvZiBhbnkgY29tcGFyYWJsZSBvYmplY3RzIG9uIHdoaWNoIG1heSBiZSBkZWZpbmVkIHByZWRpY2F0ZXNcbiAqICplcXVhbCosICpsZXNzKiBhbmQgbWV0aG9kICptYXgocDEsIHAxKSogdGhhdCByZXR1cm5zIG1heGltdW0gaW4gYSBwYWlyLlxuICogV2hlbiBpbnRlcnZhbCBpcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gYSBwYWlyIG9mIG51bWJlcnMsIHRoaXMgb2JqZWN0IHNob3VsZCBoYXZlIHByb3BlcnRpZXMgKmxvdyosICpoaWdoKiwgKm1heCpcbiAqIGFuZCBpbXBsZW1lbnQgbWV0aG9kcyAqbGVzc190aGFuKCksIGVxdWFsX3RvKCksIGludGVyc2VjdCgpLCBub3RfaW50ZXJzZWN0KCksIGNsb25lKCksIG91dHB1dCgpKi5cbiAqIFR3byBzdGF0aWMgbWV0aG9kcyAqY29tcGFyYWJsZV9tYXgoKSwgY29tcGFyYWJsZV9sZXNzX3RoYW4oKSogZGVmaW5lIGhvdyB0byBjb21wYXJlIHZhbHVlcyBpbiBwYWlyLiA8YnIvPlxuICogVGhpcyBpbnRlcmZhY2UgaXMgZGVzY3JpYmVkIGluIHR5cGVzY3JpcHQgZGVmaW5pdGlvbiBmaWxlICppbmRleC5kLnRzKlxuICpcbiAqIEF4aXMgYWxpZ25lZCByZWN0YW5nbGUgaXMgYW4gZXhhbXBsZSBvZiBzdWNoIGludGVydmFsLlxuICogV2UgbWF5IGxvb2sgYXQgcmVjdGFuZ2xlIGFzIGFuIGludGVydmFsIGJldHdlZW4gaXRzIGxvdyBsZWZ0IGFuZCB0b3AgcmlnaHQgY29ybmVycy5cbiAqIFNlZSAqKkJveCoqIGNsYXNzIGluIFtmbGF0dGVuLWpzXShodHRwczovL2dpdGh1Yi5jb20vYWxleGJvbDk5L2ZsYXR0ZW4tanMpIGxpYnJhcnkgYXMgdGhlIGV4YW1wbGVcbiAqIG9mIEludGVydmFsIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvblxuICogQHR5cGUge0ludGVydmFsfVxuICovXG5jb25zdCBJbnRlcnZhbCA9IGNsYXNzIEludGVydmFsIHtcbiAgICAvKipcbiAgICAgKiBBY2NlcHQgdHdvIGNvbXBhcmFibGUgdmFsdWVzIGFuZCBjcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiBpbnRlcnZhbFxuICAgICAqIFByZWRpY2F0ZSBJbnRlcnZhbC5jb21wYXJhYmxlX2xlc3MobG93LCBoaWdoKSBzdXBwb3NlZCB0byByZXR1cm4gdHJ1ZSBvbiB0aGVzZSB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gbG93XG4gICAgICogQHBhcmFtIGhpZ2hcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb3csIGhpZ2gpIHtcbiAgICAgICAgdGhpcy5sb3cgPSBsb3c7XG4gICAgICAgIHRoaXMuaGlnaCA9IGhpZ2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgaW50ZXJ2YWxcbiAgICAgKiBAcmV0dXJucyB7SW50ZXJ2YWx9XG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwodGhpcy5sb3csIHRoaXMuaGlnaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGVyeSBtYXggcmV0dXJucyBjbG9uZSBvZiB0aGlzIGludGVydmFsXG4gICAgICogQHJldHVybnMge0ludGVydmFsfVxuICAgICAqL1xuICAgIGdldCBtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCk7ICAgLy8gdGhpcy5oaWdoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZWRpY2F0ZSByZXR1cm5zIHRydWUgaXMgdGhpcyBpbnRlcnZhbCBsZXNzIHRoYW4gb3RoZXIgaW50ZXJ2YWxcbiAgICAgKiBAcGFyYW0gb3RoZXJfaW50ZXJ2YWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBsZXNzX3RoYW4ob3RoZXJfaW50ZXJ2YWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG93IDwgb3RoZXJfaW50ZXJ2YWwubG93IHx8XG4gICAgICAgICAgICB0aGlzLmxvdyA9PT0gb3RoZXJfaW50ZXJ2YWwubG93ICYmIHRoaXMuaGlnaCA8IG90aGVyX2ludGVydmFsLmhpZ2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlZGljYXRlIHJldHVybnMgdHJ1ZSBpcyB0aGlzIGludGVydmFsIGVxdWFscyB0byBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSBvdGhlcl9pbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGVxdWFsX3RvKG90aGVyX2ludGVydmFsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvdyA9PT0gb3RoZXJfaW50ZXJ2YWwubG93ICYmIHRoaXMuaGlnaCA9PT0gb3RoZXJfaW50ZXJ2YWwuaGlnaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmIHRoaXMgaW50ZXJ2YWwgaW50ZXJzZWN0cyBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSBvdGhlcl9pbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGludGVyc2VjdChvdGhlcl9pbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gIXRoaXMubm90X2ludGVyc2VjdChvdGhlcl9pbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlZGljYXRlIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGludGVydmFsIGRvZXMgbm90IGludGVyc2VjdCBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSBvdGhlcl9pbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIG5vdF9pbnRlcnNlY3Qob3RoZXJfaW50ZXJ2YWwpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmhpZ2ggPCBvdGhlcl9pbnRlcnZhbC5sb3cgfHwgb3RoZXJfaW50ZXJ2YWwuaGlnaCA8IHRoaXMubG93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG5ldyBpbnRlcnZhbCBtZXJnZWQgd2l0aCBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyX2ludGVydmFsIC0gT3RoZXIgaW50ZXJ2YWwgdG8gbWVyZ2Ugd2l0aFxuICAgICAqIEByZXR1cm5zIHtJbnRlcnZhbH1cbiAgICAgKi9cbiAgICBtZXJnZShvdGhlcl9pbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gbmV3IEludGVydmFsKFxuICAgICAgICAgICAgdGhpcy5sb3cgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgb3RoZXJfaW50ZXJ2YWwubG93IDogKHRoaXMubG93IDwgb3RoZXJfaW50ZXJ2YWwubG93ID8gdGhpcy5sb3cgOiBvdGhlcl9pbnRlcnZhbC5sb3cpLFxuICAgICAgICAgICAgdGhpcy5oaWdoID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgIG90aGVyX2ludGVydmFsLmhpZ2ggOiAodGhpcy5oaWdoID4gb3RoZXJfaW50ZXJ2YWwuaGlnaCA/IHRoaXMuaGlnaCA6IG90aGVyX2ludGVydmFsLmhpZ2gpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBob3cga2V5IHNob3VsZCByZXR1cm5cbiAgICAgKi9cbiAgICBvdXRwdXQoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5sb3csIHRoaXMuaGlnaF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gcmV0dXJucyBtYXhpbXVtIGJldHdlZW4gdHdvIGNvbXBhcmFibGUgdmFsdWVzXG4gICAgICogQHBhcmFtIGludGVydmFsMVxuICAgICAqIEBwYXJhbSBpbnRlcnZhbDJcbiAgICAgKiBAcmV0dXJucyB7SW50ZXJ2YWx9XG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmFibGVfbWF4KGludGVydmFsMSwgaW50ZXJ2YWwyKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbDEubWVyZ2UoaW50ZXJ2YWwyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmIGZpcnN0IHZhbHVlIGxlc3MgdGhhbiBzZWNvbmQgdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsMVxuICAgICAqIEBwYXJhbSB2YWwyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmFibGVfbGVzc190aGFuKHZhbDEsIHZhbDIgKSB7XG4gICAgICAgIHJldHVybiB2YWwxIDwgdmFsMjtcbiAgICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZWQgYnkgQWxleCBCb2wgb24gMy8yOC8yMDE3LlxuICovXG5cblxuLy8gbW9kdWxlLmV4cG9ydHMgPSB7XG4vLyAgICAgUkJfVFJFRV9DT0xPUl9SRUQ6IDAsXG4vLyAgICAgUkJfVFJFRV9DT0xPUl9CTEFDSzogMVxuLy8gfTtcblxuY29uc3QgUkJfVFJFRV9DT0xPUl9SRUQgPSAwO1xuY29uc3QgUkJfVFJFRV9DT0xPUl9CTEFDSyA9IDE7XG5cbi8qKlxuICogQ3JlYXRlZCBieSBBbGV4IEJvbCBvbiA0LzEvMjAxNy5cbiAqL1xuXG5cbmNsYXNzIE5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGtleSA9IHVuZGVmaW5lZCwgdmFsdWUgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbGVmdCA9IG51bGwsIHJpZ2h0ID0gbnVsbCwgcGFyZW50ID0gbnVsbCwgY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7XG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7ICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGxlZnQgY2hpbGQgbm9kZVxuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7ICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byByaWdodCBjaGlsZCBub2RlXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OyAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlXG4gICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcblxuICAgICAgICB0aGlzLml0ZW0gPSB7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX07ICAgLy8ga2V5IGlzIHN1cHBvc2VkIHRvIGJlIGluc3RhbmNlIG9mIEludGVydmFsXG5cbiAgICAgICAgLyogSWYgbm90LCB0aGlzIHNob3VsZCBieSBhbiBhcnJheSBvZiB0d28gbnVtYmVycyAqL1xuICAgICAgICBpZiAoa2V5ICYmIGtleSBpbnN0YW5jZW9mIEFycmF5ICYmIGtleS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGtleVswXSkgJiYgIU51bWJlci5pc05hTihrZXlbMV0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtsb3csIGhpZ2hdID0ga2V5O1xuICAgICAgICAgICAgICAgIGlmIChsb3cgPiBoaWdoKSBbbG93LCBoaWdoXSA9IFtoaWdoLCBsb3ddO1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbS5rZXkgPSBuZXcgSW50ZXJ2YWwobG93LCBoaWdoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5pdGVtLmtleSA/IHRoaXMuaXRlbS5rZXkubWF4IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlzTmlsKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaXRlbS5rZXkgPT09IHVuZGVmaW5lZCAmJiB0aGlzLml0ZW0udmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy5sZWZ0ID09PSBudWxsICYmIHRoaXMucmlnaHQgPT09IG51bGwgJiYgdGhpcy5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSyk7XG4gICAgfVxuXG4gICAgX3ZhbHVlX2xlc3NfdGhhbihvdGhlcl9ub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0udmFsdWUgJiYgb3RoZXJfbm9kZS5pdGVtLnZhbHVlICYmIHRoaXMuaXRlbS52YWx1ZS5sZXNzX3RoYW4gP1xuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlLmxlc3NfdGhhbihvdGhlcl9ub2RlLml0ZW0udmFsdWUpIDpcbiAgICAgICAgICAgIHRoaXMuaXRlbS52YWx1ZSA8IG90aGVyX25vZGUuaXRlbS52YWx1ZTtcbiAgICB9XG5cbiAgICBsZXNzX3RoYW4ob3RoZXJfbm9kZSkge1xuICAgICAgICAvLyBpZiB0cmVlIHN0b3JlcyBvbmx5IGtleXNcbiAgICAgICAgaWYgKHRoaXMuaXRlbS52YWx1ZSA9PT0gdGhpcy5pdGVtLmtleSAmJiBvdGhlcl9ub2RlLml0ZW0udmFsdWUgPT09IG90aGVyX25vZGUuaXRlbS5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5Lmxlc3NfdGhhbihvdGhlcl9ub2RlLml0ZW0ua2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgLy8gaWYgdHJlZSBzdG9yZXMga2V5cyBhbmQgdmFsdWVzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtLmtleS5sZXNzX3RoYW4ob3RoZXJfbm9kZS5pdGVtLmtleSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW0ua2V5LmVxdWFsX3RvKChvdGhlcl9ub2RlLml0ZW0ua2V5KSkgJiYgdGhpcy5fdmFsdWVfbGVzc190aGFuKG90aGVyX25vZGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdmFsdWVfZXF1YWwob3RoZXJfbm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtLnZhbHVlICYmIG90aGVyX25vZGUuaXRlbS52YWx1ZSAmJiB0aGlzLml0ZW0udmFsdWUuZXF1YWxfdG8gP1xuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlLmVxdWFsX3RvKG90aGVyX25vZGUuaXRlbS52YWx1ZSkgOlxuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlID09PSBvdGhlcl9ub2RlLml0ZW0udmFsdWU7XG4gICAgfVxuICAgIGVxdWFsX3RvKG90aGVyX25vZGUpIHtcbiAgICAgICAgLy8gaWYgdHJlZSBzdG9yZXMgb25seSBrZXlzXG4gICAgICAgIGlmICh0aGlzLml0ZW0udmFsdWUgPT09IHRoaXMuaXRlbS5rZXkgJiYgb3RoZXJfbm9kZS5pdGVtLnZhbHVlID09PSBvdGhlcl9ub2RlLml0ZW0ua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtLmtleS5lcXVhbF90byhvdGhlcl9ub2RlLml0ZW0ua2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgLy8gaWYgdHJlZSBzdG9yZXMga2V5cyBhbmQgdmFsdWVzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtLmtleS5lcXVhbF90byhvdGhlcl9ub2RlLml0ZW0ua2V5KSAmJiB0aGlzLl92YWx1ZV9lcXVhbChvdGhlcl9ub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGludGVyc2VjdChvdGhlcl9ub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5LmludGVyc2VjdChvdGhlcl9ub2RlLml0ZW0ua2V5KTtcbiAgICB9XG5cbiAgICBjb3B5X2RhdGEob3RoZXJfbm9kZSkge1xuICAgICAgICB0aGlzLml0ZW0ua2V5ID0gb3RoZXJfbm9kZS5pdGVtLmtleTtcbiAgICAgICAgdGhpcy5pdGVtLnZhbHVlID0gb3RoZXJfbm9kZS5pdGVtLnZhbHVlO1xuICAgIH1cblxuICAgIHVwZGF0ZV9tYXgoKSB7XG4gICAgICAgIC8vIHVzZSBrZXkgKEludGVydmFsKSBtYXggcHJvcGVydHkgaW5zdGVhZCBvZiBrZXkuaGlnaFxuICAgICAgICB0aGlzLm1heCA9IHRoaXMuaXRlbS5rZXkgPyB0aGlzLml0ZW0ua2V5Lm1heCA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgJiYgdGhpcy5yaWdodC5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmFibGVfbWF4ID0gdGhpcy5pdGVtLmtleS5jb25zdHJ1Y3Rvci5jb21wYXJhYmxlX21heDsgIC8vIHN0YXRpYyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMubWF4ID0gY29tcGFyYWJsZV9tYXgodGhpcy5tYXgsIHRoaXMucmlnaHQubWF4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sZWZ0ICYmIHRoaXMubGVmdC5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmFibGVfbWF4ID0gdGhpcy5pdGVtLmtleS5jb25zdHJ1Y3Rvci5jb21wYXJhYmxlX21heDsgIC8vIHN0YXRpYyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMubWF4ID0gY29tcGFyYWJsZV9tYXgodGhpcy5tYXgsIHRoaXMubGVmdC5tYXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3RoZXJfbm9kZSBkb2VzIG5vdCBpbnRlcnNlY3QgYW55IG5vZGUgb2YgbGVmdCBzdWJ0cmVlLCBpZiB0aGlzLmxlZnQubWF4IDwgb3RoZXJfbm9kZS5pdGVtLmtleS5sb3dcbiAgICBub3RfaW50ZXJzZWN0X2xlZnRfc3VidHJlZShzZWFyY2hfbm9kZSkge1xuICAgICAgICBjb25zdCBjb21wYXJhYmxlX2xlc3NfdGhhbiA9IHRoaXMuaXRlbS5rZXkuY29uc3RydWN0b3IuY29tcGFyYWJsZV9sZXNzX3RoYW47ICAvLyBzdGF0aWMgbWV0aG9kXG4gICAgICAgIGxldCBoaWdoID0gdGhpcy5sZWZ0Lm1heC5oaWdoICE9PSB1bmRlZmluZWQgPyB0aGlzLmxlZnQubWF4LmhpZ2ggOiB0aGlzLmxlZnQubWF4O1xuICAgICAgICByZXR1cm4gY29tcGFyYWJsZV9sZXNzX3RoYW4oaGlnaCwgc2VhcmNoX25vZGUuaXRlbS5rZXkubG93KTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcl9ub2RlIGRvZXMgbm90IGludGVyc2VjdCByaWdodCBzdWJ0cmVlIGlmIG90aGVyX25vZGUuaXRlbS5rZXkuaGlnaCA8IHRoaXMucmlnaHQua2V5Lmxvd1xuICAgIG5vdF9pbnRlcnNlY3RfcmlnaHRfc3VidHJlZShzZWFyY2hfbm9kZSkge1xuICAgICAgICBjb25zdCBjb21wYXJhYmxlX2xlc3NfdGhhbiA9IHRoaXMuaXRlbS5rZXkuY29uc3RydWN0b3IuY29tcGFyYWJsZV9sZXNzX3RoYW47ICAvLyBzdGF0aWMgbWV0aG9kXG4gICAgICAgIGxldCBsb3cgPSB0aGlzLnJpZ2h0Lm1heC5sb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMucmlnaHQubWF4LmxvdyA6IHRoaXMucmlnaHQuaXRlbS5rZXkubG93O1xuICAgICAgICByZXR1cm4gY29tcGFyYWJsZV9sZXNzX3RoYW4oc2VhcmNoX25vZGUuaXRlbS5rZXkuaGlnaCwgbG93KTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlZCBieSBBbGV4IEJvbCBvbiAzLzMxLzIwMTcuXG4gKi9cblxuLy8gY29uc3QgbmlsX25vZGUgPSBuZXcgTm9kZSgpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGludGVydmFsIGJpbmFyeSBzZWFyY2ggdHJlZSA8YnIvPlxuICogSW50ZXJ2YWwgdHJlZSBzdG9yZXMgaXRlbXMgd2hpY2ggYXJlIGNvdXBsZXMgb2Yge2tleTppbnRlcnZhbCwgdmFsdWU6IHZhbHVlfSA8YnIvPlxuICogSW50ZXJ2YWwgaXMgYW4gb2JqZWN0IHdpdGggaGlnaCBhbmQgbG93IHByb3BlcnRpZXMgb3Igc2ltcGx5IHBhaXIgW2xvdyxoaWdoXSBvZiBudW1lcmljIHZhbHVlcyA8YnIgLz5cbiAqIEB0eXBlIHtJbnRlcnZhbFRyZWV9XG4gKi9cbmNsYXNzIEludGVydmFsVHJlZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IG5ldyBlbXB0eSBpbnN0YW5jZSBvZiBJbnRlcnZhbFRyZWVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICAgICAgdGhpcy5uaWxfbm9kZSA9IG5ldyBOb2RlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBudW1iZXIgb2YgaXRlbXMgc3RvcmVkIGluIHRoZSBpbnRlcnZhbCB0cmVlXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgdGhpcy50cmVlX3dhbGsodGhpcy5yb290LCAoKSA9PiBjb3VudCsrKTtcbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYXJyYXkgb2Ygc29ydGVkIGtleXMgaW4gdGhlIGFzY2VuZGluZyBvcmRlclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXQga2V5cygpIHtcbiAgICAgICAgbGV0IHJlcyA9IFtdO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIChub2RlKSA9PiByZXMucHVzaChcbiAgICAgICAgICAgIG5vZGUuaXRlbS5rZXkub3V0cHV0ID8gbm9kZS5pdGVtLmtleS5vdXRwdXQoKSA6IG5vZGUuaXRlbS5rZXlcbiAgICAgICAgKSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFycmF5IG9mIHZhbHVlcyBpbiB0aGUgYXNjZW5kaW5nIGtleXMgb3JkZXJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZ2V0IHZhbHVlcygpIHtcbiAgICAgICAgbGV0IHJlcyA9IFtdO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIChub2RlKSA9PiByZXMucHVzaChub2RlLml0ZW0udmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFycmF5IG9mIGl0ZW1zICg8a2V5LHZhbHVlPiBwYWlycykgaW4gdGhlIGFzY2VuZGVkIGtleXMgb3JkZXJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICBsZXQgcmVzID0gW107XG4gICAgICAgIHRoaXMudHJlZV93YWxrKHRoaXMucm9vdCwgKG5vZGUpID0+IHJlcy5wdXNoKHtcbiAgICAgICAgICAgIGtleTogbm9kZS5pdGVtLmtleS5vdXRwdXQgPyBub2RlLml0ZW0ua2V5Lm91dHB1dCgpIDogbm9kZS5pdGVtLmtleSxcbiAgICAgICAgICAgIHZhbHVlOiBub2RlLml0ZW0udmFsdWVcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0cmVlIGlzIGVtcHR5XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnJvb3QgPT0gbnVsbCB8fCB0aGlzLnJvb3QgPT09IHRoaXMubmlsX25vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRyZWVcbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBpbnRlcnZhbCB0cmVlXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0ga2V5IC0gaW50ZXJ2YWwgb2JqZWN0IG9yIGFycmF5IG9mIHR3byBudW1iZXJzIFtsb3csIGhpZ2hdXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gdmFsdWUgcmVwcmVzZW50aW5nIGFueSBvYmplY3QgKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm5zIHtOb2RlfSByZXR1cm5zIHJlZmVyZW5jZSB0byBpbnNlcnRlZCBub2RlIGFzIGFuIG9iamVjdCB7a2V5OmludGVydmFsLCB2YWx1ZTogdmFsdWV9XG4gICAgICovXG4gICAgaW5zZXJ0KGtleSwgdmFsdWUgPSBrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBpbnNlcnRfbm9kZSA9IG5ldyBOb2RlKGtleSwgdmFsdWUsIHRoaXMubmlsX25vZGUsIHRoaXMubmlsX25vZGUsIG51bGwsIFJCX1RSRUVfQ09MT1JfUkVEKTtcbiAgICAgICAgdGhpcy50cmVlX2luc2VydChpbnNlcnRfbm9kZSk7XG4gICAgICAgIHRoaXMucmVjYWxjX21heChpbnNlcnRfbm9kZSk7XG4gICAgICAgIHJldHVybiBpbnNlcnRfbm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaXRlbSB7a2V5LHZhbHVlfSBleGlzdCBpbiB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IGtleSAtIGludGVydmFsIGNvcnJlc3BvbmRlbnQgdG8ga2V5cyBzdG9yZWQgaW4gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSB2YWx1ZSBvYmplY3QgdG8gYmUgY2hlY2tlZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGl0ZW0ge2tleSwgdmFsdWV9IGV4aXN0IGluIHRoZSB0cmVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBleGlzdChrZXksIHZhbHVlID0ga2V5KSB7XG4gICAgICAgIGxldCBzZWFyY2hfbm9kZSA9IG5ldyBOb2RlKGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gISF0aGlzLnRyZWVfc2VhcmNoKHRoaXMucm9vdCwgc2VhcmNoX25vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBlbnRyeSB7a2V5LCB2YWx1ZX0gZnJvbSB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IGtleSAtIGludGVydmFsIGNvcnJlc3BvbmRlbnQgdG8ga2V5cyBzdG9yZWQgaW4gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSB2YWx1ZSBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBpdGVtIHtrZXksIHZhbHVlfSBkZWxldGVkLCBmYWxzZSBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICByZW1vdmUoa2V5LCB2YWx1ZSA9IGtleSkge1xuICAgICAgICBsZXQgc2VhcmNoX25vZGUgPSBuZXcgTm9kZShrZXksIHZhbHVlKTtcbiAgICAgICAgbGV0IGRlbGV0ZV9ub2RlID0gdGhpcy50cmVlX3NlYXJjaCh0aGlzLnJvb3QsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgaWYgKGRlbGV0ZV9ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVfZGVsZXRlKGRlbGV0ZV9ub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlX25vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhcnJheSBvZiBlbnRyeSB2YWx1ZXMgd2hpY2gga2V5cyBpbnRlcnNlY3Qgd2l0aCBnaXZlbiBpbnRlcnZhbCA8YnIvPlxuICAgICAqIElmIG5vIHZhbHVlcyBzdG9yZWQgaW4gdGhlIHRyZWUsIHJldHVybnMgYXJyYXkgb2Yga2V5cyB3aGljaCBpbnRlcnNlY3QgZ2l2ZW4gaW50ZXJ2YWxcbiAgICAgKiBAcGFyYW0ge0ludGVydmFsfSBpbnRlcnZhbCAtIHNlYXJjaCBpbnRlcnZhbCwgb3IgdHVwbGUgW2xvdywgaGlnaF1cbiAgICAgKiBAcGFyYW0gb3V0cHV0TWFwcGVyRm4odmFsdWUsa2V5KSAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgbWFwcyAodmFsdWUsIGtleSkgdG8gY3VzdG9tIG91dHB1dFxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBzZWFyY2goaW50ZXJ2YWwsIG91dHB1dE1hcHBlckZuID0gKHZhbHVlLCBrZXkpID0+IHZhbHVlID09PSBrZXkgPyBrZXkub3V0cHV0KCkgOiB2YWx1ZSkge1xuICAgICAgICBsZXQgc2VhcmNoX25vZGUgPSBuZXcgTm9kZShpbnRlcnZhbCk7XG4gICAgICAgIGxldCByZXNwX25vZGVzID0gW107XG4gICAgICAgIHRoaXMudHJlZV9zZWFyY2hfaW50ZXJ2YWwodGhpcy5yb290LCBzZWFyY2hfbm9kZSwgcmVzcF9ub2Rlcyk7XG4gICAgICAgIHJldHVybiByZXNwX25vZGVzLm1hcChub2RlID0+IG91dHB1dE1hcHBlckZuKG5vZGUuaXRlbS52YWx1ZSwgbm9kZS5pdGVtLmtleSkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGludGVyc2VjdGlvbiBiZXR3ZWVuIGdpdmVuIGFuZCBhbnkgaW50ZXJ2YWwgc3RvcmVkIGluIHRoZSB0cmVlIGZvdW5kXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0gaW50ZXJ2YWwgLSBzZWFyY2ggaW50ZXJ2YWwgb3IgdHVwbGUgW2xvdywgaGlnaF1cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpbnRlcnNlY3RfYW55KGludGVydmFsKSB7XG4gICAgICAgIGxldCBzZWFyY2hfbm9kZSA9IG5ldyBOb2RlKGludGVydmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZV9maW5kX2FueV9pbnRlcnZhbCh0aGlzLnJvb3QsIHNlYXJjaF9ub2RlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmVlIHZpc2l0b3IuIEZvciBlYWNoIG5vZGUgaW1wbGVtZW50IGEgY2FsbGJhY2sgZnVuY3Rpb24uIDxici8+XG4gICAgICogTWV0aG9kIGNhbGxzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCB0d28gcGFyYW1ldGVycyAoa2V5LCB2YWx1ZSlcbiAgICAgKiBAcGFyYW0gdmlzaXRvcihrZXksdmFsdWUpIC0gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIHRyZWUgaXRlbVxuICAgICAqL1xuICAgIGZvckVhY2godmlzaXRvcikge1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIChub2RlKSA9PiB2aXNpdG9yKG5vZGUuaXRlbS5rZXksIG5vZGUuaXRlbS52YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbHVlIE1hcHBlci4gV2FsayB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIG1hcCBub2RlIHZhbHVlIHRvIGFub3RoZXIgdmFsdWVcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sodmFsdWUsa2V5KSAtIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCB0cmVlIGl0ZW1cbiAgICAgKi9cbiAgICBtYXAoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcbiAgICAgICAgdGhpcy50cmVlX3dhbGsodGhpcy5yb290LCAobm9kZSkgPT4gdHJlZS5pbnNlcnQobm9kZS5pdGVtLmtleSwgY2FsbGJhY2sobm9kZS5pdGVtLnZhbHVlLCBub2RlLml0ZW0ua2V5KSkpO1xuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ludGVydmFsfSBpbnRlcnZhbCAtIG9wdGlvbmFsIGlmIHRoZSBpdGVyYXRvciBpcyBpbnRlbmRlZCB0byBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmdcbiAgICAgKiBAcGFyYW0gb3V0cHV0TWFwcGVyRm4odmFsdWUsa2V5KSAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgbWFwcyAodmFsdWUsIGtleSkgdG8gY3VzdG9tIG91dHB1dFxuICAgICAqIEByZXR1cm5zIHtJdGVyYXRvcn1cbiAgICAgKi9cbiAgICAqaXRlcmF0ZShpbnRlcnZhbCwgb3V0cHV0TWFwcGVyRm4gPSAodmFsdWUsIGtleSkgPT4gdmFsdWUgPT09IGtleSA/IGtleS5vdXRwdXQoKSA6IHZhbHVlKSB7XG4gICAgICAgIGxldCBub2RlO1xuICAgICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLnRyZWVfc2VhcmNoX25lYXJlc3RfZm9yd2FyZCh0aGlzLnJvb3QsIG5ldyBOb2RlKGludGVydmFsKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICBub2RlID0gdGhpcy5sb2NhbF9taW5pbXVtKHRoaXMucm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIHlpZWxkIG91dHB1dE1hcHBlckZuKG5vZGUuaXRlbS52YWx1ZSwgbm9kZS5pdGVtLmtleSk7XG4gICAgICAgICAgICBub2RlID0gdGhpcy50cmVlX3N1Y2Nlc3Nvcihub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlY2FsY19tYXgobm9kZSkge1xuICAgICAgICBsZXQgbm9kZV9jdXJyZW50ID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5vZGVfY3VycmVudC5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZV9jdXJyZW50LnBhcmVudC51cGRhdGVfbWF4KCk7XG4gICAgICAgICAgICBub2RlX2N1cnJlbnQgPSBub2RlX2N1cnJlbnQucGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJlZV9pbnNlcnQoaW5zZXJ0X25vZGUpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRfbm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgbGV0IHBhcmVudF9ub2RlID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5yb290ID09IG51bGwgfHwgdGhpcy5yb290ID09PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBpbnNlcnRfbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50X25vZGUgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0X25vZGUubGVzc190aGFuKGN1cnJlbnRfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gY3VycmVudF9ub2RlLmxlZnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnNlcnRfbm9kZS5wYXJlbnQgPSBwYXJlbnRfbm9kZTtcblxuICAgICAgICAgICAgaWYgKGluc2VydF9ub2RlLmxlc3NfdGhhbihwYXJlbnRfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRfbm9kZS5sZWZ0ID0gaW5zZXJ0X25vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRfbm9kZS5yaWdodCA9IGluc2VydF9ub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnNlcnRfZml4dXAoaW5zZXJ0X25vZGUpO1xuICAgIH1cblxuLy8gQWZ0ZXIgaW5zZXJ0aW9uIGluc2VydF9ub2RlIG1heSBoYXZlIHJlZC1jb2xvcmVkIHBhcmVudCwgYW5kIHRoaXMgaXMgYSBzaW5nbGUgcG9zc2libGUgdmlvbGF0aW9uXG4vLyBHbyB1cHdvcmRzIHRvIHRoZSByb290IGFuZCByZS1jb2xvciB1bnRpbCB2aW9sYXRpb24gd2lsbCBiZSByZXNvbHZlZFxuICAgIGluc2VydF9maXh1cChpbnNlcnRfbm9kZSkge1xuICAgICAgICBsZXQgY3VycmVudF9ub2RlO1xuICAgICAgICBsZXQgdW5jbGVfbm9kZTtcblxuICAgICAgICBjdXJyZW50X25vZGUgPSBpbnNlcnRfbm9kZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRfbm9kZSAhPT0gdGhpcy5yb290ICYmIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfUkVEKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudF9ub2RlLnBhcmVudCA9PT0gY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQubGVmdCkgeyAgIC8vIHBhcmVudCBpcyBsZWZ0IGNoaWxkIG9mIGdyYW5kZmF0aGVyXG4gICAgICAgICAgICAgICAgdW5jbGVfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50LnJpZ2h0OyAgICAgICAgICAgICAgLy8gcmlnaHQgYnJvdGhlciBvZiBwYXJlbnRcbiAgICAgICAgICAgICAgICBpZiAodW5jbGVfbm9kZS5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHsgICAgICAgICAgICAgLy8gQ2FzZSAxLiBVbmNsZSBpcyByZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmUtY29sb3IgZmF0aGVyIGFuZCB1bmNsZSBpbnRvIGJsYWNrXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICB1bmNsZV9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSztcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX1JFRDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXNlIDIgJiAzLiBVbmNsZSBpcyBibGFja1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9ub2RlID09PSBjdXJyZW50X25vZGUucGFyZW50LnJpZ2h0KSB7ICAgICAvLyBDYXNlIDIuIEN1cnJlbnQgaWYgcmlnaHQgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBpcyB0cmFuc2Zvcm1lZCBpbnRvIENhc2UgMy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGN1cnJlbnRfbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgIC8vIENhc2UgMy4gQ3VycmVudCBpcyBsZWZ0IGNoaWxkLlxuICAgICAgICAgICAgICAgICAgICAvLyBSZS1jb2xvciBmYXRoZXIgYW5kIGdyYW5kZmF0aGVyLCByb3RhdGUgZ3JhbmRmYXRoZXIgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX1JFRDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVfcmlnaHQoY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmVudCBpcyByaWdodCBjaGlsZCBvZiBncmFuZGZhdGhlclxuICAgICAgICAgICAgICAgIHVuY2xlX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5sZWZ0OyAgICAgICAgICAgICAgLy8gbGVmdCBicm90aGVyIG9mIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmICh1bmNsZV9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX1JFRCkgeyAgICAgICAgICAgICAvLyBDYXNlIDQuIFVuY2xlIGlzIHJlZFxuICAgICAgICAgICAgICAgICAgICAvLyByZS1jb2xvciBmYXRoZXIgYW5kIHVuY2xlIGludG8gYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIHVuY2xlX25vZGUuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X25vZGUgPT09IGN1cnJlbnRfbm9kZS5wYXJlbnQubGVmdCkgeyAgICAgICAgICAgICAvLyBDYXNlIDUuIEN1cnJlbnQgaXMgbGVmdCBjaGlsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGludG8gY2FzZSA2XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVfcmlnaHQoY3VycmVudF9ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgLy8gQ2FzZSA2LiBDdXJyZW50IGlzIHJpZ2h0IGNoaWxkLlxuICAgICAgICAgICAgICAgICAgICAvLyBSZS1jb2xvciBmYXRoZXIgYW5kIGdyYW5kZmF0aGVyLCByb3RhdGUgZ3JhbmRmYXRoZXIgbGVmdFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvb3QuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgIH1cblxuICAgIHRyZWVfZGVsZXRlKGRlbGV0ZV9ub2RlKSB7XG4gICAgICAgIGxldCBjdXRfbm9kZTsgICAvLyBub2RlIHRvIGJlIGN1dCAtIGVpdGhlciBkZWxldGVfbm9kZSBvciBzdWNjZXNzb3Jfbm9kZSAgKFwieVwiIGZyb20gMTQuNClcbiAgICAgICAgbGV0IGZpeF9ub2RlOyAgIC8vIG5vZGUgdG8gZml4IHJiIHRyZWUgcHJvcGVydHkgICAoXCJ4XCIgZnJvbSAxNC40KVxuXG4gICAgICAgIGlmIChkZWxldGVfbm9kZS5sZWZ0ID09PSB0aGlzLm5pbF9ub2RlIHx8IGRlbGV0ZV9ub2RlLnJpZ2h0ID09PSB0aGlzLm5pbF9ub2RlKSB7ICAvLyBkZWxldGVfbm9kZSBoYXMgbGVzcyB0aGVuIDIgY2hpbGRyZW5cbiAgICAgICAgICAgIGN1dF9ub2RlID0gZGVsZXRlX25vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZV9ub2RlIGhhcyAyIGNoaWxkcmVuXG4gICAgICAgICAgICBjdXRfbm9kZSA9IHRoaXMudHJlZV9zdWNjZXNzb3IoZGVsZXRlX25vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZml4X25vZGUgaWYgc2luZ2xlIGNoaWxkIG9mIGN1dF9ub2RlXG4gICAgICAgIGlmIChjdXRfbm9kZS5sZWZ0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBmaXhfbm9kZSA9IGN1dF9ub2RlLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaXhfbm9kZSA9IGN1dF9ub2RlLnJpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGN1dF9ub2RlIGZyb20gcGFyZW50XG4gICAgICAgIC8qaWYgKGZpeF9ub2RlICE9IHRoaXMubmlsX25vZGUpIHsqL1xuICAgICAgICAgICAgZml4X25vZGUucGFyZW50ID0gY3V0X25vZGUucGFyZW50O1xuICAgICAgICAvKn0qL1xuXG4gICAgICAgIGlmIChjdXRfbm9kZSA9PT0gdGhpcy5yb290KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBmaXhfbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXRfbm9kZSA9PT0gY3V0X25vZGUucGFyZW50LmxlZnQpIHtcbiAgICAgICAgICAgICAgICBjdXRfbm9kZS5wYXJlbnQubGVmdCA9IGZpeF9ub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3V0X25vZGUucGFyZW50LnJpZ2h0ID0gZml4X25vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXRfbm9kZS5wYXJlbnQudXBkYXRlX21heCgpOyAgICAgICAgLy8gdXBkYXRlIG1heCBwcm9wZXJ0eSBvZiB0aGUgcGFyZW50XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlY2FsY19tYXgoZml4X25vZGUpOyAgICAgICAgICAgICAgLy8gdXBkYXRlIG1heCBwcm9wZXJ0eSB1cHdhcmQgZnJvbSBmaXhfbm9kZSB0byByb290XG5cbiAgICAgICAgLy8gQ09QWSBEQVRBICEhIVxuICAgICAgICAvLyBEZWxldGVfbm9kZSBiZWNvbWVzIGN1dF9ub2RlLCBpdCBtZWFucyB0aGF0IHdlIGNhbm5vdCBob2xkIHJlZmVyZW5jZVxuICAgICAgICAvLyB0byBub2RlIGluIG91dGVyIHN0cnVjdHVyZSBhbmQgd2Ugd2lsbCBoYXZlIHRvIGRlbGV0ZSBieSBrZXksIGFkZGl0aW9uYWwgc2VhcmNoIG5lZWRcbiAgICAgICAgaWYgKGN1dF9ub2RlICE9PSBkZWxldGVfbm9kZSkge1xuICAgICAgICAgICAgZGVsZXRlX25vZGUuY29weV9kYXRhKGN1dF9ub2RlKTtcbiAgICAgICAgICAgIGRlbGV0ZV9ub2RlLnVwZGF0ZV9tYXgoKTsgICAgICAgICAgIC8vIHVwZGF0ZSBtYXggcHJvcGVydHkgb2YgdGhlIGN1dCBub2RlIGF0IHRoZSBuZXcgcGxhY2VcbiAgICAgICAgICAgIHRoaXMucmVjYWxjX21heChkZWxldGVfbm9kZSk7ICAgICAgIC8vIHVwZGF0ZSBtYXggcHJvcGVydHkgdXB3YXJkIGZyb20gZGVsZXRlX25vZGUgdG8gcm9vdFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC8qZml4X25vZGUgIT0gdGhpcy5uaWxfbm9kZSAmJiAqL2N1dF9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZV9maXh1cChmaXhfbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxldGVfZml4dXAoZml4X25vZGUpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRfbm9kZSA9IGZpeF9ub2RlO1xuICAgICAgICBsZXQgYnJvdGhlcl9ub2RlO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50X25vZGUgIT09IHRoaXMucm9vdCAmJiBjdXJyZW50X25vZGUucGFyZW50ICE9IG51bGwgJiYgY3VycmVudF9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudF9ub2RlID09PSBjdXJyZW50X25vZGUucGFyZW50LmxlZnQpIHsgICAgICAgICAgLy8gZml4IG5vZGUgaXMgbGVmdCBjaGlsZFxuICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGJyb3RoZXJfbm9kZS5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHsgICAvLyBDYXNlIDEuIEJyb3RoZXIgaXMgcmVkXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgICAgICAgLy8gcmUtY29sb3IgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgIC8vIHJlLWNvbG9yIGZhdGhlclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGN1cnJlbnRfbm9kZS5wYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYnJvdGhlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEZXJpdmUgdG8gY2FzZXMgMi4uNDogYnJvdGhlciBpcyBibGFja1xuICAgICAgICAgICAgICAgIGlmIChicm90aGVyX25vZGUubGVmdC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSyAmJlxuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUucmlnaHQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHsgIC8vIGNhc2UgMjogYm90aCBuZXBoZXdzIGJsYWNrXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEOyAgICAgICAgICAgICAgLy8gcmUtY29sb3IgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50OyAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGl0ZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJyb3RoZXJfbm9kZS5yaWdodC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSykgeyAgIC8vIGNhc2UgMzogbGVmdCBuZXBoZXcgcmVkLCByaWdodCBuZXBoZXcgYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEOyAgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUubGVmdC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgLy8gcmUtY29sb3IgbmVwaGV3XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChicm90aGVyX25vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5yaWdodDsgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVyaXZlIHRvIGNhc2UgNDogbGVmdCBuZXBoZXcgYmxhY2ssIHJpZ2h0IG5lcGhldyByZWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDQ6IGxlZnQgbmVwaGV3IGJsYWNrLCByaWdodCBuZXBoZXcgcmVkXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3I7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUucmlnaHQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGN1cnJlbnRfbm9kZS5wYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSB0aGlzLnJvb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXQgZnJvbSBsb29wXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4IG5vZGUgaXMgcmlnaHQgY2hpbGRcbiAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LmxlZnQ7XG4gICAgICAgICAgICAgICAgaWYgKGJyb3RoZXJfbm9kZS5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHsgICAvLyBDYXNlIDEuIEJyb3RoZXIgaXMgcmVkXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgICAgICAgLy8gcmUtY29sb3IgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgIC8vIHJlLWNvbG9yIGZhdGhlclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChjdXJyZW50X25vZGUucGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5sZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBicm90aGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEdvIHRvIGNhc2VzIDIuLjRcbiAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLmxlZnQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0sgJiZcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLnJpZ2h0LmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7ICAgLy8gY2FzZSAyXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEOyAgICAgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLmxlZnQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHsgIC8vIGNhc2UgMzogcmlnaHQgbmVwaGV3IHJlZCwgbGVmdCBuZXBoZXcgYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEOyAgICAgICAgICAgIC8vIHJlLWNvbG9yIGJyb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5yaWdodC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgIC8vIHJlLWNvbG9yIG5lcGhld1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVfbGVmdChicm90aGVyX25vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5sZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXJpdmUgdG8gY2FzZSA0OiByaWdodCBuZXBoZXcgYmxhY2ssIGxlZnQgbmVwaGV3IHJlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgNDogcmlnaHQgbmVwaGV3IGJsYWNrLCBsZWZ0IG5lcGhldyByZWRcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gY3VycmVudF9ub2RlLnBhcmVudC5jb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5sZWZ0LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVfcmlnaHQoY3VycmVudF9ub2RlLnBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IHRoaXMucm9vdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgZXhpdCBmcm9tIGxvb3BcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50X25vZGUuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgIH1cblxuICAgIHRyZWVfc2VhcmNoKG5vZGUsIHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZSA9PT0gdGhpcy5uaWxfbm9kZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHNlYXJjaF9ub2RlLmVxdWFsX3RvKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VhcmNoX25vZGUubGVzc190aGFuKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlX3NlYXJjaChub2RlLmxlZnQsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyZWVfc2VhcmNoKG5vZGUucmlnaHQsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyZWVfc2VhcmNoX25lYXJlc3RfZm9yd2FyZChub2RlLCBzZWFyY2hfbm9kZSkge1xuICAgICAgICBsZXQgYmVzdDtcbiAgICAgICAgbGV0IGN1cnIgPSBub2RlO1xuICAgICAgICB3aGlsZSAoY3VyciAmJiBjdXJyICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBpZiAoY3Vyci5sZXNzX3RoYW4oc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnIuaW50ZXJzZWN0KHNlYXJjaF9ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY3VycjtcbiAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnIubGVmdDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5yaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghYmVzdCB8fCBjdXJyLmxlc3NfdGhhbihiZXN0KSkgYmVzdCA9IGN1cnI7XG4gICAgICAgICAgICAgICAgY3VyciA9IGN1cnIubGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8vIE9yaWdpbmFsIHNlYXJjaF9pbnRlcnZhbCBtZXRob2Q7IGNvbnRhaW5lciByZXMgc3VwcG9ydCBwdXNoKCkgaW5zZXJ0aW9uXG4gICAgLy8gU2VhcmNoIGFsbCBpbnRlcnZhbHMgaW50ZXJzZWN0aW5nIGdpdmVuIG9uZVxuICAgIHRyZWVfc2VhcmNoX2ludGVydmFsKG5vZGUsIHNlYXJjaF9ub2RlLCByZXMpIHtcbiAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICAvLyBpZiAobm9kZS0+bGVmdCAhPSB0aGlzLm5pbF9ub2RlICYmIG5vZGUtPmxlZnQtPm1heCA+PSBsb3cpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnQgIT09IHRoaXMubmlsX25vZGUgJiYgIW5vZGUubm90X2ludGVyc2VjdF9sZWZ0X3N1YnRyZWUoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlX3NlYXJjaF9pbnRlcnZhbChub2RlLmxlZnQsIHNlYXJjaF9ub2RlLCByZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgKGxvdyA8PSBub2RlLT5oaWdoICYmIG5vZGUtPmxvdyA8PSBoaWdoKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pbnRlcnNlY3Qoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobm9kZS0+cmlnaHQgIT0gdGhpcy5uaWxfbm9kZSAmJiBub2RlLT5sb3cgPD0gaGlnaCkge1xuICAgICAgICAgICAgaWYgKG5vZGUucmlnaHQgIT09IHRoaXMubmlsX25vZGUgJiYgIW5vZGUubm90X2ludGVyc2VjdF9yaWdodF9zdWJ0cmVlKHNlYXJjaF9ub2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZV9zZWFyY2hfaW50ZXJ2YWwobm9kZS5yaWdodCwgc2VhcmNoX25vZGUsIHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmVlX2ZpbmRfYW55X2ludGVydmFsKG5vZGUsIHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnQgIT09IHRoaXMubmlsX25vZGUgJiYgIW5vZGUubm90X2ludGVyc2VjdF9sZWZ0X3N1YnRyZWUoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnRyZWVfZmluZF9hbnlfaW50ZXJ2YWwobm9kZS5sZWZ0LCBzZWFyY2hfbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBub2RlLmludGVyc2VjdChzZWFyY2hfbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZvdW5kICYmIG5vZGUucmlnaHQgIT09IHRoaXMubmlsX25vZGUgJiYgIW5vZGUubm90X2ludGVyc2VjdF9yaWdodF9zdWJ0cmVlKHNlYXJjaF9ub2RlKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdGhpcy50cmVlX2ZpbmRfYW55X2ludGVydmFsKG5vZGUucmlnaHQsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuXG4gICAgbG9jYWxfbWluaW11bShub2RlKSB7XG4gICAgICAgIGxldCBub2RlX21pbiA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChub2RlX21pbi5sZWZ0ICE9IG51bGwgJiYgbm9kZV9taW4ubGVmdCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgbm9kZV9taW4gPSBub2RlX21pbi5sZWZ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlX21pbjtcbiAgICB9XG5cbiAgICAvLyBub3QgaW4gdXNlXG4gICAgbG9jYWxfbWF4aW11bShub2RlKSB7XG4gICAgICAgIGxldCBub2RlX21heCA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChub2RlX21heC5yaWdodCAhPSBudWxsICYmIG5vZGVfbWF4LnJpZ2h0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBub2RlX21heCA9IG5vZGVfbWF4LnJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlX21heDtcbiAgICB9XG5cbiAgICB0cmVlX3N1Y2Nlc3Nvcihub2RlKSB7XG4gICAgICAgIGxldCBub2RlX3N1Y2Nlc3NvcjtcbiAgICAgICAgbGV0IGN1cnJlbnRfbm9kZTtcbiAgICAgICAgbGV0IHBhcmVudF9ub2RlO1xuXG4gICAgICAgIGlmIChub2RlLnJpZ2h0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBub2RlX3N1Y2Nlc3NvciA9IHRoaXMubG9jYWxfbWluaW11bShub2RlLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IG5vZGU7XG4gICAgICAgICAgICBwYXJlbnRfbm9kZSA9IG5vZGUucGFyZW50O1xuICAgICAgICAgICAgd2hpbGUgKHBhcmVudF9ub2RlICE9IG51bGwgJiYgcGFyZW50X25vZGUucmlnaHQgPT09IGN1cnJlbnRfbm9kZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IHBhcmVudF9ub2RlO1xuICAgICAgICAgICAgICAgIHBhcmVudF9ub2RlID0gcGFyZW50X25vZGUucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZV9zdWNjZXNzb3IgPSBwYXJlbnRfbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZV9zdWNjZXNzb3I7XG4gICAgfVxuXG4gICAgLy8gICAgICAgICAgIHwgICAgICAgICAgICByaWdodC1yb3RhdGUoVCx5KSAgICAgICB8XG4gICAgLy8gICAgICAgICAgIHkgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0uICAgICAgIHhcbiAgICAvLyAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcbiAgICAvLyAgICAgICAgIHggICBjICAgICAgICAgIGxlZnQtcm90YXRlKFQseCkgICAgICBhICAgeVxuICAgIC8vICAgICAgICAvIFxcICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0gICAgICAgICAvIFxcXG4gICAgLy8gICAgICAgYSAgIGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICAgY1xuXG4gICAgcm90YXRlX2xlZnQoeCkge1xuICAgICAgICBsZXQgeSA9IHgucmlnaHQ7XG5cbiAgICAgICAgeC5yaWdodCA9IHkubGVmdDsgICAgICAgICAgIC8vIGIgZ29lcyB0byB4LnJpZ2h0XG5cbiAgICAgICAgaWYgKHkubGVmdCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeS5sZWZ0LnBhcmVudCA9IHg7ICAgICAvLyB4IGJlY29tZXMgcGFyZW50IG9mIGJcbiAgICAgICAgfVxuICAgICAgICB5LnBhcmVudCA9IHgucGFyZW50OyAgICAgICAvLyBtb3ZlIHBhcmVudFxuXG4gICAgICAgIGlmICh4ID09PSB0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHk7ICAgICAgICAgICAvLyB5IGJlY29tZXMgcm9vdFxuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHkgYmVjb21lcyBjaGlsZCBvZiB4LnBhcmVudFxuICAgICAgICAgICAgaWYgKHggPT09IHgucGFyZW50LmxlZnQpIHtcbiAgICAgICAgICAgICAgICB4LnBhcmVudC5sZWZ0ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHgucGFyZW50LnJpZ2h0ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5LmxlZnQgPSB4OyAgICAgICAgICAgICAgICAgLy8geCBiZWNvbWVzIGxlZnQgY2hpbGQgb2YgeVxuICAgICAgICB4LnBhcmVudCA9IHk7ICAgICAgICAgICAgICAgLy8gYW5kIHkgYmVjb21lcyBwYXJlbnQgb2YgeFxuXG4gICAgICAgIGlmICh4ICE9IG51bGwgJiYgeCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeC51cGRhdGVfbWF4KCk7XG4gICAgICAgIH1cblxuICAgICAgICB5ID0geC5wYXJlbnQ7XG4gICAgICAgIGlmICh5ICE9IG51bGwgJiYgeSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeS51cGRhdGVfbWF4KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByb3RhdGVfcmlnaHQoeSkge1xuICAgICAgICBsZXQgeCA9IHkubGVmdDtcblxuICAgICAgICB5LmxlZnQgPSB4LnJpZ2h0OyAgICAgICAgICAgLy8gYiBnb2VzIHRvIHkubGVmdFxuXG4gICAgICAgIGlmICh4LnJpZ2h0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB4LnJpZ2h0LnBhcmVudCA9IHk7ICAgICAgICAvLyB5IGJlY29tZXMgcGFyZW50IG9mIGJcbiAgICAgICAgfVxuICAgICAgICB4LnBhcmVudCA9IHkucGFyZW50OyAgICAgICAgICAvLyBtb3ZlIHBhcmVudFxuXG4gICAgICAgIGlmICh5ID09PSB0aGlzLnJvb3QpIHsgICAgICAgIC8vIHggYmVjb21lcyByb290XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSB4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHkgYmVjb21lcyBjaGlsZCBvZiB4LnBhcmVudFxuICAgICAgICAgICAgaWYgKHkgPT09IHkucGFyZW50LmxlZnQpIHtcbiAgICAgICAgICAgICAgICB5LnBhcmVudC5sZWZ0ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHkucGFyZW50LnJpZ2h0ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4LnJpZ2h0ID0geTsgICAgICAgICAgICAgICAgIC8vIHkgYmVjb21lcyByaWdodCBjaGlsZCBvZiB4XG4gICAgICAgIHkucGFyZW50ID0geDsgICAgICAgICAgICAgICAvLyBhbmQgeCBiZWNvbWVzIHBhcmVudCBvZiB5XG5cbiAgICAgICAgaWYgKHkgIT09IG51bGwgJiYgeSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeS51cGRhdGVfbWF4KCk7XG4gICAgICAgIH1cblxuICAgICAgICB4ID0geS5wYXJlbnQ7XG4gICAgICAgIGlmICh4ICE9IG51bGwgJiYgeCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeC51cGRhdGVfbWF4KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmVlX3dhbGsobm9kZSwgYWN0aW9uKSB7XG4gICAgICAgIGlmIChub2RlICE9IG51bGwgJiYgbm9kZSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgdGhpcy50cmVlX3dhbGsobm9kZS5sZWZ0LCBhY3Rpb24pO1xuICAgICAgICAgICAgLy8gYXJyLnB1c2gobm9kZS50b0FycmF5KCkpO1xuICAgICAgICAgICAgYWN0aW9uKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy50cmVlX3dhbGsobm9kZS5yaWdodCwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIFJldHVybiB0cnVlIGlmIGFsbCByZWQgbm9kZXMgaGF2ZSBleGFjdGx5IHR3byBibGFjayBjaGlsZCBub2RlcyAqL1xuICAgIHRlc3RSZWRCbGFja1Byb3BlcnR5KCkge1xuICAgICAgICBsZXQgcmVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cmVlX3dhbGsodGhpcy5yb290LCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfUkVEKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZS5sZWZ0LmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLICYmIG5vZGUucmlnaHQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyogVGhyb3cgZXJyb3IgaWYgbm90IGV2ZXJ5IHBhdGggZnJvbSByb290IHRvIGJvdHRvbSBoYXMgc2FtZSBibGFjayBoZWlnaHQgKi9cbiAgICB0ZXN0QmxhY2tIZWlnaHRQcm9wZXJ0eShub2RlKSB7XG4gICAgICAgIGxldCBoZWlnaHQgPSAwO1xuICAgICAgICBsZXQgaGVpZ2h0TGVmdCA9IDA7XG4gICAgICAgIGxldCBoZWlnaHRSaWdodCA9IDA7XG4gICAgICAgIGlmIChub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7XG4gICAgICAgICAgICBoZWlnaHQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5sZWZ0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBoZWlnaHRMZWZ0ID0gdGhpcy50ZXN0QmxhY2tIZWlnaHRQcm9wZXJ0eShub2RlLmxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0TGVmdCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmlnaHQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGhlaWdodFJpZ2h0ID0gdGhpcy50ZXN0QmxhY2tIZWlnaHRQcm9wZXJ0eShub2RlLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlaWdodFJpZ2h0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVpZ2h0TGVmdCAhPT0gaGVpZ2h0UmlnaHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVkLWJsYWNrIGhlaWdodCBwcm9wZXJ0eSB2aW9sYXRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGhlaWdodCArPSBoZWlnaHRMZWZ0O1xuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgSW50ZXJ2YWwsIE5vZGUsIEludGVydmFsVHJlZSBhcyBkZWZhdWx0IH07XG4iLCAiaW1wb3J0IHsgVGV4dCB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IEludGVydmFsVHJlZSBmcm9tIFwiQGZsYXR0ZW4tanMvaW50ZXJ2YWwtdHJlZVwiO1xuaW1wb3J0IHsgdHlwZSBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuL2Jhc2VfcmFuZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENyaXRpY01hcmt1cFJhbmdlcyB7XG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXTtcblx0dHJlZTogSW50ZXJ2YWxUcmVlPENyaXRpY01hcmt1cFJhbmdlPjtcblxuXHRjb25zdHJ1Y3RvcihyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW10pIHtcblx0XHR0aGlzLnJhbmdlcyA9IHJhbmdlcztcblx0XHR0aGlzLnRyZWUgPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XG5cdFx0Zm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpXG5cdFx0XHR0aGlzLnRyZWUuaW5zZXJ0KFtyYW5nZS5mcm9tLCByYW5nZS50b10sIHJhbmdlKTtcblx0fVxuXG5cdGVtcHR5KCkge1xuXHRcdHJldHVybiB0aGlzLnJhbmdlcy5sZW5ndGggPT09IDA7XG5cdH1cblxuXHRnZXQoaW5kZXg6IG51bWJlcikge1xuXHRcdGlmIChpbmRleCA8IDApXG5cdFx0XHRyZXR1cm4gdGhpcy5yYW5nZXNbdGhpcy5yYW5nZXMubGVuZ3RoICsgaW5kZXhdO1xuXHRcdHJldHVybiB0aGlzLnJhbmdlc1tpbmRleF07XG5cdH1cblxuXHQvLyBSaWdodCBicmVha3MgdGllcyBpZiBjdXJzb3IgYmV0d2VlbiB0d28gcmFuZ2VzLCBkZWZhdWx0cyB0byB0aGUgbGVmdCByYW5nZVxuXHRhdF9jdXJzb3IoY3Vyc29yOiBudW1iZXIsIHJpZ2h0ID0gZmFsc2UpOiBDcml0aWNNYXJrdXBSYW5nZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgc2VhcmNoID0gdGhpcy50cmVlLnNlYXJjaChbY3Vyc29yLCBjdXJzb3JdKTtcblx0XHRyZXR1cm4gc2VhcmNoLmxlbmd0aCA/IChyaWdodCAmJiBzZWFyY2gubGVuZ3RoID4gMSkgPyBzZWFyY2hbMV0gOiBzZWFyY2hbMF0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb250YWluc19yYW5nZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50cmVlLmludGVyc2VjdF9hbnkoW2Zyb20sIHRvXSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSByYW5nZSB0aGF0IGlzIChub3QgZGlyZWN0bHkpIGFkamFjZW50IHRvIHRoZSBjdXJzb3IgaW4gZ2l2ZW4gZGlyZWN0aW9uXG5cdCAqIEBwYXJhbSBjdXJzb3IgLSBDdXJzb3IgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBsZWZ0IC0gV2hldGhlciB0byBsb29rIGxlZnQgb3IgcmlnaHQgb2YgdGhlIGN1cnNvclxuXHQgKiBAcGFyYW0gbG9vc2UgLSBXaGV0aGVyIHRvIGluY2x1ZGUgcmFuZ2VzIHRoYXQgYXJlIHBhcnRpYWxseSBhZGphY2VudCB0byB0aGUgY3Vyc29yXG5cdCAqIEBwYXJhbSBpbmNsdWRlX2VkZ2UgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVkZ2VzIG9mIHRoZSByYW5nZVxuXHQgKi9cblx0cmFuZ2VfYWRqYWNlbnRfdG9fY3Vyc29yKGN1cnNvcjogbnVtYmVyLCBsZWZ0OiBib29sZWFuLCBsb29zZSA9IGZhbHNlLCBpbmNsdWRlX2VkZ2UgPSBmYWxzZSkge1xuXHRcdGNvbnN0IHJhbmdlcyA9IGxlZnQgPyB0aGlzLnJhbmdlcy5zbGljZSgpLnJldmVyc2UoKSA6IHRoaXMucmFuZ2VzO1xuXHRcdGlmIChpbmNsdWRlX2VkZ2UpIHtcblx0XHRcdHJldHVybiByYW5nZXMuZmluZChyYW5nZSA9PlxuXHRcdFx0XHRsZWZ0ID8gKChsb29zZSA/IHJhbmdlLmZyb20gOiByYW5nZS50bykgPCBjdXJzb3IpIDogKGN1cnNvciA8IChsb29zZSA/IHJhbmdlLnRvIDogcmFuZ2UuZnJvbSkpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcmFuZ2VzLmZpbmQocmFuZ2UgPT5cblx0XHRcdFx0bGVmdCA/ICgobG9vc2UgPyByYW5nZS5mcm9tIDogcmFuZ2UudG8pIDw9IGN1cnNvcikgOiAoY3Vyc29yIDw9IChsb29zZSA/IHJhbmdlLnRvIDogcmFuZ2UuZnJvbSkpXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFkamFjZW50X3JhbmdlKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSwgbGVmdDogYm9vbGVhbiwgZGlyZWN0bHlfYWRqYWNlbnQgPSBmYWxzZSkge1xuXHRcdGNvbnN0IHJhbmdlX2lkeCA9IHRoaXMucmFuZ2VzLmZpbmRJbmRleChuID0+IG4gPT09IHJhbmdlKTtcblx0XHRpZiAocmFuZ2VfaWR4ID09PSAtMSlcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYWRqYWNlbnQgPSBsZWZ0ID8gdGhpcy5yYW5nZXNbcmFuZ2VfaWR4IC0gMV0gOiB0aGlzLnJhbmdlc1tyYW5nZV9pZHggKyAxXTtcblx0XHRpZiAoIWFkamFjZW50KVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdGlmIChkaXJlY3RseV9hZGphY2VudCkge1xuXHRcdFx0aWYgKGxlZnQgPyBhZGphY2VudC50byA9PT0gcmFuZ2UuZnJvbSA6IHJhbmdlLnRvID09PSBhZGphY2VudC5mcm9tKVxuXHRcdFx0XHRyZXR1cm4gYWRqYWNlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBhZGphY2VudDtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHJhbmdlc19pbl9pbnRlcnZhbChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuXHRcdHJldHVybiB0aGlzLnRyZWUuc2VhcmNoKFtzdGFydCwgZW5kXSkgYXMgQ3JpdGljTWFya3VwUmFuZ2VbXTtcblx0fVxuXG5cdHJhbmdlc19pbl9pbnRlcnZhbHMoaW50ZXJ2YWxzOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9W10pIHtcblx0XHRjb25zdCB1bmlxdWVfcmFuZ2VzID0gbmV3IFNldDxDcml0aWNNYXJrdXBSYW5nZT4oKTtcblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIGludGVydmFscykge1xuXHRcdFx0Zm9yIChjb25zdCBmb3VuZF9yYW5nZSBvZiB0aGlzLnRyZWUuc2VhcmNoKFtyYW5nZS5mcm9tLCByYW5nZS50b10pIGFzIENyaXRpY01hcmt1cFJhbmdlW10pIHtcblx0XHRcdFx0dW5pcXVlX3Jhbmdlcy5hZGQoZm91bmRfcmFuZ2UpO1xuXHRcdFx0XHRpZiAoZm91bmRfcmFuZ2UuYmFzZV9yYW5nZSkge1xuXHRcdFx0XHRcdHVuaXF1ZV9yYW5nZXMuYWRkKGZvdW5kX3JhbmdlLmJhc2VfcmFuZ2UpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcmVwbHkgb2YgZm91bmRfcmFuZ2UuYmFzZV9yYW5nZS5yZXBsaWVzKSB7XG5cdFx0XHRcdFx0XHR1bmlxdWVfcmFuZ2VzLmFkZChyZXBseSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZV9yYW5nZXMpLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSk7XG5cdH1cblxuXHQvLyByYW5nZXNfZnVsbHlfaW5fcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcblx0Ly8gXHRjb25zdCByYW5nZXMgPSB0aGlzLnJhbmdlc19pbl9yYW5nZShzdGFydCwgZW5kKTtcblx0Ly8gXHRpZiAocmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXT8udG91Y2hlc19sZWZ0X2JyYWNrZXQoc3RhcnQsIGZhbHNlLCB0cnVlLCB0cnVlKSlcblx0Ly8gXHRcdHJhbmdlcy5wb3AoKTtcblx0Ly8gXHRpZiAocmFuZ2VzWzBdPy50b3VjaGVzX3JpZ2h0X2JyYWNrZXQoZW5kLCBmYWxzZSwgdHJ1ZSkpXG5cdC8vIFx0XHRyYW5nZXMuc2hpZnQoKTtcblx0Ly8gXHRyZXR1cm4gcmFuZ2VzO1xuXHQvLyB9XG5cblx0dW53cmFwX2luX3JhbmdlKFxuXHRcdGRvYzogVGV4dCxcblx0XHRmcm9tID0gMCxcblx0XHR0byA9IGRvYy5sZW5ndGgsXG5cdFx0cmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZVtdIHwgbnVsbCA9IG51bGwsXG5cdCk6IHsgb3V0cHV0OiBzdHJpbmc7IGZyb206IG51bWJlcjsgdG86IG51bWJlcjsgZnJvbnRfcmFuZ2U/OiBDcml0aWNNYXJrdXBSYW5nZTsgYmFja19yYW5nZT86IENyaXRpY01hcmt1cFJhbmdlIH0ge1xuXHRcdGxldCBmcm9udF9yYW5nZTogdW5kZWZpbmVkIHwgQ3JpdGljTWFya3VwUmFuZ2UsIGJhY2tfcmFuZ2U6IHVuZGVmaW5lZCB8IENyaXRpY01hcmt1cFJhbmdlO1xuXG5cdFx0aWYgKCFyYW5nZXMpXG5cdFx0XHRyYW5nZXMgPSB0aGlzLnJhbmdlc19pbl9pbnRlcnZhbChmcm9tLCB0byk7XG5cblx0XHRpZiAocmFuZ2VzLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiB7IG91dHB1dDogZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvKSwgZnJvbSwgdG8gfTtcblxuXHRcdGxldCBvdXRwdXQgPSBcIlwiO1xuXHRcdGlmIChmcm9tIDwgcmFuZ2VzWzBdLmZyb20pXG5cdFx0XHRvdXRwdXQgKz0gZG9jLnNsaWNlU3RyaW5nKGZyb20sIHJhbmdlc1swXS5mcm9tKTtcblx0XHRlbHNlXG5cdFx0XHRmcm9udF9yYW5nZSA9IHJhbmdlc1swXTtcblxuXHRcdGxldCBwcmV2X3JhbmdlID0gLTE7XG5cdFx0Zm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcblx0XHRcdGlmIChwcmV2X3JhbmdlICE9PSAtMSlcblx0XHRcdFx0b3V0cHV0ICs9IGRvYy5zbGljZVN0cmluZyhwcmV2X3JhbmdlLCByYW5nZS5mcm9tKTtcblx0XHRcdG91dHB1dCArPSByYW5nZS51bndyYXBfc2xpY2UoTWF0aC5tYXgoMCwgZnJvbSksIHRvKTtcblx0XHRcdHByZXZfcmFuZ2UgPSByYW5nZS50bztcblx0XHR9XG5cblx0XHRpZiAodG8gPj0gcmFuZ2VzLmF0KC0xKSEudG8pXG5cdFx0XHRvdXRwdXQgKz0gZG9jLnNsaWNlU3RyaW5nKHJhbmdlcy5hdCgtMSkhLnRvLCB0byk7XG5cdFx0ZWxzZVxuXHRcdFx0YmFja19yYW5nZSA9IHJhbmdlcy5hdCgtMSkhO1xuXG5cdFx0Y29uc3QgbmV3X2Zyb20gPSBmcm9udF9yYW5nZSA/IGZyb250X3JhbmdlLmN1cnNvcl9wYXNzX3N5bnRheChmcm9tLCBmYWxzZSkgOiBmcm9tO1xuXHRcdGNvbnN0IG5ld190byA9IGJhY2tfcmFuZ2UgPyBiYWNrX3JhbmdlLmN1cnNvcl9wYXNzX3N5bnRheCh0bywgdHJ1ZSkgOiB0bztcblx0XHRpZiAobmV3X2Zyb20gIT09IGZyb20gfHwgZnJvbSA9PT0gZnJvbnRfcmFuZ2U/LmZyb20pIGZyb250X3JhbmdlID0gdW5kZWZpbmVkO1xuXHRcdGlmIChuZXdfdG8gIT09IHRvIHx8IHRvID09PSBiYWNrX3JhbmdlPy50bykgYmFja19yYW5nZSA9IHVuZGVmaW5lZDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvdXRwdXQsXG5cdFx0XHRmcm9tOiBuZXdfZnJvbSxcblx0XHRcdHRvOiBuZXdfdG8sXG5cdFx0XHRmcm9udF9yYW5nZSxcblx0XHRcdGJhY2tfcmFuZ2UsXG5cdFx0fTtcblx0fVxufVxuIiwgImNvbnN0IEMgPSBcIlxcdTAzN2NcIlxuY29uc3QgQ09VTlQgPSB0eXBlb2YgU3ltYm9sID09IFwidW5kZWZpbmVkXCIgPyBcIl9fXCIgKyBDIDogU3ltYm9sLmZvcihDKVxuY29uc3QgU0VUID0gdHlwZW9mIFN5bWJvbCA9PSBcInVuZGVmaW5lZFwiID8gXCJfX3N0eWxlU2V0XCIgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTgpIDogU3ltYm9sKFwic3R5bGVTZXRcIilcbmNvbnN0IHRvcCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge31cblxuLy8gOjogLSBTdHlsZSBtb2R1bGVzIGVuY2Fwc3VsYXRlIGEgc2V0IG9mIENTUyBydWxlcyBkZWZpbmVkIGZyb21cbi8vIEphdmFTY3JpcHQuIFRoZWlyIGRlZmluaXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBhIGdpdmVuIERPTVxuLy8gcm9vdCBhZnRlciBpdCBoYXMgYmVlbiBfbW91bnRlZF8gdGhlcmUgd2l0aCBgU3R5bGVNb2R1bGUubW91bnRgLlxuLy9cbi8vIFN0eWxlIG1vZHVsZXMgc2hvdWxkIGJlIGNyZWF0ZWQgb25jZSBhbmQgc3RvcmVkIHNvbWV3aGVyZSwgYXNcbi8vIG9wcG9zZWQgdG8gcmUtY3JlYXRpbmcgdGhlbSBldmVyeSB0aW1lIHlvdSBuZWVkIHRoZW0uIFRoZSBhbW91bnQgb2Zcbi8vIENTUyBydWxlcyBnZW5lcmF0ZWQgZm9yIGEgZ2l2ZW4gRE9NIHJvb3QgaXMgYm91bmRlZCBieSB0aGUgYW1vdW50XG4vLyBvZiBzdHlsZSBtb2R1bGVzIHRoYXQgd2VyZSB1c2VkLiBTbyB0byBhdm9pZCBsZWFraW5nIHJ1bGVzLCBkb24ndFxuLy8gY3JlYXRlIHRoZXNlIGR5bmFtaWNhbGx5LCBidXQgdHJlYXQgdGhlbSBhcyBvbmUtdGltZSBhbGxvY2F0aW9ucy5cbmV4cG9ydCBjbGFzcyBTdHlsZU1vZHVsZSB7XG4gIC8vIDo6IChPYmplY3Q8U3R5bGU+LCA/e2ZpbmlzaDogPyhzdHJpbmcpIFx1MjE5MiBzdHJpbmd9KVxuICAvLyBDcmVhdGUgYSBzdHlsZSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4gc3BlYy5cbiAgLy9cbiAgLy8gV2hlbiBgZmluaXNoYCBpcyBnaXZlbiwgaXQgaXMgY2FsbGVkIG9uIHJlZ3VsYXIgKG5vbi1gQGApXG4gIC8vIHNlbGVjdG9ycyAoYWZ0ZXIgYCZgIGV4cGFuc2lvbikgdG8gY29tcHV0ZSB0aGUgZmluYWwgc2VsZWN0b3IuXG4gIGNvbnN0cnVjdG9yKHNwZWMsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnJ1bGVzID0gW11cbiAgICBsZXQge2ZpbmlzaH0gPSBvcHRpb25zIHx8IHt9XG5cbiAgICBmdW5jdGlvbiBzcGxpdFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gL15ALy50ZXN0KHNlbGVjdG9yKSA/IFtzZWxlY3Rvcl0gOiBzZWxlY3Rvci5zcGxpdCgvLFxccyovKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbmRlcihzZWxlY3RvcnMsIHNwZWMsIHRhcmdldCwgaXNLZXlmcmFtZXMpIHtcbiAgICAgIGxldCBsb2NhbCA9IFtdLCBpc0F0ID0gL15AKFxcdyspXFxiLy5leGVjKHNlbGVjdG9yc1swXSksIGtleWZyYW1lcyA9IGlzQXQgJiYgaXNBdFsxXSA9PSBcImtleWZyYW1lc1wiXG4gICAgICBpZiAoaXNBdCAmJiBzcGVjID09IG51bGwpIHJldHVybiB0YXJnZXQucHVzaChzZWxlY3RvcnNbMF0gKyBcIjtcIilcbiAgICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgICAgICBsZXQgdmFsdWUgPSBzcGVjW3Byb3BdXG4gICAgICAgIGlmICgvJi8udGVzdChwcm9wKSkge1xuICAgICAgICAgIHJlbmRlcihwcm9wLnNwbGl0KC8sXFxzKi8pLm1hcChwYXJ0ID0+IHNlbGVjdG9ycy5tYXAoc2VsID0+IHBhcnQucmVwbGFjZSgvJi8sIHNlbCkpKS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKSxcbiAgICAgICAgICAgICAgICAgdmFsdWUsIHRhcmdldClcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmICghaXNBdCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSAoXCIgKyBwcm9wICsgXCIpIHNob3VsZCBiZSBhIHByaW1pdGl2ZSB2YWx1ZS5cIilcbiAgICAgICAgICByZW5kZXIoc3BsaXRTZWxlY3Rvcihwcm9wKSwgdmFsdWUsIGxvY2FsLCBrZXlmcmFtZXMpXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsLnB1c2gocHJvcC5yZXBsYWNlKC9fLiovLCBcIlwiKS5yZXBsYWNlKC9bQS1aXS9nLCBsID0+IFwiLVwiICsgbC50b0xvd2VyQ2FzZSgpKSArIFwiOiBcIiArIHZhbHVlICsgXCI7XCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb2NhbC5sZW5ndGggfHwga2V5ZnJhbWVzKSB7XG4gICAgICAgIHRhcmdldC5wdXNoKChmaW5pc2ggJiYgIWlzQXQgJiYgIWlzS2V5ZnJhbWVzID8gc2VsZWN0b3JzLm1hcChmaW5pc2gpIDogc2VsZWN0b3JzKS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgICAgICAgICBcIiB7XCIgKyBsb2NhbC5qb2luKFwiIFwiKSArIFwifVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykgcmVuZGVyKHNwbGl0U2VsZWN0b3IocHJvcCksIHNwZWNbcHJvcF0sIHRoaXMucnVsZXMpXG4gIH1cblxuICAvLyA6OiAoKSBcdTIxOTIgc3RyaW5nXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbW9kdWxlJ3MgQ1NTIHJ1bGVzLlxuICBnZXRSdWxlcygpIHsgcmV0dXJuIHRoaXMucnVsZXMuam9pbihcIlxcblwiKSB9XG5cbiAgLy8gOjogKCkgXHUyMTkyIHN0cmluZ1xuICAvLyBHZW5lcmF0ZSBhIG5ldyB1bmlxdWUgQ1NTIGNsYXNzIG5hbWUuXG4gIHN0YXRpYyBuZXdOYW1lKCkge1xuICAgIGxldCBpZCA9IHRvcFtDT1VOVF0gfHwgMVxuICAgIHRvcFtDT1VOVF0gPSBpZCArIDFcbiAgICByZXR1cm4gQyArIGlkLnRvU3RyaW5nKDM2KVxuICB9XG5cbiAgLy8gOjogKHVuaW9uPERvY3VtZW50LCBTaGFkb3dSb290PiwgdW5pb248W1N0eWxlTW9kdWxlXSwgU3R5bGVNb2R1bGU+LCA/e25vbmNlOiA/c3RyaW5nfSlcbiAgLy9cbiAgLy8gTW91bnQgdGhlIGdpdmVuIHNldCBvZiBtb2R1bGVzIGluIHRoZSBnaXZlbiBET00gcm9vdCwgd2hpY2ggZW5zdXJlc1xuICAvLyB0aGF0IHRoZSBDU1MgcnVsZXMgZGVmaW5lZCBieSB0aGUgbW9kdWxlIGFyZSBhdmFpbGFibGUgaW4gdGhhdFxuICAvLyBjb250ZXh0LlxuICAvL1xuICAvLyBSdWxlcyBhcmUgb25seSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgb25jZSBwZXIgcm9vdC5cbiAgLy9cbiAgLy8gUnVsZSBvcmRlciB3aWxsIGZvbGxvdyB0aGUgb3JkZXIgb2YgdGhlIG1vZHVsZXMsIHNvIHRoYXQgcnVsZXMgZnJvbVxuICAvLyBtb2R1bGVzIGxhdGVyIGluIHRoZSBhcnJheSB0YWtlIHByZWNlZGVuY2Ugb2YgdGhvc2UgZnJvbSBlYXJsaWVyXG4gIC8vIG1vZHVsZXMuIElmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIHJvb3RcbiAgLy8gaW4gYSB3YXkgdGhhdCBjaGFuZ2VzIHRoZSBvcmRlciBvZiBhbHJlYWR5IG1vdW50ZWQgbW9kdWxlcywgdGhlIG9sZFxuICAvLyBvcmRlciB3aWxsIGJlIGNoYW5nZWQuXG4gIC8vXG4gIC8vIElmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgbm9uY2UgaXMgcHJvdmlkZWQsIGl0IGlzIGFkZGVkIHRvXG4gIC8vIHRoZSBgPHN0eWxlPmAgdGFnIGdlbmVyYXRlZCBieSB0aGUgbGlicmFyeS5cbiAgc3RhdGljIG1vdW50KHJvb3QsIG1vZHVsZXMsIG9wdGlvbnMpIHtcbiAgICBsZXQgc2V0ID0gcm9vdFtTRVRdLCBub25jZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5ub25jZVxuICAgIGlmICghc2V0KSBzZXQgPSBuZXcgU3R5bGVTZXQocm9vdCwgbm9uY2UpXG4gICAgZWxzZSBpZiAobm9uY2UpIHNldC5zZXROb25jZShub25jZSlcbiAgICBzZXQubW91bnQoQXJyYXkuaXNBcnJheShtb2R1bGVzKSA/IG1vZHVsZXMgOiBbbW9kdWxlc10sIHJvb3QpXG4gIH1cbn1cblxubGV0IGFkb3B0ZWRTZXQgPSBuZXcgTWFwIC8vPERvY3VtZW50LCBTdHlsZVNldD5cblxuY2xhc3MgU3R5bGVTZXQge1xuICBjb25zdHJ1Y3Rvcihyb290LCBub25jZSkge1xuICAgIGxldCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnQgfHwgcm9vdCwgd2luID0gZG9jLmRlZmF1bHRWaWV3XG4gICAgaWYgKCFyb290LmhlYWQgJiYgcm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgJiYgd2luLkNTU1N0eWxlU2hlZXQpIHtcbiAgICAgIGxldCBhZG9wdGVkID0gYWRvcHRlZFNldC5nZXQoZG9jKVxuICAgICAgaWYgKGFkb3B0ZWQpIHJldHVybiByb290W1NFVF0gPSBhZG9wdGVkXG4gICAgICB0aGlzLnNoZWV0ID0gbmV3IHdpbi5DU1NTdHlsZVNoZWV0XG4gICAgICBhZG9wdGVkU2V0LnNldChkb2MsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3R5bGVUYWcgPSBkb2MuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpXG4gICAgICBpZiAobm9uY2UpIHRoaXMuc3R5bGVUYWcuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpXG4gICAgfVxuICAgIHRoaXMubW9kdWxlcyA9IFtdXG4gICAgcm9vdFtTRVRdID0gdGhpc1xuICB9XG5cbiAgbW91bnQobW9kdWxlcywgcm9vdCkge1xuICAgIGxldCBzaGVldCA9IHRoaXMuc2hlZXRcbiAgICBsZXQgcG9zID0gMCAvKiBDdXJyZW50IHJ1bGUgb2Zmc2V0ICovLCBqID0gMCAvKiBJbmRleCBpbnRvIHRoaXMubW9kdWxlcyAqL1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG1vZCA9IG1vZHVsZXNbaV0sIGluZGV4ID0gdGhpcy5tb2R1bGVzLmluZGV4T2YobW9kKVxuICAgICAgaWYgKGluZGV4IDwgaiAmJiBpbmRleCA+IC0xKSB7IC8vIE9yZGVyaW5nIGNvbmZsaWN0XG4gICAgICAgIHRoaXMubW9kdWxlcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgIGotLVxuICAgICAgICBpbmRleCA9IC0xXG4gICAgICB9XG4gICAgICBpZiAoaW5kZXggPT0gLTEpIHtcbiAgICAgICAgdGhpcy5tb2R1bGVzLnNwbGljZShqKyssIDAsIG1vZClcbiAgICAgICAgaWYgKHNoZWV0KSBmb3IgKGxldCBrID0gMDsgayA8IG1vZC5ydWxlcy5sZW5ndGg7IGsrKylcbiAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKG1vZC5ydWxlc1trXSwgcG9zKyspXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoaiA8IGluZGV4KSBwb3MgKz0gdGhpcy5tb2R1bGVzW2orK10ucnVsZXMubGVuZ3RoXG4gICAgICAgIHBvcyArPSBtb2QucnVsZXMubGVuZ3RoXG4gICAgICAgIGorK1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaGVldCkge1xuICAgICAgaWYgKHJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzLmluZGV4T2YodGhpcy5zaGVldCkgPCAwKVxuICAgICAgICByb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFt0aGlzLnNoZWV0LCAuLi5yb290LmFkb3B0ZWRTdHlsZVNoZWV0c11cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRleHQgPSBcIlwiXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubW9kdWxlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGV4dCArPSB0aGlzLm1vZHVsZXNbaV0uZ2V0UnVsZXMoKSArIFwiXFxuXCJcbiAgICAgIHRoaXMuc3R5bGVUYWcudGV4dENvbnRlbnQgPSB0ZXh0XG4gICAgICBsZXQgdGFyZ2V0ID0gcm9vdC5oZWFkIHx8IHJvb3RcbiAgICAgIGlmICh0aGlzLnN0eWxlVGFnLnBhcmVudE5vZGUgIT0gdGFyZ2V0KVxuICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKHRoaXMuc3R5bGVUYWcsIHRhcmdldC5maXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIHNldE5vbmNlKG5vbmNlKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVUYWcgJiYgdGhpcy5zdHlsZVRhZy5nZXRBdHRyaWJ1dGUoXCJub25jZVwiKSAhPSBub25jZSlcbiAgICAgIHRoaXMuc3R5bGVUYWcuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpXG4gIH1cbn1cblxuLy8gU3R5bGU6Ok9iamVjdDx1bmlvbjxTdHlsZSxzdHJpbmc+PlxuLy9cbi8vIEEgc3R5bGUgaXMgYW4gb2JqZWN0IHRoYXQsIGluIHRoZSBzaW1wbGUgY2FzZSwgbWFwcyBDU1MgcHJvcGVydHlcbi8vIG5hbWVzIHRvIHN0cmluZ3MgaG9sZGluZyB0aGVpciB2YWx1ZXMsIGFzIGluIGB7Y29sb3I6IFwicmVkXCIsXG4vLyBmb250V2VpZ2h0OiBcImJvbGRcIn1gLiBUaGUgcHJvcGVydHkgbmFtZXMgY2FuIGJlIGdpdmVuIGluXG4vLyBjYW1lbC1jYXNlXHUyMDE0dGhlIGxpYnJhcnkgd2lsbCBpbnNlcnQgYSBkYXNoIGJlZm9yZSBjYXBpdGFsIGxldHRlcnNcbi8vIHdoZW4gY29udmVydGluZyB0aGVtIHRvIENTUy5cbi8vXG4vLyBJZiB5b3UgaW5jbHVkZSBhbiB1bmRlcnNjb3JlIGluIGEgcHJvcGVydHkgbmFtZSwgaXQgYW5kIGV2ZXJ5dGhpbmdcbi8vIGFmdGVyIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBvdXRwdXQsIHdoaWNoIGNhbiBiZSB1c2VmdWwgd2hlblxuLy8gcHJvdmlkaW5nIGEgcHJvcGVydHkgbXVsdGlwbGUgdGltZXMsIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbi8vIHJlYXNvbnMuXG4vL1xuLy8gQSBwcm9wZXJ0eSBpbiBhIHN0eWxlIG9iamVjdCBjYW4gYWxzbyBiZSBhIHN1Yi1zZWxlY3Rvciwgd2hpY2hcbi8vIGV4dGVuZHMgdGhlIGN1cnJlbnQgY29udGV4dCB0byBhZGQgYSBwc2V1ZG8tc2VsZWN0b3Igb3IgYSBjaGlsZFxuLy8gc2VsZWN0b3IuIFN1Y2ggYSBwcm9wZXJ0eSBzaG91bGQgY29udGFpbiBhIGAmYCBjaGFyYWN0ZXIsIHdoaWNoXG4vLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IHNlbGVjdG9yLiBGb3IgZXhhbXBsZSBge1wiJjpiZWZvcmVcIjpcbi8vIHtjb250ZW50OiAnXCJoaVwiJ319YC4gU3ViLXNlbGVjdG9ycyBhbmQgcmVndWxhciBwcm9wZXJ0aWVzIGNhblxuLy8gZnJlZWx5IGJlIG1peGVkIGluIGEgZ2l2ZW4gb2JqZWN0LiBBbnkgcHJvcGVydHkgY29udGFpbmluZyBhIGAmYCBpc1xuLy8gYXNzdW1lZCB0byBiZSBhIHN1Yi1zZWxlY3Rvci5cbi8vXG4vLyBGaW5hbGx5LCBhIHByb3BlcnR5IGNhbiBzcGVjaWZ5IGFuIEAtYmxvY2sgdG8gYmUgd3JhcHBlZCBhcm91bmQgdGhlXG4vLyBzdHlsZXMgZGVmaW5lZCBpbnNpZGUgdGhlIG9iamVjdCB0aGF0J3MgdGhlIHByb3BlcnR5J3MgdmFsdWUuIEZvclxuLy8gZXhhbXBsZSB0byBjcmVhdGUgYSBtZWRpYSBxdWVyeSB5b3UgY2FuIGRvIGB7XCJAbWVkaWEgc2NyZWVuIGFuZFxuLy8gKG1pbi13aWR0aDogNDAwcHgpXCI6IHsuLi59fWAuXG4iLCAiZXhwb3J0IHZhciBiYXNlID0ge1xuICA4OiBcIkJhY2tzcGFjZVwiLFxuICA5OiBcIlRhYlwiLFxuICAxMDogXCJFbnRlclwiLFxuICAxMjogXCJOdW1Mb2NrXCIsXG4gIDEzOiBcIkVudGVyXCIsXG4gIDE2OiBcIlNoaWZ0XCIsXG4gIDE3OiBcIkNvbnRyb2xcIixcbiAgMTg6IFwiQWx0XCIsXG4gIDIwOiBcIkNhcHNMb2NrXCIsXG4gIDI3OiBcIkVzY2FwZVwiLFxuICAzMjogXCIgXCIsXG4gIDMzOiBcIlBhZ2VVcFwiLFxuICAzNDogXCJQYWdlRG93blwiLFxuICAzNTogXCJFbmRcIixcbiAgMzY6IFwiSG9tZVwiLFxuICAzNzogXCJBcnJvd0xlZnRcIixcbiAgMzg6IFwiQXJyb3dVcFwiLFxuICAzOTogXCJBcnJvd1JpZ2h0XCIsXG4gIDQwOiBcIkFycm93RG93blwiLFxuICA0NDogXCJQcmludFNjcmVlblwiLFxuICA0NTogXCJJbnNlcnRcIixcbiAgNDY6IFwiRGVsZXRlXCIsXG4gIDU5OiBcIjtcIixcbiAgNjE6IFwiPVwiLFxuICA5MTogXCJNZXRhXCIsXG4gIDkyOiBcIk1ldGFcIixcbiAgMTA2OiBcIipcIixcbiAgMTA3OiBcIitcIixcbiAgMTA4OiBcIixcIixcbiAgMTA5OiBcIi1cIixcbiAgMTEwOiBcIi5cIixcbiAgMTExOiBcIi9cIixcbiAgMTQ0OiBcIk51bUxvY2tcIixcbiAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgMTYwOiBcIlNoaWZ0XCIsXG4gIDE2MTogXCJTaGlmdFwiLFxuICAxNjI6IFwiQ29udHJvbFwiLFxuICAxNjM6IFwiQ29udHJvbFwiLFxuICAxNjQ6IFwiQWx0XCIsXG4gIDE2NTogXCJBbHRcIixcbiAgMTczOiBcIi1cIixcbiAgMTg2OiBcIjtcIixcbiAgMTg3OiBcIj1cIixcbiAgMTg4OiBcIixcIixcbiAgMTg5OiBcIi1cIixcbiAgMTkwOiBcIi5cIixcbiAgMTkxOiBcIi9cIixcbiAgMTkyOiBcImBcIixcbiAgMjE5OiBcIltcIixcbiAgMjIwOiBcIlxcXFxcIixcbiAgMjIxOiBcIl1cIixcbiAgMjIyOiBcIidcIlxufVxuXG5leHBvcnQgdmFyIHNoaWZ0ID0ge1xuICA0ODogXCIpXCIsXG4gIDQ5OiBcIiFcIixcbiAgNTA6IFwiQFwiLFxuICA1MTogXCIjXCIsXG4gIDUyOiBcIiRcIixcbiAgNTM6IFwiJVwiLFxuICA1NDogXCJeXCIsXG4gIDU1OiBcIiZcIixcbiAgNTY6IFwiKlwiLFxuICA1NzogXCIoXCIsXG4gIDU5OiBcIjpcIixcbiAgNjE6IFwiK1wiLFxuICAxNzM6IFwiX1wiLFxuICAxODY6IFwiOlwiLFxuICAxODc6IFwiK1wiLFxuICAxODg6IFwiPFwiLFxuICAxODk6IFwiX1wiLFxuICAxOTA6IFwiPlwiLFxuICAxOTE6IFwiP1wiLFxuICAxOTI6IFwiflwiLFxuICAyMTk6IFwie1wiLFxuICAyMjA6IFwifFwiLFxuICAyMjE6IFwifVwiLFxuICAyMjI6IFwiXFxcIlwiXG59XG5cbnZhciBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG52YXIgaWUgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgXFxkfFRyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbi8vIEZpbGwgaW4gdGhlIGRpZ2l0IGtleXNcbmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgYmFzZVs0OCArIGldID0gYmFzZVs5NiArIGldID0gU3RyaW5nKGkpXG5cbi8vIFRoZSBmdW5jdGlvbiBrZXlzXG5mb3IgKHZhciBpID0gMTsgaSA8PSAyNDsgaSsrKSBiYXNlW2kgKyAxMTFdID0gXCJGXCIgKyBpXG5cbi8vIEFuZCB0aGUgYWxwaGFiZXRpYyBrZXlzXG5mb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykge1xuICBiYXNlW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpICsgMzIpXG4gIHNoaWZ0W2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxufVxuXG4vLyBGb3IgZWFjaCBjb2RlIHRoYXQgZG9lc24ndCBoYXZlIGEgc2hpZnQtZXF1aXZhbGVudCwgY29weSB0aGUgYmFzZSBuYW1lXG5mb3IgKHZhciBjb2RlIGluIGJhc2UpIGlmICghc2hpZnQuaGFzT3duUHJvcGVydHkoY29kZSkpIHNoaWZ0W2NvZGVdID0gYmFzZVtjb2RlXVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5TmFtZShldmVudCkge1xuICAvLyBPbiBtYWNPUywga2V5cyBoZWxkIHdpdGggU2hpZnQgYW5kIENtZCBkb24ndCByZWZsZWN0IHRoZSBlZmZlY3Qgb2YgU2hpZnQgaW4gYC5rZXlgLlxuICAvLyBPbiBJRSwgc2hpZnQgZWZmZWN0IGlzIG5ldmVyIGluY2x1ZGVkIGluIGAua2V5YC5cbiAgdmFyIGlnbm9yZUtleSA9IG1hYyAmJiBldmVudC5tZXRhS2V5ICYmIGV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgfHxcbiAgICAgIGllICYmIGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSAmJiBldmVudC5rZXkubGVuZ3RoID09IDEgfHxcbiAgICAgIGV2ZW50LmtleSA9PSBcIlVuaWRlbnRpZmllZFwiXG4gIHZhciBuYW1lID0gKCFpZ25vcmVLZXkgJiYgZXZlbnQua2V5KSB8fFxuICAgIChldmVudC5zaGlmdEtleSA/IHNoaWZ0IDogYmFzZSlbZXZlbnQua2V5Q29kZV0gfHxcbiAgICBldmVudC5rZXkgfHwgXCJVbmlkZW50aWZpZWRcIlxuICAvLyBFZGdlIHNvbWV0aW1lcyBwcm9kdWNlcyB3cm9uZyBuYW1lcyAoSXNzdWUgIzMpXG4gIGlmIChuYW1lID09IFwiRXNjXCIpIG5hbWUgPSBcIkVzY2FwZVwiXG4gIGlmIChuYW1lID09IFwiRGVsXCIpIG5hbWUgPSBcIkRlbGV0ZVwiXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzg4NjA1NzEvXG4gIGlmIChuYW1lID09IFwiTGVmdFwiKSBuYW1lID0gXCJBcnJvd0xlZnRcIlxuICBpZiAobmFtZSA9PSBcIlVwXCIpIG5hbWUgPSBcIkFycm93VXBcIlxuICBpZiAobmFtZSA9PSBcIlJpZ2h0XCIpIG5hbWUgPSBcIkFycm93UmlnaHRcIlxuICBpZiAobmFtZSA9PSBcIkRvd25cIikgbmFtZSA9IFwiQXJyb3dEb3duXCJcbiAgcmV0dXJuIG5hbWVcbn1cbiIsICJpbXBvcnQgeyBUZXh0LCBSYW5nZVNldCwgTWFwTW9kZSwgUmFuZ2VWYWx1ZSwgZmluZENsdXN0ZXJCcmVhaywgRWRpdG9yU2VsZWN0aW9uLCBGYWNldCwgU3RhdGVFZmZlY3QsIENoYW5nZVNldCwgZmluZENvbHVtbiwgQ2hhckNhdGVnb3J5LCBFZGl0b3JTdGF0ZSwgQW5ub3RhdGlvbiwgVHJhbnNhY3Rpb24sIFByZWMsIGNvZGVQb2ludEF0LCBjb2RlUG9pbnRTaXplLCBjb21iaW5lQ29uZmlnLCBTdGF0ZUZpZWxkLCBSYW5nZVNldEJ1aWxkZXIsIGNvdW50Q29sdW1uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgU3R5bGVNb2R1bGUgfSBmcm9tICdzdHlsZS1tb2QnO1xuaW1wb3J0IHsga2V5TmFtZSwgYmFzZSwgc2hpZnQgfSBmcm9tICd3M2Mta2V5bmFtZSc7XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihyb290KSB7XG4gICAgbGV0IHRhcmdldDtcbiAgICAvLyBCcm93c2VycyBkaWZmZXIgb24gd2hldGhlciBzaGFkb3cgcm9vdHMgaGF2ZSBhIGdldFNlbGVjdGlvblxuICAgIC8vIG1ldGhvZC4gSWYgaXQgZXhpc3RzLCB1c2UgdGhhdCwgb3RoZXJ3aXNlLCBjYWxsIGl0IG9uIHRoZVxuICAgIC8vIGRvY3VtZW50LlxuICAgIGlmIChyb290Lm5vZGVUeXBlID09IDExKSB7IC8vIFNoYWRvdyByb290XG4gICAgICAgIHRhcmdldCA9IHJvb3QuZ2V0U2VsZWN0aW9uID8gcm9vdCA6IHJvb3Qub3duZXJEb2N1bWVudDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IHJvb3Q7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQuZ2V0U2VsZWN0aW9uKCk7XG59XG5mdW5jdGlvbiBjb250YWlucyhkb20sIG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSA/IGRvbSA9PSBub2RlIHx8IGRvbS5jb250YWlucyhub2RlLm5vZGVUeXBlICE9IDEgPyBub2RlLnBhcmVudE5vZGUgOiBub2RlKSA6IGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uKGRvbSwgc2VsZWN0aW9uKSB7XG4gICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZpcmVmb3ggd2lsbCByYWlzZSAncGVybWlzc2lvbiBkZW5pZWQnIGVycm9ycyB3aGVuIGFjY2Vzc2luZ1xuICAgICAgICAvLyBwcm9wZXJ0aWVzIG9mIGBzZWwuYW5jaG9yTm9kZWAgd2hlbiBpdCdzIGluIGEgZ2VuZXJhdGVkIENTU1xuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICByZXR1cm4gY29udGFpbnMoZG9tLCBzZWxlY3Rpb24uYW5jaG9yTm9kZSk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGllbnRSZWN0c0Zvcihkb20pIHtcbiAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgIHJldHVybiB0ZXh0UmFuZ2UoZG9tLCAwLCBkb20ubm9kZVZhbHVlLmxlbmd0aCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgcmV0dXJuIGRvbS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIFtdO1xufVxuLy8gU2NhbnMgZm9yd2FyZCBhbmQgYmFja3dhcmQgdGhyb3VnaCBET00gcG9zaXRpb25zIGVxdWl2YWxlbnQgdG8gdGhlXG4vLyBnaXZlbiBvbmUgdG8gc2VlIGlmIHRoZSB0d28gYXJlIGluIHRoZSBzYW1lIHBsYWNlIChpLmUuIGFmdGVyIGFcbi8vIHRleHQgbm9kZSB2cyBhdCB0aGUgZW5kIG9mIHRoYXQgdGV4dCBub2RlKVxuZnVuY3Rpb24gaXNFcXVpdmFsZW50UG9zaXRpb24obm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYpIHtcbiAgICByZXR1cm4gdGFyZ2V0Tm9kZSA/IChzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAtMSkgfHxcbiAgICAgICAgc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgMSkpIDogZmFsc2U7XG59XG5mdW5jdGlvbiBkb21JbmRleChub2RlKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOzsgaW5kZXgrKykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0Jsb2NrRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMSAmJiAvXihESVZ8UHxMSXxVTHxPTHxCTE9DS1FVT1RFfEREfERUfEhcXGR8U0VDVElPTnxQUkUpJC8udGVzdChub2RlLm5vZGVOYW1lKTtcbn1cbmZ1bmN0aW9uIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIGRpcikge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGFyZ2V0Tm9kZSAmJiBvZmYgPT0gdGFyZ2V0T2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvZmYgPT0gKGRpciA8IDAgPyAwIDogbWF4T2Zmc2V0KG5vZGUpKSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJESVZcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50Lm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZG9tSW5kZXgobm9kZSkgKyAoZGlyIDwgMCA/IDAgOiAxKTtcbiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZiArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBvZmYgPSBkaXIgPCAwID8gbWF4T2Zmc2V0KG5vZGUpIDogMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG1heE9mZnNldChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBmbGF0dGVuUmVjdChyZWN0LCBsZWZ0KSB7XG4gICAgbGV0IHggPSBsZWZ0ID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodDtcbiAgICByZXR1cm4geyBsZWZ0OiB4LCByaWdodDogeCwgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LmJvdHRvbSB9O1xufVxuZnVuY3Rpb24gd2luZG93UmVjdCh3aW4pIHtcbiAgICBsZXQgdnAgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gICAgaWYgKHZwKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogMCwgcmlnaHQ6IHZwLndpZHRoLFxuICAgICAgICAgICAgdG9wOiAwLCBib3R0b206IHZwLmhlaWdodFxuICAgICAgICB9O1xuICAgIHJldHVybiB7IGxlZnQ6IDAsIHJpZ2h0OiB3aW4uaW5uZXJXaWR0aCxcbiAgICAgICAgdG9wOiAwLCBib3R0b206IHdpbi5pbm5lckhlaWdodCB9O1xufVxuZnVuY3Rpb24gZ2V0U2NhbGUoZWx0LCByZWN0KSB7XG4gICAgbGV0IHNjYWxlWCA9IHJlY3Qud2lkdGggLyBlbHQub2Zmc2V0V2lkdGg7XG4gICAgbGV0IHNjYWxlWSA9IHJlY3QuaGVpZ2h0IC8gZWx0Lm9mZnNldEhlaWdodDtcbiAgICBpZiAoc2NhbGVYID4gMC45OTUgJiYgc2NhbGVYIDwgMS4wMDUgfHwgIWlzRmluaXRlKHNjYWxlWCkgfHwgTWF0aC5hYnMocmVjdC53aWR0aCAtIGVsdC5vZmZzZXRXaWR0aCkgPCAxKVxuICAgICAgICBzY2FsZVggPSAxO1xuICAgIGlmIChzY2FsZVkgPiAwLjk5NSAmJiBzY2FsZVkgPCAxLjAwNSB8fCAhaXNGaW5pdGUoc2NhbGVZKSB8fCBNYXRoLmFicyhyZWN0LmhlaWdodCAtIGVsdC5vZmZzZXRIZWlnaHQpIDwgMSlcbiAgICAgICAgc2NhbGVZID0gMTtcbiAgICByZXR1cm4geyBzY2FsZVgsIHNjYWxlWSB9O1xufVxuZnVuY3Rpb24gc2Nyb2xsUmVjdEludG9WaWV3KGRvbSwgcmVjdCwgc2lkZSwgeCwgeSwgeE1hcmdpbiwgeU1hcmdpbiwgbHRyKSB7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIGZvciAobGV0IGN1ciA9IGRvbSwgc3RvcCA9IGZhbHNlOyBjdXIgJiYgIXN0b3A7KSB7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT0gMSkgeyAvLyBFbGVtZW50XG4gICAgICAgICAgICBsZXQgYm91bmRpbmcsIHRvcCA9IGN1ciA9PSBkb2MuYm9keTtcbiAgICAgICAgICAgIGxldCBzY2FsZVggPSAxLCBzY2FsZVkgPSAxO1xuICAgICAgICAgICAgaWYgKHRvcCkge1xuICAgICAgICAgICAgICAgIGJvdW5kaW5nID0gd2luZG93UmVjdCh3aW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKC9eKGZpeGVkfHN0aWNreSkkLy50ZXN0KGdldENvbXB1dGVkU3R5bGUoY3VyKS5wb3NpdGlvbikpXG4gICAgICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjdXIuc2Nyb2xsSGVpZ2h0IDw9IGN1ci5jbGllbnRIZWlnaHQgJiYgY3VyLnNjcm9sbFdpZHRoIDw9IGN1ci5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSBjdXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgKHsgc2NhbGVYLCBzY2FsZVkgfSA9IGdldFNjYWxlKGN1ciwgcmVjdCkpO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzY3JvbGxiYXIgd2lkdGggaXNuJ3QgaW5jbHVkZWQgaW4gdGhlIHJlY3RhbmdsZVxuICAgICAgICAgICAgICAgIGJvdW5kaW5nID0geyBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgKyBjdXIuY2xpZW50V2lkdGggKiBzY2FsZVgsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC50b3AgKyBjdXIuY2xpZW50SGVpZ2h0ICogc2NhbGVZIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbW92ZVggPSAwLCBtb3ZlWSA9IDA7XG4gICAgICAgICAgICBpZiAoeSA9PSBcIm5lYXJlc3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChyZWN0LnRvcCA8IGJvdW5kaW5nLnRvcCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IHJlY3QudG9wIC0gKGJvdW5kaW5nLnRvcCArIHlNYXJnaW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA+IDAgJiYgcmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20gKyBtb3ZlWSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSBib3VuZGluZy5ib3R0b20gKyB5TWFyZ2luO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IGJvdW5kaW5nLmJvdHRvbSkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IHJlY3QuYm90dG9tIC0gYm91bmRpbmcuYm90dG9tICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGUgPCAwICYmIChyZWN0LnRvcCAtIG1vdmVZKSA8IGJvdW5kaW5nLnRvcClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVZID0gcmVjdC50b3AgLSAoYm91bmRpbmcudG9wICsgeU1hcmdpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlY3RIZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wLCBib3VuZGluZ0hlaWdodCA9IGJvdW5kaW5nLmJvdHRvbSAtIGJvdW5kaW5nLnRvcDtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0VG9wID0geSA9PSBcImNlbnRlclwiICYmIHJlY3RIZWlnaHQgPD0gYm91bmRpbmdIZWlnaHQgPyByZWN0LnRvcCArIHJlY3RIZWlnaHQgLyAyIC0gYm91bmRpbmdIZWlnaHQgLyAyIDpcbiAgICAgICAgICAgICAgICAgICAgeSA9PSBcInN0YXJ0XCIgfHwgeSA9PSBcImNlbnRlclwiICYmIHNpZGUgPCAwID8gcmVjdC50b3AgLSB5TWFyZ2luIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tIC0gYm91bmRpbmdIZWlnaHQgKyB5TWFyZ2luO1xuICAgICAgICAgICAgICAgIG1vdmVZID0gdGFyZ2V0VG9wIC0gYm91bmRpbmcudG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHggPT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QubGVmdCAtIChib3VuZGluZy5sZWZ0ICsgeE1hcmdpbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlID4gMCAmJiByZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQgKyBtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgeE1hcmdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjdC5yaWdodCA+IGJvdW5kaW5nLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgeE1hcmdpbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGUgPCAwICYmIHJlY3QubGVmdCA8IGJvdW5kaW5nLmxlZnQgKyBtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVYID0gcmVjdC5sZWZ0IC0gKGJvdW5kaW5nLmxlZnQgKyB4TWFyZ2luKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0TGVmdCA9IHggPT0gXCJjZW50ZXJcIiA/IHJlY3QubGVmdCArIChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDIgLSAoYm91bmRpbmcucmlnaHQgLSBib3VuZGluZy5sZWZ0KSAvIDIgOlxuICAgICAgICAgICAgICAgICAgICAoeCA9PSBcInN0YXJ0XCIpID09IGx0ciA/IHJlY3QubGVmdCAtIHhNYXJnaW4gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCAtIChib3VuZGluZy5yaWdodCAtIGJvdW5kaW5nLmxlZnQpICsgeE1hcmdpbjtcbiAgICAgICAgICAgICAgICBtb3ZlWCA9IHRhcmdldExlZnQgLSBib3VuZGluZy5sZWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vdmVYIHx8IG1vdmVZKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvcCkge1xuICAgICAgICAgICAgICAgICAgICB3aW4uc2Nyb2xsQnkobW92ZVgsIG1vdmVZKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb3ZlZFggPSAwLCBtb3ZlZFkgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IGN1ci5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXIuc2Nyb2xsVG9wICs9IG1vdmVZIC8gc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWRZID0gKGN1ci5zY3JvbGxUb3AgLSBzdGFydCkgKiBzY2FsZVk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVYKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBjdXIuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5zY3JvbGxMZWZ0ICs9IG1vdmVYIC8gc2NhbGVYO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWRYID0gKGN1ci5zY3JvbGxMZWZ0IC0gc3RhcnQpICogc2NhbGVYO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlY3QgPSB7IGxlZnQ6IHJlY3QubGVmdCAtIG1vdmVkWCwgdG9wOiByZWN0LnRvcCAtIG1vdmVkWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0IC0gbW92ZWRYLCBib3R0b206IHJlY3QuYm90dG9tIC0gbW92ZWRZIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZFggJiYgTWF0aC5hYnMobW92ZWRYIC0gbW92ZVgpIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBcIm5lYXJlc3RcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkWSAmJiBNYXRoLmFicyhtb3ZlZFkgLSBtb3ZlWSkgPCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFwibmVhcmVzdFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b3ApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3AgfHwgcmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20gfHxcbiAgICAgICAgICAgICAgICByZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0IHx8IHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodClcbiAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiBNYXRoLm1heChyZWN0LmxlZnQsIGJvdW5kaW5nLmxlZnQpLCByaWdodDogTWF0aC5taW4ocmVjdC5yaWdodCwgYm91bmRpbmcucmlnaHQpLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IE1hdGgubWF4KHJlY3QudG9wLCBib3VuZGluZy50b3ApLCBib3R0b206IE1hdGgubWluKHJlY3QuYm90dG9tLCBib3VuZGluZy5ib3R0b20pIH07XG4gICAgICAgICAgICBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxMSkgeyAvLyBBIHNoYWRvdyByb290XG4gICAgICAgICAgICBjdXIgPSBjdXIuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2Nyb2xsYWJsZVBhcmVudHMoZG9tKSB7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50LCB4LCB5O1xuICAgIGZvciAobGV0IGN1ciA9IGRvbS5wYXJlbnROb2RlOyBjdXI7KSB7XG4gICAgICAgIGlmIChjdXIgPT0gZG9jLmJvZHkgfHwgKHggJiYgeSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAoIXkgJiYgY3VyLnNjcm9sbEhlaWdodCA+IGN1ci5jbGllbnRIZWlnaHQpXG4gICAgICAgICAgICAgICAgeSA9IGN1cjtcbiAgICAgICAgICAgIGlmICgheCAmJiBjdXIuc2Nyb2xsV2lkdGggPiBjdXIuY2xpZW50V2lkdGgpXG4gICAgICAgICAgICAgICAgeCA9IGN1cjtcbiAgICAgICAgICAgIGN1ciA9IGN1ci5hc3NpZ25lZFNsb3QgfHwgY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VyLm5vZGVUeXBlID09IDExKSB7XG4gICAgICAgICAgICBjdXIgPSBjdXIuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHgsIHkgfTtcbn1cbmNsYXNzIERPTVNlbGVjdGlvblN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSAwO1xuICAgIH1cbiAgICBlcShkb21TZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yTm9kZSA9PSBkb21TZWwuYW5jaG9yTm9kZSAmJiB0aGlzLmFuY2hvck9mZnNldCA9PSBkb21TZWwuYW5jaG9yT2Zmc2V0ICYmXG4gICAgICAgICAgICB0aGlzLmZvY3VzTm9kZSA9PSBkb21TZWwuZm9jdXNOb2RlICYmIHRoaXMuZm9jdXNPZmZzZXQgPT0gZG9tU2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgICBzZXRSYW5nZShyYW5nZSkge1xuICAgICAgICBsZXQgeyBhbmNob3JOb2RlLCBmb2N1c05vZGUgfSA9IHJhbmdlO1xuICAgICAgICAvLyBDbGlwIG9mZnNldHMgdG8gbm9kZSBzaXplIHRvIGF2b2lkIGNyYXNoZXMgd2hlbiBTYWZhcmkgcmVwb3J0cyBib2d1cyBvZmZzZXRzICgjMTE1MilcbiAgICAgICAgdGhpcy5zZXQoYW5jaG9yTm9kZSwgTWF0aC5taW4ocmFuZ2UuYW5jaG9yT2Zmc2V0LCBhbmNob3JOb2RlID8gbWF4T2Zmc2V0KGFuY2hvck5vZGUpIDogMCksIGZvY3VzTm9kZSwgTWF0aC5taW4ocmFuZ2UuZm9jdXNPZmZzZXQsIGZvY3VzTm9kZSA/IG1heE9mZnNldChmb2N1c05vZGUpIDogMCkpO1xuICAgIH1cbiAgICBzZXQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IGFuY2hvck5vZGU7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gYW5jaG9yT2Zmc2V0O1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IGZvY3VzTm9kZTtcbiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IGZvY3VzT2Zmc2V0O1xuICAgIH1cbn1cbmxldCBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gbnVsbDtcbi8vIEZlYXR1cmUtZGV0ZWN0cyBzdXBwb3J0IGZvciAuZm9jdXMoe3ByZXZlbnRTY3JvbGw6IHRydWV9KSwgYW5kIHVzZXNcbi8vIGEgZmFsbGJhY2sga2x1ZGdlIHdoZW4gbm90IHN1cHBvcnRlZC5cbmZ1bmN0aW9uIGZvY3VzUHJldmVudFNjcm9sbChkb20pIHtcbiAgICBpZiAoZG9tLnNldEFjdGl2ZSlcbiAgICAgICAgcmV0dXJuIGRvbS5zZXRBY3RpdmUoKTsgLy8gaW4gSUVcbiAgICBpZiAocHJldmVudFNjcm9sbFN1cHBvcnRlZClcbiAgICAgICAgcmV0dXJuIGRvbS5mb2N1cyhwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKTtcbiAgICBsZXQgc3RhY2sgPSBbXTtcbiAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChjdXIsIGN1ci5zY3JvbGxUb3AsIGN1ci5zY3JvbGxMZWZ0KTtcbiAgICAgICAgaWYgKGN1ciA9PSBjdXIub3duZXJEb2N1bWVudClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCA9PSBudWxsID8ge1xuICAgICAgICBnZXQgcHJldmVudFNjcm9sbCgpIHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSB7IHByZXZlbnRTY3JvbGw6IHRydWUgfTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKSB7XG4gICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgZWx0ID0gc3RhY2tbaSsrXSwgdG9wID0gc3RhY2tbaSsrXSwgbGVmdCA9IHN0YWNrW2krK107XG4gICAgICAgICAgICBpZiAoZWx0LnNjcm9sbFRvcCAhPSB0b3ApXG4gICAgICAgICAgICAgICAgZWx0LnNjcm9sbFRvcCA9IHRvcDtcbiAgICAgICAgICAgIGlmIChlbHQuc2Nyb2xsTGVmdCAhPSBsZWZ0KVxuICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBzY3JhdGNoUmFuZ2U7XG5mdW5jdGlvbiB0ZXh0UmFuZ2Uobm9kZSwgZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgbGV0IHJhbmdlID0gc2NyYXRjaFJhbmdlIHx8IChzY3JhdGNoUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpKTtcbiAgICByYW5nZS5zZXRFbmQobm9kZSwgdG8pO1xuICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGZyb20pO1xuICAgIHJldHVybiByYW5nZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoS2V5KGVsdCwgbmFtZSwgY29kZSwgbW9kcykge1xuICAgIGxldCBvcHRpb25zID0geyBrZXk6IG5hbWUsIGNvZGU6IG5hbWUsIGtleUNvZGU6IGNvZGUsIHdoaWNoOiBjb2RlLCBjYW5jZWxhYmxlOiB0cnVlIH07XG4gICAgaWYgKG1vZHMpXG4gICAgICAgICh7IGFsdEtleTogb3B0aW9ucy5hbHRLZXksIGN0cmxLZXk6IG9wdGlvbnMuY3RybEtleSwgc2hpZnRLZXk6IG9wdGlvbnMuc2hpZnRLZXksIG1ldGFLZXk6IG9wdGlvbnMubWV0YUtleSB9ID0gbW9kcyk7XG4gICAgbGV0IGRvd24gPSBuZXcgS2V5Ym9hcmRFdmVudChcImtleWRvd25cIiwgb3B0aW9ucyk7XG4gICAgZG93bi5zeW50aGV0aWMgPSB0cnVlO1xuICAgIGVsdC5kaXNwYXRjaEV2ZW50KGRvd24pO1xuICAgIGxldCB1cCA9IG5ldyBLZXlib2FyZEV2ZW50KFwia2V5dXBcIiwgb3B0aW9ucyk7XG4gICAgdXAuc3ludGhldGljID0gdHJ1ZTtcbiAgICBlbHQuZGlzcGF0Y2hFdmVudCh1cCk7XG4gICAgcmV0dXJuIGRvd24uZGVmYXVsdFByZXZlbnRlZCB8fCB1cC5kZWZhdWx0UHJldmVudGVkO1xufVxuZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT0gOSB8fCBub2RlLm5vZGVUeXBlID09IDExICYmIG5vZGUuaG9zdCkpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuYXNzaWduZWRTbG90IHx8IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjbGVhckF0dHJpYnV0ZXMobm9kZSkge1xuICAgIHdoaWxlIChub2RlLmF0dHJpYnV0ZXMubGVuZ3RoKVxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZU5vZGUobm9kZS5hdHRyaWJ1dGVzWzBdKTtcbn1cbmZ1bmN0aW9uIGF0RWxlbWVudFN0YXJ0KGRvYywgc2VsZWN0aW9uKSB7XG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLCBvZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7XG4gICAgaWYgKCFub2RlIHx8IHNlbGVjdGlvbi5hbmNob3JOb2RlICE9IG5vZGUgfHwgc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBvZmZzZXQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBTYWZhcmkgY2FuIHJlcG9ydCBib2d1cyBvZmZzZXRzICgjMTE1MilcbiAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG1heE9mZnNldChub2RlKSk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgaWYgKHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICBvZmZzZXQtLTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBwcmV2O1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IG1heE9mZnNldChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlID09IGRvYykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBpc1Njcm9sbGVkVG9Cb3R0b20oZWx0KSB7XG4gICAgcmV0dXJuIGVsdC5zY3JvbGxUb3AgPiBNYXRoLm1heCgxLCBlbHQuc2Nyb2xsSGVpZ2h0IC0gZWx0LmNsaWVudEhlaWdodCAtIDQpO1xufVxuZnVuY3Rpb24gdGV4dE5vZGVCZWZvcmUoc3RhcnROb2RlLCBzdGFydE9mZnNldCkge1xuICAgIGZvciAobGV0IG5vZGUgPSBzdGFydE5vZGUsIG9mZnNldCA9IHN0YXJ0T2Zmc2V0OzspIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIG9mZnNldCA9IG1heE9mZnNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgJiYgIWlzQmxvY2tFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHRleHROb2RlQWZ0ZXIoc3RhcnROb2RlLCBzdGFydE9mZnNldCkge1xuICAgIGZvciAobGV0IG5vZGUgPSBzdGFydE5vZGUsIG9mZnNldCA9IHN0YXJ0T2Zmc2V0OzspIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IG5vZGUsIG9mZnNldDogb2Zmc2V0IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAmJiAhaXNCbG9ja0VsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpICsgMTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgRE9NUG9zIHtcbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBvZmZzZXQsIHByZWNpc2UgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLnByZWNpc2UgPSBwcmVjaXNlO1xuICAgIH1cbiAgICBzdGF0aWMgYmVmb3JlKGRvbSwgcHJlY2lzZSkgeyByZXR1cm4gbmV3IERPTVBvcyhkb20ucGFyZW50Tm9kZSwgZG9tSW5kZXgoZG9tKSwgcHJlY2lzZSk7IH1cbiAgICBzdGF0aWMgYWZ0ZXIoZG9tLCBwcmVjaXNlKSB7IHJldHVybiBuZXcgRE9NUG9zKGRvbS5wYXJlbnROb2RlLCBkb21JbmRleChkb20pICsgMSwgcHJlY2lzZSk7IH1cbn1cbmNvbnN0IG5vQ2hpbGRyZW4gPSBbXTtcbmNsYXNzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlRE9NVGV4dCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBnZXQgcG9zQXRTdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucG9zQmVmb3JlKHRoaXMpIDogMDtcbiAgICB9XG4gICAgZ2V0IHBvc0F0RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIHBvc0JlZm9yZSh2aWV3KSB7XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZCA9PSB2aWV3KVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICBwb3MgKz0gY2hpbGQubGVuZ3RoICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgY2hpbGQgaW4gcG9zQmVmb3JlXCIpO1xuICAgIH1cbiAgICBwb3NBZnRlcih2aWV3KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0JlZm9yZSh2aWV3KSArIHZpZXcubGVuZ3RoO1xuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdzICYgMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi8pIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmRvbTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbnVsbCwgbmV4dDtcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuZG9tICYmIChuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50VmlldyA9IENvbnRlbnRWaWV3LmdldChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudFZpZXcgfHwgIWNvbnRlbnRWaWV3LnBhcmVudCAmJiBjb250ZW50Vmlldy5jYW5SZXVzZURPTShjaGlsZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmV1c2VET00obmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2sgJiYgIXRyYWNrLndyaXR0ZW4gJiYgdHJhY2subm9kZSA9PSBwYXJlbnQgJiYgbmV4dCAhPSBjaGlsZC5kb20pXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrLndyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgJiYgbmV4dCAhPSBjaGlsZC5kb20pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcm0kMShuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQuZG9tLCBuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldiA9IGNoaWxkLmRvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgPSBwcmV2ID8gcHJldi5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKG5leHQgJiYgdHJhY2sgJiYgdHJhY2subm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICAgICAgdHJhY2sud3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICB3aGlsZSAobmV4dClcbiAgICAgICAgICAgICAgICBuZXh0ID0gcm0kMShuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXVzZURPTShfZG9tKSB7IH1cbiAgICBsb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBhZnRlcjtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgIGFmdGVyID0gdGhpcy5kb20uY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJpYXMgPSBtYXhPZmZzZXQobm9kZSkgPT0gMCA/IDAgOiBvZmZzZXQgPT0gMCA/IC0xIDogMTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChiaWFzID09IDAgJiYgcGFyZW50LmZpcnN0Q2hpbGQgIT0gcGFyZW50Lmxhc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYmlhcyA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmlhcyA8IDApXG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBub2RlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFmdGVyID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWZ0ZXIgPT0gdGhpcy5kb20uZmlyc3RDaGlsZClcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB3aGlsZSAoYWZ0ZXIgJiYgIUNvbnRlbnRWaWV3LmdldChhZnRlcikpXG4gICAgICAgICAgICBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICBpZiAoIWFmdGVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5kb20gPT0gYWZ0ZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZC5sZW5ndGggKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZChmcm9tLCB0bywgb2Zmc2V0ID0gMCkge1xuICAgICAgICBsZXQgZnJvbUkgPSAtMSwgZnJvbVN0YXJ0ID0gLTEsIHRvSSA9IC0xLCB0b0VuZCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gb2Zmc2V0LCBwcmV2RW5kID0gb2Zmc2V0OyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20gJiYgZW5kID4gdG8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmRvbUJvdW5kc0Fyb3VuZChmcm9tLCB0bywgcG9zKTtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gZnJvbSAmJiBmcm9tSSA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGZyb21JID0gaTtcbiAgICAgICAgICAgICAgICBmcm9tU3RhcnQgPSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID4gdG8gJiYgY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0b0kgPSBpO1xuICAgICAgICAgICAgICAgIHRvRW5kID0gcHJldkVuZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZFbmQgPSBlbmQ7XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZyb206IGZyb21TdGFydCwgdG86IHRvRW5kIDwgMCA/IG9mZnNldCArIHRoaXMubGVuZ3RoIDogdG9FbmQsXG4gICAgICAgICAgICBzdGFydERPTTogKGZyb21JID8gdGhpcy5jaGlsZHJlbltmcm9tSSAtIDFdLmRvbS5uZXh0U2libGluZyA6IG51bGwpIHx8IHRoaXMuZG9tLmZpcnN0Q2hpbGQsXG4gICAgICAgICAgICBlbmRET006IHRvSSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHRvSSA+PSAwID8gdGhpcy5jaGlsZHJlblt0b0ldLmRvbSA6IG51bGwgfTtcbiAgICB9XG4gICAgbWFya0RpcnR5KGFuZFBhcmVudCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgfD0gMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgICAgIHRoaXMubWFya1BhcmVudHNEaXJ0eShhbmRQYXJlbnQpO1xuICAgIH1cbiAgICBtYXJrUGFyZW50c0RpcnR5KGNoaWxkTGlzdCkge1xuICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudDsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRMaXN0KVxuICAgICAgICAgICAgICAgIHBhcmVudC5mbGFncyB8PSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgICAgIGlmIChwYXJlbnQuZmxhZ3MgJiAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcGFyZW50LmZsYWdzIHw9IDEgLyogVmlld0ZsYWcuQ2hpbGREaXJ0eSAqLztcbiAgICAgICAgICAgIGNoaWxkTGlzdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICE9IHBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICBpZiAodGhpcy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrUGFyZW50c0RpcnR5KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldERPTShkb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZG9tID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy5kb20uY21WaWV3ID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBkb207XG4gICAgICAgIGRvbS5jbVZpZXcgPSB0aGlzO1xuICAgIH1cbiAgICBnZXQgcm9vdFZpZXcoKSB7XG4gICAgICAgIGZvciAobGV0IHYgPSB0aGlzOzspIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB2LnBhcmVudDtcbiAgICAgICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgdiA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlQ2hpbGRyZW4oZnJvbSwgdG8sIGNoaWxkcmVuID0gbm9DaGlsZHJlbikge1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ID09IHRoaXMgJiYgY2hpbGRyZW4uaW5kZXhPZihjaGlsZCkgPCAwKVxuICAgICAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoIDwgMjUwKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoZnJvbSwgdG8gLSBmcm9tLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXS5jb25jYXQodGhpcy5jaGlsZHJlbi5zbGljZSgwLCBmcm9tKSwgY2hpbGRyZW4sIHRoaXMuY2hpbGRyZW4uc2xpY2UodG8pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldLnNldFBhcmVudCh0aGlzKTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oX3JlYykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZ25vcmVFdmVudChfZXZlbnQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY2hpbGRDdXJzb3IocG9zID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGlsZEN1cnNvcih0aGlzLmNoaWxkcmVuLCBwb3MsIHRoaXMuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgY2hpbGRQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZEN1cnNvcigpLmZpbmRQb3MocG9zLCBiaWFzKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLnJlcGxhY2UoXCJWaWV3XCIsIFwiXCIpO1xuICAgICAgICByZXR1cm4gbmFtZSArICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA/IFwiKFwiICsgdGhpcy5jaGlsZHJlbi5qb2luKCkgKyBcIilcIiA6XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA/IFwiW1wiICsgKG5hbWUgPT0gXCJUZXh0XCIgPyB0aGlzLnRleHQgOiB0aGlzLmxlbmd0aCkgKyBcIl1cIiA6IFwiXCIpICtcbiAgICAgICAgICAgICh0aGlzLmJyZWFrQWZ0ZXIgPyBcIiNcIiA6IFwiXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0KG5vZGUpIHsgcmV0dXJuIG5vZGUuY21WaWV3OyB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGlzV2lkZ2V0KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBiZWNvbWUob3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY2FuUmV1c2VET00ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLmNvbnN0cnVjdG9yID09IHRoaXMuY29uc3RydWN0b3IgJiYgISgodGhpcy5mbGFncyB8IG90aGVyLmZsYWdzKSAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoaXMgaXMgYSB6ZXJvLWxlbmd0aCB2aWV3IHdpdGggYSBzaWRlLCB0aGlzIHNob3VsZCByZXR1cm4gYVxuICAgIC8vIG51bWJlciA8PSAwIHRvIGluZGljYXRlIGl0IGlzIGJlZm9yZSBpdHMgcG9zaXRpb24sIG9yIGFcbiAgICAvLyBudW1iZXIgPiAwIHdoZW4gYWZ0ZXIgaXRzIHBvc2l0aW9uLlxuICAgIGdldFNpZGUoKSB7IHJldHVybiAwOyB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIGlmIChjaGlsZC5wYXJlbnQgPT0gdGhpcylcbiAgICAgICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB9XG59XG5Db250ZW50Vmlldy5wcm90b3R5cGUuYnJlYWtBZnRlciA9IDA7XG4vLyBSZW1vdmUgYSBET00gbm9kZSBhbmQgcmV0dXJuIGl0cyBuZXh0IHNpYmxpbmcuXG5mdW5jdGlvbiBybSQxKGRvbSkge1xuICAgIGxldCBuZXh0ID0gZG9tLm5leHRTaWJsaW5nO1xuICAgIGRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5jbGFzcyBDaGlsZEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoY2hpbGRyZW4sIHBvcywgaSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmkgPSBpO1xuICAgICAgICB0aGlzLm9mZiA9IDA7XG4gICAgfVxuICAgIGZpbmRQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAocG9zID4gdGhpcy5wb3MgfHwgcG9zID09IHRoaXMucG9zICYmXG4gICAgICAgICAgICAgICAgKGJpYXMgPiAwIHx8IHRoaXMuaSA9PSAwIHx8IHRoaXMuY2hpbGRyZW5bdGhpcy5pIC0gMV0uYnJlYWtBZnRlcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZiA9IHBvcyAtIHRoaXMucG9zO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmNoaWxkcmVuWy0tdGhpcy5pXTtcbiAgICAgICAgICAgIHRoaXMucG9zIC09IG5leHQubGVuZ3RoICsgbmV4dC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcmVwbGFjZVJhbmdlKHBhcmVudCwgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGluc2VydCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICBsZXQgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuICAgIGxldCBiZWZvcmUgPSBjaGlsZHJlbi5sZW5ndGggPyBjaGlsZHJlbltmcm9tSV0gOiBudWxsO1xuICAgIGxldCBsYXN0ID0gaW5zZXJ0Lmxlbmd0aCA/IGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIGxldCBicmVha0F0RW5kID0gbGFzdCA/IGxhc3QuYnJlYWtBZnRlciA6IGJyZWFrQXRTdGFydDtcbiAgICAvLyBDaGFuZ2Ugd2l0aGluIGEgc2luZ2xlIGNoaWxkXG4gICAgaWYgKGZyb21JID09IHRvSSAmJiBiZWZvcmUgJiYgIWJyZWFrQXRTdGFydCAmJiAhYnJlYWtBdEVuZCAmJiBpbnNlcnQubGVuZ3RoIDwgMiAmJlxuICAgICAgICBiZWZvcmUubWVyZ2UoZnJvbU9mZiwgdG9PZmYsIGluc2VydC5sZW5ndGggPyBsYXN0IDogbnVsbCwgZnJvbU9mZiA9PSAwLCBvcGVuU3RhcnQsIG9wZW5FbmQpKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHRvSSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSBjaGlsZHJlblt0b0ldO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGVuZCBvZiB0aGUgY2hpbGQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyBwcmVzZXJ2ZWQgaW4gYGFmdGVyYFxuICAgICAgICBpZiAoYWZ0ZXIgJiYgKHRvT2ZmIDwgYWZ0ZXIubGVuZ3RoIHx8IGFmdGVyLmJyZWFrQWZ0ZXIgJiYgKGxhc3QgPT09IG51bGwgfHwgbGFzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGFzdC5icmVha0FmdGVyKSkpIHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHNwbGl0dGluZyBhIGNoaWxkLCBzZXBhcmF0ZSBwYXJ0IG9mIGl0IHRvIGF2b2lkIHRoYXRcbiAgICAgICAgICAgIC8vIGJlaW5nIG1hbmdsZWQgd2hlbiB1cGRhdGluZyB0aGUgY2hpbGQgYmVmb3JlIHRoZSB1cGRhdGUuXG4gICAgICAgICAgICBpZiAoZnJvbUkgPT0gdG9JKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5zcGxpdCh0b09mZik7XG4gICAgICAgICAgICAgICAgdG9PZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIHJlcGxhY2VtZW50IHNob3VsZCBiZSBtZXJnZWQgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgcmVwbGFjaW5nIGVsZW1lbnQsIHVwZGF0ZSBgY29udGVudGBcbiAgICAgICAgICAgIGlmICghYnJlYWtBdEVuZCAmJiBsYXN0ICYmIGFmdGVyLm1lcmdlKDAsIHRvT2ZmLCBsYXN0LCB0cnVlLCAwLCBvcGVuRW5kKSkge1xuICAgICAgICAgICAgICAgIGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0gPSBhZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3RhcnQgb2YgdGhlIGFmdGVyIGVsZW1lbnQsIGlmIG5lY2Vzc2FyeSwgYW5kXG4gICAgICAgICAgICAgICAgLy8gYWRkIGl0IHRvIGBjb250ZW50YC5cbiAgICAgICAgICAgICAgICBpZiAodG9PZmYgfHwgYWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoICYmICFhZnRlci5jaGlsZHJlblswXS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyLm1lcmdlKDAsIHRvT2ZmLCBudWxsLCBmYWxzZSwgMCwgb3BlbkVuZCk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0LnB1c2goYWZ0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFmdGVyID09PSBudWxsIHx8IGFmdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZnRlci5icmVha0FmdGVyKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBhdCBgdG9JYCBpcyBlbnRpcmVseSBjb3ZlcmVkIGJ5IHRoaXMgcmFuZ2UuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBpdHMgbGluZSBicmVhaywgaWYgYW55LlxuICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgbGFzdC5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBicmVha0F0U3RhcnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIHdlJ3ZlIGhhbmRsZWQgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBjdXJyZW50IGVsZW1lbnRzXG4gICAgICAgIC8vIG5vdywgbWFrZSBzdXJlIGB0b0lgIHBvaW50cyBhZnRlciB0aGF0LlxuICAgICAgICB0b0krKztcbiAgICB9XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBiZWZvcmUuYnJlYWtBZnRlciA9IGJyZWFrQXRTdGFydDtcbiAgICAgICAgaWYgKGZyb21PZmYgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWJyZWFrQXRTdGFydCAmJiBpbnNlcnQubGVuZ3RoICYmIGJlZm9yZS5tZXJnZShmcm9tT2ZmLCBiZWZvcmUubGVuZ3RoLCBpbnNlcnRbMF0sIGZhbHNlLCBvcGVuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLmJyZWFrQWZ0ZXIgPSBpbnNlcnQuc2hpZnQoKS5icmVha0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZnJvbU9mZiA8IGJlZm9yZS5sZW5ndGggfHwgYmVmb3JlLmNoaWxkcmVuLmxlbmd0aCAmJiBiZWZvcmUuY2hpbGRyZW5bYmVmb3JlLmNoaWxkcmVuLmxlbmd0aCAtIDFdLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLm1lcmdlKGZyb21PZmYsIGJlZm9yZS5sZW5ndGgsIG51bGwsIGZhbHNlLCBvcGVuU3RhcnQsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJvbUkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gbWVyZ2Ugd2lkZ2V0cyBvbiB0aGUgYm91bmRhcmllcyBvZiB0aGUgcmVwbGFjZW1lbnRcbiAgICB3aGlsZSAoZnJvbUkgPCB0b0kgJiYgaW5zZXJ0Lmxlbmd0aCkge1xuICAgICAgICBpZiAoY2hpbGRyZW5bdG9JIC0gMV0uYmVjb21lKGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICB0b0ktLTtcbiAgICAgICAgICAgIGluc2VydC5wb3AoKTtcbiAgICAgICAgICAgIG9wZW5FbmQgPSBpbnNlcnQubGVuZ3RoID8gMCA6IG9wZW5TdGFydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGlsZHJlbltmcm9tSV0uYmVjb21lKGluc2VydFswXSkpIHtcbiAgICAgICAgICAgIGZyb21JKys7XG4gICAgICAgICAgICBpbnNlcnQuc2hpZnQoKTtcbiAgICAgICAgICAgIG9wZW5TdGFydCA9IGluc2VydC5sZW5ndGggPyAwIDogb3BlbkVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaW5zZXJ0Lmxlbmd0aCAmJiBmcm9tSSAmJiB0b0kgPCBjaGlsZHJlbi5sZW5ndGggJiYgIWNoaWxkcmVuW2Zyb21JIC0gMV0uYnJlYWtBZnRlciAmJlxuICAgICAgICBjaGlsZHJlblt0b0ldLm1lcmdlKDAsIDAsIGNoaWxkcmVuW2Zyb21JIC0gMV0sIGZhbHNlLCBvcGVuU3RhcnQsIG9wZW5FbmQpKVxuICAgICAgICBmcm9tSS0tO1xuICAgIGlmIChmcm9tSSA8IHRvSSB8fCBpbnNlcnQubGVuZ3RoKVxuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkcmVuKGZyb21JLCB0b0ksIGluc2VydCk7XG59XG5mdW5jdGlvbiBtZXJnZUNoaWxkcmVuSW50byhwYXJlbnQsIGZyb20sIHRvLCBpbnNlcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGxldCBjdXIgPSBwYXJlbnQuY2hpbGRDdXJzb3IoKTtcbiAgICBsZXQgeyBpOiB0b0ksIG9mZjogdG9PZmYgfSA9IGN1ci5maW5kUG9zKHRvLCAxKTtcbiAgICBsZXQgeyBpOiBmcm9tSSwgb2ZmOiBmcm9tT2ZmIH0gPSBjdXIuZmluZFBvcyhmcm9tLCAtMSk7XG4gICAgbGV0IGRMZW4gPSBmcm9tIC0gdG87XG4gICAgZm9yIChsZXQgdmlldyBvZiBpbnNlcnQpXG4gICAgICAgIGRMZW4gKz0gdmlldy5sZW5ndGg7XG4gICAgcGFyZW50Lmxlbmd0aCArPSBkTGVuO1xuICAgIHJlcGxhY2VSYW5nZShwYXJlbnQsIGZyb21JLCBmcm9tT2ZmLCB0b0ksIHRvT2ZmLCBpbnNlcnQsIDAsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG59XG5cbmxldCBuYXYgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IgOiB7IHVzZXJBZ2VudDogXCJcIiwgdmVuZG9yOiBcIlwiLCBwbGF0Zm9ybTogXCJcIiB9O1xubGV0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiB7IGRvY3VtZW50RWxlbWVudDogeyBzdHlsZToge30gfSB9O1xuY29uc3QgaWVfZWRnZSA9IC8qQF9fUFVSRV9fKi8vRWRnZVxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IGllX3VwdG8xMCA9IC8qQF9fUFVSRV9fKi8vTVNJRSBcXGQvLnRlc3QobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBpZV8xMXVwID0gLypAX19QVVJFX18qLy9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IGllID0gISEoaWVfdXB0bzEwIHx8IGllXzExdXAgfHwgaWVfZWRnZSk7XG5jb25zdCBnZWNrbyA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL2dlY2tvXFwvKFxcZCspL2kudGVzdChuYXYudXNlckFnZW50KTtcbmNvbnN0IGNocm9tZSA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL0Nocm9tZVxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IHdlYmtpdCA9IFwid2Via2l0Rm9udFNtb290aGluZ1wiIGluIGRvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5jb25zdCBzYWZhcmkgPSAhaWUgJiYgLypAX19QVVJFX18qLy9BcHBsZSBDb21wdXRlci8udGVzdChuYXYudmVuZG9yKTtcbmNvbnN0IGlvcyA9IHNhZmFyaSAmJiAoLypAX19QVVJFX18qLy9Nb2JpbGVcXC9cXHcrLy50ZXN0KG5hdi51c2VyQWdlbnQpIHx8IG5hdi5tYXhUb3VjaFBvaW50cyA+IDIpO1xudmFyIGJyb3dzZXIgPSB7XG4gICAgbWFjOiBpb3MgfHwgLypAX19QVVJFX18qLy9NYWMvLnRlc3QobmF2LnBsYXRmb3JtKSxcbiAgICB3aW5kb3dzOiAvKkBfX1BVUkVfXyovL1dpbi8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIGxpbnV4OiAvKkBfX1BVUkVfXyovL0xpbnV4fFgxMS8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIGllLFxuICAgIGllX3ZlcnNpb246IGllX3VwdG8xMCA/IGRvYy5kb2N1bWVudE1vZGUgfHwgNiA6IGllXzExdXAgPyAraWVfMTF1cFsxXSA6IGllX2VkZ2UgPyAraWVfZWRnZVsxXSA6IDAsXG4gICAgZ2Vja28sXG4gICAgZ2Vja29fdmVyc2lvbjogZ2Vja28gPyArKC8qQF9fUFVSRV9fKi8vRmlyZWZveFxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMCxcbiAgICBjaHJvbWU6ICEhY2hyb21lLFxuICAgIGNocm9tZV92ZXJzaW9uOiBjaHJvbWUgPyArY2hyb21lWzFdIDogMCxcbiAgICBpb3MsXG4gICAgYW5kcm9pZDogLypAX19QVVJFX18qLy9BbmRyb2lkXFxiLy50ZXN0KG5hdi51c2VyQWdlbnQpLFxuICAgIHdlYmtpdCxcbiAgICBzYWZhcmksXG4gICAgd2Via2l0X3ZlcnNpb246IHdlYmtpdCA/ICsoLypAX19QVVJFX18qLy9cXGJBcHBsZVdlYktpdFxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMCxcbiAgICB0YWJTaXplOiBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnRhYlNpemUgIT0gbnVsbCA/IFwidGFiLXNpemVcIiA6IFwiLW1vei10YWItc2l6ZVwiXG59O1xuXG5jb25zdCBNYXhKb2luTGVuID0gMjU2O1xuY2xhc3MgVGV4dFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IodGV4dCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGNyZWF0ZURPTSh0ZXh0RE9NKSB7XG4gICAgICAgIHRoaXMuc2V0RE9NKHRleHRET00gfHwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy50ZXh0KSk7XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRE9NKCk7XG4gICAgICAgIGlmICh0aGlzLmRvbS5ub2RlVmFsdWUgIT0gdGhpcy50ZXh0KSB7XG4gICAgICAgICAgICBpZiAodHJhY2sgJiYgdHJhY2subm9kZSA9PSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICB0cmFjay53cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLm5vZGVWYWx1ZSA9IHRoaXMudGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXVzZURPTShkb20pIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET00oZG9tKTtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSkge1xuICAgICAgICBpZiAoKHRoaXMuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKSB8fFxuICAgICAgICAgICAgc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIFRleHRWaWV3KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyBzb3VyY2UubGVuZ3RoID4gTWF4Sm9pbkxlbiB8fFxuICAgICAgICAgICAgICAgIChzb3VyY2UuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zbGljZSgwLCBmcm9tKSArIChzb3VyY2UgPyBzb3VyY2UudGV4dCA6IFwiXCIpICsgdGhpcy50ZXh0LnNsaWNlKHRvKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUZXh0Vmlldyh0aGlzLnRleHQuc2xpY2UoZnJvbSkpO1xuICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQuc2xpY2UoMCwgZnJvbSk7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIHJlc3VsdC5mbGFncyB8PSB0aGlzLmZsYWdzICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLztcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbm9kZSA9PSB0aGlzLmRvbSA/IG9mZnNldCA6IG9mZnNldCA/IHRoaXMudGV4dC5sZW5ndGggOiAwO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHsgcmV0dXJuIG5ldyBET01Qb3ModGhpcy5kb20sIHBvcyk7IH1cbiAgICBkb21Cb3VuZHNBcm91bmQoX2Zyb20sIF90bywgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IG9mZnNldCwgdG86IG9mZnNldCArIHRoaXMubGVuZ3RoLCBzdGFydERPTTogdGhpcy5kb20sIGVuZERPTTogdGhpcy5kb20ubmV4dFNpYmxpbmcgfTtcbiAgICB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiB0ZXh0Q29vcmRzKHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgIH1cbn1cbmNsYXNzIE1hcmtWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKG1hcmssIGNoaWxkcmVuID0gW10sIGxlbmd0aCA9IDApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgY2ggb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBjaC5zZXRQYXJlbnQodGhpcyk7XG4gICAgfVxuICAgIHNldEF0dHJzKGRvbSkge1xuICAgICAgICBjbGVhckF0dHJpYnV0ZXMoZG9tKTtcbiAgICAgICAgaWYgKHRoaXMubWFyay5jbGFzcylcbiAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSB0aGlzLm1hcmsuY2xhc3M7XG4gICAgICAgIGlmICh0aGlzLm1hcmsuYXR0cnMpXG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMubWFyay5hdHRycylcbiAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIHRoaXMubWFyay5hdHRyc1tuYW1lXSk7XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIGNhblJldXNlRE9NKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jYW5SZXVzZURPTShvdGhlcikgJiYgISgodGhpcy5mbGFncyB8IG90aGVyLmZsYWdzKSAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgIH1cbiAgICByZXVzZURPTShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IHRoaXMubWFyay50YWdOYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8gfCAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLnNldEF0dHJzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5tYXJrLnRhZ05hbWUpKSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZmxhZ3MgJiA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8pXG4gICAgICAgICAgICB0aGlzLnNldEF0dHJzKHRoaXMuZG9tKTtcbiAgICAgICAgc3VwZXIuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIF9oYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgKCEoc291cmNlIGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgc291cmNlLm1hcmsuZXEodGhpcy5tYXJrKSkgfHxcbiAgICAgICAgICAgIChmcm9tICYmIG9wZW5TdGFydCA8PSAwKSB8fCAodG8gPCB0aGlzLmxlbmd0aCAmJiBvcGVuRW5kIDw9IDApKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbWVyZ2VDaGlsZHJlbkludG8odGhpcywgZnJvbSwgdG8sIHNvdXJjZSA/IHNvdXJjZS5jaGlsZHJlbi5zbGljZSgpIDogW10sIG9wZW5TdGFydCAtIDEsIG9wZW5FbmQgLSAxKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBvZmYgPSAwLCBkZXRhY2hGcm9tID0gLTEsIGkgPSAwO1xuICAgICAgICBmb3IgKGxldCBlbHQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgbGV0IGVuZCA9IG9mZiArIGVsdC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gZnJvbSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvZmYgPCBmcm9tID8gZWx0LnNwbGl0KGZyb20gLSBvZmYpIDogZWx0KTtcbiAgICAgICAgICAgIGlmIChkZXRhY2hGcm9tIDwgMCAmJiBvZmYgPj0gZnJvbSlcbiAgICAgICAgICAgICAgICBkZXRhY2hGcm9tID0gaTtcbiAgICAgICAgICAgIG9mZiA9IGVuZDtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGVuZ3RoID0gdGhpcy5sZW5ndGggLSBmcm9tO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZyb207XG4gICAgICAgIGlmIChkZXRhY2hGcm9tID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gZGV0YWNoRnJvbTtcbiAgICAgICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrVmlldyh0aGlzLm1hcmssIHJlc3VsdCwgbGVuZ3RoKTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVET01BdFBvcyh0aGlzLCBwb3MpO1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvb3Jkc0luQ2hpbGRyZW4odGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Q29vcmRzKHRleHQsIHBvcywgc2lkZSkge1xuICAgIGxldCBsZW5ndGggPSB0ZXh0Lm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgaWYgKHBvcyA+IGxlbmd0aClcbiAgICAgICAgcG9zID0gbGVuZ3RoO1xuICAgIGxldCBmcm9tID0gcG9zLCB0byA9IHBvcywgZmxhdHRlbiA9IDA7XG4gICAgaWYgKHBvcyA9PSAwICYmIHNpZGUgPCAwIHx8IHBvcyA9PSBsZW5ndGggJiYgc2lkZSA+PSAwKSB7XG4gICAgICAgIGlmICghKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuZ2Vja28pKSB7IC8vIFRoZXNlIGJyb3dzZXJzIHJlbGlhYmx5IHJldHVybiB2YWxpZCByZWN0YW5nbGVzIGZvciBlbXB0eSByYW5nZXNcbiAgICAgICAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgICAgICAgICBmcm9tLS07XG4gICAgICAgICAgICAgICAgZmxhdHRlbiA9IDE7XG4gICAgICAgICAgICB9IC8vIEZJWE1FIHRoaXMgaXMgd3JvbmcgaW4gUlRMIHRleHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHRvIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG8rKztcbiAgICAgICAgICAgICAgICBmbGF0dGVuID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChzaWRlIDwgMClcbiAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgZWxzZSBpZiAodG8gPCBsZW5ndGgpXG4gICAgICAgICAgICB0bysrO1xuICAgIH1cbiAgICBsZXQgcmVjdHMgPSB0ZXh0UmFuZ2UodGV4dCwgZnJvbSwgdG8pLmdldENsaWVudFJlY3RzKCk7XG4gICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCByZWN0ID0gcmVjdHNbKGZsYXR0ZW4gPyBmbGF0dGVuIDwgMCA6IHNpZGUgPj0gMCkgPyAwIDogcmVjdHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmICFmbGF0dGVuICYmIHJlY3Qud2lkdGggPT0gMClcbiAgICAgICAgcmVjdCA9IEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocmVjdHMsIHIgPT4gci53aWR0aCkgfHwgcmVjdDtcbiAgICByZXR1cm4gZmxhdHRlbiA/IGZsYXR0ZW5SZWN0KHJlY3QsIGZsYXR0ZW4gPCAwKSA6IHJlY3QgfHwgbnVsbDtcbn1cbi8vIEFsc28gdXNlZCBmb3IgY29sbGFwc2VkIHJhbmdlcyB0aGF0IGRvbid0IGhhdmUgYSBwbGFjZWhvbGRlciB3aWRnZXQhXG5jbGFzcyBXaWRnZXRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIHN0YXRpYyBjcmVhdGUod2lkZ2V0LCBsZW5ndGgsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRWaWV3KHdpZGdldCwgbGVuZ3RoLCBzaWRlKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iod2lkZ2V0LCBsZW5ndGgsIHNpZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgIH1cbiAgICBzcGxpdChmcm9tKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBXaWRnZXRWaWV3LmNyZWF0ZSh0aGlzLndpZGdldCwgdGhpcy5sZW5ndGggLSBmcm9tLCB0aGlzLnNpZGUpO1xuICAgICAgICB0aGlzLmxlbmd0aCAtPSBmcm9tO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzeW5jKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSB8fCAhdGhpcy53aWRnZXQudXBkYXRlRE9NKHRoaXMuZG9tLCB2aWV3KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9tICYmIHRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZXRET00odGhpcy53aWRnZXQudG9ET00odmlldykpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpZGdldC5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U2lkZSgpIHsgcmV0dXJuIHRoaXMuc2lkZTsgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBXaWRnZXRWaWV3KSB8fCAhdGhpcy53aWRnZXQuY29tcGFyZShzb3VyY2Uud2lkZ2V0KSB8fFxuICAgICAgICAgICAgZnJvbSA+IDAgJiYgb3BlblN0YXJ0IDw9IDAgfHwgdG8gPCB0aGlzLmxlbmd0aCAmJiBvcGVuRW5kIDw9IDApKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZyb20gKyAoc291cmNlID8gc291cmNlLmxlbmd0aCA6IDApICsgKHRoaXMubGVuZ3RoIC0gdG8pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFdpZGdldFZpZXcgJiYgb3RoZXIuc2lkZSA9PSB0aGlzLnNpZGUgJiZcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmNvbnN0cnVjdG9yID09IG90aGVyLndpZGdldC5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpZGdldC5jb21wYXJlKG90aGVyLndpZGdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgIXRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSB0aGlzLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0ID0gb3RoZXIud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvdGhlci5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlnbm9yZUV2ZW50KGV2ZW50KSB7IHJldHVybiB0aGlzLndpZGdldC5pZ25vcmVFdmVudChldmVudCk7IH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgICAgICBsZXQgdG9wID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHRvcC5wYXJlbnQpXG4gICAgICAgICAgICB0b3AgPSB0b3AucGFyZW50O1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0b3AsIHRleHQgPSB2aWV3ICYmIHZpZXcuc3RhdGUuZG9jLCBzdGFydCA9IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgcmV0dXJuIHRleHQgPyB0ZXh0LnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMubGVuZ3RoKSA6IFRleHQuZW1wdHk7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoID8gcG9zID09IDAgOiB0aGlzLnNpZGUgPiAwKVxuICAgICAgICAgICAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKVxuICAgICAgICAgICAgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20sIHBvcyA9PSB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHRoaXMud2lkZ2V0LmNvb3Jkc0F0KHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgbGV0IHJlY3RzID0gdGhpcy5kb20uZ2V0Q2xpZW50UmVjdHMoKSwgcmVjdCA9IG51bGw7XG4gICAgICAgIGlmICghcmVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBmcm9tQmFjayA9IHRoaXMuc2lkZSA/IHRoaXMuc2lkZSA8IDAgOiBwb3MgPiAwO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbUJhY2sgPyByZWN0cy5sZW5ndGggLSAxIDogMDs7IGkgKz0gKGZyb21CYWNrID8gLTEgOiAxKSkge1xuICAgICAgICAgICAgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKHBvcyA+IDAgPyBpID09IDAgOiBpID09IHJlY3RzLmxlbmd0aCAtIDEgfHwgcmVjdC50b3AgPCByZWN0LmJvdHRvbSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHRlblJlY3QocmVjdCwgIWZyb21CYWNrKTtcbiAgICB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiB0aGlzLndpZGdldC5pc0hpZGRlbjsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgfVxufVxuLy8gVGhlc2UgYXJlIGRyYXduIGFyb3VuZCB1bmVkaXRhYmxlIHdpZGdldHMgdG8gYXZvaWQgYSBudW1iZXIgb2Zcbi8vIGJyb3dzZXIgYnVncyB0aGF0IHNob3cgdXAgd2hlbiB0aGUgY3Vyc29yIGlzIGRpcmVjdGx5IG5leHQgdG9cbi8vIHVuZWRpdGFibGUgaW5saW5lIGNvbnRlbnQuXG5jbGFzcyBXaWRnZXRCdWZmZXJWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHNpZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zaWRlID0gc2lkZTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIDA7IH1cbiAgICBtZXJnZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFdpZGdldEJ1ZmZlclZpZXcgJiYgb3RoZXIuc2lkZSA9PSB0aGlzLnNpZGU7XG4gICAgfVxuICAgIHNwbGl0KCkgeyByZXR1cm4gbmV3IFdpZGdldEJ1ZmZlclZpZXcodGhpcy5zaWRlKTsgfVxuICAgIHN5bmMoKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IFwiY20td2lkZ2V0QnVmZmVyXCI7XG4gICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgdGhpcy5zZXRET00oZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTaWRlKCkgeyByZXR1cm4gdGhpcy5zaWRlOyB9XG4gICAgZG9tQXRQb3MocG9zKSB7IHJldHVybiB0aGlzLnNpZGUgPiAwID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSkgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20pOyB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKCkgeyByZXR1cm4gMDsgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb29yZHNBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICByZXR1cm4gVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuVGV4dFZpZXcucHJvdG90eXBlLmNoaWxkcmVuID0gV2lkZ2V0Vmlldy5wcm90b3R5cGUuY2hpbGRyZW4gPSBXaWRnZXRCdWZmZXJWaWV3LnByb3RvdHlwZS5jaGlsZHJlbiA9IG5vQ2hpbGRyZW47XG5mdW5jdGlvbiBpbmxpbmVET01BdFBvcyhwYXJlbnQsIHBvcykge1xuICAgIGxldCBkb20gPSBwYXJlbnQuZG9tLCB7IGNoaWxkcmVuIH0gPSBwYXJlbnQsIGkgPSAwO1xuICAgIGZvciAobGV0IG9mZiA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBjaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID09IG9mZiAmJiBjaGlsZC5nZXRTaWRlKCkgPD0gMClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAocG9zID4gb2ZmICYmIHBvcyA8IGVuZCAmJiBjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm4gY2hpbGQuZG9tQXRQb3MocG9zIC0gb2ZmKTtcbiAgICAgICAgaWYgKHBvcyA8PSBvZmYpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgb2ZmID0gZW5kO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaTsgaiA+IDA7IGotLSkge1xuICAgICAgICBsZXQgcHJldiA9IGNoaWxkcmVuW2ogLSAxXTtcbiAgICAgICAgaWYgKHByZXYuZG9tLnBhcmVudE5vZGUgPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIHByZXYuZG9tQXRQb3MocHJldi5sZW5ndGgpO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY2hpbGRyZW5bal07XG4gICAgICAgIGlmIChuZXh0LmRvbS5wYXJlbnROb2RlID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmRvbUF0UG9zKDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERPTVBvcyhkb20sIDApO1xufVxuLy8gQXNzdW1lcyBgdmlld2AsIGlmIGEgbWFyayB2aWV3LCBoYXMgcHJlY2lzZWx5IDEgY2hpbGQuXG5mdW5jdGlvbiBqb2luSW5saW5lSW50byhwYXJlbnQsIHZpZXcsIG9wZW4pIHtcbiAgICBsZXQgbGFzdCwgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuICAgIGlmIChvcGVuID4gMCAmJiB2aWV3IGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIChsYXN0ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0pIGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgbGFzdC5tYXJrLmVxKHZpZXcubWFyaykpIHtcbiAgICAgICAgam9pbklubGluZUludG8obGFzdCwgdmlldy5jaGlsZHJlblswXSwgb3BlbiAtIDEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh2aWV3KTtcbiAgICAgICAgdmlldy5zZXRQYXJlbnQocGFyZW50KTtcbiAgICB9XG4gICAgcGFyZW50Lmxlbmd0aCArPSB2aWV3Lmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGNvb3Jkc0luQ2hpbGRyZW4odmlldywgcG9zLCBzaWRlKSB7XG4gICAgbGV0IGJlZm9yZSA9IG51bGwsIGJlZm9yZVBvcyA9IC0xLCBhZnRlciA9IG51bGwsIGFmdGVyUG9zID0gLTE7XG4gICAgZnVuY3Rpb24gc2Nhbih2aWV3LCBwb3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCB2aWV3LmNoaWxkcmVuLmxlbmd0aCAmJiBvZmYgPD0gcG9zOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHZpZXcuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzY2FuKGNoaWxkLCBwb3MgLSBvZmYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgoIWFmdGVyIHx8IGFmdGVyLmlzSGlkZGVuICYmIChzaWRlID4gMCB8fCBvblNhbWVMaW5lKGFmdGVyLCBjaGlsZCkpKSAmJlxuICAgICAgICAgICAgICAgICAgICAoZW5kID4gcG9zIHx8IG9mZiA9PSBlbmQgJiYgY2hpbGQuZ2V0U2lkZSgpID4gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQb3MgPSBwb3MgLSBvZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9mZiA8IHBvcyB8fCAob2ZmID09IGVuZCAmJiBjaGlsZC5nZXRTaWRlKCkgPCAwKSAmJiAhY2hpbGQuaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZVBvcyA9IHBvcyAtIG9mZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2Nhbih2aWV3LCBwb3MpO1xuICAgIGxldCB0YXJnZXQgPSAoc2lkZSA8IDAgPyBiZWZvcmUgOiBhZnRlcikgfHwgYmVmb3JlIHx8IGFmdGVyO1xuICAgIGlmICh0YXJnZXQpXG4gICAgICAgIHJldHVybiB0YXJnZXQuY29vcmRzQXQoTWF0aC5tYXgoMCwgdGFyZ2V0ID09IGJlZm9yZSA/IGJlZm9yZVBvcyA6IGFmdGVyUG9zKSwgc2lkZSk7XG4gICAgcmV0dXJuIGZhbGxiYWNrUmVjdCh2aWV3KTtcbn1cbmZ1bmN0aW9uIGZhbGxiYWNrUmVjdCh2aWV3KSB7XG4gICAgbGV0IGxhc3QgPSB2aWV3LmRvbS5sYXN0Q2hpbGQ7XG4gICAgaWYgKCFsYXN0KVxuICAgICAgICByZXR1cm4gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHJlY3RzID0gY2xpZW50UmVjdHNGb3IobGFzdCk7XG4gICAgcmV0dXJuIHJlY3RzW3JlY3RzLmxlbmd0aCAtIDFdIHx8IG51bGw7XG59XG5mdW5jdGlvbiBvblNhbWVMaW5lKGEsIGIpIHtcbiAgICBsZXQgcG9zQSA9IGEuY29vcmRzQXQoMCwgMSksIHBvc0IgPSBiLmNvb3Jkc0F0KDAsIDEpO1xuICAgIHJldHVybiBwb3NBICYmIHBvc0IgJiYgcG9zQi50b3AgPCBwb3NBLmJvdHRvbTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUF0dHJzKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJjbGFzc1wiICYmIHRhcmdldC5jbGFzcylcbiAgICAgICAgICAgIHRhcmdldC5jbGFzcyArPSBcIiBcIiArIHNvdXJjZS5jbGFzcztcbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcInN0eWxlXCIgJiYgdGFyZ2V0LnN0eWxlKVxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlICs9IFwiO1wiICsgc291cmNlLnN0eWxlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5jb25zdCBub0F0dHJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5mdW5jdGlvbiBhdHRyc0VxKGEsIGIsIGlnbm9yZSkge1xuICAgIGlmIChhID09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghYSlcbiAgICAgICAgYSA9IG5vQXR0cnM7XG4gICAgaWYgKCFiKVxuICAgICAgICBiID0gbm9BdHRycztcbiAgICBsZXQga2V5c0EgPSBPYmplY3Qua2V5cyhhKSwga2V5c0IgPSBPYmplY3Qua2V5cyhiKTtcbiAgICBpZiAoa2V5c0EubGVuZ3RoIC0gKGlnbm9yZSAmJiBrZXlzQS5pbmRleE9mKGlnbm9yZSkgPiAtMSA/IDEgOiAwKSAhPVxuICAgICAgICBrZXlzQi5sZW5ndGggLSAoaWdub3JlICYmIGtleXNCLmluZGV4T2YoaWdub3JlKSA+IC0xID8gMSA6IDApKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXNBKSB7XG4gICAgICAgIGlmIChrZXkgIT0gaWdub3JlICYmIChrZXlzQi5pbmRleE9mKGtleSkgPT0gLTEgfHwgYVtrZXldICE9PSBiW2tleV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJzKGRvbSwgcHJldiwgYXR0cnMpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGlmIChwcmV2KVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByZXYpXG4gICAgICAgICAgICBpZiAoIShhdHRycyAmJiBuYW1lIGluIGF0dHJzKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICBpZiAoYXR0cnMpXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICBpZiAoIShwcmV2ICYmIHByZXZbbmFtZV0gPT0gYXR0cnNbbmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBhdHRyc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBnZXRBdHRycyhkb20pIHtcbiAgICBsZXQgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGF0dHIgPSBkb20uYXR0cmlidXRlc1tpXTtcbiAgICAgICAgYXR0cnNbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBhdHRycztcbn1cblxuLyoqXG5XaWRnZXRzIGFkZGVkIHRvIHRoZSBjb250ZW50IGFyZSBkZXNjcmliZWQgYnkgc3ViY2xhc3NlcyBvZiB0aGlzXG5jbGFzcy4gVXNpbmcgYSBkZXNjcmlwdGlvbiBvYmplY3QgbGlrZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvXG5kZWxheSBjcmVhdGluZyBvZiB0aGUgRE9NIHN0cnVjdHVyZSBmb3IgYSB3aWRnZXQgdW50aWwgaXQgaXNcbm5lZWRlZCwgYW5kIHRvIGF2b2lkIHJlZHJhd2luZyB3aWRnZXRzIGV2ZW4gaWYgdGhlIGRlY29yYXRpb25zXG50aGF0IGRlZmluZSB0aGVtIGFyZSByZWNyZWF0ZWQuXG4qL1xuY2xhc3MgV2lkZ2V0VHlwZSB7XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIGluc3RhbmNlIHRvIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZS5cbiAgICAoVHlwZVNjcmlwdCBjYW4ndCBleHByZXNzIHRoaXMsIGJ1dCBvbmx5IGluc3RhbmNlcyBvZiB0aGUgc2FtZVxuICAgIHNwZWNpZmljIGNsYXNzIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLikgVGhpcyBpcyB1c2VkIHRvXG4gICAgYXZvaWQgcmVkcmF3aW5nIHdpZGdldHMgd2hlbiB0aGV5IGFyZSByZXBsYWNlZCBieSBhIG5ld1xuICAgIGRlY29yYXRpb24gb2YgdGhlIHNhbWUgdHlwZS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdFxuICAgIHJldHVybnMgYGZhbHNlYCwgd2hpY2ggd2lsbCBjYXVzZSBuZXcgaW5zdGFuY2VzIG9mIHRoZSB3aWRnZXQgdG9cbiAgICBhbHdheXMgYmUgcmVkcmF3bi5cbiAgICAqL1xuICAgIGVxKHdpZGdldCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBVcGRhdGUgYSBET00gZWxlbWVudCBjcmVhdGVkIGJ5IGEgd2lkZ2V0IG9mIHRoZSBzYW1lIHR5cGUgKGJ1dFxuICAgIGRpZmZlcmVudCwgbm9uLWBlcWAgY29udGVudCkgdG8gcmVmbGVjdCB0aGlzIHdpZGdldC4gTWF5IHJldHVyblxuICAgIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBpdCBjb3VsZCB1cGRhdGUsIGZhbHNlIHRvIGluZGljYXRlIGl0XG4gICAgY291bGRuJ3QgKGluIHdoaWNoIGNhc2UgdGhlIHdpZGdldCB3aWxsIGJlIHJlZHJhd24pLiBUaGUgZGVmYXVsdFxuICAgIGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBmYWxzZS5cbiAgICAqL1xuICAgIHVwZGF0ZURPTShkb20sIHZpZXcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHRoaXMuY29uc3RydWN0b3IgPT0gb3RoZXIuY29uc3RydWN0b3IgJiYgdGhpcy5lcShvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBlc3RpbWF0ZWQgaGVpZ2h0IHRoaXMgd2lkZ2V0IHdpbGwgaGF2ZSwgdG8gYmUgdXNlZCB3aGVuXG4gICAgZXN0aW1hdGluZyB0aGUgaGVpZ2h0IG9mIGNvbnRlbnQgdGhhdCBoYXNuJ3QgYmVlbiBkcmF3bi4gTWF5XG4gICAgcmV0dXJuIC0xIHRvIGluZGljYXRlIHlvdSBkb24ndCBrbm93LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICAgIHJldHVybnMgLTEuXG4gICAgKi9cbiAgICBnZXQgZXN0aW1hdGVkSGVpZ2h0KCkgeyByZXR1cm4gLTE7IH1cbiAgICAvKipcbiAgICBGb3IgaW5saW5lIHdpZGdldHMgdGhhdCBhcmUgZGlzcGxheWVkIGlubGluZSAoYXMgb3Bwb3NlZCB0b1xuICAgIGBpbmxpbmUtYmxvY2tgKSBhbmQgaW50cm9kdWNlIGxpbmUgYnJlYWtzICh0aHJvdWdoIGA8YnI+YCB0YWdzXG4gICAgb3IgdGV4dHVhbCBuZXdsaW5lcyksIHRoaXMgbXVzdCBpbmRpY2F0ZSB0aGUgYW1vdW50IG9mIGxpbmVcbiAgICBicmVha3MgdGhleSBpbnRyb2R1Y2UuIERlZmF1bHRzIHRvIDAuXG4gICAgKi9cbiAgICBnZXQgbGluZUJyZWFrcygpIHsgcmV0dXJuIDA7IH1cbiAgICAvKipcbiAgICBDYW4gYmUgdXNlZCB0byBjb25maWd1cmUgd2hpY2gga2luZHMgb2YgZXZlbnRzIGluc2lkZSB0aGUgd2lkZ2V0XG4gICAgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGVkaXRvci4gVGhlIGRlZmF1bHQgaXMgdG8gaWdub3JlIGFsbFxuICAgIGV2ZW50cy5cbiAgICAqL1xuICAgIGlnbm9yZUV2ZW50KGV2ZW50KSB7IHJldHVybiB0cnVlOyB9XG4gICAgLyoqXG4gICAgT3ZlcnJpZGUgdGhlIHdheSBzY3JlZW4gY29vcmRpbmF0ZXMgZm9yIHBvc2l0aW9ucyBhdC9pbiB0aGVcbiAgICB3aWRnZXQgYXJlIGZvdW5kLiBgcG9zYCB3aWxsIGJlIHRoZSBvZmZzZXQgaW50byB0aGUgd2lkZ2V0LCBhbmRcbiAgICBgc2lkZWAgdGhlIHNpZGUgb2YgdGhlIHBvc2l0aW9uIHRoYXQgaXMgYmVpbmcgcXVlcmllZFx1MjAxNGxlc3MgdGhhblxuICAgIHplcm8gZm9yIGJlZm9yZSwgZ3JlYXRlciB0aGFuIHplcm8gZm9yIGFmdGVyLCBhbmQgemVybyBmb3JcbiAgICBkaXJlY3RseSBhdCB0aGF0IHBvc2l0aW9uLlxuICAgICovXG4gICAgY29vcmRzQXQoZG9tLCBwb3MsIHNpZGUpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgZWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFuIGluc3RhbmNlIG9mIHRoZSB3aWRnZXQgaXMgcmVtb3ZlZFxuICAgIGZyb20gdGhlIGVkaXRvciB2aWV3LlxuICAgICovXG4gICAgZGVzdHJveShkb20pIHsgfVxufVxuLyoqXG5UaGUgZGlmZmVyZW50IHR5cGVzIG9mIGJsb2NrcyB0aGF0IGNhbiBvY2N1ciBpbiBhbiBlZGl0b3Igdmlldy5cbiovXG52YXIgQmxvY2tUeXBlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQmxvY2tUeXBlKSB7XG4gICAgLyoqXG4gICAgQSBsaW5lIG9mIHRleHQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiVGV4dFwiXSA9IDBdID0gXCJUZXh0XCI7XG4gICAgLyoqXG4gICAgQSBibG9jayB3aWRnZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3NpdGlvbiBhZnRlciBpdC5cbiAgICAqL1xuICAgIEJsb2NrVHlwZVtCbG9ja1R5cGVbXCJXaWRnZXRCZWZvcmVcIl0gPSAxXSA9IFwiV2lkZ2V0QmVmb3JlXCI7XG4gICAgLyoqXG4gICAgQSBibG9jayB3aWRnZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3NpdGlvbiBiZWZvcmUgaXQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiV2lkZ2V0QWZ0ZXJcIl0gPSAyXSA9IFwiV2lkZ2V0QWZ0ZXJcIjtcbiAgICAvKipcbiAgICBBIGJsb2NrIHdpZGdldCBbcmVwbGFjaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvbl5yZXBsYWNlKSBhIHJhbmdlIG9mIGNvbnRlbnQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiV2lkZ2V0UmFuZ2VcIl0gPSAzXSA9IFwiV2lkZ2V0UmFuZ2VcIjtcbnJldHVybiBCbG9ja1R5cGV9KShCbG9ja1R5cGUgfHwgKEJsb2NrVHlwZSA9IHt9KSk7XG4vKipcbkEgZGVjb3JhdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZHJhdyBvciBzdHlsZSBhIHBpZWNlXG5vZiBjb250ZW50LiBZb3UnbGwgdXN1YWxseSB1c2UgaXQgd3JhcHBlZCBpbiBhXG5bYFJhbmdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSksIHdoaWNoIGFkZHMgYSBzdGFydCBhbmQgZW5kIHBvc2l0aW9uLlxuQG5vbmFic3RyYWN0XG4qL1xuY2xhc3MgRGVjb3JhdGlvbiBleHRlbmRzIFJhbmdlVmFsdWUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhcnRTaWRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVuZFNpZGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgd2lkZ2V0LCBcbiAgICAvKipcbiAgICBUaGUgY29uZmlnIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRlY29yYXRpb24uIFlvdSBjYW5cbiAgICBpbmNsdWRlIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpbiB0aGVyZSB0byBzdG9yZSBtZXRhZGF0YSBhYm91dFxuICAgIHlvdXIgZGVjb3JhdGlvbi5cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zdGFydFNpZGUgPSBzdGFydFNpZGU7XG4gICAgICAgIHRoaXMuZW5kU2lkZSA9IGVuZFNpZGU7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBoZWlnaHRSZWxldmFudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBkZWNvcmF0aW9uLCB3aGljaCBpbmZsdWVuY2VzIHRoZSBzdHlsaW5nIG9mIHRoZVxuICAgIGNvbnRlbnQgaW4gaXRzIHJhbmdlLiBOZXN0ZWQgbWFyayBkZWNvcmF0aW9ucyB3aWxsIGNhdXNlIG5lc3RlZFxuICAgIERPTSBlbGVtZW50cyB0byBiZSBjcmVhdGVkLiBOZXN0aW5nIG9yZGVyIGlzIGRldGVybWluZWQgYnlcbiAgICBwcmVjZWRlbmNlIG9mIHRoZSBbZmFjZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmRlY29yYXRpb25zKSwgd2l0aFxuICAgIHRoZSBoaWdoZXItcHJlY2VkZW5jZSBkZWNvcmF0aW9ucyBjcmVhdGluZyB0aGUgaW5uZXIgRE9NIG5vZGVzLlxuICAgIFN1Y2ggZWxlbWVudHMgYXJlIHNwbGl0IG9uIGxpbmUgYm91bmRhcmllcyBhbmQgb24gdGhlIGJvdW5kYXJpZXNcbiAgICBvZiBsb3dlci1wcmVjZWRlbmNlIGRlY29yYXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIG1hcmsoc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IE1hcmtEZWNvcmF0aW9uKHNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB3aWRnZXQgZGVjb3JhdGlvbiwgd2hpY2ggZGlzcGxheXMgYSBET00gZWxlbWVudCBhdCB0aGVcbiAgICBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyB3aWRnZXQoc3BlYykge1xuICAgICAgICBsZXQgc2lkZSA9IE1hdGgubWF4KC0xMDAwMCwgTWF0aC5taW4oMTAwMDAsIHNwZWMuc2lkZSB8fCAwKSksIGJsb2NrID0gISFzcGVjLmJsb2NrO1xuICAgICAgICBzaWRlICs9IChibG9jayAmJiAhc3BlYy5pbmxpbmVPcmRlcilcbiAgICAgICAgICAgID8gKHNpZGUgPiAwID8gMzAwMDAwMDAwIC8qIFNpZGUuQmxvY2tBZnRlciAqLyA6IC00MDAwMDAwMDAgLyogU2lkZS5CbG9ja0JlZm9yZSAqLylcbiAgICAgICAgICAgIDogKHNpZGUgPiAwID8gMTAwMDAwMDAwIC8qIFNpZGUuSW5saW5lQWZ0ZXIgKi8gOiAtMTAwMDAwMDAwIC8qIFNpZGUuSW5saW5lQmVmb3JlICovKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludERlY29yYXRpb24oc3BlYywgc2lkZSwgc2lkZSwgYmxvY2ssIHNwZWMud2lkZ2V0IHx8IG51bGwsIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcmVwbGFjZSBkZWNvcmF0aW9uIHdoaWNoIHJlcGxhY2VzIHRoZSBnaXZlbiByYW5nZSB3aXRoXG4gICAgYSB3aWRnZXQsIG9yIHNpbXBseSBoaWRlcyBpdC5cbiAgICAqL1xuICAgIHN0YXRpYyByZXBsYWNlKHNwZWMpIHtcbiAgICAgICAgbGV0IGJsb2NrID0gISFzcGVjLmJsb2NrLCBzdGFydFNpZGUsIGVuZFNpZGU7XG4gICAgICAgIGlmIChzcGVjLmlzQmxvY2tHYXApIHtcbiAgICAgICAgICAgIHN0YXJ0U2lkZSA9IC01MDAwMDAwMDAgLyogU2lkZS5HYXBTdGFydCAqLztcbiAgICAgICAgICAgIGVuZFNpZGUgPSA0MDAwMDAwMDAgLyogU2lkZS5HYXBFbmQgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBnZXRJbmNsdXNpdmUoc3BlYywgYmxvY2spO1xuICAgICAgICAgICAgc3RhcnRTaWRlID0gKHN0YXJ0ID8gKGJsb2NrID8gLTMwMDAwMDAwMCAvKiBTaWRlLkJsb2NrSW5jU3RhcnQgKi8gOiAtMSAvKiBTaWRlLklubGluZUluY1N0YXJ0ICovKSA6IDUwMDAwMDAwMCAvKiBTaWRlLk5vbkluY1N0YXJ0ICovKSAtIDE7XG4gICAgICAgICAgICBlbmRTaWRlID0gKGVuZCA/IChibG9jayA/IDIwMDAwMDAwMCAvKiBTaWRlLkJsb2NrSW5jRW5kICovIDogMSAvKiBTaWRlLklubGluZUluY0VuZCAqLykgOiAtNjAwMDAwMDAwIC8qIFNpZGUuTm9uSW5jRW5kICovKSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludERlY29yYXRpb24oc3BlYywgc3RhcnRTaWRlLCBlbmRTaWRlLCBibG9jaywgc3BlYy53aWRnZXQgfHwgbnVsbCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxpbmUgZGVjb3JhdGlvbiwgd2hpY2ggY2FuIGFkZCBET00gYXR0cmlidXRlcyB0byB0aGVcbiAgICBsaW5lIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBsaW5lKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lRGVjb3JhdGlvbihzcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSBbYERlY29yYXRpb25TZXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvblNldCkgZnJvbSB0aGUgZ2l2ZW5cbiAgICBkZWNvcmF0ZWQgcmFuZ2Ugb3IgcmFuZ2VzLiBJZiB0aGUgcmFuZ2VzIGFyZW4ndCBhbHJlYWR5IHNvcnRlZCxcbiAgICBwYXNzIGB0cnVlYCBmb3IgYHNvcnRgIHRvIG1ha2UgdGhlIGxpYnJhcnkgc29ydCB0aGVtIGZvciB5b3UuXG4gICAgKi9cbiAgICBzdGF0aWMgc2V0KG9mLCBzb3J0ID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlU2V0Lm9mKG9mLCBzb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBoYXNIZWlnaHQoKSB7IHJldHVybiB0aGlzLndpZGdldCA/IHRoaXMud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA+IC0xIDogZmFsc2U7IH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiBkZWNvcmF0aW9ucy5cbiovXG5EZWNvcmF0aW9uLm5vbmUgPSBSYW5nZVNldC5lbXB0eTtcbmNsYXNzIE1hcmtEZWNvcmF0aW9uIGV4dGVuZHMgRGVjb3JhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBnZXRJbmNsdXNpdmUoc3BlYyk7XG4gICAgICAgIHN1cGVyKHN0YXJ0ID8gLTEgLyogU2lkZS5JbmxpbmVJbmNTdGFydCAqLyA6IDUwMDAwMDAwMCAvKiBTaWRlLk5vbkluY1N0YXJ0ICovLCBlbmQgPyAxIC8qIFNpZGUuSW5saW5lSW5jRW5kICovIDogLTYwMDAwMDAwMCAvKiBTaWRlLk5vbkluY0VuZCAqLywgbnVsbCwgc3BlYyk7XG4gICAgICAgIHRoaXMudGFnTmFtZSA9IHNwZWMudGFnTmFtZSB8fCBcInNwYW5cIjtcbiAgICAgICAgdGhpcy5jbGFzcyA9IHNwZWMuY2xhc3MgfHwgXCJcIjtcbiAgICAgICAgdGhpcy5hdHRycyA9IHNwZWMuYXR0cmlidXRlcyB8fCBudWxsO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgb3RoZXIgaW5zdGFuY2VvZiBNYXJrRGVjb3JhdGlvbiAmJlxuICAgICAgICAgICAgICAgIHRoaXMudGFnTmFtZSA9PSBvdGhlci50YWdOYW1lICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuY2xhc3MgfHwgKChfYSA9IHRoaXMuYXR0cnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbGFzcykpID09IChvdGhlci5jbGFzcyB8fCAoKF9iID0gb3RoZXIuYXR0cnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jbGFzcykpICYmXG4gICAgICAgICAgICAgICAgYXR0cnNFcSh0aGlzLmF0dHJzLCBvdGhlci5hdHRycywgXCJjbGFzc1wiKTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmIChmcm9tID49IHRvKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXJrIGRlY29yYXRpb25zIG1heSBub3QgYmUgZW1wdHlcIik7XG4gICAgICAgIHJldHVybiBzdXBlci5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxuTWFya0RlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gZmFsc2U7XG5jbGFzcyBMaW5lRGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgc3VwZXIoLTIwMDAwMDAwMCAvKiBTaWRlLkxpbmUgKi8sIC0yMDAwMDAwMDAgLyogU2lkZS5MaW5lICovLCBudWxsLCBzcGVjKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgTGluZURlY29yYXRpb24gJiZcbiAgICAgICAgICAgIHRoaXMuc3BlYy5jbGFzcyA9PSBvdGhlci5zcGVjLmNsYXNzICYmXG4gICAgICAgICAgICBhdHRyc0VxKHRoaXMuc3BlYy5hdHRyaWJ1dGVzLCBvdGhlci5zcGVjLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgICByYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgaWYgKHRvICE9IGZyb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkxpbmUgZGVjb3JhdGlvbiByYW5nZXMgbXVzdCBiZSB6ZXJvLWxlbmd0aFwiKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5MaW5lRGVjb3JhdGlvbi5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tCZWZvcmU7XG5MaW5lRGVjb3JhdGlvbi5wcm90b3R5cGUucG9pbnQgPSB0cnVlO1xuY2xhc3MgUG9pbnREZWNvcmF0aW9uIGV4dGVuZHMgRGVjb3JhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc3BlYywgc3RhcnRTaWRlLCBlbmRTaWRlLCBibG9jaywgd2lkZ2V0LCBpc1JlcGxhY2UpIHtcbiAgICAgICAgc3VwZXIoc3RhcnRTaWRlLCBlbmRTaWRlLCB3aWRnZXQsIHNwZWMpO1xuICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG4gICAgICAgIHRoaXMuaXNSZXBsYWNlID0gaXNSZXBsYWNlO1xuICAgICAgICB0aGlzLm1hcE1vZGUgPSAhYmxvY2sgPyBNYXBNb2RlLlRyYWNrRGVsIDogc3RhcnRTaWRlIDw9IDAgPyBNYXBNb2RlLlRyYWNrQmVmb3JlIDogTWFwTW9kZS5UcmFja0FmdGVyO1xuICAgIH1cbiAgICAvLyBPbmx5IHJlbGV2YW50IHdoZW4gdGhpcy5ibG9jayA9PSB0cnVlXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0U2lkZSAhPSB0aGlzLmVuZFNpZGUgPyBCbG9ja1R5cGUuV2lkZ2V0UmFuZ2VcbiAgICAgICAgICAgIDogdGhpcy5zdGFydFNpZGUgPD0gMCA/IEJsb2NrVHlwZS5XaWRnZXRCZWZvcmUgOiBCbG9ja1R5cGUuV2lkZ2V0QWZ0ZXI7XG4gICAgfVxuICAgIGdldCBoZWlnaHRSZWxldmFudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2sgfHwgISF0aGlzLndpZGdldCAmJiAodGhpcy53aWRnZXQuZXN0aW1hdGVkSGVpZ2h0ID49IDUgfHwgdGhpcy53aWRnZXQubGluZUJyZWFrcyA+IDApO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBQb2ludERlY29yYXRpb24gJiZcbiAgICAgICAgICAgIHdpZGdldHNFcSh0aGlzLndpZGdldCwgb3RoZXIud2lkZ2V0KSAmJlxuICAgICAgICAgICAgdGhpcy5ibG9jayA9PSBvdGhlci5ibG9jayAmJlxuICAgICAgICAgICAgdGhpcy5zdGFydFNpZGUgPT0gb3RoZXIuc3RhcnRTaWRlICYmIHRoaXMuZW5kU2lkZSA9PSBvdGhlci5lbmRTaWRlO1xuICAgIH1cbiAgICByYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXBsYWNlICYmIChmcm9tID4gdG8gfHwgKGZyb20gPT0gdG8gJiYgdGhpcy5zdGFydFNpZGUgPiAwICYmIHRoaXMuZW5kU2lkZSA8PSAwKSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcmFuZ2UgZm9yIHJlcGxhY2VtZW50IGRlY29yYXRpb25cIik7XG4gICAgICAgIGlmICghdGhpcy5pc1JlcGxhY2UgJiYgdG8gIT0gZnJvbSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiV2lkZ2V0IGRlY29yYXRpb25zIGNhbiBvbmx5IGhhdmUgemVyby1sZW5ndGggcmFuZ2VzXCIpO1xuICAgICAgICByZXR1cm4gc3VwZXIucmFuZ2UoZnJvbSwgdG8pO1xuICAgIH1cbn1cblBvaW50RGVjb3JhdGlvbi5wcm90b3R5cGUucG9pbnQgPSB0cnVlO1xuZnVuY3Rpb24gZ2V0SW5jbHVzaXZlKHNwZWMsIGJsb2NrID0gZmFsc2UpIHtcbiAgICBsZXQgeyBpbmNsdXNpdmVTdGFydDogc3RhcnQsIGluY2x1c2l2ZUVuZDogZW5kIH0gPSBzcGVjO1xuICAgIGlmIChzdGFydCA9PSBudWxsKVxuICAgICAgICBzdGFydCA9IHNwZWMuaW5jbHVzaXZlO1xuICAgIGlmIChlbmQgPT0gbnVsbClcbiAgICAgICAgZW5kID0gc3BlYy5pbmNsdXNpdmU7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0ICE9PSBudWxsICYmIHN0YXJ0ICE9PSB2b2lkIDAgPyBzdGFydCA6IGJsb2NrLCBlbmQ6IGVuZCAhPT0gbnVsbCAmJiBlbmQgIT09IHZvaWQgMCA/IGVuZCA6IGJsb2NrIH07XG59XG5mdW5jdGlvbiB3aWRnZXRzRXEoYSwgYikge1xuICAgIHJldHVybiBhID09IGIgfHwgISEoYSAmJiBiICYmIGEuY29tcGFyZShiKSk7XG59XG5mdW5jdGlvbiBhZGRSYW5nZShmcm9tLCB0bywgcmFuZ2VzLCBtYXJnaW4gPSAwKSB7XG4gICAgbGV0IGxhc3QgPSByYW5nZXMubGVuZ3RoIC0gMTtcbiAgICBpZiAobGFzdCA+PSAwICYmIHJhbmdlc1tsYXN0XSArIG1hcmdpbiA+PSBmcm9tKVxuICAgICAgICByYW5nZXNbbGFzdF0gPSBNYXRoLm1heChyYW5nZXNbbGFzdF0sIHRvKTtcbiAgICBlbHNlXG4gICAgICAgIHJhbmdlcy5wdXNoKGZyb20sIHRvKTtcbn1cblxuY2xhc3MgTGluZVZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hdHRycyA9IG51bGw7XG4gICAgICAgIHRoaXMuYnJlYWtBZnRlciA9IDA7XG4gICAgfVxuICAgIC8vIENvbnN1bWVzIHNvdXJjZVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgTGluZVZpZXcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgc291cmNlLnRyYW5zZmVyRE9NKHRoaXMpOyAvLyBSZXVzZSBzb3VyY2UuZG9tIHdoZW4gYXBwcm9wcmlhdGVcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzU3RhcnQpXG4gICAgICAgICAgICB0aGlzLnNldERlY28oc291cmNlID8gc291cmNlLmF0dHJzIDogbnVsbCk7XG4gICAgICAgIG1lcmdlQ2hpbGRyZW5JbnRvKHRoaXMsIGZyb20sIHRvLCBzb3VyY2UgPyBzb3VyY2UuY2hpbGRyZW4uc2xpY2UoKSA6IFtdLCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3BsaXQoYXQpIHtcbiAgICAgICAgbGV0IGVuZCA9IG5ldyBMaW5lVmlldztcbiAgICAgICAgZW5kLmJyZWFrQWZ0ZXIgPSB0aGlzLmJyZWFrQWZ0ZXI7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgICAgbGV0IHsgaSwgb2ZmIH0gPSB0aGlzLmNoaWxkUG9zKGF0KTtcbiAgICAgICAgaWYgKG9mZikge1xuICAgICAgICAgICAgZW5kLmFwcGVuZCh0aGlzLmNoaWxkcmVuW2ldLnNwbGl0KG9mZiksIDApO1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5tZXJnZShvZmYsIHRoaXMuY2hpbGRyZW5baV0ubGVuZ3RoLCBudWxsLCBmYWxzZSwgMCwgMCk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgZW5kLmFwcGVuZCh0aGlzLmNoaWxkcmVuW2pdLCAwKTtcbiAgICAgICAgd2hpbGUgKGkgPiAwICYmIHRoaXMuY2hpbGRyZW5baSAtIDFdLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlblstLWldLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggPSBpO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGF0O1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH1cbiAgICB0cmFuc2ZlckRPTShvdGhlcikge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICBvdGhlci5zZXRET00odGhpcy5kb20pO1xuICAgICAgICBvdGhlci5wcmV2QXR0cnMgPSB0aGlzLnByZXZBdHRycyA9PT0gdW5kZWZpbmVkID8gdGhpcy5hdHRycyA6IHRoaXMucHJldkF0dHJzO1xuICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5kb20gPSBudWxsO1xuICAgIH1cbiAgICBzZXREZWNvKGF0dHJzKSB7XG4gICAgICAgIGlmICghYXR0cnNFcSh0aGlzLmF0dHJzLCBhdHRycykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldkF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFwcGVuZChjaGlsZCwgb3BlblN0YXJ0KSB7XG4gICAgICAgIGpvaW5JbmxpbmVJbnRvKHRoaXMsIGNoaWxkLCBvcGVuU3RhcnQpO1xuICAgIH1cbiAgICAvLyBPbmx5IGNhbGxlZCB3aGVuIGJ1aWxkaW5nIGEgbGluZSB2aWV3IGluIENvbnRlbnRCdWlsZGVyXG4gICAgYWRkTGluZURlY28oZGVjbykge1xuICAgICAgICBsZXQgYXR0cnMgPSBkZWNvLnNwZWMuYXR0cmlidXRlcywgY2xzID0gZGVjby5zcGVjLmNsYXNzO1xuICAgICAgICBpZiAoYXR0cnMpXG4gICAgICAgICAgICB0aGlzLmF0dHJzID0gY29tYmluZUF0dHJzKGF0dHJzLCB0aGlzLmF0dHJzIHx8IHt9KTtcbiAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSBjb21iaW5lQXR0cnMoeyBjbGFzczogY2xzIH0sIHRoaXMuYXR0cnMgfHwge30pO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIGlubGluZURPTUF0UG9zKHRoaXMsIHBvcyk7XG4gICAgfVxuICAgIHJldXNlRE9NKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJESVZcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRET00obm9kZSk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLyB8IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICB0aGlzLnNldERPTShkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB0aGlzLmF0dHJzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgNCAvKiBWaWV3RmxhZy5BdHRyc0RpcnR5ICovKSB7XG4gICAgICAgICAgICBjbGVhckF0dHJpYnV0ZXModGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1saW5lXCI7XG4gICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHRoaXMuYXR0cnMgPyBudWxsIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByZXZBdHRycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1cGRhdGVBdHRycyh0aGlzLmRvbSwgdGhpcy5wcmV2QXR0cnMsIHRoaXMuYXR0cnMpO1xuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLWxpbmVcIik7XG4gICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmRvbS5sYXN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChsYXN0ICYmIENvbnRlbnRWaWV3LmdldChsYXN0KSBpbnN0YW5jZW9mIE1hcmtWaWV3KVxuICAgICAgICAgICAgbGFzdCA9IGxhc3QubGFzdENoaWxkO1xuICAgICAgICBpZiAoIWxhc3QgfHwgIXRoaXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBsYXN0Lm5vZGVOYW1lICE9IFwiQlJcIiAmJiAoKF9hID0gQ29udGVudFZpZXcuZ2V0KGxhc3QpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNFZGl0YWJsZSkgPT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAoIWJyb3dzZXIuaW9zIHx8ICF0aGlzLmNoaWxkcmVuLnNvbWUoY2ggPT4gY2ggaW5zdGFuY2VvZiBUZXh0VmlldykpKSB7XG4gICAgICAgICAgICBsZXQgaGFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJCUlwiKTtcbiAgICAgICAgICAgIGhhY2suY21JZ25vcmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQoaGFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWVhc3VyZVRleHRTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT0gMCB8fCB0aGlzLmxlbmd0aCA+IDIwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0b3RhbFdpZHRoID0gMCwgdGV4dEhlaWdodDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUZXh0VmlldykgfHwgL1teIC1+XS8udGVzdChjaGlsZC50ZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCByZWN0cyA9IGNsaWVudFJlY3RzRm9yKGNoaWxkLmRvbSk7XG4gICAgICAgICAgICBpZiAocmVjdHMubGVuZ3RoICE9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IHJlY3RzWzBdLndpZHRoO1xuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHJlY3RzWzBdLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRvdGFsV2lkdGggPyBudWxsIDoge1xuICAgICAgICAgICAgbGluZUhlaWdodDogdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LFxuICAgICAgICAgICAgY2hhcldpZHRoOiB0b3RhbFdpZHRoIC8gdGhpcy5sZW5ndGgsXG4gICAgICAgICAgICB0ZXh0SGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgcmVjdCA9IGNvb3Jkc0luQ2hpbGRyZW4odGhpcywgcG9zLCBzaWRlKTtcbiAgICAgICAgLy8gQ29ycmVjdCByZWN0YW5nbGUgaGVpZ2h0IGZvciBlbXB0eSBsaW5lcyB3aGVuIHRoZSByZXR1cm5lZFxuICAgICAgICAvLyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHRleHQgaGVpZ2h0LlxuICAgICAgICBpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHJlY3QgJiYgdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGxldCB7IGhlaWdodE9yYWNsZSB9ID0gdGhpcy5wYXJlbnQudmlldy52aWV3U3RhdGUsIGhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQpIDwgMiAmJiBoZWlnaHRPcmFjbGUudGV4dEhlaWdodCA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXN0ID0gKGhlaWdodCAtIGhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCArIGRpc3QsIGJvdHRvbTogcmVjdC5ib3R0b20gLSBkaXN0LCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIExpbmVWaWV3ICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDAgJiYgb3RoZXIuY2hpbGRyZW4ubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgIGF0dHJzRXEodGhpcy5hdHRycywgb3RoZXIuYXR0cnMpICYmIHRoaXMuYnJlYWtBZnRlciA9PSBvdGhlci5icmVha0FmdGVyO1xuICAgIH1cbiAgICBjb3ZlcnMoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgc3RhdGljIGZpbmQoZG9jVmlldywgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgZG9jVmlldy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGJsb2NrID0gZG9jVmlldy5jaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgYmxvY2subGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2sgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gZW5kICsgYmxvY2suYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5jbGFzcyBCbG9ja1dpZGdldFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3Iod2lkZ2V0LCBsZW5ndGgsIGRlY28pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmRlY28gPSBkZWNvO1xuICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSAwO1xuICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgIH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBfdGFrZURlY28sIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICBpZiAoc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldykgfHwgIXRoaXMud2lkZ2V0LmNvbXBhcmUoc291cmNlLndpZGdldCkgfHxcbiAgICAgICAgICAgIGZyb20gPiAwICYmIG9wZW5TdGFydCA8PSAwIHx8IHRvIDwgdGhpcy5sZW5ndGggJiYgb3BlbkVuZCA8PSAwKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmcm9tICsgKHNvdXJjZSA/IHNvdXJjZS5sZW5ndGggOiAwKSArICh0aGlzLmxlbmd0aCAtIHRvKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gcG9zID09IDAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKSA6IERPTVBvcy5hZnRlcih0aGlzLmRvbSwgcG9zID09IHRoaXMubGVuZ3RoKTtcbiAgICB9XG4gICAgc3BsaXQoYXQpIHtcbiAgICAgICAgbGV0IGxlbiA9IHRoaXMubGVuZ3RoIC0gYXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gYXQ7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgQmxvY2tXaWRnZXRWaWV3KHRoaXMud2lkZ2V0LCBsZW4sIHRoaXMuZGVjbyk7XG4gICAgICAgIGVuZC5icmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyO1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH1cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiBub0NoaWxkcmVuOyB9XG4gICAgc3luYyh2aWV3KSB7XG4gICAgICAgIGlmICghdGhpcy5kb20gfHwgIXRoaXMud2lkZ2V0LnVwZGF0ZURPTSh0aGlzLmRvbSwgdmlldykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiB0aGlzLnByZXZXaWRnZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKHRoaXMud2lkZ2V0LnRvRE9NKHZpZXcpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWRnZXQuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnZpZXcuc3RhdGUuZG9jLnNsaWNlKHRoaXMucG9zQXRTdGFydCwgdGhpcy5wb3NBdEVuZCkgOiBUZXh0LmVtcHR5O1xuICAgIH1cbiAgICBkb21Cb3VuZHNBcm91bmQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJlxuICAgICAgICAgICAgb3RoZXIud2lkZ2V0LmNvbnN0cnVjdG9yID09IHRoaXMud2lkZ2V0LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBpZiAoIW90aGVyLndpZGdldC5jb21wYXJlKHRoaXMud2lkZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiAhdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IHRoaXMud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy53aWRnZXQgPSBvdGhlci53aWRnZXQ7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG90aGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjbyA9IG90aGVyLmRlY287XG4gICAgICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBvdGhlci5icmVha0FmdGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbigpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdGhpcy53aWRnZXQuaWdub3JlRXZlbnQoZXZlbnQpOyB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHRoaXMud2lkZ2V0LmNvb3Jkc0F0KHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0IGluc3RhbmNlb2YgQmxvY2tHYXBXaWRnZXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5SZWN0KHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB0aGlzLmxlbmd0aCA/IHBvcyA9PSAwIDogc2lkZSA8PSAwKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICB9XG4gICAgY292ZXJzKHNpZGUpIHtcbiAgICAgICAgbGV0IHsgc3RhcnRTaWRlLCBlbmRTaWRlIH0gPSB0aGlzLmRlY287XG4gICAgICAgIHJldHVybiBzdGFydFNpZGUgPT0gZW5kU2lkZSA/IGZhbHNlIDogc2lkZSA8IDAgPyBzdGFydFNpZGUgPCAwIDogZW5kU2lkZSA+IDA7XG4gICAgfVxufVxuY2xhc3MgQmxvY2tHYXBXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihoZWlnaHQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICAgIHRvRE9NKCkge1xuICAgICAgICBsZXQgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZWx0LmNsYXNzTmFtZSA9IFwiY20tZ2FwXCI7XG4gICAgICAgIHRoaXMudXBkYXRlRE9NKGVsdCk7XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5oZWlnaHQgPT0gdGhpcy5oZWlnaHQ7IH1cbiAgICB1cGRhdGVET00oZWx0KSB7XG4gICAgICAgIGVsdC5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCArIFwicHhcIjtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBlZGl0YWJsZSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgZXN0aW1hdGVkSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy5oZWlnaHQ7IH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbmNsYXNzIENvbnRlbnRCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihkb2MsIHBvcywgZW5kLCBkaXNhbGxvd0Jsb2NrRWZmZWN0c0Zvcikge1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgICAgICB0aGlzLmRpc2FsbG93QmxvY2tFZmZlY3RzRm9yID0gZGlzYWxsb3dCbG9ja0VmZmVjdHNGb3I7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmJyZWFrQXRTdGFydCA9IDA7XG4gICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICB0aGlzLmJ1ZmZlck1hcmtzID0gW107XG4gICAgICAgIC8vIFNldCB0byBmYWxzZSBkaXJlY3RseSBhZnRlciBhIHdpZGdldCB0aGF0IGNvdmVycyB0aGUgcG9zaXRpb24gYWZ0ZXIgaXRcbiAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMub3BlbkVuZCA9IC0xO1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLnRleHRPZmYgPSAwO1xuICAgICAgICB0aGlzLmN1cnNvciA9IGRvYy5pdGVyKCk7XG4gICAgICAgIHRoaXMuc2tpcCA9IHBvcztcbiAgICB9XG4gICAgcG9zQ292ZXJlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5icmVha0F0U3RhcnQgJiYgdGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS5mcm9tICE9IHRoaXMucG9zO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiAhKGxhc3QuYnJlYWtBZnRlciB8fCBsYXN0IGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3ICYmIGxhc3QuZGVjby5lbmRTaWRlIDwgMCk7XG4gICAgfVxuICAgIGdldExpbmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJMaW5lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQucHVzaCh0aGlzLmN1ckxpbmUgPSBuZXcgTGluZVZpZXcpO1xuICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyTGluZTtcbiAgICB9XG4gICAgZmx1c2hCdWZmZXIoYWN0aXZlID0gdGhpcy5idWZmZXJNYXJrcykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1ckxpbmUuYXBwZW5kKHdyYXBNYXJrcyhuZXcgV2lkZ2V0QnVmZmVyVmlldygtMSksIGFjdGl2ZSksIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gMCAvKiBCdWYuTm8gKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkQmxvY2tXaWRnZXQodmlldykge1xuICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuY3VyTGluZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udGVudC5wdXNoKHZpZXcpO1xuICAgIH1cbiAgICBmaW5pc2gob3BlbkVuZCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyICYmIG9wZW5FbmQgPD0gdGhpcy5idWZmZXJNYXJrcy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICBpZiAoIXRoaXMucG9zQ292ZXJlZCgpICYmXG4gICAgICAgICAgICAhKG9wZW5FbmQgJiYgdGhpcy5jb250ZW50Lmxlbmd0aCAmJiB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3KSlcbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgIH1cbiAgICBidWlsZFRleHQobGVuZ3RoLCBhY3RpdmUsIG9wZW5TdGFydCkge1xuICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGV4dE9mZiA9PSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdmFsdWUsIGxpbmVCcmVhaywgZG9uZSB9ID0gdGhpcy5jdXJzb3IubmV4dCh0aGlzLnNraXApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJhbiBvdXQgb2YgdGV4dCBjb250ZW50IHdoZW4gZHJhd2luZyBpbmxpbmUgdmlld3NcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVCcmVhaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucG9zQ292ZXJlZCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXS5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icmVha0F0U3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyTGluZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdGFrZSA9IE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSB0aGlzLnRleHRPZmYsIGxlbmd0aCwgNTEyIC8qIFQuQ2h1bmsgKi8pO1xuICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcihhY3RpdmUuc2xpY2UoYWN0aXZlLmxlbmd0aCAtIG9wZW5TdGFydCkpO1xuICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCkuYXBwZW5kKHdyYXBNYXJrcyhuZXcgVGV4dFZpZXcodGhpcy50ZXh0LnNsaWNlKHRoaXMudGV4dE9mZiwgdGhpcy50ZXh0T2ZmICsgdGFrZSkpLCBhY3RpdmUpLCBvcGVuU3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRleHRPZmYgKz0gdGFrZTtcbiAgICAgICAgICAgIGxlbmd0aCAtPSB0YWtlO1xuICAgICAgICAgICAgb3BlblN0YXJ0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzcGFuKGZyb20sIHRvLCBhY3RpdmUsIG9wZW5TdGFydCkge1xuICAgICAgICB0aGlzLmJ1aWxkVGV4dCh0byAtIGZyb20sIGFjdGl2ZSwgb3BlblN0YXJ0KTtcbiAgICAgICAgdGhpcy5wb3MgPSB0bztcbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgIH1cbiAgICBwb2ludChmcm9tLCB0bywgZGVjbywgYWN0aXZlLCBvcGVuU3RhcnQsIGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FsbG93QmxvY2tFZmZlY3RzRm9yW2luZGV4XSAmJiBkZWNvIGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZGVjby5ibG9jaylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJsb2NrIGRlY29yYXRpb25zIG1heSBub3QgYmUgc3BlY2lmaWVkIHZpYSBwbHVnaW5zXCIpO1xuICAgICAgICAgICAgaWYgKHRvID4gdGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS50bylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkRlY29yYXRpb25zIHRoYXQgcmVwbGFjZSBsaW5lIGJyZWFrcyBtYXkgbm90IGJlIHNwZWNpZmllZCB2aWEgcGx1Z2luc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGVuID0gdG8gLSBmcm9tO1xuICAgICAgICBpZiAoZGVjbyBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjby5zdGFydFNpZGUgPiAwICYmICF0aGlzLnBvc0NvdmVyZWQoKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRCbG9ja1dpZGdldChuZXcgQmxvY2tXaWRnZXRWaWV3KGRlY28ud2lkZ2V0IHx8IE51bGxXaWRnZXQuYmxvY2ssIGxlbiwgZGVjbykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHZpZXcgPSBXaWRnZXRWaWV3LmNyZWF0ZShkZWNvLndpZGdldCB8fCBOdWxsV2lkZ2V0LmlubGluZSwgbGVuLCBsZW4gPyAwIDogZGVjby5zdGFydFNpZGUpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3JCZWZvcmUgPSB0aGlzLmF0Q3Vyc29yUG9zICYmICF2aWV3LmlzRWRpdGFibGUgJiYgb3BlblN0YXJ0IDw9IGFjdGl2ZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKGZyb20gPCB0byB8fCBkZWNvLnN0YXJ0U2lkZSA+IDApO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3JBZnRlciA9ICF2aWV3LmlzRWRpdGFibGUgJiYgKGZyb20gPCB0byB8fCBvcGVuU3RhcnQgPiBhY3RpdmUubGVuZ3RoIHx8IGRlY28uc3RhcnRTaWRlIDw9IDApO1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlciA9PSAyIC8qIEJ1Zi5JZkN1cnNvciAqLyAmJiAhY3Vyc29yQmVmb3JlICYmICF2aWV3LmlzRWRpdGFibGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hCdWZmZXIoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yQmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHdyYXBNYXJrcyhuZXcgV2lkZ2V0QnVmZmVyVmlldygxKSwgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgb3BlblN0YXJ0ID0gYWN0aXZlLmxlbmd0aCArIE1hdGgubWF4KDAsIG9wZW5TdGFydCAtIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh3cmFwTWFya3ModmlldywgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0Q3Vyc29yUG9zID0gY3Vyc29yQWZ0ZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gIWN1cnNvckFmdGVyID8gMCAvKiBCdWYuTm8gKi8gOiBmcm9tIDwgdG8gfHwgb3BlblN0YXJ0ID4gYWN0aXZlLmxlbmd0aCA/IDEgLyogQnVmLlllcyAqLyA6IDIgLyogQnVmLklmQ3Vyc29yICovO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdCdWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyTWFya3MgPSBhY3RpdmUuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmRvYy5saW5lQXQodGhpcy5wb3MpLmZyb20gPT0gdGhpcy5wb3MpIHsgLy8gTGluZSBkZWNvcmF0aW9uXG4gICAgICAgICAgICB0aGlzLmdldExpbmUoKS5hZGRMaW5lRGVjbyhkZWNvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBpdGVyYXRvciBwYXN0IHRoZSByZXBsYWNlZCBjb250ZW50XG4gICAgICAgICAgICBpZiAodGhpcy50ZXh0T2ZmICsgbGVuIDw9IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPZmYgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwICs9IGxlbiAtICh0aGlzLnRleHQubGVuZ3RoIC0gdGhpcy50ZXh0T2ZmKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHRvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICB9XG4gICAgc3RhdGljIGJ1aWxkKHRleHQsIGZyb20sIHRvLCBkZWNvcmF0aW9ucywgZHluYW1pY0RlY29yYXRpb25NYXApIHtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgQ29udGVudEJ1aWxkZXIodGV4dCwgZnJvbSwgdG8sIGR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgYnVpbGRlci5vcGVuRW5kID0gUmFuZ2VTZXQuc3BhbnMoZGVjb3JhdGlvbnMsIGZyb20sIHRvLCBidWlsZGVyKTtcbiAgICAgICAgaWYgKGJ1aWxkZXIub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIGJ1aWxkZXIub3BlblN0YXJ0ID0gYnVpbGRlci5vcGVuRW5kO1xuICAgICAgICBidWlsZGVyLmZpbmlzaChidWlsZGVyLm9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG59XG5mdW5jdGlvbiB3cmFwTWFya3ModmlldywgYWN0aXZlKSB7XG4gICAgZm9yIChsZXQgbWFyayBvZiBhY3RpdmUpXG4gICAgICAgIHZpZXcgPSBuZXcgTWFya1ZpZXcobWFyaywgW3ZpZXddLCB2aWV3Lmxlbmd0aCk7XG4gICAgcmV0dXJuIHZpZXc7XG59XG5jbGFzcyBOdWxsV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IodGFnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIudGFnID09IHRoaXMudGFnOyB9XG4gICAgdG9ET00oKSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMudGFnKTsgfVxuICAgIHVwZGF0ZURPTShlbHQpIHsgcmV0dXJuIGVsdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IHRoaXMudGFnOyB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuTnVsbFdpZGdldC5pbmxpbmUgPSAvKkBfX1BVUkVfXyovbmV3IE51bGxXaWRnZXQoXCJzcGFuXCIpO1xuTnVsbFdpZGdldC5ibG9jayA9IC8qQF9fUFVSRV9fKi9uZXcgTnVsbFdpZGdldChcImRpdlwiKTtcblxuLyoqXG5Vc2VkIHRvIGluZGljYXRlIFt0ZXh0IGRpcmVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbikuXG4qL1xudmFyIERpcmVjdGlvbiA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKERpcmVjdGlvbikge1xuICAgIC8vIChUaGVzZSBhcmUgY2hvc2VuIHRvIG1hdGNoIHRoZSBiYXNlIGxldmVscywgaW4gYmlkaSBhbGdvcml0aG1cbiAgICAvLyB0ZXJtcywgb2Ygc3BhbnMgaW4gdGhhdCBkaXJlY3Rpb24uKVxuICAgIC8qKlxuICAgIExlZnQtdG8tcmlnaHQuXG4gICAgKi9cbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiTFRSXCJdID0gMF0gPSBcIkxUUlwiO1xuICAgIC8qKlxuICAgIFJpZ2h0LXRvLWxlZnQuXG4gICAgKi9cbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiUlRMXCJdID0gMV0gPSBcIlJUTFwiO1xucmV0dXJuIERpcmVjdGlvbn0pKERpcmVjdGlvbiB8fCAoRGlyZWN0aW9uID0ge30pKTtcbmNvbnN0IExUUiA9IERpcmVjdGlvbi5MVFIsIFJUTCA9IERpcmVjdGlvbi5SVEw7XG4vLyBEZWNvZGUgYSBzdHJpbmcgd2l0aCBlYWNoIHR5cGUgZW5jb2RlZCBhcyBsb2cyKHR5cGUpXG5mdW5jdGlvbiBkZWMoc3RyKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKVxuICAgICAgICByZXN1bHQucHVzaCgxIDw8ICtzdHJbaV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMCB0byAweGY4XG5jb25zdCBMb3dUeXBlcyA9IC8qQF9fUFVSRV9fKi9kZWMoXCI4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODY2Njg4ODg4ODc4NzgzMzMzMzMzMzMzNzg4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4Nzg2NjY2ODg4ODA4ODg4ODY2MzM4MDg4ODMwODg4ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOFwiKTtcbi8vIENoYXJhY3RlciB0eXBlcyBmb3IgY29kZXBvaW50cyAweDYwMCB0byAweDZmOVxuY29uc3QgQXJhYmljVHlwZXMgPSAvKkBfX1BVUkVfXyovZGVjKFwiNDQ0NDQ0ODgyNjYyNzI4ODk5OTk5OTk5OTk5MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyOTk5OTk5OTk5OTk5OTk5OTk5OTk5NDQ0NDQ0NDQ0NDY0NDIyMjgyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjk5OTk5OTk0OTk5OTk5OTIyOTk4OTk5OTIyMzMzMzMzMzMzM1wiKTtcbmNvbnN0IEJyYWNrZXRzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCksIEJyYWNrZXRTdGFjayA9IFtdO1xuLy8gVGhlcmUncyBhIGxvdCBtb3JlIGluXG4vLyBodHRwczovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvVUNEL2xhdGVzdC91Y2QvQmlkaUJyYWNrZXRzLnR4dCxcbi8vIHdoaWNoIGFyZSBsZWZ0IG91dCB0byBrZWVwIGNvZGUgc2l6ZSBkb3duLlxuZm9yIChsZXQgcCBvZiBbXCIoKVwiLCBcIltdXCIsIFwie31cIl0pIHtcbiAgICBsZXQgbCA9IC8qQF9fUFVSRV9fKi9wLmNoYXJDb2RlQXQoMCksIHIgPSAvKkBfX1BVUkVfXyovcC5jaGFyQ29kZUF0KDEpO1xuICAgIEJyYWNrZXRzW2xdID0gcjtcbiAgICBCcmFja2V0c1tyXSA9IC1sO1xufVxuZnVuY3Rpb24gY2hhclR5cGUoY2gpIHtcbiAgICByZXR1cm4gY2ggPD0gMHhmNyA/IExvd1R5cGVzW2NoXSA6XG4gICAgICAgIDB4NTkwIDw9IGNoICYmIGNoIDw9IDB4NWY0ID8gMiAvKiBULlIgKi8gOlxuICAgICAgICAgICAgMHg2MDAgPD0gY2ggJiYgY2ggPD0gMHg2ZjkgPyBBcmFiaWNUeXBlc1tjaCAtIDB4NjAwXSA6XG4gICAgICAgICAgICAgICAgMHg2ZWUgPD0gY2ggJiYgY2ggPD0gMHg4YWMgPyA0IC8qIFQuQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAweDIwMDAgPD0gY2ggJiYgY2ggPD0gMHgyMDBjID8gMjU2IC8qIFQuTkkgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgMHhmYjUwIDw9IGNoICYmIGNoIDw9IDB4ZmRmZiA/IDQgLyogVC5BTCAqLyA6IDEgLyogVC5MICovO1xufVxuY29uc3QgQmlkaVJFID0gL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNcXHVmYjUwLVxcdWZkZmZdLztcbi8qKlxuUmVwcmVzZW50cyBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgdGV4dCB0aGF0IGhhcyBhIHNpbmdsZSBkaXJlY3Rpb25cbihhcyBpbiBsZWZ0LXRvLXJpZ2h0IG9yIHJpZ2h0LXRvLWxlZnQpLlxuKi9cbmNsYXNzIEJpZGlTcGFuIHtcbiAgICAvKipcbiAgICBUaGUgZGlyZWN0aW9uIG9mIHRoaXMgc3Bhbi5cbiAgICAqL1xuICAgIGdldCBkaXIoKSB7IHJldHVybiB0aGlzLmxldmVsICUgMiA/IFJUTCA6IExUUjsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBzcGFuIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUpLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgc3Bhbi5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgW1wiYmlkaVxuICAgIGxldmVsXCJdKGh0dHBzOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjkvI0Jhc2ljX0Rpc3BsYXlfQWxnb3JpdGhtKVxuICAgIG9mIHRoZSBzcGFuIChpbiB0aGlzIGNvbnRleHQsIDAgbWVhbnNcbiAgICBsZWZ0LXRvLXJpZ2h0LCAxIG1lYW5zIHJpZ2h0LXRvLWxlZnQsIDIgbWVhbnMgbGVmdC10by1yaWdodFxuICAgIG51bWJlciBpbnNpZGUgcmlnaHQtdG8tbGVmdCB0ZXh0KS5cbiAgICAqL1xuICAgIGxldmVsKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNpZGUoZW5kLCBkaXIpIHsgcmV0dXJuICh0aGlzLmRpciA9PSBkaXIpID09IGVuZCA/IHRoaXMudG8gOiB0aGlzLmZyb207IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZvcndhcmQoZm9yd2FyZCwgZGlyKSB7IHJldHVybiBmb3J3YXJkID09ICh0aGlzLmRpciA9PSBkaXIpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZChvcmRlciwgaW5kZXgsIGxldmVsLCBhc3NvYykge1xuICAgICAgICBsZXQgbWF5YmUgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHNwYW4gPSBvcmRlcltpXTtcbiAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPD0gaW5kZXggJiYgc3Bhbi50byA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFuLmxldmVsID09IGxldmVsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIG11bHRpcGxlIHNwYW5zIG1hdGNoLCBpZiBhc3NvYyAhPSAwLCB0YWtlIHRoZSBvbmUgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGNvdmVycyB0aGF0IHNpZGUsIG90aGVyd2lzZSB0YWtlIHRoZSBvbmUgd2l0aCB0aGUgbWluaW11bVxuICAgICAgICAgICAgICAgIC8vIGxldmVsLlxuICAgICAgICAgICAgICAgIGlmIChtYXliZSA8IDAgfHwgKGFzc29jICE9IDAgPyAoYXNzb2MgPCAwID8gc3Bhbi5mcm9tIDwgaW5kZXggOiBzcGFuLnRvID4gaW5kZXgpIDogb3JkZXJbbWF5YmVdLmxldmVsID4gc3Bhbi5sZXZlbCkpXG4gICAgICAgICAgICAgICAgICAgIG1heWJlID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmUgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICAgIHJldHVybiBtYXliZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc29sYXRlc0VxKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGlBID0gYVtpXSwgaUIgPSBiW2ldO1xuICAgICAgICBpZiAoaUEuZnJvbSAhPSBpQi5mcm9tIHx8IGlBLnRvICE9IGlCLnRvIHx8IGlBLmRpcmVjdGlvbiAhPSBpQi5kaXJlY3Rpb24gfHwgIWlzb2xhdGVzRXEoaUEuaW5uZXIsIGlCLmlubmVyKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBSZXVzZWQgYXJyYXkgb2YgY2hhcmFjdGVyIHR5cGVzXG5jb25zdCB0eXBlcyA9IFtdO1xuLy8gRmlsbCBpbiB0aGUgY2hhcmFjdGVyIHR5cGVzIChpbiBgdHlwZXNgKSBmcm9tIGBmcm9tYCB0byBgdG9gIGFuZFxuLy8gYXBwbHkgVyBub3JtYWxpemF0aW9uIHJ1bGVzLlxuZnVuY3Rpb24gY29tcHV0ZUNoYXJUeXBlcyhsaW5lLCByRnJvbSwgclRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKSB7XG4gICAgZm9yIChsZXQgaUkgPSAwOyBpSSA8PSBpc29sYXRlcy5sZW5ndGg7IGlJKyspIHtcbiAgICAgICAgbGV0IGZyb20gPSBpSSA/IGlzb2xhdGVzW2lJIC0gMV0udG8gOiByRnJvbSwgdG8gPSBpSSA8IGlzb2xhdGVzLmxlbmd0aCA/IGlzb2xhdGVzW2lJXS5mcm9tIDogclRvO1xuICAgICAgICBsZXQgcHJldlR5cGUgPSBpSSA/IDI1NiAvKiBULk5JICovIDogb3V0ZXJUeXBlO1xuICAgICAgICAvLyBXMS4gRXhhbWluZSBlYWNoIG5vbi1zcGFjaW5nIG1hcmsgKE5TTSkgaW4gdGhlIGxldmVsIHJ1biwgYW5kXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgTlNNIHRvIHRoZSB0eXBlIG9mIHRoZSBwcmV2aW91c1xuICAgICAgICAvLyBjaGFyYWN0ZXIuIElmIHRoZSBOU00gaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsZXZlbCBydW4sIGl0IHdpbGxcbiAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIG9mIHNvci5cbiAgICAgICAgLy8gVzIuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyXG4gICAgICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgQUwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuXG4gICAgICAgIC8vIEFMIGlzIGZvdW5kLCBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBBcmFiaWNcbiAgICAgICAgLy8gbnVtYmVyLlxuICAgICAgICAvLyBXMy4gQ2hhbmdlIGFsbCBBTHMgdG8gUi5cbiAgICAgICAgLy8gKExlZnQgYWZ0ZXIgdGhpczogTCwgUiwgRU4sIEFOLCBFVCwgQ1MsIE5JKVxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbSwgcHJldiA9IHByZXZUeXBlLCBwcmV2U3Ryb25nID0gcHJldlR5cGU7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IGNoYXJUeXBlKGxpbmUuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSA1MTIgLyogVC5OU00gKi8pXG4gICAgICAgICAgICAgICAgdHlwZSA9IHByZXY7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDggLyogVC5FTiAqLyAmJiBwcmV2U3Ryb25nID09IDQgLyogVC5BTCAqLylcbiAgICAgICAgICAgICAgICB0eXBlID0gMTYgLyogVC5BTiAqLztcbiAgICAgICAgICAgIHR5cGVzW2ldID0gdHlwZSA9PSA0IC8qIFQuQUwgKi8gPyAyIC8qIFQuUiAqLyA6IHR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZSAmIDcgLyogVC5TdHJvbmcgKi8pXG4gICAgICAgICAgICAgICAgcHJldlN0cm9uZyA9IHR5cGU7XG4gICAgICAgICAgICBwcmV2ID0gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXNS4gQSBzZXF1ZW5jZSBvZiBFdXJvcGVhbiB0ZXJtaW5hdG9ycyBhZGphY2VudCB0byBFdXJvcGVhblxuICAgICAgICAvLyBudW1iZXJzIGNoYW5nZXMgdG8gYWxsIEV1cm9wZWFuIG51bWJlcnMuXG4gICAgICAgIC8vIFc2LiBPdGhlcndpc2UsIHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzIGNoYW5nZSB0byBPdGhlclxuICAgICAgICAvLyBOZXV0cmFsLlxuICAgICAgICAvLyBXNy4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXJcbiAgICAgICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhbiBMIGlzXG4gICAgICAgIC8vIGZvdW5kLCB0aGVuIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEwuXG4gICAgICAgIC8vIChMZWZ0IGFmdGVyIHRoaXM6IEwsIFIsIEVOK0FOLCBOSSlcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb20sIHByZXYgPSBwcmV2VHlwZSwgcHJldlN0cm9uZyA9IHByZXZUeXBlOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IDEyOCAvKiBULkNTICovKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCB0byAtIDEgJiYgcHJldiA9PSB0eXBlc1tpICsgMV0gJiYgKHByZXYgJiAyNCAvKiBULk51bSAqLykpXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlc1tpXSA9IHByZXY7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0eXBlc1tpXSA9IDI1NiAvKiBULk5JICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA2NCAvKiBULkVUICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIHdoaWxlIChlbmQgPCB0byAmJiB0eXBlc1tlbmRdID09IDY0IC8qIFQuRVQgKi8pXG4gICAgICAgICAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gKGkgJiYgcHJldiA9PSA4IC8qIFQuRU4gKi8pIHx8IChlbmQgPCByVG8gJiYgdHlwZXNbZW5kXSA9PSA4IC8qIFQuRU4gKi8pID8gKHByZXZTdHJvbmcgPT0gMSAvKiBULkwgKi8gPyAxIC8qIFQuTCAqLyA6IDggLyogVC5FTiAqLykgOiAyNTYgLyogVC5OSSAqLztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGVuZDsgaisrKVxuICAgICAgICAgICAgICAgICAgICB0eXBlc1tqXSA9IHJlcGxhY2U7XG4gICAgICAgICAgICAgICAgaSA9IGVuZCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDggLyogVC5FTiAqLyAmJiBwcmV2U3Ryb25nID09IDEgLyogVC5MICovKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbaV0gPSAxIC8qIFQuTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXYgPSB0eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGUgJiA3IC8qIFQuU3Ryb25nICovKVxuICAgICAgICAgICAgICAgIHByZXZTdHJvbmcgPSB0eXBlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gUHJvY2VzcyBicmFja2V0cyB0aHJvdWdob3V0IGEgcnVuIHNlcXVlbmNlLlxuZnVuY3Rpb24gcHJvY2Vzc0JyYWNrZXRQYWlycyhsaW5lLCByRnJvbSwgclRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKSB7XG4gICAgbGV0IG9wcG9zaXRlVHlwZSA9IG91dGVyVHlwZSA9PSAxIC8qIFQuTCAqLyA/IDIgLyogVC5SICovIDogMSAvKiBULkwgKi87XG4gICAgZm9yIChsZXQgaUkgPSAwLCBzSSA9IDAsIGNvbnRleHQgPSAwOyBpSSA8PSBpc29sYXRlcy5sZW5ndGg7IGlJKyspIHtcbiAgICAgICAgbGV0IGZyb20gPSBpSSA/IGlzb2xhdGVzW2lJIC0gMV0udG8gOiByRnJvbSwgdG8gPSBpSSA8IGlzb2xhdGVzLmxlbmd0aCA/IGlzb2xhdGVzW2lJXS5mcm9tIDogclRvO1xuICAgICAgICAvLyBOMC4gUHJvY2VzcyBicmFja2V0IHBhaXJzIGluIGFuIGlzb2xhdGluZyBydW4gc2VxdWVuY2VcbiAgICAgICAgLy8gc2VxdWVudGlhbGx5IGluIHRoZSBsb2dpY2FsIG9yZGVyIG9mIHRoZSB0ZXh0IHBvc2l0aW9ucyBvZiB0aGVcbiAgICAgICAgLy8gb3BlbmluZyBwYWlyZWQgYnJhY2tldHMgdXNpbmcgdGhlIGxvZ2ljIGdpdmVuIGJlbG93LiBXaXRoaW4gdGhpc1xuICAgICAgICAvLyBzY29wZSwgYmlkaXJlY3Rpb25hbCB0eXBlcyBFTiBhbmQgQU4gYXJlIHRyZWF0ZWQgYXMgUi5cbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb20sIGNoLCBiciwgdHlwZTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEtlZXBzIFtzdGFydEluZGV4LCB0eXBlLCBzdHJvbmdTZWVuXSB0cmlwbGVzIGZvciBlYWNoIG9wZW5cbiAgICAgICAgICAgIC8vIGJyYWNrZXQgb24gQnJhY2tldFN0YWNrLlxuICAgICAgICAgICAgaWYgKGJyID0gQnJhY2tldHNbY2ggPSBsaW5lLmNoYXJDb2RlQXQoaSldKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJyIDwgMCkgeyAvLyBDbG9zaW5nIGJyYWNrZXRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc0ogPSBzSSAtIDM7IHNKID49IDA7IHNKIC09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCcmFja2V0U3RhY2tbc0ogKyAxXSA9PSAtYnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmxhZ3MgPSBCcmFja2V0U3RhY2tbc0ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IChmbGFncyAmIDIgLyogQnJhY2tldGVkLkVtYmVkSW5zaWRlICovKSA/IG91dGVyVHlwZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZmxhZ3MgJiA0IC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUluc2lkZSAqLykgPyAwIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIDEgLyogQnJhY2tldGVkLk9wcG9zaXRlQmVmb3JlICovKSA/IG9wcG9zaXRlVHlwZSA6IG91dGVyVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXNbaV0gPSB0eXBlc1tCcmFja2V0U3RhY2tbc0pdXSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc0kgPSBzSjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChCcmFja2V0U3RhY2subGVuZ3RoID09IDE4OSAvKiBCcmFja2V0ZWQuTWF4RGVwdGggKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0krK10gPSBpO1xuICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0krK10gPSBjaDtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgodHlwZSA9IHR5cGVzW2ldKSA9PSAyIC8qIFQuUiAqLyB8fCB0eXBlID09IDEgLyogVC5MICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVtYmVkID0gdHlwZSA9PSBvdXRlclR5cGU7XG4gICAgICAgICAgICAgICAgY29udGV4dCA9IGVtYmVkID8gMCA6IDEgLyogQnJhY2tldGVkLk9wcG9zaXRlQmVmb3JlICovO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNKID0gc0kgLSAzOyBzSiA+PSAwOyBzSiAtPSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXIgPSBCcmFja2V0U3RhY2tbc0ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciAmIDIgLyogQnJhY2tldGVkLkVtYmVkSW5zaWRlICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbWJlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NKICsgMl0gfD0gMiAvKiBCcmFja2V0ZWQuRW1iZWRJbnNpZGUgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyICYgNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0ogKyAyXSB8PSA0IC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUluc2lkZSAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHByb2Nlc3NOZXV0cmFscyhyRnJvbSwgclRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKSB7XG4gICAgZm9yIChsZXQgaUkgPSAwLCBwcmV2ID0gb3V0ZXJUeXBlOyBpSSA8PSBpc29sYXRlcy5sZW5ndGg7IGlJKyspIHtcbiAgICAgICAgbGV0IGZyb20gPSBpSSA/IGlzb2xhdGVzW2lJIC0gMV0udG8gOiByRnJvbSwgdG8gPSBpSSA8IGlzb2xhdGVzLmxlbmd0aCA/IGlzb2xhdGVzW2lJXS5mcm9tIDogclRvO1xuICAgICAgICAvLyBOMS4gQSBzZXF1ZW5jZSBvZiBuZXV0cmFscyB0YWtlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZVxuICAgICAgICAvLyBzdXJyb3VuZGluZyBzdHJvbmcgdGV4dCBpZiB0aGUgdGV4dCBvbiBib3RoIHNpZGVzIGhhcyB0aGUgc2FtZVxuICAgICAgICAvLyBkaXJlY3Rpb24uIEV1cm9wZWFuIGFuZCBBcmFiaWMgbnVtYmVycyBhY3QgYXMgaWYgdGhleSB3ZXJlIFIgaW5cbiAgICAgICAgLy8gdGVybXMgb2YgdGhlaXIgaW5mbHVlbmNlIG9uIG5ldXRyYWxzLiBTdGFydC1vZi1sZXZlbC1ydW4gKHNvcilcbiAgICAgICAgLy8gYW5kIGVuZC1vZi1sZXZlbC1ydW4gKGVvcikgYXJlIHVzZWQgYXQgbGV2ZWwgcnVuIGJvdW5kYXJpZXMuXG4gICAgICAgIC8vIE4yLiBBbnkgcmVtYWluaW5nIG5ldXRyYWxzIHRha2UgdGhlIGVtYmVkZGluZyBkaXJlY3Rpb24uXG4gICAgICAgIC8vIChMZWZ0IGFmdGVyIHRoaXM6IEwsIFIsIEVOK0FOKVxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IDI1NiAvKiBULk5JICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCA9PSB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlJID09IGlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGlzb2xhdGVzW2lJKytdLnRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSBpSSA8IGlzb2xhdGVzLmxlbmd0aCA/IGlzb2xhdGVzW2lJXS5mcm9tIDogclRvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVzW2VuZF0gPT0gMjU2IC8qIFQuTkkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGJlZm9yZUwgPSBwcmV2ID09IDEgLyogVC5MICovO1xuICAgICAgICAgICAgICAgIGxldCBhZnRlckwgPSAoZW5kIDwgclRvID8gdHlwZXNbZW5kXSA6IG91dGVyVHlwZSkgPT0gMSAvKiBULkwgKi87XG4gICAgICAgICAgICAgICAgbGV0IHJlcGxhY2UgPSBiZWZvcmVMID09IGFmdGVyTCA/IChiZWZvcmVMID8gMSAvKiBULkwgKi8gOiAyIC8qIFQuUiAqLykgOiBvdXRlclR5cGU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGVuZCwgakkgPSBpSSwgZnJvbUogPSBqSSA/IGlzb2xhdGVzW2pJIC0gMV0udG8gOiByRnJvbTsgaiA+IGk7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09IGZyb21KKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBqID0gaXNvbGF0ZXNbLS1qSV0uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KID0gakkgPyBpc29sYXRlc1tqSSAtIDFdLnRvIDogckZyb207XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbLS1qXSA9IHJlcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gdHlwZTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBGaW5kIHRoZSBjb250aWd1b3VzIHJhbmdlcyBvZiBjaGFyYWN0ZXIgdHlwZXMgaW4gYSBnaXZlbiByYW5nZSwgYW5kXG4vLyBlbWl0IHNwYW5zIGZvciB0aGVtLiBGbGlwIHRoZSBvcmRlciBvZiB0aGUgc3BhbnMgYXMgYXBwcm9wcmlhdGVcbi8vIGJhc2VkIG9uIHRoZSBsZXZlbCwgYW5kIGNhbGwgdGhyb3VnaCB0byBjb21wdXRlIHRoZSBzcGFucyBmb3Jcbi8vIGlzb2xhdGVzIGF0IHRoZSBwcm9wZXIgcG9pbnQuXG5mdW5jdGlvbiBlbWl0U3BhbnMobGluZSwgZnJvbSwgdG8sIGxldmVsLCBiYXNlTGV2ZWwsIGlzb2xhdGVzLCBvcmRlcikge1xuICAgIGxldCBvdXJUeXBlID0gbGV2ZWwgJSAyID8gMiAvKiBULlIgKi8gOiAxIC8qIFQuTCAqLztcbiAgICBpZiAoKGxldmVsICUgMikgPT0gKGJhc2VMZXZlbCAlIDIpKSB7IC8vIFNhbWUgZGlyIGFzIGJhc2UgZGlyZWN0aW9uLCBkb24ndCBmbGlwXG4gICAgICAgIGZvciAobGV0IGlDaCA9IGZyb20sIGlJID0gMDsgaUNoIDwgdG87KSB7XG4gICAgICAgICAgICAvLyBTY2FuIGEgc2VjdGlvbiBvZiBjaGFyYWN0ZXJzIGluIGRpcmVjdGlvbiBvdXJUeXBlLCB1bmxlc3NcbiAgICAgICAgICAgIC8vIHRoZXJlJ3MgYW5vdGhlciB0eXBlIG9mIGNoYXIgcmlnaHQgYWZ0ZXIgaUNoLCBpbiB3aGljaCBjYXNlXG4gICAgICAgICAgICAvLyB3ZSBzY2FuIGEgc2VjdGlvbiBvZiBvdGhlciBjaGFyYWN0ZXJzICh3aGljaCwgaWYgb3VyVHlwZSA9PVxuICAgICAgICAgICAgLy8gVC5MLCBtYXkgY29udGFpbiBib3RoIFQuUiBhbmQgVC5BTiBjaGFycykuXG4gICAgICAgICAgICBsZXQgc2FtZURpciA9IHRydWUsIGlzTnVtID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoaUkgPT0gaXNvbGF0ZXMubGVuZ3RoIHx8IGlDaCA8IGlzb2xhdGVzW2lJXS5mcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0eXBlc1tpQ2hdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IG91clR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FtZURpciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpc051bSA9IG5leHQgPT0gMTYgLyogVC5BTiAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIb2xkcyBhbiBhcnJheSBvZiBpc29sYXRlcyB0byBwYXNzIHRvIGEgcmVjdXJzaXZlIGNhbGwgaWYgd2VcbiAgICAgICAgICAgIC8vIG11c3QgcmVjdXJzZSAodG8gZGlzdGluZ3Vpc2ggVC5BTiBpbnNpZGUgYW4gUlRMIHNlY3Rpb24gaW5cbiAgICAgICAgICAgIC8vIExUUiB0ZXh0KSwgbnVsbCBpZiB3ZSBjYW4gZW1pdCBkaXJlY3RseVxuICAgICAgICAgICAgbGV0IHJlY3Vyc2UgPSAhc2FtZURpciAmJiBvdXJUeXBlID09IDEgLyogVC5MICovID8gW10gOiBudWxsO1xuICAgICAgICAgICAgbGV0IGxvY2FsTGV2ZWwgPSBzYW1lRGlyID8gbGV2ZWwgOiBsZXZlbCArIDE7XG4gICAgICAgICAgICBsZXQgaVNjYW4gPSBpQ2g7XG4gICAgICAgICAgICBydW46IGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoaUkgPCBpc29sYXRlcy5sZW5ndGggJiYgaVNjYW4gPT0gaXNvbGF0ZXNbaUldLmZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNvID0gaXNvbGF0ZXNbaUldO1xuICAgICAgICAgICAgICAgICAgICAvLyBTY2FuIGFoZWFkIHRvIHZlcmlmeSB0aGF0IHRoZXJlIGlzIGFub3RoZXIgY2hhciBpbiB0aGlzIGRpciBhZnRlciB0aGUgaXNvbGF0ZShzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNhbWVEaXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB1cHRvID0gaXNvLnRvLCBqSSA9IGlJICsgMTs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwdG8gPT0gdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakkgPCBpc29sYXRlcy5sZW5ndGggJiYgaXNvbGF0ZXNbakldLmZyb20gPT0gdXB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0byA9IGlzb2xhdGVzW2pJKytdLnRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVzW3VwdG9dID09IG91clR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpSSsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZS5wdXNoKGlzbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNvLmZyb20gPiBpQ2gpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oaUNoLCBpc28uZnJvbSwgbG9jYWxMZXZlbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpclN3YXAgPSAoaXNvLmRpcmVjdGlvbiA9PSBMVFIpICE9ICEobG9jYWxMZXZlbCAlIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBkaXJTd2FwID8gbGV2ZWwgKyAxIDogbGV2ZWwsIGJhc2VMZXZlbCwgaXNvLmlubmVyLCBpc28uZnJvbSwgaXNvLnRvLCBvcmRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpQ2ggPSBpc28udG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaVNjYW4gPSBpc28udG87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuID09IHRvIHx8IChzYW1lRGlyID8gdHlwZXNbaVNjYW5dICE9IG91clR5cGUgOiB0eXBlc1tpU2Nhbl0gPT0gb3VyVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpU2NhbisrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWN1cnNlKVxuICAgICAgICAgICAgICAgIGVtaXRTcGFucyhsaW5lLCBpQ2gsIGlTY2FuLCBsZXZlbCArIDEsIGJhc2VMZXZlbCwgcmVjdXJzZSwgb3JkZXIpO1xuICAgICAgICAgICAgZWxzZSBpZiAoaUNoIDwgaVNjYW4pXG4gICAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oaUNoLCBpU2NhbiwgbG9jYWxMZXZlbCkpO1xuICAgICAgICAgICAgaUNoID0gaVNjYW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIEl0ZXJhdGUgaW4gcmV2ZXJzZSB0byBmbGlwIHRoZSBzcGFuIG9yZGVyLiBTYW1lIGNvZGUgYWdhaW4sIGJ1dFxuICAgICAgICAvLyBnb2luZyBmcm9tIHRoZSBiYWNrIG9mIHRoZSBzZWN0aW9uIHRvIHRoZSBmcm9udFxuICAgICAgICBmb3IgKGxldCBpQ2ggPSB0bywgaUkgPSBpc29sYXRlcy5sZW5ndGg7IGlDaCA+IGZyb207KSB7XG4gICAgICAgICAgICBsZXQgc2FtZURpciA9IHRydWUsIGlzTnVtID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIWlJIHx8IGlDaCA+IGlzb2xhdGVzW2lJIC0gMV0udG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHR5cGVzW2lDaCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IG91clR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FtZURpciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpc051bSA9IG5leHQgPT0gMTYgLyogVC5BTiAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVjdXJzZSA9ICFzYW1lRGlyICYmIG91clR5cGUgPT0gMSAvKiBULkwgKi8gPyBbXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgbG9jYWxMZXZlbCA9IHNhbWVEaXIgPyBsZXZlbCA6IGxldmVsICsgMTtcbiAgICAgICAgICAgIGxldCBpU2NhbiA9IGlDaDtcbiAgICAgICAgICAgIHJ1bjogZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChpSSAmJiBpU2NhbiA9PSBpc29sYXRlc1tpSSAtIDFdLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzbyA9IGlzb2xhdGVzWy0taUldO1xuICAgICAgICAgICAgICAgICAgICAvLyBTY2FuIGFoZWFkIHRvIHZlcmlmeSB0aGF0IHRoZXJlIGlzIGFub3RoZXIgY2hhciBpbiB0aGlzIGRpciBhZnRlciB0aGUgaXNvbGF0ZShzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNhbWVEaXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB1cHRvID0gaXNvLmZyb20sIGpJID0gaUk7Oykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHRvID09IGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakkgJiYgaXNvbGF0ZXNbakkgLSAxXS50byA9PSB1cHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRvID0gaXNvbGF0ZXNbLS1qSV0uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1t1cHRvIC0gMV0gPT0gb3VyVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN1cnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLnB1c2goaXNvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc28udG8gPCBpQ2gpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oaXNvLnRvLCBpQ2gsIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXJTd2FwID0gKGlzby5kaXJlY3Rpb24gPT0gTFRSKSAhPSAhKGxvY2FsTGV2ZWwgJSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgZGlyU3dhcCA/IGxldmVsICsgMSA6IGxldmVsLCBiYXNlTGV2ZWwsIGlzby5pbm5lciwgaXNvLmZyb20sIGlzby50bywgb3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaUNoID0gaXNvLmZyb207XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaVNjYW4gPSBpc28uZnJvbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaVNjYW4gPT0gZnJvbSB8fCAoc2FtZURpciA/IHR5cGVzW2lTY2FuIC0gMV0gIT0gb3VyVHlwZSA6IHR5cGVzW2lTY2FuIC0gMV0gPT0gb3VyVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpU2Nhbi0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWN1cnNlKVxuICAgICAgICAgICAgICAgIGVtaXRTcGFucyhsaW5lLCBpU2NhbiwgaUNoLCBsZXZlbCArIDEsIGJhc2VMZXZlbCwgcmVjdXJzZSwgb3JkZXIpO1xuICAgICAgICAgICAgZWxzZSBpZiAoaVNjYW4gPCBpQ2gpXG4gICAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oaVNjYW4sIGlDaCwgbG9jYWxMZXZlbCkpO1xuICAgICAgICAgICAgaUNoID0gaVNjYW47XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGxldmVsLCBiYXNlTGV2ZWwsIGlzb2xhdGVzLCBmcm9tLCB0bywgb3JkZXIpIHtcbiAgICBsZXQgb3V0ZXJUeXBlID0gKGxldmVsICUgMiA/IDIgLyogVC5SICovIDogMSAvKiBULkwgKi8pO1xuICAgIGNvbXB1dGVDaGFyVHlwZXMobGluZSwgZnJvbSwgdG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpO1xuICAgIHByb2Nlc3NCcmFja2V0UGFpcnMobGluZSwgZnJvbSwgdG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpO1xuICAgIHByb2Nlc3NOZXV0cmFscyhmcm9tLCB0bywgaXNvbGF0ZXMsIG91dGVyVHlwZSk7XG4gICAgZW1pdFNwYW5zKGxpbmUsIGZyb20sIHRvLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgb3JkZXIpO1xufVxuZnVuY3Rpb24gY29tcHV0ZU9yZGVyKGxpbmUsIGRpcmVjdGlvbiwgaXNvbGF0ZXMpIHtcbiAgICBpZiAoIWxpbmUpXG4gICAgICAgIHJldHVybiBbbmV3IEJpZGlTcGFuKDAsIDAsIGRpcmVjdGlvbiA9PSBSVEwgPyAxIDogMCldO1xuICAgIGlmIChkaXJlY3Rpb24gPT0gTFRSICYmICFpc29sYXRlcy5sZW5ndGggJiYgIUJpZGlSRS50ZXN0KGxpbmUpKVxuICAgICAgICByZXR1cm4gdHJpdmlhbE9yZGVyKGxpbmUubGVuZ3RoKTtcbiAgICBpZiAoaXNvbGF0ZXMubGVuZ3RoKVxuICAgICAgICB3aGlsZSAobGluZS5sZW5ndGggPiB0eXBlcy5sZW5ndGgpXG4gICAgICAgICAgICB0eXBlc1t0eXBlcy5sZW5ndGhdID0gMjU2IC8qIFQuTkkgKi87IC8vIE1ha2Ugc3VyZSB0eXBlcyBhcnJheSBoYXMgbm8gZ2Fwc1xuICAgIGxldCBvcmRlciA9IFtdLCBsZXZlbCA9IGRpcmVjdGlvbiA9PSBMVFIgPyAwIDogMTtcbiAgICBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGxldmVsLCBsZXZlbCwgaXNvbGF0ZXMsIDAsIGxpbmUubGVuZ3RoLCBvcmRlcik7XG4gICAgcmV0dXJuIG9yZGVyO1xufVxuZnVuY3Rpb24gdHJpdmlhbE9yZGVyKGxlbmd0aCkge1xuICAgIHJldHVybiBbbmV3IEJpZGlTcGFuKDAsIGxlbmd0aCwgMCldO1xufVxubGV0IG1vdmVkT3ZlciA9IFwiXCI7XG4vLyBUaGlzIGltcGxlbWVudGF0aW9uIG1vdmVzIHN0cmljdGx5IHZpc3VhbGx5LCB3aXRob3V0IGNvbmNlcm4gZm9yIGFcbi8vIHRyYXZlcnNhbCB2aXNpdGluZyBldmVyeSBsb2dpY2FsIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcuIEl0IHdpbGxcbi8vIHN0aWxsIGRvIHNvIGZvciBzaW1wbGUgaW5wdXQsIGJ1dCBzaXR1YXRpb25zIGxpa2UgbXVsdGlwbGUgaXNvbGF0ZXNcbi8vIHdpdGggdGhlIHNhbWUgbGV2ZWwgbmV4dCB0byBlYWNoIG90aGVyLCBvciB0ZXh0IGdvaW5nIGFnYWluc3QgdGhlXG4vLyBtYWluIGRpciBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCB3aWxsIG1ha2Ugc29tZSBwb3NpdGlvbnNcbi8vIHVucmVhY2hhYmxlIHdpdGggdGhpcyBtb3Rpb24uIEVhY2ggdmlzaWJsZSBjdXJzb3IgcG9zaXRpb24gd2lsbFxuLy8gY29ycmVzcG9uZCB0byB0aGUgbG93ZXItbGV2ZWwgYmlkaSBzcGFuIHRoYXQgdG91Y2hlcyBpdC5cbi8vXG4vLyBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gc29sdmUgYW4gb3JkZXIgZ2xvYmFsbHkgZm9yIGEgZ2l2ZW5cbi8vIGxpbmUsIG1ha2luZyBzdXJlIHRoYXQgaXQgaW5jbHVkZXMgZXZlcnkgcG9zaXRpb24sIGJ1dCB0aGF0IHdvdWxkXG4vLyByZXF1aXJlIGFzc29jaWF0aW5nIG5vbi1jYW5vbmljYWwgKGhpZ2hlciBiaWRpIHNwYW4gbGV2ZWwpXG4vLyBwb3NpdGlvbnMgd2l0aCBhIGdpdmVuIHZpc3VhbCBwb3NpdGlvbiwgd2hpY2ggaXMgbGlrZWx5IHRvIGNvbmZ1c2Vcbi8vIHBlb3BsZS4gKEFuZCB3b3VsZCBnZW5lcmFsbHkgYmUgYSBsb3QgbW9yZSBjb21wbGljYXRlZC4pXG5mdW5jdGlvbiBtb3ZlVmlzdWFsbHkobGluZSwgb3JkZXIsIGRpciwgc3RhcnQsIGZvcndhcmQpIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IHN0YXJ0SW5kZXggPSBzdGFydC5oZWFkIC0gbGluZS5mcm9tO1xuICAgIGxldCBzcGFuSSA9IEJpZGlTcGFuLmZpbmQob3JkZXIsIHN0YXJ0SW5kZXgsIChfYSA9IHN0YXJ0LmJpZGlMZXZlbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogLTEsIHN0YXJ0LmFzc29jKTtcbiAgICBsZXQgc3BhbiA9IG9yZGVyW3NwYW5JXSwgc3BhbkVuZCA9IHNwYW4uc2lkZShmb3J3YXJkLCBkaXIpO1xuICAgIC8vIEVuZCBvZiBzcGFuXG4gICAgaWYgKHN0YXJ0SW5kZXggPT0gc3BhbkVuZCkge1xuICAgICAgICBsZXQgbmV4dEkgPSBzcGFuSSArPSBmb3J3YXJkID8gMSA6IC0xO1xuICAgICAgICBpZiAobmV4dEkgPCAwIHx8IG5leHRJID49IG9yZGVyLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBzcGFuID0gb3JkZXJbc3BhbkkgPSBuZXh0SV07XG4gICAgICAgIHN0YXJ0SW5kZXggPSBzcGFuLnNpZGUoIWZvcndhcmQsIGRpcik7XG4gICAgICAgIHNwYW5FbmQgPSBzcGFuLnNpZGUoZm9yd2FyZCwgZGlyKTtcbiAgICB9XG4gICAgbGV0IG5leHRJbmRleCA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBzdGFydEluZGV4LCBzcGFuLmZvcndhcmQoZm9yd2FyZCwgZGlyKSk7XG4gICAgaWYgKG5leHRJbmRleCA8IHNwYW4uZnJvbSB8fCBuZXh0SW5kZXggPiBzcGFuLnRvKVxuICAgICAgICBuZXh0SW5kZXggPSBzcGFuRW5kO1xuICAgIG1vdmVkT3ZlciA9IGxpbmUudGV4dC5zbGljZShNYXRoLm1pbihzdGFydEluZGV4LCBuZXh0SW5kZXgpLCBNYXRoLm1heChzdGFydEluZGV4LCBuZXh0SW5kZXgpKTtcbiAgICBsZXQgbmV4dFNwYW4gPSBzcGFuSSA9PSAoZm9yd2FyZCA/IG9yZGVyLmxlbmd0aCAtIDEgOiAwKSA/IG51bGwgOiBvcmRlcltzcGFuSSArIChmb3J3YXJkID8gMSA6IC0xKV07XG4gICAgaWYgKG5leHRTcGFuICYmIG5leHRJbmRleCA9PSBzcGFuRW5kICYmIG5leHRTcGFuLmxldmVsICsgKGZvcndhcmQgPyAwIDogMSkgPCBzcGFuLmxldmVsKVxuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihuZXh0U3Bhbi5zaWRlKCFmb3J3YXJkLCBkaXIpICsgbGluZS5mcm9tLCBuZXh0U3Bhbi5mb3J3YXJkKGZvcndhcmQsIGRpcikgPyAxIDogLTEsIG5leHRTcGFuLmxldmVsKTtcbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihuZXh0SW5kZXggKyBsaW5lLmZyb20sIHNwYW4uZm9yd2FyZChmb3J3YXJkLCBkaXIpID8gLTEgOiAxLCBzcGFuLmxldmVsKTtcbn1cbmZ1bmN0aW9uIGF1dG9EaXJlY3Rpb24odGV4dCwgZnJvbSwgdG8pIHtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgbGV0IHR5cGUgPSBjaGFyVHlwZSh0ZXh0LmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICBpZiAodHlwZSA9PSAxIC8qIFQuTCAqLylcbiAgICAgICAgICAgIHJldHVybiBMVFI7XG4gICAgICAgIGlmICh0eXBlID09IDIgLyogVC5SICovIHx8IHR5cGUgPT0gNCAvKiBULkFMICovKVxuICAgICAgICAgICAgcmV0dXJuIFJUTDtcbiAgICB9XG4gICAgcmV0dXJuIExUUjtcbn1cblxuY29uc3QgY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBkcmFnTW92ZXNTZWxlY3Rpb24kMSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IG1vdXNlU2VsZWN0aW9uU3R5bGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBleGNlcHRpb25TaW5rID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgdXBkYXRlTGlzdGVuZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBpbnB1dEhhbmRsZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBmb2N1c0NoYW5nZUVmZmVjdCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGNsaXBib2FyZElucHV0RmlsdGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgY2xpcGJvYXJkT3V0cHV0RmlsdGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgcGVyTGluZVRleHREaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG5jb25zdCBuYXRpdmVTZWxlY3Rpb25IaWRkZW4gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG5jb25zdCBzY3JvbGxIYW5kbGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY2xhc3MgU2Nyb2xsVGFyZ2V0IHtcbiAgICBjb25zdHJ1Y3RvcihyYW5nZSwgeSA9IFwibmVhcmVzdFwiLCB4ID0gXCJuZWFyZXN0XCIsIHlNYXJnaW4gPSA1LCB4TWFyZ2luID0gNSwgXG4gICAgLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBhYnVzZWQgdG8gYWxzbyBzdG9yZSBwcmVjaXNlIHNjcm9sbFxuICAgIC8vIHNuYXBzaG90cywgaW5zdGVhZCBvZiBhIGBzY3JvbGxJbnRvVmlld2AgcmVxdWVzdC4gV2hlbiB0aGlzXG4gICAgLy8gZmxhZyBpcyBgdHJ1ZWAsIGByYW5nZWAgcG9pbnRzIGF0IGEgcG9zaXRpb24gaW4gdGhlIHJlZmVyZW5jZVxuICAgIC8vIGxpbmUsIGB5TWFyZ2luYCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0b3Agb2YgdGhhdFxuICAgIC8vIGxpbmUgYW5kIHRoZSB0b3Agb2YgdGhlIGVkaXRvciwgYW5kIGB4TWFyZ2luYCBob2xkcyB0aGVcbiAgICAvLyBlZGl0b3IncyBgc2Nyb2xsTGVmdGAuXG4gICAgaXNTbmFwc2hvdCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55TWFyZ2luID0geU1hcmdpbjtcbiAgICAgICAgdGhpcy54TWFyZ2luID0geE1hcmdpbjtcbiAgICAgICAgdGhpcy5pc1NuYXBzaG90ID0gaXNTbmFwc2hvdDtcbiAgICB9XG4gICAgbWFwKGNoYW5nZXMpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXMuZW1wdHkgPyB0aGlzIDpcbiAgICAgICAgICAgIG5ldyBTY3JvbGxUYXJnZXQodGhpcy5yYW5nZS5tYXAoY2hhbmdlcyksIHRoaXMueSwgdGhpcy54LCB0aGlzLnlNYXJnaW4sIHRoaXMueE1hcmdpbiwgdGhpcy5pc1NuYXBzaG90KTtcbiAgICB9XG4gICAgY2xpcChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZS50byA8PSBzdGF0ZS5kb2MubGVuZ3RoID8gdGhpcyA6XG4gICAgICAgICAgICBuZXcgU2Nyb2xsVGFyZ2V0KEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioc3RhdGUuZG9jLmxlbmd0aCksIHRoaXMueSwgdGhpcy54LCB0aGlzLnlNYXJnaW4sIHRoaXMueE1hcmdpbiwgdGhpcy5pc1NuYXBzaG90KTtcbiAgICB9XG59XG5jb25zdCBzY3JvbGxJbnRvVmlldyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6ICh0LCBjaCkgPT4gdC5tYXAoY2gpIH0pO1xuY29uc3Qgc2V0RWRpdENvbnRleHRGb3JtYXR0aW5nID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5Mb2cgb3IgcmVwb3J0IGFuIHVuaGFuZGxlZCBleGNlcHRpb24gaW4gY2xpZW50IGNvZGUuIFNob3VsZFxucHJvYmFibHkgb25seSBiZSB1c2VkIGJ5IGV4dGVuc2lvbiBjb2RlIHRoYXQgYWxsb3dzIGNsaWVudCBjb2RlIHRvXG5wcm92aWRlIGZ1bmN0aW9ucywgYW5kIGNhbGxzIHRob3NlIGZ1bmN0aW9ucyBpbiBhIGNvbnRleHQgd2hlcmUgYW5cbmV4Y2VwdGlvbiBjYW4ndCBiZSBwcm9wYWdhdGVkIHRvIGNhbGxpbmcgY29kZSBpbiBhIHJlYXNvbmFibGUgd2F5XG4oZm9yIGV4YW1wbGUgd2hlbiBpbiBhbiBldmVudCBoYW5kbGVyKS5cblxuRWl0aGVyIGNhbGxzIGEgaGFuZGxlciByZWdpc3RlcmVkIHdpdGhcbltgRWRpdG9yVmlldy5leGNlcHRpb25TaW5rYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZXhjZXB0aW9uU2luayksXG5gd2luZG93Lm9uZXJyb3JgLCBpZiBkZWZpbmVkLCBvciBgY29uc29sZS5lcnJvcmAgKGluIHdoaWNoIGNhc2Vcbml0J2xsIHBhc3MgYGNvbnRleHRgLCB3aGVuIGdpdmVuLCBhcyBmaXJzdCBhcmd1bWVudCkuXG4qL1xuZnVuY3Rpb24gbG9nRXhjZXB0aW9uKHN0YXRlLCBleGNlcHRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgaGFuZGxlciA9IHN0YXRlLmZhY2V0KGV4Y2VwdGlvblNpbmspO1xuICAgIGlmIChoYW5kbGVyLmxlbmd0aClcbiAgICAgICAgaGFuZGxlclswXShleGNlcHRpb24pO1xuICAgIGVsc2UgaWYgKHdpbmRvdy5vbmVycm9yKVxuICAgICAgICB3aW5kb3cub25lcnJvcihTdHJpbmcoZXhjZXB0aW9uKSwgY29udGV4dCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGV4Y2VwdGlvbik7XG4gICAgZWxzZSBpZiAoY29udGV4dClcbiAgICAgICAgY29uc29sZS5lcnJvcihjb250ZXh0ICsgXCI6XCIsIGV4Y2VwdGlvbik7XG4gICAgZWxzZVxuICAgICAgICBjb25zb2xlLmVycm9yKGV4Y2VwdGlvbik7XG59XG5jb25zdCBlZGl0YWJsZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IHRydWUgfSk7XG5sZXQgbmV4dFBsdWdpbklEID0gMDtcbmNvbnN0IHZpZXdQbHVnaW4gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcblZpZXcgcGx1Z2lucyBhc3NvY2lhdGUgc3RhdGVmdWwgdmFsdWVzIHdpdGggYSB2aWV3LiBUaGV5IGNhblxuaW5mbHVlbmNlIHRoZSB3YXkgdGhlIGNvbnRlbnQgaXMgZHJhd24sIGFuZCBhcmUgbm90aWZpZWQgb2YgdGhpbmdzXG50aGF0IGhhcHBlbiBpbiB0aGUgdmlldy5cbiovXG5jbGFzcyBWaWV3UGx1Z2luIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGlkLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNyZWF0ZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21FdmVudEhhbmRsZXJzLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGRvbUV2ZW50T2JzZXJ2ZXJzLCBidWlsZEV4dGVuc2lvbnMpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAgICAgdGhpcy5kb21FdmVudEhhbmRsZXJzID0gZG9tRXZlbnRIYW5kbGVycztcbiAgICAgICAgdGhpcy5kb21FdmVudE9ic2VydmVycyA9IGRvbUV2ZW50T2JzZXJ2ZXJzO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IGJ1aWxkRXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgcGx1Z2luIGZyb20gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdGhlXG4gICAgcGx1Z2luJ3MgdmFsdWUsIGdpdmVuIGFuIGVkaXRvciB2aWV3LlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShjcmVhdGUsIHNwZWMpIHtcbiAgICAgICAgY29uc3QgeyBldmVudEhhbmRsZXJzLCBldmVudE9ic2VydmVycywgcHJvdmlkZSwgZGVjb3JhdGlvbnM6IGRlY28gfSA9IHNwZWMgfHwge307XG4gICAgICAgIHJldHVybiBuZXcgVmlld1BsdWdpbihuZXh0UGx1Z2luSUQrKywgY3JlYXRlLCBldmVudEhhbmRsZXJzLCBldmVudE9ic2VydmVycywgcGx1Z2luID0+IHtcbiAgICAgICAgICAgIGxldCBleHQgPSBbdmlld1BsdWdpbi5vZihwbHVnaW4pXTtcbiAgICAgICAgICAgIGlmIChkZWNvKVxuICAgICAgICAgICAgICAgIGV4dC5wdXNoKGRlY29yYXRpb25zLm9mKHZpZXcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGx1Z2luSW5zdCA9IHZpZXcucGx1Z2luKHBsdWdpbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbHVnaW5JbnN0ID8gZGVjbyhwbHVnaW5JbnN0KSA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZSlcbiAgICAgICAgICAgICAgICBleHQucHVzaChwcm92aWRlKHBsdWdpbikpO1xuICAgICAgICAgICAgcmV0dXJuIGV4dDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBsdWdpbiBmb3IgYSBjbGFzcyB3aG9zZSBjb25zdHJ1Y3RvciB0YWtlcyBhIHNpbmdsZVxuICAgIGVkaXRvciB2aWV3IGFzIGFyZ3VtZW50LlxuICAgICovXG4gICAgc3RhdGljIGZyb21DbGFzcyhjbHMsIHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIFZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gbmV3IGNscyh2aWV3KSwgc3BlYyk7XG4gICAgfVxufVxuY2xhc3MgUGx1Z2luSW5zdGFuY2Uge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLy8gV2hlbiBzdGFydGluZyBhbiB1cGRhdGUsIGFsbCBwbHVnaW5zIGhhdmUgdGhpcyBmaWVsZCBzZXQgdG8gdGhlXG4gICAgICAgIC8vIHVwZGF0ZSBvYmplY3QsIGluZGljYXRpbmcgdGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQuIFdoZW4gZmluaXNoZWRcbiAgICAgICAgLy8gdXBkYXRpbmcsIGl0IGlzIHNldCB0byBgZmFsc2VgLiBSZXRyaWV2aW5nIGEgcGx1Z2luIHRoYXQgbmVlZHMgdG9cbiAgICAgICAgLy8gYmUgdXBkYXRlZCB3aXRoIGB2aWV3LnBsdWdpbmAgZm9yY2VzIGFuIGVhZ2VyIHVwZGF0ZS5cbiAgICAgICAgdGhpcy5tdXN0VXBkYXRlID0gbnVsbDtcbiAgICAgICAgLy8gVGhpcyBpcyBudWxsIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsbHkgY3JlYXRlZCwgYnV0XG4gICAgICAgIC8vIGluaXRpYWxpemVkIG9uIHRoZSBmaXJzdCB1cGRhdGUuXG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB1cGRhdGUodmlldykge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNwZWMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zcGVjLmNyZWF0ZSh2aWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUsIFwiQ29kZU1pcnJvciBwbHVnaW4gY3Jhc2hlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubXVzdFVwZGF0ZSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZSA9IHRoaXMubXVzdFVwZGF0ZTtcbiAgICAgICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS51cGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odXBkYXRlLnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmRlc3Ryb3kpXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlc3Ryb3kodmlldykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgoX2EgPSB0aGlzLnZhbHVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVzdHJveSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUsIFwiQ29kZU1pcnJvciBwbHVnaW4gY3Jhc2hlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWFjdGl2YXRlKCkge1xuICAgICAgICB0aGlzLnNwZWMgPSB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG59XG5jb25zdCBlZGl0b3JBdHRyaWJ1dGVzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgY29udGVudEF0dHJpYnV0ZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vLyBQcm92aWRlIGRlY29yYXRpb25zXG5jb25zdCBkZWNvcmF0aW9ucyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IG91dGVyRGVjb3JhdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBhdG9taWNSYW5nZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBiaWRpSXNvbGF0ZWRSYW5nZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5mdW5jdGlvbiBnZXRJc29sYXRlZFJhbmdlcyh2aWV3LCBsaW5lKSB7XG4gICAgbGV0IGlzb2xhdGVzID0gdmlldy5zdGF0ZS5mYWNldChiaWRpSXNvbGF0ZWRSYW5nZXMpO1xuICAgIGlmICghaXNvbGF0ZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gaXNvbGF0ZXM7XG4gICAgbGV0IHNldHMgPSBpc29sYXRlcy5tYXAoaSA9PiBpIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBpKHZpZXcpIDogaSk7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIFJhbmdlU2V0LnNwYW5zKHNldHMsIGxpbmUuZnJvbSwgbGluZS50bywge1xuICAgICAgICBwb2ludCgpIHsgfSxcbiAgICAgICAgc3Bhbihmcm9tRG9jLCB0b0RvYywgYWN0aXZlLCBvcGVuKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGZyb21Eb2MgLSBsaW5lLmZyb20sIHRvID0gdG9Eb2MgLSBsaW5lLmZyb207XG4gICAgICAgICAgICBsZXQgbGV2ZWwgPSByZXN1bHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYWN0aXZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tLCBvcGVuLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gYWN0aXZlW2ldLnNwZWMuYmlkaUlzb2xhdGUsIHVwZGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGF1dG9EaXJlY3Rpb24obGluZS50ZXh0LCBmcm9tLCB0byk7XG4gICAgICAgICAgICAgICAgaWYgKG9wZW4gPiAwICYmIGxldmVsLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAodXBkYXRlID0gbGV2ZWxbbGV2ZWwubGVuZ3RoIC0gMV0pLnRvID09IGZyb20gJiYgdXBkYXRlLmRpcmVjdGlvbiA9PSBkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnRvID0gdG87XG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gdXBkYXRlLmlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZCA9IHsgZnJvbSwgdG8sIGRpcmVjdGlvbiwgaW5uZXI6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgIGxldmVsLnB1c2goYWRkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBhZGQuaW5uZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IHNjcm9sbE1hcmdpbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5mdW5jdGlvbiBnZXRTY3JvbGxNYXJnaW5zKHZpZXcpIHtcbiAgICBsZXQgbGVmdCA9IDAsIHJpZ2h0ID0gMCwgdG9wID0gMCwgYm90dG9tID0gMDtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygdmlldy5zdGF0ZS5mYWNldChzY3JvbGxNYXJnaW5zKSkge1xuICAgICAgICBsZXQgbSA9IHNvdXJjZSh2aWV3KTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgIGlmIChtLmxlZnQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgbS5sZWZ0KTtcbiAgICAgICAgICAgIGlmIChtLnJpZ2h0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgcmlnaHQgPSBNYXRoLm1heChyaWdodCwgbS5yaWdodCk7XG4gICAgICAgICAgICBpZiAobS50b3AgIT0gbnVsbClcbiAgICAgICAgICAgICAgICB0b3AgPSBNYXRoLm1heCh0b3AsIG0udG9wKTtcbiAgICAgICAgICAgIGlmIChtLmJvdHRvbSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGJvdHRvbSwgbS5ib3R0b20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9O1xufVxuY29uc3Qgc3R5bGVNb2R1bGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jbGFzcyBDaGFuZ2VkUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpIHtcbiAgICAgICAgdGhpcy5mcm9tQSA9IGZyb21BO1xuICAgICAgICB0aGlzLnRvQSA9IHRvQTtcbiAgICAgICAgdGhpcy5mcm9tQiA9IGZyb21CO1xuICAgICAgICB0aGlzLnRvQiA9IHRvQjtcbiAgICB9XG4gICAgam9pbihvdGhlcikge1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZWRSYW5nZShNYXRoLm1pbih0aGlzLmZyb21BLCBvdGhlci5mcm9tQSksIE1hdGgubWF4KHRoaXMudG9BLCBvdGhlci50b0EpLCBNYXRoLm1pbih0aGlzLmZyb21CLCBvdGhlci5mcm9tQiksIE1hdGgubWF4KHRoaXMudG9CLCBvdGhlci50b0IpKTtcbiAgICB9XG4gICAgYWRkVG9TZXQoc2V0KSB7XG4gICAgICAgIGxldCBpID0gc2V0Lmxlbmd0aCwgbWUgPSB0aGlzO1xuICAgICAgICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gc2V0W2kgLSAxXTtcbiAgICAgICAgICAgIGlmIChyYW5nZS5mcm9tQSA+IG1lLnRvQSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyYW5nZS50b0EgPCBtZS5mcm9tQSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIG1lID0gbWUuam9pbihyYW5nZSk7XG4gICAgICAgICAgICBzZXQuc3BsaWNlKGkgLSAxLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQuc3BsaWNlKGksIDAsIG1lKTtcbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgc3RhdGljIGV4dGVuZFdpdGhSYW5nZXMoZGlmZiwgcmFuZ2VzKSB7XG4gICAgICAgIGlmIChyYW5nZXMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBkSSA9IDAsIHJJID0gMCwgcG9zQSA9IDAsIHBvc0IgPSAwOzsgZEkrKykge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBkSSA9PSBkaWZmLmxlbmd0aCA/IG51bGwgOiBkaWZmW2RJXSwgb2ZmID0gcG9zQSAtIHBvc0I7XG4gICAgICAgICAgICBsZXQgZW5kID0gbmV4dCA/IG5leHQuZnJvbUIgOiAxZTk7XG4gICAgICAgICAgICB3aGlsZSAockkgPCByYW5nZXMubGVuZ3RoICYmIHJhbmdlc1tySV0gPCBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHJhbmdlc1tySV0sIHRvID0gcmFuZ2VzW3JJICsgMV07XG4gICAgICAgICAgICAgICAgbGV0IGZyb21CID0gTWF0aC5tYXgocG9zQiwgZnJvbSksIHRvQiA9IE1hdGgubWluKGVuZCwgdG8pO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQiA8PSB0b0IpXG4gICAgICAgICAgICAgICAgICAgIG5ldyBDaGFuZ2VkUmFuZ2UoZnJvbUIgKyBvZmYsIHRvQiArIG9mZiwgZnJvbUIsIHRvQikuYWRkVG9TZXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAodG8gPiBlbmQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgckkgKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgbmV3IENoYW5nZWRSYW5nZShuZXh0LmZyb21BLCBuZXh0LnRvQSwgbmV4dC5mcm9tQiwgbmV4dC50b0IpLmFkZFRvU2V0KHJlc3VsdCk7XG4gICAgICAgICAgICBwb3NBID0gbmV4dC50b0E7XG4gICAgICAgICAgICBwb3NCID0gbmV4dC50b0I7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcblZpZXcgW3BsdWdpbnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5WaWV3UGx1Z2luKSBhcmUgZ2l2ZW4gaW5zdGFuY2VzIG9mIHRoaXNcbmNsYXNzLCB3aGljaCBkZXNjcmliZSB3aGF0IGhhcHBlbmVkLCB3aGVuZXZlciB0aGUgdmlldyBpcyB1cGRhdGVkLlxuKi9cbmNsYXNzIFZpZXdVcGRhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBlZGl0b3IgdmlldyB0aGF0IHRoZSB1cGRhdGUgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgICovXG4gICAgdmlldywgXG4gICAgLyoqXG4gICAgVGhlIG5ldyBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBzdGF0ZSwgXG4gICAgLyoqXG4gICAgVGhlIHRyYW5zYWN0aW9ucyBpbnZvbHZlZCBpbiB0aGUgdXBkYXRlLiBNYXkgYmUgZW1wdHkuXG4gICAgKi9cbiAgICB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHRyYW5zYWN0aW9ucztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmZsYWdzID0gMDtcbiAgICAgICAgdGhpcy5zdGFydFN0YXRlID0gdmlldy5zdGF0ZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gQ2hhbmdlU2V0LmVtcHR5KHRoaXMuc3RhcnRTdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgdHIgb2YgdHJhbnNhY3Rpb25zKVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VzID0gdGhpcy5jaGFuZ2VzLmNvbXBvc2UodHIuY2hhbmdlcyk7XG4gICAgICAgIGxldCBjaGFuZ2VkUmFuZ2VzID0gW107XG4gICAgICAgIHRoaXMuY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikgPT4gY2hhbmdlZFJhbmdlcy5wdXNoKG5ldyBDaGFuZ2VkUmFuZ2UoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikpKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkUmFuZ2VzID0gY2hhbmdlZFJhbmdlcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHZpZXcsIHN0YXRlLCB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3VXBkYXRlKHZpZXcsIHN0YXRlLCB0cmFuc2FjdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGUgW3ZpZXdwb3J0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy52aWV3cG9ydCkgb3JcbiAgICBbdmlzaWJsZSByYW5nZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnZpc2libGVSYW5nZXMpIGNoYW5nZWQgaW4gdGhpc1xuICAgIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydENoYW5nZWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5mbGFncyAmIDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlblxuICAgIFtgdmlld3BvcnRDaGFuZ2VkYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LlZpZXdVcGRhdGUudmlld3BvcnRDaGFuZ2VkKSBpcyB0cnVlXG4gICAgYW5kIHRoZSB2aWV3cG9ydCBjaGFuZ2UgaXMgbm90IGp1c3QgdGhlIHJlc3VsdCBvZiBtYXBwaW5nIGl0IGluXG4gICAgcmVzcG9uc2UgdG8gZG9jdW1lbnQgY2hhbmdlcy5cbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydE1vdmVkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiA4IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnRNb3ZlZCAqLykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaGVpZ2h0IG9mIGEgYmxvY2sgZWxlbWVudCBpbiB0aGUgZWRpdG9yXG4gICAgY2hhbmdlZCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBoZWlnaHRDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBkb2N1bWVudCB3YXMgbW9kaWZpZWQgb3IgdGhlIHNpemUgb2YgdGhlXG4gICAgZWRpdG9yLCBvciBlbGVtZW50cyB3aXRoaW4gdGhlIGVkaXRvciwgY2hhbmdlZC5cbiAgICAqL1xuICAgIGdldCBnZW9tZXRyeUNoYW5nZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY0NoYW5nZWQgfHwgKHRoaXMuZmxhZ3MgJiAoMTYgLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLyB8IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIHVwZGF0ZSBpbmRpY2F0ZXMgYSBmb2N1cyBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZm9jdXNDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgZG9jdW1lbnQgY2hhbmdlZCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2hhbmdlcy5lbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHdhcyBleHBsaWNpdGx5IHNldCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBzZWxlY3Rpb25TZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLnNlbGVjdGlvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5mbGFncyA9PSAwICYmIHRoaXMudHJhbnNhY3Rpb25zLmxlbmd0aCA9PSAwOyB9XG59XG5cbmNsYXNzIERvY1ZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudmlldy5zdGF0ZS5kb2MubGVuZ3RoOyB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gW107XG4gICAgICAgIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXAgPSBbZmFsc2VdO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZWQgPSBudWxsO1xuICAgICAgICB0aGlzLmhhc0NvbXBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JDb21wb3NpdGlvbiA9IG5ldyBTZXQ7XG4gICAgICAgIHRoaXMuZWRpdENvbnRleHRGb3JtYXR0aW5nID0gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICB0aGlzLmxhc3RDb21wb3NpdGlvbkFmdGVyQ3Vyc29yID0gZmFsc2U7XG4gICAgICAgIC8vIFRyYWNrIGEgbWluaW11bSB3aWR0aCBmb3IgdGhlIGVkaXRvci4gV2hlbiBtZWFzdXJpbmcgc2l6ZXMgaW5cbiAgICAgICAgLy8gbWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cywgdGhpcyBpcyB1cGRhdGVkIHRvIHBvaW50IGF0IHRoZSB3aWR0aFxuICAgICAgICAvLyBvZiBhIGdpdmVuIGVsZW1lbnQgYW5kIGl0cyBleHRlbnQgaW4gdGhlIGRvY3VtZW50LiBXaGVuIGEgY2hhbmdlXG4gICAgICAgIC8vIGhhcHBlbnMgaW4gdGhhdCByYW5nZSwgdGhlc2UgYXJlIHJlc2V0LiBUaGF0IHdheSwgb25jZSB3ZSd2ZSBzZWVuXG4gICAgICAgIC8vIGEgbGluZS9lbGVtZW50IG9mIGEgZ2l2ZW4gbGVuZ3RoLCB3ZSBrZWVwIHRoZSBlZGl0b3Igd2lkZSBlbm91Z2hcbiAgICAgICAgLy8gdG8gZml0IGF0IGxlYXN0IHRoYXQgZWxlbWVudCwgdW50aWwgaXQgaXMgY2hhbmdlZCwgYXQgd2hpY2ggcG9pbnRcbiAgICAgICAgLy8gd2UgZm9yZ2V0IGl0IGFnYWluLlxuICAgICAgICB0aGlzLm1pbldpZHRoID0gMDtcbiAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSAwO1xuICAgICAgICB0aGlzLm1pbldpZHRoVG8gPSAwO1xuICAgICAgICAvLyBUcmFjayB3aGV0aGVyIHRoZSBET00gc2VsZWN0aW9uIHdhcyBzZXQgaW4gYSBsb3NzeSB3YXksIHNvIHRoYXRcbiAgICAgICAgLy8gd2UgZG9uJ3QgbWVzcyBpdCB1cCB3aGVuIHJlYWRpbmcgaXQgYmFjayBpdFxuICAgICAgICB0aGlzLmltcHJlY2lzZUFuY2hvciA9IG51bGw7XG4gICAgICAgIHRoaXMuaW1wcmVjaXNlSGVhZCA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgLy8gVXNlZCBieSB0aGUgcmVzaXplIG9ic2VydmVyIHRvIGlnbm9yZSByZXNpemVzIHRoYXQgd2UgY2F1c2VkXG4gICAgICAgIC8vIG91cnNlbHZlc1xuICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnNldERPTSh2aWV3LmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW25ldyBMaW5lVmlld107XG4gICAgICAgIHRoaXMuY2hpbGRyZW5bMF0uc2V0UGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZURlY28oKTtcbiAgICAgICAgdGhpcy51cGRhdGVJbm5lcihbbmV3IENoYW5nZWRSYW5nZSgwLCAwLCAwLCB2aWV3LnN0YXRlLmRvYy5sZW5ndGgpXSwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSB0aGUgZG9jdW1lbnQgdmlldyB0byBhIGdpdmVuIHN0YXRlLlxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY2hhbmdlZFJhbmdlcyA9IHVwZGF0ZS5jaGFuZ2VkUmFuZ2VzO1xuICAgICAgICBpZiAodGhpcy5taW5XaWR0aCA+IDAgJiYgY2hhbmdlZFJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghY2hhbmdlZFJhbmdlcy5ldmVyeSgoeyBmcm9tQSwgdG9BIH0pID0+IHRvQSA8IHRoaXMubWluV2lkdGhGcm9tIHx8IGZyb21BID4gdGhpcy5taW5XaWR0aFRvKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGggPSB0aGlzLm1pbldpZHRoRnJvbSA9IHRoaXMubWluV2lkdGhUbyA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoRnJvbSA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0aGlzLm1pbldpZHRoRnJvbSwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRoaXMubWluV2lkdGhUbywgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVFZGl0Q29udGV4dEZvcm1hdHRpbmcodXBkYXRlKTtcbiAgICAgICAgbGV0IHJlYWRDb21wb3NpdGlvbkF0ID0gLTE7XG4gICAgICAgIGlmICh0aGlzLnZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMCAmJiAhdGhpcy52aWV3Lm9ic2VydmVyLmVkaXRDb250ZXh0KSB7XG4gICAgICAgICAgICBpZiAoKF9hID0gdGhpcy5kb21DaGFuZ2VkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmV3U2VsKVxuICAgICAgICAgICAgICAgIHJlYWRDb21wb3NpdGlvbkF0ID0gdGhpcy5kb21DaGFuZ2VkLm5ld1NlbC5oZWFkO1xuICAgICAgICAgICAgZWxzZSBpZiAoIXRvdWNoZXNDb21wb3NpdGlvbih1cGRhdGUuY2hhbmdlcywgdGhpcy5oYXNDb21wb3NpdGlvbikgJiYgIXVwZGF0ZS5zZWxlY3Rpb25TZXQpXG4gICAgICAgICAgICAgICAgcmVhZENvbXBvc2l0aW9uQXQgPSB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSByZWFkQ29tcG9zaXRpb25BdCA+IC0xID8gZmluZENvbXBvc2l0aW9uUmFuZ2UodGhpcy52aWV3LCB1cGRhdGUuY2hhbmdlcywgcmVhZENvbXBvc2l0aW9uQXQpIDogbnVsbDtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLmhhc0NvbXBvc2l0aW9uO1xuICAgICAgICAgICAgY2hhbmdlZFJhbmdlcyA9IG5ldyBDaGFuZ2VkUmFuZ2UoZnJvbSwgdG8sIHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyhmcm9tLCAtMSksIHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0bywgMSkpXG4gICAgICAgICAgICAgICAgLmFkZFRvU2V0KGNoYW5nZWRSYW5nZXMuc2xpY2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNDb21wb3NpdGlvbiA9IGNvbXBvc2l0aW9uID8geyBmcm9tOiBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgdG86IGNvbXBvc2l0aW9uLnJhbmdlLnRvQiB9IDogbnVsbDtcbiAgICAgICAgLy8gV2hlbiB0aGUgRE9NIG5vZGVzIGFyb3VuZCB0aGUgc2VsZWN0aW9uIGFyZSBtb3ZlZCB0byBhbm90aGVyXG4gICAgICAgIC8vIHBhcmVudCwgQ2hyb21lIHNvbWV0aW1lcyByZXBvcnRzIGEgZGlmZmVyZW50IHNlbGVjdGlvbiB0aHJvdWdoXG4gICAgICAgIC8vIGdldFNlbGVjdGlvbiB0aGFuIHRoZSBvbmUgdGhhdCBpdCBhY3R1YWxseSBzaG93cyB0byB0aGUgdXNlci5cbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBzZWxlY3Rpb24gdXBkYXRlIHdoZW4gbGluZXMgYXJlIGpvaW5lZCB0byB3b3JrXG4gICAgICAgIC8vIGFyb3VuZCB0aGF0LiBJc3N1ZSAjNTRcbiAgICAgICAgaWYgKChicm93c2VyLmllIHx8IGJyb3dzZXIuY2hyb21lKSAmJiAhY29tcG9zaXRpb24gJiYgdXBkYXRlICYmXG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuZG9jLmxpbmVzICE9IHVwZGF0ZS5zdGFydFN0YXRlLmRvYy5saW5lcylcbiAgICAgICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBsZXQgcHJldkRlY28gPSB0aGlzLmRlY29yYXRpb25zLCBkZWNvID0gdGhpcy51cGRhdGVEZWNvKCk7XG4gICAgICAgIGxldCBkZWNvRGlmZiA9IGZpbmRDaGFuZ2VkRGVjbyhwcmV2RGVjbywgZGVjbywgdXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBjaGFuZ2VkUmFuZ2VzID0gQ2hhbmdlZFJhbmdlLmV4dGVuZFdpdGhSYW5nZXMoY2hhbmdlZFJhbmdlcywgZGVjb0RpZmYpO1xuICAgICAgICBpZiAoISh0aGlzLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykgJiYgY2hhbmdlZFJhbmdlcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lcihjaGFuZ2VkUmFuZ2VzLCB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MubGVuZ3RoLCBjb21wb3NpdGlvbik7XG4gICAgICAgICAgICBpZiAodXBkYXRlLnRyYW5zYWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFVzZWQgYnkgdXBkYXRlIGFuZCB0aGUgY29uc3RydWN0b3IgZG8gcGVyZm9ybSB0aGUgYWN0dWFsIERPTVxuICAgIC8vIHVwZGF0ZVxuICAgIHVwZGF0ZUlubmVyKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5tdXN0TWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pO1xuICAgICAgICBsZXQgeyBvYnNlcnZlciB9ID0gdGhpcy52aWV3O1xuICAgICAgICBvYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTG9jayB0aGUgaGVpZ2h0IGR1cmluZyByZWRyYXdpbmcsIHNpbmNlIENocm9tZSBzb21ldGltZXNcbiAgICAgICAgICAgIC8vIG1lc3NlcyB3aXRoIHRoZSBzY3JvbGwgcG9zaXRpb24gZHVyaW5nIERPTSBtdXRhdGlvbiAodGhvdWdoXG4gICAgICAgICAgICAvLyBubyByZWxheW91dCBpcyB0cmlnZ2VyZWQgYW5kIEkgY2Fubm90IGltYWdpbmUgaG93IGl0IGNhblxuICAgICAgICAgICAgLy8gcmVjb21wdXRlIHRoZSBzY3JvbGwgcG9zaXRpb24gd2l0aG91dCBhIGxheW91dClcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IHRoaXMudmlldy52aWV3U3RhdGUuY29udGVudEhlaWdodCAvIHRoaXMudmlldy5zY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5mbGV4QmFzaXMgPSB0aGlzLm1pbldpZHRoID8gdGhpcy5taW5XaWR0aCArIFwicHhcIiA6IFwiXCI7XG4gICAgICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMsIHdoZW4gRE9NIG11dGF0aW9ucyBvY2N1ciBkaXJlY3RseVxuICAgICAgICAgICAgLy8gYXJvdW5kIHRoZSBzZWxlY3Rpb24sIGdldCBjb25mdXNlZCBhbmQgcmVwb3J0IGEgZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gZnJvbSB0aGUgb25lIGl0IGRpc3BsYXlzIChpc3N1ZSAjMjE4KS4gVGhpcyB0cmllc1xuICAgICAgICAgICAgLy8gdG8gZGV0ZWN0IHRoYXQgc2l0dWF0aW9uLlxuICAgICAgICAgICAgbGV0IHRyYWNrID0gYnJvd3Nlci5jaHJvbWUgfHwgYnJvd3Nlci5pb3MgPyB7IG5vZGU6IG9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSwgd3JpdHRlbjogZmFsc2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLnZpZXcsIHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MgJj0gfjcgLyogVmlld0ZsYWcuRGlydHkgKi87XG4gICAgICAgICAgICBpZiAodHJhY2sgJiYgKHRyYWNrLndyaXR0ZW4gfHwgb2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UuZm9jdXNOb2RlICE9IHRyYWNrLm5vZGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uZm9yRWFjaChjVmlldyA9PiBjVmlldy5mbGFncyAmPSB+OCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyk7XG4gICAgICAgIGxldCBnYXBzID0gW107XG4gICAgICAgIGlmICh0aGlzLnZpZXcudmlld3BvcnQuZnJvbSB8fCB0aGlzLnZpZXcudmlld3BvcnQudG8gPCB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aClcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3ICYmIGNoaWxkLndpZGdldCBpbnN0YW5jZW9mIEJsb2NrR2FwV2lkZ2V0KVxuICAgICAgICAgICAgICAgICAgICBnYXBzLnB1c2goY2hpbGQuZG9tKTtcbiAgICAgICAgb2JzZXJ2ZXIudXBkYXRlR2FwcyhnYXBzKTtcbiAgICB9XG4gICAgdXBkYXRlQ2hpbGRyZW4oY2hhbmdlcywgb2xkTGVuZ3RoLCBjb21wb3NpdGlvbikge1xuICAgICAgICBsZXQgcmFuZ2VzID0gY29tcG9zaXRpb24gPyBjb21wb3NpdGlvbi5yYW5nZS5hZGRUb1NldChjaGFuZ2VzLnNsaWNlKCkpIDogY2hhbmdlcztcbiAgICAgICAgbGV0IGN1cnNvciA9IHRoaXMuY2hpbGRDdXJzb3Iob2xkTGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHJhbmdlcy5sZW5ndGggLSAxOzsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGkgPj0gMCA/IHJhbmdlc1tpXSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgeyBmcm9tQSwgdG9BLCBmcm9tQiwgdG9CIH0gPSBuZXh0LCBjb250ZW50LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZDtcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiA8IHRvQiAmJiBjb21wb3NpdGlvbi5yYW5nZS50b0IgPiBmcm9tQikge1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBDb250ZW50QnVpbGRlci5idWlsZCh0aGlzLnZpZXcuc3RhdGUuZG9jLCBmcm9tQiwgY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApO1xuICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGNvbXBvc2l0aW9uLnJhbmdlLnRvQiwgdG9CLCB0aGlzLmRlY29yYXRpb25zLCB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgICAgICAgICBicmVha0F0U3RhcnQgPSBiZWZvcmUuYnJlYWtBdFN0YXJ0O1xuICAgICAgICAgICAgICAgIG9wZW5TdGFydCA9IGJlZm9yZS5vcGVuU3RhcnQ7XG4gICAgICAgICAgICAgICAgb3BlbkVuZCA9IGFmdGVyLm9wZW5FbmQ7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBMaW5lID0gdGhpcy5jb21wb3NpdGlvblZpZXcoY29tcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChhZnRlci5icmVha0F0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUuYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyLmNvbnRlbnQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLm1lcmdlKGNvbXBMaW5lLmxlbmd0aCwgY29tcExpbmUubGVuZ3RoLCBhZnRlci5jb250ZW50WzBdLCBmYWxzZSwgYWZ0ZXIub3BlblN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5icmVha0FmdGVyID0gYWZ0ZXIuY29udGVudFswXS5icmVha0FmdGVyO1xuICAgICAgICAgICAgICAgICAgICBhZnRlci5jb250ZW50LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUuY29udGVudC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUubWVyZ2UoMCwgMCwgYmVmb3JlLmNvbnRlbnRbYmVmb3JlLmNvbnRlbnQubGVuZ3RoIC0gMV0sIHRydWUsIDAsIGJlZm9yZS5vcGVuRW5kKSkge1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmUuY29udGVudC5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGJlZm9yZS5jb250ZW50LmNvbmNhdChjb21wTGluZSkuY29uY2F0KGFmdGVyLmNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgKHsgY29udGVudCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9XG4gICAgICAgICAgICAgICAgICAgIENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGZyb21CLCB0b0IsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB7IGk6IHRvSSwgb2ZmOiB0b09mZiB9ID0gY3Vyc29yLmZpbmRQb3ModG9BLCAxKTtcbiAgICAgICAgICAgIGxldCB7IGk6IGZyb21JLCBvZmY6IGZyb21PZmYgfSA9IGN1cnNvci5maW5kUG9zKGZyb21BLCAtMSk7XG4gICAgICAgICAgICByZXBsYWNlUmFuZ2UodGhpcywgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGNvbnRlbnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9zaXRpb24pXG4gICAgICAgICAgICB0aGlzLmZpeENvbXBvc2l0aW9uRE9NKGNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgdXBkYXRlRWRpdENvbnRleHRGb3JtYXR0aW5nKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0Rm9ybWF0dGluZyA9IHRoaXMuZWRpdENvbnRleHRGb3JtYXR0aW5nLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHVwZGF0ZS50cmFuc2FjdGlvbnMpXG4gICAgICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKHNldEVkaXRDb250ZXh0Rm9ybWF0dGluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dEZvcm1hdHRpbmcgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgIH1cbiAgICBjb21wb3NpdGlvblZpZXcoY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGN1ciA9IG5ldyBUZXh0Vmlldyhjb21wb3NpdGlvbi50ZXh0Lm5vZGVWYWx1ZSk7XG4gICAgICAgIGN1ci5mbGFncyB8PSA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovO1xuICAgICAgICBmb3IgKGxldCB7IGRlY28gfSBvZiBjb21wb3NpdGlvbi5tYXJrcylcbiAgICAgICAgICAgIGN1ciA9IG5ldyBNYXJrVmlldyhkZWNvLCBbY3VyXSwgY3VyLmxlbmd0aCk7XG4gICAgICAgIGxldCBsaW5lID0gbmV3IExpbmVWaWV3O1xuICAgICAgICBsaW5lLmFwcGVuZChjdXIsIDApO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgZml4Q29tcG9zaXRpb25ET00oY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGZpeCA9IChkb20sIGNWaWV3KSA9PiB7XG4gICAgICAgICAgICBjVmlldy5mbGFncyB8PSA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovIHwgKGNWaWV3LmNoaWxkcmVuLnNvbWUoYyA9PiBjLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykgPyAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8gOiAwKTtcbiAgICAgICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uYWRkKGNWaWV3KTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gQ29udGVudFZpZXcuZ2V0KGRvbSk7XG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2ICE9IGNWaWV3KVxuICAgICAgICAgICAgICAgIHByZXYuZG9tID0gbnVsbDtcbiAgICAgICAgICAgIGNWaWV3LnNldERPTShkb20pO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5jaGlsZFBvcyhjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgMSk7XG4gICAgICAgIGxldCBjVmlldyA9IHRoaXMuY2hpbGRyZW5bcG9zLmldO1xuICAgICAgICBmaXgoY29tcG9zaXRpb24ubGluZSwgY1ZpZXcpO1xuICAgICAgICBmb3IgKGxldCBpID0gY29tcG9zaXRpb24ubWFya3MubGVuZ3RoIC0gMTsgaSA+PSAtMTsgaS0tKSB7XG4gICAgICAgICAgICBwb3MgPSBjVmlldy5jaGlsZFBvcyhwb3Mub2ZmLCAxKTtcbiAgICAgICAgICAgIGNWaWV3ID0gY1ZpZXcuY2hpbGRyZW5bcG9zLmldO1xuICAgICAgICAgICAgZml4KGkgPj0gMCA/IGNvbXBvc2l0aW9uLm1hcmtzW2ldLm5vZGUgOiBjb21wb3NpdGlvbi50ZXh0LCBjVmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU3luYyB0aGUgRE9NIHNlbGVjdGlvbiB0byB0aGlzLnN0YXRlLnNlbGVjdGlvblxuICAgIHVwZGF0ZVNlbGVjdGlvbihtdXN0UmVhZCA9IGZhbHNlLCBmcm9tUG9pbnRlciA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChtdXN0UmVhZCB8fCAhdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSlcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IGFjdGl2ZUVsdCA9IHRoaXMudmlldy5yb290LmFjdGl2ZUVsZW1lbnQsIGZvY3VzZWQgPSBhY3RpdmVFbHQgPT0gdGhpcy5kb207XG4gICAgICAgIGxldCBzZWxlY3Rpb25Ob3RGb2N1cyA9ICFmb2N1c2VkICYmICEodGhpcy52aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSB8fCB0aGlzLmRvbS50YWJJbmRleCA+IC0xKSAmJlxuICAgICAgICAgICAgaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCB0aGlzLnZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UpICYmICEoYWN0aXZlRWx0ICYmIHRoaXMuZG9tLmNvbnRhaW5zKGFjdGl2ZUVsdCkpO1xuICAgICAgICBpZiAoIShmb2N1c2VkIHx8IGZyb21Qb2ludGVyIHx8IHNlbGVjdGlvbk5vdEZvY3VzKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGZvcmNlID0gdGhpcy5mb3JjZVNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICBsZXQgbWFpbiA9IHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgbGV0IGFuY2hvciA9IHRoaXMubW92ZVRvTGluZSh0aGlzLmRvbUF0UG9zKG1haW4uYW5jaG9yKSk7XG4gICAgICAgIGxldCBoZWFkID0gbWFpbi5lbXB0eSA/IGFuY2hvciA6IHRoaXMubW92ZVRvTGluZSh0aGlzLmRvbUF0UG9zKG1haW4uaGVhZCkpO1xuICAgICAgICAvLyBBbHdheXMgcmVzZXQgb24gRmlyZWZveCB3aGVuIG5leHQgdG8gYW4gdW5lZGl0YWJsZSBub2RlIHRvXG4gICAgICAgIC8vIGF2b2lkIGludmlzaWJsZSBjdXJzb3IgYnVncyAoIzExMSlcbiAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28gJiYgbWFpbi5lbXB0eSAmJiAhdGhpcy5oYXNDb21wb3NpdGlvbiAmJiBiZXR3ZWVuVW5lZGl0YWJsZShhbmNob3IpKSB7XG4gICAgICAgICAgICBsZXQgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4gYW5jaG9yLm5vZGUuaW5zZXJ0QmVmb3JlKGR1bW15LCBhbmNob3Iubm9kZS5jaGlsZE5vZGVzW2FuY2hvci5vZmZzZXRdIHx8IG51bGwpKTtcbiAgICAgICAgICAgIGFuY2hvciA9IGhlYWQgPSBuZXcgRE9NUG9zKGR1bW15LCAwKTtcbiAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZG9tU2VsID0gdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGFscmVhZHkgaGVyZSwgb3IgaW4gYW4gZXF1aXZhbGVudCBwb3NpdGlvbiwgZG9uJ3QgdG91Y2ggaXRcbiAgICAgICAgaWYgKGZvcmNlIHx8ICFkb21TZWwuZm9jdXNOb2RlIHx8ICghaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KSB8fFxuICAgICAgICAgICAgIWlzRXF1aXZhbGVudFBvc2l0aW9uKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQsIGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCkpICYmICF0aGlzLnN1cHByZXNzV2lkZ2V0Q3Vyc29yQ2hhbmdlKGRvbVNlbCwgbWFpbikpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENocm9tZSBBbmRyb2lkIHdpbGwgaGlkZSB0aGUgdmlydHVhbCBrZXlib2FyZCB3aGVuIHRhcHBpbmdcbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYW4gdW5lZGl0YWJsZSBub2RlLCBhbmQgbm90IGJyaW5nIGl0IGJhY2sgd2hlbiB3ZVxuICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIGN1cnNvciB0byBpdHMgcHJvcGVyIHBvc2l0aW9uLiBUaGlzIHRyaWVzIHRvXG4gICAgICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUga2V5Ym9hcmQgYnkgY3ljbGluZyBmb2N1cy5cbiAgICAgICAgICAgICAgICBpZiAoYnJvd3Nlci5hbmRyb2lkICYmIGJyb3dzZXIuY2hyb21lICYmIHRoaXMuZG9tLmNvbnRhaW5zKGRvbVNlbC5mb2N1c05vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgIGluVW5lZGl0YWJsZShkb21TZWwuZm9jdXNOb2RlLCB0aGlzLmRvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByYXdTZWwgPSBnZXRTZWxlY3Rpb24odGhpcy52aWV3LnJvb3QpO1xuICAgICAgICAgICAgICAgIGlmICghcmF3U2VsKSA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWFpbi5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjEyMDc2XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFRvID0gbmV4dFRvVW5lZGl0YWJsZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRvICYmIG5leHRUbyAhPSAoMSAvKiBOZXh0VG8uQmVmb3JlICovIHwgMiAvKiBOZXh0VG8uQWZ0ZXIgKi8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSAobmV4dFRvID09IDEgLyogTmV4dFRvLkJlZm9yZSAqLyA/IHRleHROb2RlQmVmb3JlIDogdGV4dE5vZGVBZnRlcikoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBuZXcgRE9NUG9zKHRleHQubm9kZSwgdGV4dC5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jb2xsYXBzZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYWluLmJpZGlMZXZlbCAhPSBudWxsICYmIHJhd1NlbC5jYXJldEJpZGlMZXZlbCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmNhcmV0QmlkaUxldmVsID0gbWFpbi5iaWRpTGV2ZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd1NlbC5leHRlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0aW9uLmV4dGVuZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gJ2ludmVydGVkJyBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gKG9uZSB3aGVyZSB0aGUgZm9jdXMgaXMgYmVmb3JlIHRoZSBhbmNob3IpLCBidXQgbm90IGFsbFxuICAgICAgICAgICAgICAgICAgICAvLyBicm93c2VycyBzdXBwb3J0IGl0IHlldC5cbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmNvbGxhcHNlKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2FmYXJpIHdpbGwgaWdub3JlIHRoZSBjYWxsIGFib3ZlIHdoZW4gdGhlIGVkaXRvciBpc1xuICAgICAgICAgICAgICAgICAgICAvLyBoaWRkZW4sIGFuZCB0aGVuIHJhaXNlIGFuIGVycm9yIG9uIHRoZSBjYWxsIHRvIGV4dGVuZFxuICAgICAgICAgICAgICAgICAgICAvLyAoIzk0MCkuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdTZWwuZXh0ZW5kKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByaW1pdGl2ZSAoSUUpIHdheVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFpbi5hbmNob3IgPiBtYWluLmhlYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBbYW5jaG9yLCBoZWFkXSA9IFtoZWFkLCBhbmNob3JdO1xuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQoaGVhZC5ub2RlLCBoZWFkLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICByYXdTZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uTm90Rm9jdXMgJiYgdGhpcy52aWV3LnJvb3QuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFbHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFbHQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5zZXRTZWxlY3Rpb25SYW5nZShhbmNob3IsIGhlYWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW1wcmVjaXNlQW5jaG9yID0gYW5jaG9yLnByZWNpc2UgPyBudWxsIDogbmV3IERPTVBvcyhkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCk7XG4gICAgICAgIHRoaXMuaW1wcmVjaXNlSGVhZCA9IGhlYWQucHJlY2lzZSA/IG51bGwgOiBuZXcgRE9NUG9zKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCk7XG4gICAgfVxuICAgIC8vIElmIGEgemVyby1sZW5ndGggd2lkZ2V0IGlzIGluc2VydGVkIG5leHQgdG8gdGhlIGN1cnNvciBkdXJpbmdcbiAgICAvLyBjb21wb3NpdGlvbiwgYXZvaWQgbW92aW5nIGl0IGFjcm9zcyBpdCBhbmQgZGlzcnVwdGluZyB0aGVcbiAgICAvLyBjb21wb3NpdGlvbi5cbiAgICBzdXBwcmVzc1dpZGdldEN1cnNvckNoYW5nZShzZWwsIGN1cnNvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNDb21wb3NpdGlvbiAmJiBjdXJzb3IuZW1wdHkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpICYmXG4gICAgICAgICAgICB0aGlzLnBvc0Zyb21ET00oc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KSA9PSBjdXJzb3IuaGVhZDtcbiAgICB9XG4gICAgZW5mb3JjZUN1cnNvckFzc29jKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNDb21wb3NpdGlvbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcywgY3Vyc29yID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgbGV0IHNlbCA9IGdldFNlbGVjdGlvbih2aWV3LnJvb3QpO1xuICAgICAgICBsZXQgeyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQgfSA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIGlmICghc2VsIHx8ICFjdXJzb3IuZW1wdHkgfHwgIWN1cnNvci5hc3NvYyB8fCAhc2VsLm1vZGlmeSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHRoaXMsIGN1cnNvci5oZWFkKTtcbiAgICAgICAgaWYgKCFsaW5lKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gbGluZS5wb3NBdFN0YXJ0O1xuICAgICAgICBpZiAoY3Vyc29yLmhlYWQgPT0gbGluZVN0YXJ0IHx8IGN1cnNvci5oZWFkID09IGxpbmVTdGFydCArIGxpbmUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgYmVmb3JlID0gdGhpcy5jb29yZHNBdChjdXJzb3IuaGVhZCwgLTEpLCBhZnRlciA9IHRoaXMuY29vcmRzQXQoY3Vyc29yLmhlYWQsIDEpO1xuICAgICAgICBpZiAoIWJlZm9yZSB8fCAhYWZ0ZXIgfHwgYmVmb3JlLmJvdHRvbSA+IGFmdGVyLnRvcClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGRvbSA9IHRoaXMuZG9tQXRQb3MoY3Vyc29yLmhlYWQgKyBjdXJzb3IuYXNzb2MpO1xuICAgICAgICBzZWwuY29sbGFwc2UoZG9tLm5vZGUsIGRvbS5vZmZzZXQpO1xuICAgICAgICBzZWwubW9kaWZ5KFwibW92ZVwiLCBjdXJzb3IuYXNzb2MgPCAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsIFwibGluZWJvdW5kYXJ5XCIpO1xuICAgICAgICAvLyBUaGlzIGNhbiBnbyB3cm9uZyBpbiBjb3JuZXIgY2FzZXMgbGlrZSBzaW5nbGUtY2hhcmFjdGVyIGxpbmVzLFxuICAgICAgICAvLyBzbyBjaGVjayBhbmQgcmVzZXQgaWYgbmVjZXNzYXJ5LlxuICAgICAgICB2aWV3Lm9ic2VydmVyLnJlYWRTZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICBsZXQgbmV3UmFuZ2UgPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICBpZiAodmlldy5kb2NWaWV3LnBvc0Zyb21ET00obmV3UmFuZ2UuYW5jaG9yTm9kZSwgbmV3UmFuZ2UuYW5jaG9yT2Zmc2V0KSAhPSBjdXJzb3IuZnJvbSlcbiAgICAgICAgICAgIHNlbC5jb2xsYXBzZShhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpO1xuICAgIH1cbiAgICAvLyBJZiBhIHBvc2l0aW9uIGlzIGluL25lYXIgYSBibG9jayB3aWRnZXQsIG1vdmUgaXQgdG8gYSBuZWFyYnkgdGV4dFxuICAgIC8vIGxpbmUsIHNpbmNlIHdlIGRvbid0IHdhbnQgdGhlIGN1cnNvciBpbnNpZGUgYSBibG9jayB3aWRnZXQuXG4gICAgbW92ZVRvTGluZShwb3MpIHtcbiAgICAgICAgLy8gQmxvY2sgd2lkZ2V0cyB3aWxsIHJldHVybiBwb3NpdGlvbnMgYmVmb3JlL2FmdGVyIHRoZW0sIHdoaWNoXG4gICAgICAgIC8vIGFyZSB0aHVzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudCBET00gZWxlbWVudC5cbiAgICAgICAgbGV0IGRvbSA9IHRoaXMuZG9tLCBuZXdQb3M7XG4gICAgICAgIGlmIChwb3Mubm9kZSAhPSBkb20pXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBmb3IgKGxldCBpID0gcG9zLm9mZnNldDsgIW5ld1BvcyAmJiBpIDwgZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2aWV3ID0gQ29udGVudFZpZXcuZ2V0KGRvbS5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgbmV3UG9zID0gdmlldy5kb21BdFBvcygwKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gcG9zLm9mZnNldCAtIDE7ICFuZXdQb3MgJiYgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB2aWV3ID0gQ29udGVudFZpZXcuZ2V0KGRvbS5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgbmV3UG9zID0gdmlldy5kb21BdFBvcyh2aWV3Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1BvcyA/IG5ldyBET01Qb3MobmV3UG9zLm5vZGUsIG5ld1Bvcy5vZmZzZXQsIHRydWUpIDogcG9zO1xuICAgIH1cbiAgICBuZWFyZXN0KGRvbSkge1xuICAgICAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjspIHtcbiAgICAgICAgICAgIGxldCBkb21WaWV3ID0gQ29udGVudFZpZXcuZ2V0KGN1cik7XG4gICAgICAgICAgICBpZiAoZG9tVmlldyAmJiBkb21WaWV3LnJvb3RWaWV3ID09IHRoaXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbVZpZXc7XG4gICAgICAgICAgICBjdXIgPSBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcG9zRnJvbURPTShub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHZpZXcgPSB0aGlzLm5lYXJlc3Qobm9kZSk7XG4gICAgICAgIGlmICghdmlldylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIGZpbmQgcG9zaXRpb24gZm9yIGEgRE9NIHBvc2l0aW9uIG91dHNpZGUgb2YgdGhlIGRvY3VtZW50XCIpO1xuICAgICAgICByZXR1cm4gdmlldy5sb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSArIHZpZXcucG9zQXRTdGFydDtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZEN1cnNvcigpLmZpbmRQb3MocG9zLCAtMSk7XG4gICAgICAgIGZvciAoOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxOykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChvZmYgPCBjaGlsZC5sZW5ndGggfHwgY2hpbGQgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIG9mZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5baV0uZG9tQXRQb3Mob2ZmKTtcbiAgICB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCBiZXN0ID0gbnVsbCwgYmVzdFBvcyA9IDA7XG4gICAgICAgIGZvciAobGV0IG9mZiA9IHRoaXMubGVuZ3RoLCBpID0gdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2ZmIC0gY2hpbGQuYnJlYWtBZnRlciwgc3RhcnQgPSBlbmQgLSBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kIDwgcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IHBvcyAmJiAoc3RhcnQgPCBwb3MgfHwgY2hpbGQuY292ZXJzKC0xKSkgJiYgKGVuZCA+IHBvcyB8fCBjaGlsZC5jb3ZlcnMoMSkpICYmXG4gICAgICAgICAgICAgICAgKCFiZXN0IHx8IGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcgJiYgIShiZXN0IGluc3RhbmNlb2YgTGluZVZpZXcgJiYgc2lkZSA+PSAwKSkpIHtcbiAgICAgICAgICAgICAgICBiZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgYmVzdFBvcyA9IHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmVzdCAmJiBzdGFydCA9PSBwb3MgJiYgZW5kID09IHBvcyAmJiBjaGlsZCBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJiBNYXRoLmFicyhzaWRlKSA8IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZGVjby5zdGFydFNpZGUgPCAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpKVxuICAgICAgICAgICAgICAgICAgICBiZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IHN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0ID8gYmVzdC5jb29yZHNBdChwb3MgLSBiZXN0UG9zLCBzaWRlKSA6IG51bGw7XG4gICAgfVxuICAgIGNvb3Jkc0ZvckNoYXIocG9zKSB7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZFBvcyhwb3MsIDEpLCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlIChjaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IGksIG9mZjogY2hpbGRPZmYgfSA9IGNoaWxkLmNoaWxkUG9zKG9mZiwgMSk7XG4gICAgICAgICAgICBmb3IgKDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpID09IGNoaWxkLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKChjaGlsZCA9IGNoaWxkLmNoaWxkcmVuW2ldKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gY2hpbGRPZmY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUZXh0VmlldykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGVuZCA9IGZpbmRDbHVzdGVyQnJlYWsoY2hpbGQudGV4dCwgb2ZmKTtcbiAgICAgICAgaWYgKGVuZCA9PSBvZmYpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKGNoaWxkLmRvbSwgb2ZmLCBlbmQpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAoaSA9PSByZWN0cy5sZW5ndGggLSAxIHx8IHJlY3QudG9wIDwgcmVjdC5ib3R0b20gJiYgcmVjdC5sZWZ0IDwgcmVjdC5yaWdodClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh2aWV3cG9ydCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIHsgZnJvbSwgdG8gfSA9IHZpZXdwb3J0O1xuICAgICAgICBsZXQgY29udGVudFdpZHRoID0gdGhpcy52aWV3LmNvbnRlbnRET00uY2xpZW50V2lkdGg7XG4gICAgICAgIGxldCBpc1dpZGVyID0gY29udGVudFdpZHRoID4gTWF0aC5tYXgodGhpcy52aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aCwgdGhpcy5taW5XaWR0aCkgKyAxO1xuICAgICAgICBsZXQgd2lkZXN0ID0gLTEsIGx0ciA9IHRoaXMudmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUmVjdCA9IGNoaWxkLmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZFJlY3QuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNXaWRlcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGNoaWxkLmRvbS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0cyA9IGxhc3QgPyBjbGllbnRSZWN0c0ZvcihsYXN0KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW3JlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gbHRyID8gcmVjdC5yaWdodCAtIGNoaWxkUmVjdC5sZWZ0IDogY2hpbGRSZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gd2lkZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZXN0ID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aCA9IGNvbnRlbnRXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoRnJvbSA9IHBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoVG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRleHREaXJlY3Rpb25BdChwb3MpIHtcbiAgICAgICAgbGV0IHsgaSB9ID0gdGhpcy5jaGlsZFBvcyhwb3MsIDEpO1xuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNoaWxkcmVuW2ldLmRvbSkuZGlyZWN0aW9uID09IFwicnRsXCIgPyBEaXJlY3Rpb24uUlRMIDogRGlyZWN0aW9uLkxUUjtcbiAgICB9XG4gICAgbWVhc3VyZVRleHRTaXplKCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBMaW5lVmlldykge1xuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJlID0gY2hpbGQubWVhc3VyZVRleHRTaXplKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHdvcmthYmxlIGxpbmUgZXhpc3RzLCBmb3JjZSBhIGxheW91dCBvZiBhIG1lYXN1cmFibGUgZWxlbWVudFxuICAgICAgICBsZXQgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQ7XG4gICAgICAgIGR1bW15LmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICBkdW1teS5zdHlsZS53aWR0aCA9IFwiOTk5OTlweFwiO1xuICAgICAgICBkdW1teS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgZHVtbXkudGV4dENvbnRlbnQgPSBcImFiYyBkZWYgZ2hpIGprbCBtbm8gcHFyIHN0dVwiO1xuICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGR1bW15KTtcbiAgICAgICAgICAgIGxldCByZWN0ID0gY2xpZW50UmVjdHNGb3IoZHVtbXkuZmlyc3RDaGlsZClbMF07XG4gICAgICAgICAgICBsaW5lSGVpZ2h0ID0gZHVtbXkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY2hhcldpZHRoID0gcmVjdCA/IHJlY3Qud2lkdGggLyAyNyA6IDc7XG4gICAgICAgICAgICB0ZXh0SGVpZ2h0ID0gcmVjdCA/IHJlY3QuaGVpZ2h0IDogbGluZUhlaWdodDtcbiAgICAgICAgICAgIGR1bW15LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0IH07XG4gICAgfVxuICAgIGNoaWxkQ3Vyc29yKHBvcyA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIE1vdmUgYmFjayB0byBzdGFydCBvZiBsYXN0IGVsZW1lbnQgd2hlbiBwb3NzaWJsZSwgc28gdGhhdFxuICAgICAgICAvLyBgQ2hpbGRDdXJzb3IuZmluZFBvc2AgZG9lc24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgZWRnZSBjYXNlXG4gICAgICAgIC8vIG9mIGJlaW5nIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuXG4gICAgICAgIGxldCBpID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgIGlmIChpKVxuICAgICAgICAgICAgcG9zIC09IHRoaXMuY2hpbGRyZW5bLS1pXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBuZXcgQ2hpbGRDdXJzb3IodGhpcy5jaGlsZHJlbiwgcG9zLCBpKTtcbiAgICB9XG4gICAgY29tcHV0ZUJsb2NrR2FwRGVjbygpIHtcbiAgICAgICAgbGV0IGRlY28gPSBbXSwgdnMgPSB0aGlzLnZpZXcudmlld1N0YXRlO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBpID09IHZzLnZpZXdwb3J0cy5sZW5ndGggPyBudWxsIDogdnMudmlld3BvcnRzW2ldO1xuICAgICAgICAgICAgbGV0IGVuZCA9IG5leHQgPyBuZXh0LmZyb20gLSAxIDogdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9ICh2cy5saW5lQmxvY2tBdChlbmQpLmJvdHRvbSAtIHZzLmxpbmVCbG9ja0F0KHBvcykudG9wKSAvIHRoaXMudmlldy5zY2FsZVk7XG4gICAgICAgICAgICAgICAgZGVjby5wdXNoKERlY29yYXRpb24ucmVwbGFjZSh7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IEJsb2NrR2FwV2lkZ2V0KGhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlzQmxvY2tHYXA6IHRydWUsXG4gICAgICAgICAgICAgICAgfSkucmFuZ2UocG9zLCBlbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBvcyA9IG5leHQudG8gKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvKTtcbiAgICB9XG4gICAgdXBkYXRlRGVjbygpIHtcbiAgICAgICAgbGV0IGkgPSAxO1xuICAgICAgICBsZXQgYWxsRGVjbyA9IHRoaXMudmlldy5zdGF0ZS5mYWNldChkZWNvcmF0aW9ucykubWFwKGQgPT4ge1xuICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2krK10gPSB0eXBlb2YgZCA9PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pYyA/IGQodGhpcy52aWV3KSA6IGQ7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZHluYW1pY091dGVyID0gZmFsc2UsIG91dGVyRGVjbyA9IHRoaXMudmlldy5zdGF0ZS5mYWNldChvdXRlckRlY29yYXRpb25zKS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBkeW5hbWljID0gdHlwZW9mIGQgPT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgaWYgKGR5bmFtaWMpXG4gICAgICAgICAgICAgICAgZHluYW1pY091dGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBkeW5hbWljID8gZCh0aGlzLnZpZXcpIDogZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvdXRlckRlY28ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2krK10gPSBkeW5hbWljT3V0ZXI7XG4gICAgICAgICAgICBhbGxEZWNvLnB1c2goUmFuZ2VTZXQuam9pbihvdXRlckRlY28pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gW1xuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dEZvcm1hdHRpbmcsXG4gICAgICAgICAgICAuLi5hbGxEZWNvLFxuICAgICAgICAgICAgdGhpcy5jb21wdXRlQmxvY2tHYXBEZWNvKCksXG4gICAgICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLmxpbmVHYXBEZWNvXG4gICAgICAgIF07XG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5kZWNvcmF0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2krK10gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjb3JhdGlvbnM7XG4gICAgfVxuICAgIHNjcm9sbEludG9WaWV3KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0LmlzU25hcHNob3QpIHtcbiAgICAgICAgICAgIGxldCByZWYgPSB0aGlzLnZpZXcudmlld1N0YXRlLmxpbmVCbG9ja0F0KHRhcmdldC5yYW5nZS5oZWFkKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsVG9wID0gcmVmLnRvcCAtIHRhcmdldC55TWFyZ2luO1xuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0ID0gdGFyZ2V0LnhNYXJnaW47XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiB0aGlzLnZpZXcuc3RhdGUuZmFjZXQoc2Nyb2xsSGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIodGhpcy52aWV3LCB0YXJnZXQucmFuZ2UsIHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy52aWV3LnN0YXRlLCBlLCBcInNjcm9sbCBoYW5kbGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB7IHJhbmdlIH0gPSB0YXJnZXQ7XG4gICAgICAgIGxldCByZWN0ID0gdGhpcy5jb29yZHNBdChyYW5nZS5oZWFkLCByYW5nZS5lbXB0eSA/IHJhbmdlLmFzc29jIDogcmFuZ2UuaGVhZCA+IHJhbmdlLmFuY2hvciA/IC0xIDogMSksIG90aGVyO1xuICAgICAgICBpZiAoIXJlY3QpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghcmFuZ2UuZW1wdHkgJiYgKG90aGVyID0gdGhpcy5jb29yZHNBdChyYW5nZS5hbmNob3IsIHJhbmdlLmFuY2hvciA+IHJhbmdlLmhlYWQgPyAtMSA6IDEpKSlcbiAgICAgICAgICAgIHJlY3QgPSB7IGxlZnQ6IE1hdGgubWluKHJlY3QubGVmdCwgb3RoZXIubGVmdCksIHRvcDogTWF0aC5taW4ocmVjdC50b3AsIG90aGVyLnRvcCksXG4gICAgICAgICAgICAgICAgcmlnaHQ6IE1hdGgubWF4KHJlY3QucmlnaHQsIG90aGVyLnJpZ2h0KSwgYm90dG9tOiBNYXRoLm1heChyZWN0LmJvdHRvbSwgb3RoZXIuYm90dG9tKSB9O1xuICAgICAgICBsZXQgbWFyZ2lucyA9IGdldFNjcm9sbE1hcmdpbnModGhpcy52aWV3KTtcbiAgICAgICAgbGV0IHRhcmdldFJlY3QgPSB7XG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBtYXJnaW5zLmxlZnQsIHRvcDogcmVjdC50b3AgLSBtYXJnaW5zLnRvcCxcbiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgbWFyZ2lucy5yaWdodCwgYm90dG9tOiByZWN0LmJvdHRvbSArIG1hcmdpbnMuYm90dG9tXG4gICAgICAgIH07XG4gICAgICAgIGxldCB7IG9mZnNldFdpZHRoLCBvZmZzZXRIZWlnaHQgfSA9IHRoaXMudmlldy5zY3JvbGxET007XG4gICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLnZpZXcuc2Nyb2xsRE9NLCB0YXJnZXRSZWN0LCByYW5nZS5oZWFkIDwgcmFuZ2UuYW5jaG9yID8gLTEgOiAxLCB0YXJnZXQueCwgdGFyZ2V0LnksIE1hdGgubWF4KE1hdGgubWluKHRhcmdldC54TWFyZ2luLCBvZmZzZXRXaWR0aCksIC1vZmZzZXRXaWR0aCksIE1hdGgubWF4KE1hdGgubWluKHRhcmdldC55TWFyZ2luLCBvZmZzZXRIZWlnaHQpLCAtb2Zmc2V0SGVpZ2h0KSwgdGhpcy52aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUik7XG4gICAgfVxufVxuZnVuY3Rpb24gYmV0d2VlblVuZWRpdGFibGUocG9zKSB7XG4gICAgcmV0dXJuIHBvcy5ub2RlLm5vZGVUeXBlID09IDEgJiYgcG9zLm5vZGUuZmlyc3RDaGlsZCAmJlxuICAgICAgICAocG9zLm9mZnNldCA9PSAwIHx8IHBvcy5ub2RlLmNoaWxkTm9kZXNbcG9zLm9mZnNldCAtIDFdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpICYmXG4gICAgICAgIChwb3Mub2Zmc2V0ID09IHBvcy5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoIHx8IHBvcy5ub2RlLmNoaWxkTm9kZXNbcG9zLm9mZnNldF0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIik7XG59XG5mdW5jdGlvbiBmaW5kQ29tcG9zaXRpb25Ob2RlKHZpZXcsIGhlYWRQb3MpIHtcbiAgICBsZXQgc2VsID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICBpZiAoIXNlbC5mb2N1c05vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCB0ZXh0QmVmb3JlID0gdGV4dE5vZGVCZWZvcmUoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBsZXQgdGV4dEFmdGVyID0gdGV4dE5vZGVBZnRlcihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQpO1xuICAgIGxldCB0ZXh0Tm9kZSA9IHRleHRCZWZvcmUgfHwgdGV4dEFmdGVyO1xuICAgIGlmICh0ZXh0QWZ0ZXIgJiYgdGV4dEJlZm9yZSAmJiB0ZXh0QWZ0ZXIubm9kZSAhPSB0ZXh0QmVmb3JlLm5vZGUpIHtcbiAgICAgICAgbGV0IGRlc2NBZnRlciA9IENvbnRlbnRWaWV3LmdldCh0ZXh0QWZ0ZXIubm9kZSk7XG4gICAgICAgIGlmICghZGVzY0FmdGVyIHx8IGRlc2NBZnRlciBpbnN0YW5jZW9mIFRleHRWaWV3ICYmIGRlc2NBZnRlci50ZXh0ICE9IHRleHRBZnRlci5ub2RlLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgdGV4dE5vZGUgPSB0ZXh0QWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlldy5kb2NWaWV3Lmxhc3RDb21wb3NpdGlvbkFmdGVyQ3Vyc29yKSB7XG4gICAgICAgICAgICBsZXQgZGVzY0JlZm9yZSA9IENvbnRlbnRWaWV3LmdldCh0ZXh0QmVmb3JlLm5vZGUpO1xuICAgICAgICAgICAgaWYgKCEoIWRlc2NCZWZvcmUgfHwgZGVzY0JlZm9yZSBpbnN0YW5jZW9mIFRleHRWaWV3ICYmIGRlc2NCZWZvcmUudGV4dCAhPSB0ZXh0QmVmb3JlLm5vZGUubm9kZVZhbHVlKSlcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZSA9IHRleHRBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LmRvY1ZpZXcubGFzdENvbXBvc2l0aW9uQWZ0ZXJDdXJzb3IgPSB0ZXh0Tm9kZSAhPSB0ZXh0QmVmb3JlO1xuICAgIGlmICghdGV4dE5vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmcm9tID0gaGVhZFBvcyAtIHRleHROb2RlLm9mZnNldDtcbiAgICByZXR1cm4geyBmcm9tLCB0bzogZnJvbSArIHRleHROb2RlLm5vZGUubm9kZVZhbHVlLmxlbmd0aCwgbm9kZTogdGV4dE5vZGUubm9kZSB9O1xufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uUmFuZ2UodmlldywgY2hhbmdlcywgaGVhZFBvcykge1xuICAgIGxldCBmb3VuZCA9IGZpbmRDb21wb3NpdGlvbk5vZGUodmlldywgaGVhZFBvcyk7XG4gICAgaWYgKCFmb3VuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHsgbm9kZTogdGV4dE5vZGUsIGZyb20sIHRvIH0gPSBmb3VuZCwgdGV4dCA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAvLyBEb24ndCB0cnkgdG8gcHJlc2VydmUgbXVsdGktbGluZSBjb21wb3NpdGlvbnNcbiAgICBpZiAoL1tcXG5cXHJdLy50ZXN0KHRleHQpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoZm91bmQuZnJvbSwgZm91bmQudG8pICE9IHRleHQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBpbnYgPSBjaGFuZ2VzLmludmVydGVkRGVzYztcbiAgICBsZXQgcmFuZ2UgPSBuZXcgQ2hhbmdlZFJhbmdlKGludi5tYXBQb3MoZnJvbSksIGludi5tYXBQb3ModG8pLCBmcm9tLCB0byk7XG4gICAgbGV0IG1hcmtzID0gW107XG4gICAgZm9yIChsZXQgcGFyZW50ID0gdGV4dE5vZGUucGFyZW50Tm9kZTs7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGxldCBwYXJlbnRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KHBhcmVudCk7XG4gICAgICAgIGlmIChwYXJlbnRWaWV3IGluc3RhbmNlb2YgTWFya1ZpZXcpXG4gICAgICAgICAgICBtYXJrcy5wdXNoKHsgbm9kZTogcGFyZW50LCBkZWNvOiBwYXJlbnRWaWV3Lm1hcmsgfSk7XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudFZpZXcgaW5zdGFuY2VvZiBMaW5lVmlldyB8fCBwYXJlbnQubm9kZU5hbWUgPT0gXCJESVZcIiAmJiBwYXJlbnQucGFyZW50Tm9kZSA9PSB2aWV3LmNvbnRlbnRET00pXG4gICAgICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dDogdGV4dE5vZGUsIG1hcmtzLCBsaW5lOiBwYXJlbnQgfTtcbiAgICAgICAgZWxzZSBpZiAocGFyZW50ICE9IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgICAgIG1hcmtzLnB1c2goeyBub2RlOiBwYXJlbnQsIGRlY286IG5ldyBNYXJrRGVjb3JhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogZ2V0QXR0cnMocGFyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZTogcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIH0pIH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0VG9VbmVkaXRhYmxlKG5vZGUsIG9mZnNldCkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpXG4gICAgICAgIHJldHVybiAwO1xuICAgIHJldHVybiAob2Zmc2V0ICYmIG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiID8gMSAvKiBOZXh0VG8uQmVmb3JlICovIDogMCkgfFxuICAgICAgICAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAmJiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiID8gMiAvKiBOZXh0VG8uQWZ0ZXIgKi8gOiAwKTtcbn1cbmxldCBEZWNvcmF0aW9uQ29tcGFyYXRvciQxID0gY2xhc3MgRGVjb3JhdGlvbkNvbXBhcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBbXTtcbiAgICB9XG4gICAgY29tcGFyZVJhbmdlKGZyb20sIHRvKSB7IGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMpOyB9XG4gICAgY29tcGFyZVBvaW50KGZyb20sIHRvKSB7IGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMpOyB9XG4gICAgYm91bmRDaGFuZ2UocG9zKSB7IGFkZFJhbmdlKHBvcywgcG9zLCB0aGlzLmNoYW5nZXMpOyB9XG59O1xuZnVuY3Rpb24gZmluZENoYW5nZWREZWNvKGEsIGIsIGRpZmYpIHtcbiAgICBsZXQgY29tcCA9IG5ldyBEZWNvcmF0aW9uQ29tcGFyYXRvciQxO1xuICAgIFJhbmdlU2V0LmNvbXBhcmUoYSwgYiwgZGlmZiwgY29tcCk7XG4gICAgcmV0dXJuIGNvbXAuY2hhbmdlcztcbn1cbmZ1bmN0aW9uIGluVW5lZGl0YWJsZShub2RlLCBpbnNpZGUpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOyBjdXIgJiYgY3VyICE9IGluc2lkZTsgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZSkge1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDEgJiYgY3VyLmNvbnRlbnRFZGl0YWJsZSA9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0b3VjaGVzQ29tcG9zaXRpb24oY2hhbmdlcywgY29tcG9zaXRpb24pIHtcbiAgICBsZXQgdG91Y2hlZCA9IGZhbHNlO1xuICAgIGlmIChjb21wb3NpdGlvbilcbiAgICAgICAgY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgY29tcG9zaXRpb24udG8gJiYgdG8gPiBjb21wb3NpdGlvbi5mcm9tKVxuICAgICAgICAgICAgICAgIHRvdWNoZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hlZDtcbn1cblxuZnVuY3Rpb24gZ3JvdXBBdChzdGF0ZSwgcG9zLCBiaWFzID0gMSkge1xuICAgIGxldCBjYXRlZ29yaXplID0gc3RhdGUuY2hhckNhdGVnb3JpemVyKHBvcyk7XG4gICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcyksIGxpbmVQb3MgPSBwb3MgLSBsaW5lLmZyb207XG4gICAgaWYgKGxpbmUubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcyk7XG4gICAgaWYgKGxpbmVQb3MgPT0gMClcbiAgICAgICAgYmlhcyA9IDE7XG4gICAgZWxzZSBpZiAobGluZVBvcyA9PSBsaW5lLmxlbmd0aClcbiAgICAgICAgYmlhcyA9IC0xO1xuICAgIGxldCBmcm9tID0gbGluZVBvcywgdG8gPSBsaW5lUG9zO1xuICAgIGlmIChiaWFzIDwgMClcbiAgICAgICAgZnJvbSA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBsaW5lUG9zLCBmYWxzZSk7XG4gICAgZWxzZVxuICAgICAgICB0byA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBsaW5lUG9zKTtcbiAgICBsZXQgY2F0ID0gY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB3aGlsZSAoZnJvbSA+IDApIHtcbiAgICAgICAgbGV0IHByZXYgPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgZnJvbSwgZmFsc2UpO1xuICAgICAgICBpZiAoY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UocHJldiwgZnJvbSkpICE9IGNhdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBmcm9tID0gcHJldjtcbiAgICB9XG4gICAgd2hpbGUgKHRvIDwgbGluZS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgdG8pO1xuICAgICAgICBpZiAoY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UodG8sIG5leHQpKSAhPSBjYXQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgdG8gPSBuZXh0O1xuICAgIH1cbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20gKyBsaW5lLmZyb20sIHRvICsgbGluZS5mcm9tKTtcbn1cbi8vIFNlYXJjaCB0aGUgRE9NIGZvciB0aGUge25vZGUsIG9mZnNldH0gcG9zaXRpb24gY2xvc2VzdCB0byB0aGUgZ2l2ZW5cbi8vIGNvb3JkaW5hdGVzLiBWZXJ5IGluZWZmaWNpZW50IGFuZCBjcnVkZSwgYnV0IGNhbiB1c3VhbGx5IGJlIGF2b2lkZWRcbi8vIGJ5IGNhbGxpbmcgY2FyZXQoUG9zaXRpb258UmFuZ2UpRnJvbVBvaW50IGluc3RlYWQuXG5mdW5jdGlvbiBnZXRkeCh4LCByZWN0KSB7XG4gICAgcmV0dXJuIHJlY3QubGVmdCA+IHggPyByZWN0LmxlZnQgLSB4IDogTWF0aC5tYXgoMCwgeCAtIHJlY3QucmlnaHQpO1xufVxuZnVuY3Rpb24gZ2V0ZHkoeSwgcmVjdCkge1xuICAgIHJldHVybiByZWN0LnRvcCA+IHkgPyByZWN0LnRvcCAtIHkgOiBNYXRoLm1heCgwLCB5IC0gcmVjdC5ib3R0b20pO1xufVxuZnVuY3Rpb24geU92ZXJsYXAoYSwgYikge1xuICAgIHJldHVybiBhLnRvcCA8IGIuYm90dG9tIC0gMSAmJiBhLmJvdHRvbSA+IGIudG9wICsgMTtcbn1cbmZ1bmN0aW9uIHVwVG9wKHJlY3QsIHRvcCkge1xuICAgIHJldHVybiB0b3AgPCByZWN0LnRvcCA/IHsgdG9wLCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0LCBib3R0b206IHJlY3QuYm90dG9tIH0gOiByZWN0O1xufVxuZnVuY3Rpb24gdXBCb3QocmVjdCwgYm90dG9tKSB7XG4gICAgcmV0dXJuIGJvdHRvbSA+IHJlY3QuYm90dG9tID8geyB0b3A6IHJlY3QudG9wLCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0LCBib3R0b20gfSA6IHJlY3Q7XG59XG5mdW5jdGlvbiBkb21Qb3NBdENvb3JkcyhwYXJlbnQsIHgsIHkpIHtcbiAgICBsZXQgY2xvc2VzdCwgY2xvc2VzdFJlY3QsIGNsb3Nlc3RYLCBjbG9zZXN0WSwgY2xvc2VzdE92ZXJsYXAgPSBmYWxzZTtcbiAgICBsZXQgYWJvdmUsIGJlbG93LCBhYm92ZVJlY3QsIGJlbG93UmVjdDtcbiAgICBmb3IgKGxldCBjaGlsZCA9IHBhcmVudC5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihjaGlsZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAoY2xvc2VzdFJlY3QgJiYgeU92ZXJsYXAoY2xvc2VzdFJlY3QsIHJlY3QpKVxuICAgICAgICAgICAgICAgIHJlY3QgPSB1cFRvcCh1cEJvdChyZWN0LCBjbG9zZXN0UmVjdC5ib3R0b20pLCBjbG9zZXN0UmVjdC50b3ApO1xuICAgICAgICAgICAgbGV0IGR4ID0gZ2V0ZHgoeCwgcmVjdCksIGR5ID0gZ2V0ZHkoeSwgcmVjdCk7XG4gICAgICAgICAgICBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5ub2RlVHlwZSA9PSAzID8gZG9tUG9zSW5UZXh0KGNoaWxkLCB4LCB5KSA6IGRvbVBvc0F0Q29vcmRzKGNoaWxkLCB4LCB5KTtcbiAgICAgICAgICAgIGlmICghY2xvc2VzdCB8fCBjbG9zZXN0WSA+IGR5IHx8IGNsb3Nlc3RZID09IGR5ICYmIGNsb3Nlc3RYID4gZHgpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFJlY3QgPSByZWN0O1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RYID0gZHg7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFkgPSBkeTtcbiAgICAgICAgICAgICAgICBsZXQgc2lkZSA9IGR5ID8gKHkgPCByZWN0LnRvcCA/IC0xIDogMSkgOiBkeCA/ICh4IDwgcmVjdC5sZWZ0ID8gLTEgOiAxKSA6IDA7XG4gICAgICAgICAgICAgICAgY2xvc2VzdE92ZXJsYXAgPSAhc2lkZSB8fCAoc2lkZSA+IDAgPyBpIDwgcmVjdHMubGVuZ3RoIC0gMSA6IGkgPiAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkeCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHkgPiByZWN0LmJvdHRvbSAmJiAoIWFib3ZlUmVjdCB8fCBhYm92ZVJlY3QuYm90dG9tIDwgcmVjdC5ib3R0b20pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3ZlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGFib3ZlUmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHkgPCByZWN0LnRvcCAmJiAoIWJlbG93UmVjdCB8fCBiZWxvd1JlY3QudG9wID4gcmVjdC50b3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93UmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWJvdmVSZWN0ICYmIHlPdmVybGFwKGFib3ZlUmVjdCwgcmVjdCkpIHtcbiAgICAgICAgICAgICAgICBhYm92ZVJlY3QgPSB1cEJvdChhYm92ZVJlY3QsIHJlY3QuYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJlbG93UmVjdCAmJiB5T3ZlcmxhcChiZWxvd1JlY3QsIHJlY3QpKSB7XG4gICAgICAgICAgICAgICAgYmVsb3dSZWN0ID0gdXBUb3AoYmVsb3dSZWN0LCByZWN0LnRvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFib3ZlUmVjdCAmJiBhYm92ZVJlY3QuYm90dG9tID49IHkpIHtcbiAgICAgICAgY2xvc2VzdCA9IGFib3ZlO1xuICAgICAgICBjbG9zZXN0UmVjdCA9IGFib3ZlUmVjdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYmVsb3dSZWN0ICYmIGJlbG93UmVjdC50b3AgPD0geSkge1xuICAgICAgICBjbG9zZXN0ID0gYmVsb3c7XG4gICAgICAgIGNsb3Nlc3RSZWN0ID0gYmVsb3dSZWN0O1xuICAgIH1cbiAgICBpZiAoIWNsb3Nlc3QpXG4gICAgICAgIHJldHVybiB7IG5vZGU6IHBhcmVudCwgb2Zmc2V0OiAwIH07XG4gICAgbGV0IGNsaXBYID0gTWF0aC5tYXgoY2xvc2VzdFJlY3QubGVmdCwgTWF0aC5taW4oY2xvc2VzdFJlY3QucmlnaHQsIHgpKTtcbiAgICBpZiAoY2xvc2VzdC5ub2RlVHlwZSA9PSAzKVxuICAgICAgICByZXR1cm4gZG9tUG9zSW5UZXh0KGNsb3Nlc3QsIGNsaXBYLCB5KTtcbiAgICBpZiAoY2xvc2VzdE92ZXJsYXAgJiYgY2xvc2VzdC5jb250ZW50RWRpdGFibGUgIT0gXCJmYWxzZVwiKVxuICAgICAgICByZXR1cm4gZG9tUG9zQXRDb29yZHMoY2xvc2VzdCwgY2xpcFgsIHkpO1xuICAgIGxldCBvZmZzZXQgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHBhcmVudC5jaGlsZE5vZGVzLCBjbG9zZXN0KSArXG4gICAgICAgICh4ID49IChjbG9zZXN0UmVjdC5sZWZ0ICsgY2xvc2VzdFJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKTtcbiAgICByZXR1cm4geyBub2RlOiBwYXJlbnQsIG9mZnNldCB9O1xufVxuZnVuY3Rpb24gZG9tUG9zSW5UZXh0KG5vZGUsIHgsIHkpIHtcbiAgICBsZXQgbGVuID0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgIGxldCBjbG9zZXN0T2Zmc2V0ID0gLTEsIGNsb3Nlc3REWSA9IDFlOSwgZ2VuZXJhbFNpZGUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKG5vZGUsIGksIGkgKyAxKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgaWYgKHJlY3QudG9wID09IHJlY3QuYm90dG9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFnZW5lcmFsU2lkZSlcbiAgICAgICAgICAgICAgICBnZW5lcmFsU2lkZSA9IHggLSByZWN0LmxlZnQ7XG4gICAgICAgICAgICBsZXQgZHkgPSAocmVjdC50b3AgPiB5ID8gcmVjdC50b3AgLSB5IDogeSAtIHJlY3QuYm90dG9tKSAtIDE7XG4gICAgICAgICAgICBpZiAocmVjdC5sZWZ0IC0gMSA8PSB4ICYmIHJlY3QucmlnaHQgKyAxID49IHggJiYgZHkgPCBjbG9zZXN0RFkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmlnaHQgPSB4ID49IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIsIGFmdGVyID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuZ2Vja28pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFJUTCBvbiBicm93c2VycyB0aGF0IHN1cHBvcnQgZ2V0dGluZyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjdHMgZm9yIGVtcHR5IHJhbmdlcy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3RCZWZvcmUgPSB0ZXh0UmFuZ2Uobm9kZSwgaSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0QmVmb3JlLmxlZnQgPT0gcmVjdC5yaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gIXJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZHkgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBpICsgKGFmdGVyID8gMSA6IDApIH07XG4gICAgICAgICAgICAgICAgY2xvc2VzdE9mZnNldCA9IGkgKyAoYWZ0ZXIgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgY2xvc2VzdERZID0gZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBjbG9zZXN0T2Zmc2V0ID4gLTEgPyBjbG9zZXN0T2Zmc2V0IDogZ2VuZXJhbFNpZGUgPiAwID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogMCB9O1xufVxuZnVuY3Rpb24gcG9zQXRDb29yZHModmlldywgY29vcmRzLCBwcmVjaXNlLCBiaWFzID0gLTEpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBjb250ZW50ID0gdmlldy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkb2NUb3AgPSBjb250ZW50LnRvcCArIHZpZXcudmlld1N0YXRlLnBhZGRpbmdUb3A7XG4gICAgbGV0IGJsb2NrLCB7IGRvY0hlaWdodCB9ID0gdmlldy52aWV3U3RhdGU7XG4gICAgbGV0IHsgeCwgeSB9ID0gY29vcmRzLCB5T2Zmc2V0ID0geSAtIGRvY1RvcDtcbiAgICBpZiAoeU9mZnNldCA8IDApXG4gICAgICAgIHJldHVybiAwO1xuICAgIGlmICh5T2Zmc2V0ID4gZG9jSGVpZ2h0KVxuICAgICAgICByZXR1cm4gdmlldy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgIC8vIFNjYW4gZm9yIGEgdGV4dCBibG9jayBuZWFyIHRoZSBxdWVyaWVkIHkgcG9zaXRpb25cbiAgICBmb3IgKGxldCBoYWxmTGluZSA9IHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0IC8gMiwgYm91bmNlZCA9IGZhbHNlOzspIHtcbiAgICAgICAgYmxvY2sgPSB2aWV3LmVsZW1lbnRBdEhlaWdodCh5T2Zmc2V0KTtcbiAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgLy8gTW92ZSB0aGUgeSBwb3NpdGlvbiBvdXQgb2YgdGhpcyBibG9ja1xuICAgICAgICAgICAgeU9mZnNldCA9IGJpYXMgPiAwID8gYmxvY2suYm90dG9tICsgaGFsZkxpbmUgOiBibG9jay50b3AgLSBoYWxmTGluZTtcbiAgICAgICAgICAgIGlmICh5T2Zmc2V0ID49IDAgJiYgeU9mZnNldCA8PSBkb2NIZWlnaHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZG9jdW1lbnQgY29uc2lzdHMgZW50aXJlbHkgb2YgcmVwbGFjZWQgd2lkZ2V0cywgd2VcbiAgICAgICAgICAgIC8vIHdvbid0IGZpbmQgYSB0ZXh0IGJsb2NrLCBzbyByZXR1cm4gMFxuICAgICAgICAgICAgaWYgKGJvdW5jZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWNpc2UgPyBudWxsIDogMDtcbiAgICAgICAgICAgIGJvdW5jZWQgPSB0cnVlO1xuICAgICAgICAgICAgYmlhcyA9IC1iaWFzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHkgPSBkb2NUb3AgKyB5T2Zmc2V0O1xuICAgIGxldCBsaW5lU3RhcnQgPSBibG9jay5mcm9tO1xuICAgIC8vIElmIHRoaXMgaXMgb3V0c2lkZSBvZiB0aGUgcmVuZGVyZWQgdmlld3BvcnQsIHdlIGNhbid0IGRldGVybWluZSBhIHBvc2l0aW9uXG4gICAgaWYgKGxpbmVTdGFydCA8IHZpZXcudmlld3BvcnQuZnJvbSlcbiAgICAgICAgcmV0dXJuIHZpZXcudmlld3BvcnQuZnJvbSA9PSAwID8gMCA6IHByZWNpc2UgPyBudWxsIDogcG9zQXRDb29yZHNJbXByZWNpc2UodmlldywgY29udGVudCwgYmxvY2ssIHgsIHkpO1xuICAgIGlmIChsaW5lU3RhcnQgPiB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gdmlldy52aWV3cG9ydC50byA9PSB2aWV3LnN0YXRlLmRvYy5sZW5ndGggPyB2aWV3LnN0YXRlLmRvYy5sZW5ndGggOlxuICAgICAgICAgICAgcHJlY2lzZSA/IG51bGwgOiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50LCBibG9jaywgeCwgeSk7XG4gICAgLy8gUHJlZmVyIFNoYWRvd1Jvb3RPckRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQgaWYgcHJlc2VudCwgZmFsbCBiYWNrIHRvIGRvY3VtZW50IGlmIG5vdFxuICAgIGxldCBkb2MgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50O1xuICAgIGxldCByb290ID0gdmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQgPyB2aWV3LnJvb3QgOiBkb2M7XG4gICAgbGV0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgaWYgKGVsZW1lbnQgJiYgIXZpZXcuY29udGVudERPTS5jb250YWlucyhlbGVtZW50KSlcbiAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgdW5leHBlY3RlZCwgY2xpcCB4IGF0IHRoZSBzaWRlcyBvZiB0aGUgY29udGVudCBhcmVhIGFuZCB0cnkgYWdhaW5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgeCA9IE1hdGgubWF4KGNvbnRlbnQubGVmdCArIDEsIE1hdGgubWluKGNvbnRlbnQucmlnaHQgLSAxLCB4KSk7XG4gICAgICAgIGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIGlmIChlbGVtZW50ICYmICF2aWV3LmNvbnRlbnRET00uY29udGFpbnMoZWxlbWVudCkpXG4gICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlcmUncyB2aXNpYmxlIGVkaXRvciBjb250ZW50IHVuZGVyIHRoZSBwb2ludCwgc28gd2UgY2FuIHRyeVxuICAgIC8vIHVzaW5nIGNhcmV0KFBvc2l0aW9ufFJhbmdlKUZyb21Qb2ludCBhcyBhIHNob3J0Y3V0XG4gICAgbGV0IG5vZGUsIG9mZnNldCA9IC0xO1xuICAgIGlmIChlbGVtZW50ICYmICgoX2EgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChlbGVtZW50KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRWRpdGFibGUpICE9IGZhbHNlKSB7XG4gICAgICAgIGlmIChkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCkge1xuICAgICAgICAgICAgbGV0IHBvcyA9IGRvYy5jYXJldFBvc2l0aW9uRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICAgICAgaWYgKHBvcylcbiAgICAgICAgICAgICAgICAoeyBvZmZzZXROb2RlOiBub2RlLCBvZmZzZXQgfSA9IHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgKHsgc3RhcnRDb250YWluZXI6IG5vZGUsIHN0YXJ0T2Zmc2V0OiBvZmZzZXQgfSA9IHJhbmdlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZpZXcuY29udGVudERPTS5jb250YWlucyhub2RlKSB8fFxuICAgICAgICAgICAgICAgICAgICBicm93c2VyLnNhZmFyaSAmJiBpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHx8XG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuY2hyb21lICYmIGlzU3VzcGljaW91c0Nocm9tZUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hyb21lIHdpbGwgcmV0dXJuIG9mZnNldHMgaW50byA8aW5wdXQ+IGVsZW1lbnRzIHdpdGhvdXQgY2hpbGRcbiAgICAgICAgLy8gbm9kZXMsIHdoaWNoIHdpbGwgbGVhZCB0byBhIG51bGwgZGVyZWYgYmVsb3csIHNvIGNsaXAgdGhlXG4gICAgICAgIC8vIG9mZnNldCB0byB0aGUgbm9kZSBzaXplLlxuICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWluKG1heE9mZnNldChub2RlKSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gTm8gbHVjaywgZG8gb3VyIG93biAocG90ZW50aWFsbHkgZXhwZW5zaXZlKSBzZWFyY2hcbiAgICBpZiAoIW5vZGUgfHwgIXZpZXcuZG9jVmlldy5kb20uY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgbGluZVN0YXJ0KTtcbiAgICAgICAgaWYgKCFsaW5lKVxuICAgICAgICAgICAgcmV0dXJuIHlPZmZzZXQgPiBibG9jay50b3AgKyBibG9jay5oZWlnaHQgLyAyID8gYmxvY2sudG8gOiBibG9jay5mcm9tO1xuICAgICAgICAoeyBub2RlLCBvZmZzZXQgfSA9IGRvbVBvc0F0Q29vcmRzKGxpbmUuZG9tLCB4LCB5KSk7XG4gICAgfVxuICAgIGxldCBuZWFyZXN0ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3Qobm9kZSk7XG4gICAgaWYgKCFuZWFyZXN0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAobmVhcmVzdC5pc1dpZGdldCAmJiAoKF9iID0gbmVhcmVzdC5kb20pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5ub2RlVHlwZSkgPT0gMSkge1xuICAgICAgICBsZXQgcmVjdCA9IG5lYXJlc3QuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4gY29vcmRzLnkgPCByZWN0LnRvcCB8fCBjb29yZHMueSA8PSByZWN0LmJvdHRvbSAmJiBjb29yZHMueCA8PSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyXG4gICAgICAgICAgICA/IG5lYXJlc3QucG9zQXRTdGFydCA6IG5lYXJlc3QucG9zQXRFbmQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmVhcmVzdC5sb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSArIG5lYXJlc3QucG9zQXRTdGFydDtcbiAgICB9XG59XG5mdW5jdGlvbiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50UmVjdCwgYmxvY2ssIHgsIHkpIHtcbiAgICBsZXQgaW50byA9IE1hdGgucm91bmQoKHggLSBjb250ZW50UmVjdC5sZWZ0KSAqIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoKTtcbiAgICBpZiAodmlldy5saW5lV3JhcHBpbmcgJiYgYmxvY2suaGVpZ2h0ID4gdmlldy5kZWZhdWx0TGluZUhlaWdodCAqIDEuNSkge1xuICAgICAgICBsZXQgdGV4dEhlaWdodCA9IHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0O1xuICAgICAgICBsZXQgbGluZSA9IE1hdGguZmxvb3IoKHkgLSBibG9jay50b3AgLSAodmlldy5kZWZhdWx0TGluZUhlaWdodCAtIHRleHRIZWlnaHQpICogMC41KSAvIHRleHRIZWlnaHQpO1xuICAgICAgICBpbnRvICs9IGxpbmUgKiB2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUubGluZUxlbmd0aDtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnQgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKGJsb2NrLmZyb20sIGJsb2NrLnRvKTtcbiAgICByZXR1cm4gYmxvY2suZnJvbSArIGZpbmRDb2x1bW4oY29udGVudCwgaW50bywgdmlldy5zdGF0ZS50YWJTaXplKTtcbn1cbi8vIEluIGNhc2Ugb2YgYSBoaWdoIGxpbmUgaGVpZ2h0LCBTYWZhcmkncyBjYXJldFJhbmdlRnJvbVBvaW50IHRyZWF0c1xuLy8gdGhlIHNwYWNlIGJldHdlZW4gbGluZXMgYXMgYmVsb25naW5nIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGVcbi8vIGxpbmUgYmVmb3JlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZWN0IHN1Y2ggYSByZXN1bHQgc28gdGhhdCBpdCBjYW4gYmVcbi8vIGlnbm9yZWQgKGlzc3VlICM0MDEpLlxuZnVuY3Rpb24gaXNTdXNwaWNpb3VzU2FmYXJpQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSB7XG4gICAgbGV0IGxlbjtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAzIHx8IG9mZnNldCAhPSAobGVuID0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5leHQgPSBub2RlLm5leHRTaWJsaW5nOyBuZXh0OyBuZXh0ID0gbmV4dC5uZXh0U2libGluZylcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgIT0gMSB8fCBuZXh0Lm5vZGVOYW1lICE9IFwiQlJcIilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGV4dFJhbmdlKG5vZGUsIGxlbiAtIDEsIGxlbikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA+IHg7XG59XG4vLyBDaHJvbWUgd2lsbCBtb3ZlIHBvc2l0aW9ucyBiZXR3ZWVuIGxpbmVzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lXG5mdW5jdGlvbiBpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHtcbiAgICBpZiAob2Zmc2V0ICE9IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOzspIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgIT0gMSB8fCBwYXJlbnQuZmlyc3RDaGlsZCAhPSBjdXIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY20tbGluZVwiKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjdXIgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGxldCByZWN0ID0gbm9kZS5ub2RlVHlwZSA9PSAxID8gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IHRleHRSYW5nZShub2RlLCAwLCBNYXRoLm1heChub2RlLm5vZGVWYWx1ZS5sZW5ndGgsIDEpKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4geCAtIHJlY3QubGVmdCA+IDU7XG59XG5mdW5jdGlvbiBibG9ja0F0KHZpZXcsIHBvcywgc2lkZSkge1xuICAgIGxldCBsaW5lID0gdmlldy5saW5lQmxvY2tBdChwb3MpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmUudHlwZSkpIHtcbiAgICAgICAgbGV0IGJlc3Q7XG4gICAgICAgIGZvciAobGV0IGwgb2YgbGluZS50eXBlKSB7XG4gICAgICAgICAgICBpZiAobC5mcm9tID4gcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKGwudG8gPCBwb3MpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAobC5mcm9tIDwgcG9zICYmIGwudG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGw7XG4gICAgICAgICAgICBpZiAoIWJlc3QgfHwgKGwudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCAmJiAoYmVzdC50eXBlICE9IGwudHlwZSB8fCAoc2lkZSA8IDAgPyBsLmZyb20gPCBwb3MgOiBsLnRvID4gcG9zKSkpKVxuICAgICAgICAgICAgICAgIGJlc3QgPSBsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0IHx8IGxpbmU7XG4gICAgfVxuICAgIHJldHVybiBsaW5lO1xufVxuZnVuY3Rpb24gbW92ZVRvTGluZUJvdW5kYXJ5KHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCkge1xuICAgIGxldCBsaW5lID0gYmxvY2tBdCh2aWV3LCBzdGFydC5oZWFkLCBzdGFydC5hc3NvYyB8fCAtMSk7XG4gICAgbGV0IGNvb3JkcyA9ICFpbmNsdWRlV3JhcCB8fCBsaW5lLnR5cGUgIT0gQmxvY2tUeXBlLlRleHQgfHwgISh2aWV3LmxpbmVXcmFwcGluZyB8fCBsaW5lLndpZGdldExpbmVCcmVha3MpID8gbnVsbFxuICAgICAgICA6IHZpZXcuY29vcmRzQXRQb3Moc3RhcnQuYXNzb2MgPCAwICYmIHN0YXJ0LmhlYWQgPiBsaW5lLmZyb20gPyBzdGFydC5oZWFkIC0gMSA6IHN0YXJ0LmhlYWQpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgICAgbGV0IGVkaXRvclJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IGRpcmVjdGlvbiA9IHZpZXcudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeDogZm9yd2FyZCA9PSAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIpID8gZWRpdG9yUmVjdC5yaWdodCAtIDEgOiBlZGl0b3JSZWN0LmxlZnQgKyAxLFxuICAgICAgICAgICAgeTogKGNvb3Jkcy50b3AgKyBjb29yZHMuYm90dG9tKSAvIDIgfSk7XG4gICAgICAgIGlmIChwb3MgIT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgZm9yd2FyZCA/IC0xIDogMSk7XG4gICAgfVxuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKGZvcndhcmQgPyBsaW5lLnRvIDogbGluZS5mcm9tLCBmb3J3YXJkID8gLTEgOiAxKTtcbn1cbmZ1bmN0aW9uIG1vdmVCeUNoYXIodmlldywgc3RhcnQsIGZvcndhcmQsIGJ5KSB7XG4gICAgbGV0IGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoc3RhcnQuaGVhZCksIHNwYW5zID0gdmlldy5iaWRpU3BhbnMobGluZSk7XG4gICAgbGV0IGRpcmVjdGlvbiA9IHZpZXcudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgZm9yIChsZXQgY3VyID0gc3RhcnQsIGNoZWNrID0gbnVsbDs7KSB7XG4gICAgICAgIGxldCBuZXh0ID0gbW92ZVZpc3VhbGx5KGxpbmUsIHNwYW5zLCBkaXJlY3Rpb24sIGN1ciwgZm9yd2FyZCksIGNoYXIgPSBtb3ZlZE92ZXI7XG4gICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgaWYgKGxpbmUubnVtYmVyID09IChmb3J3YXJkID8gdmlldy5zdGF0ZS5kb2MubGluZXMgOiAxKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICAgICAgY2hhciA9IFwiXFxuXCI7XG4gICAgICAgICAgICBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZShsaW5lLm51bWJlciArIChmb3J3YXJkID8gMSA6IC0xKSk7XG4gICAgICAgICAgICBzcGFucyA9IHZpZXcuYmlkaVNwYW5zKGxpbmUpO1xuICAgICAgICAgICAgbmV4dCA9IHZpZXcudmlzdWFsTGluZVNpZGUobGluZSwgIWZvcndhcmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2spIHtcbiAgICAgICAgICAgIGlmICghYnkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICBjaGVjayA9IGJ5KGNoYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjaGVjayhjaGFyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cjtcbiAgICAgICAgfVxuICAgICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJ5R3JvdXAodmlldywgcG9zLCBzdGFydCkge1xuICAgIGxldCBjYXRlZ29yaXplID0gdmlldy5zdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICBsZXQgY2F0ID0gY2F0ZWdvcml6ZShzdGFydCk7XG4gICAgcmV0dXJuIChuZXh0KSA9PiB7XG4gICAgICAgIGxldCBuZXh0Q2F0ID0gY2F0ZWdvcml6ZShuZXh0KTtcbiAgICAgICAgaWYgKGNhdCA9PSBDaGFyQ2F0ZWdvcnkuU3BhY2UpXG4gICAgICAgICAgICBjYXQgPSBuZXh0Q2F0O1xuICAgICAgICByZXR1cm4gY2F0ID09IG5leHRDYXQ7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1vdmVWZXJ0aWNhbGx5KHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkge1xuICAgIGxldCBzdGFydFBvcyA9IHN0YXJ0LmhlYWQsIGRpciA9IGZvcndhcmQgPyAxIDogLTE7XG4gICAgaWYgKHN0YXJ0UG9zID09IChmb3J3YXJkID8gdmlldy5zdGF0ZS5kb2MubGVuZ3RoIDogMCkpXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHN0YXJ0UG9zLCBzdGFydC5hc3NvYyk7XG4gICAgbGV0IGdvYWwgPSBzdGFydC5nb2FsQ29sdW1uLCBzdGFydFk7XG4gICAgbGV0IHJlY3QgPSB2aWV3LmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHN0YXJ0Q29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhzdGFydFBvcywgc3RhcnQuYXNzb2MgfHwgLTEpLCBkb2NUb3AgPSB2aWV3LmRvY3VtZW50VG9wO1xuICAgIGlmIChzdGFydENvb3Jkcykge1xuICAgICAgICBpZiAoZ29hbCA9PSBudWxsKVxuICAgICAgICAgICAgZ29hbCA9IHN0YXJ0Q29vcmRzLmxlZnQgLSByZWN0LmxlZnQ7XG4gICAgICAgIHN0YXJ0WSA9IGRpciA8IDAgPyBzdGFydENvb3Jkcy50b3AgOiBzdGFydENvb3Jkcy5ib3R0b207XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcudmlld1N0YXRlLmxpbmVCbG9ja0F0KHN0YXJ0UG9zKTtcbiAgICAgICAgaWYgKGdvYWwgPT0gbnVsbClcbiAgICAgICAgICAgIGdvYWwgPSBNYXRoLm1pbihyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCAqIChzdGFydFBvcyAtIGxpbmUuZnJvbSkpO1xuICAgICAgICBzdGFydFkgPSAoZGlyIDwgMCA/IGxpbmUudG9wIDogbGluZS5ib3R0b20pICsgZG9jVG9wO1xuICAgIH1cbiAgICBsZXQgcmVzb2x2ZWRHb2FsID0gcmVjdC5sZWZ0ICsgZ29hbDtcbiAgICBsZXQgZGlzdCA9IGRpc3RhbmNlICE9PSBudWxsICYmIGRpc3RhbmNlICE9PSB2b2lkIDAgPyBkaXN0YW5jZSA6ICh2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUudGV4dEhlaWdodCA+PiAxKTtcbiAgICBmb3IgKGxldCBleHRyYSA9IDA7OyBleHRyYSArPSAxMCkge1xuICAgICAgICBsZXQgY3VyWSA9IHN0YXJ0WSArIChkaXN0ICsgZXh0cmEpICogZGlyO1xuICAgICAgICBsZXQgcG9zID0gcG9zQXRDb29yZHModmlldywgeyB4OiByZXNvbHZlZEdvYWwsIHk6IGN1clkgfSwgZmFsc2UsIGRpcik7XG4gICAgICAgIGlmIChjdXJZIDwgcmVjdC50b3AgfHwgY3VyWSA+IHJlY3QuYm90dG9tIHx8IChkaXIgPCAwID8gcG9zIDwgc3RhcnRQb3MgOiBwb3MgPiBzdGFydFBvcykpIHtcbiAgICAgICAgICAgIGxldCBjaGFyUmVjdCA9IHZpZXcuZG9jVmlldy5jb29yZHNGb3JDaGFyKHBvcyk7XG4gICAgICAgICAgICBsZXQgYXNzb2MgPSAhY2hhclJlY3QgfHwgY3VyWSA8IGNoYXJSZWN0LnRvcCA/IC0xIDogMTtcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgYXNzb2MsIHVuZGVmaW5lZCwgZ29hbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBza2lwQXRvbWljUmFuZ2VzKGF0b21zLCBwb3MsIGJpYXMpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBtb3ZlZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHNldCBvZiBhdG9tcykge1xuICAgICAgICAgICAgc2V0LmJldHdlZW4ocG9zIC0gMSwgcG9zICsgMSwgKGZyb20sIHRvLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIHBvcyA8IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWRlID0gbW92ZWQgfHwgYmlhcyB8fCAocG9zIC0gZnJvbSA8IHRvIC0gcG9zID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gc2lkZSA8IDAgPyBmcm9tIDogdG87XG4gICAgICAgICAgICAgICAgICAgIG1vdmVkID0gc2lkZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vdmVkKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG59XG5mdW5jdGlvbiBza2lwQXRvbXModmlldywgb2xkUG9zLCBwb3MpIHtcbiAgICBsZXQgbmV3UG9zID0gc2tpcEF0b21pY1Jhbmdlcyh2aWV3LnN0YXRlLmZhY2V0KGF0b21pY1JhbmdlcykubWFwKGYgPT4gZih2aWV3KSksIHBvcy5mcm9tLCBvbGRQb3MuaGVhZCA+IHBvcy5mcm9tID8gLTEgOiAxKTtcbiAgICByZXR1cm4gbmV3UG9zID09IHBvcy5mcm9tID8gcG9zIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihuZXdQb3MsIG5ld1BvcyA8IHBvcy5mcm9tID8gMSA6IC0xKTtcbn1cblxuY29uc3QgTGluZUJyZWFrUGxhY2Vob2xkZXIgPSBcIlxcdWZmZmZcIjtcbmNsYXNzIERPTVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocG9pbnRzLCBzdGF0ZSkge1xuICAgICAgICB0aGlzLnBvaW50cyA9IHBvaW50cztcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5saW5lU2VwYXJhdG9yID0gc3RhdGUuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcik7XG4gICAgfVxuICAgIGFwcGVuZCh0ZXh0KSB7XG4gICAgICAgIHRoaXMudGV4dCArPSB0ZXh0O1xuICAgIH1cbiAgICBsaW5lQnJlYWsoKSB7XG4gICAgICAgIHRoaXMudGV4dCArPSBMaW5lQnJlYWtQbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgcmVhZFJhbmdlKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKCFzdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcGFyZW50ID0gc3RhcnQucGFyZW50Tm9kZTtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gc3RhcnQ7Oykge1xuICAgICAgICAgICAgdGhpcy5maW5kUG9pbnRCZWZvcmUocGFyZW50LCBjdXIpO1xuICAgICAgICAgICAgbGV0IG9sZExlbiA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnJlYWROb2RlKGN1cik7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGN1ci5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmIChuZXh0ID09IGVuZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCB2aWV3ID0gQ29udGVudFZpZXcuZ2V0KGN1ciksIG5leHRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KG5leHQpO1xuICAgICAgICAgICAgaWYgKHZpZXcgJiYgbmV4dFZpZXcgPyB2aWV3LmJyZWFrQWZ0ZXIgOlxuICAgICAgICAgICAgICAgICh2aWV3ID8gdmlldy5icmVha0FmdGVyIDogaXNCbG9ja0VsZW1lbnQoY3VyKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzQmxvY2tFbGVtZW50KG5leHQpICYmIChjdXIubm9kZU5hbWUgIT0gXCJCUlwiIHx8IGN1ci5jbUlnbm9yZSkgJiYgdGhpcy50ZXh0Lmxlbmd0aCA+IG9sZExlbikpXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5kUG9pbnRCZWZvcmUocGFyZW50LCBlbmQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVhZFRleHROb2RlKG5vZGUpIHtcbiAgICAgICAgbGV0IHRleHQgPSBub2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgb2YgdGhpcy5wb2ludHMpXG4gICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlKVxuICAgICAgICAgICAgICAgIHBvaW50LnBvcyA9IHRoaXMudGV4dC5sZW5ndGggKyBNYXRoLm1pbihwb2ludC5vZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgb2ZmID0gMCwgcmUgPSB0aGlzLmxpbmVTZXBhcmF0b3IgPyBudWxsIDogL1xcclxcbj98XFxuL2c7Oykge1xuICAgICAgICAgICAgbGV0IG5leHRCcmVhayA9IC0xLCBicmVha1NpemUgPSAxLCBtO1xuICAgICAgICAgICAgaWYgKHRoaXMubGluZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgIG5leHRCcmVhayA9IHRleHQuaW5kZXhPZih0aGlzLmxpbmVTZXBhcmF0b3IsIG9mZik7XG4gICAgICAgICAgICAgICAgYnJlYWtTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG0gPSByZS5leGVjKHRleHQpKSB7XG4gICAgICAgICAgICAgICAgbmV4dEJyZWFrID0gbS5pbmRleDtcbiAgICAgICAgICAgICAgICBicmVha1NpemUgPSBtWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRleHQuc2xpY2Uob2ZmLCBuZXh0QnJlYWsgPCAwID8gdGV4dC5sZW5ndGggOiBuZXh0QnJlYWspKTtcbiAgICAgICAgICAgIGlmIChuZXh0QnJlYWsgPCAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgICAgIGlmIChicmVha1NpemUgPiAxKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlICYmIHBvaW50LnBvcyA+IHRoaXMudGV4dC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC5wb3MgLT0gYnJlYWtTaXplIC0gMTtcbiAgICAgICAgICAgIG9mZiA9IG5leHRCcmVhayArIGJyZWFrU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkTm9kZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmNtSWdub3JlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChub2RlKTtcbiAgICAgICAgbGV0IGZyb21WaWV3ID0gdmlldyAmJiB2aWV3Lm92ZXJyaWRlRE9NVGV4dDtcbiAgICAgICAgaWYgKGZyb21WaWV3ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZFBvaW50SW5zaWRlKG5vZGUsIGZyb21WaWV3Lmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZnJvbVZpZXcuaXRlcigpOyAhaS5uZXh0KCkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICBpZiAoaS5saW5lQnJlYWspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZChpLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFRleHROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJCUlwiKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5uZXh0U2libGluZylcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yZWFkUmFuZ2Uobm9kZS5maXJzdENoaWxkLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kUG9pbnRCZWZvcmUobm9kZSwgbmV4dCkge1xuICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgIGlmIChwb2ludC5ub2RlID09IG5vZGUgJiYgbm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF0gPT0gbmV4dClcbiAgICAgICAgICAgICAgICBwb2ludC5wb3MgPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgIH1cbiAgICBmaW5kUG9pbnRJbnNpZGUobm9kZSwgbGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyA/IHBvaW50Lm5vZGUgPT0gbm9kZSA6IG5vZGUuY29udGFpbnMocG9pbnQubm9kZSkpXG4gICAgICAgICAgICAgICAgcG9pbnQucG9zID0gdGhpcy50ZXh0Lmxlbmd0aCArIChpc0F0RW5kKG5vZGUsIHBvaW50Lm5vZGUsIHBvaW50Lm9mZnNldCkgPyBsZW5ndGggOiAwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0F0RW5kKHBhcmVudCwgbm9kZSwgb2Zmc2V0KSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIW5vZGUgfHwgb2Zmc2V0IDwgbWF4T2Zmc2V0KG5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSkgKyAxO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbn1cbmNsYXNzIERPTVBvaW50IHtcbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMucG9zID0gLTE7XG4gICAgfVxufVxuXG5jbGFzcyBET01DaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHN0YXJ0LCBlbmQsIHR5cGVPdmVyKSB7XG4gICAgICAgIHRoaXMudHlwZU92ZXIgPSB0eXBlT3ZlcjtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZWQgPSBzdGFydCA+IC0xO1xuICAgICAgICBsZXQgeyBpbXByZWNpc2VIZWFkOiBpSGVhZCwgaW1wcmVjaXNlQW5jaG9yOiBpQW5jaG9yIH0gPSB2aWV3LmRvY1ZpZXc7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5ICYmIHN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBjaGFuZ2VzIHdoZW4gdGhlIGVkaXRvciBpcyByZWFkLW9ubHlcbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGFydCA+IC0xICYmICh0aGlzLmJvdW5kcyA9IHZpZXcuZG9jVmlldy5kb21Cb3VuZHNBcm91bmQoc3RhcnQsIGVuZCwgMCkpKSB7XG4gICAgICAgICAgICBsZXQgc2VsUG9pbnRzID0gaUhlYWQgfHwgaUFuY2hvciA/IFtdIDogc2VsZWN0aW9uUG9pbnRzKHZpZXcpO1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBET01SZWFkZXIoc2VsUG9pbnRzLCB2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkUmFuZ2UodGhpcy5ib3VuZHMuc3RhcnRET00sIHRoaXMuYm91bmRzLmVuZERPTSk7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSByZWFkZXIudGV4dDtcbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gc2VsZWN0aW9uRnJvbVBvaW50cyhzZWxQb2ludHMsIHRoaXMuYm91bmRzLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRvbVNlbCA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgICAgICBsZXQgaGVhZCA9IGlIZWFkICYmIGlIZWFkLm5vZGUgPT0gZG9tU2VsLmZvY3VzTm9kZSAmJiBpSGVhZC5vZmZzZXQgPT0gZG9tU2VsLmZvY3VzT2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRhaW5zKHZpZXcuY29udGVudERPTSwgZG9tU2VsLmZvY3VzTm9kZSlcbiAgICAgICAgICAgICAgICA/IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZFxuICAgICAgICAgICAgICAgIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0KTtcbiAgICAgICAgICAgIGxldCBhbmNob3IgPSBpQW5jaG9yICYmIGlBbmNob3Iubm9kZSA9PSBkb21TZWwuYW5jaG9yTm9kZSAmJiBpQW5jaG9yLm9mZnNldCA9PSBkb21TZWwuYW5jaG9yT2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRhaW5zKHZpZXcuY29udGVudERPTSwgZG9tU2VsLmFuY2hvck5vZGUpXG4gICAgICAgICAgICAgICAgPyB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvclxuICAgICAgICAgICAgICAgIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgICAgICAgLy8gaU9TIHdpbGwgcmVmdXNlIHRvIHNlbGVjdCB0aGUgYmxvY2sgZ2FwcyB3aGVuIGRvaW5nXG4gICAgICAgICAgICAvLyBzZWxlY3QtYWxsLlxuICAgICAgICAgICAgLy8gQ2hyb21lIHdpbGwgcHV0IHRoZSBzZWxlY3Rpb24gKmluc2lkZSogdGhlbSwgY29uZnVzaW5nXG4gICAgICAgICAgICAvLyBwb3NGcm9tRE9NXG4gICAgICAgICAgICBsZXQgdnAgPSB2aWV3LnZpZXdwb3J0O1xuICAgICAgICAgICAgaWYgKChicm93c2VyLmlvcyB8fCBicm93c2VyLmNocm9tZSkgJiYgdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5lbXB0eSAmJiBoZWFkICE9IGFuY2hvciAmJlxuICAgICAgICAgICAgICAgICh2cC5mcm9tID4gMCB8fCB2cC50byA8IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWluKGhlYWQsIGFuY2hvciksIHRvID0gTWF0aC5tYXgoaGVhZCwgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICBsZXQgb2ZmRnJvbSA9IHZwLmZyb20gLSBmcm9tLCBvZmZUbyA9IHZwLnRvIC0gdG87XG4gICAgICAgICAgICAgICAgaWYgKChvZmZGcm9tID09IDAgfHwgb2ZmRnJvbSA9PSAxIHx8IGZyb20gPT0gMCkgJiYgKG9mZlRvID09IDAgfHwgb2ZmVG8gPT0gLTEgfHwgdG8gPT0gdmlldy5zdGF0ZS5kb2MubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gdmlldy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShhbmNob3IsIGhlYWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlET01DaGFuZ2UodmlldywgZG9tQ2hhbmdlKSB7XG4gICAgbGV0IGNoYW5nZTtcbiAgICBsZXQgeyBuZXdTZWwgfSA9IGRvbUNoYW5nZSwgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICBsZXQgbGFzdEtleSA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5VGltZSA+IERhdGUubm93KCkgLSAxMDAgPyB2aWV3LmlucHV0U3RhdGUubGFzdEtleUNvZGUgOiAtMTtcbiAgICBpZiAoZG9tQ2hhbmdlLmJvdW5kcykge1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gZG9tQ2hhbmdlLmJvdW5kcztcbiAgICAgICAgbGV0IHByZWZlcnJlZFBvcyA9IHNlbC5mcm9tLCBwcmVmZXJyZWRTaWRlID0gbnVsbDtcbiAgICAgICAgLy8gUHJlZmVyIGFuY2hvcmluZyB0byBlbmQgd2hlbiBCYWNrc3BhY2UgaXMgcHJlc3NlZCAob3IsIG9uXG4gICAgICAgIC8vIEFuZHJvaWQsIHdoZW4gc29tZXRoaW5nIHdhcyBkZWxldGVkKVxuICAgICAgICBpZiAobGFzdEtleSA9PT0gOCB8fCBicm93c2VyLmFuZHJvaWQgJiYgZG9tQ2hhbmdlLnRleHQubGVuZ3RoIDwgdG8gLSBmcm9tKSB7XG4gICAgICAgICAgICBwcmVmZXJyZWRQb3MgPSBzZWwudG87XG4gICAgICAgICAgICBwcmVmZXJyZWRTaWRlID0gXCJlbmRcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlmZiA9IGZpbmREaWZmKHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvLCBMaW5lQnJlYWtQbGFjZWhvbGRlciksIGRvbUNoYW5nZS50ZXh0LCBwcmVmZXJyZWRQb3MgLSBmcm9tLCBwcmVmZXJyZWRTaWRlKTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIC8vIENocm9tZSBpbnNlcnRzIHR3byBuZXdsaW5lcyB3aGVuIHByZXNzaW5nIHNoaWZ0LWVudGVyIGF0IHRoZVxuICAgICAgICAgICAgLy8gZW5kIG9mIGEgbGluZS4gRG9tQ2hhbmdlIGRyb3BzIG9uZSBvZiB0aG9zZS5cbiAgICAgICAgICAgIGlmIChicm93c2VyLmNocm9tZSAmJiBsYXN0S2V5ID09IDEzICYmXG4gICAgICAgICAgICAgICAgZGlmZi50b0IgPT0gZGlmZi5mcm9tICsgMiAmJiBkb21DaGFuZ2UudGV4dC5zbGljZShkaWZmLmZyb20sIGRpZmYudG9CKSA9PSBMaW5lQnJlYWtQbGFjZWhvbGRlciArIExpbmVCcmVha1BsYWNlaG9sZGVyKVxuICAgICAgICAgICAgICAgIGRpZmYudG9CLS07XG4gICAgICAgICAgICBjaGFuZ2UgPSB7IGZyb206IGZyb20gKyBkaWZmLmZyb20sIHRvOiBmcm9tICsgZGlmZi50b0EsXG4gICAgICAgICAgICAgICAgaW5zZXJ0OiBUZXh0Lm9mKGRvbUNoYW5nZS50ZXh0LnNsaWNlKGRpZmYuZnJvbSwgZGlmZi50b0IpLnNwbGl0KExpbmVCcmVha1BsYWNlaG9sZGVyKSkgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChuZXdTZWwgJiYgKCF2aWV3Lmhhc0ZvY3VzICYmIHZpZXcuc3RhdGUuZmFjZXQoZWRpdGFibGUpIHx8IG5ld1NlbC5tYWluLmVxKHNlbCkpKSB7XG4gICAgICAgIG5ld1NlbCA9IG51bGw7XG4gICAgfVxuICAgIGlmICghY2hhbmdlICYmICFuZXdTZWwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWNoYW5nZSAmJiBkb21DaGFuZ2UudHlwZU92ZXIgJiYgIXNlbC5lbXB0eSAmJiBuZXdTZWwgJiYgbmV3U2VsLm1haW4uZW1wdHkpIHtcbiAgICAgICAgLy8gSGV1cmlzdGljIHRvIG5vdGljZSB0eXBpbmcgb3ZlciBhIHNlbGVjdGVkIGNoYXJhY3RlclxuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IHZpZXcuc3RhdGUuZG9jLnNsaWNlKHNlbC5mcm9tLCBzZWwudG8pIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKChicm93c2VyLm1hYyB8fCBicm93c2VyLmFuZHJvaWQpICYmIGNoYW5nZSAmJiBjaGFuZ2UuZnJvbSA9PSBjaGFuZ2UudG8gJiYgY2hhbmdlLmZyb20gPT0gc2VsLmhlYWQgLSAxICYmXG4gICAgICAgIC9eXFwuID8kLy50ZXN0KGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKSkgJiYgdmlldy5jb250ZW50RE9NLmdldEF0dHJpYnV0ZShcImF1dG9jb3JyZWN0XCIpID09IFwib2ZmXCIpIHtcbiAgICAgICAgLy8gRGV0ZWN0IGluc2VydC1wZXJpb2Qtb24tZG91YmxlLXNwYWNlIE1hYyBhbmQgQW5kcm9pZCBiZWhhdmlvcixcbiAgICAgICAgLy8gYW5kIHRyYW5zZm9ybSBpdCBpbnRvIGEgcmVndWxhciBzcGFjZSBpbnNlcnQuXG4gICAgICAgIGlmIChuZXdTZWwgJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMilcbiAgICAgICAgICAgIG5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUobmV3U2VsLm1haW4uYW5jaG9yIC0gMSwgbmV3U2VsLm1haW4uaGVhZCAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IGNoYW5nZS5mcm9tLCB0bzogY2hhbmdlLnRvLCBpbnNlcnQ6IFRleHQub2YoW2NoYW5nZS5pbnNlcnQudG9TdHJpbmcoKS5yZXBsYWNlKFwiLlwiLCBcIiBcIildKSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPj0gc2VsLmZyb20gJiYgY2hhbmdlLnRvIDw9IHNlbC50byAmJlxuICAgICAgICAoY2hhbmdlLmZyb20gIT0gc2VsLmZyb20gfHwgY2hhbmdlLnRvICE9IHNlbC50bykgJiZcbiAgICAgICAgKHNlbC50byAtIHNlbC5mcm9tKSAtIChjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSkgPD0gNCkge1xuICAgICAgICAvLyBJZiB0aGUgY2hhbmdlIGlzIGluc2lkZSB0aGUgc2VsZWN0aW9uIGFuZCBjb3ZlcnMgbW9zdCBvZiBpdCxcbiAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgc2VsZWN0aW9uIHJlcGxhY2UgKHdpdGggaWRlbnRpY2FsIGNoYXJhY3RlcnMgYXRcbiAgICAgICAgLy8gdGhlIHN0YXJ0L2VuZCBub3QgaW5jbHVkZWQgaW4gdGhlIGRpZmYpXG4gICAgICAgIGNoYW5nZSA9IHtcbiAgICAgICAgICAgIGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLFxuICAgICAgICAgICAgaW5zZXJ0OiB2aWV3LnN0YXRlLmRvYy5zbGljZShzZWwuZnJvbSwgY2hhbmdlLmZyb20pLmFwcGVuZChjaGFuZ2UuaW5zZXJ0KS5hcHBlbmQodmlldy5zdGF0ZS5kb2Muc2xpY2UoY2hhbmdlLnRvLCBzZWwudG8pKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyLmNocm9tZSAmJiBjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPT0gY2hhbmdlLnRvICYmIGNoYW5nZS5mcm9tID09IHNlbC5oZWFkICYmXG4gICAgICAgIGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKSA9PSBcIlxcbiBcIiAmJiB2aWV3LmxpbmVXcmFwcGluZykge1xuICAgICAgICAvLyBJbiBDaHJvbWUsIGlmIHlvdSBpbnNlcnQgYSBzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYSB3cmFwcGVkXG4gICAgICAgIC8vIGxpbmUsIGl0IHdpbGwgYWN0dWFsbHkgaW5zZXJ0IGEgbmV3bGluZSBhbmQgYSBzcGFjZSwgY2F1c2luZyBhXG4gICAgICAgIC8vIGJvZ3VzIG5ldyBsaW5lIHRvIGJlIGNyZWF0ZWQgaW4gQ29kZU1pcnJvciAoIzk2OClcbiAgICAgICAgaWYgKG5ld1NlbClcbiAgICAgICAgICAgIG5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUobmV3U2VsLm1haW4uYW5jaG9yIC0gMSwgbmV3U2VsLm1haW4uaGVhZCAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IFRleHQub2YoW1wiIFwiXSkgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZSkge1xuICAgICAgICByZXR1cm4gYXBwbHlET01DaGFuZ2VJbm5lcih2aWV3LCBjaGFuZ2UsIG5ld1NlbCwgbGFzdEtleSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5ld1NlbCAmJiAhbmV3U2VsLm1haW4uZXEoc2VsKSkge1xuICAgICAgICBsZXQgc2Nyb2xsSW50b1ZpZXcgPSBmYWxzZSwgdXNlckV2ZW50ID0gXCJzZWxlY3RcIjtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uVGltZSA+IERhdGUubm93KCkgLSA1MCkge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uT3JpZ2luID09IFwic2VsZWN0XCIpXG4gICAgICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcgPSB0cnVlO1xuICAgICAgICAgICAgdXNlckV2ZW50ID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTZWxlY3Rpb25PcmlnaW47XG4gICAgICAgIH1cbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IHNlbGVjdGlvbjogbmV3U2VsLCBzY3JvbGxJbnRvVmlldywgdXNlckV2ZW50IH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBhcHBseURPTUNoYW5nZUlubmVyKHZpZXcsIGNoYW5nZSwgbmV3U2VsLCBsYXN0S2V5ID0gLTEpIHtcbiAgICBpZiAoYnJvd3Nlci5pb3MgJiYgdmlldy5pbnB1dFN0YXRlLmZsdXNoSU9TS2V5KGNoYW5nZSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgIC8vIEFuZHJvaWQgYnJvd3NlcnMgZG9uJ3QgZmlyZSByZWFzb25hYmxlIGtleSBldmVudHMgZm9yIGVudGVyLFxuICAgIC8vIGJhY2tzcGFjZSwgb3IgZGVsZXRlLiBTbyB0aGlzIGRldGVjdHMgY2hhbmdlcyB0aGF0IGxvb2sgbGlrZVxuICAgIC8vIHRoZXkncmUgY2F1c2VkIGJ5IHRob3NlIGtleXMsIGFuZCByZWludGVycHJldHMgdGhlbSBhcyBrZXlcbiAgICAvLyBldmVudHMuIChTb21lIG9mIHRoZXNlIGtleXMgYXJlIGFsc28gaGFuZGxlZCBieSBiZWZvcmVpbnB1dFxuICAgIC8vIGV2ZW50cyBhbmQgdGhlIHBlbmRpbmdBbmRyb2lkS2V5IG1lY2hhbmlzbSwgYnV0IHRoYXQncyBub3RcbiAgICAvLyByZWxpYWJsZSBpbiBhbGwgc2l0dWF0aW9ucy4pXG4gICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJlxuICAgICAgICAoKGNoYW5nZS50byA9PSBzZWwudG8gJiZcbiAgICAgICAgICAgIC8vIEdCb2FyZCB3aWxsIHNvbWV0aW1lcyByZW1vdmUgYSBzcGFjZSBpdCBqdXN0IGluc2VydGVkXG4gICAgICAgICAgICAvLyBhZnRlciBhIGNvbXBsZXRpb24gd2hlbiB5b3UgcHJlc3MgZW50ZXJcbiAgICAgICAgICAgIChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSB8fCBjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAtIDEgJiYgdmlldy5zdGF0ZS5zbGljZURvYyhjaGFuZ2UuZnJvbSwgc2VsLmZyb20pID09IFwiIFwiKSAmJlxuICAgICAgICAgICAgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMSAmJiBjaGFuZ2UuaW5zZXJ0LmxpbmVzID09IDIgJiZcbiAgICAgICAgICAgIGRpc3BhdGNoS2V5KHZpZXcuY29udGVudERPTSwgXCJFbnRlclwiLCAxMykpIHx8XG4gICAgICAgICAgICAoKGNoYW5nZS5mcm9tID09IHNlbC5mcm9tIC0gMSAmJiBjaGFuZ2UudG8gPT0gc2VsLnRvICYmIGNoYW5nZS5pbnNlcnQubGVuZ3RoID09IDAgfHxcbiAgICAgICAgICAgICAgICBsYXN0S2V5ID09IDggJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPCBjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSAmJiBjaGFuZ2UudG8gPiBzZWwuaGVhZCkgJiZcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiQmFja3NwYWNlXCIsIDgpKSB8fFxuICAgICAgICAgICAgKGNoYW5nZS5mcm9tID09IHNlbC5mcm9tICYmIGNoYW5nZS50byA9PSBzZWwudG8gKyAxICYmIGNoYW5nZS5pbnNlcnQubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiRGVsZXRlXCIsIDQ2KSkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgdGV4dCA9IGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKTtcbiAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwKVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nKys7XG4gICAgbGV0IGRlZmF1bHRUcjtcbiAgICBsZXQgZGVmYXVsdEluc2VydCA9ICgpID0+IGRlZmF1bHRUciB8fCAoZGVmYXVsdFRyID0gYXBwbHlEZWZhdWx0SW5zZXJ0KHZpZXcsIGNoYW5nZSwgbmV3U2VsKSk7XG4gICAgaWYgKCF2aWV3LnN0YXRlLmZhY2V0KGlucHV0SGFuZGxlcikuc29tZShoID0+IGgodmlldywgY2hhbmdlLmZyb20sIGNoYW5nZS50bywgdGV4dCwgZGVmYXVsdEluc2VydCkpKVxuICAgICAgICB2aWV3LmRpc3BhdGNoKGRlZmF1bHRJbnNlcnQoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBhcHBseURlZmF1bHRJbnNlcnQodmlldywgY2hhbmdlLCBuZXdTZWwpIHtcbiAgICBsZXQgdHIsIHN0YXJ0U3RhdGUgPSB2aWV3LnN0YXRlLCBzZWwgPSBzdGFydFN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgIGlmIChjaGFuZ2UuZnJvbSA+PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPD0gc2VsLnRvICYmIGNoYW5nZS50byAtIGNoYW5nZS5mcm9tID49IChzZWwudG8gLSBzZWwuZnJvbSkgLyAzICYmXG4gICAgICAgICghbmV3U2VsIHx8IG5ld1NlbC5tYWluLmVtcHR5ICYmIG5ld1NlbC5tYWluLmZyb20gPT0gY2hhbmdlLmZyb20gKyBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCkgJiZcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA8IDApIHtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHNlbC5mcm9tIDwgY2hhbmdlLmZyb20gPyBzdGFydFN0YXRlLnNsaWNlRG9jKHNlbC5mcm9tLCBjaGFuZ2UuZnJvbSkgOiBcIlwiO1xuICAgICAgICBsZXQgYWZ0ZXIgPSBzZWwudG8gPiBjaGFuZ2UudG8gPyBzdGFydFN0YXRlLnNsaWNlRG9jKGNoYW5nZS50bywgc2VsLnRvKSA6IFwiXCI7XG4gICAgICAgIHRyID0gc3RhcnRTdGF0ZS5yZXBsYWNlU2VsZWN0aW9uKHZpZXcuc3RhdGUudG9UZXh0KGJlZm9yZSArIGNoYW5nZS5pbnNlcnQuc2xpY2VTdHJpbmcoMCwgdW5kZWZpbmVkLCB2aWV3LnN0YXRlLmxpbmVCcmVhaykgKyBhZnRlcikpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBzdGFydFN0YXRlLmNoYW5nZXMoY2hhbmdlKTtcbiAgICAgICAgbGV0IG1haW5TZWwgPSBuZXdTZWwgJiYgbmV3U2VsLm1haW4udG8gPD0gY2hhbmdlcy5uZXdMZW5ndGggPyBuZXdTZWwubWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gVHJ5IHRvIGFwcGx5IGEgY29tcG9zaXRpb24gY2hhbmdlIHRvIGFsbCBjdXJzb3JzXG4gICAgICAgIGlmIChzdGFydFN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoID4gMSAmJiB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS50byA8PSBzZWwudG8gJiYgY2hhbmdlLnRvID49IHNlbC50byAtIDEwKSB7XG4gICAgICAgICAgICBsZXQgcmVwbGFjZWQgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pO1xuICAgICAgICAgICAgbGV0IGNvbXBvc2l0aW9uUmFuZ2UsIGNvbXBvc2l0aW9uID0gbmV3U2VsICYmIGZpbmRDb21wb3NpdGlvbk5vZGUodmlldywgbmV3U2VsLm1haW4uaGVhZCk7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgZExlbiA9IGNoYW5nZS5pbnNlcnQubGVuZ3RoIC0gKGNoYW5nZS50byAtIGNoYW5nZS5mcm9tKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvblJhbmdlID0geyBmcm9tOiBjb21wb3NpdGlvbi5mcm9tLCB0bzogY29tcG9zaXRpb24udG8gLSBkTGVuIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvblJhbmdlID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHNlbC5oZWFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBzZWwudG8gLSBjaGFuZ2UudG8sIHNpemUgPSBzZWwudG8gLSBzZWwuZnJvbTtcbiAgICAgICAgICAgIHRyID0gc3RhcnRTdGF0ZS5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiByYW5nZS50byA9PSBzZWwudG8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXMsIHJhbmdlOiBtYWluU2VsIHx8IHJhbmdlLm1hcChjaGFuZ2VzKSB9O1xuICAgICAgICAgICAgICAgIGxldCB0byA9IHJhbmdlLnRvIC0gb2Zmc2V0LCBmcm9tID0gdG8gLSByZXBsYWNlZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLnRvIC0gcmFuZ2UuZnJvbSAhPSBzaXplIHx8IHZpZXcuc3RhdGUuc2xpY2VEb2MoZnJvbSwgdG8pICE9IHJlcGxhY2VkIHx8XG4gICAgICAgICAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZXJlJ3Mgbm8gd2F5IHRvIG1ha2UgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBpbiB0aGUgc2FtZSBub2RlIHdvcmsgd2l0aG91dCBhYm9ydGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGlvbiwgc28gY3Vyc29ycyBpbiB0aGUgY29tcG9zaXRpb24gcmFuZ2UgYXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnRvID49IGNvbXBvc2l0aW9uUmFuZ2UuZnJvbSAmJiByYW5nZS5mcm9tIDw9IGNvbXBvc2l0aW9uUmFuZ2UudG8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlIH07XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlQ2hhbmdlcyA9IHN0YXJ0U3RhdGUuY2hhbmdlcyh7IGZyb20sIHRvLCBpbnNlcnQ6IGNoYW5nZS5pbnNlcnQgfSksIHNlbE9mZiA9IHJhbmdlLnRvIC0gc2VsLnRvO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXM6IHJhbmdlQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6ICFtYWluU2VsID8gcmFuZ2UubWFwKHJhbmdlQ2hhbmdlcykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yU2VsZWN0aW9uLnJhbmdlKE1hdGgubWF4KDAsIG1haW5TZWwuYW5jaG9yICsgc2VsT2ZmKSwgTWF0aC5tYXgoMCwgbWFpblNlbC5oZWFkICsgc2VsT2ZmKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ciA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogbWFpblNlbCAmJiBzdGFydFN0YXRlLnNlbGVjdGlvbi5yZXBsYWNlUmFuZ2UobWFpblNlbClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHVzZXJFdmVudCA9IFwiaW5wdXQudHlwZVwiO1xuICAgIGlmICh2aWV3LmNvbXBvc2luZyB8fFxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlICYmIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkVuZGVkQXQgPiBEYXRlLm5vdygpIC0gNTApIHtcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSA9IGZhbHNlO1xuICAgICAgICB1c2VyRXZlbnQgKz0gXCIuY29tcG9zZVwiO1xuICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHVzZXJFdmVudCArPSBcIi5zdGFydFwiO1xuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRTdGF0ZS51cGRhdGUodHIsIHsgdXNlckV2ZW50LCBzY3JvbGxJbnRvVmlldzogdHJ1ZSB9KTtcbn1cbmZ1bmN0aW9uIGZpbmREaWZmKGEsIGIsIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSkge1xuICAgIGxldCBtaW5MZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICAgIGxldCBmcm9tID0gMDtcbiAgICB3aGlsZSAoZnJvbSA8IG1pbkxlbiAmJiBhLmNoYXJDb2RlQXQoZnJvbSkgPT0gYi5jaGFyQ29kZUF0KGZyb20pKVxuICAgICAgICBmcm9tKys7XG4gICAgaWYgKGZyb20gPT0gbWluTGVuICYmIGEubGVuZ3RoID09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgdG9BID0gYS5sZW5ndGgsIHRvQiA9IGIubGVuZ3RoO1xuICAgIHdoaWxlICh0b0EgPiAwICYmIHRvQiA+IDAgJiYgYS5jaGFyQ29kZUF0KHRvQSAtIDEpID09IGIuY2hhckNvZGVBdCh0b0IgLSAxKSkge1xuICAgICAgICB0b0EtLTtcbiAgICAgICAgdG9CLS07XG4gICAgfVxuICAgIGlmIChwcmVmZXJyZWRTaWRlID09IFwiZW5kXCIpIHtcbiAgICAgICAgbGV0IGFkanVzdCA9IE1hdGgubWF4KDAsIGZyb20gLSBNYXRoLm1pbih0b0EsIHRvQikpO1xuICAgICAgICBwcmVmZXJyZWRQb3MgLT0gdG9BICsgYWRqdXN0IC0gZnJvbTtcbiAgICB9XG4gICAgaWYgKHRvQSA8IGZyb20gJiYgYS5sZW5ndGggPCBiLmxlbmd0aCkge1xuICAgICAgICBsZXQgbW92ZSA9IHByZWZlcnJlZFBvcyA8PSBmcm9tICYmIHByZWZlcnJlZFBvcyA+PSB0b0EgPyBmcm9tIC0gcHJlZmVycmVkUG9zIDogMDtcbiAgICAgICAgZnJvbSAtPSBtb3ZlO1xuICAgICAgICB0b0IgPSBmcm9tICsgKHRvQiAtIHRvQSk7XG4gICAgICAgIHRvQSA9IGZyb207XG4gICAgfVxuICAgIGVsc2UgaWYgKHRvQiA8IGZyb20pIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gZnJvbSAmJiBwcmVmZXJyZWRQb3MgPj0gdG9CID8gZnJvbSAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIGZyb20gLT0gbW92ZTtcbiAgICAgICAgdG9BID0gZnJvbSArICh0b0EgLSB0b0IpO1xuICAgICAgICB0b0IgPSBmcm9tO1xuICAgIH1cbiAgICByZXR1cm4geyBmcm9tLCB0b0EsIHRvQiB9O1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uUG9pbnRzKHZpZXcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgaWYgKHZpZXcucm9vdC5hY3RpdmVFbGVtZW50ICE9IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICBsZXQgeyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgaWYgKGFuY2hvck5vZGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IERPTVBvaW50KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkpO1xuICAgICAgICBpZiAoZm9jdXNOb2RlICE9IGFuY2hvck5vZGUgfHwgZm9jdXNPZmZzZXQgIT0gYW5jaG9yT2Zmc2V0KVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IERPTVBvaW50KGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvbkZyb21Qb2ludHMocG9pbnRzLCBiYXNlKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFuY2hvciA9IHBvaW50c1swXS5wb3MsIGhlYWQgPSBwb2ludHMubGVuZ3RoID09IDIgPyBwb2ludHNbMV0ucG9zIDogYW5jaG9yO1xuICAgIHJldHVybiBhbmNob3IgPiAtMSAmJiBoZWFkID4gLTEgPyBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGFuY2hvciArIGJhc2UsIGhlYWQgKyBiYXNlKSA6IG51bGw7XG59XG5cbmNsYXNzIElucHV0U3RhdGUge1xuICAgIHNldFNlbGVjdGlvbk9yaWdpbihvcmlnaW4pIHtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlID0gMDtcbiAgICAgICAgdGhpcy5sYXN0S2V5VGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFRvdWNoVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEZvY3VzVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbFRvcCA9IDA7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbExlZnQgPSAwO1xuICAgICAgICAvLyBPbiBpT1MsIHNvbWUga2V5cyBuZWVkIHRvIGhhdmUgdGhlaXIgZGVmYXVsdCBiZWhhdmlvciBoYXBwZW5cbiAgICAgICAgLy8gKGFmdGVyIHdoaWNoIHdlIHJldHJvYWN0aXZlbHkgaGFuZGxlIHRoZW0gYW5kIHJlc2V0IHRoZSBET00pIHRvXG4gICAgICAgIC8vIGF2b2lkIG1lc3NpbmcgdXAgdGhlIHZpcnR1YWwga2V5Ym9hcmQgc3RhdGUuXG4gICAgICAgIHRoaXMucGVuZGluZ0lPU0tleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgIFdoZW4gZW5hYmxlZCAoPi0xKSwgdGFiIHByZXNzZXMgYXJlIG5vdCBnaXZlbiB0byBrZXkgaGFuZGxlcnMsXG4gICAgICAgIGxlYXZpbmcgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW9yLiBJZiA+MCwgdGhlIG1vZGUgZXhwaXJlc1xuICAgICAgICBhdCB0aGF0IHRpbWVzdGFtcCwgYW5kIGFueSBvdGhlciBrZXlwcmVzcyBjbGVhcnMgaXQuXG4gICAgICAgIEVzYyBlbmFibGVzIHRlbXBvcmFyeSB0YWIgZm9jdXMgbW9kZSBmb3IgdHdvIHNlY29uZHMgd2hlbiBub3RcbiAgICAgICAgb3RoZXJ3aXNlIGhhbmRsZWQuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudGFiRm9jdXNNb2RlID0gLTE7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb250ZXh0TWVudSA9IDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIC0xIG1lYW5zIG5vdCBpbiBhIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsIHRoaXMgY291bnRzIHRoZSBudW1iZXJcbiAgICAgICAgLy8gb2YgY2hhbmdlcyBtYWRlIGR1cmluZyB0aGUgY29tcG9zaXRpb24uIFRoZSBjb3VudCBpcyB1c2VkIHRvXG4gICAgICAgIC8vIGF2b2lkIHRyZWF0aW5nIHRoZSBzdGFydCBzdGF0ZSBvZiB0aGUgY29tcG9zaXRpb24sIGJlZm9yZSBhbnlcbiAgICAgICAgLy8gY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSwgYXMgcGFydCBvZiB0aGUgY29tcG9zaXRpb24uXG4gICAgICAgIHRoaXMuY29tcG9zaW5nID0gLTE7XG4gICAgICAgIC8vIFRyYWNrcyB3aGV0aGVyIHRoZSBuZXh0IGNoYW5nZSBzaG91bGQgYmUgbWFya2VkIGFzIHN0YXJ0aW5nIHRoZVxuICAgICAgICAvLyBjb21wb3NpdGlvbiAobnVsbCBtZWFucyBubyBjb21wb3NpdGlvbiwgdHJ1ZSBtZWFucyBuZXh0IGlzIHRoZVxuICAgICAgICAvLyBmaXJzdCwgZmFsc2UgbWVhbnMgZmlyc3QgaGFzIGFscmVhZHkgYmVlbiBtYXJrZWQgZm9yIHRoaXNcbiAgICAgICAgLy8gY29tcG9zaXRpb24pXG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IG51bGw7XG4gICAgICAgIC8vIEVuZCB0aW1lIG9mIHRoZSBwcmV2aW91cyBjb21wb3NpdGlvblxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRW5kZWRBdCA9IDA7XG4gICAgICAgIC8vIFVzZWQgaW4gYSBrbHVkZ2UgdG8gZGV0ZWN0IHdoZW4gYW4gRW50ZXIga2V5cHJlc3Mgc2hvdWxkIGJlXG4gICAgICAgIC8vIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgY29tcG9zaXRpb24gb24gU2FmYXJpLCB3aGljaCBmaXJlcyBldmVudHNcbiAgICAgICAgLy8gaW4gdGhlIHdyb25nIG9yZGVyXG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nS2V5ID0gZmFsc2U7XG4gICAgICAgIC8vIFVzZWQgdG8gY2F0ZWdvcml6ZSBjaGFuZ2VzIGFzIHBhcnQgb2YgYSBjb21wb3NpdGlvbiwgZXZlbiB3aGVuXG4gICAgICAgIC8vIHRoZSBtdXRhdGlvbiBldmVudHMgZmlyZSBzaG9ydGx5IGFmdGVyIHRoZSBjb21wb3NpdGlvbmVuZCBldmVudFxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgLy8gV2hlbiBhIGRyYWcgZnJvbSB0aGUgZWRpdG9yIGlzIGFjdGl2ZSwgdGhpcyBwb2ludHMgYXQgdGhlIHJhbmdlXG4gICAgICAgIC8vIGJlaW5nIGRyYWdnZWQuXG4gICAgICAgIHRoaXMuZHJhZ2dlZENvbnRlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm5vdGlmaWVkRm9jdXNlZCA9IHZpZXcuaGFzRm9jdXM7XG4gICAgICAgIC8vIE9uIFNhZmFyaSBhZGRpbmcgYW4gaW5wdXQgZXZlbnQgaGFuZGxlciBzb21laG93IHByZXZlbnRzIGFuXG4gICAgICAgIC8vIGlzc3VlIHdoZXJlIHRoZSBjb21wb3NpdGlvbiB2YW5pc2hlcyB3aGVuIHlvdSBwcmVzcyBlbnRlci5cbiAgICAgICAgaWYgKGJyb3dzZXIuc2FmYXJpKVxuICAgICAgICAgICAgdmlldy5jb250ZW50RE9NLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKSA9PiBudWxsKTtcbiAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28pXG4gICAgICAgICAgICBmaXJlZm94Q29weUN1dEhhY2sodmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQpO1xuICAgIH1cbiAgICBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50QmVsb25nc1RvRWRpdG9yKHRoaXMudmlldywgZXZlbnQpIHx8IHRoaXMuaWdub3JlRHVyaW5nQ29tcG9zaXRpb24oZXZlbnQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PSBcImtleWRvd25cIiAmJiB0aGlzLmtleWRvd24oZXZlbnQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy52aWV3LnVwZGF0ZVN0YXRlICE9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLylcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5ydW5IYW5kbGVycyhldmVudC50eXBlLCBldmVudCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnJ1bkhhbmRsZXJzKGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgICB9XG4gICAgcnVuSGFuZGxlcnModHlwZSwgZXZlbnQpIHtcbiAgICAgICAgbGV0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc1t0eXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBvYnNlcnZlciBvZiBoYW5kbGVycy5vYnNlcnZlcnMpXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIodGhpcy52aWV3LCBldmVudCk7XG4gICAgICAgICAgICBmb3IgKGxldCBoYW5kbGVyIG9mIGhhbmRsZXJzLmhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKHRoaXMudmlldywgZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnN1cmVIYW5kbGVycyhwbHVnaW5zKSB7XG4gICAgICAgIGxldCBoYW5kbGVycyA9IGNvbXB1dGVIYW5kbGVycyhwbHVnaW5zKSwgcHJldiA9IHRoaXMuaGFuZGxlcnMsIGRvbSA9IHRoaXMudmlldy5jb250ZW50RE9NO1xuICAgICAgICBmb3IgKGxldCB0eXBlIGluIGhhbmRsZXJzKVxuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJzY3JvbGxcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXNzaXZlID0gIWhhbmRsZXJzW3R5cGVdLmhhbmRsZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RzID0gcHJldlt0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RzICYmIHBhc3NpdmUgIT0gIWV4aXN0cy5oYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKVxuICAgICAgICAgICAgICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLmhhbmRsZUV2ZW50LCB7IHBhc3NpdmUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHR5cGUgaW4gcHJldilcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwic2Nyb2xsXCIgJiYgIWhhbmRsZXJzW3R5cGVdKVxuICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMuaGFuZGxlRXZlbnQpO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnM7XG4gICAgfVxuICAgIGtleWRvd24oZXZlbnQpIHtcbiAgICAgICAgLy8gTXVzdCBhbHdheXMgcnVuLCBldmVuIGlmIGEgY3VzdG9tIGhhbmRsZXIgaGFuZGxlZCB0aGUgZXZlbnRcbiAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgICAgIHRoaXMubGFzdEtleVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSA5ICYmIHRoaXMudGFiRm9jdXNNb2RlID4gLTEgJiYgKCF0aGlzLnRhYkZvY3VzTW9kZSB8fCBEYXRlLm5vdygpIDw9IHRoaXMudGFiRm9jdXNNb2RlKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy50YWJGb2N1c01vZGUgPiAwICYmIGV2ZW50LmtleUNvZGUgIT0gMjcgJiYgbW9kaWZpZXJDb2Rlcy5pbmRleE9mKGV2ZW50LmtleUNvZGUpIDwgMClcbiAgICAgICAgICAgIHRoaXMudGFiRm9jdXNNb2RlID0gLTE7XG4gICAgICAgIC8vIENocm9tZSBmb3IgQW5kcm9pZCB1c3VhbGx5IGRvZXNuJ3QgZmlyZSBwcm9wZXIga2V5IGV2ZW50cywgYnV0XG4gICAgICAgIC8vIG9jY2FzaW9uYWxseSBkb2VzLCB1c3VhbGx5IHN1cnJvdW5kZWQgYnkgYSBidW5jaCBvZiBjb21wbGljYXRlZFxuICAgICAgICAvLyBjb21wb3NpdGlvbiBjaGFuZ2VzLiBXaGVuIGFuIGVudGVyIG9yIGJhY2tzcGFjZSBrZXkgZXZlbnQgaXNcbiAgICAgICAgLy8gc2VlbiwgaG9sZCBvZmYgb24gaGFuZGxpbmcgRE9NIGV2ZW50cyBmb3IgYSBiaXQsIGFuZCB0aGVuXG4gICAgICAgIC8vIGRpc3BhdGNoIGl0LlxuICAgICAgICBpZiAoYnJvd3Nlci5hbmRyb2lkICYmIGJyb3dzZXIuY2hyb21lICYmICFldmVudC5zeW50aGV0aWMgJiZcbiAgICAgICAgICAgIChldmVudC5rZXlDb2RlID09IDEzIHx8IGV2ZW50LmtleUNvZGUgPT0gOCkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5kZWxheUFuZHJvaWRLZXkoZXZlbnQua2V5LCBldmVudC5rZXlDb2RlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgRW50ZXIgb24gaU9TIG1ha2VzIHRoZVxuICAgICAgICAvLyB2aXJ0dWFsIGtleWJvYXJkIGdldCBzdHVjayBpbiB0aGUgd3JvbmcgKGxvd2VyY2FzZSlcbiAgICAgICAgLy8gc3RhdGUuIFNvIHdlIGxldCBpdCBnbyB0aHJvdWdoLCBhbmQgdGhlbiwgaW5cbiAgICAgICAgLy8gYXBwbHlET01DaGFuZ2UsIG5vdGlmeSBrZXkgaGFuZGxlcnMgb2YgaXQgYW5kIHJlc2V0IHRvXG4gICAgICAgIC8vIHRoZSBzdGF0ZSB0aGV5IHByb2R1Y2UuXG4gICAgICAgIGxldCBwZW5kaW5nO1xuICAgICAgICBpZiAoYnJvd3Nlci5pb3MgJiYgIWV2ZW50LnN5bnRoZXRpYyAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5tZXRhS2V5ICYmXG4gICAgICAgICAgICAoKHBlbmRpbmcgPSBQZW5kaW5nS2V5cy5maW5kKGtleSA9PiBrZXkua2V5Q29kZSA9PSBldmVudC5rZXlDb2RlKSkgJiYgIWV2ZW50LmN0cmxLZXkgfHxcbiAgICAgICAgICAgICAgICBFbWFjc3lQZW5kaW5nS2V5cy5pbmRleE9mKGV2ZW50LmtleSkgPiAtMSAmJiBldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSkpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0lPU0tleSA9IHBlbmRpbmcgfHwgZXZlbnQ7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZmx1c2hJT1NLZXkoKSwgMjUwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9IDIyOSlcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5mb3JjZUZsdXNoKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZmx1c2hJT1NLZXkoY2hhbmdlKSB7XG4gICAgICAgIGxldCBrZXkgPSB0aGlzLnBlbmRpbmdJT1NLZXk7XG4gICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBUaGlzIGxvb2tzIGxpa2UgYW4gYXV0b2NvcnJlY3Rpb24gYmVmb3JlIEVudGVyXG4gICAgICAgIGlmIChrZXkua2V5ID09IFwiRW50ZXJcIiAmJiBjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPCBjaGFuZ2UudG8gJiYgL15cXFMrJC8udGVzdChjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaEtleSh0aGlzLnZpZXcuY29udGVudERPTSwga2V5LmtleSwga2V5LmtleUNvZGUsIGtleSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgPyBrZXkgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZ25vcmVEdXJpbmdDb21wb3NpdGlvbihldmVudCkge1xuICAgICAgICBpZiAoIS9ea2V5Ly50ZXN0KGV2ZW50LnR5cGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy5zdHVtLmRlLzIwMTYvMDYvMjQvaGFuZGxpbmctaW1lLWV2ZW50cy1pbi1qYXZhc2NyaXB0Ly5cbiAgICAgICAgLy8gT24gc29tZSBpbnB1dCBtZXRob2QgZWRpdG9ycyAoSU1FcyksIHRoZSBFbnRlciBrZXkgaXMgdXNlZCB0b1xuICAgICAgICAvLyBjb25maXJtIGNoYXJhY3RlciBzZWxlY3Rpb24uIE9uIFNhZmFyaSwgd2hlbiBFbnRlciBpcyBwcmVzc2VkLFxuICAgICAgICAvLyBjb21wb3NpdGlvbmVuZCBhbmQga2V5ZG93biBldmVudHMgYXJlIHNvbWV0aW1lcyBlbWl0dGVkIGluIHRoZVxuICAgICAgICAvLyB3cm9uZyBvcmRlci4gVGhlIGtleSBldmVudCBzaG91bGQgc3RpbGwgYmUgaWdub3JlZCwgZXZlbiB3aGVuXG4gICAgICAgIC8vIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIGNvbXBvc2l0aW9uZW5kIGV2ZW50LlxuICAgICAgICBpZiAoYnJvd3Nlci5zYWZhcmkgJiYgIWJyb3dzZXIuaW9zICYmIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nS2V5ICYmIERhdGUubm93KCkgLSB0aGlzLmNvbXBvc2l0aW9uRW5kZWRBdCA8IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3RhcnRNb3VzZVNlbGVjdGlvbihtb3VzZVNlbGVjdGlvbikge1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uID0gbW91c2VTZWxlY3Rpb247XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24udXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnZWRDb250ZW50ICYmIHVwZGF0ZS5kb2NDaGFuZ2VkKVxuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkQ29udGVudCA9IHRoaXMuZHJhZ2dlZENvbnRlbnQubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJpbmRIYW5kbGVyKHBsdWdpbiwgaGFuZGxlcikge1xuICAgIHJldHVybiAodmlldywgZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmNhbGwocGx1Z2luLCBldmVudCwgdmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlSGFuZGxlcnMocGx1Z2lucykge1xuICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZ1bmN0aW9uIHJlY29yZCh0eXBlKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRbdHlwZV0gfHwgKHJlc3VsdFt0eXBlXSA9IHsgb2JzZXJ2ZXJzOiBbXSwgaGFuZGxlcnM6IFtdIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICBsZXQgc3BlYyA9IHBsdWdpbi5zcGVjO1xuICAgICAgICBpZiAoc3BlYyAmJiBzcGVjLmRvbUV2ZW50SGFuZGxlcnMpXG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHNwZWMuZG9tRXZlbnRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGxldCBmID0gc3BlYy5kb21FdmVudEhhbmRsZXJzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgICAgICByZWNvcmQodHlwZSkuaGFuZGxlcnMucHVzaChiaW5kSGFuZGxlcihwbHVnaW4udmFsdWUsIGYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWMgJiYgc3BlYy5kb21FdmVudE9ic2VydmVycylcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gc3BlYy5kb21FdmVudE9ic2VydmVycykge1xuICAgICAgICAgICAgICAgIGxldCBmID0gc3BlYy5kb21FdmVudE9ic2VydmVyc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZilcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkKHR5cGUpLm9ic2VydmVycy5wdXNoKGJpbmRIYW5kbGVyKHBsdWdpbi52YWx1ZSwgZikpO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCB0eXBlIGluIGhhbmRsZXJzKVxuICAgICAgICByZWNvcmQodHlwZSkuaGFuZGxlcnMucHVzaChoYW5kbGVyc1t0eXBlXSk7XG4gICAgZm9yIChsZXQgdHlwZSBpbiBvYnNlcnZlcnMpXG4gICAgICAgIHJlY29yZCh0eXBlKS5vYnNlcnZlcnMucHVzaChvYnNlcnZlcnNbdHlwZV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBQZW5kaW5nS2V5cyA9IFtcbiAgICB7IGtleTogXCJCYWNrc3BhY2VcIiwga2V5Q29kZTogOCwgaW5wdXRUeXBlOiBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiIH0sXG4gICAgeyBrZXk6IFwiRW50ZXJcIiwga2V5Q29kZTogMTMsIGlucHV0VHlwZTogXCJpbnNlcnRQYXJhZ3JhcGhcIiB9LFxuICAgIHsga2V5OiBcIkVudGVyXCIsIGtleUNvZGU6IDEzLCBpbnB1dFR5cGU6IFwiaW5zZXJ0TGluZUJyZWFrXCIgfSxcbiAgICB7IGtleTogXCJEZWxldGVcIiwga2V5Q29kZTogNDYsIGlucHV0VHlwZTogXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiIH1cbl07XG5jb25zdCBFbWFjc3lQZW5kaW5nS2V5cyA9IFwiZHRoa29cIjtcbi8vIEtleSBjb2RlcyBmb3IgbW9kaWZpZXIga2V5c1xuY29uc3QgbW9kaWZpZXJDb2RlcyA9IFsxNiwgMTcsIDE4LCAyMCwgOTEsIDkyLCAyMjQsIDIyNV07XG5jb25zdCBkcmFnU2Nyb2xsTWFyZ2luID0gNjtcbmZ1bmN0aW9uIGRyYWdTY3JvbGxTcGVlZChkaXN0KSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIGRpc3QpICogMC43ICsgODtcbn1cbmZ1bmN0aW9uIGRpc3QoYSwgYikge1xuICAgIHJldHVybiBNYXRoLm1heChNYXRoLmFicyhhLmNsaWVudFggLSBiLmNsaWVudFgpLCBNYXRoLmFicyhhLmNsaWVudFkgLSBiLmNsaWVudFkpKTtcbn1cbmNsYXNzIE1vdXNlU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzdGFydEV2ZW50LCBzdHlsZSwgbXVzdFNlbGVjdCkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnN0YXJ0RXZlbnQgPSBzdGFydEV2ZW50O1xuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIHRoaXMubXVzdFNlbGVjdCA9IG11c3RTZWxlY3Q7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0RXZlbnQgPSBzdGFydEV2ZW50O1xuICAgICAgICB0aGlzLnNjcm9sbFBhcmVudHMgPSBzY3JvbGxhYmxlUGFyZW50cyh2aWV3LmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmF0b21zID0gdmlldy5zdGF0ZS5mYWNldChhdG9taWNSYW5nZXMpLm1hcChmID0+IGYodmlldykpO1xuICAgICAgICBsZXQgZG9jID0gdmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSA9IHRoaXMubW92ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMudXAgPSB0aGlzLnVwLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmV4dGVuZCA9IHN0YXJ0RXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIHRoaXMubXVsdGlwbGUgPSB2aWV3LnN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKSAmJiBhZGRzU2VsZWN0aW9uUmFuZ2Uodmlldywgc3RhcnRFdmVudCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBpc0luUHJpbWFyeVNlbGVjdGlvbih2aWV3LCBzdGFydEV2ZW50KSAmJiBnZXRDbGlja1R5cGUoc3RhcnRFdmVudCkgPT0gMSA/IG51bGwgOiBmYWxzZTtcbiAgICB9XG4gICAgc3RhcnQoZXZlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBzZWxlY3Rpb24sIGltbWVkaWF0ZWx5IGFwcGx5IHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2Ygc3RhcnRpbmcgdGhlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdChldmVudCk7XG4gICAgfVxuICAgIG1vdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgfHwgdGhpcy5kcmFnZ2luZyA9PSBudWxsICYmIGRpc3QodGhpcy5zdGFydEV2ZW50LCBldmVudCkgPCAxMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQgPSBldmVudCk7XG4gICAgICAgIGxldCBzeCA9IDAsIHN5ID0gMDtcbiAgICAgICAgbGV0IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IHRoaXMudmlldy53aW4uaW5uZXJXaWR0aCwgYm90dG9tID0gdGhpcy52aWV3Lndpbi5pbm5lckhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsUGFyZW50cy54KVxuICAgICAgICAgICAgKHsgbGVmdCwgcmlnaHQgfSA9IHRoaXMuc2Nyb2xsUGFyZW50cy54LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsUGFyZW50cy55KVxuICAgICAgICAgICAgKHsgdG9wLCBib3R0b20gfSA9IHRoaXMuc2Nyb2xsUGFyZW50cy55LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgbGV0IG1hcmdpbnMgPSBnZXRTY3JvbGxNYXJnaW5zKHRoaXMudmlldyk7XG4gICAgICAgIGlmIChldmVudC5jbGllbnRYIC0gbWFyZ2lucy5sZWZ0IDw9IGxlZnQgKyBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3ggPSAtZHJhZ1Njcm9sbFNwZWVkKGxlZnQgLSBldmVudC5jbGllbnRYKTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQuY2xpZW50WCArIG1hcmdpbnMucmlnaHQgPj0gcmlnaHQgLSBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3ggPSBkcmFnU2Nyb2xsU3BlZWQoZXZlbnQuY2xpZW50WCAtIHJpZ2h0KTtcbiAgICAgICAgaWYgKGV2ZW50LmNsaWVudFkgLSBtYXJnaW5zLnRvcCA8PSB0b3AgKyBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3kgPSAtZHJhZ1Njcm9sbFNwZWVkKHRvcCAtIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBlbHNlIGlmIChldmVudC5jbGllbnRZICsgbWFyZ2lucy5ib3R0b20gPj0gYm90dG9tIC0gZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN5ID0gZHJhZ1Njcm9sbFNwZWVkKGV2ZW50LmNsaWVudFkgLSBib3R0b20pO1xuICAgICAgICB0aGlzLnNldFNjcm9sbFNwZWVkKHN4LCBzeSk7XG4gICAgfVxuICAgIHVwKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCk7XG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZylcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNldFNjcm9sbFNwZWVkKDAsIDApO1xuICAgICAgICBsZXQgZG9jID0gdGhpcy52aWV3LmNvbnRlbnRET00ub3duZXJEb2N1bWVudDtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlKTtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMudXApO1xuICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbiA9IHRoaXMudmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICB9XG4gICAgc2V0U2Nyb2xsU3BlZWQoc3gsIHN5KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSB7IHg6IHN4LCB5OiBzeSB9O1xuICAgICAgICBpZiAoc3ggfHwgc3kpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGluZyA8IDApXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnNjcm9sbCgpLCA1MCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zY3JvbGxpbmcgPiAtMSkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbGluZyk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGluZyA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjcm9sbCgpIHtcbiAgICAgICAgbGV0IHsgeCwgeSB9ID0gdGhpcy5zY3JvbGxTcGVlZDtcbiAgICAgICAgaWYgKHggJiYgdGhpcy5zY3JvbGxQYXJlbnRzLngpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsUGFyZW50cy54LnNjcm9sbExlZnQgKz0geDtcbiAgICAgICAgICAgIHggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ICYmIHRoaXMuc2Nyb2xsUGFyZW50cy55KSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBhcmVudHMueS5zY3JvbGxUb3AgKz0geTtcbiAgICAgICAgICAgIHkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4IHx8IHkpXG4gICAgICAgICAgICB0aGlzLnZpZXcud2luLnNjcm9sbEJ5KHgsIHkpO1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCk7XG4gICAgfVxuICAgIHNraXBBdG9tcyhzZWwpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gc2VsLnJhbmdlc1tpXSwgdXBkYXRlZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcG9zID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS5mcm9tLCAwKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICE9IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBza2lwQXRvbWljUmFuZ2VzKHRoaXMuYXRvbXMsIHJhbmdlLmZyb20sIC0xKTtcbiAgICAgICAgICAgICAgICBsZXQgdG8gPSBza2lwQXRvbWljUmFuZ2VzKHRoaXMuYXRvbXMsIHJhbmdlLnRvLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSAhPSByYW5nZS5mcm9tIHx8IHRvICE9IHJhbmdlLnRvKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHJhbmdlLmZyb20gPT0gcmFuZ2UuYW5jaG9yID8gZnJvbSA6IHRvLCByYW5nZS5mcm9tID09IHJhbmdlLmhlYWQgPyBmcm9tIDogdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzID0gc2VsLnJhbmdlcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHJhbmdlc1tpXSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlcyA/IEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCBzZWwubWFpbkluZGV4KSA6IHNlbDtcbiAgICB9XG4gICAgc2VsZWN0KGV2ZW50KSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIHNlbGVjdGlvbiA9IHRoaXMuc2tpcEF0b21zKHRoaXMuc3R5bGUuZ2V0KGV2ZW50LCB0aGlzLmV4dGVuZCwgdGhpcy5tdWx0aXBsZSkpO1xuICAgICAgICBpZiAodGhpcy5tdXN0U2VsZWN0IHx8ICFzZWxlY3Rpb24uZXEodmlldy5zdGF0ZS5zZWxlY3Rpb24sIHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKSlcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHVzZXJFdmVudDogXCJzZWxlY3QucG9pbnRlclwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tdXN0U2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5pc1VzZXJFdmVudChcImlucHV0LnR5cGVcIikpKVxuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc3R5bGUudXBkYXRlKHVwZGF0ZSkpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0KHRoaXMubGFzdEV2ZW50KSwgMjApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZHNTZWxlY3Rpb25SYW5nZSh2aWV3LCBldmVudCkge1xuICAgIGxldCBmYWNldCA9IHZpZXcuc3RhdGUuZmFjZXQoY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2UpO1xuICAgIHJldHVybiBmYWNldC5sZW5ndGggPyBmYWNldFswXShldmVudCkgOiBicm93c2VyLm1hYyA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5O1xufVxuZnVuY3Rpb24gZHJhZ01vdmVzU2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IGZhY2V0ID0gdmlldy5zdGF0ZS5mYWNldChkcmFnTW92ZXNTZWxlY3Rpb24kMSk7XG4gICAgcmV0dXJuIGZhY2V0Lmxlbmd0aCA/IGZhY2V0WzBdKGV2ZW50KSA6IGJyb3dzZXIubWFjID8gIWV2ZW50LmFsdEtleSA6ICFldmVudC5jdHJsS2V5O1xufVxuZnVuY3Rpb24gaXNJblByaW1hcnlTZWxlY3Rpb24odmlldywgZXZlbnQpIHtcbiAgICBsZXQgeyBtYWluIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAobWFpbi5lbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIE9uIGJvdW5kYXJ5IGNsaWNrcywgY2hlY2sgd2hldGhlciB0aGUgY29vcmRpbmF0ZXMgYXJlIGluc2lkZSB0aGVcbiAgICAvLyBzZWxlY3Rpb24ncyBjbGllbnQgcmVjdGFuZ2xlc1xuICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICBpZiAoIXNlbCB8fCBzZWwucmFuZ2VDb3VudCA9PSAwKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgcmVjdHMgPSBzZWwuZ2V0UmFuZ2VBdCgwKS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgaWYgKHJlY3QubGVmdCA8PSBldmVudC5jbGllbnRYICYmIHJlY3QucmlnaHQgPj0gZXZlbnQuY2xpZW50WCAmJlxuICAgICAgICAgICAgcmVjdC50b3AgPD0gZXZlbnQuY2xpZW50WSAmJiByZWN0LmJvdHRvbSA+PSBldmVudC5jbGllbnRZKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGV2ZW50QmVsb25nc1RvRWRpdG9yKHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5idWJibGVzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQsIGNWaWV3OyBub2RlICE9IHZpZXcuY29udGVudERPTTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgPT0gMTEgfHwgKChjVmlldyA9IENvbnRlbnRWaWV3LmdldChub2RlKSkgJiYgY1ZpZXcuaWdub3JlRXZlbnQoZXZlbnQpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IGhhbmRsZXJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCBvYnNlcnZlcnMgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8vIFRoaXMgaXMgdmVyeSBjcnVkZSwgYnV0IHVuZm9ydHVuYXRlbHkgYm90aCB0aGVzZSBicm93c2VycyBfcHJldGVuZF9cbi8vIHRoYXQgdGhleSBoYXZlIGEgY2xpcGJvYXJkIEFQSVx1MjAxNGFsbCB0aGUgb2JqZWN0cyBhbmQgbWV0aG9kcyBhcmVcbi8vIHRoZXJlLCB0aGV5IGp1c3QgZG9uJ3Qgd29yaywgYW5kIHRoZXkgYXJlIGhhcmQgdG8gdGVzdC5cbmNvbnN0IGJyb2tlbkNsaXBib2FyZEFQSSA9IChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8IDE1KSB8fFxuICAgIChicm93c2VyLmlvcyAmJiBicm93c2VyLndlYmtpdF92ZXJzaW9uIDwgNjA0KTtcbmZ1bmN0aW9uIGNhcHR1cmVQYXN0ZSh2aWV3KSB7XG4gICAgbGV0IHBhcmVudCA9IHZpZXcuZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gcGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSk7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgICAgIHRhcmdldC5yZW1vdmUoKTtcbiAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudmFsdWUpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIHRleHRGaWx0ZXIoc3RhdGUsIGZhY2V0LCB0ZXh0KSB7XG4gICAgZm9yIChsZXQgZmlsdGVyIG9mIHN0YXRlLmZhY2V0KGZhY2V0KSlcbiAgICAgICAgdGV4dCA9IGZpbHRlcih0ZXh0LCBzdGF0ZSk7XG4gICAgcmV0dXJuIHRleHQ7XG59XG5mdW5jdGlvbiBkb1Bhc3RlKHZpZXcsIGlucHV0KSB7XG4gICAgaW5wdXQgPSB0ZXh0RmlsdGVyKHZpZXcuc3RhdGUsIGNsaXBib2FyZElucHV0RmlsdGVyLCBpbnB1dCk7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNoYW5nZXMsIGkgPSAxLCB0ZXh0ID0gc3RhdGUudG9UZXh0KGlucHV0KTtcbiAgICBsZXQgYnlMaW5lID0gdGV4dC5saW5lcyA9PSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aDtcbiAgICBsZXQgbGluZXdpc2UgPSBsYXN0TGluZXdpc2VDb3B5ICE9IG51bGwgJiYgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5ldmVyeShyID0+IHIuZW1wdHkpICYmIGxhc3RMaW5ld2lzZUNvcHkgPT0gdGV4dC50b1N0cmluZygpO1xuICAgIGlmIChsaW5ld2lzZSkge1xuICAgICAgICBsZXQgbGFzdExpbmUgPSAtMTtcbiAgICAgICAgY2hhbmdlcyA9IHN0YXRlLmNoYW5nZUJ5UmFuZ2UocmFuZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHJhbmdlLmZyb20pO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA9PSBsYXN0TGluZSlcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZSB9O1xuICAgICAgICAgICAgbGFzdExpbmUgPSBsaW5lLmZyb207XG4gICAgICAgICAgICBsZXQgaW5zZXJ0ID0gc3RhdGUudG9UZXh0KChieUxpbmUgPyB0ZXh0LmxpbmUoaSsrKS50ZXh0IDogaW5wdXQpICsgc3RhdGUubGluZUJyZWFrKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXM6IHsgZnJvbTogbGluZS5mcm9tLCBpbnNlcnQgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgaW5zZXJ0Lmxlbmd0aCkgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJ5TGluZSkge1xuICAgICAgICBjaGFuZ2VzID0gc3RhdGUuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHRleHQubGluZShpKyspO1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogeyBmcm9tOiByYW5nZS5mcm9tLCB0bzogcmFuZ2UudG8sIGluc2VydDogbGluZS50ZXh0IH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmFuZ2UuZnJvbSArIGxpbmUubGVuZ3RoKSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNoYW5nZXMgPSBzdGF0ZS5yZXBsYWNlU2VsZWN0aW9uKHRleHQpO1xuICAgIH1cbiAgICB2aWV3LmRpc3BhdGNoKGNoYW5nZXMsIHtcbiAgICAgICAgdXNlckV2ZW50OiBcImlucHV0LnBhc3RlXCIsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiB0cnVlXG4gICAgfSk7XG59XG5vYnNlcnZlcnMuc2Nyb2xsID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3AgPSB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3A7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxMZWZ0ID0gdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdDtcbn07XG5oYW5kbGVycy5rZXlkb3duID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLnNldFNlbGVjdGlvbk9yaWdpbihcInNlbGVjdFwiKTtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAyNyAmJiB2aWV3LmlucHV0U3RhdGUudGFiRm9jdXNNb2RlICE9IDApXG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgPSBEYXRlLm5vdygpICsgMjAwMDtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xub2JzZXJ2ZXJzLnRvdWNoc3RhcnQgPSAodmlldywgZSkgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0LnBvaW50ZXJcIik7XG59O1xub2JzZXJ2ZXJzLnRvdWNobW92ZSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5zZXRTZWxlY3Rpb25PcmlnaW4oXCJzZWxlY3QucG9pbnRlclwiKTtcbn07XG5oYW5kbGVycy5tb3VzZWRvd24gPSAodmlldywgZXZlbnQpID0+IHtcbiAgICB2aWV3Lm9ic2VydmVyLmZsdXNoKCk7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lID4gRGF0ZS5ub3coKSAtIDIwMDApXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWdub3JlIHRvdWNoIGludGVyYWN0aW9uXG4gICAgbGV0IHN0eWxlID0gbnVsbDtcbiAgICBmb3IgKGxldCBtYWtlU3R5bGUgb2Ygdmlldy5zdGF0ZS5mYWNldChtb3VzZVNlbGVjdGlvblN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IG1ha2VTdHlsZSh2aWV3LCBldmVudCk7XG4gICAgICAgIGlmIChzdHlsZSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIXN0eWxlICYmIGV2ZW50LmJ1dHRvbiA9PSAwKVxuICAgICAgICBzdHlsZSA9IGJhc2ljTW91c2VTZWxlY3Rpb24odmlldywgZXZlbnQpO1xuICAgIGlmIChzdHlsZSkge1xuICAgICAgICBsZXQgbXVzdEZvY3VzID0gIXZpZXcuaGFzRm9jdXM7XG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5zdGFydE1vdXNlU2VsZWN0aW9uKG5ldyBNb3VzZVNlbGVjdGlvbih2aWV3LCBldmVudCwgc3R5bGUsIG11c3RGb2N1cykpO1xuICAgICAgICBpZiAobXVzdEZvY3VzKVxuICAgICAgICAgICAgdmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvY3VzUHJldmVudFNjcm9sbCh2aWV3LmNvbnRlbnRET00pO1xuICAgICAgICAgICAgICAgIGxldCBhY3RpdmUgPSB2aWV3LnJvb3QuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlICYmICFhY3RpdmUuY29udGFpbnModmlldy5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlLmJsdXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBsZXQgbW91c2VTZWwgPSB2aWV3LmlucHV0U3RhdGUubW91c2VTZWxlY3Rpb247XG4gICAgICAgIGlmIChtb3VzZVNlbCkge1xuICAgICAgICAgICAgbW91c2VTZWwuc3RhcnQoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIG1vdXNlU2VsLmRyYWdnaW5nID09PSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZnVuY3Rpb24gcmFuZ2VGb3JDbGljayh2aWV3LCBwb3MsIGJpYXMsIHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSAxKSB7IC8vIFNpbmdsZSBjbGlja1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIGJpYXMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09IDIpIHsgLy8gRG91YmxlIGNsaWNrXG4gICAgICAgIHJldHVybiBncm91cEF0KHZpZXcuc3RhdGUsIHBvcywgYmlhcyk7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBUcmlwbGUgY2xpY2tcbiAgICAgICAgbGV0IHZpc3VhbCA9IExpbmVWaWV3LmZpbmQodmlldy5kb2NWaWV3LCBwb3MpLCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHZpc3VhbCA/IHZpc3VhbC5wb3NBdEVuZCA6IHBvcyk7XG4gICAgICAgIGxldCBmcm9tID0gdmlzdWFsID8gdmlzdWFsLnBvc0F0U3RhcnQgOiBsaW5lLmZyb20sIHRvID0gdmlzdWFsID8gdmlzdWFsLnBvc0F0RW5kIDogbGluZS50bztcbiAgICAgICAgaWYgKHRvIDwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoICYmIHRvID09IGxpbmUudG8pXG4gICAgICAgICAgICB0bysrO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5sZXQgaW5zaWRlID0gKHgsIHksIHJlY3QpID0+IHkgPj0gcmVjdC50b3AgJiYgeSA8PSByZWN0LmJvdHRvbSAmJiB4ID49IHJlY3QubGVmdCAmJiB4IDw9IHJlY3QucmlnaHQ7XG4vLyBUcnkgdG8gZGV0ZXJtaW5lLCBmb3IgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLCBhc3NvY2lhdGVkIHdpdGggdGhlXG4vLyBnaXZlbiBwb3NpdGlvbiwgd2hldGhlciB0aGV5IGFyZSByZWxhdGVkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBvclxuLy8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIHBvc2l0aW9uLlxuZnVuY3Rpb24gZmluZFBvc2l0aW9uU2lkZSh2aWV3LCBwb3MsIHgsIHkpIHtcbiAgICBsZXQgbGluZSA9IExpbmVWaWV3LmZpbmQodmlldy5kb2NWaWV3LCBwb3MpO1xuICAgIGlmICghbGluZSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgbGV0IG9mZiA9IHBvcyAtIGxpbmUucG9zQXRTdGFydDtcbiAgICAvLyBMaW5lIGJvdW5kYXJpZXMgcG9pbnQgaW50byB0aGUgbGluZVxuICAgIGlmIChvZmYgPT0gMClcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgaWYgKG9mZiA9PSBsaW5lLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIC8vIFBvc2l0aW9ucyBvbiB0b3Agb2YgYW4gZWxlbWVudCBwb2ludCBhdCB0aGF0IGVsZW1lbnRcbiAgICBsZXQgYmVmb3JlID0gbGluZS5jb29yZHNBdChvZmYsIC0xKTtcbiAgICBpZiAoYmVmb3JlICYmIGluc2lkZSh4LCB5LCBiZWZvcmUpKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgbGV0IGFmdGVyID0gbGluZS5jb29yZHNBdChvZmYsIDEpO1xuICAgIGlmIChhZnRlciAmJiBpbnNpZGUoeCwgeSwgYWZ0ZXIpKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbGluZSB3cmFwIHBvaW50LiBQaWNrIGJlZm9yZSBpZiB0aGUgcG9pbnQgaXNcbiAgICAvLyBhYm92ZSBpdHMgYm90dG9tLlxuICAgIHJldHVybiBiZWZvcmUgJiYgYmVmb3JlLmJvdHRvbSA+PSB5ID8gLTEgOiAxO1xufVxuZnVuY3Rpb24gcXVlcnlQb3ModmlldywgZXZlbnQpIHtcbiAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIHJldHVybiB7IHBvcywgYmlhczogZmluZFBvc2l0aW9uU2lkZSh2aWV3LCBwb3MsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpIH07XG59XG5jb25zdCBCYWRNb3VzZURldGFpbCA9IGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExO1xubGV0IGxhc3RNb3VzZURvd24gPSBudWxsLCBsYXN0TW91c2VEb3duQ291bnQgPSAwLCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5mdW5jdGlvbiBnZXRDbGlja1R5cGUoZXZlbnQpIHtcbiAgICBpZiAoIUJhZE1vdXNlRGV0YWlsKVxuICAgICAgICByZXR1cm4gZXZlbnQuZGV0YWlsO1xuICAgIGxldCBsYXN0ID0gbGFzdE1vdXNlRG93biwgbGFzdFRpbWUgPSBsYXN0TW91c2VEb3duVGltZTtcbiAgICBsYXN0TW91c2VEb3duID0gZXZlbnQ7XG4gICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBsYXN0TW91c2VEb3duQ291bnQgPSAhbGFzdCB8fCAobGFzdFRpbWUgPiBEYXRlLm5vdygpIC0gNDAwICYmIE1hdGguYWJzKGxhc3QuY2xpZW50WCAtIGV2ZW50LmNsaWVudFgpIDwgMiAmJlxuICAgICAgICBNYXRoLmFicyhsYXN0LmNsaWVudFkgLSBldmVudC5jbGllbnRZKSA8IDIpID8gKGxhc3RNb3VzZURvd25Db3VudCArIDEpICUgMyA6IDE7XG59XG5mdW5jdGlvbiBiYXNpY01vdXNlU2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHN0YXJ0ID0gcXVlcnlQb3ModmlldywgZXZlbnQpLCB0eXBlID0gZ2V0Q2xpY2tUeXBlKGV2ZW50KTtcbiAgICBsZXQgc3RhcnRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBzdGFydC5wb3MgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3Moc3RhcnQucG9zKTtcbiAgICAgICAgICAgICAgICBzdGFydFNlbCA9IHN0YXJ0U2VsLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldChldmVudCwgZXh0ZW5kLCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSwgcmVtb3ZlZDtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlRm9yQ2xpY2sodmlldywgY3VyLnBvcywgY3VyLmJpYXMsIHR5cGUpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0LnBvcyAhPSBjdXIucG9zICYmICFleHRlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRSYW5nZSA9IHJhbmdlRm9yQ2xpY2sodmlldywgc3RhcnQucG9zLCBzdGFydC5iaWFzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWluKHN0YXJ0UmFuZ2UuZnJvbSwgcmFuZ2UuZnJvbSksIHRvID0gTWF0aC5tYXgoc3RhcnRSYW5nZS50bywgcmFuZ2UudG8pO1xuICAgICAgICAgICAgICAgIHJhbmdlID0gZnJvbSA8IHJhbmdlLmZyb20gPyBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pIDogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHRvLCBmcm9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHRlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U2VsLnJlcGxhY2VSYW5nZShzdGFydFNlbC5tYWluLmV4dGVuZChyYW5nZS5mcm9tLCByYW5nZS50bykpO1xuICAgICAgICAgICAgZWxzZSBpZiAobXVsdGlwbGUgJiYgdHlwZSA9PSAxICYmIHN0YXJ0U2VsLnJhbmdlcy5sZW5ndGggPiAxICYmIChyZW1vdmVkID0gcmVtb3ZlUmFuZ2VBcm91bmQoc3RhcnRTZWwsIGN1ci5wb3MpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG11bHRpcGxlKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoW3JhbmdlXSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gcmVtb3ZlUmFuZ2VBcm91bmQoc2VsLCBwb3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHNlbC5yYW5nZXNbaV07XG4gICAgICAgIGlmIChmcm9tIDw9IHBvcyAmJiB0byA+PSBwb3MpXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShzZWwucmFuZ2VzLnNsaWNlKDAsIGkpLmNvbmNhdChzZWwucmFuZ2VzLnNsaWNlKGkgKyAxKSksIHNlbC5tYWluSW5kZXggPT0gaSA/IDAgOiBzZWwubWFpbkluZGV4IC0gKHNlbC5tYWluSW5kZXggPiBpID8gMSA6IDApKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5oYW5kbGVycy5kcmFnc3RhcnQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBsZXQgeyBzZWxlY3Rpb246IHsgbWFpbjogcmFuZ2UgfSB9ID0gdmlldy5zdGF0ZTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmRyYWdnYWJsZSkge1xuICAgICAgICBsZXQgY1ZpZXcgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAoY1ZpZXcgJiYgY1ZpZXcuaXNXaWRnZXQpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gY1ZpZXcucG9zQXRTdGFydCwgdG8gPSBmcm9tICsgY1ZpZXcubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGZyb20gPj0gcmFuZ2UudG8gfHwgdG8gPD0gcmFuZ2UuZnJvbSlcbiAgICAgICAgICAgICAgICByYW5nZSA9IEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHsgaW5wdXRTdGF0ZSB9ID0gdmlldztcbiAgICBpZiAoaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbi5kcmFnZ2luZyA9IHRydWU7XG4gICAgaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IHJhbmdlO1xuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJUZXh0XCIsIHRleHRGaWx0ZXIodmlldy5zdGF0ZSwgY2xpcGJvYXJkT3V0cHV0RmlsdGVyLCB2aWV3LnN0YXRlLnNsaWNlRG9jKHJhbmdlLmZyb20sIHJhbmdlLnRvKSkpO1xuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwiY29weU1vdmVcIjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmhhbmRsZXJzLmRyYWdlbmQgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUuZHJhZ2dlZENvbnRlbnQgPSBudWxsO1xuICAgIHJldHVybiBmYWxzZTtcbn07XG5mdW5jdGlvbiBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dCwgZGlyZWN0KSB7XG4gICAgdGV4dCA9IHRleHRGaWx0ZXIodmlldy5zdGF0ZSwgY2xpcGJvYXJkSW5wdXRGaWx0ZXIsIHRleHQpO1xuICAgIGlmICghdGV4dClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBkcm9wUG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIGxldCB7IGRyYWdnZWRDb250ZW50IH0gPSB2aWV3LmlucHV0U3RhdGU7XG4gICAgbGV0IGRlbCA9IGRpcmVjdCAmJiBkcmFnZ2VkQ29udGVudCAmJiBkcmFnTW92ZXNTZWxlY3Rpb24odmlldywgZXZlbnQpXG4gICAgICAgID8geyBmcm9tOiBkcmFnZ2VkQ29udGVudC5mcm9tLCB0bzogZHJhZ2dlZENvbnRlbnQudG8gfSA6IG51bGw7XG4gICAgbGV0IGlucyA9IHsgZnJvbTogZHJvcFBvcywgaW5zZXJ0OiB0ZXh0IH07XG4gICAgbGV0IGNoYW5nZXMgPSB2aWV3LnN0YXRlLmNoYW5nZXMoZGVsID8gW2RlbCwgaW5zXSA6IGlucyk7XG4gICAgdmlldy5mb2N1cygpO1xuICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICBjaGFuZ2VzLFxuICAgICAgICBzZWxlY3Rpb246IHsgYW5jaG9yOiBjaGFuZ2VzLm1hcFBvcyhkcm9wUG9zLCAtMSksIGhlYWQ6IGNoYW5nZXMubWFwUG9zKGRyb3BQb3MsIDEpIH0sXG4gICAgICAgIHVzZXJFdmVudDogZGVsID8gXCJtb3ZlLmRyb3BcIiA6IFwiaW5wdXQuZHJvcFwiXG4gICAgfSk7XG4gICAgdmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbn1cbmhhbmRsZXJzLmRyb3AgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkgeyAvLyBGb3IgYSBmaWxlIGRyb3AsIHJlYWQgdGhlIGZpbGUncyB0ZXh0LlxuICAgICAgICBsZXQgdGV4dCA9IEFycmF5KGZpbGVzLmxlbmd0aCksIHJlYWQgPSAwO1xuICAgICAgICBsZXQgZmluaXNoRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICgrK3JlYWQgPT0gZmlsZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LmZpbHRlcihzID0+IHMgIT0gbnVsbCkuam9pbih2aWV3LnN0YXRlLmxpbmVCcmVhayksIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyO1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmaW5pc2hGaWxlO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIS9bXFx4MDAtXFx4MDhcXHgwZS1cXHgxZl17Mn0vLnRlc3QocmVhZGVyLnJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRleHRbaV0gPSByZWFkZXIucmVzdWx0O1xuICAgICAgICAgICAgICAgIGZpbmlzaEZpbGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgdGV4dCA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5oYW5kbGVycy5wYXN0ZSA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB2aWV3Lm9ic2VydmVyLmZsdXNoKCk7XG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBkb1Bhc3RlKHZpZXcsIGRhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgZGF0YS5nZXREYXRhKFwidGV4dC91cmktbGlzdFwiKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdHVyZVBhc3RlKHZpZXcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNhcHR1cmVDb3B5KHZpZXcsIHRleHQpIHtcbiAgICAvLyBUaGUgZXh0cmEgd3JhcHBlciBpcyBzb21laG93IG5lY2Vzc2FyeSBvbiBJRS9FZGdlIHRvIHByZXZlbnQgdGhlXG4gICAgLy8gY29udGVudCBmcm9tIGJlaW5nIG1hbmdsZWQgd2hlbiBpdCBpcyBwdXQgb250byB0aGUgY2xpcGJvYXJkXG4gICAgbGV0IHBhcmVudCA9IHZpZXcuZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gcGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSk7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC52YWx1ZSA9IHRleHQ7XG4gICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgdGFyZ2V0LnNlbGVjdGlvbkVuZCA9IHRleHQubGVuZ3RoO1xuICAgIHRhcmdldC5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRhcmdldC5yZW1vdmUoKTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGNvcGllZFJhbmdlKHN0YXRlKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBbXSwgcmFuZ2VzID0gW10sIGxpbmV3aXNlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcylcbiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSkge1xuICAgICAgICAgICAgY29udGVudC5wdXNoKHN0YXRlLnNsaWNlRG9jKHJhbmdlLmZyb20sIHJhbmdlLnRvKSk7XG4gICAgICAgICAgICByYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICAgIH1cbiAgICBpZiAoIWNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgc2VsZWN0ZWQsIGRvIGEgbGluZS13aXNlIGNvcHlcbiAgICAgICAgbGV0IHVwdG8gPSAtMTtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tIH0gb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KGZyb20pO1xuICAgICAgICAgICAgaWYgKGxpbmUubnVtYmVyID4gdXB0bykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChsaW5lLnRleHQpO1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogTWF0aC5taW4oc3RhdGUuZG9jLmxlbmd0aCwgbGluZS50byArIDEpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXB0byA9IGxpbmUubnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGxpbmV3aXNlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdGV4dDogdGV4dEZpbHRlcihzdGF0ZSwgY2xpcGJvYXJkT3V0cHV0RmlsdGVyLCBjb250ZW50LmpvaW4oc3RhdGUubGluZUJyZWFrKSksIHJhbmdlcywgbGluZXdpc2UgfTtcbn1cbmxldCBsYXN0TGluZXdpc2VDb3B5ID0gbnVsbDtcbmhhbmRsZXJzLmNvcHkgPSBoYW5kbGVycy5jdXQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBsZXQgeyB0ZXh0LCByYW5nZXMsIGxpbmV3aXNlIH0gPSBjb3BpZWRSYW5nZSh2aWV3LnN0YXRlKTtcbiAgICBpZiAoIXRleHQgJiYgIWxpbmV3aXNlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGFzdExpbmV3aXNlQ29weSA9IGxpbmV3aXNlID8gdGV4dCA6IG51bGw7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT0gXCJjdXRcIiAmJiAhdmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiByYW5nZXMsXG4gICAgICAgICAgICBzY3JvbGxJbnRvVmlldzogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXJFdmVudDogXCJkZWxldGUuY3V0XCJcbiAgICAgICAgfSk7XG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNhcHR1cmVDb3B5KHZpZXcsIHRleHQpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmNvbnN0IGlzRm9jdXNDaGFuZ2UgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbmZ1bmN0aW9uIGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24oc3RhdGUsIGZvY3VzKSB7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBnZXRFZmZlY3Qgb2Ygc3RhdGUuZmFjZXQoZm9jdXNDaGFuZ2VFZmZlY3QpKSB7XG4gICAgICAgIGxldCBlZmZlY3QgPSBnZXRFZmZlY3Qoc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgaWYgKGVmZmVjdClcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpO1xuICAgIH1cbiAgICByZXR1cm4gZWZmZWN0cy5sZW5ndGggPyBzdGF0ZS51cGRhdGUoeyBlZmZlY3RzLCBhbm5vdGF0aW9uczogaXNGb2N1c0NoYW5nZS5vZih0cnVlKSB9KSA6IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGb3JGb2N1c0NoYW5nZSh2aWV3KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxldCBmb2N1cyA9IHZpZXcuaGFzRm9jdXM7XG4gICAgICAgIGlmIChmb2N1cyAhPSB2aWV3LmlucHV0U3RhdGUubm90aWZpZWRGb2N1c2VkKSB7XG4gICAgICAgICAgICBsZXQgdHIgPSBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHZpZXcuc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgICAgIGlmICh0cilcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIH1cbiAgICB9LCAxMCk7XG59XG5vYnNlcnZlcnMuZm9jdXMgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA9IERhdGUubm93KCk7XG4gICAgLy8gV2hlbiBmb2N1c2luZyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCBtb3ZlIGl0IGJhY2sgdG8gd2hlcmUgaXQgd2FzXG4gICAgaWYgKCF2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgJiYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsVG9wIHx8IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsTGVmdCkpIHtcbiAgICAgICAgdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3A7XG4gICAgICAgIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgPSB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHVwZGF0ZUZvckZvY3VzQ2hhbmdlKHZpZXcpO1xufTtcbm9ic2VydmVycy5ibHVyID0gdmlldyA9PiB7XG4gICAgdmlldy5vYnNlcnZlci5jbGVhclNlbGVjdGlvblJhbmdlKCk7XG4gICAgdXBkYXRlRm9yRm9jdXNDaGFuZ2Uodmlldyk7XG59O1xub2JzZXJ2ZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSBvYnNlcnZlcnMuY29tcG9zaXRpb251cGRhdGUgPSB2aWV3ID0+IHtcbiAgICBpZiAodmlldy5vYnNlcnZlci5lZGl0Q29udGV4dClcbiAgICAgICAgcmV0dXJuOyAvLyBDb21wb3NpdGlvbiBoYW5kbGVkIGJ5IGVkaXQgY29udGV4dFxuICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9PSBudWxsKVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IHRydWU7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwKSB7XG4gICAgICAgIC8vIEZJWE1FIHBvc3NpYmx5IHNldCBhIHRpbWVvdXQgdG8gY2xlYXIgaXQgYWdhaW4gb24gQW5kcm9pZFxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gMDtcbiAgICB9XG59O1xub2JzZXJ2ZXJzLmNvbXBvc2l0aW9uZW5kID0gdmlldyA9PiB7XG4gICAgaWYgKHZpZXcub2JzZXJ2ZXIuZWRpdENvbnRleHQpXG4gICAgICAgIHJldHVybjsgLy8gQ29tcG9zaXRpb24gaGFuZGxlZCBieSBlZGl0IGNvbnRleHRcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gLTE7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRW5kZWRBdCA9IERhdGUubm93KCk7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0tleSA9IHRydWU7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSA9IHZpZXcub2JzZXJ2ZXIucGVuZGluZ1JlY29yZHMoKS5sZW5ndGggPiAwO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkZpcnN0Q2hhbmdlID0gbnVsbDtcbiAgICBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgYnJvd3Nlci5hbmRyb2lkKSB7XG4gICAgICAgIC8vIERlbGF5IGZsdXNoaW5nIGZvciBhIGJpdCBvbiBBbmRyb2lkIGJlY2F1c2UgaXQnbGwgb2Z0ZW4gZmlyZSBhXG4gICAgICAgIC8vIGJ1bmNoIG9mIGNvbnRyYWRpY3RvcnkgY2hhbmdlcyBpbiBhIHJvdyBhdCBlbmQgb2YgY29tcG9zaXRvblxuICAgICAgICB2aWV3Lm9ic2VydmVyLmZsdXNoU29vbigpO1xuICAgIH1cbiAgICBlbHNlIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlKSB7XG4gICAgICAgIC8vIElmIHdlIGZvdW5kIHBlbmRpbmcgcmVjb3Jkcywgc2NoZWR1bGUgYSBmbHVzaC5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB2aWV3Lm9ic2VydmVyLmZsdXNoKCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHN1cmUgdGhhdCwgaWYgbm8gY2hhbmdlcyBjb21lIGluIHNvb24sIHRoZVxuICAgICAgICAvLyBjb21wb3NpdGlvbiB2aWV3IGlzIGNsZWFyZWQuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwICYmIHZpZXcuZG9jVmlldy5oYXNDb21wb3NpdGlvbilcbiAgICAgICAgICAgICAgICB2aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIH0sIDUwKTtcbiAgICB9XG59O1xub2JzZXJ2ZXJzLmNvbnRleHRtZW51ID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RDb250ZXh0TWVudSA9IERhdGUubm93KCk7XG59O1xuaGFuZGxlcnMuYmVmb3JlaW5wdXQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIC8vIEluIEVkaXRDb250ZXh0IG1vZGUsIHdlIG11c3QgaGFuZGxlIGluc2VydFJlcGxhY2VtZW50VGV4dCBldmVudHNcbiAgICAvLyBkaXJlY3RseSwgdG8gbWFrZSBzcGVsbCBjaGVja2luZyBjb3JyZWN0aW9ucyB3b3JrXG4gICAgaWYgKGV2ZW50LmlucHV0VHlwZSA9PSBcImluc2VydFJlcGxhY2VtZW50VGV4dFwiICYmIHZpZXcub2JzZXJ2ZXIuZWRpdENvbnRleHQpIHtcbiAgICAgICAgbGV0IHRleHQgPSAoX2EgPSBldmVudC5kYXRhVHJhbnNmZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXREYXRhKFwidGV4dC9wbGFpblwiKSwgcmFuZ2VzID0gZXZlbnQuZ2V0VGFyZ2V0UmFuZ2VzKCk7XG4gICAgICAgIGlmICh0ZXh0ICYmIHJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByID0gcmFuZ2VzWzBdO1xuICAgICAgICAgICAgbGV0IGZyb20gPSB2aWV3LnBvc0F0RE9NKHIuc3RhcnRDb250YWluZXIsIHIuc3RhcnRPZmZzZXQpLCB0byA9IHZpZXcucG9zQXRET00oci5lbmRDb250YWluZXIsIHIuZW5kT2Zmc2V0KTtcbiAgICAgICAgICAgIGFwcGx5RE9NQ2hhbmdlSW5uZXIodmlldywgeyBmcm9tLCB0bywgaW5zZXJ0OiB2aWV3LnN0YXRlLnRvVGV4dCh0ZXh0KSB9LCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgQ2hyb21lIEFuZHJvaWQgZG9lc24ndCBmaXJlIHVzZWZ1bCBrZXkgZXZlbnRzLCB1c2VcbiAgICAvLyBiZWZvcmVpbnB1dCB0byBkZXRlY3QgYmFja3NwYWNlIChhbmQgcG9zc2libHkgZW50ZXIgYW5kIGRlbGV0ZSxcbiAgICAvLyBidXQgdGhvc2UgdXN1YWxseSBkb24ndCBldmVuIHNlZW0gdG8gZmlyZSBiZWZvcmVpbnB1dCBldmVudHMgYXRcbiAgICAvLyB0aGUgbW9tZW50KSBhbmQgZmFrZSBhIGtleSBldmVudCBmb3IgaXQuXG4gICAgLy9cbiAgICAvLyAocHJldmVudERlZmF1bHQgb24gYmVmb3JlaW5wdXQsIHRob3VnaCBzdXBwb3J0ZWQgaW4gdGhlIHNwZWMsXG4gICAgLy8gc2VlbXMgdG8gZG8gbm90aGluZyBhdCBhbGwgb24gQ2hyb21lKS5cbiAgICBsZXQgcGVuZGluZztcbiAgICBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgYnJvd3Nlci5hbmRyb2lkICYmIChwZW5kaW5nID0gUGVuZGluZ0tleXMuZmluZChrZXkgPT4ga2V5LmlucHV0VHlwZSA9PSBldmVudC5pbnB1dFR5cGUpKSkge1xuICAgICAgICB2aWV3Lm9ic2VydmVyLmRlbGF5QW5kcm9pZEtleShwZW5kaW5nLmtleSwgcGVuZGluZy5rZXlDb2RlKTtcbiAgICAgICAgaWYgKHBlbmRpbmcua2V5ID09IFwiQmFja3NwYWNlXCIgfHwgcGVuZGluZy5rZXkgPT0gXCJEZWxldGVcIikge1xuICAgICAgICAgICAgbGV0IHN0YXJ0Vmlld0hlaWdodCA9ICgoX2IgPSB3aW5kb3cudmlzdWFsVmlld3BvcnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5oZWlnaHQpIHx8IDA7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgLy8gQmFja3NwYWNpbmcgbmVhciB1bmVkaXRhYmxlIG5vZGVzIG9uIENocm9tZSBBbmRyb2lkIHNvbWV0aW1lc1xuICAgICAgICAgICAgICAgIC8vIGNsb3NlcyB0aGUgdmlydHVhbCBrZXlib2FyZC4gVGhpcyB0cmllcyB0byBjcnVkZWx5IGRldGVjdFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgYW5kIHJlZm9jdXMgdG8gZ2V0IGl0IGJhY2suXG4gICAgICAgICAgICAgICAgaWYgKCgoKF9hID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGVpZ2h0KSB8fCAwKSA+IHN0YXJ0Vmlld0hlaWdodCArIDEwICYmIHZpZXcuaGFzRm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5jb250ZW50RE9NLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJyb3dzZXIuaW9zICYmIGV2ZW50LmlucHV0VHlwZSA9PSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCIpIHtcbiAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uLCBET00gY2hhbmdlcyAoYW5kIGJlZm9yZWlucHV0KSBoYXBwZW4gX2JlZm9yZV9cbiAgICAgICAgLy8gdGhlIGtleSBldmVudCBmb3IgY3RybC1kIG9uIGlPUyB3aGVuIHVzaW5nIGFuIGV4dGVybmFsXG4gICAgICAgIC8vIGtleWJvYXJkLlxuICAgICAgICB2aWV3Lm9ic2VydmVyLmZsdXNoU29vbigpO1xuICAgIH1cbiAgICAvLyBTYWZhcmkgd2lsbCBvY2Nhc2lvbmFsbHkgZm9yZ2V0IHRvIGZpcmUgY29tcG9zaXRpb25lbmQgYXQgdGhlIGVuZCBvZiBhIGRlYWQta2V5IGNvbXBvc2l0aW9uXG4gICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmIGV2ZW50LmlucHV0VHlwZSA9PSBcImluc2VydFRleHRcIiAmJiB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBvYnNlcnZlcnMuY29tcG9zaXRpb25lbmQodmlldywgZXZlbnQpLCAyMCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5jb25zdCBhcHBsaWVkRmlyZWZveEhhY2sgPSAvKkBfX1BVUkVfXyovbmV3IFNldDtcbi8vIEluIEZpcmVmb3gsIHdoZW4gY3V0L2NvcHkgaGFuZGxlcnMgYXJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCwgdGhhdFxuLy8gc29tZWhvdyBhdm9pZHMgYSBidWcgd2hlcmUgdGhvc2UgZXZlbnRzIGFyZW4ndCBmaXJlZCB3aGVuIHRoZVxuLy8gc2VsZWN0aW9uIGlzIGVtcHR5LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy8xMDgyXG4vLyBhbmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTk1OTYxXG5mdW5jdGlvbiBmaXJlZm94Q29weUN1dEhhY2soZG9jKSB7XG4gICAgaWYgKCFhcHBsaWVkRmlyZWZveEhhY2suaGFzKGRvYykpIHtcbiAgICAgICAgYXBwbGllZEZpcmVmb3hIYWNrLmFkZChkb2MpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgKCkgPT4geyB9KTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgKCkgPT4geyB9KTtcbiAgICB9XG59XG5cbmNvbnN0IHdyYXBwaW5nV2hpdGVTcGFjZSA9IFtcInByZS13cmFwXCIsIFwibm9ybWFsXCIsIFwicHJlLWxpbmVcIiwgXCJicmVhay1zcGFjZXNcIl07XG4vLyBVc2VkIHRvIHRyYWNrLCBkdXJpbmcgdXBkYXRlSGVpZ2h0LCBpZiBhbnkgYWN0dWFsIGhlaWdodHMgY2hhbmdlZFxubGV0IGhlaWdodENoYW5nZUZsYWcgPSBmYWxzZTtcbmZ1bmN0aW9uIGNsZWFySGVpZ2h0Q2hhbmdlRmxhZygpIHsgaGVpZ2h0Q2hhbmdlRmxhZyA9IGZhbHNlOyB9XG5jbGFzcyBIZWlnaHRPcmFjbGUge1xuICAgIGNvbnN0cnVjdG9yKGxpbmVXcmFwcGluZykge1xuICAgICAgICB0aGlzLmxpbmVXcmFwcGluZyA9IGxpbmVXcmFwcGluZztcbiAgICAgICAgdGhpcy5kb2MgPSBUZXh0LmVtcHR5O1xuICAgICAgICB0aGlzLmhlaWdodFNhbXBsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gMTQ7IC8vIFRoZSBoZWlnaHQgb2YgYW4gZW50aXJlIGxpbmUgKGxpbmUtaGVpZ2h0KVxuICAgICAgICB0aGlzLmNoYXJXaWR0aCA9IDc7XG4gICAgICAgIHRoaXMudGV4dEhlaWdodCA9IDE0OyAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBhY3R1YWwgZm9udCAoZm9udC1zaXplKVxuICAgICAgICB0aGlzLmxpbmVMZW5ndGggPSAzMDtcbiAgICB9XG4gICAgaGVpZ2h0Rm9yR2FwKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMuZG9jLmxpbmVBdCh0bykubnVtYmVyIC0gdGhpcy5kb2MubGluZUF0KGZyb20pLm51bWJlciArIDE7XG4gICAgICAgIGlmICh0aGlzLmxpbmVXcmFwcGluZylcbiAgICAgICAgICAgIGxpbmVzICs9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoKHRvIC0gZnJvbSkgLSAobGluZXMgKiB0aGlzLmxpbmVMZW5ndGggKiAwLjUpKSAvIHRoaXMubGluZUxlbmd0aCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSGVpZ2h0ICogbGluZXM7XG4gICAgfVxuICAgIGhlaWdodEZvckxpbmUobGVuZ3RoKSB7XG4gICAgICAgIGlmICghdGhpcy5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saW5lSGVpZ2h0O1xuICAgICAgICBsZXQgbGluZXMgPSAxICsgTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZW5ndGggLSB0aGlzLmxpbmVMZW5ndGgpIC8gKHRoaXMubGluZUxlbmd0aCAtIDUpKSk7XG4gICAgICAgIHJldHVybiBsaW5lcyAqIHRoaXMubGluZUhlaWdodDtcbiAgICB9XG4gICAgc2V0RG9jKGRvYykgeyB0aGlzLmRvYyA9IGRvYzsgcmV0dXJuIHRoaXM7IH1cbiAgICBtdXN0UmVmcmVzaEZvcldyYXBwaW5nKHdoaXRlU3BhY2UpIHtcbiAgICAgICAgcmV0dXJuICh3cmFwcGluZ1doaXRlU3BhY2UuaW5kZXhPZih3aGl0ZVNwYWNlKSA+IC0xKSAhPSB0aGlzLmxpbmVXcmFwcGluZztcbiAgICB9XG4gICAgbXVzdFJlZnJlc2hGb3JIZWlnaHRzKGxpbmVIZWlnaHRzKSB7XG4gICAgICAgIGxldCBuZXdIZWlnaHQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGggPSBsaW5lSGVpZ2h0c1tpXTtcbiAgICAgICAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmhlaWdodFNhbXBsZXNbTWF0aC5mbG9vcihoICogMTApXSkgeyAvLyBSb3VuZCB0byAuMSBwaXhlbHNcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlc1tNYXRoLmZsb29yKGggKiAxMCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SGVpZ2h0O1xuICAgIH1cbiAgICByZWZyZXNoKHdoaXRlU3BhY2UsIGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCwgbGluZUxlbmd0aCwga25vd25IZWlnaHRzKSB7XG4gICAgICAgIGxldCBsaW5lV3JhcHBpbmcgPSB3cmFwcGluZ1doaXRlU3BhY2UuaW5kZXhPZih3aGl0ZVNwYWNlKSA+IC0xO1xuICAgICAgICBsZXQgY2hhbmdlZCA9IE1hdGgucm91bmQobGluZUhlaWdodCkgIT0gTWF0aC5yb3VuZCh0aGlzLmxpbmVIZWlnaHQpIHx8IHRoaXMubGluZVdyYXBwaW5nICE9IGxpbmVXcmFwcGluZztcbiAgICAgICAgdGhpcy5saW5lV3JhcHBpbmcgPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IGxpbmVIZWlnaHQ7XG4gICAgICAgIHRoaXMuY2hhcldpZHRoID0gY2hhcldpZHRoO1xuICAgICAgICB0aGlzLnRleHRIZWlnaHQgPSB0ZXh0SGVpZ2h0O1xuICAgICAgICB0aGlzLmxpbmVMZW5ndGggPSBsaW5lTGVuZ3RoO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtub3duSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBoID0ga25vd25IZWlnaHRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChoIDwgMClcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzW01hdGguZmxvb3IoaCAqIDEwKV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbn1cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYnkgYHVwZGF0ZUhlaWdodGAgdG8gbWFrZSBET00gbWVhc3VyZW1lbnRzXG4vLyBhcnJpdmUgYXQgdGhlIHJpZ2h0IG5pZGVzLiBUaGUgYGhlaWdodHNgIGFycmF5IGlzIGEgc2VxdWVuY2Ugb2Zcbi8vIGJsb2NrIGhlaWdodHMsIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gYGZyb21gLlxuY2xhc3MgTWVhc3VyZWRIZWlnaHRzIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCBoZWlnaHRzKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuaGVpZ2h0cyA9IGhlaWdodHM7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBnZXQgbW9yZSgpIHsgcmV0dXJuIHRoaXMuaW5kZXggPCB0aGlzLmhlaWdodHMubGVuZ3RoOyB9XG59XG4vKipcblJlY29yZCB1c2VkIHRvIHJlcHJlc2VudCBpbmZvcm1hdGlvbiBhYm91dCBhIGJsb2NrLWxldmVsIGVsZW1lbnRcbmluIHRoZSBlZGl0b3Igdmlldy5cbiovXG5jbGFzcyBCbG9ja0luZm8ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGVsZW1lbnQuXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnQpLlxuICAgICovXG4gICAgdG9wLCBcbiAgICAvKipcbiAgICBJdHMgaGVpZ2h0LlxuICAgICovXG4gICAgaGVpZ2h0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWwgV2VpcmQgcGFja2VkIGZpZWxkIHRoYXQgaG9sZHMgYW4gYXJyYXkgb2YgY2hpbGRyZW5cbiAgICBmb3IgY29tcG9zaXRlIGJsb2NrcywgYSBkZWNvcmF0aW9uIGZvciBibG9jayB3aWRnZXRzLCBhbmQgYVxuICAgIG51bWJlciBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2Ygd2lkZ2V0LWNyZWF0ZSBsaW5lIGJyZWFrcyBmb3JcbiAgICB0ZXh0IGJsb2Nrcy5cbiAgICAqL1xuICAgIF9jb250ZW50KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBfY29udGVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2YgZWxlbWVudCB0aGlzIGlzLiBXaGVuIHF1ZXJ5aW5nIGxpbmVzLCB0aGlzIG1heSBiZVxuICAgIGFuIGFycmF5IG9mIGFsbCB0aGUgYmxvY2tzIHRoYXQgbWFrZSB1cCB0aGUgbGluZS5cbiAgICAqL1xuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2NvbnRlbnQgPT0gXCJudW1iZXJcIiA/IEJsb2NrVHlwZS5UZXh0IDpcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fY29udGVudCkgPyB0aGlzLl9jb250ZW50IDogdGhpcy5fY29udGVudC50eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBlbGVtZW50IGFzIGEgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLmZyb20gKyB0aGlzLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIFRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQuXG4gICAgKi9cbiAgICBnZXQgYm90dG9tKCkgeyByZXR1cm4gdGhpcy50b3AgKyB0aGlzLmhlaWdodDsgfVxuICAgIC8qKlxuICAgIElmIHRoaXMgaXMgYSB3aWRnZXQgYmxvY2ssIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdpZGdldFxuICAgIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICAqL1xuICAgIGdldCB3aWRnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50IGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uID8gdGhpcy5fY29udGVudC53aWRnZXQgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgdGV4dGJsb2NrLCB0aGlzIGhvbGRzIHRoZSBudW1iZXIgb2YgbGluZSBicmVha3NcbiAgICB0aGF0IGFwcGVhciBpbiB3aWRnZXRzIGluc2lkZSB0aGUgYmxvY2suXG4gICAgKi9cbiAgICBnZXQgd2lkZ2V0TGluZUJyZWFrcygpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb250ZW50ID09IFwibnVtYmVyXCIgPyB0aGlzLl9jb250ZW50IDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBqb2luKG90aGVyKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gKEFycmF5LmlzQXJyYXkodGhpcy5fY29udGVudCkgPyB0aGlzLl9jb250ZW50IDogW3RoaXNdKVxuICAgICAgICAgICAgLmNvbmNhdChBcnJheS5pc0FycmF5KG90aGVyLl9jb250ZW50KSA/IG90aGVyLl9jb250ZW50IDogW290aGVyXSk7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKHRoaXMuZnJvbSwgdGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGgsIHRoaXMudG9wLCB0aGlzLmhlaWdodCArIG90aGVyLmhlaWdodCwgY29udGVudCk7XG4gICAgfVxufVxudmFyIFF1ZXJ5VHlwZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFF1ZXJ5VHlwZSkge1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeVBvc1wiXSA9IDBdID0gXCJCeVBvc1wiO1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeUhlaWdodFwiXSA9IDFdID0gXCJCeUhlaWdodFwiO1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeVBvc05vSGVpZ2h0XCJdID0gMl0gPSBcIkJ5UG9zTm9IZWlnaHRcIjtcbnJldHVybiBRdWVyeVR5cGV9KShRdWVyeVR5cGUgfHwgKFF1ZXJ5VHlwZSA9IHt9KSk7XG5jb25zdCBFcHNpbG9uID0gMWUtMztcbmNsYXNzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCAvLyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY292ZXJlZFxuICAgIGhlaWdodCwgLy8gSGVpZ2h0IG9mIHRoaXMgcGFydCBvZiB0aGUgZG9jdW1lbnRcbiAgICBmbGFncyA9IDIgLyogRmxhZy5PdXRkYXRlZCAqLykge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB9XG4gICAgZ2V0IG91dGRhdGVkKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pID4gMDsgfVxuICAgIHNldCBvdXRkYXRlZCh2YWx1ZSkgeyB0aGlzLmZsYWdzID0gKHZhbHVlID8gMiAvKiBGbGFnLk91dGRhdGVkICovIDogMCkgfCAodGhpcy5mbGFncyAmIH4yIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pOyB9XG4gICAgc2V0SGVpZ2h0KGhlaWdodCkge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5oZWlnaHQgLSBoZWlnaHQpID4gRXBzaWxvbilcbiAgICAgICAgICAgICAgICBoZWlnaHRDaGFuZ2VGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJhc2UgY2FzZSBpcyB0byByZXBsYWNlIGEgbGVhZiBub2RlLCB3aGljaCBzaW1wbHkgYnVpbGRzIGEgdHJlZVxuICAgIC8vIGZyb20gdGhlIG5ldyBub2RlcyBhbmQgcmV0dXJucyB0aGF0IChIZWlnaHRNYXBCcmFuY2ggYW5kXG4gICAgLy8gSGVpZ2h0TWFwR2FwIG92ZXJyaWRlIHRoaXMgdG8gYWN0dWFsbHkgdXNlIGZyb20vdG8pXG4gICAgcmVwbGFjZShfZnJvbSwgX3RvLCBub2Rlcykge1xuICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICB9XG4gICAgLy8gQWdhaW4sIHRoZXNlIGFyZSBiYXNlIGNhc2VzLCBhbmQgYXJlIG92ZXJyaWRkZW4gZm9yIGJyYW5jaCBhbmQgZ2FwIG5vZGVzLlxuICAgIGRlY29tcG9zZUxlZnQoX3RvLCByZXN1bHQpIHsgcmVzdWx0LnB1c2godGhpcyk7IH1cbiAgICBkZWNvbXBvc2VSaWdodChfZnJvbSwgcmVzdWx0KSB7IHJlc3VsdC5wdXNoKHRoaXMpOyB9XG4gICAgYXBwbHlDaGFuZ2VzKGRlY29yYXRpb25zLCBvbGREb2MsIG9yYWNsZSwgY2hhbmdlcykge1xuICAgICAgICBsZXQgbWUgPSB0aGlzLCBkb2MgPSBvcmFjbGUuZG9jO1xuICAgICAgICBmb3IgKGxldCBpID0gY2hhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHsgZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiB9ID0gY2hhbmdlc1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG1lLmxpbmVBdChmcm9tQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZS5zZXREb2Mob2xkRG9jKSwgMCwgMCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gc3RhcnQudG8gPj0gdG9BID8gc3RhcnQgOiBtZS5saW5lQXQodG9BLCBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCwgb3JhY2xlLCAwLCAwKTtcbiAgICAgICAgICAgIHRvQiArPSBlbmQudG8gLSB0b0E7XG4gICAgICAgICAgICB0b0EgPSBlbmQudG87XG4gICAgICAgICAgICB3aGlsZSAoaSA+IDAgJiYgc3RhcnQuZnJvbSA8PSBjaGFuZ2VzW2kgLSAxXS50b0EpIHtcbiAgICAgICAgICAgICAgICBmcm9tQSA9IGNoYW5nZXNbaSAtIDFdLmZyb21BO1xuICAgICAgICAgICAgICAgIGZyb21CID0gY2hhbmdlc1tpIC0gMV0uZnJvbUI7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQSA8IHN0YXJ0LmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWUubGluZUF0KGZyb21BLCBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCwgb3JhY2xlLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21CICs9IHN0YXJ0LmZyb20gLSBmcm9tQTtcbiAgICAgICAgICAgIGZyb21BID0gc3RhcnQuZnJvbTtcbiAgICAgICAgICAgIGxldCBub2RlcyA9IE5vZGVCdWlsZGVyLmJ1aWxkKG9yYWNsZS5zZXREb2MoZG9jKSwgZGVjb3JhdGlvbnMsIGZyb21CLCB0b0IpO1xuICAgICAgICAgICAgbWUgPSByZXBsYWNlKG1lLCBtZS5yZXBsYWNlKGZyb21BLCB0b0EsIG5vZGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lLnVwZGF0ZUhlaWdodChvcmFjbGUsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHkoKSB7IHJldHVybiBuZXcgSGVpZ2h0TWFwVGV4dCgwLCAwKTsgfVxuICAgIC8vIG5vZGVzIHVzZXMgbnVsbCB2YWx1ZXMgdG8gaW5kaWNhdGUgdGhlIHBvc2l0aW9uIG9mIGxpbmUgYnJlYWtzLlxuICAgIC8vIFRoZXJlIGFyZSBuZXZlciBsaW5lIGJyZWFrcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBhcnJheSwgb3JcbiAgICAvLyB0d28gbGluZSBicmVha3MgbmV4dCB0byBlYWNoIG90aGVyLCBhbmQgdGhlIGFycmF5IGlzbid0IGFsbG93ZWRcbiAgICAvLyB0byBiZSBlbXB0eSAoc2FtZSByZXN0cmljdGlvbnMgYXMgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGJ1aWxkZXIpLlxuICAgIHN0YXRpYyBvZihub2Rlcykge1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDEpXG4gICAgICAgICAgICByZXR1cm4gbm9kZXNbMF07XG4gICAgICAgIGxldCBpID0gMCwgaiA9IG5vZGVzLmxlbmd0aCwgYmVmb3JlID0gMCwgYWZ0ZXIgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSA+IGFmdGVyICogMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXQgPSBub2Rlc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5icmVhaylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZSgtLWksIDEsIHNwbGl0LmxlZnQsIG51bGwsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKC0taSwgMSwgc3BsaXQubGVmdCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBqICs9IDEgKyBzcGxpdC5icmVhaztcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIC09IHNwbGl0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyID4gYmVmb3JlICogMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXQgPSBub2Rlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0LmJyZWFrKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEsIHNwbGl0LmxlZnQsIG51bGwsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEsIHNwbGl0LmxlZnQsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgaiArPSAyICsgc3BsaXQuYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyIC09IHNwbGl0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZWZvcmUgPCBhZnRlcikge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZXNbaSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dClcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlICs9IG5leHQuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZXNbLS1qXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dClcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgKz0gbmV4dC5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBicmsgPSAwO1xuICAgICAgICBpZiAobm9kZXNbaSAtIDFdID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyayA9IDE7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgYnJrID0gMTtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhlaWdodE1hcEJyYW5jaChIZWlnaHRNYXAub2Yobm9kZXMuc2xpY2UoMCwgaSkpLCBicmssIEhlaWdodE1hcC5vZihub2Rlcy5zbGljZShqKSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlcGxhY2Uob2xkLCB2YWwpIHtcbiAgICBpZiAob2xkID09IHZhbClcbiAgICAgICAgcmV0dXJuIG9sZDtcbiAgICBpZiAob2xkLmNvbnN0cnVjdG9yICE9IHZhbC5jb25zdHJ1Y3RvcilcbiAgICAgICAgaGVpZ2h0Q2hhbmdlRmxhZyA9IHRydWU7XG4gICAgcmV0dXJuIHZhbDtcbn1cbkhlaWdodE1hcC5wcm90b3R5cGUuc2l6ZSA9IDE7XG5jbGFzcyBIZWlnaHRNYXBCbG9jayBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBoZWlnaHQsIGRlY28pIHtcbiAgICAgICAgc3VwZXIobGVuZ3RoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmRlY28gPSBkZWNvO1xuICAgIH1cbiAgICBibG9ja0F0KF9oZWlnaHQsIF9vcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKG9mZnNldCwgdGhpcy5sZW5ndGgsIHRvcCwgdGhpcy5oZWlnaHQsIHRoaXMuZGVjbyB8fCAwKTtcbiAgICB9XG4gICAgbGluZUF0KF92YWx1ZSwgX3R5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tBdCgwLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgaWYgKGZyb20gPD0gb2Zmc2V0ICsgdGhpcy5sZW5ndGggJiYgdG8gPj0gb2Zmc2V0KVxuICAgICAgICAgICAgZih0aGlzLmJsb2NrQXQoMCwgb3JhY2xlLCB0b3AsIG9mZnNldCkpO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBfZm9yY2UgPSBmYWxzZSwgbWVhc3VyZWQpIHtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChtZWFzdXJlZC5oZWlnaHRzW21lYXN1cmVkLmluZGV4KytdKTtcbiAgICAgICAgdGhpcy5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgYmxvY2soJHt0aGlzLmxlbmd0aH0pYDsgfVxufVxuY2xhc3MgSGVpZ2h0TWFwVGV4dCBleHRlbmRzIEhlaWdodE1hcEJsb2NrIHtcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgsIGhlaWdodCkge1xuICAgICAgICBzdXBlcihsZW5ndGgsIGhlaWdodCwgbnVsbCk7XG4gICAgICAgIHRoaXMuY29sbGFwc2VkID0gMDsgLy8gQW1vdW50IG9mIGNvbGxhcHNlZCBjb250ZW50IGluIHRoZSBsaW5lXG4gICAgICAgIHRoaXMud2lkZ2V0SGVpZ2h0ID0gMDsgLy8gTWF4aW11bSBpbmxpbmUgd2lkZ2V0IGhlaWdodFxuICAgICAgICB0aGlzLmJyZWFrcyA9IDA7IC8vIE51bWJlciBvZiB3aWRnZXQtaW50cm9kdWNlZCBsaW5lIGJyZWFrcyBvbiB0aGUgbGluZVxuICAgIH1cbiAgICBibG9ja0F0KF9oZWlnaHQsIF9vcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKG9mZnNldCwgdGhpcy5sZW5ndGgsIHRvcCwgdGhpcy5oZWlnaHQsIHRoaXMuYnJlYWtzKTtcbiAgICB9XG4gICAgcmVwbGFjZShfZnJvbSwgX3RvLCBub2Rlcykge1xuICAgICAgICBsZXQgbm9kZSA9IG5vZGVzWzBdO1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDEgJiYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0IHx8IG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXAgJiYgKG5vZGUuZmxhZ3MgJiA0IC8qIEZsYWcuU2luZ2xlTGluZSAqLykpICYmXG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLmxlbmd0aCAtIG5vZGUubGVuZ3RoKSA8IDEwKSB7XG4gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgICAgICAgICBub2RlID0gbmV3IEhlaWdodE1hcFRleHQobm9kZS5sZW5ndGgsIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBub2RlLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgaWYgKCF0aGlzLm91dGRhdGVkKVxuICAgICAgICAgICAgICAgIG5vZGUub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0ID0gMCwgZm9yY2UgPSBmYWxzZSwgbWVhc3VyZWQpIHtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChtZWFzdXJlZC5oZWlnaHRzW21lYXN1cmVkLmluZGV4KytdKTtcbiAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgdGhpcy5vdXRkYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KE1hdGgubWF4KHRoaXMud2lkZ2V0SGVpZ2h0LCBvcmFjbGUuaGVpZ2h0Rm9yTGluZSh0aGlzLmxlbmd0aCAtIHRoaXMuY29sbGFwc2VkKSkgK1xuICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtzICogb3JhY2xlLmxpbmVIZWlnaHQpO1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBsaW5lKCR7dGhpcy5sZW5ndGh9JHt0aGlzLmNvbGxhcHNlZCA/IC10aGlzLmNvbGxhcHNlZCA6IFwiXCJ9JHt0aGlzLndpZGdldEhlaWdodCA/IFwiOlwiICsgdGhpcy53aWRnZXRIZWlnaHQgOiBcIlwifSlgO1xuICAgIH1cbn1cbmNsYXNzIEhlaWdodE1hcEdhcCBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoKSB7IHN1cGVyKGxlbmd0aCwgMCk7IH1cbiAgICBoZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBmaXJzdExpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChvZmZzZXQpLm51bWJlciwgbGFzdExpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChvZmZzZXQgKyB0aGlzLmxlbmd0aCkubnVtYmVyO1xuICAgICAgICBsZXQgbGluZXMgPSBsYXN0TGluZSAtIGZpcnN0TGluZSArIDE7XG4gICAgICAgIGxldCBwZXJMaW5lLCBwZXJDaGFyID0gMDtcbiAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbFBlckxpbmUgPSBNYXRoLm1pbih0aGlzLmhlaWdodCwgb3JhY2xlLmxpbmVIZWlnaHQgKiBsaW5lcyk7XG4gICAgICAgICAgICBwZXJMaW5lID0gdG90YWxQZXJMaW5lIC8gbGluZXM7XG4gICAgICAgICAgICBpZiAodGhpcy5sZW5ndGggPiBsaW5lcyArIDEpXG4gICAgICAgICAgICAgICAgcGVyQ2hhciA9ICh0aGlzLmhlaWdodCAtIHRvdGFsUGVyTGluZSkgLyAodGhpcy5sZW5ndGggLSBsaW5lcyAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVyTGluZSA9IHRoaXMuaGVpZ2h0IC8gbGluZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlyc3RMaW5lLCBsYXN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9O1xuICAgIH1cbiAgICBibG9ja0F0KGhlaWdodCwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIGxhc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH0gPSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpO1xuICAgICAgICBpZiAob3JhY2xlLmxpbmVXcmFwcGluZykge1xuICAgICAgICAgICAgbGV0IGd1ZXNzID0gb2Zmc2V0ICsgKGhlaWdodCA8IG9yYWNsZS5saW5lSGVpZ2h0ID8gMFxuICAgICAgICAgICAgICAgIDogTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoaGVpZ2h0IC0gdG9wKSAvIHRoaXMuaGVpZ2h0KSkgKiB0aGlzLmxlbmd0aCkpO1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChndWVzcyksIGxpbmVIZWlnaHQgPSBwZXJMaW5lICsgbGluZS5sZW5ndGggKiBwZXJDaGFyO1xuICAgICAgICAgICAgbGV0IGxpbmVUb3AgPSBNYXRoLm1heCh0b3AsIGhlaWdodCAtIGxpbmVIZWlnaHQgLyAyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIGxpbmVUb3AsIGxpbmVIZWlnaHQsIDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsYXN0TGluZSAtIGZpcnN0TGluZSwgTWF0aC5mbG9vcigoaGVpZ2h0IC0gdG9wKSAvIHBlckxpbmUpKSk7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCBsZW5ndGggfSA9IG9yYWNsZS5kb2MubGluZShmaXJzdExpbmUgKyBsaW5lKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGZyb20sIGxlbmd0aCwgdG9wICsgcGVyTGluZSAqIGxpbmUsIHBlckxpbmUsIDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBpZiAodHlwZSA9PSBRdWVyeVR5cGUuQnlIZWlnaHQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ibG9ja0F0KHZhbHVlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KTtcbiAgICAgICAgaWYgKHR5cGUgPT0gUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQpIHtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSBvcmFjbGUuZG9jLmxpbmVBdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhmcm9tLCB0byAtIGZyb20sIDAsIDAsIDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IGZpcnN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9ID0gdGhpcy5oZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KTtcbiAgICAgICAgbGV0IGxpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdCh2YWx1ZSksIGxpbmVIZWlnaHQgPSBwZXJMaW5lICsgbGluZS5sZW5ndGggKiBwZXJDaGFyO1xuICAgICAgICBsZXQgbGluZXNBYm92ZSA9IGxpbmUubnVtYmVyIC0gZmlyc3RMaW5lO1xuICAgICAgICBsZXQgbGluZVRvcCA9IHRvcCArIHBlckxpbmUgKiBsaW5lc0Fib3ZlICsgcGVyQ2hhciAqIChsaW5lLmZyb20gLSBvZmZzZXQgLSBsaW5lc0Fib3ZlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8obGluZS5mcm9tLCBsaW5lLmxlbmd0aCwgTWF0aC5tYXgodG9wLCBNYXRoLm1pbihsaW5lVG9wLCB0b3AgKyB0aGlzLmhlaWdodCAtIGxpbmVIZWlnaHQpKSwgbGluZUhlaWdodCwgMCk7XG4gICAgfVxuICAgIGZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKSB7XG4gICAgICAgIGZyb20gPSBNYXRoLm1heChmcm9tLCBvZmZzZXQpO1xuICAgICAgICB0byA9IE1hdGgubWluKHRvLCBvZmZzZXQgKyB0aGlzLmxlbmd0aCk7XG4gICAgICAgIGxldCB7IGZpcnN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9ID0gdGhpcy5oZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gZnJvbSwgbGluZVRvcCA9IHRvcDsgcG9zIDw9IHRvOykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmVzQWJvdmUgPSBsaW5lLm51bWJlciAtIGZpcnN0TGluZTtcbiAgICAgICAgICAgICAgICBsaW5lVG9wICs9IHBlckxpbmUgKiBsaW5lc0Fib3ZlICsgcGVyQ2hhciAqIChmcm9tIC0gb2Zmc2V0IC0gbGluZXNBYm92ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbGluZUhlaWdodCA9IHBlckxpbmUgKyBwZXJDaGFyICogbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBmKG5ldyBCbG9ja0luZm8obGluZS5mcm9tLCBsaW5lLmxlbmd0aCwgbGluZVRvcCwgbGluZUhlaWdodCwgMCkpO1xuICAgICAgICAgICAgbGluZVRvcCArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgcG9zID0gbGluZS50byArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gdGhpcy5sZW5ndGggLSB0bztcbiAgICAgICAgaWYgKGFmdGVyID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwKVxuICAgICAgICAgICAgICAgIG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdID0gbmV3IEhlaWdodE1hcEdhcChsYXN0Lmxlbmd0aCArIGFmdGVyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG51bGwsIG5ldyBIZWlnaHRNYXBHYXAoYWZ0ZXIgLSAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gPiAwKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBub2Rlc1swXTtcbiAgICAgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgICAgICAgICBub2Rlc1swXSA9IG5ldyBIZWlnaHRNYXBHYXAoZnJvbSArIGZpcnN0Lmxlbmd0aCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZXMudW5zaGlmdChuZXcgSGVpZ2h0TWFwR2FwKGZyb20gLSAxKSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgfVxuICAgIGRlY29tcG9zZUxlZnQodG8sIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQucHVzaChuZXcgSGVpZ2h0TWFwR2FwKHRvIC0gMSksIG51bGwpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VSaWdodChmcm9tLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobnVsbCwgbmV3IEhlaWdodE1hcEdhcCh0aGlzLmxlbmd0aCAtIGZyb20gLSAxKSk7XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGxldCBlbmQgPSBvZmZzZXQgKyB0aGlzLmxlbmd0aDtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICsgdGhpcy5sZW5ndGggJiYgbWVhc3VyZWQubW9yZSkge1xuICAgICAgICAgICAgLy8gRmlsbCBpbiBwYXJ0IG9mIHRoaXMgZ2FwIHdpdGggbWVhc3VyZWQgbGluZXMuIFdlIGtub3cgdGhlcmVcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIHdpZGdldHMgb3IgY29sbGFwc2VkIHJhbmdlcyBpbiB0aG9zZSBsaW5lcywgYmVjYXVzZVxuICAgICAgICAgICAgLy8gdGhleSB3b3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgaGVpZ2h0bWFwIChnYXBzXG4gICAgICAgICAgICAvLyBvbmx5IGNvbnRhaW4gcGxhaW4gdGV4dCkuXG4gICAgICAgICAgICBsZXQgbm9kZXMgPSBbXSwgcG9zID0gTWF0aC5tYXgob2Zmc2V0LCBtZWFzdXJlZC5mcm9tKSwgc2luZ2xlSGVpZ2h0ID0gLTE7XG4gICAgICAgICAgICBpZiAobWVhc3VyZWQuZnJvbSA+IG9mZnNldClcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBHYXAobWVhc3VyZWQuZnJvbSAtIG9mZnNldCAtIDEpLnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCkpO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8PSBlbmQgJiYgbWVhc3VyZWQubW9yZSkge1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBvcmFjbGUuZG9jLmxpbmVBdChwb3MpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBtZWFzdXJlZC5oZWlnaHRzW21lYXN1cmVkLmluZGV4KytdO1xuICAgICAgICAgICAgICAgIGlmIChzaW5nbGVIZWlnaHQgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZUhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChNYXRoLmFicyhoZWlnaHQgLSBzaW5nbGVIZWlnaHQpID49IEVwc2lsb24pXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZUhlaWdodCA9IC0yO1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gbmV3IEhlaWdodE1hcFRleHQobGVuLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIGxpbmUub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA8PSBlbmQpXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsLCBuZXcgSGVpZ2h0TWFwR2FwKGVuZCAtIHBvcykudXBkYXRlSGVpZ2h0KG9yYWNsZSwgcG9zKSk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICAgICAgICAgIGlmIChzaW5nbGVIZWlnaHQgPCAwIHx8IE1hdGguYWJzKHJlc3VsdC5oZWlnaHQgLSB0aGlzLmhlaWdodCkgPj0gRXBzaWxvbiB8fFxuICAgICAgICAgICAgICAgIE1hdGguYWJzKHNpbmdsZUhlaWdodCAtIHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCkucGVyTGluZSkgPj0gRXBzaWxvbilcbiAgICAgICAgICAgICAgICBoZWlnaHRDaGFuZ2VGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlKHRoaXMsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgdGhpcy5vdXRkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQob3JhY2xlLmhlaWdodEZvckdhcChvZmZzZXQsIG9mZnNldCArIHRoaXMubGVuZ3RoKSk7XG4gICAgICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYGdhcCgke3RoaXMubGVuZ3RofSlgOyB9XG59XG5jbGFzcyBIZWlnaHRNYXBCcmFuY2ggZXh0ZW5kcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlZnQsIGJyaywgcmlnaHQpIHtcbiAgICAgICAgc3VwZXIobGVmdC5sZW5ndGggKyBicmsgKyByaWdodC5sZW5ndGgsIGxlZnQuaGVpZ2h0ICsgcmlnaHQuaGVpZ2h0LCBicmsgfCAobGVmdC5vdXRkYXRlZCB8fCByaWdodC5vdXRkYXRlZCA/IDIgLyogRmxhZy5PdXRkYXRlZCAqLyA6IDApKTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgICAgICB0aGlzLnNpemUgPSBsZWZ0LnNpemUgKyByaWdodC5zaXplO1xuICAgIH1cbiAgICBnZXQgYnJlYWsoKSB7IHJldHVybiB0aGlzLmZsYWdzICYgMSAvKiBGbGFnLkJyZWFrICovOyB9XG4gICAgYmxvY2tBdChoZWlnaHQsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IG1pZCA9IHRvcCArIHRoaXMubGVmdC5oZWlnaHQ7XG4gICAgICAgIHJldHVybiBoZWlnaHQgPCBtaWQgPyB0aGlzLmxlZnQuYmxvY2tBdChoZWlnaHQsIG9yYWNsZSwgdG9wLCBvZmZzZXQpXG4gICAgICAgICAgICA6IHRoaXMucmlnaHQuYmxvY2tBdChoZWlnaHQsIG9yYWNsZSwgbWlkLCBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhayk7XG4gICAgfVxuICAgIGxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBsZXQgcmlnaHRUb3AgPSB0b3AgKyB0aGlzLmxlZnQuaGVpZ2h0LCByaWdodE9mZnNldCA9IG9mZnNldCArIHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrO1xuICAgICAgICBsZXQgbGVmdCA9IHR5cGUgPT0gUXVlcnlUeXBlLkJ5SGVpZ2h0ID8gdmFsdWUgPCByaWdodFRvcCA6IHZhbHVlIDwgcmlnaHRPZmZzZXQ7XG4gICAgICAgIGxldCBiYXNlID0gbGVmdCA/IHRoaXMubGVmdC5saW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpXG4gICAgICAgICAgICA6IHRoaXMucmlnaHQubGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCk7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrIHx8IChsZWZ0ID8gYmFzZS50byA8IHJpZ2h0T2Zmc2V0IDogYmFzZS5mcm9tID4gcmlnaHRPZmZzZXQpKVxuICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIGxldCBzdWJRdWVyeSA9IHR5cGUgPT0gUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQgPyBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCA6IFF1ZXJ5VHlwZS5CeVBvcztcbiAgICAgICAgaWYgKGxlZnQpXG4gICAgICAgICAgICByZXR1cm4gYmFzZS5qb2luKHRoaXMucmlnaHQubGluZUF0KHJpZ2h0T2Zmc2V0LCBzdWJRdWVyeSwgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5saW5lQXQocmlnaHRPZmZzZXQsIHN1YlF1ZXJ5LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KS5qb2luKGJhc2UpO1xuICAgIH1cbiAgICBmb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZikge1xuICAgICAgICBsZXQgcmlnaHRUb3AgPSB0b3AgKyB0aGlzLmxlZnQuaGVpZ2h0LCByaWdodE9mZnNldCA9IG9mZnNldCArIHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrO1xuICAgICAgICBpZiAodGhpcy5icmVhaykge1xuICAgICAgICAgICAgaWYgKGZyb20gPCByaWdodE9mZnNldClcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpO1xuICAgICAgICAgICAgaWYgKHRvID49IHJpZ2h0T2Zmc2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0LCBmKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtaWQgPSB0aGlzLmxpbmVBdChyaWdodE9mZnNldCwgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgbWlkLmZyb20pXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hMaW5lKGZyb20sIG1pZC5mcm9tIC0gMSwgb3JhY2xlLCB0b3AsIG9mZnNldCwgZik7XG4gICAgICAgICAgICBpZiAobWlkLnRvID49IGZyb20gJiYgbWlkLmZyb20gPD0gdG8pXG4gICAgICAgICAgICAgICAgZihtaWQpO1xuICAgICAgICAgICAgaWYgKHRvID4gbWlkLnRvKVxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuZm9yRWFjaExpbmUobWlkLnRvICsgMSwgdG8sIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0LCBmKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCBub2Rlcykge1xuICAgICAgICBsZXQgcmlnaHRTdGFydCA9IHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrO1xuICAgICAgICBpZiAodG8gPCByaWdodFN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFsYW5jZWQodGhpcy5sZWZ0LnJlcGxhY2UoZnJvbSwgdG8sIG5vZGVzKSwgdGhpcy5yaWdodCk7XG4gICAgICAgIGlmIChmcm9tID4gdGhpcy5sZWZ0Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKHRoaXMubGVmdCwgdGhpcy5yaWdodC5yZXBsYWNlKGZyb20gLSByaWdodFN0YXJ0LCB0byAtIHJpZ2h0U3RhcnQsIG5vZGVzKSk7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKGZyb20gPiAwKVxuICAgICAgICAgICAgdGhpcy5kZWNvbXBvc2VMZWZ0KGZyb20sIHJlc3VsdCk7XG4gICAgICAgIGxldCBsZWZ0ID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgbm9kZSBvZiBub2RlcylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoZnJvbSA+IDApXG4gICAgICAgICAgICBtZXJnZUdhcHMocmVzdWx0LCBsZWZ0IC0gMSk7XG4gICAgICAgIGlmICh0byA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmlnaHQgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5kZWNvbXBvc2VSaWdodCh0bywgcmVzdWx0KTtcbiAgICAgICAgICAgIG1lcmdlR2FwcyhyZXN1bHQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKHJlc3VsdCk7XG4gICAgfVxuICAgIGRlY29tcG9zZUxlZnQodG8sIHJlc3VsdCkge1xuICAgICAgICBsZXQgbGVmdCA9IHRoaXMubGVmdC5sZW5ndGg7XG4gICAgICAgIGlmICh0byA8PSBsZWZ0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5kZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpO1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLmxlZnQpO1xuICAgICAgICBpZiAodGhpcy5icmVhaykge1xuICAgICAgICAgICAgbGVmdCsrO1xuICAgICAgICAgICAgaWYgKHRvID49IGxlZnQpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvID4gbGVmdClcbiAgICAgICAgICAgIHRoaXMucmlnaHQuZGVjb21wb3NlTGVmdCh0byAtIGxlZnQsIHJlc3VsdCk7XG4gICAgfVxuICAgIGRlY29tcG9zZVJpZ2h0KGZyb20sIHJlc3VsdCkge1xuICAgICAgICBsZXQgbGVmdCA9IHRoaXMubGVmdC5sZW5ndGgsIHJpZ2h0ID0gbGVmdCArIHRoaXMuYnJlYWs7XG4gICAgICAgIGlmIChmcm9tID49IHJpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQuZGVjb21wb3NlUmlnaHQoZnJvbSAtIHJpZ2h0LCByZXN1bHQpO1xuICAgICAgICBpZiAoZnJvbSA8IGxlZnQpXG4gICAgICAgICAgICB0aGlzLmxlZnQuZGVjb21wb3NlUmlnaHQoZnJvbSwgcmVzdWx0KTtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWsgJiYgZnJvbSA8IHJpZ2h0KVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMucmlnaHQpO1xuICAgIH1cbiAgICBiYWxhbmNlZChsZWZ0LCByaWdodCkge1xuICAgICAgICBpZiAobGVmdC5zaXplID4gMiAqIHJpZ2h0LnNpemUgfHwgcmlnaHQuc2l6ZSA+IDIgKiBsZWZ0LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKHRoaXMuYnJlYWsgPyBbbGVmdCwgbnVsbCwgcmlnaHRdIDogW2xlZnQsIHJpZ2h0XSk7XG4gICAgICAgIHRoaXMubGVmdCA9IHJlcGxhY2UodGhpcy5sZWZ0LCBsZWZ0KTtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJlcGxhY2UodGhpcy5yaWdodCwgcmlnaHQpO1xuICAgICAgICB0aGlzLnNldEhlaWdodChsZWZ0LmhlaWdodCArIHJpZ2h0LmhlaWdodCk7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBsZWZ0Lm91dGRhdGVkIHx8IHJpZ2h0Lm91dGRhdGVkO1xuICAgICAgICB0aGlzLnNpemUgPSBsZWZ0LnNpemUgKyByaWdodC5zaXplO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlZnQubGVuZ3RoICsgdGhpcy5icmVhayArIHJpZ2h0Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGxldCB7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLCByaWdodFN0YXJ0ID0gb2Zmc2V0ICsgbGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrLCByZWJhbGFuY2UgPSBudWxsO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgKyBsZWZ0Lmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgcmViYWxhbmNlID0gbGVmdCA9IGxlZnQudXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0LCBmb3JjZSwgbWVhc3VyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZWZ0LnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCwgZm9yY2UpO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSByaWdodFN0YXJ0ICsgcmlnaHQubGVuZ3RoICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICByZWJhbGFuY2UgPSByaWdodCA9IHJpZ2h0LnVwZGF0ZUhlaWdodChvcmFjbGUsIHJpZ2h0U3RhcnQsIGZvcmNlLCBtZWFzdXJlZCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJpZ2h0LnVwZGF0ZUhlaWdodChvcmFjbGUsIHJpZ2h0U3RhcnQsIGZvcmNlKTtcbiAgICAgICAgaWYgKHJlYmFsYW5jZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmxlZnQuaGVpZ2h0ICsgdGhpcy5yaWdodC5oZWlnaHQ7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5sZWZ0ICsgKHRoaXMuYnJlYWsgPyBcIiBcIiA6IFwiLVwiKSArIHRoaXMucmlnaHQ7IH1cbn1cbmZ1bmN0aW9uIG1lcmdlR2Fwcyhub2RlcywgYXJvdW5kKSB7XG4gICAgbGV0IGJlZm9yZSwgYWZ0ZXI7XG4gICAgaWYgKG5vZGVzW2Fyb3VuZF0gPT0gbnVsbCAmJlxuICAgICAgICAoYmVmb3JlID0gbm9kZXNbYXJvdW5kIC0gMV0pIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwICYmXG4gICAgICAgIChhZnRlciA9IG5vZGVzW2Fyb3VuZCArIDFdKSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgbm9kZXMuc3BsaWNlKGFyb3VuZCAtIDEsIDMsIG5ldyBIZWlnaHRNYXBHYXAoYmVmb3JlLmxlbmd0aCArIDEgKyBhZnRlci5sZW5ndGgpKTtcbn1cbmNvbnN0IHJlbGV2YW50V2lkZ2V0SGVpZ2h0ID0gNTtcbmNsYXNzIE5vZGVCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIG9yYWNsZSkge1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5vcmFjbGUgPSBvcmFjbGU7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5saW5lRW5kID0gLTE7XG4gICAgICAgIHRoaXMuY292ZXJpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLndyaXR0ZW5UbyA9IHBvcztcbiAgICB9XG4gICAgZ2V0IGlzQ292ZXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY292ZXJpbmcgJiYgdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdID09IHRoaXMuY292ZXJpbmc7XG4gICAgfVxuICAgIHNwYW4oX2Zyb20sIHRvKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4odG8sIHRoaXMubGluZUVuZCksIGxhc3QgPSB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpXG4gICAgICAgICAgICAgICAgbGFzdC5sZW5ndGggKz0gZW5kIC0gdGhpcy5wb3M7XG4gICAgICAgICAgICBlbHNlIGlmIChlbmQgPiB0aGlzLnBvcyB8fCAhdGhpcy5pc0NvdmVyZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KGVuZCAtIHRoaXMucG9zLCAtMSkpO1xuICAgICAgICAgICAgdGhpcy53cml0dGVuVG8gPSBlbmQ7XG4gICAgICAgICAgICBpZiAodG8gPiBlbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0dGVuVG8rKztcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgfVxuICAgIHBvaW50KGZyb20sIHRvLCBkZWNvKSB7XG4gICAgICAgIGlmIChmcm9tIDwgdG8gfHwgZGVjby5oZWlnaHRSZWxldmFudCkge1xuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGRlY28ud2lkZ2V0ID8gZGVjby53aWRnZXQuZXN0aW1hdGVkSGVpZ2h0IDogMDtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSBkZWNvLndpZGdldCA/IGRlY28ud2lkZ2V0LmxpbmVCcmVha3MgOiAwO1xuICAgICAgICAgICAgaWYgKGhlaWdodCA8IDApXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5vcmFjbGUubGluZUhlaWdodDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0byAtIGZyb207XG4gICAgICAgICAgICBpZiAoZGVjby5ibG9jaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2sobmV3IEhlaWdodE1hcEJsb2NrKGxlbiwgaGVpZ2h0LCBkZWNvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsZW4gfHwgYnJlYWtzIHx8IGhlaWdodCA+PSByZWxldmFudFdpZGdldEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZURlY28oaGVpZ2h0LCBicmVha3MsIGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodG8gPiBmcm9tKSB7XG4gICAgICAgICAgICB0aGlzLnNwYW4oZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpbmVFbmQgPiAtMSAmJiB0aGlzLmxpbmVFbmQgPCB0aGlzLnBvcylcbiAgICAgICAgICAgIHRoaXMubGluZUVuZCA9IHRoaXMub3JhY2xlLmRvYy5saW5lQXQodGhpcy5wb3MpLnRvO1xuICAgIH1cbiAgICBlbnRlckxpbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5vcmFjbGUuZG9jLmxpbmVBdCh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gZnJvbTtcbiAgICAgICAgdGhpcy5saW5lRW5kID0gdG87XG4gICAgICAgIGlmICh0aGlzLndyaXR0ZW5UbyA8IGZyb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLndyaXR0ZW5UbyA8IGZyb20gLSAxIHx8IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaCh0aGlzLmJsYW5rQ29udGVudCh0aGlzLndyaXR0ZW5UbywgZnJvbSAtIDEpKTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3MgPiBmcm9tKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KHRoaXMucG9zIC0gZnJvbSwgLTEpKTtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSB0aGlzLnBvcztcbiAgICB9XG4gICAgYmxhbmtDb250ZW50KGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBnYXAgPSBuZXcgSGVpZ2h0TWFwR2FwKHRvIC0gZnJvbSk7XG4gICAgICAgIGlmICh0aGlzLm9yYWNsZS5kb2MubGluZUF0KGZyb20pLnRvID09IHRvKVxuICAgICAgICAgICAgZ2FwLmZsYWdzIHw9IDQgLyogRmxhZy5TaW5nbGVMaW5lICovO1xuICAgICAgICByZXR1cm4gZ2FwO1xuICAgIH1cbiAgICBlbnN1cmVMaW5lKCkge1xuICAgICAgICB0aGlzLmVudGVyTGluZSgpO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMubm9kZXMubGVuZ3RoID8gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgICAgIGxldCBsaW5lID0gbmV3IEhlaWdodE1hcFRleHQoMCwgLTEpO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobGluZSk7XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgICBhZGRCbG9jayhibG9jaykge1xuICAgICAgICB0aGlzLmVudGVyTGluZSgpO1xuICAgICAgICBsZXQgZGVjbyA9IGJsb2NrLmRlY287XG4gICAgICAgIGlmIChkZWNvICYmIGRlY28uc3RhcnRTaWRlID4gMCAmJiAhdGhpcy5pc0NvdmVyZWQpXG4gICAgICAgICAgICB0aGlzLmVuc3VyZUxpbmUoKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSB0aGlzLnBvcyA9IHRoaXMucG9zICsgYmxvY2subGVuZ3RoO1xuICAgICAgICBpZiAoZGVjbyAmJiBkZWNvLmVuZFNpZGUgPiAwKVxuICAgICAgICAgICAgdGhpcy5jb3ZlcmluZyA9IGJsb2NrO1xuICAgIH1cbiAgICBhZGRMaW5lRGVjbyhoZWlnaHQsIGJyZWFrcywgbGVuZ3RoKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5lbnN1cmVMaW5lKCk7XG4gICAgICAgIGxpbmUubGVuZ3RoICs9IGxlbmd0aDtcbiAgICAgICAgbGluZS5jb2xsYXBzZWQgKz0gbGVuZ3RoO1xuICAgICAgICBsaW5lLndpZGdldEhlaWdodCA9IE1hdGgubWF4KGxpbmUud2lkZ2V0SGVpZ2h0LCBoZWlnaHQpO1xuICAgICAgICBsaW5lLmJyZWFrcyArPSBicmVha3M7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3MgPSB0aGlzLnBvcyArIGxlbmd0aDtcbiAgICB9XG4gICAgZmluaXNoKGZyb20pIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0ID4gLTEgJiYgIShsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dCkgJiYgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KDAsIC0xKSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMud3JpdHRlblRvIDwgdGhpcy5wb3MgfHwgbGFzdCA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKHRoaXMuYmxhbmtDb250ZW50KHRoaXMud3JpdHRlblRvLCB0aGlzLnBvcykpO1xuICAgICAgICBsZXQgcG9zID0gZnJvbTtcbiAgICAgICAgZm9yIChsZXQgbm9kZSBvZiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpXG4gICAgICAgICAgICAgICAgbm9kZS51cGRhdGVIZWlnaHQodGhpcy5vcmFjbGUsIHBvcyk7XG4gICAgICAgICAgICBwb3MgKz0gbm9kZSA/IG5vZGUubGVuZ3RoIDogMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgICB9XG4gICAgLy8gQWx3YXlzIGNhbGxlZCB3aXRoIGEgcmVnaW9uIHRoYXQgb24gYm90aCBzaWRlcyBlaXRoZXIgc3RyZXRjaGVzXG4gICAgLy8gdG8gYSBsaW5lIGJyZWFrIG9yIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgIC8vIFRoZSByZXR1cm5lZCBhcnJheSB1c2VzIG51bGwgdG8gaW5kaWNhdGUgbGluZSBicmVha3MsIGJ1dCBuZXZlclxuICAgIC8vIHN0YXJ0cyBvciBlbmRzIGluIGEgbGluZSBicmVhaywgb3IgaGFzIG11bHRpcGxlIGxpbmUgYnJlYWtzIG5leHRcbiAgICAvLyB0byBlYWNoIG90aGVyLlxuICAgIHN0YXRpYyBidWlsZChvcmFjbGUsIGRlY29yYXRpb25zLCBmcm9tLCB0bykge1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBOb2RlQnVpbGRlcihmcm9tLCBvcmFjbGUpO1xuICAgICAgICBSYW5nZVNldC5zcGFucyhkZWNvcmF0aW9ucywgZnJvbSwgdG8sIGJ1aWxkZXIsIDApO1xuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goZnJvbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGVpZ2h0UmVsZXZhbnREZWNvQ2hhbmdlcyhhLCBiLCBkaWZmKSB7XG4gICAgbGV0IGNvbXAgPSBuZXcgRGVjb3JhdGlvbkNvbXBhcmF0b3I7XG4gICAgUmFuZ2VTZXQuY29tcGFyZShhLCBiLCBkaWZmLCBjb21wLCAwKTtcbiAgICByZXR1cm4gY29tcC5jaGFuZ2VzO1xufVxuY2xhc3MgRGVjb3JhdGlvbkNvbXBhcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBbXTtcbiAgICB9XG4gICAgY29tcGFyZVJhbmdlKCkgeyB9XG4gICAgY29tcGFyZVBvaW50KGZyb20sIHRvLCBhLCBiKSB7XG4gICAgICAgIGlmIChmcm9tIDwgdG8gfHwgYSAmJiBhLmhlaWdodFJlbGV2YW50IHx8IGIgJiYgYi5oZWlnaHRSZWxldmFudClcbiAgICAgICAgICAgIGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMsIDUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmlzaWJsZVBpeGVsUmFuZ2UoZG9tLCBwYWRkaW5nVG9wKSB7XG4gICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIGxldCBsZWZ0ID0gTWF0aC5tYXgoMCwgcmVjdC5sZWZ0KSwgcmlnaHQgPSBNYXRoLm1pbih3aW4uaW5uZXJXaWR0aCwgcmVjdC5yaWdodCk7XG4gICAgbGV0IHRvcCA9IE1hdGgubWF4KDAsIHJlY3QudG9wKSwgYm90dG9tID0gTWF0aC5taW4od2luLmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSk7XG4gICAgZm9yIChsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7IHBhcmVudCAmJiBwYXJlbnQgIT0gZG9jLmJvZHk7KSB7XG4gICAgICAgIGlmIChwYXJlbnQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbGV0IGVsdCA9IHBhcmVudDtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsdCk7XG4gICAgICAgICAgICBpZiAoKGVsdC5zY3JvbGxIZWlnaHQgPiBlbHQuY2xpZW50SGVpZ2h0IHx8IGVsdC5zY3JvbGxXaWR0aCA+IGVsdC5jbGllbnRXaWR0aCkgJiZcbiAgICAgICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAhPSBcInZpc2libGVcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRSZWN0ID0gZWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCBwYXJlbnRSZWN0LmxlZnQpO1xuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIHBhcmVudFJlY3QucmlnaHQpO1xuICAgICAgICAgICAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgcGFyZW50UmVjdC50b3ApO1xuICAgICAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWluKHBhcmVudCA9PSBkb20ucGFyZW50Tm9kZSA/IHdpbi5pbm5lckhlaWdodCA6IGJvdHRvbSwgcGFyZW50UmVjdC5ib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gc3R5bGUucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiIHx8IHN0eWxlLnBvc2l0aW9uID09IFwiZml4ZWRcIiA/IGVsdC5vZmZzZXRQYXJlbnQgOiBlbHQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJlbnQubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdDogbGVmdCAtIHJlY3QubGVmdCwgcmlnaHQ6IE1hdGgubWF4KGxlZnQsIHJpZ2h0KSAtIHJlY3QubGVmdCxcbiAgICAgICAgdG9wOiB0b3AgLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSwgYm90dG9tOiBNYXRoLm1heCh0b3AsIGJvdHRvbSkgLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSB9O1xufVxuZnVuY3Rpb24gaW5XaW5kb3coZWx0KSB7XG4gICAgbGV0IHJlY3QgPSBlbHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHdpbiA9IGVsdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICByZXR1cm4gcmVjdC5sZWZ0IDwgd2luLmlubmVyV2lkdGggJiYgcmVjdC5yaWdodCA+IDAgJiZcbiAgICAgICAgcmVjdC50b3AgPCB3aW4uaW5uZXJIZWlnaHQgJiYgcmVjdC5ib3R0b20gPiAwO1xufVxuZnVuY3Rpb24gZnVsbFBpeGVsUmFuZ2UoZG9tLCBwYWRkaW5nVG9wKSB7XG4gICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgICAgIHRvcDogcGFkZGluZ1RvcCwgYm90dG9tOiByZWN0LmJvdHRvbSAtIChyZWN0LnRvcCArIHBhZGRpbmdUb3ApIH07XG59XG4vLyBMaW5lIGdhcHMgYXJlIHBsYWNlaG9sZGVyIHdpZGdldHMgdXNlZCB0byBoaWRlIHBpZWNlcyBvZiBvdmVybG9uZ1xuLy8gbGluZXMgd2l0aGluIHRoZSB2aWV3cG9ydCwgYXMgYSBrbHVkZ2UgdG8ga2VlcCB0aGUgZWRpdG9yXG4vLyByZXNwb25zaXZlIHdoZW4gYSByaWRpY3Vsb3VzbHkgbG9uZyBsaW5lIGlzIGxvYWRlZCBpbnRvIGl0LlxuY2xhc3MgTGluZUdhcCB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8sIHNpemUsIGRpc3BsYXlTaXplKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5kaXNwbGF5U2l6ZSA9IGRpc3BsYXlTaXplO1xuICAgIH1cbiAgICBzdGF0aWMgc2FtZShhLCBiKSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZ0EgPSBhW2ldLCBnQiA9IGJbaV07XG4gICAgICAgICAgICBpZiAoZ0EuZnJvbSAhPSBnQi5mcm9tIHx8IGdBLnRvICE9IGdCLnRvIHx8IGdBLnNpemUgIT0gZ0Iuc2l6ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRyYXcodmlld1N0YXRlLCB3cmFwcGluZykge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmVHYXBXaWRnZXQodGhpcy5kaXNwbGF5U2l6ZSAqICh3cmFwcGluZyA/IHZpZXdTdGF0ZS5zY2FsZVkgOiB2aWV3U3RhdGUuc2NhbGVYKSwgd3JhcHBpbmcpXG4gICAgICAgIH0pLnJhbmdlKHRoaXMuZnJvbSwgdGhpcy50byk7XG4gICAgfVxufVxuY2xhc3MgTGluZUdhcFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHNpemUsIHZlcnRpY2FsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMudmVydGljYWwgPSB2ZXJ0aWNhbDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLnNpemUgPT0gdGhpcy5zaXplICYmIG90aGVyLnZlcnRpY2FsID09IHRoaXMudmVydGljYWw7IH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGlmICh0aGlzLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zaXplICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWx0LnN0eWxlLndpZHRoID0gdGhpcy5zaXplICsgXCJweFwiO1xuICAgICAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IFwiMnB4XCI7XG4gICAgICAgICAgICBlbHQuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsdDtcbiAgICB9XG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIHRoaXMudmVydGljYWwgPyB0aGlzLnNpemUgOiAtMTsgfVxufVxuY2xhc3MgVmlld1N0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIC8vIFRoZXNlIGFyZSBjb250ZW50RE9NLWxvY2FsIGNvb3JkaW5hdGVzXG4gICAgICAgIHRoaXMucGl4ZWxWaWV3cG9ydCA9IHsgbGVmdDogMCwgcmlnaHQ6IHdpbmRvdy5pbm5lcldpZHRoLCB0b3A6IDAsIGJvdHRvbTogMCB9O1xuICAgICAgICB0aGlzLmluVmlldyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFkZGluZ1RvcCA9IDA7IC8vIFBhZGRpbmcgYWJvdmUgdGhlIGRvY3VtZW50LCBzY2FsZWRcbiAgICAgICAgdGhpcy5wYWRkaW5nQm90dG9tID0gMDsgLy8gUGFkZGluZyBiZWxvdyB0aGUgZG9jdW1lbnQsIHNjYWxlZFxuICAgICAgICB0aGlzLmNvbnRlbnRET01XaWR0aCA9IDA7IC8vIGNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbiAgICAgICAgdGhpcy5jb250ZW50RE9NSGVpZ2h0ID0gMDsgLy8gY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgdGhpcy5lZGl0b3JIZWlnaHQgPSAwOyAvLyBzY3JvbGxET00uY2xpZW50SGVpZ2h0LCB1bnNjYWxlZFxuICAgICAgICB0aGlzLmVkaXRvcldpZHRoID0gMDsgLy8gc2Nyb2xsRE9NLmNsaWVudFdpZHRoLCB1bnNjYWxlZFxuICAgICAgICB0aGlzLnNjcm9sbFRvcCA9IDA7IC8vIExhc3Qgc2VlbiBzY3JvbGxET00uc2Nyb2xsVG9wLCBzY2FsZWRcbiAgICAgICAgdGhpcy5zY3JvbGxlZFRvQm90dG9tID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBDU1MtdHJhbnNmb3JtYXRpb24gc2NhbGUgb2YgdGhlIGVkaXRvciAodHJhbnNmb3JtZWQgc2l6ZSAvXG4gICAgICAgIC8vIGNvbmNyZXRlIHNpemUpXG4gICAgICAgIHRoaXMuc2NhbGVYID0gMTtcbiAgICAgICAgdGhpcy5zY2FsZVkgPSAxO1xuICAgICAgICAvLyBUaGUgdmVydGljYWwgcG9zaXRpb24gKGRvY3VtZW50LXJlbGF0aXZlKSB0byB3aGljaCB0byBhbmNob3IgdGhlXG4gICAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbi4gLTEgbWVhbnMgYW5jaG9yIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IDA7XG4gICAgICAgIC8vIFRoZSBoZWlnaHQgYXQgdGhlIGFuY2hvciBwb3NpdGlvbi4gU2V0IGJ5IHRoZSBET00gdXBkYXRlIHBoYXNlLlxuICAgICAgICAvLyAtMSBtZWFucyBubyBoZWlnaHQgYXZhaWxhYmxlLlxuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAvLyBTZWUgVlAuTWF4RE9NSGVpZ2h0XG4gICAgICAgIHRoaXMuc2NhbGVyID0gSWRTY2FsZXI7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gQnJpZWZseSBzZXQgdG8gdHJ1ZSB3aGVuIHByaW50aW5nLCB0byBkaXNhYmxlIHZpZXdwb3J0IGxpbWl0aW5nXG4gICAgICAgIHRoaXMucHJpbnRpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gRmxhZyBzZXQgd2hlbiBlZGl0b3IgY29udGVudCB3YXMgcmVkcmF3biwgc28gdGhhdCB0aGUgbmV4dFxuICAgICAgICAvLyBtZWFzdXJlIHN0YWdlIGtub3dzIGl0IG11c3QgcmVhZCBET00gbGF5b3V0XG4gICAgICAgIHRoaXMubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiA9IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIHRoaXMudmlzaWJsZVJhbmdlcyA9IFtdO1xuICAgICAgICAvLyBDdXJzb3IgJ2Fzc29jJyBpcyBvbmx5IHNpZ25pZmljYW50IHdoZW4gdGhlIGN1cnNvciBpcyBvbiBhIGxpbmVcbiAgICAgICAgLy8gd3JhcCBwb2ludCwgd2hlcmUgaXQgbXVzdCBzdGljayB0byB0aGUgY2hhcmFjdGVyIHRoYXQgaXQgaXNcbiAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoLiBTaW5jZSBicm93c2VycyBkb24ndCBwcm92aWRlIGEgcmVhc29uYWJsZVxuICAgICAgICAvLyBpbnRlcmZhY2UgdG8gc2V0IG9yIHF1ZXJ5IHRoaXMsIHdoZW4gYSBzZWxlY3Rpb24gaXMgc2V0IHRoYXRcbiAgICAgICAgLy8gbWlnaHQgY2F1c2UgdGhpcyB0byBiZSBzaWduaWZpY2FudCwgdGhpcyBmbGFnIGlzIHNldC4gVGhlIG5leHRcbiAgICAgICAgLy8gbWVhc3VyZSBwaGFzZSB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBvbiBhIGxpbmUtd3JhcHBpbmdcbiAgICAgICAgLy8gYm91bmRhcnkgYW5kLCBpZiBzbywgcmVzZXQgaXQgdG8gbWFrZSBzdXJlIGl0IGlzIHBvc2l0aW9uZWQgaW5cbiAgICAgICAgLy8gdGhlIHJpZ2h0IHBsYWNlLlxuICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSBmYWxzZTtcbiAgICAgICAgbGV0IGd1ZXNzV3JhcHBpbmcgPSBzdGF0ZS5mYWNldChjb250ZW50QXR0cmlidXRlcykuc29tZSh2ID0+IHR5cGVvZiB2ICE9IFwiZnVuY3Rpb25cIiAmJiB2LmNsYXNzID09IFwiY20tbGluZVdyYXBwaW5nXCIpO1xuICAgICAgICB0aGlzLmhlaWdodE9yYWNsZSA9IG5ldyBIZWlnaHRPcmFjbGUoZ3Vlc3NXcmFwcGluZyk7XG4gICAgICAgIHRoaXMuc3RhdGVEZWNvID0gc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLmZpbHRlcihkID0+IHR5cGVvZiBkICE9IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gSGVpZ2h0TWFwLmVtcHR5KCkuYXBwbHlDaGFuZ2VzKHRoaXMuc3RhdGVEZWNvLCBUZXh0LmVtcHR5LCB0aGlzLmhlaWdodE9yYWNsZS5zZXREb2Moc3RhdGUuZG9jKSwgW25ldyBDaGFuZ2VkUmFuZ2UoMCwgMCwgMCwgc3RhdGUuZG9jLmxlbmd0aCldKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KDAsIG51bGwpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZUZvclZpZXdwb3J0KCkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydExpbmVzKCk7XG4gICAgICAgIHRoaXMubGluZUdhcHMgPSB0aGlzLmVuc3VyZUxpbmVHYXBzKFtdKTtcbiAgICAgICAgdGhpcy5saW5lR2FwRGVjbyA9IERlY29yYXRpb24uc2V0KHRoaXMubGluZUdhcHMubWFwKGdhcCA9PiBnYXAuZHJhdyh0aGlzLCBmYWxzZSkpKTtcbiAgICAgICAgdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgIH1cbiAgICB1cGRhdGVGb3JWaWV3cG9ydCgpIHtcbiAgICAgICAgbGV0IHZpZXdwb3J0cyA9IFt0aGlzLnZpZXdwb3J0XSwgeyBtYWluIH0gPSB0aGlzLnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gaSA/IG1haW4uaGVhZCA6IG1haW4uYW5jaG9yO1xuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydHMuc29tZSgoeyBmcm9tLCB0byB9KSA9PiBwb3MgPj0gZnJvbSAmJiBwb3MgPD0gdG8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMubGluZUJsb2NrQXQocG9zKTtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydHMucHVzaChuZXcgVmlld3BvcnQoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdwb3J0cyA9IHZpZXdwb3J0cy5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVTY2FsZXIoKTtcbiAgICB9XG4gICAgdXBkYXRlU2NhbGVyKCkge1xuICAgICAgICBsZXQgc2NhbGVyID0gdGhpcy5zY2FsZXI7XG4gICAgICAgIHRoaXMuc2NhbGVyID0gdGhpcy5oZWlnaHRNYXAuaGVpZ2h0IDw9IDcwMDAwMDAgLyogVlAuTWF4RE9NSGVpZ2h0ICovID8gSWRTY2FsZXIgOlxuICAgICAgICAgICAgbmV3IEJpZ1NjYWxlcih0aGlzLmhlaWdodE9yYWNsZSwgdGhpcy5oZWlnaHRNYXAsIHRoaXMudmlld3BvcnRzKTtcbiAgICAgICAgcmV0dXJuIHNjYWxlci5lcSh0aGlzLnNjYWxlcikgPyAwIDogMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICB9XG4gICAgdXBkYXRlVmlld3BvcnRMaW5lcygpIHtcbiAgICAgICAgdGhpcy52aWV3cG9ydExpbmVzID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwLmZvckVhY2hMaW5lKHRoaXMudmlld3BvcnQuZnJvbSwgdGhpcy52aWV3cG9ydC50bywgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHRoaXMuc3RhdGUuZG9jKSwgMCwgMCwgYmxvY2sgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydExpbmVzLnB1c2goc2NhbGVCbG9jayhibG9jaywgdGhpcy5zY2FsZXIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUsIHNjcm9sbFRhcmdldCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHVwZGF0ZS5zdGF0ZTtcbiAgICAgICAgbGV0IHByZXZEZWNvID0gdGhpcy5zdGF0ZURlY287XG4gICAgICAgIHRoaXMuc3RhdGVEZWNvID0gdGhpcy5zdGF0ZS5mYWNldChkZWNvcmF0aW9ucykuZmlsdGVyKGQgPT4gdHlwZW9mIGQgIT0gXCJmdW5jdGlvblwiKTtcbiAgICAgICAgbGV0IGNvbnRlbnRDaGFuZ2VzID0gdXBkYXRlLmNoYW5nZWRSYW5nZXM7XG4gICAgICAgIGxldCBoZWlnaHRDaGFuZ2VzID0gQ2hhbmdlZFJhbmdlLmV4dGVuZFdpdGhSYW5nZXMoY29udGVudENoYW5nZXMsIGhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMocHJldkRlY28sIHRoaXMuc3RhdGVEZWNvLCB1cGRhdGUgPyB1cGRhdGUuY2hhbmdlcyA6IENoYW5nZVNldC5lbXB0eSh0aGlzLnN0YXRlLmRvYy5sZW5ndGgpKSk7XG4gICAgICAgIGxldCBwcmV2SGVpZ2h0ID0gdGhpcy5oZWlnaHRNYXAuaGVpZ2h0O1xuICAgICAgICBsZXQgc2Nyb2xsQW5jaG9yID0gdGhpcy5zY3JvbGxlZFRvQm90dG9tID8gbnVsbCA6IHRoaXMuc2Nyb2xsQW5jaG9yQXQodGhpcy5zY3JvbGxUb3ApO1xuICAgICAgICBjbGVhckhlaWdodENoYW5nZUZsYWcoKTtcbiAgICAgICAgdGhpcy5oZWlnaHRNYXAgPSB0aGlzLmhlaWdodE1hcC5hcHBseUNoYW5nZXModGhpcy5zdGF0ZURlY28sIHVwZGF0ZS5zdGFydFN0YXRlLmRvYywgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHRoaXMuc3RhdGUuZG9jKSwgaGVpZ2h0Q2hhbmdlcyk7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodE1hcC5oZWlnaHQgIT0gcHJldkhlaWdodCB8fCBoZWlnaHRDaGFuZ2VGbGFnKVxuICAgICAgICAgICAgdXBkYXRlLmZsYWdzIHw9IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgICAgIGlmIChzY3JvbGxBbmNob3IpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9yUG9zID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHNjcm9sbEFuY2hvci5mcm9tLCAtMSk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IHNjcm9sbEFuY2hvci50b3A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IC0xO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSBwcmV2SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGxldCB2aWV3cG9ydCA9IGhlaWdodENoYW5nZXMubGVuZ3RoID8gdGhpcy5tYXBWaWV3cG9ydCh0aGlzLnZpZXdwb3J0LCB1cGRhdGUuY2hhbmdlcykgOiB0aGlzLnZpZXdwb3J0O1xuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0ICYmIChzY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA8IHZpZXdwb3J0LmZyb20gfHwgc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPiB2aWV3cG9ydC50bykgfHxcbiAgICAgICAgICAgICF0aGlzLnZpZXdwb3J0SXNBcHByb3ByaWF0ZSh2aWV3cG9ydCkpXG4gICAgICAgICAgICB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoMCwgc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgbGV0IHZpZXdwb3J0Q2hhbmdlID0gdmlld3BvcnQuZnJvbSAhPSB0aGlzLnZpZXdwb3J0LmZyb20gfHwgdmlld3BvcnQudG8gIT0gdGhpcy52aWV3cG9ydC50bztcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpO1xuICAgICAgICBpZiAodmlld3BvcnRDaGFuZ2UgfHwgIXVwZGF0ZS5jaGFuZ2VzLmVtcHR5IHx8ICh1cGRhdGUuZmxhZ3MgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICBpZiAodGhpcy5saW5lR2Fwcy5sZW5ndGggfHwgdGhpcy52aWV3cG9ydC50byAtIHRoaXMudmlld3BvcnQuZnJvbSA+ICgyMDAwIC8qIExHLk1hcmdpbiAqLyA8PCAxKSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGluZUdhcHModGhpcy5lbnN1cmVMaW5lR2Fwcyh0aGlzLm1hcExpbmVHYXBzKHRoaXMubGluZUdhcHMsIHVwZGF0ZS5jaGFuZ2VzKSkpO1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcyh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIGlmIChzY3JvbGxUYXJnZXQpXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IHNjcm9sbFRhcmdldDtcbiAgICAgICAgaWYgKCF0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgJiYgdXBkYXRlLnNlbGVjdGlvblNldCAmJiB1cGRhdGUudmlldy5saW5lV3JhcHBpbmcgJiZcbiAgICAgICAgICAgIHVwZGF0ZS5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5lbXB0eSAmJiB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uYXNzb2MgJiZcbiAgICAgICAgICAgICF1cGRhdGUuc3RhdGUuZmFjZXQobmF0aXZlU2VsZWN0aW9uSGlkZGVuKSlcbiAgICAgICAgICAgIHRoaXMubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyA9IHRydWU7XG4gICAgfVxuICAgIG1lYXN1cmUodmlldykge1xuICAgICAgICBsZXQgZG9tID0gdmlldy5jb250ZW50RE9NLCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbSk7XG4gICAgICAgIGxldCBvcmFjbGUgPSB0aGlzLmhlaWdodE9yYWNsZTtcbiAgICAgICAgbGV0IHdoaXRlU3BhY2UgPSBzdHlsZS53aGl0ZVNwYWNlO1xuICAgICAgICB0aGlzLmRlZmF1bHRUZXh0RGlyZWN0aW9uID0gc3R5bGUuZGlyZWN0aW9uID09IFwicnRsXCIgPyBEaXJlY3Rpb24uUlRMIDogRGlyZWN0aW9uLkxUUjtcbiAgICAgICAgbGV0IHJlZnJlc2ggPSB0aGlzLmhlaWdodE9yYWNsZS5tdXN0UmVmcmVzaEZvcldyYXBwaW5nKHdoaXRlU3BhY2UpO1xuICAgICAgICBsZXQgZG9tUmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IG1lYXN1cmVDb250ZW50ID0gcmVmcmVzaCB8fCB0aGlzLm11c3RNZWFzdXJlQ29udGVudCB8fCB0aGlzLmNvbnRlbnRET01IZWlnaHQgIT0gZG9tUmVjdC5oZWlnaHQ7XG4gICAgICAgIHRoaXMuY29udGVudERPTUhlaWdodCA9IGRvbVJlY3QuaGVpZ2h0O1xuICAgICAgICB0aGlzLm11c3RNZWFzdXJlQ29udGVudCA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVzdWx0ID0gMCwgYmlhcyA9IDA7XG4gICAgICAgIGlmIChkb21SZWN0LndpZHRoICYmIGRvbVJlY3QuaGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgeyBzY2FsZVgsIHNjYWxlWSB9ID0gZ2V0U2NhbGUoZG9tLCBkb21SZWN0KTtcbiAgICAgICAgICAgIGlmIChzY2FsZVggPiAuMDA1ICYmIE1hdGguYWJzKHRoaXMuc2NhbGVYIC0gc2NhbGVYKSA+IC4wMDUgfHxcbiAgICAgICAgICAgICAgICBzY2FsZVkgPiAuMDA1ICYmIE1hdGguYWJzKHRoaXMuc2NhbGVZIC0gc2NhbGVZKSA+IC4wMDUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHNjYWxlWDtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWSA9IHNjYWxlWTtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gMTYgLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgICAgICAgICByZWZyZXNoID0gbWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgbGV0IHBhZGRpbmdUb3AgPSAocGFyc2VJbnQoc3R5bGUucGFkZGluZ1RvcCkgfHwgMCkgKiB0aGlzLnNjYWxlWTtcbiAgICAgICAgbGV0IHBhZGRpbmdCb3R0b20gPSAocGFyc2VJbnQoc3R5bGUucGFkZGluZ0JvdHRvbSkgfHwgMCkgKiB0aGlzLnNjYWxlWTtcbiAgICAgICAgaWYgKHRoaXMucGFkZGluZ1RvcCAhPSBwYWRkaW5nVG9wIHx8IHRoaXMucGFkZGluZ0JvdHRvbSAhPSBwYWRkaW5nQm90dG9tKSB7XG4gICAgICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSBwYWRkaW5nVG9wO1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nQm90dG9tID0gcGFkZGluZ0JvdHRvbTtcbiAgICAgICAgICAgIHJlc3VsdCB8PSAxNiAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovIHwgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lZGl0b3JXaWR0aCAhPSB2aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICAgICAgbWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JXaWR0aCA9IHZpZXcuc2Nyb2xsRE9NLmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgcmVzdWx0IHw9IDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjcm9sbFRvcCA9IHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUb3AgIT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxlZFRvQm90dG9tID0gaXNTY3JvbGxlZFRvQm90dG9tKHZpZXcuc2Nyb2xsRE9NKTtcbiAgICAgICAgLy8gUGl4ZWwgdmlld3BvcnRcbiAgICAgICAgbGV0IHBpeGVsVmlld3BvcnQgPSAodGhpcy5wcmludGluZyA/IGZ1bGxQaXhlbFJhbmdlIDogdmlzaWJsZVBpeGVsUmFuZ2UpKGRvbSwgdGhpcy5wYWRkaW5nVG9wKTtcbiAgICAgICAgbGV0IGRUb3AgPSBwaXhlbFZpZXdwb3J0LnRvcCAtIHRoaXMucGl4ZWxWaWV3cG9ydC50b3AsIGRCb3R0b20gPSBwaXhlbFZpZXdwb3J0LmJvdHRvbSAtIHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b207XG4gICAgICAgIHRoaXMucGl4ZWxWaWV3cG9ydCA9IHBpeGVsVmlld3BvcnQ7XG4gICAgICAgIGxldCBpblZpZXcgPSB0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tID4gdGhpcy5waXhlbFZpZXdwb3J0LnRvcCAmJiB0aGlzLnBpeGVsVmlld3BvcnQucmlnaHQgPiB0aGlzLnBpeGVsVmlld3BvcnQubGVmdDtcbiAgICAgICAgaWYgKGluVmlldyAhPSB0aGlzLmluVmlldykge1xuICAgICAgICAgICAgdGhpcy5pblZpZXcgPSBpblZpZXc7XG4gICAgICAgICAgICBpZiAoaW5WaWV3KVxuICAgICAgICAgICAgICAgIG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaW5WaWV3ICYmICF0aGlzLnNjcm9sbFRhcmdldCAmJiAhaW5XaW5kb3codmlldy5kb20pKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBjb250ZW50V2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NV2lkdGggIT0gY29udGVudFdpZHRoIHx8IHRoaXMuZWRpdG9ySGVpZ2h0ICE9IHZpZXcuc2Nyb2xsRE9NLmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RE9NV2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JIZWlnaHQgPSB2aWV3LnNjcm9sbERPTS5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICByZXN1bHQgfD0gMTYgLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVhc3VyZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lSGVpZ2h0cyA9IHZpZXcuZG9jVmlldy5tZWFzdXJlVmlzaWJsZUxpbmVIZWlnaHRzKHRoaXMudmlld3BvcnQpO1xuICAgICAgICAgICAgaWYgKG9yYWNsZS5tdXN0UmVmcmVzaEZvckhlaWdodHMobGluZUhlaWdodHMpKVxuICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJlZnJlc2ggfHwgb3JhY2xlLmxpbmVXcmFwcGluZyAmJiBNYXRoLmFicyhjb250ZW50V2lkdGggLSB0aGlzLmNvbnRlbnRET01XaWR0aCkgPiBvcmFjbGUuY2hhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0IH0gPSB2aWV3LmRvY1ZpZXcubWVhc3VyZVRleHRTaXplKCk7XG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IGxpbmVIZWlnaHQgPiAwICYmIG9yYWNsZS5yZWZyZXNoKHdoaXRlU3BhY2UsIGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCwgY29udGVudFdpZHRoIC8gY2hhcldpZHRoLCBsaW5lSGVpZ2h0cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kb2NWaWV3Lm1pbldpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRUb3AgPiAwICYmIGRCb3R0b20gPiAwKVxuICAgICAgICAgICAgICAgIGJpYXMgPSBNYXRoLm1heChkVG9wLCBkQm90dG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRUb3AgPCAwICYmIGRCb3R0b20gPCAwKVxuICAgICAgICAgICAgICAgIGJpYXMgPSBNYXRoLm1pbihkVG9wLCBkQm90dG9tKTtcbiAgICAgICAgICAgIGNsZWFySGVpZ2h0Q2hhbmdlRmxhZygpO1xuICAgICAgICAgICAgZm9yIChsZXQgdnAgb2YgdGhpcy52aWV3cG9ydHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0cyA9IHZwLmZyb20gPT0gdGhpcy52aWV3cG9ydC5mcm9tID8gbGluZUhlaWdodHMgOiB2aWV3LmRvY1ZpZXcubWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh2cCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNYXAgPSAocmVmcmVzaCA/IEhlaWdodE1hcC5lbXB0eSgpLmFwcGx5Q2hhbmdlcyh0aGlzLnN0YXRlRGVjbywgVGV4dC5lbXB0eSwgdGhpcy5oZWlnaHRPcmFjbGUsIFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCldKSA6IHRoaXMuaGVpZ2h0TWFwKS51cGRhdGVIZWlnaHQob3JhY2xlLCAwLCByZWZyZXNoLCBuZXcgTWVhc3VyZWRIZWlnaHRzKHZwLmZyb20sIGhlaWdodHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWlnaHRDaGFuZ2VGbGFnKVxuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2aWV3cG9ydENoYW5nZSA9ICF0aGlzLnZpZXdwb3J0SXNBcHByb3ByaWF0ZSh0aGlzLnZpZXdwb3J0LCBiaWFzKSB8fFxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQgJiYgKHRoaXMuc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPCB0aGlzLnZpZXdwb3J0LmZyb20gfHxcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldC5yYW5nZS5oZWFkID4gdGhpcy52aWV3cG9ydC50byk7XG4gICAgICAgIGlmICh2aWV3cG9ydENoYW5nZSkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAmIDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pXG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IHRoaXMudXBkYXRlU2NhbGVyKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5nZXRWaWV3cG9ydChiaWFzLCB0aGlzLnNjcm9sbFRhcmdldCk7XG4gICAgICAgICAgICByZXN1bHQgfD0gdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocmVzdWx0ICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgfHwgdmlld3BvcnRDaGFuZ2UpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoIHx8IHRoaXMudmlld3BvcnQudG8gLSB0aGlzLnZpZXdwb3J0LmZyb20gPiAoMjAwMCAvKiBMRy5NYXJnaW4gKi8gPDwgMSkpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmVHYXBzKHRoaXMuZW5zdXJlTGluZUdhcHMocmVmcmVzaCA/IFtdIDogdGhpcy5saW5lR2FwcywgdmlldykpO1xuICAgICAgICByZXN1bHQgfD0gdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jKSB7XG4gICAgICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBpbiB0aGUgcmVhZCBzdGFnZSwgYmVjYXVzZSBtb3ZpbmcgdGhlIHNlbGVjdGlvblxuICAgICAgICAgICAgLy8gdG8gYSBsaW5lIGVuZCBpcyBnb2luZyB0byB0cmlnZ2VyIGEgbGF5b3V0IGFueXdheSwgc28gaXRcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGEgcHVyZSB3cml0ZS4gSXQgc2hvdWxkIGJlIHJhcmUgdGhhdCBpdCBkb2VzIGFueVxuICAgICAgICAgICAgLy8gd3JpdGluZy5cbiAgICAgICAgICAgIHZpZXcuZG9jVmlldy5lbmZvcmNlQ3Vyc29yQXNzb2MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXQgdmlzaWJsZVRvcCgpIHsgcmV0dXJuIHRoaXMuc2NhbGVyLmZyb21ET00odGhpcy5waXhlbFZpZXdwb3J0LnRvcCk7IH1cbiAgICBnZXQgdmlzaWJsZUJvdHRvbSgpIHsgcmV0dXJuIHRoaXMuc2NhbGVyLmZyb21ET00odGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbSk7IH1cbiAgICBnZXRWaWV3cG9ydChiaWFzLCBzY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGRpdmlkZSBWUC5NYXJnaW4gYmV0d2VlbiB0aGUgdG9wIGFuZCB0aGVcbiAgICAgICAgLy8gYm90dG9tLCBkZXBlbmRpbmcgb24gdGhlIGJpYXMgKHRoZSBjaGFuZ2UgaW4gdmlld3BvcnQgcG9zaXRpb25cbiAgICAgICAgLy8gc2luY2UgdGhlIGxhc3QgdXBkYXRlKS4gSXQnbGwgaG9sZCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDFcbiAgICAgICAgbGV0IG1hcmdpblRvcCA9IDAuNSAtIE1hdGgubWF4KC0wLjUsIE1hdGgubWluKDAuNSwgYmlhcyAvIDEwMDAgLyogVlAuTWFyZ2luICovIC8gMikpO1xuICAgICAgICBsZXQgbWFwID0gdGhpcy5oZWlnaHRNYXAsIG9yYWNsZSA9IHRoaXMuaGVpZ2h0T3JhY2xlO1xuICAgICAgICBsZXQgeyB2aXNpYmxlVG9wLCB2aXNpYmxlQm90dG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQobWFwLmxpbmVBdCh2aXNpYmxlVG9wIC0gbWFyZ2luVG9wICogMTAwMCAvKiBWUC5NYXJnaW4gKi8sIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS5mcm9tLCBtYXAubGluZUF0KHZpc2libGVCb3R0b20gKyAoMSAtIG1hcmdpblRvcCkgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLywgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLnRvKTtcbiAgICAgICAgLy8gSWYgc2Nyb2xsVGFyZ2V0IGlzIGdpdmVuLCBtYWtlIHN1cmUgdGhlIHZpZXdwb3J0IGluY2x1ZGVzIHRoYXQgcG9zaXRpb25cbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldCkge1xuICAgICAgICAgICAgbGV0IHsgaGVhZCB9ID0gc2Nyb2xsVGFyZ2V0LnJhbmdlO1xuICAgICAgICAgICAgaWYgKGhlYWQgPCB2aWV3cG9ydC5mcm9tIHx8IGhlYWQgPiB2aWV3cG9ydC50bykge1xuICAgICAgICAgICAgICAgIGxldCB2aWV3SGVpZ2h0ID0gTWF0aC5taW4odGhpcy5lZGl0b3JIZWlnaHQsIHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b20gLSB0aGlzLnBpeGVsVmlld3BvcnQudG9wKTtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSBtYXAubGluZUF0KGhlYWQsIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKSwgdG9wUG9zO1xuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxUYXJnZXQueSA9PSBcImNlbnRlclwiKVxuICAgICAgICAgICAgICAgICAgICB0b3BQb3MgPSAoYmxvY2sudG9wICsgYmxvY2suYm90dG9tKSAvIDIgLSB2aWV3SGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY3JvbGxUYXJnZXQueSA9PSBcInN0YXJ0XCIgfHwgc2Nyb2xsVGFyZ2V0LnkgPT0gXCJuZWFyZXN0XCIgJiYgaGVhZCA8IHZpZXdwb3J0LmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IGJsb2NrLnRvcDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IGJsb2NrLmJvdHRvbSAtIHZpZXdIZWlnaHQ7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQobWFwLmxpbmVBdCh0b3BQb3MgLSAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIsIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS5mcm9tLCBtYXAubGluZUF0KHRvcFBvcyArIHZpZXdIZWlnaHQgKyAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIsIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS50byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdwb3J0O1xuICAgIH1cbiAgICBtYXBWaWV3cG9ydCh2aWV3cG9ydCwgY2hhbmdlcykge1xuICAgICAgICBsZXQgZnJvbSA9IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LmZyb20sIC0xKSwgdG8gPSBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC50bywgMSk7XG4gICAgICAgIHJldHVybiBuZXcgVmlld3BvcnQodGhpcy5oZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLmZyb20sIHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCkudG8pO1xuICAgIH1cbiAgICAvLyBDaGVja3MgaWYgYSBnaXZlbiB2aWV3cG9ydCBjb3ZlcnMgdGhlIHZpc2libGUgcGFydCBvZiB0aGVcbiAgICAvLyBkb2N1bWVudCBhbmQgbm90IHRvbyBtdWNoIGJleW9uZCB0aGF0LlxuICAgIHZpZXdwb3J0SXNBcHByb3ByaWF0ZSh7IGZyb20sIHRvIH0sIGJpYXMgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5pblZpZXcpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHsgdG9wIH0gPSB0aGlzLmhlaWdodE1hcC5saW5lQXQoZnJvbSwgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCk7XG4gICAgICAgIGxldCB7IGJvdHRvbSB9ID0gdGhpcy5oZWlnaHRNYXAubGluZUF0KHRvLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKTtcbiAgICAgICAgbGV0IHsgdmlzaWJsZVRvcCwgdmlzaWJsZUJvdHRvbSB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChmcm9tID09IDAgfHwgdG9wIDw9IHZpc2libGVUb3AgLSBNYXRoLm1heCgxMCAvKiBWUC5NaW5Db3Zlck1hcmdpbiAqLywgTWF0aC5taW4oLWJpYXMsIDI1MCAvKiBWUC5NYXhDb3Zlck1hcmdpbiAqLykpKSAmJlxuICAgICAgICAgICAgKHRvID09IHRoaXMuc3RhdGUuZG9jLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIGJvdHRvbSA+PSB2aXNpYmxlQm90dG9tICsgTWF0aC5tYXgoMTAgLyogVlAuTWluQ292ZXJNYXJnaW4gKi8sIE1hdGgubWluKGJpYXMsIDI1MCAvKiBWUC5NYXhDb3Zlck1hcmdpbiAqLykpKSAmJlxuICAgICAgICAgICAgKHRvcCA+IHZpc2libGVUb3AgLSAyICogMTAwMCAvKiBWUC5NYXJnaW4gKi8gJiYgYm90dG9tIDwgdmlzaWJsZUJvdHRvbSArIDIgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLyk7XG4gICAgfVxuICAgIG1hcExpbmVHYXBzKGdhcHMsIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKCFnYXBzLmxlbmd0aCB8fCBjaGFuZ2VzLmVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIGdhcHM7XG4gICAgICAgIGxldCBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZ2FwIG9mIGdhcHMpXG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMudG91Y2hlc1JhbmdlKGdhcC5mcm9tLCBnYXAudG8pKVxuICAgICAgICAgICAgICAgIG1hcHBlZC5wdXNoKG5ldyBMaW5lR2FwKGNoYW5nZXMubWFwUG9zKGdhcC5mcm9tKSwgY2hhbmdlcy5tYXBQb3MoZ2FwLnRvKSwgZ2FwLnNpemUsIGdhcC5kaXNwbGF5U2l6ZSkpO1xuICAgICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgICAvLyBDb21wdXRlcyBwb3NpdGlvbnMgaW4gdGhlIHZpZXdwb3J0IHdoZXJlIHRoZSBzdGFydCBvciBlbmQgb2YgYVxuICAgIC8vIGxpbmUgc2hvdWxkIGJlIGhpZGRlbiwgdHJ5aW5nIHRvIHJldXNlIGV4aXN0aW5nIGxpbmUgZ2FwcyB3aGVuXG4gICAgLy8gYXBwcm9wcmlhdGUgdG8gYXZvaWQgdW5uZWNjZXNhcnkgcmVkcmF3cy5cbiAgICAvLyBVc2VzIGNydWRlIGNoYXJhY3Rlci1jb3VudGluZyBmb3IgdGhlIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcsXG4gICAgLy8gc2luY2UgYWN0dWFsIERPTSBjb29yZGluYXRlcyBhcmVuJ3QgYWx3YXlzIGF2YWlsYWJsZSBhbmRcbiAgICAvLyBwcmVkaWN0YWJsZS4gUmVsaWVzIG9uIGdlbmVyb3VzIG1hcmdpbnMgKHNlZSBMRy5NYXJnaW4pIHRvIGhpZGVcbiAgICAvLyB0aGUgYXJ0aWZhY3RzIHRoaXMgbWlnaHQgcHJvZHVjZSBmcm9tIHRoZSB1c2VyLlxuICAgIGVuc3VyZUxpbmVHYXBzKGN1cnJlbnQsIG1heU1lYXN1cmUpIHtcbiAgICAgICAgbGV0IHdyYXBwaW5nID0gdGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nO1xuICAgICAgICBsZXQgbWFyZ2luID0gd3JhcHBpbmcgPyAxMDAwMCAvKiBMRy5NYXJnaW5XcmFwICovIDogMjAwMCAvKiBMRy5NYXJnaW4gKi8sIGhhbGZNYXJnaW4gPSBtYXJnaW4gPj4gMSwgZG91YmxlTWFyZ2luID0gbWFyZ2luIDw8IDE7XG4gICAgICAgIC8vIFRoZSBub24td3JhcHBpbmcgbG9naWMgd29uJ3Qgd29yayBhdCBhbGwgaW4gcHJlZG9taW5hbnRseSByaWdodC10by1sZWZ0IHRleHQuXG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgJiYgIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgZ2FwcyA9IFtdO1xuICAgICAgICBsZXQgYWRkR2FwID0gKGZyb20sIHRvLCBsaW5lLCBzdHJ1Y3R1cmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0byAtIGZyb20gPCBoYWxmTWFyZ2luKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBzZWwgPSB0aGlzLnN0YXRlLnNlbGVjdGlvbi5tYWluLCBhdm9pZCA9IFtzZWwuZnJvbV07XG4gICAgICAgICAgICBpZiAoIXNlbC5lbXB0eSlcbiAgICAgICAgICAgICAgICBhdm9pZC5wdXNoKHNlbC50byk7XG4gICAgICAgICAgICBmb3IgKGxldCBwb3Mgb2YgYXZvaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBwb3MgPCB0bykge1xuICAgICAgICAgICAgICAgICAgICBhZGRHYXAoZnJvbSwgcG9zIC0gMTAgLyogTEcuU2VsZWN0aW9uTWFyZ2luICovLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgICAgICAgICBhZGRHYXAocG9zICsgMTAgLyogTEcuU2VsZWN0aW9uTWFyZ2luICovLCB0bywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBnYXAgPSBmaW5kKGN1cnJlbnQsIGdhcCA9PiBnYXAuZnJvbSA+PSBsaW5lLmZyb20gJiYgZ2FwLnRvIDw9IGxpbmUudG8gJiZcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhnYXAuZnJvbSAtIGZyb20pIDwgaGFsZk1hcmdpbiAmJiBNYXRoLmFicyhnYXAudG8gLSB0bykgPCBoYWxmTWFyZ2luICYmXG4gICAgICAgICAgICAgICAgIWF2b2lkLnNvbWUocG9zID0+IGdhcC5mcm9tIDwgcG9zICYmIGdhcC50byA+IHBvcykpO1xuICAgICAgICAgICAgaWYgKCFnYXApIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHNjcm9sbGluZyBkb3duLCBzbmFwIGdhcCBlbmRzIHRvIGxpbmUgc3RhcnRzIHRvIGF2b2lkIHNoaWZ0cyBpbiB3cmFwcGluZ1xuICAgICAgICAgICAgICAgIGlmICh0byA8IGxpbmUudG8gJiYgbWF5TWVhc3VyZSAmJiB3cmFwcGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBtYXlNZWFzdXJlLnZpc2libGVSYW5nZXMuc29tZShyID0+IHIuZnJvbSA8PSB0byAmJiByLnRvID49IHRvKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZVN0YXJ0ID0gbWF5TWVhc3VyZS5tb3ZlVG9MaW5lQm91bmRhcnkoRWRpdG9yU2VsZWN0aW9uLmN1cnNvcih0byksIGZhbHNlLCB0cnVlKS5oZWFkO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZVN0YXJ0ID4gZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gbGluZVN0YXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuZ2FwU2l6ZShsaW5lLCBmcm9tLCB0bywgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICBsZXQgZGlzcGxheVNpemUgPSB3cmFwcGluZyB8fCBzaXplIDwgMjAwMDAwMCAvKiBWUC5NYXhIb3JpekdhcCAqLyA/IHNpemUgOiAyMDAwMDAwIC8qIFZQLk1heEhvcml6R2FwICovO1xuICAgICAgICAgICAgICAgIGdhcCA9IG5ldyBMaW5lR2FwKGZyb20sIHRvLCBzaXplLCBkaXNwbGF5U2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnYXBzLnB1c2goZ2FwKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGNoZWNrTGluZSA9IChsaW5lKSA9PiB7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPCBkb3VibGVNYXJnaW4gfHwgbGluZS50eXBlICE9IEJsb2NrVHlwZS5UZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBzdHJ1Y3R1cmUgPSBsaW5lU3RydWN0dXJlKGxpbmUuZnJvbSwgbGluZS50bywgdGhpcy5zdGF0ZURlY28pO1xuICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS50b3RhbCA8IGRvdWJsZU1hcmdpbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5zY3JvbGxUYXJnZXQgPyB0aGlzLnNjcm9sbFRhcmdldC5yYW5nZS5oZWFkIDogbnVsbDtcbiAgICAgICAgICAgIGxldCB2aWV3RnJvbSwgdmlld1RvO1xuICAgICAgICAgICAgaWYgKHdyYXBwaW5nKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmdpbkhlaWdodCA9IChtYXJnaW4gLyB0aGlzLmhlaWdodE9yYWNsZS5saW5lTGVuZ3RoKSAqIHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvcCwgYm90O1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0RnJhYyA9IGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZUZyYWMgPSAoKHRoaXMudmlzaWJsZUJvdHRvbSAtIHRoaXMudmlzaWJsZVRvcCkgLyAyICsgbWFyZ2luSGVpZ2h0KSAvIGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSB0YXJnZXRGcmFjIC0gc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgICAgICBib3QgPSB0YXJnZXRGcmFjICsgc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gKHRoaXMudmlzaWJsZVRvcCAtIGxpbmUudG9wIC0gbWFyZ2luSGVpZ2h0KSAvIGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBib3QgPSAodGhpcy52aXNpYmxlQm90dG9tIC0gbGluZS50b3AgKyBtYXJnaW5IZWlnaHQpIC8gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpZXdGcm9tID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgdG9wKTtcbiAgICAgICAgICAgICAgICB2aWV3VG8gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCBib3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsV2lkdGggPSBzdHJ1Y3R1cmUudG90YWwgKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGg7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmdpbldpZHRoID0gbWFyZ2luICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoO1xuICAgICAgICAgICAgICAgIGxldCBob3Jpek9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHRvdGFsV2lkdGggPiAyMDAwMDAwIC8qIFZQLk1heEhvcml6R2FwICovKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBvbGQgb2YgY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZC5mcm9tID49IGxpbmUuZnJvbSAmJiBvbGQuZnJvbSA8IGxpbmUudG8gJiYgb2xkLnNpemUgIT0gb2xkLmRpc3BsYXlTaXplICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmZyb20gKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGggKyBob3Jpek9mZnNldCA8IHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6T2Zmc2V0ID0gb2xkLnNpemUgLSBvbGQuZGlzcGxheVNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcHhMZWZ0ID0gdGhpcy5waXhlbFZpZXdwb3J0LmxlZnQgKyBob3Jpek9mZnNldCwgcHhSaWdodCA9IHRoaXMucGl4ZWxWaWV3cG9ydC5yaWdodCArIGhvcml6T2Zmc2V0O1xuICAgICAgICAgICAgICAgIGxldCBsZWZ0LCByaWdodDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldEZyYWMgPSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VGcmFjID0gKChweFJpZ2h0IC0gcHhMZWZ0KSAvIDIgKyBtYXJnaW5XaWR0aCkgLyB0b3RhbFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gdGFyZ2V0RnJhYyAtIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0YXJnZXRGcmFjICsgc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IChweExlZnQgLSBtYXJnaW5XaWR0aCkgLyB0b3RhbFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICByaWdodCA9IChweFJpZ2h0ICsgbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmlld0Zyb20gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCBsZWZ0KTtcbiAgICAgICAgICAgICAgICB2aWV3VG8gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCByaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlld0Zyb20gPiBsaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgYWRkR2FwKGxpbmUuZnJvbSwgdmlld0Zyb20sIGxpbmUsIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICBpZiAodmlld1RvIDwgbGluZS50bylcbiAgICAgICAgICAgICAgICBhZGRHYXAodmlld1RvLCBsaW5lLnRvLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudmlld3BvcnRMaW5lcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS50eXBlKSlcbiAgICAgICAgICAgICAgICBsaW5lLnR5cGUuZm9yRWFjaChjaGVja0xpbmUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNoZWNrTGluZShsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2FwcztcbiAgICB9XG4gICAgZ2FwU2l6ZShsaW5lLCBmcm9tLCB0bywgc3RydWN0dXJlKSB7XG4gICAgICAgIGxldCBmcmFjdGlvbiA9IGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHRvKSAtIGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIGZyb20pO1xuICAgICAgICBpZiAodGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS5oZWlnaHQgKiBmcmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3R1cmUudG90YWwgKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGggKiBmcmFjdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVMaW5lR2FwcyhnYXBzKSB7XG4gICAgICAgIGlmICghTGluZUdhcC5zYW1lKGdhcHMsIHRoaXMubGluZUdhcHMpKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVHYXBzID0gZ2FwcztcbiAgICAgICAgICAgIHRoaXMubGluZUdhcERlY28gPSBEZWNvcmF0aW9uLnNldChnYXBzLm1hcChnYXAgPT4gZ2FwLmRyYXcodGhpcywgdGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXB1dGVWaXNpYmxlUmFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgbGV0IGRlY28gPSB0aGlzLnN0YXRlRGVjbztcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoKVxuICAgICAgICAgICAgZGVjbyA9IGRlY28uY29uY2F0KHRoaXMubGluZUdhcERlY28pO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIFJhbmdlU2V0LnNwYW5zKGRlY28sIHRoaXMudmlld3BvcnQuZnJvbSwgdGhpcy52aWV3cG9ydC50bywge1xuICAgICAgICAgICAgc3Bhbihmcm9tLCB0bykgeyByYW5nZXMucHVzaCh7IGZyb20sIHRvIH0pOyB9LFxuICAgICAgICAgICAgcG9pbnQoKSB7IH1cbiAgICAgICAgfSwgMjApO1xuICAgICAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgICAgIGlmIChyYW5nZXMubGVuZ3RoICE9IHRoaXMudmlzaWJsZVJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSA4IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnRNb3ZlZCAqLyB8IDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aCAmJiAhKGNoYW5nZWQgJiA4IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnRNb3ZlZCAqLyk7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLnZpc2libGVSYW5nZXNbaV0sIG53ID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvbGQuZnJvbSAhPSBudy5mcm9tIHx8IG9sZC50byAhPSBudy50bykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hhbmdlcyAmJiBjaGFuZ2VzLm1hcFBvcyhvbGQuZnJvbSwgLTEpID09IG53LmZyb20gJiYgY2hhbmdlcy5tYXBQb3Mob2xkLnRvLCAxKSA9PSBudy50bykpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IDggLyogVXBkYXRlRmxhZy5WaWV3cG9ydE1vdmVkICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbiAgICBsaW5lQmxvY2tBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIChwb3MgPj0gdGhpcy52aWV3cG9ydC5mcm9tICYmIHBvcyA8PSB0aGlzLnZpZXdwb3J0LnRvICYmXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0TGluZXMuZmluZChiID0+IGIuZnJvbSA8PSBwb3MgJiYgYi50byA+PSBwb3MpKSB8fFxuICAgICAgICAgICAgc2NhbGVCbG9jayh0aGlzLmhlaWdodE1hcC5saW5lQXQocG9zLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKSwgdGhpcy5zY2FsZXIpO1xuICAgIH1cbiAgICBsaW5lQmxvY2tBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIChoZWlnaHQgPj0gdGhpcy52aWV3cG9ydExpbmVzWzBdLnRvcCAmJiBoZWlnaHQgPD0gdGhpcy52aWV3cG9ydExpbmVzW3RoaXMudmlld3BvcnRMaW5lcy5sZW5ndGggLSAxXS5ib3R0b20gJiZcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRMaW5lcy5maW5kKGwgPT4gbC50b3AgPD0gaGVpZ2h0ICYmIGwuYm90dG9tID49IGhlaWdodCkpIHx8XG4gICAgICAgICAgICBzY2FsZUJsb2NrKHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0aGlzLnNjYWxlci5mcm9tRE9NKGhlaWdodCksIFF1ZXJ5VHlwZS5CeUhlaWdodCwgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLCB0aGlzLnNjYWxlcik7XG4gICAgfVxuICAgIHNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCkge1xuICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLmxpbmVCbG9ja0F0SGVpZ2h0KHNjcm9sbFRvcCArIDgpO1xuICAgICAgICByZXR1cm4gYmxvY2suZnJvbSA+PSB0aGlzLnZpZXdwb3J0LmZyb20gfHwgdGhpcy52aWV3cG9ydExpbmVzWzBdLnRvcCAtIHNjcm9sbFRvcCA+IDIwMCA/IGJsb2NrIDogdGhpcy52aWV3cG9ydExpbmVzWzBdO1xuICAgIH1cbiAgICBlbGVtZW50QXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBzY2FsZUJsb2NrKHRoaXMuaGVpZ2h0TWFwLmJsb2NrQXQodGhpcy5zY2FsZXIuZnJvbURPTShoZWlnaHQpLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgZ2V0IGRvY0hlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGVyLnRvRE9NKHRoaXMuaGVpZ2h0TWFwLmhlaWdodCk7XG4gICAgfVxuICAgIGdldCBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NIZWlnaHQgKyB0aGlzLnBhZGRpbmdUb3AgKyB0aGlzLnBhZGRpbmdCb3R0b207XG4gICAgfVxufVxuY2xhc3MgVmlld3BvcnQge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICB9XG59XG5mdW5jdGlvbiBsaW5lU3RydWN0dXJlKGZyb20sIHRvLCBzdGF0ZURlY28pIHtcbiAgICBsZXQgcmFuZ2VzID0gW10sIHBvcyA9IGZyb20sIHRvdGFsID0gMDtcbiAgICBSYW5nZVNldC5zcGFucyhzdGF0ZURlY28sIGZyb20sIHRvLCB7XG4gICAgICAgIHNwYW4oKSB7IH0sXG4gICAgICAgIHBvaW50KGZyb20sIHRvKSB7XG4gICAgICAgICAgICBpZiAoZnJvbSA+IHBvcykge1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogcG9zLCB0bzogZnJvbSB9KTtcbiAgICAgICAgICAgICAgICB0b3RhbCArPSBmcm9tIC0gcG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gdG87XG4gICAgICAgIH1cbiAgICB9LCAyMCk7IC8vIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb2xsYXBzZWQgcmFuZ2VzIG9mIGEgc2lnbmlmaWNhbnQgc2l6ZVxuICAgIGlmIChwb3MgPCB0bykge1xuICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IHBvcywgdG8gfSk7XG4gICAgICAgIHRvdGFsICs9IHRvIC0gcG9zO1xuICAgIH1cbiAgICByZXR1cm4geyB0b3RhbCwgcmFuZ2VzIH07XG59XG5mdW5jdGlvbiBmaW5kUG9zaXRpb24oeyB0b3RhbCwgcmFuZ2VzIH0sIHJhdGlvKSB7XG4gICAgaWYgKHJhdGlvIDw9IDApXG4gICAgICAgIHJldHVybiByYW5nZXNbMF0uZnJvbTtcbiAgICBpZiAocmF0aW8gPj0gMSlcbiAgICAgICAgcmV0dXJuIHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0udG87XG4gICAgbGV0IGRpc3QgPSBNYXRoLmZsb29yKHRvdGFsICogcmF0aW8pO1xuICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSByYW5nZXNbaV0sIHNpemUgPSB0byAtIGZyb207XG4gICAgICAgIGlmIChkaXN0IDw9IHNpemUpXG4gICAgICAgICAgICByZXR1cm4gZnJvbSArIGRpc3Q7XG4gICAgICAgIGRpc3QgLT0gc2l6ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCBwb3MpIHtcbiAgICBsZXQgY291bnRlZCA9IDA7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHN0cnVjdHVyZS5yYW5nZXMpIHtcbiAgICAgICAgaWYgKHBvcyA8PSB0bykge1xuICAgICAgICAgICAgY291bnRlZCArPSBwb3MgLSBmcm9tO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY291bnRlZCArPSB0byAtIGZyb207XG4gICAgfVxuICAgIHJldHVybiBjb3VudGVkIC8gc3RydWN0dXJlLnRvdGFsO1xufVxuZnVuY3Rpb24gZmluZChhcnJheSwgZikge1xuICAgIGZvciAobGV0IHZhbCBvZiBhcnJheSlcbiAgICAgICAgaWYgKGYodmFsKSlcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8vIERvbid0IHNjYWxlIHdoZW4gdGhlIGRvY3VtZW50IGhlaWdodCBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHdoYXRcbi8vIHRoZSBET00gY2FuIGhhbmRsZS5cbmNvbnN0IElkU2NhbGVyID0ge1xuICAgIHRvRE9NKG4pIHsgcmV0dXJuIG47IH0sXG4gICAgZnJvbURPTShuKSB7IHJldHVybiBuOyB9LFxuICAgIHNjYWxlOiAxLFxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlciA9PSB0aGlzOyB9XG59O1xuLy8gV2hlbiB0aGUgaGVpZ2h0IGlzIHRvbyBiaWcgKD4gVlAuTWF4RE9NSGVpZ2h0KSwgc2NhbGUgZG93biB0aGVcbi8vIHJlZ2lvbnMgb3V0c2lkZSB0aGUgdmlld3BvcnRzIHNvIHRoYXQgdGhlIHRvdGFsIGhlaWdodCBpc1xuLy8gVlAuTWF4RE9NSGVpZ2h0LlxuY2xhc3MgQmlnU2NhbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcmFjbGUsIGhlaWdodE1hcCwgdmlld3BvcnRzKSB7XG4gICAgICAgIGxldCB2cEhlaWdodCA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDtcbiAgICAgICAgdGhpcy52aWV3cG9ydHMgPSB2aWV3cG9ydHMubWFwKCh7IGZyb20sIHRvIH0pID0+IHtcbiAgICAgICAgICAgIGxldCB0b3AgPSBoZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKS50b3A7XG4gICAgICAgICAgICBsZXQgYm90dG9tID0gaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIDAsIDApLmJvdHRvbTtcbiAgICAgICAgICAgIHZwSGVpZ2h0ICs9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb20sIHRvLCB0b3AsIGJvdHRvbSwgZG9tVG9wOiAwLCBkb21Cb3R0b206IDAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAoNzAwMDAwMCAvKiBWUC5NYXhET01IZWlnaHQgKi8gLSB2cEhlaWdodCkgLyAoaGVpZ2h0TWFwLmhlaWdodCAtIHZwSGVpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgb2JqIG9mIHRoaXMudmlld3BvcnRzKSB7XG4gICAgICAgICAgICBvYmouZG9tVG9wID0gZG9tQmFzZSArIChvYmoudG9wIC0gYmFzZSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgZG9tQmFzZSA9IG9iai5kb21Cb3R0b20gPSBvYmouZG9tVG9wICsgKG9iai5ib3R0b20gLSBvYmoudG9wKTtcbiAgICAgICAgICAgIGJhc2UgPSBvYmouYm90dG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvRE9NKG4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZwID0gaSA8IHRoaXMudmlld3BvcnRzLmxlbmd0aCA/IHRoaXMudmlld3BvcnRzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdnAgfHwgbiA8IHZwLnRvcClcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQmFzZSArIChuIC0gYmFzZSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgaWYgKG4gPD0gdnAuYm90dG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB2cC5kb21Ub3AgKyAobiAtIHZwLnRvcCk7XG4gICAgICAgICAgICBiYXNlID0gdnAuYm90dG9tO1xuICAgICAgICAgICAgZG9tQmFzZSA9IHZwLmRvbUJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmcm9tRE9NKG4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZwID0gaSA8IHRoaXMudmlld3BvcnRzLmxlbmd0aCA/IHRoaXMudmlld3BvcnRzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdnAgfHwgbiA8IHZwLmRvbVRvcClcbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZSArIChuIC0gZG9tQmFzZSkgLyB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgaWYgKG4gPD0gdnAuZG9tQm90dG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB2cC50b3AgKyAobiAtIHZwLmRvbVRvcCk7XG4gICAgICAgICAgICBiYXNlID0gdnAuYm90dG9tO1xuICAgICAgICAgICAgZG9tQmFzZSA9IHZwLmRvbUJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEJpZ1NjYWxlcikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlID09IG90aGVyLnNjYWxlICYmIHRoaXMudmlld3BvcnRzLmxlbmd0aCA9PSBvdGhlci52aWV3cG9ydHMubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0cy5ldmVyeSgodnAsIGkpID0+IHZwLmZyb20gPT0gb3RoZXIudmlld3BvcnRzW2ldLmZyb20gJiYgdnAudG8gPT0gb3RoZXIudmlld3BvcnRzW2ldLnRvKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzY2FsZUJsb2NrKGJsb2NrLCBzY2FsZXIpIHtcbiAgICBpZiAoc2NhbGVyLnNjYWxlID09IDEpXG4gICAgICAgIHJldHVybiBibG9jaztcbiAgICBsZXQgYlRvcCA9IHNjYWxlci50b0RPTShibG9jay50b3ApLCBiQm90dG9tID0gc2NhbGVyLnRvRE9NKGJsb2NrLmJvdHRvbSk7XG4gICAgcmV0dXJuIG5ldyBCbG9ja0luZm8oYmxvY2suZnJvbSwgYmxvY2subGVuZ3RoLCBiVG9wLCBiQm90dG9tIC0gYlRvcCwgQXJyYXkuaXNBcnJheShibG9jay5fY29udGVudCkgPyBibG9jay5fY29udGVudC5tYXAoYiA9PiBzY2FsZUJsb2NrKGIsIHNjYWxlcikpIDogYmxvY2suX2NvbnRlbnQpO1xufVxuXG5jb25zdCB0aGVtZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiBzdHJzID0+IHN0cnMuam9pbihcIiBcIikgfSk7XG5jb25zdCBkYXJrVGhlbWUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5pbmRleE9mKHRydWUpID4gLTEgfSk7XG5jb25zdCBiYXNlVGhlbWVJRCA9IC8qQF9fUFVSRV9fKi9TdHlsZU1vZHVsZS5uZXdOYW1lKCksIGJhc2VMaWdodElEID0gLypAX19QVVJFX18qL1N0eWxlTW9kdWxlLm5ld05hbWUoKSwgYmFzZURhcmtJRCA9IC8qQF9fUFVSRV9fKi9TdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG5jb25zdCBsaWdodERhcmtJRHMgPSB7IFwiJmxpZ2h0XCI6IFwiLlwiICsgYmFzZUxpZ2h0SUQsIFwiJmRhcmtcIjogXCIuXCIgKyBiYXNlRGFya0lEIH07XG5mdW5jdGlvbiBidWlsZFRoZW1lKG1haW4sIHNwZWMsIHNjb3Blcykge1xuICAgIHJldHVybiBuZXcgU3R5bGVNb2R1bGUoc3BlYywge1xuICAgICAgICBmaW5pc2goc2VsKSB7XG4gICAgICAgICAgICByZXR1cm4gLyYvLnRlc3Qoc2VsKSA/IHNlbC5yZXBsYWNlKC8mXFx3Ki8sIG0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtID09IFwiJlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFpbjtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlcyB8fCAhc2NvcGVzW21dKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5zdXBwb3J0ZWQgc2VsZWN0b3I6ICR7bX1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGVzW21dO1xuICAgICAgICAgICAgfSkgOiBtYWluICsgXCIgXCIgKyBzZWw7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmNvbnN0IGJhc2VUaGVtZSQxID0gLypAX19QVVJFX18qL2J1aWxkVGhlbWUoXCIuXCIgKyBiYXNlVGhlbWVJRCwge1xuICAgIFwiJlwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlICFpbXBvcnRhbnRcIixcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgXCImLmNtLWZvY3VzZWRcIjoge1xuICAgICAgICAgICAgLy8gUHJvdmlkZSBhIHNpbXBsZSBkZWZhdWx0IG91dGxpbmUgdG8gbWFrZSBzdXJlIGEgZm9jdXNlZFxuICAgICAgICAgICAgLy8gZWRpdG9yIGlzIHZpc3VhbGx5IGRpc3RpbmN0LiBDYW4ndCBsZWF2ZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdpbGwgYXBwbHkgdG8gdGhlIGNvbnRlbnQgZWxlbWVudCwgd2hpY2ggaXNcbiAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgc2Nyb2xsYWJsZSBjb250YWluZXIgYW5kIGRvZXNuJ3QgaW5jbHVkZSB0aGVcbiAgICAgICAgICAgIC8vIGd1dHRlcnMuIFdlIGFsc28gY2FuJ3QgdXNlIGFuICdhdXRvJyBvdXRsaW5lLCBzaW5jZSB0aG9zZVxuICAgICAgICAgICAgLy8gYXJlLCBmb3Igc29tZSByZWFzb24sIGRyYXduIGJlaGluZCB0aGUgZWxlbWVudCBjb250ZW50LCB3aGljaFxuICAgICAgICAgICAgLy8gd2lsbCBjYXVzZSB0aGluZ3MgbGlrZSB0aGUgYWN0aXZlIGxpbmUgYmFja2dyb3VuZCB0byBjb3ZlclxuICAgICAgICAgICAgLy8gdGhlIG91dGxpbmUgKCMyOTcpLlxuICAgICAgICAgICAgb3V0bGluZTogXCIxcHggZG90dGVkICMyMTIxMjFcIlxuICAgICAgICB9LFxuICAgICAgICBkaXNwbGF5OiBcImZsZXggIWltcG9ydGFudFwiLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiXG4gICAgfSxcbiAgICBcIi5jbS1zY3JvbGxlclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleCAhaW1wb3J0YW50XCIsXG4gICAgICAgIGFsaWduSXRlbXM6IFwiZmxleC1zdGFydCAhaW1wb3J0YW50XCIsXG4gICAgICAgIGZvbnRGYW1pbHk6IFwibW9ub3NwYWNlXCIsXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEuNCxcbiAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgb3ZlcmZsb3dYOiBcImF1dG9cIixcbiAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICAgICAgekluZGV4OiAwLFxuICAgICAgICBvdmVyZmxvd0FuY2hvcjogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi5jbS1jb250ZW50XCI6IHtcbiAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICBmbGV4R3JvdzogMixcbiAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgICAgICB3aGl0ZVNwYWNlOiBcInByZVwiLFxuICAgICAgICB3b3JkV3JhcDogXCJub3JtYWxcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy80NTZcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgbWluSGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgcGFkZGluZzogXCI0cHggMFwiLFxuICAgICAgICBvdXRsaW5lOiBcIm5vbmVcIixcbiAgICAgICAgXCImW2NvbnRlbnRlZGl0YWJsZT10cnVlXVwiOiB7XG4gICAgICAgICAgICBXZWJraXRVc2VyTW9kaWZ5OiBcInJlYWQtd3JpdGUtcGxhaW50ZXh0LW9ubHlcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCIuY20tbGluZVdyYXBwaW5nXCI6IHtcbiAgICAgICAgd2hpdGVTcGFjZV9mYWxsYmFjazogXCJwcmUtd3JhcFwiLCAvLyBGb3IgSUVcbiAgICAgICAgd2hpdGVTcGFjZTogXCJicmVhay1zcGFjZXNcIixcbiAgICAgICAgd29yZEJyZWFrOiBcImJyZWFrLXdvcmRcIiwgLy8gRm9yIFNhZmFyaSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IG92ZXJmbG93LXdyYXA6IGFueXdoZXJlXG4gICAgICAgIG92ZXJmbG93V3JhcDogXCJhbnl3aGVyZVwiLFxuICAgICAgICBmbGV4U2hyaW5rOiAxXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tY29udGVudFwiOiB7IGNhcmV0Q29sb3I6IFwiYmxhY2tcIiB9LFxuICAgIFwiJmRhcmsgLmNtLWNvbnRlbnRcIjogeyBjYXJldENvbG9yOiBcIndoaXRlXCIgfSxcbiAgICBcIi5jbS1saW5lXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgICAgICBwYWRkaW5nOiBcIjAgMnB4IDAgNnB4XCJcbiAgICB9LFxuICAgIFwiLmNtLWxheWVyXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBjb250YWluOiBcInNpemUgc3R5bGVcIixcbiAgICAgICAgXCImID4gKlwiOiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjZDlkOWQ5XCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiMyMjJcIlxuICAgIH0sXG4gICAgXCImbGlnaHQuY20tZm9jdXNlZCA+IC5jbS1zY3JvbGxlciA+IC5jbS1zZWxlY3Rpb25MYXllciAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2Q3ZDRmMFwiXG4gICAgfSxcbiAgICBcIiZkYXJrLmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tc2VsZWN0aW9uTGF5ZXIgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiMyMzNcIlxuICAgIH0sXG4gICAgXCIuY20tY3Vyc29yTGF5ZXJcIjoge1xuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIlxuICAgIH0sXG4gICAgXCImLmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tY3Vyc29yTGF5ZXJcIjoge1xuICAgICAgICBhbmltYXRpb246IFwic3RlcHMoMSkgY20tYmxpbmsgMS4ycyBpbmZpbml0ZVwiXG4gICAgfSxcbiAgICAvLyBUd28gYW5pbWF0aW9ucyBkZWZpbmVkIHNvIHRoYXQgd2UgY2FuIHN3aXRjaCBiZXR3ZWVuIHRoZW0gdG9cbiAgICAvLyByZXN0YXJ0IHRoZSBhbmltYXRpb24gd2l0aG91dCBmb3JjaW5nIGFub3RoZXIgc3R5bGVcbiAgICAvLyByZWNvbXB1dGF0aW9uLlxuICAgIFwiQGtleWZyYW1lcyBjbS1ibGlua1wiOiB7IFwiMCVcIjoge30sIFwiNTAlXCI6IHsgb3BhY2l0eTogMCB9LCBcIjEwMCVcIjoge30gfSxcbiAgICBcIkBrZXlmcmFtZXMgY20tYmxpbmsyXCI6IHsgXCIwJVwiOiB7fSwgXCI1MCVcIjogeyBvcGFjaXR5OiAwIH0sIFwiMTAwJVwiOiB7fSB9LFxuICAgIFwiLmNtLWN1cnNvciwgLmNtLWRyb3BDdXJzb3JcIjoge1xuICAgICAgICBib3JkZXJMZWZ0OiBcIjEuMnB4IHNvbGlkIGJsYWNrXCIsXG4gICAgICAgIG1hcmdpbkxlZnQ6IFwiLTAuNnB4XCIsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIuY20tY3Vyc29yXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJub25lXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGJvcmRlckxlZnRDb2xvcjogXCIjZGRkXCJcbiAgICB9LFxuICAgIFwiLmNtLWRyb3BDdXJzb3JcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiXG4gICAgfSxcbiAgICBcIiYuY20tZm9jdXNlZCA+IC5jbS1zY3JvbGxlciA+IC5jbS1jdXJzb3JMYXllciAuY20tY3Vyc29yXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJibG9ja1wiXG4gICAgfSxcbiAgICBcIi5jbS1pc29cIjoge1xuICAgICAgICB1bmljb2RlQmlkaTogXCJpc29sYXRlXCJcbiAgICB9LFxuICAgIFwiLmNtLWFubm91bmNlZFwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXG4gICAgICAgIHRvcDogXCItMTAwMDBweFwiXG4gICAgfSxcbiAgICBcIkBtZWRpYSBwcmludFwiOiB7XG4gICAgICAgIFwiLmNtLWFubm91bmNlZFwiOiB7IGRpc3BsYXk6IFwibm9uZVwiIH1cbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1hY3RpdmVMaW5lXCI6IHsgYmFja2dyb3VuZENvbG9yOiBcIiNjY2VlZmY0NFwiIH0sXG4gICAgXCImZGFyayAuY20tYWN0aXZlTGluZVwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjOTllZWZmMzNcIiB9LFxuICAgIFwiJmxpZ2h0IC5jbS1zcGVjaWFsQ2hhclwiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgXCImZGFyayAuY20tc3BlY2lhbENoYXJcIjogeyBjb2xvcjogXCIjZjc4XCIgfSxcbiAgICBcIi5jbS1ndXR0ZXJzXCI6IHtcbiAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICAgIHpJbmRleDogMjAwXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tZ3V0dGVyc1wiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZjVmNWY1XCIsXG4gICAgICAgIGNvbG9yOiBcIiM2YzZjNmNcIixcbiAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tZ3V0dGVyc1wiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMzMzMzM4XCIsXG4gICAgICAgIGNvbG9yOiBcIiNjY2NcIlxuICAgIH0sXG4gICAgXCIuY20tZ3V0dGVyXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJmbGV4ICFpbXBvcnRhbnRcIiwgLy8gTmVjZXNzYXJ5IC0tIHByZXZlbnRzIG1hcmdpbiBjb2xsYXBzaW5nXG4gICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIG1pbkhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgfSxcbiAgICBcIi5jbS1ndXR0ZXJFbGVtZW50XCI6IHtcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIlxuICAgIH0sXG4gICAgXCIuY20tbGluZU51bWJlcnMgLmNtLWd1dHRlckVsZW1lbnRcIjoge1xuICAgICAgICBwYWRkaW5nOiBcIjAgM3B4IDAgNXB4XCIsXG4gICAgICAgIG1pbldpZHRoOiBcIjIwcHhcIixcbiAgICAgICAgdGV4dEFsaWduOiBcInJpZ2h0XCIsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwibm93cmFwXCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1hY3RpdmVMaW5lR3V0dGVyXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNlMmYyZmZcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tYWN0aXZlTGluZUd1dHRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMjIyMjI3XCJcbiAgICB9LFxuICAgIFwiLmNtLXBhbmVsc1wiOiB7XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInN0aWNreVwiLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgekluZGV4OiAzMDBcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1wYW5lbHNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCJibGFja1wiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzLXRvcFwiOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzLWJvdHRvbVwiOiB7XG4gICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1wYW5lbHNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS10YWJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJib3R0b21cIlxuICAgIH0sXG4gICAgXCIuY20td2lkZ2V0QnVmZmVyXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0ZXh0LXRvcFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMWVtXCIsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiXG4gICAgfSxcbiAgICBcIi5jbS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgIGNvbG9yOiBcIiM4ODhcIixcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0b3BcIixcbiAgICAgICAgdXNlclNlbGVjdDogXCJub25lXCJcbiAgICB9LFxuICAgIFwiLmNtLWhpZ2hsaWdodFNwYWNlXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcInJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDU1JSwgI2FhYSAyMCUsIHRyYW5zcGFyZW50IDUlKVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFwiY2VudGVyXCIsXG4gICAgfSxcbiAgICBcIi5jbS1oaWdobGlnaHRUYWJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwMFwiIGhlaWdodD1cIjIwXCI+PHBhdGggc3Ryb2tlPVwiJTIzODg4XCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZD1cIk0xIDEwSDE5NkwxOTAgNU0xOTAgMTVMMTk2IDEwTTE5NyA0TDE5NyAxNlwiLz48L3N2Zz4nKWAsXG4gICAgICAgIGJhY2tncm91bmRTaXplOiBcImF1dG8gMTAwJVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFwicmlnaHQgOTAlXCIsXG4gICAgICAgIGJhY2tncm91bmRSZXBlYXQ6IFwibm8tcmVwZWF0XCJcbiAgICB9LFxuICAgIFwiLmNtLXRyYWlsaW5nU3BhY2VcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmMzMyMjU1XCJcbiAgICB9LFxuICAgIFwiLmNtLWJ1dHRvblwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwibWlkZGxlXCIsXG4gICAgICAgIGNvbG9yOiBcImluaGVyaXRcIixcbiAgICAgICAgZm9udFNpemU6IFwiNzAlXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiLjJlbSAxZW1cIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjFweFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjZWZmMWY1LCAjZDlkOWRmKVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM4ODhcIixcbiAgICAgICAgXCImOmFjdGl2ZVwiOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCNiNGI0YjQsICNkMGQzZDYpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCImZGFyayAuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjMzkzOTM5LCAjMTExKVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM4ODhcIixcbiAgICAgICAgXCImOmFjdGl2ZVwiOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCMxMTEsICMzMzMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCIuY20tdGV4dGZpZWxkXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJtaWRkbGVcIixcbiAgICAgICAgY29sb3I6IFwiaW5oZXJpdFwiLFxuICAgICAgICBmb250U2l6ZTogXCI3MCVcIixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCBzaWx2ZXJcIixcbiAgICAgICAgcGFkZGluZzogXCIuMmVtIC41ZW1cIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRleHRmaWVsZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS10ZXh0ZmllbGRcIjoge1xuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM1NTVcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcImluaGVyaXRcIlxuICAgIH1cbn0sIGxpZ2h0RGFya0lEcyk7XG5cbmNvbnN0IG9ic2VydmVPcHRpb25zID0ge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgIHN1YnRyZWU6IHRydWUsXG4gICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6IHRydWVcbn07XG4vLyBJRTExIGhhcyB2ZXJ5IGJyb2tlbiBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHdlIGFsc28gbGlzdGVuIHRvXG4vLyBET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQgdGhlcmVcbmNvbnN0IHVzZUNoYXJEYXRhID0gYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPD0gMTE7XG5jbGFzcyBET01PYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gVGhlIGtub3duIHNlbGVjdGlvbi4gS2VwdCBpbiBvdXIgb3duIG9iamVjdCwgYXMgb3Bwb3NlZCB0byBqdXN0XG4gICAgICAgIC8vIGRpcmVjdGx5IGFjY2Vzc2luZyB0aGUgc2VsZWN0aW9uIGJlY2F1c2U6XG4gICAgICAgIC8vICAtIFNhZmFyaSBkb2Vzbid0IHJlcG9ydCB0aGUgcmlnaHQgc2VsZWN0aW9uIGluIHNoYWRvdyBET01cbiAgICAgICAgLy8gIC0gUmVhZGluZyBmcm9tIHRoZSBzZWxlY3Rpb24gZm9yY2VzIGEgRE9NIGxheW91dFxuICAgICAgICAvLyAgLSBUaGlzIHdheSwgd2UgY2FuIGlnbm9yZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnRzIGlmIHdlIGhhdmVcbiAgICAgICAgLy8gICAgYWxyZWFkeSBzZWVuIHRoZSAnbmV3JyBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZSA9IG5ldyBET01TZWxlY3Rpb25TdGF0ZTtcbiAgICAgICAgLy8gU2V0IHdoZW4gYSBzZWxlY3Rpb24gY2hhbmdlIGlzIGRldGVjdGVkLCBjbGVhcmVkIG9uIGZsdXNoXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xO1xuICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhbmdlID0gMDtcbiAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXRzID0gW107XG4gICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNpemVTY3JvbGwgPSBudWxsO1xuICAgICAgICB0aGlzLmludGVyc2VjdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2FwcyA9IFtdO1xuICAgICAgICB0aGlzLnByaW50UXVlcnkgPSBudWxsO1xuICAgICAgICAvLyBUaW1lb3V0IGZvciBzY2hlZHVsaW5nIGNoZWNrIG9mIHRoZSBwYXJlbnRzIHRoYXQgbmVlZCBzY3JvbGwgaGFuZGxlcnNcbiAgICAgICAgdGhpcy5wYXJlbnRDaGVjayA9IC0xO1xuICAgICAgICB0aGlzLmRvbSA9IHZpZXcuY29udGVudERPTTtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBtdXQgb2YgbXV0YXRpb25zKVxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChtdXQpO1xuICAgICAgICAgICAgLy8gSUUxMSB3aWxsIHNvbWV0aW1lcyAob24gdHlwaW5nIG92ZXIgYSBzZWxlY3Rpb24gb3JcbiAgICAgICAgICAgIC8vIGJhY2tzcGFjaW5nIG91dCBhIHNpbmdsZSBjaGFyYWN0ZXIgdGV4dCBub2RlKSBjYWxsIHRoZVxuICAgICAgICAgICAgLy8gb2JzZXJ2ZXIgY2FsbGJhY2sgYmVmb3JlIGFjdHVhbGx5IHVwZGF0aW5nIHRoZSBET00uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVW5yZWxhdGVkbHksIGlPUyBTYWZhcmkgd2lsbCwgd2hlbiBlbmRpbmcgYSBjb21wb3NpdGlvbixcbiAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBmaXJzdCBjbGVhciBpdCwgZGVsaXZlciB0aGUgbXV0YXRpb25zLCBhbmQgdGhlblxuICAgICAgICAgICAgLy8gcmVpbnNlcnQgdGhlIGZpbmlzaGVkIHRleHQuIENvZGVNaXJyb3IncyBoYW5kbGluZyBvZiB0aGVcbiAgICAgICAgICAgIC8vIGRlbGV0aW9uIHdpbGwgcHJldmVudCB0aGUgcmVpbnNlcnRpb24gZnJvbSBoYXBwZW5pbmcsXG4gICAgICAgICAgICAvLyBicmVha2luZyBjb21wb3NpdGlvbi5cbiAgICAgICAgICAgIGlmICgoYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPD0gMTEgfHwgYnJvd3Nlci5pb3MgJiYgdmlldy5jb21wb3NpbmcpICYmXG4gICAgICAgICAgICAgICAgbXV0YXRpb25zLnNvbWUobSA9PiBtLnR5cGUgPT0gXCJjaGlsZExpc3RcIiAmJiBtLnJlbW92ZWROb2Rlcy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICAgICAgbS50eXBlID09IFwiY2hhcmFjdGVyRGF0YVwiICYmIG0ub2xkVmFsdWUubGVuZ3RoID4gbS50YXJnZXQubm9kZVZhbHVlLmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAod2luZG93LkVkaXRDb250ZXh0ICYmIHZpZXcuY29uc3RydWN0b3IuRURJVF9DT05URVhUICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgLy8gQ2hyb21lIDwxMjYgZG9lc24ndCBzdXBwb3J0IGludmVydGVkIHNlbGVjdGlvbnMgaW4gZWRpdCBjb250ZXh0ICgjMTM5MilcbiAgICAgICAgICAgICEoYnJvd3Nlci5jaHJvbWUgJiYgYnJvd3Nlci5jaHJvbWVfdmVyc2lvbiA8IDEyNikpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQgPSBuZXcgRWRpdENvbnRleHRNYW5hZ2VyKHZpZXcpO1xuICAgICAgICAgICAgaWYgKHZpZXcuc3RhdGUuZmFjZXQoZWRpdGFibGUpKVxuICAgICAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5lZGl0Q29udGV4dCA9IHRoaXMuZWRpdENvbnRleHQuZWRpdENvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5vbkNoYXJEYXRhID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHsgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY2hhcmFjdGVyRGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZTogZXZlbnQucHJldlZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUmVzaXplID0gdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUHJpbnQgPSB0aGlzLm9uUHJpbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblNjcm9sbCA9IHRoaXMub25TY3JvbGwuYmluZCh0aGlzKTtcbiAgICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKVxuICAgICAgICAgICAgdGhpcy5wcmludFF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoXCJwcmludFwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2Nyb2xsID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKCgoX2EgPSB0aGlzLnZpZXcuZG9jVmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhc3RVcGRhdGUpIDwgRGF0ZS5ub3coKSAtIDc1KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2Nyb2xsLm9ic2VydmUodmlldy5zY3JvbGxET00pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkV2luZG93TGlzdGVuZXJzKHRoaXMud2luID0gdmlldy53aW4pO1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRDaGVjayA8IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSBzZXRUaW1lb3V0KHRoaXMubGlzdGVuRm9yU2Nyb2xsLmJpbmQodGhpcyksIDEwMDApO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDAgJiYgKGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApICE9IHRoaXMuaW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW5nID0gIXRoaXMuaW50ZXJzZWN0aW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3RpbmcgIT0gdGhpcy52aWV3LmluVmlldylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHsgdGhyZXNob2xkOiBbMCwgLjAwMV0gfSk7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbi5vYnNlcnZlKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDAgJiYgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdLmludGVyc2VjdGlvblJhdGlvID4gMClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNjcm9sbENoYW5nZWQoZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKSk7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5Gb3JTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICB9XG4gICAgb25TY3JvbGxDaGFuZ2VkKGUpIHtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUucnVuSGFuZGxlcnMoXCJzY3JvbGxcIiwgZSk7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGluZylcbiAgICAgICAgICAgIHRoaXMudmlldy5tZWFzdXJlKCk7XG4gICAgfVxuICAgIG9uU2Nyb2xsKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJzZWN0aW5nKVxuICAgICAgICAgICAgdGhpcy5mbHVzaChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRDb250ZXh0KVxuICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMuZWRpdENvbnRleHQubWVhc3VyZVJlcSk7XG4gICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGUpO1xuICAgIH1cbiAgICBvblJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIH0sIDUwKTtcbiAgICB9XG4gICAgb25QcmludChldmVudCkge1xuICAgICAgICBpZiAoKGV2ZW50LnR5cGUgPT0gXCJjaGFuZ2VcIiB8fCAhZXZlbnQudHlwZSkgJiYgIWV2ZW50Lm1hdGNoZXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUucHJpbnRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcubWVhc3VyZSgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUucHJpbnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cbiAgICB1cGRhdGVHYXBzKGdhcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2FwSW50ZXJzZWN0aW9uICYmIChnYXBzLmxlbmd0aCAhPSB0aGlzLmdhcHMubGVuZ3RoIHx8IHRoaXMuZ2Fwcy5zb21lKChnLCBpKSA9PiBnICE9IGdhcHNbaV0pKSkge1xuICAgICAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZ2FwIG9mIGdhcHMpXG4gICAgICAgICAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24ub2JzZXJ2ZShnYXApO1xuICAgICAgICAgICAgdGhpcy5nYXBzID0gZ2FwcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblNlbGVjdGlvbkNoYW5nZShldmVudCkge1xuICAgICAgICBsZXQgd2FzQ2hhbmdlZCA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZDtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRTZWxlY3Rpb25SYW5nZSgpIHx8IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIHNlbCA9IHRoaXMuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSA/IHZpZXcucm9vdC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZG9tIDogIWhhc1NlbGVjdGlvbih0aGlzLmRvbSwgc2VsKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBzZWwuYW5jaG9yTm9kZSAmJiB2aWV3LmRvY1ZpZXcubmVhcmVzdChzZWwuYW5jaG9yTm9kZSk7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuaWdub3JlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRpb25zIG9uIElFMTEgZmlyZSB0aGVpciBldmVudHMgaW4gdGhlIHdyb25nIG9yZGVyLCBnaXZpbmdcbiAgICAgICAgLy8gdXMgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IGJlZm9yZSB0aGUgRE9NIGNoYW5nZXMgYXJlXG4gICAgICAgIC8vIHJlcG9ydGVkLlxuICAgICAgICAvLyBDaHJvbWUgQW5kcm9pZCBoYXMgYSBzaW1pbGFyIGlzc3VlIHdoZW4gYmFja3NwYWNpbmcgb3V0IGFcbiAgICAgICAgLy8gc2VsZWN0aW9uICgjNjQ1KS5cbiAgICAgICAgaWYgKChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMSB8fCBicm93c2VyLmFuZHJvaWQgJiYgYnJvd3Nlci5jaHJvbWUpICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmVtcHR5ICYmXG4gICAgICAgICAgICAvLyAoU2VsZWN0aW9uLmlzQ29sbGFwc2VkIGlzbid0IHJlbGlhYmxlIG9uIElFKVxuICAgICAgICAgICAgc2VsLmZvY3VzTm9kZSAmJiBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSlcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZmx1c2goZmFsc2UpO1xuICAgIH1cbiAgICByZWFkU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIC8vIFRoZSBTZWxlY3Rpb24gb2JqZWN0IGlzIGJyb2tlbiBpbiBzaGFkb3cgcm9vdHMgaW4gU2FmYXJpLiBTZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy80MTRcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih2aWV3LnJvb3QpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHJhbmdlID0gYnJvd3Nlci5zYWZhcmkgJiYgdmlldy5yb290Lm5vZGVUeXBlID09IDExICYmXG4gICAgICAgICAgICB2aWV3LnJvb3QuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmRvbSAmJlxuICAgICAgICAgICAgc2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrKHRoaXMudmlldywgc2VsZWN0aW9uKSB8fCBzZWxlY3Rpb247XG4gICAgICAgIGlmICghcmFuZ2UgfHwgdGhpcy5zZWxlY3Rpb25SYW5nZS5lcShyYW5nZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBsb2NhbCA9IGhhc1NlbGVjdGlvbih0aGlzLmRvbSwgcmFuZ2UpO1xuICAgICAgICAvLyBEZXRlY3QgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgYnJvd3NlciBoYXMsIG9uIGZvY3VzLCBtb3ZlZCB0aGVcbiAgICAgICAgLy8gc2VsZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGVudCBlbGVtZW50LiBSZXNldCBpdCB0byB0aGVcbiAgICAgICAgLy8gcG9zaXRpb24gZnJvbSB0aGUgZWRpdG9yIHN0YXRlLlxuICAgICAgICBpZiAobG9jYWwgJiYgIXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCAmJlxuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPiBEYXRlLm5vdygpIC0gMjAwICYmXG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA8IERhdGUubm93KCkgLSAzMDAgJiZcbiAgICAgICAgICAgIGF0RWxlbWVudFN0YXJ0KHRoaXMuZG9tLCByYW5nZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICAgICAgdmlldy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0UmFuZ2UocmFuZ2UpO1xuICAgICAgICBpZiAobG9jYWwpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2V0U2VsZWN0aW9uUmFuZ2UoYW5jaG9yLCBoZWFkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0KGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0LCBoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIGNsZWFyU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0KG51bGwsIDAsIG51bGwsIDApO1xuICAgIH1cbiAgICBsaXN0ZW5Gb3JTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSAtMTtcbiAgICAgICAgbGV0IGkgPSAwLCBjaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgZG9tID0gdGhpcy5kb207IGRvbTspIHtcbiAgICAgICAgICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiBpIDwgdGhpcy5zY3JvbGxUYXJnZXRzLmxlbmd0aCAmJiB0aGlzLnNjcm9sbFRhcmdldHNbaV0gPT0gZG9tKVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLnNjcm9sbFRhcmdldHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQucHVzaChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5hc3NpZ25lZFNsb3QgfHwgZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgICAgICAgICBkb20gPSBkb20uaG9zdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgdGhpcy5zY3JvbGxUYXJnZXRzLmxlbmd0aCAmJiAhY2hhbmdlZClcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLnNjcm9sbFRhcmdldHMuc2xpY2UoMCwgaSk7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkb20gb2YgdGhpcy5zY3JvbGxUYXJnZXRzKVxuICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cyA9IGNoYW5nZWQpXG4gICAgICAgICAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWdub3JlKGYpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZG9tLCBvYnNlcnZlT3B0aW9ucyk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgIH1cbiAgICAvLyBUaHJvdyBhd2F5IGFueSBwZW5kaW5nIGNoYW5nZXNcbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVjb3JkcygpO1xuICAgICAgICB0aGlzLnF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBDaHJvbWUgQW5kcm9pZCwgZXNwZWNpYWxseSBpbiBjb21iaW5hdGlvbiB3aXRoIEdCb2FyZCwgbm90IG9ubHlcbiAgICAvLyBkb2Vzbid0IHJlbGlhYmx5IGZpcmUgcmVndWxhciBrZXkgZXZlbnRzLCBidXQgYWxzbyBvZnRlblxuICAgIC8vIHN1cnJvdW5kcyB0aGUgZWZmZWN0IG9mIGVudGVyIG9yIGJhY2tzcGFjZSB3aXRoIGEgYnVuY2ggb2ZcbiAgICAvLyBjb21wb3NpdGlvbiBldmVudHMgdGhhdCwgd2hlbiBpbnRlcnJ1cHRlZCwgY2F1c2UgdGV4dCBkdXBsaWNhdGlvblxuICAgIC8vIG9yIG90aGVyIGtpbmRzIG9mIGNvcnJ1cHRpb24uIFRoaXMgaGFjayBtYWtlcyB0aGUgZWRpdG9yIGJhY2sgb2ZmXG4gICAgLy8gZnJvbSBoYW5kbGluZyBET00gY2hhbmdlcyBmb3IgYSBtb21lbnQgd2hlbiBzdWNoIGEga2V5IGlzXG4gICAgLy8gZGV0ZWN0ZWQgKHZpYSBiZWZvcmVpbnB1dCBvciBrZXlkb3duKSwgYW5kIHRoZW4gdHJpZXMgdG8gZmx1c2hcbiAgICAvLyB0aGVtIG9yLCBpZiB0aGF0IGhhcyBubyBlZmZlY3QsIGRpc3BhdGNoZXMgdGhlIGdpdmVuIGtleS5cbiAgICBkZWxheUFuZHJvaWRLZXkoa2V5LCBrZXlDb2RlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KSB7XG4gICAgICAgICAgICBsZXQgZmx1c2ggPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuZGVsYXllZEFuZHJvaWRLZXk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEtleUNvZGUgPSBrZXkua2V5Q29kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEtleVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmx1c2hlZCA9IHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbHVzaGVkICYmIGtleS5mb3JjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KHRoaXMuZG9tLCBrZXkua2V5LCBrZXkua2V5Q29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gdGhpcy52aWV3Lndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmx1c2gpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIGJhY2tzcGFjZSBiZWZvcmVpbnB1dCBpcyBzb21ldGltZXMgc2lnbmFsbGVkIHNwdXJpb3VzbHksXG4gICAgICAgIC8vIEVudGVyIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlLlxuICAgICAgICBpZiAoIXRoaXMuZGVsYXllZEFuZHJvaWRLZXkgfHwga2V5ID09IFwiRW50ZXJcIilcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEFuZHJvaWRLZXkgPSB7XG4gICAgICAgICAgICAgICAga2V5LCBrZXlDb2RlLFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgcnVuIHRoZSBrZXkgaGFuZGxlciB3aGVuIG5vIGNoYW5nZXMgYXJlIGRldGVjdGVkIGlmXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpc24ndCBjb21pbmcgcmlnaHQgYWZ0ZXIgYW5vdGhlciBjaGFuZ2UsIGluIHdoaWNoIGNhc2VcbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBwcm9iYWJseSBwYXJ0IG9mIGEgd2VpcmQgY2hhaW4gb2YgdXBkYXRlcywgYW5kIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIGJlIGlnbm9yZWQgaWYgaXQgcmV0dXJucyB0aGUgRE9NIHRvIGl0cyBwcmV2aW91cyBzdGF0ZS5cbiAgICAgICAgICAgICAgICBmb3JjZTogdGhpcy5sYXN0Q2hhbmdlIDwgRGF0ZS5ub3coKSAtIDUwIHx8ICEhKChfYSA9IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JjZSlcbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIGNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKSB7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5KTtcbiAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gLTE7XG4gICAgfVxuICAgIGZsdXNoU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZEZsdXNoIDwgMClcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEZsdXNoID0gdGhpcy52aWV3Lndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xOyB0aGlzLmZsdXNoKCk7IH0pO1xuICAgIH1cbiAgICBmb3JjZUZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmRlbGF5ZWRGbHVzaCk7XG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gICAgcGVuZGluZ1JlY29yZHMoKSB7XG4gICAgICAgIGZvciAobGV0IG11dCBvZiB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCkpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWU7XG4gICAgfVxuICAgIHByb2Nlc3NSZWNvcmRzKCkge1xuICAgICAgICBsZXQgcmVjb3JkcyA9IHRoaXMucGVuZGluZ1JlY29yZHMoKTtcbiAgICAgICAgaWYgKHJlY29yZHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICBsZXQgZnJvbSA9IC0xLCB0byA9IC0xLCB0eXBlT3ZlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5yZWFkTXV0YXRpb24ocmVjb3JkKTtcbiAgICAgICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmFuZ2UudHlwZU92ZXIpXG4gICAgICAgICAgICAgICAgdHlwZU92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGZyb20gPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAoeyBmcm9tLCB0byB9ID0gcmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IE1hdGgubWluKHJhbmdlLmZyb20sIGZyb20pO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5tYXgocmFuZ2UudG8sIHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmcm9tLCB0bywgdHlwZU92ZXIgfTtcbiAgICB9XG4gICAgcmVhZENoYW5nZSgpIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8sIHR5cGVPdmVyIH0gPSB0aGlzLnByb2Nlc3NSZWNvcmRzKCk7XG4gICAgICAgIGxldCBuZXdTZWwgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgJiYgaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCB0aGlzLnNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgaWYgKGZyb20gPCAwICYmICFuZXdTZWwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGZyb20gPiAtMSlcbiAgICAgICAgICAgIHRoaXMubGFzdENoYW5nZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNoYW5nZSA9IG5ldyBET01DaGFuZ2UodGhpcy52aWV3LCBmcm9tLCB0bywgdHlwZU92ZXIpO1xuICAgICAgICB0aGlzLnZpZXcuZG9jVmlldy5kb21DaGFuZ2VkID0geyBuZXdTZWw6IGNoYW5nZS5uZXdTZWwgPyBjaGFuZ2UubmV3U2VsLm1haW4gOiBudWxsIH07XG4gICAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxuICAgIC8vIEFwcGx5IHBlbmRpbmcgY2hhbmdlcywgaWYgYW55XG4gICAgZmx1c2gocmVhZFNlbGVjdGlvbiA9IHRydWUpIHtcbiAgICAgICAgLy8gQ29tcGxldGVseSBob2xkIG9mZiBmbHVzaGluZyB3aGVuIHBlbmRpbmcga2V5cyBhcmUgc2V0XHUyMDE0dGhlIGNvZGVcbiAgICAgICAgLy8gbWFuYWdpbmcgdGhvc2Ugd2lsbCBtYWtlIHN1cmUgcHJvY2Vzc1JlY29yZHMgaXMgY2FsbGVkIGFuZCB0aGVcbiAgICAgICAgLy8gdmlldyBpcyByZXN5bmNocm9uaXplZCBhZnRlclxuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPj0gMCB8fCB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocmVhZFNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBkb21DaGFuZ2UgPSB0aGlzLnJlYWRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKCFkb21DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydFN0YXRlID0gdGhpcy52aWV3LnN0YXRlO1xuICAgICAgICBsZXQgaGFuZGxlZCA9IGFwcGx5RE9NQ2hhbmdlKHRoaXMudmlldywgZG9tQ2hhbmdlKTtcbiAgICAgICAgLy8gVGhlIHZpZXcgd2Fzbid0IHVwZGF0ZWQgYnV0IERPTS9zZWxlY3Rpb24gY2hhbmdlcyB3ZXJlIHNlZW4uIFJlc2V0IHRoZSB2aWV3LlxuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlID09IHN0YXJ0U3RhdGUgJiZcbiAgICAgICAgICAgIChkb21DaGFuZ2UuZG9tQ2hhbmdlZCB8fCBkb21DaGFuZ2UubmV3U2VsICYmICFkb21DaGFuZ2UubmV3U2VsLm1haW4uZXEodGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluKSkpXG4gICAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgfVxuICAgIHJlYWRNdXRhdGlvbihyZWMpIHtcbiAgICAgICAgbGV0IGNWaWV3ID0gdGhpcy52aWV3LmRvY1ZpZXcubmVhcmVzdChyZWMudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFjVmlldyB8fCBjVmlldy5pZ25vcmVNdXRhdGlvbihyZWMpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNWaWV3Lm1hcmtEaXJ0eShyZWMudHlwZSA9PSBcImF0dHJpYnV0ZXNcIik7XG4gICAgICAgIGlmIChyZWMudHlwZSA9PSBcImF0dHJpYnV0ZXNcIilcbiAgICAgICAgICAgIGNWaWV3LmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLztcbiAgICAgICAgaWYgKHJlYy50eXBlID09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZEJlZm9yZSA9IGZpbmRDaGlsZChjVmlldywgcmVjLnByZXZpb3VzU2libGluZyB8fCByZWMudGFyZ2V0LnByZXZpb3VzU2libGluZywgLTEpO1xuICAgICAgICAgICAgbGV0IGNoaWxkQWZ0ZXIgPSBmaW5kQ2hpbGQoY1ZpZXcsIHJlYy5uZXh0U2libGluZyB8fCByZWMudGFyZ2V0Lm5leHRTaWJsaW5nLCAxKTtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGNoaWxkQmVmb3JlID8gY1ZpZXcucG9zQWZ0ZXIoY2hpbGRCZWZvcmUpIDogY1ZpZXcucG9zQXRTdGFydCxcbiAgICAgICAgICAgICAgICB0bzogY2hpbGRBZnRlciA/IGNWaWV3LnBvc0JlZm9yZShjaGlsZEFmdGVyKSA6IGNWaWV3LnBvc0F0RW5kLCB0eXBlT3ZlcjogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWMudHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogY1ZpZXcucG9zQXRTdGFydCwgdG86IGNWaWV3LnBvc0F0RW5kLCB0eXBlT3ZlcjogcmVjLnRhcmdldC5ub2RlVmFsdWUgPT0gcmVjLm9sZFZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRXaW5kb3cod2luKSB7XG4gICAgICAgIGlmICh3aW4gIT0gdGhpcy53aW4pIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgICAgIHRoaXMud2luID0gd2luO1xuICAgICAgICAgICAgdGhpcy5hZGRXaW5kb3dMaXN0ZW5lcnModGhpcy53aW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZFdpbmRvd0xpc3RlbmVycyh3aW4pIHtcbiAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgICAgIGlmICh0aGlzLnByaW50UXVlcnkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByaW50UXVlcnkuYWRkRXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50UXVlcnkuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzLm9uUHJpbnQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucHJpbnRRdWVyeS5hZGRMaXN0ZW5lcih0aGlzLm9uUHJpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlcHJpbnRcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIHdpbi5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgIH1cbiAgICByZW1vdmVXaW5kb3dMaXN0ZW5lcnMod2luKSB7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uUmVzaXplKTtcbiAgICAgICAgaWYgKHRoaXMucHJpbnRRdWVyeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJpbnRRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKVxuICAgICAgICAgICAgICAgIHRoaXMucHJpbnRRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHRoaXMub25QcmludCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludFF1ZXJ5LnJlbW92ZUxpc3RlbmVyKHRoaXMub25QcmludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVwcmludFwiLCB0aGlzLm9uUHJpbnQpO1xuICAgICAgICB3aW4uZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5lZGl0Q29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChlZGl0YWJsZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGVkaXRhYmxlKSlcbiAgICAgICAgICAgICAgICB1cGRhdGUudmlldy5jb250ZW50RE9NLmVkaXRDb250ZXh0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KGVkaXRhYmxlKSA/IHRoaXMuZWRpdENvbnRleHQuZWRpdENvbnRleHQgOiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgKF9hID0gdGhpcy5pbnRlcnNlY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNjb25uZWN0KCk7XG4gICAgICAgIChfYiA9IHRoaXMuZ2FwSW50ZXJzZWN0aW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGlzY29ubmVjdCgpO1xuICAgICAgICAoX2MgPSB0aGlzLnJlc2l6ZVNjcm9sbCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cylcbiAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB0aGlzLnJlbW92ZVdpbmRvd0xpc3RlbmVycyh0aGlzLndpbik7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBhcmVudENoZWNrKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZGVsYXllZEZsdXNoKTtcbiAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Q29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmNvbnRlbnRET00uZWRpdENvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kQ2hpbGQoY1ZpZXcsIGRvbSwgZGlyKSB7XG4gICAgd2hpbGUgKGRvbSkge1xuICAgICAgICBsZXQgY3VyVmlldyA9IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICBpZiAoY3VyVmlldyAmJiBjdXJWaWV3LnBhcmVudCA9PSBjVmlldylcbiAgICAgICAgICAgIHJldHVybiBjdXJWaWV3O1xuICAgICAgICBsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgIGRvbSA9IHBhcmVudCAhPSBjVmlldy5kb20gPyBwYXJlbnQgOiBkaXIgPiAwID8gZG9tLm5leHRTaWJsaW5nIDogZG9tLnByZXZpb3VzU2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBidWlsZFNlbGVjdGlvblJhbmdlRnJvbVJhbmdlKHZpZXcsIHJhbmdlKSB7XG4gICAgbGV0IGFuY2hvck5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lciwgYW5jaG9yT2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgbGV0IGZvY3VzTm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lciwgZm9jdXNPZmZzZXQgPSByYW5nZS5lbmRPZmZzZXQ7XG4gICAgbGV0IGN1ckFuY2hvciA9IHZpZXcuZG9jVmlldy5kb21BdFBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvcik7XG4gICAgLy8gU2luY2Ugc3VjaCBhIHJhbmdlIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbmNob3IgYW5kIGhlYWQsXG4gICAgLy8gdXNlIGEgaGV1cmlzdGljIHRoYXQgZmxpcHMgaXQgYXJvdW5kIGlmIGl0cyBlbmQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGFuY2hvci5cbiAgICBpZiAoaXNFcXVpdmFsZW50UG9zaXRpb24oY3VyQW5jaG9yLm5vZGUsIGN1ckFuY2hvci5vZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKVxuICAgICAgICBbYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0XSA9IFtmb2N1c05vZGUsIGZvY3VzT2Zmc2V0LCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXRdO1xuICAgIHJldHVybiB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9O1xufVxuLy8gVXNlZCB0byB3b3JrIGFyb3VuZCBhIFNhZmFyaSBTZWxlY3Rpb24vc2hhZG93IERPTSBidWcgKCM0MTQpXG5mdW5jdGlvbiBzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2sodmlldywgc2VsZWN0aW9uKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5nZXRDb21wb3NlZFJhbmdlcykge1xuICAgICAgICBsZXQgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0Q29tcG9zZWRSYW5nZXModmlldy5yb290KVswXTtcbiAgICAgICAgaWYgKHJhbmdlKVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkU2VsZWN0aW9uUmFuZ2VGcm9tUmFuZ2UodmlldywgcmFuZ2UpO1xuICAgIH1cbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIC8vIEJlY2F1c2UgU2FmYXJpIChhdCBsZWFzdCBpbiAyMDE4LTIwMjEpIGRvZXNuJ3QgcHJvdmlkZSByZWd1bGFyXG4gICAgLy8gYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gaW5zaWRlIGEgc2hhZG93cm9vdCwgd2UgaGF2ZSB0byBwZXJmb3JtIGFcbiAgICAvLyByaWRpY3Vsb3VzIGhhY2sgdG8gZ2V0IGF0IGl0XHUyMDE0dXNpbmcgYGV4ZWNDb21tYW5kYCB0byB0cmlnZ2VyIGFcbiAgICAvLyBgYmVmb3JlSW5wdXRgIGV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHRhcmdldCByYW5nZSBmcm9tIHRoZVxuICAgIC8vIGV2ZW50LlxuICAgIGZ1bmN0aW9uIHJlYWQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGZvdW5kID0gZXZlbnQuZ2V0VGFyZ2V0UmFuZ2VzKClbMF07XG4gICAgfVxuICAgIHZpZXcuY29udGVudERPTS5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgdmlldy5kb20ub3duZXJEb2N1bWVudC5leGVjQ29tbWFuZChcImluZGVudFwiKTtcbiAgICB2aWV3LmNvbnRlbnRET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIHJldHVybiBmb3VuZCA/IGJ1aWxkU2VsZWN0aW9uUmFuZ2VGcm9tUmFuZ2UodmlldywgZm91bmQpIDogbnVsbDtcbn1cbmNsYXNzIEVkaXRDb250ZXh0TWFuYWdlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAvLyBUaGUgZG9jdW1lbnQgd2luZG93IGZvciB3aGljaCB0aGUgdGV4dCBpbiB0aGUgY29udGV4dCBpc1xuICAgICAgICAvLyBtYWludGFpbmVkLiBGb3IgbGFyZ2UgZG9jdW1lbnRzLCB0aGlzIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlXG4gICAgICAgIC8vIGVkaXRvciBkb2N1bWVudC4gVGhpcyB3aW5kb3cgYWx3YXlzIGluY2x1ZGVzIHRoZSBzZWxlY3Rpb24gaGVhZC5cbiAgICAgICAgdGhpcy5mcm9tID0gMDtcbiAgICAgICAgdGhpcy50byA9IDA7XG4gICAgICAgIC8vIFdoZW4gYXBwbHlpbmcgYSB0cmFuc2FjdGlvbiwgdGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIGNoYW5nZVxuICAgICAgICAvLyBtYWRlIHRvIHRoZSBjb250ZXh0IGNvbnRlbnQgdG8gdGhlIGNoYW5nZSBpbiB0aGUgdHJhbnNhY3Rpb24gaW5cbiAgICAgICAgLy8gb3JkZXIgdG8gbWFrZSB0aGUgbWluaW1hbCBjaGFuZ2VzIHRvIHRoZSBjb250ZXh0IChzaW5jZSB0b3VjaGluZ1xuICAgICAgICAvLyB0aGF0IHNvbWV0aW1lcyBicmVha3Mgc2VyaWVzIG9mIG11bHRpcGxlIGVkaXRzIG1hZGUgZm9yIGEgc2luZ2xlXG4gICAgICAgIC8vIHVzZXIgYWN0aW9uIG9uIHNvbWUgQW5kcm9pZCBrZXlib2FyZHMpXG4gICAgICAgIHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gS2x1ZGdlIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgRWRpdENvbnRleHQgZG9lcyBub3QgcmVzcG9uZFxuICAgICAgICAvLyB3ZWxsIHRvIGhhdmluZyBpdHMgY29udGVudCB1cGRhdGVkIGR1cmluZyBhIGNvbXBvc2l0aW9uIChzZWUgIzE0NzIpXG4gICAgICAgIHRoaXMuY29tcG9zaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNldFJhbmdlKHZpZXcuc3RhdGUpO1xuICAgICAgICBsZXQgY29udGV4dCA9IHRoaXMuZWRpdENvbnRleHQgPSBuZXcgd2luZG93LkVkaXRDb250ZXh0KHtcbiAgICAgICAgICAgIHRleHQ6IHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRoaXMuZnJvbSwgdGhpcy50byksXG4gICAgICAgICAgICBzZWxlY3Rpb25TdGFydDogdGhpcy50b0NvbnRleHRQb3MoTWF0aC5tYXgodGhpcy5mcm9tLCBNYXRoLm1pbih0aGlzLnRvLCB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvcikpKSxcbiAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogdGhpcy50b0NvbnRleHRQb3Modmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oYW5kbGVycy50ZXh0dXBkYXRlID0gZSA9PiB7XG4gICAgICAgICAgICBsZXQgbWFpbiA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4sIHsgYW5jaG9yLCBoZWFkIH0gPSBtYWluO1xuICAgICAgICAgICAgbGV0IGZyb20gPSB0aGlzLnRvRWRpdG9yUG9zKGUudXBkYXRlUmFuZ2VTdGFydCksIHRvID0gdGhpcy50b0VkaXRvclBvcyhlLnVwZGF0ZVJhbmdlRW5kKTtcbiAgICAgICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDAgJiYgIXRoaXMuY29tcG9zaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9zaW5nID0geyBjb250ZXh0QmFzZTogZS51cGRhdGVSYW5nZVN0YXJ0LCBlZGl0b3JCYXNlOiBmcm9tLCBkcmlmdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgbGV0IGNoYW5nZSA9IHsgZnJvbSwgdG8sIGluc2VydDogVGV4dC5vZihlLnRleHQuc3BsaXQoXCJcXG5cIikpIH07XG4gICAgICAgICAgICAvLyBJZiB0aGUgd2luZG93IGRvZXNuJ3QgaW5jbHVkZSB0aGUgYW5jaG9yLCBhc3N1bWUgY2hhbmdlc1xuICAgICAgICAgICAgLy8gYWRqYWNlbnQgdG8gYSBzaWRlIGdvIHVwIHRvIHRoZSBhbmNob3IuXG4gICAgICAgICAgICBpZiAoY2hhbmdlLmZyb20gPT0gdGhpcy5mcm9tICYmIGFuY2hvciA8IHRoaXMuZnJvbSlcbiAgICAgICAgICAgICAgICBjaGFuZ2UuZnJvbSA9IGFuY2hvcjtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoYW5nZS50byA9PSB0aGlzLnRvICYmIGFuY2hvciA+IHRoaXMudG8pXG4gICAgICAgICAgICAgICAgY2hhbmdlLnRvID0gYW5jaG9yO1xuICAgICAgICAgICAgLy8gRWRpdCBjb250ZXh0cyBzb21ldGltZXMgZmlyZSBlbXB0eSBjaGFuZ2VzXG4gICAgICAgICAgICBpZiAoY2hhbmdlLmZyb20gPT0gY2hhbmdlLnRvICYmICFjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKHRoaXMudG9FZGl0b3JQb3MoZS5zZWxlY3Rpb25TdGFydCksIHRoaXMudG9FZGl0b3JQb3MoZS5zZWxlY3Rpb25FbmQpKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5ld1NlbC5tYWluLmVxKG1haW4pKVxuICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgc2VsZWN0aW9uOiBuZXdTZWwsIHVzZXJFdmVudDogXCJzZWxlY3RcIiB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGJyb3dzZXIubWFjIHx8IGJyb3dzZXIuYW5kcm9pZCkgJiYgY2hhbmdlLmZyb20gPT0gaGVhZCAtIDEgJiZcbiAgICAgICAgICAgICAgICAvXlxcLiA/JC8udGVzdChlLnRleHQpICYmIHZpZXcuY29udGVudERPTS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29ycmVjdFwiKSA9PSBcIm9mZlwiKVxuICAgICAgICAgICAgICAgIGNoYW5nZSA9IHsgZnJvbSwgdG8sIGluc2VydDogVGV4dC5vZihbZS50ZXh0LnJlcGxhY2UoXCIuXCIsIFwiIFwiKV0pIH07XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlID0gY2hhbmdlO1xuICAgICAgICAgICAgaWYgKCF2aWV3LnN0YXRlLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0xlbiA9IHRoaXMudG8gLSB0aGlzLmZyb20gKyAoY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20gKyBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgYXBwbHlET01DaGFuZ2VJbm5lcih2aWV3LCBjaGFuZ2UsIEVkaXRvclNlbGVjdGlvbi5zaW5nbGUodGhpcy50b0VkaXRvclBvcyhlLnNlbGVjdGlvblN0YXJ0LCBuZXdMZW4pLCB0aGlzLnRvRWRpdG9yUG9zKGUuc2VsZWN0aW9uRW5kLCBuZXdMZW4pKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGUgdHJhbnNhY3Rpb24gZGlkbid0IGZsdXNoIG91ciBjaGFuZ2UsIHJldmVydCBpdCBzb1xuICAgICAgICAgICAgLy8gdGhhdCB0aGUgY29udGV4dCBpcyBpbiBzeW5jIHdpdGggdGhlIGVkaXRvciBzdGF0ZSBhZ2Fpbi5cbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlcnRQZW5kaW5nKHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNoYXJhY3RlcmJvdW5kc3VwZGF0ZSA9IGUgPT4ge1xuICAgICAgICAgICAgbGV0IHJlY3RzID0gW10sIHByZXYgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMudG9FZGl0b3JQb3MoZS5yYW5nZVN0YXJ0KSwgZW5kID0gdGhpcy50b0VkaXRvclBvcyhlLnJhbmdlRW5kKTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSB2aWV3LmNvb3Jkc0ZvckNoYXIoaSk7XG4gICAgICAgICAgICAgICAgcHJldiA9IChyZWN0ICYmIG5ldyBET01SZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3ApKVxuICAgICAgICAgICAgICAgICAgICB8fCBwcmV2IHx8IG5ldyBET01SZWN0O1xuICAgICAgICAgICAgICAgIHJlY3RzLnB1c2gocHJldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LnVwZGF0ZUNoYXJhY3RlckJvdW5kcyhlLnJhbmdlU3RhcnQsIHJlY3RzKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVycy50ZXh0Zm9ybWF0dXBkYXRlID0gZSA9PiB7XG4gICAgICAgICAgICBsZXQgZGVjbyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZm9ybWF0IG9mIGUuZ2V0VGV4dEZvcm1hdHMoKSkge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lU3R5bGUgPSBmb3JtYXQudW5kZXJsaW5lU3R5bGUsIHRoaWNrbmVzcyA9IGZvcm1hdC51bmRlcmxpbmVUaGlja25lc3M7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVTdHlsZSAhPSBcIk5vbmVcIiAmJiB0aGlja25lc3MgIT0gXCJOb25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSB0aGlzLnRvRWRpdG9yUG9zKGZvcm1hdC5yYW5nZVN0YXJ0KSwgdG8gPSB0aGlzLnRvRWRpdG9yUG9zKGZvcm1hdC5yYW5nZUVuZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IGB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSAke2xpbmVTdHlsZSA9PSBcIkRhc2hlZFwiID8gXCJkYXNoZWQgXCIgOiBsaW5lU3R5bGUgPT0gXCJTcXVpZ2dsZVwiID8gXCJ3YXZ5IFwiIDogXCJcIn0ke3RoaWNrbmVzcyA9PSBcIlRoaW5cIiA/IDEgOiAyfXB4YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY28ucHVzaChEZWNvcmF0aW9uLm1hcmsoeyBhdHRyaWJ1dGVzOiB7IHN0eWxlIH0gfSkucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBzZXRFZGl0Q29udGV4dEZvcm1hdHRpbmcub2YoRGVjb3JhdGlvbi5zZXQoZGVjbykpIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA8IDApIHtcbiAgICAgICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gMDtcbiAgICAgICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuY29tcG9zaXRpb25lbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gLTE7XG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBkcmlmdGVkIH0gPSB0aGlzLmNvbXBvc2luZztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGRyaWZ0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXQodmlldy5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGV2ZW50IGluIHRoaXMuaGFuZGxlcnMpXG4gICAgICAgICAgICBjb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIHRoaXMuaGFuZGxlcnNbZXZlbnRdKTtcbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxID0geyByZWFkOiB2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRDb250ZXh0LnVwZGF0ZUNvbnRyb2xCb3VuZHModmlldy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGVTZWxlY3Rpb25Cb3VuZHMoc2VsLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICAgICAgfSB9O1xuICAgIH1cbiAgICBhcHBseUVkaXRzKHVwZGF0ZSkge1xuICAgICAgICBsZXQgb2ZmID0gMCwgYWJvcnQgPSBmYWxzZSwgcGVuZGluZyA9IHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2U7XG4gICAgICAgIHVwZGF0ZS5jaGFuZ2VzLml0ZXJDaGFuZ2VzKChmcm9tQSwgdG9BLCBfZnJvbUIsIF90b0IsIGluc2VydCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFib3J0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBkTGVuID0gaW5zZXJ0Lmxlbmd0aCAtICh0b0EgLSBmcm9tQSk7XG4gICAgICAgICAgICBpZiAocGVuZGluZyAmJiB0b0EgPj0gcGVuZGluZy50bykge1xuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nLmZyb20gPT0gZnJvbUEgJiYgcGVuZGluZy50byA9PSB0b0EgJiYgcGVuZGluZy5pbnNlcnQuZXEoaW5zZXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nID0gdGhpcy5wZW5kaW5nQ29udGV4dENoYW5nZSA9IG51bGw7IC8vIE1hdGNoXG4gICAgICAgICAgICAgICAgICAgIG9mZiArPSBkTGVuO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvICs9IGRMZW47XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIE1pc21hdGNoLCByZXZlcnRcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJ0UGVuZGluZyh1cGRhdGUuc3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21BICs9IG9mZjtcbiAgICAgICAgICAgIHRvQSArPSBvZmY7XG4gICAgICAgICAgICBpZiAodG9BIDw9IHRoaXMuZnJvbSkgeyAvLyBCZWZvcmUgdGhlIHdpbmRvd1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbSArPSBkTGVuO1xuICAgICAgICAgICAgICAgIHRoaXMudG8gKz0gZExlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyb21BIDwgdGhpcy50bykgeyAvLyBPdmVybGFwcyB3aXRoIHdpbmRvd1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQSA8IHRoaXMuZnJvbSB8fCB0b0EgPiB0aGlzLnRvIHx8ICh0aGlzLnRvIC0gdGhpcy5mcm9tKSArIGluc2VydC5sZW5ndGggPiAzMDAwMCAvKiBDeFZwLk1heFNpemUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlVGV4dCh0aGlzLnRvQ29udGV4dFBvcyhmcm9tQSksIHRoaXMudG9Db250ZXh0UG9zKHRvQSksIGluc2VydC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvICs9IGRMZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgKz0gZExlbjtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwZW5kaW5nICYmICFhYm9ydClcbiAgICAgICAgICAgIHRoaXMucmV2ZXJ0UGVuZGluZyh1cGRhdGUuc3RhdGUpO1xuICAgICAgICByZXR1cm4gIWFib3J0O1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCByZXZlcnRlZCA9IHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UsIHN0YXJ0U2VsID0gdXBkYXRlLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIGlmICh0aGlzLmNvbXBvc2luZyAmJlxuICAgICAgICAgICAgKHRoaXMuY29tcG9zaW5nLmRyaWZ0ZWQgfHxcbiAgICAgICAgICAgICAgICAoIXVwZGF0ZS5jaGFuZ2VzLnRvdWNoZXNSYW5nZShzdGFydFNlbC5mcm9tLCBzdGFydFNlbC50bykgJiZcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnRyYW5zYWN0aW9ucy5zb21lKHRyID0+ICF0ci5pc1VzZXJFdmVudChcImlucHV0LnR5cGVcIikgJiYgdHIuY2hhbmdlcy50b3VjaGVzUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKSkpKSkge1xuICAgICAgICAgICAgdGhpcy5jb21wb3NpbmcuZHJpZnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2luZy5lZGl0b3JCYXNlID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRoaXMuY29tcG9zaW5nLmVkaXRvckJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmFwcGx5RWRpdHModXBkYXRlKSB8fCAhdGhpcy5yYW5nZUlzVmFsaWQodXBkYXRlLnN0YXRlKSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ29udGV4dENoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCB8fCByZXZlcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24odXBkYXRlLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlLmdlb21ldHJ5Q2hhbmdlZCB8fCB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0KVxuICAgICAgICAgICAgdXBkYXRlLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICB9XG4gICAgcmVzZXRSYW5nZShzdGF0ZSkge1xuICAgICAgICBsZXQgeyBoZWFkIH0gPSBzdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgdGhpcy5mcm9tID0gTWF0aC5tYXgoMCwgaGVhZCAtIDEwMDAwIC8qIEN4VnAuTWFyZ2luICovKTtcbiAgICAgICAgdGhpcy50byA9IE1hdGgubWluKHN0YXRlLmRvYy5sZW5ndGgsIGhlYWQgKyAxMDAwMCAvKiBDeFZwLk1hcmdpbiAqLyk7XG4gICAgfVxuICAgIHJlc2V0KHN0YXRlKSB7XG4gICAgICAgIHRoaXMucmVzZXRSYW5nZShzdGF0ZSk7XG4gICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlVGV4dCgwLCB0aGlzLmVkaXRDb250ZXh0LnRleHQubGVuZ3RoLCBzdGF0ZS5kb2Muc2xpY2VTdHJpbmcodGhpcy5mcm9tLCB0aGlzLnRvKSk7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKHN0YXRlKTtcbiAgICB9XG4gICAgcmV2ZXJ0UGVuZGluZyhzdGF0ZSkge1xuICAgICAgICBsZXQgcGVuZGluZyA9IHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2U7XG4gICAgICAgIHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0LnVwZGF0ZVRleHQodGhpcy50b0NvbnRleHRQb3MocGVuZGluZy5mcm9tKSwgdGhpcy50b0NvbnRleHRQb3MocGVuZGluZy5mcm9tICsgcGVuZGluZy5pbnNlcnQubGVuZ3RoKSwgc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHBlbmRpbmcuZnJvbSwgcGVuZGluZy50bykpO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb24oc3RhdGUpIHtcbiAgICAgICAgbGV0IHsgbWFpbiB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnRvQ29udGV4dFBvcyhNYXRoLm1heCh0aGlzLmZyb20sIE1hdGgubWluKHRoaXMudG8sIG1haW4uYW5jaG9yKSkpO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy50b0NvbnRleHRQb3MobWFpbi5oZWFkKTtcbiAgICAgICAgaWYgKHRoaXMuZWRpdENvbnRleHQuc2VsZWN0aW9uU3RhcnQgIT0gc3RhcnQgfHwgdGhpcy5lZGl0Q29udGV4dC5zZWxlY3Rpb25FbmQgIT0gZW5kKVxuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGVTZWxlY3Rpb24oc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIHJhbmdlSXNWYWxpZChzdGF0ZSkge1xuICAgICAgICBsZXQgeyBoZWFkIH0gPSBzdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgcmV0dXJuICEodGhpcy5mcm9tID4gMCAmJiBoZWFkIC0gdGhpcy5mcm9tIDwgNTAwIC8qIEN4VnAuTWluTWFyZ2luICovIHx8XG4gICAgICAgICAgICB0aGlzLnRvIDwgc3RhdGUuZG9jLmxlbmd0aCAmJiB0aGlzLnRvIC0gaGVhZCA8IDUwMCAvKiBDeFZwLk1pbk1hcmdpbiAqLyB8fFxuICAgICAgICAgICAgdGhpcy50byAtIHRoaXMuZnJvbSA+IDEwMDAwIC8qIEN4VnAuTWFyZ2luICovICogMyk7XG4gICAgfVxuICAgIHRvRWRpdG9yUG9zKGNvbnRleHRQb3MsIGNsaXBMZW4gPSB0aGlzLnRvIC0gdGhpcy5mcm9tKSB7XG4gICAgICAgIGNvbnRleHRQb3MgPSBNYXRoLm1pbihjb250ZXh0UG9zLCBjbGlwTGVuKTtcbiAgICAgICAgbGV0IGMgPSB0aGlzLmNvbXBvc2luZztcbiAgICAgICAgcmV0dXJuIGMgJiYgYy5kcmlmdGVkID8gYy5lZGl0b3JCYXNlICsgKGNvbnRleHRQb3MgLSBjLmNvbnRleHRCYXNlKSA6IGNvbnRleHRQb3MgKyB0aGlzLmZyb207XG4gICAgfVxuICAgIHRvQ29udGV4dFBvcyhlZGl0b3JQb3MpIHtcbiAgICAgICAgbGV0IGMgPSB0aGlzLmNvbXBvc2luZztcbiAgICAgICAgcmV0dXJuIGMgJiYgYy5kcmlmdGVkID8gYy5jb250ZXh0QmFzZSArIChlZGl0b3JQb3MgLSBjLmVkaXRvckJhc2UpIDogZWRpdG9yUG9zIC0gdGhpcy5mcm9tO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBldmVudCBpbiB0aGlzLmhhbmRsZXJzKVxuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCB0aGlzLmhhbmRsZXJzW2V2ZW50XSk7XG4gICAgfVxufVxuXG4vLyBUaGUgZWRpdG9yJ3MgdXBkYXRlIHN0YXRlIG1hY2hpbmUgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczpcbi8vXG4vLyAgICAgSWRsZSBcdTIxOTIgVXBkYXRpbmcgXHUyMUM2IElkbGUgKHVuY2hlY2tlZCkgXHUyMTkyIE1lYXN1cmluZyBcdTIxOTIgSWRsZVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjE5MSAgICAgIFx1MjE5M1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0aW5nIChtZWFzdXJlKVxuLy9cbi8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJ0lkbGUnIGFuZCAnSWRsZSAodW5jaGVja2VkKScgbGllcyBpblxuLy8gd2hldGhlciBhIGxheW91dCBjaGVjayBoYXMgYmVlbiBzY2hlZHVsZWQuIEEgcmVndWxhciB1cGRhdGUgdGhyb3VnaFxuLy8gdGhlIGB1cGRhdGVgIG1ldGhvZCB1cGRhdGVzIHRoZSBET00gaW4gYSB3cml0ZS1vbmx5IGZhc2hpb24sIGFuZFxuLy8gcmVsaWVzIG9uIGEgY2hlY2sgKHNjaGVkdWxlZCB3aXRoIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgKSB0byBtYWtlXG4vLyBzdXJlIGV2ZXJ5dGhpbmcgaXMgd2hlcmUgaXQgc2hvdWxkIGJlIGFuZCB0aGUgdmlld3BvcnQgY292ZXJzIHRoZVxuLy8gdmlzaWJsZSBjb2RlLiBUaGF0IGNoZWNrIGNvbnRpbnVlcyB0byBtZWFzdXJlIGFuZCB0aGVuIG9wdGlvbmFsbHlcbi8vIHVwZGF0ZSB1bnRpbCBpdCByZWFjaGVzIGEgY29oZXJlbnQgc3RhdGUuXG4vKipcbkFuIGVkaXRvciB2aWV3IHJlcHJlc2VudHMgdGhlIGVkaXRvcidzIHVzZXIgaW50ZXJmYWNlLiBJdCBob2xkc1xudGhlIGVkaXRhYmxlIERPTSBzdXJmYWNlLCBhbmQgcG9zc2libHkgb3RoZXIgZWxlbWVudHMgc3VjaCBhcyB0aGVcbmxpbmUgbnVtYmVyIGd1dHRlci4gSXQgaGFuZGxlcyBldmVudHMgYW5kIGRpc3BhdGNoZXMgc3RhdGVcbnRyYW5zYWN0aW9ucyBmb3IgZWRpdGluZyBhY3Rpb25zLlxuKi9cbmNsYXNzIEVkaXRvclZpZXcge1xuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnN0YXRlOyB9XG4gICAgLyoqXG4gICAgVG8gYmUgYWJsZSB0byBkaXNwbGF5IGxhcmdlIGRvY3VtZW50cyB3aXRob3V0IGNvbnN1bWluZyB0b28gbXVjaFxuICAgIG1lbW9yeSBvciBvdmVybG9hZGluZyB0aGUgYnJvd3NlciwgQ29kZU1pcnJvciBvbmx5IGRyYXdzIHRoZVxuICAgIGNvZGUgdGhhdCBpcyB2aXNpYmxlIChwbHVzIGEgbWFyZ2luIGFyb3VuZCBpdCkgdG8gdGhlIERPTS4gVGhpc1xuICAgIHByb3BlcnR5IHRlbGxzIHlvdSB0aGUgZXh0ZW50IG9mIHRoZSBjdXJyZW50IGRyYXduIHZpZXdwb3J0LCBpblxuICAgIGRvY3VtZW50IHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnZpZXdwb3J0OyB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGVyZSBhcmUsIGZvciBleGFtcGxlLCBsYXJnZSBjb2xsYXBzZWQgcmFuZ2VzIGluIHRoZVxuICAgIHZpZXdwb3J0LCBpdHMgc2l6ZSBjYW4gYmUgYSBsb3QgYmlnZ2VyIHRoYW4gdGhlIGFjdHVhbCB2aXNpYmxlXG4gICAgY29udGVudC4gVGh1cywgaWYgeW91IGFyZSBkb2luZyBzb21ldGhpbmcgbGlrZSBzdHlsaW5nIHRoZVxuICAgIGNvbnRlbnQgaW4gdGhlIHZpZXdwb3J0LCBpdCBpcyBwcmVmZXJhYmxlIHRvIG9ubHkgZG8gc28gZm9yXG4gICAgdGhlc2UgcmFuZ2VzLCB3aGljaCBhcmUgdGhlIHN1YnNldCBvZiB0aGUgdmlld3BvcnQgdGhhdCBpc1xuICAgIGFjdHVhbGx5IGRyYXduLlxuICAgICovXG4gICAgZ2V0IHZpc2libGVSYW5nZXMoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aXNpYmxlUmFuZ2VzOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBmYWxzZSB3aGVuIHRoZSBlZGl0b3IgaXMgZW50aXJlbHkgc2Nyb2xsZWQgb3V0IG9mIHZpZXdcbiAgICBvciBvdGhlcndpc2UgaGlkZGVuLlxuICAgICovXG4gICAgZ2V0IGluVmlldygpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmluVmlldzsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjb21wb3NpbmcgdGV4dCB2aWFcbiAgICBbSU1FXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnB1dF9tZXRob2QpLCBhbmQgYXQgbGVhc3RcbiAgICBvbmUgY2hhbmdlIGhhcyBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgY29tcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaW5nKCkgeyByZXR1cm4gISF0aGlzLmlucHV0U3RhdGUgJiYgdGhpcy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+IDA7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgaW4gY29tcG9zaW5nIHN0YXRlLiBOb3RlXG4gICAgdGhhdCBvbiBzb21lIHBsYXRmb3JtcywgbGlrZSBBbmRyb2lkLCB0aGlzIHdpbGwgYmUgdGhlIGNhc2UgYVxuICAgIGxvdCwgc2luY2UganVzdCBwdXR0aW5nIHRoZSBjdXJzb3Igb24gYSB3b3JkIHN0YXJ0cyBhXG4gICAgY29tcG9zaXRpb24gdGhlcmUuXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaXRpb25TdGFydGVkKCkgeyByZXR1cm4gISF0aGlzLmlucHV0U3RhdGUgJiYgdGhpcy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwOyB9XG4gICAgLyoqXG4gICAgVGhlIGRvY3VtZW50IG9yIHNoYWRvdyByb290IHRoYXQgdGhlIHZpZXcgbGl2ZXMgaW4uXG4gICAgKi9cbiAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHRoaXMuX3Jvb3Q7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCB3aW4oKSB7IHJldHVybiB0aGlzLmRvbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgfVxuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIG5ldyB2aWV3LiBZb3UnbGwgd2FudCB0byBlaXRoZXIgcHJvdmlkZSBhIGBwYXJlbnRgXG4gICAgb3B0aW9uLCBvciBwdXQgYHZpZXcuZG9tYCBpbnRvIHlvdXIgZG9jdW1lbnQgYWZ0ZXIgY3JlYXRpbmcgYVxuICAgIHZpZXcsIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNlZSB0aGUgZWRpdG9yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW5NYXAgPSBuZXcgTWFwO1xuICAgICAgICB0aGlzLmVkaXRvckF0dHJzID0ge307XG4gICAgICAgIHRoaXMuY29udGVudEF0dHJzID0ge307XG4gICAgICAgIHRoaXMuYmlkaUNhY2hlID0gW107XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxdWVzdHMgPSBbXTtcbiAgICAgICAgdGhpcy5jb250ZW50RE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnNjcm9sbERPTS50YWJJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNjcm9sbERPTS5jbGFzc05hbWUgPSBcImNtLXNjcm9sbGVyXCI7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKHRoaXMuY29udGVudERPTSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VET00gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NLmNsYXNzTmFtZSA9IFwiY20tYW5ub3VuY2VkXCI7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VET00uc2V0QXR0cmlidXRlKFwiYXJpYS1saXZlXCIsIFwicG9saXRlXCIpO1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKHRoaXMuYW5ub3VuY2VET00pO1xuICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbERPTSk7XG4gICAgICAgIGlmIChjb25maWcucGFyZW50KVxuICAgICAgICAgICAgY29uZmlnLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmRvbSk7XG4gICAgICAgIGxldCB7IGRpc3BhdGNoIH0gPSBjb25maWc7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hUcmFuc2FjdGlvbnMgPSBjb25maWcuZGlzcGF0Y2hUcmFuc2FjdGlvbnMgfHxcbiAgICAgICAgICAgIChkaXNwYXRjaCAmJiAoKHRycykgPT4gdHJzLmZvckVhY2godHIgPT4gZGlzcGF0Y2godHIsIHRoaXMpKSkpIHx8XG4gICAgICAgICAgICAoKHRycykgPT4gdGhpcy51cGRhdGUodHJzKSk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSAoY29uZmlnLnJvb3QgfHwgZ2V0Um9vdChjb25maWcucGFyZW50KSB8fCBkb2N1bWVudCk7XG4gICAgICAgIHRoaXMudmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZShjb25maWcuc3RhdGUgfHwgRWRpdG9yU3RhdGUuY3JlYXRlKGNvbmZpZykpO1xuICAgICAgICBpZiAoY29uZmlnLnNjcm9sbFRvICYmIGNvbmZpZy5zY3JvbGxUby5pcyhzY3JvbGxJbnRvVmlldykpXG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPSBjb25maWcuc2Nyb2xsVG8udmFsdWUuY2xpcCh0aGlzLnZpZXdTdGF0ZS5zdGF0ZSk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IHRoaXMuc3RhdGUuZmFjZXQodmlld1BsdWdpbikubWFwKHNwZWMgPT4gbmV3IFBsdWdpbkluc3RhbmNlKHNwZWMpKTtcbiAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgIHBsdWdpbi51cGRhdGUodGhpcyk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgRE9NT2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuaW5wdXRTdGF0ZSA9IG5ldyBJbnB1dFN0YXRlKHRoaXMpO1xuICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICAgICAgdGhpcy5kb2NWaWV3ID0gbmV3IERvY1ZpZXcodGhpcyk7XG4gICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVBdHRycygpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB0aGlzLnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgIGlmICgoX2EgPSBkb2N1bWVudC5mb250cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlYWR5KVxuICAgICAgICAgICAgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbigoKSA9PiB0aGlzLnJlcXVlc3RNZWFzdXJlKCkpO1xuICAgIH1cbiAgICBkaXNwYXRjaCguLi5pbnB1dCkge1xuICAgICAgICBsZXQgdHJzID0gaW5wdXQubGVuZ3RoID09IDEgJiYgaW5wdXRbMF0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbiA/IGlucHV0XG4gICAgICAgICAgICA6IGlucHV0Lmxlbmd0aCA9PSAxICYmIEFycmF5LmlzQXJyYXkoaW5wdXRbMF0pID8gaW5wdXRbMF1cbiAgICAgICAgICAgICAgICA6IFt0aGlzLnN0YXRlLnVwZGF0ZSguLi5pbnB1dCldO1xuICAgICAgICB0aGlzLmRpc3BhdGNoVHJhbnNhY3Rpb25zKHRycywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgdmlldyBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIHRyYW5zYWN0aW9ucy4gVGhpcyB3aWxsXG4gICAgdXBkYXRlIHRoZSB2aXNpYmxlIGRvY3VtZW50IGFuZCBzZWxlY3Rpb24gdG8gbWF0Y2ggdGhlIHN0YXRlXG4gICAgcHJvZHVjZWQgYnkgdGhlIHRyYW5zYWN0aW9ucywgYW5kIG5vdGlmeSB2aWV3IHBsdWdpbnMgb2YgdGhlXG4gICAgY2hhbmdlLiBZb3Ugc2hvdWxkIHVzdWFsbHkgY2FsbFxuICAgIFtgZGlzcGF0Y2hgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kaXNwYXRjaCkgaW5zdGVhZCwgd2hpY2ggdXNlcyB0aGlzXG4gICAgYXMgYSBwcmltaXRpdmUuXG4gICAgKi9cbiAgICB1cGRhdGUodHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlICE9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxzIHRvIEVkaXRvclZpZXcudXBkYXRlIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3NcIik7XG4gICAgICAgIGxldCByZWRyYXduID0gZmFsc2UsIGF0dHJzQ2hhbmdlZCA9IGZhbHNlLCB1cGRhdGU7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRyYW5zYWN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHRyLnN0YXJ0U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gdXBkYXRlIHN0YXRlIHdpdGggYSB0cmFuc2FjdGlvbiB0aGF0IGRvZXNuJ3Qgc3RhcnQgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUuXCIpO1xuICAgICAgICAgICAgc3RhdGUgPSB0ci5zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvY3VzID0gdGhpcy5oYXNGb2N1cywgZm9jdXNGbGFnID0gMCwgZGlzcGF0Y2hGb2N1cyA9IG51bGw7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5hbm5vdGF0aW9uKGlzRm9jdXNDaGFuZ2UpKSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCA9IGZvY3VzO1xuICAgICAgICAgICAgLy8gSWYgYSBmb2N1cy1jaGFuZ2UgdHJhbnNhY3Rpb24gaXMgYmVpbmcgZGlzcGF0Y2hlZCwgc2V0IHRoaXMgdXBkYXRlIGZsYWcuXG4gICAgICAgICAgICBmb2N1c0ZsYWcgPSAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9jdXMgIT0gdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCA9IGZvY3VzO1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBzZXBhcmF0ZSBmb2N1cyB0cmFuc2FjdGlvbiBpZiBuZWNlc3NhcnksIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gYWRkIGEgZmxhZyB0byB0aGlzIHVwZGF0ZVxuICAgICAgICAgICAgZGlzcGF0Y2hGb2N1cyA9IGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24oc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgICAgIGlmICghZGlzcGF0Y2hGb2N1cylcbiAgICAgICAgICAgICAgICBmb2N1c0ZsYWcgPSAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi87XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgcGVuZGluZyBET00gY2hhbmdlLCBlYWdlcmx5IHJlYWQgaXQgYW5kIHRyeSB0b1xuICAgICAgICAvLyBhcHBseSBpdCBhZnRlciB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25zLlxuICAgICAgICBsZXQgcGVuZGluZ0tleSA9IHRoaXMub2JzZXJ2ZXIuZGVsYXllZEFuZHJvaWRLZXksIGRvbUNoYW5nZSA9IG51bGw7XG4gICAgICAgIGlmIChwZW5kaW5nS2V5KSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKTtcbiAgICAgICAgICAgIGRvbUNoYW5nZSA9IHRoaXMub2JzZXJ2ZXIucmVhZENoYW5nZSgpO1xuICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gYXBwbHkgRE9NIGNoYW5nZXMgaWYgdGhlIHRyYW5zYWN0aW9ucyBkaWRuJ3RcbiAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZG9jIG9yIHNlbGVjdGlvbi5cbiAgICAgICAgICAgIGlmIChkb21DaGFuZ2UgJiYgIXRoaXMuc3RhdGUuZG9jLmVxKHN0YXRlLmRvYykgfHwgIXRoaXMuc3RhdGUuc2VsZWN0aW9uLmVxKHN0YXRlLnNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgZG9tQ2hhbmdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBwaHJhc2VzIGNoYW5nZSwgcmVkcmF3IHRoZSBlZGl0b3JcbiAgICAgICAgaWYgKHN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpICE9IHRoaXMuc3RhdGUuZmFjZXQoRWRpdG9yU3RhdGUucGhyYXNlcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIHVwZGF0ZSA9IFZpZXdVcGRhdGUuY3JlYXRlKHRoaXMsIHN0YXRlLCB0cmFuc2FjdGlvbnMpO1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gZm9jdXNGbGFnO1xuICAgICAgICBsZXQgc2Nyb2xsVGFyZ2V0ID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBzY3JvbGxUYXJnZXQubWFwKHRyLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0ci5zY3JvbGxJbnRvVmlldykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBtYWluIH0gPSB0ci5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRhcmdldCA9IG5ldyBTY3JvbGxUYXJnZXQobWFpbi5lbXB0eSA/IG1haW4gOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG1haW4uaGVhZCwgbWFpbi5oZWFkID4gbWFpbi5hbmNob3IgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5pcyhzY3JvbGxJbnRvVmlldykpXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBlLnZhbHVlLmNsaXAodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS51cGRhdGUodXBkYXRlLCBzY3JvbGxUYXJnZXQpO1xuICAgICAgICAgICAgdGhpcy5iaWRpQ2FjaGUgPSBDYWNoZWRPcmRlci51cGRhdGUodGhpcy5iaWRpQ2FjaGUsIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgICAgIGlmICghdXBkYXRlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5zKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVkcmF3biA9IHRoaXMuZG9jVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmZhY2V0KHN0eWxlTW9kdWxlKSAhPSB0aGlzLnN0eWxlTW9kdWxlcylcbiAgICAgICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgICAgICBhdHRyc0NoYW5nZWQgPSB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLnNob3dBbm5vdW5jZW1lbnRzKHRyYW5zYWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKHJlZHJhd24sIHRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLmlzVXNlckV2ZW50KFwic2VsZWN0LnBvaW50ZXJcIikpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHRoZW1lKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQodGhlbWUpKVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJlZHJhd24gfHwgYXR0cnNDaGFuZ2VkIHx8IHNjcm9sbFRhcmdldCB8fCB0aGlzLnZpZXdTdGF0ZS5tdXN0RW5mb3JjZUN1cnNvckFzc29jIHx8IHRoaXMudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudClcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgaWYgKHJlZHJhd24pXG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXdVcGRhdGUoKTtcbiAgICAgICAgaWYgKCF1cGRhdGUuZW1wdHkpXG4gICAgICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLnN0YXRlLmZhY2V0KHVwZGF0ZUxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlLCBcInVwZGF0ZSBsaXN0ZW5lclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwYXRjaEZvY3VzIHx8IGRvbUNoYW5nZSlcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaEZvY3VzICYmIHRoaXMuc3RhdGUgPT0gZGlzcGF0Y2hGb2N1cy5zdGFydFN0YXRlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKGRpc3BhdGNoRm9jdXMpO1xuICAgICAgICAgICAgICAgIGlmIChkb21DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcHBseURPTUNoYW5nZSh0aGlzLCBkb21DaGFuZ2UpICYmIHBlbmRpbmdLZXkuZm9yY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh0aGlzLmNvbnRlbnRET00sIHBlbmRpbmdLZXkua2V5LCBwZW5kaW5nS2V5LmtleUNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXNldCB0aGUgdmlldyB0byB0aGUgZ2l2ZW4gc3RhdGUuIChUaGlzIHdpbGwgY2F1c2UgdGhlIGVudGlyZVxuICAgIGRvY3VtZW50IHRvIGJlIHJlZHJhd24gYW5kIGFsbCB2aWV3IHBsdWdpbnMgdG8gYmUgcmVpbml0aWFsaXplZCxcbiAgICBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIGl0IHdoZW4gdGhlIG5ldyBzdGF0ZSBpc24ndFxuICAgIGRlcml2ZWQgZnJvbSB0aGUgb2xkIHN0YXRlLiBPdGhlcndpc2UsIHVzZVxuICAgIFtgZGlzcGF0Y2hgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kaXNwYXRjaCkgaW5zdGVhZC4pXG4gICAgKi9cbiAgICBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxscyB0byBFZGl0b3JWaWV3LnNldFN0YXRlIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3NcIik7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLztcbiAgICAgICAgbGV0IGhhZEZvY3VzID0gdGhpcy5oYXNGb2N1cztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3U3RhdGUuZmFjZXQodmlld1BsdWdpbikubWFwKHNwZWMgPT4gbmV3IFBsdWdpbkluc3RhbmNlKHNwZWMpKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLmNsZWFyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHBsdWdpbi51cGRhdGUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3ID0gbmV3IERvY1ZpZXcodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICAgICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgICAgIHRoaXMuYmlkaUNhY2hlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYWRGb2N1cylcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgIH1cbiAgICB1cGRhdGVQbHVnaW5zKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcHJldlNwZWNzID0gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQodmlld1BsdWdpbiksIHNwZWNzID0gdXBkYXRlLnN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pO1xuICAgICAgICBpZiAocHJldlNwZWNzICE9IHNwZWNzKSB7XG4gICAgICAgICAgICBsZXQgbmV3UGx1Z2lucyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IHByZXZTcGVjcy5pbmRleE9mKHNwZWMpO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGx1Z2lucy5wdXNoKG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy5wbHVnaW5zW2ZvdW5kXTtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLm11c3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5tdXN0VXBkYXRlICE9IHVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMgPSBuZXdQbHVnaW5zO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXAuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHAubXVzdFVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMucGx1Z2luc1tpXS51cGRhdGUodGhpcyk7XG4gICAgICAgIGlmIChwcmV2U3BlY3MgIT0gc3BlY3MpXG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICB9XG4gICAgZG9jVmlld1VwZGF0ZSgpIHtcbiAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAgICAgbGV0IHZhbCA9IHBsdWdpbi52YWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLmRvY1ZpZXdVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YWwuZG9jVmlld1VwZGF0ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUsIFwiZG9jIHZpZXcgdXBkYXRlIGxpc3RlbmVyXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1lYXN1cmUoZmx1c2ggPSB0cnVlKSB7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5tZWFzdXJlU2NoZWR1bGVkKTtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIuZGVsYXllZEFuZHJvaWRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IDA7IC8vIFByZXZlbnQgcmVxdWVzdE1lYXN1cmUgY2FsbHMgZnJvbSBzY2hlZHVsaW5nIGFub3RoZXIgYW5pbWF0aW9uIGZyYW1lXG4gICAgICAgIGlmIChmbHVzaClcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IG51bGw7XG4gICAgICAgIGxldCBzRE9NID0gdGhpcy5zY3JvbGxET00sIHNjcm9sbFRvcCA9IHNET00uc2Nyb2xsVG9wICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGxldCB7IHNjcm9sbEFuY2hvclBvcywgc2Nyb2xsQW5jaG9ySGVpZ2h0IH0gPSB0aGlzLnZpZXdTdGF0ZTtcbiAgICAgICAgaWYgKE1hdGguYWJzKHNjcm9sbFRvcCAtIHRoaXMudmlld1N0YXRlLnNjcm9sbFRvcCkgPiAxKVxuICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgIHRoaXMudmlld1N0YXRlLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsQW5jaG9ySGVpZ2h0IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTY3JvbGxlZFRvQm90dG9tKHNET00pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JQb3MgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IHRoaXMudmlld1N0YXRlLmhlaWdodE1hcC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxBbmNob3JBdChzY3JvbGxUb3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9yUG9zID0gYmxvY2suZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IGJsb2NrLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMSAvKiBVcGRhdGVTdGF0ZS5NZWFzdXJpbmcgKi87XG4gICAgICAgICAgICAgICAgbGV0IGNoYW5nZWQgPSB0aGlzLnZpZXdTdGF0ZS5tZWFzdXJlKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiAhdGhpcy5tZWFzdXJlUmVxdWVzdHMubGVuZ3RoICYmIHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIk1lYXN1cmUgbG9vcCByZXN0YXJ0ZWQgbW9yZSB0aGFuIDUgdGltZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlZpZXdwb3J0IGZhaWxlZCB0byBzdGFiaWxpemVcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyaW5nID0gW107XG4gICAgICAgICAgICAgICAgLy8gT25seSBydW4gbWVhc3VyZSByZXF1ZXN0cyBpbiB0aGlzIGN5Y2xlIHdoZW4gdGhlIHZpZXdwb3J0IGRpZG4ndCBjaGFuZ2VcbiAgICAgICAgICAgICAgICBpZiAoIShjaGFuZ2VkICYgNCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0ICovKSlcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMubWVhc3VyZVJlcXVlc3RzLCBtZWFzdXJpbmddID0gW21lYXN1cmluZywgdGhpcy5tZWFzdXJlUmVxdWVzdHNdO1xuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJlZCA9IG1lYXN1cmluZy5tYXAobSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5yZWFkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy5zdGF0ZSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFkTWVhc3VyZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCB1cGRhdGUgPSBWaWV3VXBkYXRlLmNyZWF0ZSh0aGlzLCB0aGlzLnN0YXRlLCBbXSksIHJlZHJhd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gY2hhbmdlZDtcbiAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLmZsYWdzIHw9IGNoYW5nZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGUuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5zKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBdHRycygpO1xuICAgICAgICAgICAgICAgICAgICByZWRyYXduID0gdGhpcy5kb2NWaWV3LnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVkcmF3bilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlld1VwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lYXN1cmluZy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVkW2ldICE9IEJhZE1lYXN1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBtZWFzdXJpbmdbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0ud3JpdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ud3JpdGUobWVhc3VyZWRbaV0sIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy5zdGF0ZSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVkcmF3bilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbih0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZS52aWV3cG9ydENoYW5nZWQgJiYgdGhpcy5tZWFzdXJlUmVxdWVzdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmlld1N0YXRlLmVkaXRvckhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy5zY3JvbGxJbnRvVmlldyh0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3QW5jaG9ySGVpZ2h0ID0gc2Nyb2xsQW5jaG9yUG9zIDwgMCA/IHRoaXMudmlld1N0YXRlLmhlaWdodE1hcC5oZWlnaHQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5saW5lQmxvY2tBdChzY3JvbGxBbmNob3JQb3MpLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlmZiA9IG5ld0FuY2hvckhlaWdodCAtIHNjcm9sbEFuY2hvckhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDEgfHwgZGlmZiA8IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcCA9IHNjcm9sbFRvcCArIGRpZmY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNET00uc2Nyb2xsVG9wID0gc2Nyb2xsVG9wIC8gdGhpcy5zY2FsZVk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkICYmICF1cGRhdGVkLmVtcHR5KVxuICAgICAgICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgdGhpcy5zdGF0ZS5mYWNldCh1cGRhdGVMaXN0ZW5lcikpXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIodXBkYXRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgQ1NTIGNsYXNzZXMgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIGVkaXRvciB0aGVtZXMuXG4gICAgKi9cbiAgICBnZXQgdGhlbWVDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gYmFzZVRoZW1lSUQgKyBcIiBcIiArXG4gICAgICAgICAgICAodGhpcy5zdGF0ZS5mYWNldChkYXJrVGhlbWUpID8gYmFzZURhcmtJRCA6IGJhc2VMaWdodElEKSArIFwiIFwiICtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZmFjZXQodGhlbWUpO1xuICAgIH1cbiAgICB1cGRhdGVBdHRycygpIHtcbiAgICAgICAgbGV0IGVkaXRvckF0dHJzID0gYXR0cnNGcm9tRmFjZXQodGhpcywgZWRpdG9yQXR0cmlidXRlcywge1xuICAgICAgICAgICAgY2xhc3M6IFwiY20tZWRpdG9yXCIgKyAodGhpcy5oYXNGb2N1cyA/IFwiIGNtLWZvY3VzZWQgXCIgOiBcIiBcIikgKyB0aGlzLnRoZW1lQ2xhc3Nlc1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGNvbnRlbnRBdHRycyA9IHtcbiAgICAgICAgICAgIHNwZWxsY2hlY2s6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIGF1dG9jb3JyZWN0OiBcIm9mZlwiLFxuICAgICAgICAgICAgYXV0b2NhcGl0YWxpemU6IFwib2ZmXCIsXG4gICAgICAgICAgICB3cml0aW5nc3VnZ2VzdGlvbnM6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIHRyYW5zbGF0ZTogXCJub1wiLFxuICAgICAgICAgICAgY29udGVudGVkaXRhYmxlOiAhdGhpcy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgPyBcImZhbHNlXCIgOiBcInRydWVcIixcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWNvbnRlbnRcIixcbiAgICAgICAgICAgIHN0eWxlOiBgJHticm93c2VyLnRhYlNpemV9OiAke3RoaXMuc3RhdGUudGFiU2l6ZX1gLFxuICAgICAgICAgICAgcm9sZTogXCJ0ZXh0Ym94XCIsXG4gICAgICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwidHJ1ZVwiXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICAgICAgY29udGVudEF0dHJzW1wiYXJpYS1yZWFkb25seVwiXSA9IFwidHJ1ZVwiO1xuICAgICAgICBhdHRyc0Zyb21GYWNldCh0aGlzLCBjb250ZW50QXR0cmlidXRlcywgY29udGVudEF0dHJzKTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSB0aGlzLm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZENvbnRlbnQgPSB1cGRhdGVBdHRycyh0aGlzLmNvbnRlbnRET00sIHRoaXMuY29udGVudEF0dHJzLCBjb250ZW50QXR0cnMpO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRFZGl0b3IgPSB1cGRhdGVBdHRycyh0aGlzLmRvbSwgdGhpcy5lZGl0b3JBdHRycywgZWRpdG9yQXR0cnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWRDb250ZW50IHx8IGNoYW5nZWRFZGl0b3I7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVkaXRvckF0dHJzID0gZWRpdG9yQXR0cnM7XG4gICAgICAgIHRoaXMuY29udGVudEF0dHJzID0gY29udGVudEF0dHJzO1xuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG4gICAgc2hvd0Fubm91bmNlbWVudHModHJzKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRycylcbiAgICAgICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgICAgIGlmIChlZmZlY3QuaXMoRWRpdG9yVmlldy5hbm5vdW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdW5jZURPTS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXYgPSB0aGlzLmFubm91bmNlRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICAgICAgICAgICAgICBkaXYudGV4dENvbnRlbnQgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgIH1cbiAgICBtb3VudFN0eWxlcygpIHtcbiAgICAgICAgdGhpcy5zdHlsZU1vZHVsZXMgPSB0aGlzLnN0YXRlLmZhY2V0KHN0eWxlTW9kdWxlKTtcbiAgICAgICAgbGV0IG5vbmNlID0gdGhpcy5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LmNzcE5vbmNlKTtcbiAgICAgICAgU3R5bGVNb2R1bGUubW91bnQodGhpcy5yb290LCB0aGlzLnN0eWxlTW9kdWxlcy5jb25jYXQoYmFzZVRoZW1lJDEpLnJldmVyc2UoKSwgbm9uY2UgPyB7IG5vbmNlIH0gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZWFkTWVhc3VyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlID09IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFkaW5nIHRoZSBlZGl0b3IgbGF5b3V0IGlzbid0IGFsbG93ZWQgZHVyaW5nIGFuIHVwZGF0ZVwiKTtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgPT0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovICYmIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlKGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2NoZWR1bGUgYSBsYXlvdXQgbWVhc3VyZW1lbnQsIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGNhbGxiYWNrcyB0b1xuICAgIGRvIGN1c3RvbSBET00gbWVhc3VyaW5nIGZvbGxvd2VkIGJ5IGEgRE9NIHdyaXRlIHBoYXNlLiBVc2luZ1xuICAgIHRoaXMgaXMgcHJlZmVyYWJsZSByZWFkaW5nIERPTSBsYXlvdXQgZGlyZWN0bHkgZnJvbSwgZm9yXG4gICAgZXhhbXBsZSwgYW4gZXZlbnQgaGFuZGxlciwgYmVjYXVzZSBpdCdsbCBtYWtlIHN1cmUgbWVhc3VyaW5nIGFuZFxuICAgIGRyYXdpbmcgZG9uZSBieSBvdGhlciBjb21wb25lbnRzIGlzIHN5bmNocm9uaXplZCwgYXZvaWRpbmdcbiAgICB1bm5lY2Vzc2FyeSBET00gbGF5b3V0IGNvbXB1dGF0aW9ucy5cbiAgICAqL1xuICAgIHJlcXVlc3RNZWFzdXJlKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA8IDApXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSB0aGlzLndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5tZWFzdXJlKCkpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVhc3VyZVJlcXVlc3RzLmluZGV4T2YocmVxdWVzdCkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5rZXkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lYXN1cmVSZXF1ZXN0c1tpXS5rZXkgPT09IHJlcXVlc3Qua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0c1tpXSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBwbHVnaW4sIGlmIHByZXNlbnQuIE5vdGUgdGhhdFxuICAgIHBsdWdpbnMgdGhhdCBjcmFzaCBjYW4gYmUgZHJvcHBlZCBmcm9tIGEgdmlldywgc28gZXZlbiB3aGVuIHlvdVxuICAgIGtub3cgeW91IHJlZ2lzdGVyZWQgYSBnaXZlbiBwbHVnaW4sIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNoZWNrXG4gICAgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZC5cbiAgICAqL1xuICAgIHBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgbGV0IGtub3duID0gdGhpcy5wbHVnaW5NYXAuZ2V0KHBsdWdpbik7XG4gICAgICAgIGlmIChrbm93biA9PT0gdW5kZWZpbmVkIHx8IGtub3duICYmIGtub3duLnNwZWMgIT0gcGx1Z2luKVxuICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXAuc2V0KHBsdWdpbiwga25vd24gPSB0aGlzLnBsdWdpbnMuZmluZChwID0+IHAuc3BlYyA9PSBwbHVnaW4pIHx8IG51bGwpO1xuICAgICAgICByZXR1cm4ga25vd24gJiYga25vd24udXBkYXRlKHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudCwgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLiBUaGlzXG4gICAgbWF5IGJlIG5lZ2F0aXZlIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxlZCBkb3duLiBQb2ludHNcbiAgICBkaXJlY3RseSB0byB0aGUgdG9wIG9mIHRoZSBmaXJzdCBsaW5lLCBub3QgYWJvdmUgdGhlIHBhZGRpbmcuXG4gICAgKi9cbiAgICBnZXQgZG9jdW1lbnRUb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy52aWV3U3RhdGUucGFkZGluZ1RvcDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwb3J0cyB0aGUgcGFkZGluZyBhYm92ZSBhbmQgYmVsb3cgdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRvY3VtZW50UGFkZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHsgdG9wOiB0aGlzLnZpZXdTdGF0ZS5wYWRkaW5nVG9wLCBib3R0b206IHRoaXMudmlld1N0YXRlLnBhZGRpbmdCb3R0b20gfTtcbiAgICB9XG4gICAgLyoqXG4gICAgSWYgdGhlIGVkaXRvciBpcyB0cmFuc2Zvcm1lZCB3aXRoIENTUywgdGhpcyBwcm92aWRlcyB0aGUgc2NhbGVcbiAgICBhbG9uZyB0aGUgWCBheGlzLiBPdGhlcndpc2UsIGl0IHdpbGwganVzdCBiZSAxLiBOb3RlIHRoYXRcbiAgICB0cmFuc2Zvcm1zIG90aGVyIHRoYW4gdHJhbnNsYXRpb24gYW5kIHNjYWxpbmcgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgKi9cbiAgICBnZXQgc2NhbGVYKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuc2NhbGVYOyB9XG4gICAgLyoqXG4gICAgUHJvdmlkZSB0aGUgQ1NTIHRyYW5zZm9ybWVkIHNjYWxlIGFsb25nIHRoZSBZIGF4aXMuXG4gICAgKi9cbiAgICBnZXQgc2NhbGVZKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuc2NhbGVZOyB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdGV4dCBsaW5lIG9yIGJsb2NrIHdpZGdldCBhdCB0aGUgZ2l2ZW4gdmVydGljYWxcbiAgICBwb3NpdGlvbiAod2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIFt0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvY3VtZW50VG9wKSkuXG4gICAgKi9cbiAgICBlbGVtZW50QXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5lbGVtZW50QXRIZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgbGluZSBibG9jayAoc2VlXG4gICAgW2BsaW5lQmxvY2tBdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVCbG9ja0F0KSBhdCB0aGUgZ2l2ZW5cbiAgICBoZWlnaHQsIGFnYWluIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBbdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb2N1bWVudFRvcCkuXG4gICAgKi9cbiAgICBsaW5lQmxvY2tBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0SGVpZ2h0KGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZXh0ZW50IGFuZCB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBhbGwgW2xpbmVcbiAgICBibG9ja3NdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVCbG9ja0F0KSBpbiB0aGUgdmlld3BvcnQuIFBvc2l0aW9uc1xuICAgIGFyZSByZWxhdGl2ZSB0byB0aGUgW3RvcCBvZiB0aGVcbiAgICBkb2N1bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9jdW1lbnRUb3ApO1xuICAgICovXG4gICAgZ2V0IHZpZXdwb3J0TGluZUJsb2NrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLnZpZXdwb3J0TGluZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGxpbmUgYmxvY2sgYXJvdW5kIHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi4gQSBsaW5lXG4gICAgYmxvY2sgaXMgYSByYW5nZSBkZWxpbWl0ZWQgb24gYm90aCBzaWRlcyBieSBlaXRoZXIgYVxuICAgIG5vbi1baGlkZGVuXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvbl5yZXBsYWNlKSBsaW5lIGJyZWFrLCBvciB0aGVcbiAgICBzdGFydC9lbmQgb2YgdGhlIGRvY3VtZW50LiBJdCB3aWxsIHVzdWFsbHkganVzdCBob2xkIGEgbGluZSBvZlxuICAgIHRleHQsIGJ1dCBtYXkgYmUgYnJva2VuIGludG8gbXVsdGlwbGUgdGV4dGJsb2NrcyBieSBibG9ja1xuICAgIHdpZGdldHMuXG4gICAgKi9cbiAgICBsaW5lQmxvY2tBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBlZGl0b3IncyB0b3RhbCBjb250ZW50IGhlaWdodC5cbiAgICAqL1xuICAgIGdldCBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUuY29udGVudEhlaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBhIGN1cnNvciBwb3NpdGlvbiBieSBbZ3JhcGhlbWVcbiAgICBjbHVzdGVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLmZpbmRDbHVzdGVyQnJlYWspLiBgZm9yd2FyZGAgZGV0ZXJtaW5lcyB3aGV0aGVyXG4gICAgdGhlIG1vdGlvbiBpcyBhd2F5IGZyb20gdGhlIGxpbmUgc3RhcnQsIG9yIHRvd2FyZHMgaXQuIEluXG4gICAgYmlkaXJlY3Rpb25hbCB0ZXh0LCB0aGUgbGluZSBpcyB0cmF2ZXJzZWQgaW4gdmlzdWFsIG9yZGVyLCB1c2luZ1xuICAgIHRoZSBlZGl0b3IncyBbdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLlxuICAgIFdoZW4gdGhlIHN0YXJ0IHBvc2l0aW9uIHdhcyB0aGUgbGFzdCBvbmUgb24gdGhlIGxpbmUsIHRoZVxuICAgIHJldHVybmVkIHBvc2l0aW9uIHdpbGwgYmUgYWNyb3NzIHRoZSBsaW5lIGJyZWFrLiBJZiB0aGVyZSBpcyBub1xuICAgIGZ1cnRoZXIgbGluZSwgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgIFxuICAgIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIG1vdmVzIG92ZXIgYSBzaW5nbGUgY2x1c3Rlci4gVGhlXG4gICAgb3B0aW9uYWwgYGJ5YCBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBtb3ZlIGFjcm9zcyBtb3JlLiBJdCB3aWxsXG4gICAgYmUgY2FsbGVkIHdpdGggdGhlIGZpcnN0IGNsdXN0ZXIgYXMgYXJndW1lbnQsIGFuZCBzaG91bGQgcmV0dXJuXG4gICAgYSBwcmVkaWNhdGUgdGhhdCBkZXRlcm1pbmVzLCBmb3IgZWFjaCBzdWJzZXF1ZW50IGNsdXN0ZXIsXG4gICAgd2hldGhlciBpdCBzaG91bGQgYWxzbyBiZSBtb3ZlZCBvdmVyLlxuICAgICovXG4gICAgbW92ZUJ5Q2hhcihzdGFydCwgZm9yd2FyZCwgYnkpIHtcbiAgICAgICAgcmV0dXJuIHNraXBBdG9tcyh0aGlzLCBzdGFydCwgbW92ZUJ5Q2hhcih0aGlzLCBzdGFydCwgZm9yd2FyZCwgYnkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBhIGN1cnNvciBwb3NpdGlvbiBhY3Jvc3MgdGhlIG5leHQgZ3JvdXAgb2YgZWl0aGVyXG4gICAgW2xldHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhckNhdGVnb3JpemVyKSBvciBub24tbGV0dGVyXG4gICAgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIG1vdmVCeUdyb3VwKHN0YXJ0LCBmb3J3YXJkKSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVCeUNoYXIodGhpcywgc3RhcnQsIGZvcndhcmQsIGluaXRpYWwgPT4gYnlHcm91cCh0aGlzLCBzdGFydC5oZWFkLCBpbml0aWFsKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGN1cnNvciBwb3NpdGlvbiB2aXN1YWxseSBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbGluZS5cbiAgICBOb3RlIHRoYXQgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIF9sb2dpY2FsXyBwb3NpdGlvbiBhdCBpdHNcbiAgICBzdGFydCBvciBlbmQgKHdoaWNoIGlzIHNpbXBseSBhdCBgbGluZS5mcm9tYC9gbGluZS50b2ApIGlmIHRleHRcbiAgICBhdCB0aGUgc3RhcnQgb3IgZW5kIGdvZXMgYWdhaW5zdCB0aGUgbGluZSdzIGJhc2UgdGV4dCBkaXJlY3Rpb24uXG4gICAgKi9cbiAgICB2aXN1YWxMaW5lU2lkZShsaW5lLCBlbmQpIHtcbiAgICAgICAgbGV0IG9yZGVyID0gdGhpcy5iaWRpU3BhbnMobGluZSksIGRpciA9IHRoaXMudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCBzcGFuID0gb3JkZXJbZW5kID8gb3JkZXIubGVuZ3RoIC0gMSA6IDBdO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihzcGFuLnNpZGUoZW5kLCBkaXIpICsgbGluZS5mcm9tLCBzcGFuLmZvcndhcmQoIWVuZCwgZGlyKSA/IDEgOiAtMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbGluZSBib3VuZGFyeSBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLiBJZlxuICAgIGBpbmNsdWRlV3JhcGAgaXMgdHJ1ZSwgbGluZSB3cmFwcGluZyBpcyBvbiwgYW5kIHRoZXJlIGlzIGFcbiAgICBmdXJ0aGVyIHdyYXAgcG9pbnQgb24gdGhlIGN1cnJlbnQgbGluZSwgdGhlIHdyYXAgcG9pbnQgd2lsbCBiZVxuICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc3RhcnQgb3IgZW5kXG4gICAgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBtb3ZlVG9MaW5lQm91bmRhcnkoc3RhcnQsIGZvcndhcmQsIGluY2x1ZGVXcmFwID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gbW92ZVRvTGluZUJvdW5kYXJ5KHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gdmVydGljYWxseS4gV2hlbiBgZGlzdGFuY2VgIGlzbid0IGdpdmVuLFxuICAgIGl0IGRlZmF1bHRzIHRvIG1vdmluZyB0byB0aGUgbmV4dCBsaW5lIChpbmNsdWRpbmcgd3JhcHBlZFxuICAgIGxpbmVzKS4gT3RoZXJ3aXNlLCBgZGlzdGFuY2VgIHNob3VsZCBwcm92aWRlIGEgcG9zaXRpdmUgZGlzdGFuY2VcbiAgICBpbiBwaXhlbHMuXG4gICAgXG4gICAgV2hlbiBgc3RhcnRgIGhhcyBhXG4gICAgW2Bnb2FsQ29sdW1uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZS5nb2FsQ29sdW1uKSwgdGhlIHZlcnRpY2FsXG4gICAgbW90aW9uIHdpbGwgdXNlIHRoYXQgYXMgYSB0YXJnZXQgaG9yaXpvbnRhbCBwb3NpdGlvbi4gT3RoZXJ3aXNlLFxuICAgIHRoZSBjdXJzb3IncyBvd24gaG9yaXpvbnRhbCBwb3NpdGlvbiBpcyB1c2VkLiBUaGUgcmV0dXJuZWRcbiAgICBjdXJzb3Igd2lsbCBoYXZlIGl0cyBnb2FsIGNvbHVtbiBzZXQgdG8gd2hpY2hldmVyIGNvbHVtbiB3YXNcbiAgICB1c2VkLlxuICAgICovXG4gICAgbW92ZVZlcnRpY2FsbHkoc3RhcnQsIGZvcndhcmQsIGRpc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVWZXJ0aWNhbGx5KHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gcGFyZW50IG5vZGUgYW5kIG9mZnNldCAoY2hpbGQgb2Zmc2V0IGlmIGBub2RlYCBpc1xuICAgIGFuIGVsZW1lbnQsIGNoYXJhY3RlciBvZmZzZXQgd2hlbiBpdCBpcyBhIHRleHQgbm9kZSkgYXQgdGhlXG4gICAgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgXG4gICAgTm90ZSB0aGF0IGZvciBwb3NpdGlvbnMgdGhhdCBhcmVuJ3QgY3VycmVudGx5IGluXG4gICAgYHZpc2libGVSYW5nZXNgLCB0aGUgcmVzdWx0aW5nIERPTSBwb3NpdGlvbiBpc24ndCBuZWNlc3NhcmlseVxuICAgIG1lYW5pbmdmdWwgKGl0IG1heSBqdXN0IHBvaW50IGJlZm9yZSBvciBhZnRlciBhIHBsYWNlaG9sZGVyXG4gICAgZWxlbWVudCkuXG4gICAgKi9cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5kb21BdFBvcyhwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBkb2N1bWVudCBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gRE9NIG5vZGUuIENhbiBiZSB1c2VmdWxcbiAgICBmb3IgYXNzb2NpYXRpbmcgcG9zaXRpb25zIHdpdGggRE9NIGV2ZW50cy4gV2lsbCByYWlzZSBhbiBlcnJvclxuICAgIHdoZW4gYG5vZGVgIGlzbid0IHBhcnQgb2YgdGhlIGVkaXRvciBjb250ZW50LlxuICAgICovXG4gICAgcG9zQXRET00obm9kZSwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgcG9zQXRDb29yZHMoY29vcmRzLCBwcmVjaXNlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gcG9zQXRDb29yZHModGhpcywgY29vcmRzLCBwcmVjaXNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzY3JlZW4gY29vcmRpbmF0ZXMgYXQgdGhlIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgIGBzaWRlYCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvb3JkaW5hdGVzIGFyZSBiYXNlZCBvbiB0aGVcbiAgICBlbGVtZW50IGJlZm9yZSAoLTEpIG9yIGFmdGVyICgxKSB0aGUgcG9zaXRpb24gKGlmIG5vIGVsZW1lbnQgaXNcbiAgICBhdmFpbGFibGUgb24gdGhlIGdpdmVuIHNpZGUsIHRoZSBtZXRob2Qgd2lsbCB0cmFuc3BhcmVudGx5IHVzZVxuICAgIGFub3RoZXIgc3RyYXRlZ3kgdG8gZ2V0IHJlYXNvbmFibGUgY29vcmRpbmF0ZXMpLlxuICAgICovXG4gICAgY29vcmRzQXRQb3MocG9zLCBzaWRlID0gMSkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICBsZXQgcmVjdCA9IHRoaXMuZG9jVmlldy5jb29yZHNBdChwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoIXJlY3QgfHwgcmVjdC5sZWZ0ID09IHJlY3QucmlnaHQpXG4gICAgICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQocG9zKSwgb3JkZXIgPSB0aGlzLmJpZGlTcGFucyhsaW5lKTtcbiAgICAgICAgbGV0IHNwYW4gPSBvcmRlcltCaWRpU3Bhbi5maW5kKG9yZGVyLCBwb3MgLSBsaW5lLmZyb20sIC0xLCBzaWRlKV07XG4gICAgICAgIHJldHVybiBmbGF0dGVuUmVjdChyZWN0LCAoc3Bhbi5kaXIgPT0gRGlyZWN0aW9uLkxUUikgPT0gKHNpZGUgPiAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgcmVjdGFuZ2xlIGFyb3VuZCBhIGdpdmVuIGNoYXJhY3Rlci4gSWYgYHBvc2AgZG9lcyBub3RcbiAgICBwb2ludCBpbiBmcm9udCBvZiBhIGNoYXJhY3RlciB0aGF0IGlzIGluIHRoZSB2aWV3cG9ydCBhbmRcbiAgICByZW5kZXJlZCAoaS5lLiBub3QgcmVwbGFjZWQsIG5vdCBhIGxpbmUgYnJlYWspLCB0aGlzIHdpbGwgcmV0dXJuXG4gICAgbnVsbC4gRm9yIHNwYWNlIGNoYXJhY3RlcnMgdGhhdCBhcmUgYSBsaW5lIHdyYXAgcG9pbnQsIHRoaXMgd2lsbFxuICAgIHJldHVybiB0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSBsaW5lIGJyZWFrLlxuICAgICovXG4gICAgY29vcmRzRm9yQ2hhcihwb3MpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5jb29yZHNGb3JDaGFyKHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBkZWZhdWx0IHdpZHRoIG9mIGEgY2hhcmFjdGVyIGluIHRoZSBlZGl0b3IuIE1heSBub3RcbiAgICBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIHdpZHRoIG9mIGFsbCBjaGFyYWN0ZXJzIChnaXZlbiB2YXJpYWJsZVxuICAgIHdpZHRoIGZvbnRzIG9yIHN0eWxpbmcgb2YgaW52aWRpZHVhbCByYW5nZXMpLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRDaGFyYWN0ZXJXaWR0aCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5jaGFyV2lkdGg7IH1cbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCBoZWlnaHQgb2YgYSBsaW5lIGluIHRoZSBlZGl0b3IuIE1heSBub3QgYmUgYWNjdXJhdGVcbiAgICBmb3IgYWxsIGxpbmVzLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRMaW5lSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQ7IH1cbiAgICAvKipcbiAgICBUaGUgdGV4dCBkaXJlY3Rpb25cbiAgICAoW2BkaXJlY3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZGlyZWN0aW9uKVxuICAgIENTUyBwcm9wZXJ0eSkgb2YgdGhlIGVkaXRvcidzIGNvbnRlbnQgZWxlbWVudC5cbiAgICAqL1xuICAgIGdldCB0ZXh0RGlyZWN0aW9uKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuZGVmYXVsdFRleHREaXJlY3Rpb247IH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiB0aGUgYmxvY2sgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhc1xuICAgIGFzc2lnbmVkIGJ5IENTUy4gSWZcbiAgICBbYHBlckxpbmVUZXh0RGlyZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdecGVyTGluZVRleHREaXJlY3Rpb24pXG4gICAgaXNuJ3QgZW5hYmxlZCwgb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0LFxuICAgIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFzXG4gICAgW2B0ZXh0RGlyZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbikuIE5vdGUgdGhhdFxuICAgIHRoaXMgbWF5IHRyaWdnZXIgYSBET00gbGF5b3V0LlxuICAgICovXG4gICAgdGV4dERpcmVjdGlvbkF0KHBvcykge1xuICAgICAgICBsZXQgcGVyTGluZSA9IHRoaXMuc3RhdGUuZmFjZXQocGVyTGluZVRleHREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoIXBlckxpbmUgfHwgcG9zIDwgdGhpcy52aWV3cG9ydC5mcm9tIHx8IHBvcyA+IHRoaXMudmlld3BvcnQudG8pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0RGlyZWN0aW9uO1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3LnRleHREaXJlY3Rpb25BdChwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoaXMgZWRpdG9yIFt3cmFwcyBsaW5lc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubGluZVdyYXBwaW5nKVxuICAgIChhcyBkZXRlcm1pbmVkIGJ5IHRoZVxuICAgIFtgd2hpdGUtc3BhY2VgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1Mvd2hpdGUtc3BhY2UpXG4gICAgQ1NTIHByb3BlcnR5IG9mIGl0cyBjb250ZW50IGVsZW1lbnQpLlxuICAgICovXG4gICAgZ2V0IGxpbmVXcmFwcGluZygpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lV3JhcHBpbmc7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBiaWRpcmVjdGlvbmFsIHRleHQgc3RydWN0dXJlIG9mIHRoZSBnaXZlbiBsaW5lXG4gICAgKHdoaWNoIHNob3VsZCBiZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudCkgYXMgYW4gYXJyYXkgb2Ygc3BhblxuICAgIG9iamVjdHMuIFRoZSBvcmRlciBvZiB0aGVzZSBzcGFucyBtYXRjaGVzIHRoZSBbdGV4dFxuICAgIGRpcmVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbilcdTIwMTRpZiB0aGF0IGlzXG4gICAgbGVmdC10by1yaWdodCwgdGhlIGxlZnRtb3N0IHNwYW5zIGNvbWUgZmlyc3QsIG90aGVyd2lzZSB0aGVcbiAgICByaWdodG1vc3Qgc3BhbnMgY29tZSBmaXJzdC5cbiAgICAqL1xuICAgIGJpZGlTcGFucyhsaW5lKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IE1heEJpZGlMaW5lKVxuICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxPcmRlcihsaW5lLmxlbmd0aCk7XG4gICAgICAgIGxldCBkaXIgPSB0aGlzLnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pLCBpc29sYXRlcztcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5iaWRpQ2FjaGUpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5mcm9tID09IGxpbmUuZnJvbSAmJiBlbnRyeS5kaXIgPT0gZGlyICYmXG4gICAgICAgICAgICAgICAgKGVudHJ5LmZyZXNoIHx8IGlzb2xhdGVzRXEoZW50cnkuaXNvbGF0ZXMsIGlzb2xhdGVzID0gZ2V0SXNvbGF0ZWRSYW5nZXModGhpcywgbGluZSkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkub3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc29sYXRlcylcbiAgICAgICAgICAgIGlzb2xhdGVzID0gZ2V0SXNvbGF0ZWRSYW5nZXModGhpcywgbGluZSk7XG4gICAgICAgIGxldCBvcmRlciA9IGNvbXB1dGVPcmRlcihsaW5lLnRleHQsIGRpciwgaXNvbGF0ZXMpO1xuICAgICAgICB0aGlzLmJpZGlDYWNoZS5wdXNoKG5ldyBDYWNoZWRPcmRlcihsaW5lLmZyb20sIGxpbmUudG8sIGRpciwgaXNvbGF0ZXMsIHRydWUsIG9yZGVyKSk7XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGUgZWRpdG9yIGhhcyBmb2N1cy5cbiAgICAqL1xuICAgIGdldCBoYXNGb2N1cygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBTYWZhcmkgcmV0dXJuIGZhbHNlIGZvciBoYXNGb2N1cyB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgb3BlblxuICAgICAgICAvLyBvciBjbG9zaW5nLCB3aGljaCBsZWFkcyB1cyB0byBpZ25vcmUgc2VsZWN0aW9uIGNoYW5nZXMgZnJvbSB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51IGJlY2F1c2UgaXQgbG9va3MgbGlrZSB0aGUgZWRpdG9yIGlzbid0IGZvY3VzZWQuXG4gICAgICAgIC8vIFRoaXMga2x1ZGdlcyBhcm91bmQgdGhhdC5cbiAgICAgICAgcmV0dXJuICh0aGlzLmRvbS5vd25lckRvY3VtZW50Lmhhc0ZvY3VzKCkgfHwgYnJvd3Nlci5zYWZhcmkgJiYgKChfYSA9IHRoaXMuaW5wdXRTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhc3RDb250ZXh0TWVudSkgPiBEYXRlLm5vdygpIC0gM2U0KSAmJlxuICAgICAgICAgICAgdGhpcy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5jb250ZW50RE9NO1xuICAgIH1cbiAgICAvKipcbiAgICBQdXQgZm9jdXMgb24gdGhlIGVkaXRvci5cbiAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBmb2N1c1ByZXZlbnRTY3JvbGwodGhpcy5jb250ZW50RE9NKTtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgW3Jvb3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jI3ZpZXcuRWRpdG9yVmlld0NvbmZpZy5yb290KSBpbiB3aGljaCB0aGUgZWRpdG9yIGxpdmVzLiBUaGlzIGlzIG9ubHlcbiAgICBuZWNlc3Nhcnkgd2hlbiBtb3ZpbmcgdGhlIGVkaXRvcidzIGV4aXN0aW5nIERPTSB0byBhIG5ldyB3aW5kb3cgb3Igc2hhZG93IHJvb3QuXG4gICAgKi9cbiAgICBzZXRSb290KHJvb3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3QgIT0gcm9vdCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnNldFdpbmRvdygocm9vdC5ub2RlVHlwZSA9PSA5ID8gcm9vdCA6IHJvb3Qub3duZXJEb2N1bWVudCkuZGVmYXVsdFZpZXcgfHwgd2luZG93KTtcbiAgICAgICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDbGVhbiB1cCB0aGlzIGVkaXRvciB2aWV3LCByZW1vdmluZyBpdHMgZWxlbWVudCBmcm9tIHRoZVxuICAgIGRvY3VtZW50LCB1bnJlZ2lzdGVyaW5nIGV2ZW50IGhhbmRsZXJzLCBhbmQgbm90aWZ5aW5nXG4gICAgcGx1Z2lucy4gVGhlIHZpZXcgaW5zdGFuY2UgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyXG4gICAgY2FsbGluZyB0aGlzLlxuICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudERPTS5ibHVyKCk7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW4uZGVzdHJveSh0aGlzKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9jVmlldy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5tZWFzdXJlU2NoZWR1bGVkKTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGFuIGVmZmVjdCB0aGF0IGNhbiBiZVxuICAgIFthZGRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykgdG8gYSB0cmFuc2FjdGlvbiB0b1xuICAgIGNhdXNlIGl0IHRvIHNjcm9sbCB0aGUgZ2l2ZW4gcG9zaXRpb24gb3IgcmFuZ2UgaW50byB2aWV3LlxuICAgICovXG4gICAgc3RhdGljIHNjcm9sbEludG9WaWV3KHBvcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbnRvVmlldy5vZihuZXcgU2Nyb2xsVGFyZ2V0KHR5cGVvZiBwb3MgPT0gXCJudW1iZXJcIiA/IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zKSA6IHBvcywgb3B0aW9ucy55LCBvcHRpb25zLngsIG9wdGlvbnMueU1hcmdpbiwgb3B0aW9ucy54TWFyZ2luKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhbiBlZmZlY3QgdGhhdCByZXNldHMgdGhlIGVkaXRvciB0byBpdHMgY3VycmVudCAoYXQgdGhlXG4gICAgdGltZSB0aGlzIG1ldGhvZCB3YXMgY2FsbGVkKSBzY3JvbGwgcG9zaXRpb24uIE5vdGUgdGhhdCB0aGlzXG4gICAgb25seSBhZmZlY3RzIHRoZSBlZGl0b3IncyBvd24gc2Nyb2xsYWJsZSBlbGVtZW50LCBub3QgcGFyZW50cy5cbiAgICBTZWUgYWxzb1xuICAgIFtgRWRpdG9yVmlld0NvbmZpZy5zY3JvbGxUb2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Q29uZmlnLnNjcm9sbFRvKS5cbiAgICBcbiAgICBUaGUgZWZmZWN0IHNob3VsZCBiZSB1c2VkIHdpdGggYSBkb2N1bWVudCBpZGVudGljYWwgdG8gdGhlIG9uZVxuICAgIGl0IHdhcyBjcmVhdGVkIGZvci4gRmFpbGluZyB0byBkbyBzbyBpcyBub3QgYW4gZXJyb3IsIGJ1dCBtYXlcbiAgICBub3Qgc2Nyb2xsIHRvIHRoZSBleHBlY3RlZCBwb3NpdGlvbi4gWW91IGNhblxuICAgIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3QubWFwKSB0aGUgZWZmZWN0IHRvIGFjY291bnQgZm9yIGNoYW5nZXMuXG4gICAgKi9cbiAgICBzY3JvbGxTbmFwc2hvdCgpIHtcbiAgICAgICAgbGV0IHsgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0IH0gPSB0aGlzLnNjcm9sbERPTTtcbiAgICAgICAgbGV0IHJlZiA9IHRoaXMudmlld1N0YXRlLnNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCk7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbnRvVmlldy5vZihuZXcgU2Nyb2xsVGFyZ2V0KEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmVmLmZyb20pLCBcInN0YXJ0XCIsIFwic3RhcnRcIiwgcmVmLnRvcCAtIHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCwgdHJ1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBFbmFibGUgb3IgZGlzYWJsZSB0YWItZm9jdXMgbW9kZSwgd2hpY2ggZGlzYWJsZXMga2V5IGJpbmRpbmdzXG4gICAgZm9yIFRhYiBhbmQgU2hpZnQtVGFiLCBsZXR0aW5nIHRoZSBicm93c2VyJ3MgZGVmYXVsdFxuICAgIGZvY3VzLWNoYW5naW5nIGJlaGF2aW9yIGdvIHRocm91Z2ggaW5zdGVhZC4gVGhpcyBpcyB1c2VmdWwgdG9cbiAgICBwcmV2ZW50IHRyYXBwaW5nIGtleWJvYXJkIHVzZXJzIGluIHlvdXIgZWRpdG9yLlxuICAgIFxuICAgIFdpdGhvdXQgYXJndW1lbnQsIHRoaXMgdG9nZ2xlcyB0aGUgbW9kZS4gV2l0aCBhIGJvb2xlYW4sIGl0XG4gICAgZW5hYmxlcyAodHJ1ZSkgb3IgZGlzYWJsZXMgaXQgKGZhbHNlKS4gR2l2ZW4gYSBudW1iZXIsIGl0XG4gICAgdGVtcG9yYXJpbHkgZW5hYmxlcyB0aGUgbW9kZSB1bnRpbCB0aGF0IG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICBoYXZlIHBhc3NlZCBvciBhbm90aGVyIG5vbi1UYWIga2V5IGlzIHByZXNzZWQuXG4gICAgKi9cbiAgICBzZXRUYWJGb2N1c01vZGUodG8pIHtcbiAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUudGFiRm9jdXNNb2RlID0gdGhpcy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSA8IDAgPyAwIDogLTE7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0byA9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgPSB0byA/IDAgOiAtMTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSAhPSAwKVxuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSA9IERhdGUubm93KCkgKyB0bztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBhZGQgRE9NIGV2ZW50IGhhbmRsZXJzLlxuICAgIFRoZSB2YWx1ZSBzaG91bGQgYmUgYW4gb2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gaGFuZGxlclxuICAgIGZ1bmN0aW9ucy4gRm9yIGFueSBnaXZlbiBldmVudCwgc3VjaCBmdW5jdGlvbnMgYXJlIG9yZGVyZWQgYnlcbiAgICBleHRlbnNpb24gcHJlY2VkZW5jZSwgYW5kIHRoZSBmaXJzdCBoYW5kbGVyIHRvIHJldHVybiB0cnVlIHdpbGxcbiAgICBiZSBhc3N1bWVkIHRvIGhhdmUgaGFuZGxlZCB0aGF0IGV2ZW50LCBhbmQgbm8gb3RoZXIgaGFuZGxlcnMgb3JcbiAgICBidWlsdC1pbiBiZWhhdmlvciB3aWxsIGJlIGFjdGl2YXRlZCBmb3IgaXQuIFRoZXNlIGFyZSByZWdpc3RlcmVkXG4gICAgb24gdGhlIFtjb250ZW50IGVsZW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmNvbnRlbnRET00pLCBleGNlcHRcbiAgICBmb3IgYHNjcm9sbGAgaGFuZGxlcnMsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGFueSB0aW1lIHRoZVxuICAgIGVkaXRvcidzIFtzY3JvbGwgZWxlbWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuc2Nyb2xsRE9NKSBvciBvbmUgb2ZcbiAgICBpdHMgcGFyZW50IG5vZGVzIGlzIHNjcm9sbGVkLlxuICAgICovXG4gICAgc3RhdGljIGRvbUV2ZW50SGFuZGxlcnMoaGFuZGxlcnMpIHtcbiAgICAgICAgcmV0dXJuIFZpZXdQbHVnaW4uZGVmaW5lKCgpID0+ICh7fSksIHsgZXZlbnRIYW5kbGVyczogaGFuZGxlcnMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCByZWdpc3RlcnMgRE9NIGV2ZW50IG9ic2VydmVycy4gQ29udHJhcnlcbiAgICB0byBldmVudCBbaGFuZGxlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmRvbUV2ZW50SGFuZGxlcnMpLFxuICAgIG9ic2VydmVycyBjYW4ndCBiZSBwcmV2ZW50ZWQgZnJvbSBydW5uaW5nIGJ5IGEgaGlnaGVyLXByZWNlZGVuY2VcbiAgICBoYW5kbGVyIHJldHVybmluZyB0cnVlLiBUaGV5IGFsc28gZG9uJ3QgcHJldmVudCBvdGhlciBoYW5kbGVyc1xuICAgIGFuZCBvYnNlcnZlcnMgZnJvbSBydW5uaW5nIHdoZW4gdGhleSByZXR1cm4gdHJ1ZSwgYW5kIHNob3VsZCBub3RcbiAgICBjYWxsIGBwcmV2ZW50RGVmYXVsdGAuXG4gICAgKi9cbiAgICBzdGF0aWMgZG9tRXZlbnRPYnNlcnZlcnMob2JzZXJ2ZXJzKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSgoKSA9PiAoe30pLCB7IGV2ZW50T2JzZXJ2ZXJzOiBvYnNlcnZlcnMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRoZW1lIGV4dGVuc2lvbi4gVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBiZSBhXG4gICAgW2BzdHlsZS1tb2RgXShodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9zdHlsZS1tb2QjZG9jdW1lbnRhdGlvbilcbiAgICBzdHlsZSBzcGVjIHByb3ZpZGluZyB0aGUgc3R5bGVzIGZvciB0aGUgdGhlbWUuIFRoZXNlIHdpbGwgYmVcbiAgICBwcmVmaXhlZCB3aXRoIGEgZ2VuZXJhdGVkIGNsYXNzIGZvciB0aGUgc3R5bGUuXG4gICAgXG4gICAgQmVjYXVzZSB0aGUgc2VsZWN0b3JzIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCBhIHNjb3BlIGNsYXNzLCBydWxlXG4gICAgdGhhdCBkaXJlY3RseSBtYXRjaCB0aGUgZWRpdG9yJ3MgW3dyYXBwZXJcbiAgICBlbGVtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb20pXHUyMDE0dG8gd2hpY2ggdGhlIHNjb3BlIGNsYXNzIHdpbGwgYmVcbiAgICBhZGRlZFx1MjAxNG5lZWQgdG8gYmUgZXhwbGljaXRseSBkaWZmZXJlbnRpYXRlZCBieSBhZGRpbmcgYW4gYCZgIHRvXG4gICAgdGhlIHNlbGVjdG9yIGZvciB0aGF0IGVsZW1lbnRcdTIwMTRmb3IgZXhhbXBsZVxuICAgIGAmLmNtLWZvY3VzZWRgLlxuICAgIFxuICAgIFdoZW4gYGRhcmtgIGlzIHNldCB0byB0cnVlLCB0aGUgdGhlbWUgd2lsbCBiZSBtYXJrZWQgYXMgZGFyayxcbiAgICB3aGljaCB3aWxsIGNhdXNlIHRoZSBgJmRhcmtgIHJ1bGVzIGZyb20gW2Jhc2VcbiAgICB0aGVtZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmJhc2VUaGVtZSkgdG8gYmUgdXNlZCAoYXMgb3Bwb3NlZCB0b1xuICAgIGAmbGlnaHRgIHdoZW4gYSBsaWdodCB0aGVtZSBpcyBhY3RpdmUpLlxuICAgICovXG4gICAgc3RhdGljIHRoZW1lKHNwZWMsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHByZWZpeCA9IFN0eWxlTW9kdWxlLm5ld05hbWUoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFt0aGVtZS5vZihwcmVmaXgpLCBzdHlsZU1vZHVsZS5vZihidWlsZFRoZW1lKGAuJHtwcmVmaXh9YCwgc3BlYykpXTtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kYXJrKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGFya1RoZW1lLm9mKHRydWUpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgc3R5bGVzIHRvIHRoZSBiYXNlIHRoZW1lLiBMaWtlXG4gICAgd2l0aCBbYHRoZW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedGhlbWUpLCB1c2UgYCZgIHRvIGluZGljYXRlIHRoZVxuICAgIHBsYWNlIG9mIHRoZSBlZGl0b3Igd3JhcHBlciBlbGVtZW50IHdoZW4gZGlyZWN0bHkgdGFyZ2V0aW5nXG4gICAgdGhhdC4gWW91IGNhbiBhbHNvIHVzZSBgJmRhcmtgIG9yIGAmbGlnaHRgIGluc3RlYWQgdG8gb25seVxuICAgIHRhcmdldCBlZGl0b3JzIHdpdGggYSBkYXJrIG9yIGxpZ2h0IHRoZW1lLlxuICAgICovXG4gICAgc3RhdGljIGJhc2VUaGVtZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBQcmVjLmxvd2VzdChzdHlsZU1vZHVsZS5vZihidWlsZFRoZW1lKFwiLlwiICsgYmFzZVRoZW1lSUQsIHNwZWMsIGxpZ2h0RGFya0lEcykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgYW4gZWRpdG9yIHZpZXcgaW5zdGFuY2UgZnJvbSB0aGUgdmlldydzIERPTVxuICAgIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZpbmRGcm9tRE9NKGRvbSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjb250ZW50ID0gZG9tLnF1ZXJ5U2VsZWN0b3IoXCIuY20tY29udGVudFwiKTtcbiAgICAgICAgbGV0IGNWaWV3ID0gY29udGVudCAmJiBDb250ZW50Vmlldy5nZXQoY29udGVudCkgfHwgQ29udGVudFZpZXcuZ2V0KGRvbSk7XG4gICAgICAgIHJldHVybiAoKF9hID0gY1ZpZXcgPT09IG51bGwgfHwgY1ZpZXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNWaWV3LnJvb3RWaWV3KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmlldykgfHwgbnVsbDtcbiAgICB9XG59XG4vKipcbkZhY2V0IHRvIGFkZCBhIFtzdHlsZVxubW9kdWxlXShodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9zdHlsZS1tb2QjZG9jdW1lbnRhdGlvbikgdG9cbmFuIGVkaXRvciB2aWV3LiBUaGUgdmlldyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBtb2R1bGUgaXNcbm1vdW50ZWQgaW4gaXRzIFtkb2N1bWVudFxucm9vdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuY29uc3RydWN0b3JeY29uZmlnLnJvb3QpLlxuKi9cbkVkaXRvclZpZXcuc3R5bGVNb2R1bGUgPSBzdHlsZU1vZHVsZTtcbi8qKlxuQW4gaW5wdXQgaGFuZGxlciBjYW4gb3ZlcnJpZGUgdGhlIHdheSBjaGFuZ2VzIHRvIHRoZSBlZGl0YWJsZVxuRE9NIGNvbnRlbnQgYXJlIGhhbmRsZWQuIEhhbmRsZXJzIGFyZSBwYXNzZWQgdGhlIGRvY3VtZW50XG5wb3NpdGlvbnMgYmV0d2VlbiB3aGljaCB0aGUgY2hhbmdlIHdhcyBmb3VuZCwgYW5kIHRoZSBuZXdcbmNvbnRlbnQuIFdoZW4gb25lIHJldHVybnMgdHJ1ZSwgbm8gZnVydGhlciBpbnB1dCBoYW5kbGVycyBhcmVcbmNhbGxlZCBhbmQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgcHJldmVudGVkLlxuXG5UaGUgYGluc2VydGAgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uXG50aGF0IHdvdWxkIGJlIGFwcGxpZWQgZm9yIHRoaXMgaW5wdXQuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuXG5kaXNwYXRjaGluZyB0aGUgY3VzdG9tIGJlaGF2aW9yIGFzIGEgc2VwYXJhdGUgdHJhbnNhY3Rpb24uXG4qL1xuRWRpdG9yVmlldy5pbnB1dEhhbmRsZXIgPSBpbnB1dEhhbmRsZXI7XG4vKipcbkZ1bmN0aW9ucyBwcm92aWRlZCBpbiB0aGlzIGZhY2V0IHdpbGwgYmUgdXNlZCB0byB0cmFuc2Zvcm0gdGV4dFxucGFzdGVkIG9yIGRyb3BwZWQgaW50byB0aGUgZWRpdG9yLlxuKi9cbkVkaXRvclZpZXcuY2xpcGJvYXJkSW5wdXRGaWx0ZXIgPSBjbGlwYm9hcmRJbnB1dEZpbHRlcjtcbi8qKlxuVHJhbnNmb3JtIHRleHQgY29waWVkIG9yIGRyYWdnZWQgZnJvbSB0aGUgZWRpdG9yLlxuKi9cbkVkaXRvclZpZXcuY2xpcGJvYXJkT3V0cHV0RmlsdGVyID0gY2xpcGJvYXJkT3V0cHV0RmlsdGVyO1xuLyoqXG5TY3JvbGwgaGFuZGxlcnMgY2FuIG92ZXJyaWRlIGhvdyB0aGluZ3MgYXJlIHNjcm9sbGVkIGludG8gdmlldy5cbklmIHRoZXkgcmV0dXJuIGB0cnVlYCwgbm8gZnVydGhlciBoYW5kbGluZyBoYXBwZW5zIGZvciB0aGVcbnNjcm9sbGluZy4gSWYgdGhleSByZXR1cm4gZmFsc2UsIHRoZSBkZWZhdWx0IHNjcm9sbCBiZWhhdmlvciBpc1xuYXBwbGllZC4gU2Nyb2xsIGhhbmRsZXJzIHNob3VsZCBuZXZlciBpbml0aWF0ZSBlZGl0b3IgdXBkYXRlcy5cbiovXG5FZGl0b3JWaWV3LnNjcm9sbEhhbmRsZXIgPSBzY3JvbGxIYW5kbGVyO1xuLyoqXG5UaGlzIGZhY2V0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZnVuY3Rpb25zIHRoYXQgY3JlYXRlIGVmZmVjdHNcbnRvIGJlIGRpc3BhdGNoZWQgd2hlbiB0aGUgZWRpdG9yJ3MgZm9jdXMgc3RhdGUgY2hhbmdlcy5cbiovXG5FZGl0b3JWaWV3LmZvY3VzQ2hhbmdlRWZmZWN0ID0gZm9jdXNDaGFuZ2VFZmZlY3Q7XG4vKipcbkJ5IGRlZmF1bHQsIHRoZSBlZGl0b3IgYXNzdW1lcyBhbGwgaXRzIGNvbnRlbnQgaGFzIHRoZSBzYW1lXG5bdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EaXJlY3Rpb24pLiBDb25maWd1cmUgdGhpcyB3aXRoIGEgYHRydWVgXG52YWx1ZSB0byBtYWtlIGl0IHJlYWQgdGhlIHRleHQgZGlyZWN0aW9uIG9mIGV2ZXJ5IChyZW5kZXJlZClcbmxpbmUgc2VwYXJhdGVseS5cbiovXG5FZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uID0gcGVyTGluZVRleHREaXJlY3Rpb247XG4vKipcbkFsbG93cyB5b3UgdG8gcHJvdmlkZSBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZVxubGlicmFyeSBjYXRjaGVzIGFuIGV4Y2VwdGlvbiBmcm9tIGFuIGV4dGVuc2lvbiAobW9zdGx5IGZyb20gdmlld1xucGx1Z2lucywgYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVyIGV4dGVuc2lvbnMgdG8gcm91dGUgZXhjZXB0aW9uc1xuZnJvbSB1c2VyLWNvZGUtcHJvdmlkZWQgY2FsbGJhY2tzKS4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvclxuZGVidWdnaW5nIGFuZCBsb2dnaW5nLiBTZWUgW2Bsb2dFeGNlcHRpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcubG9nRXhjZXB0aW9uKS5cbiovXG5FZGl0b3JWaWV3LmV4Y2VwdGlvblNpbmsgPSBleGNlcHRpb25TaW5rO1xuLyoqXG5BIGZhY2V0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbmV2ZXJ5IHRpbWUgdGhlIHZpZXcgdXBkYXRlcy5cbiovXG5FZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyID0gdXBkYXRlTGlzdGVuZXI7XG4vKipcbkZhY2V0IHRoYXQgY29udHJvbHMgd2hldGhlciB0aGUgZWRpdG9yIGNvbnRlbnQgRE9NIGlzIGVkaXRhYmxlLlxuV2hlbiBpdHMgaGlnaGVzdC1wcmVjZWRlbmNlIHZhbHVlIGlzIGBmYWxzZWAsIHRoZSBlbGVtZW50IHdpbGxcbm5vdCBoYXZlIGl0cyBgY29udGVudGVkaXRhYmxlYCBhdHRyaWJ1dGUgc2V0LiAoTm90ZSB0aGF0IHRoaXNcbmRvZXNuJ3QgYWZmZWN0IEFQSSBjYWxscyB0aGF0IGNoYW5nZSB0aGUgZWRpdG9yIGNvbnRlbnQsIGV2ZW5cbndoZW4gdGhvc2UgYXJlIGJvdW5kIHRvIGtleXMgb3IgYnV0dG9ucy4gU2VlIHRoZVxuW2ByZWFkT25seWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUucmVhZE9ubHkpIGZhY2V0IGZvciB0aGF0LilcbiovXG5FZGl0b3JWaWV3LmVkaXRhYmxlID0gZWRpdGFibGU7XG4vKipcbkFsbG93cyB5b3UgdG8gaW5mbHVlbmNlIHRoZSB3YXkgbW91c2Ugc2VsZWN0aW9uIGhhcHBlbnMuIFRoZVxuZnVuY3Rpb25zIGluIHRoaXMgZmFjZXQgd2lsbCBiZSBjYWxsZWQgZm9yIGEgYG1vdXNlZG93bmAgZXZlbnRcbm9uIHRoZSBlZGl0b3IsIGFuZCBjYW4gcmV0dXJuIGFuIG9iamVjdCB0aGF0IG92ZXJyaWRlcyB0aGUgd2F5IGFcbnNlbGVjdGlvbiBpcyBjb21wdXRlZCBmcm9tIHRoYXQgbW91c2UgY2xpY2sgb3IgZHJhZy5cbiovXG5FZGl0b3JWaWV3Lm1vdXNlU2VsZWN0aW9uU3R5bGUgPSBtb3VzZVNlbGVjdGlvblN0eWxlO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNvbmZpZ3VyZSB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0aW9uIGRyYWcgZXZlbnRcbnNob3VsZCBtb3ZlIG9yIGNvcHkgdGhlIHNlbGVjdGlvbi4gVGhlIGdpdmVuIHByZWRpY2F0ZSB3aWxsIGJlXG5jYWxsZWQgd2l0aCB0aGUgYG1vdXNlZG93bmAgZXZlbnQsIGFuZCBjYW4gcmV0dXJuIGB0cnVlYCB3aGVuXG50aGUgZHJhZyBzaG91bGQgbW92ZSB0aGUgY29udGVudC5cbiovXG5FZGl0b3JWaWV3LmRyYWdNb3Zlc1NlbGVjdGlvbiA9IGRyYWdNb3Zlc1NlbGVjdGlvbiQxO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNvbmZpZ3VyZSB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0aW5nIGNsaWNrIGFkZHMgYVxubmV3IHJhbmdlIHRvIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gb3IgcmVwbGFjZXMgaXQgZW50aXJlbHkuIFRoZVxuZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjaGVjayBgZXZlbnQubWV0YUtleWAgb24gbWFjT1MsIGFuZFxuYGV2ZW50LmN0cmxLZXlgIGVsc2V3aGVyZS5cbiovXG5FZGl0b3JWaWV3LmNsaWNrQWRkc1NlbGVjdGlvblJhbmdlID0gY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2U7XG4vKipcbkEgZmFjZXQgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIFtkZWNvcmF0aW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb24pXG5hcmUgc2hvd24gaW4gdGhlIHZpZXcuIERlY29yYXRpb25zIGNhbiBiZSBwcm92aWRlZCBpbiB0d29cbndheXNcdTIwMTRkaXJlY3RseSwgb3IgdmlhIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlZGl0b3Igdmlldy5cblxuT25seSBkZWNvcmF0aW9uIHNldHMgcHJvdmlkZWQgZGlyZWN0bHkgYXJlIGFsbG93ZWQgdG8gaW5mbHVlbmNlXG50aGUgZWRpdG9yJ3MgdmVydGljYWwgbGF5b3V0IHN0cnVjdHVyZS4gVGhlIG9uZXMgcHJvdmlkZWQgYXNcbmZ1bmN0aW9ucyBhcmUgY2FsbGVkIF9hZnRlcl8gdGhlIG5ldyB2aWV3cG9ydCBoYXMgYmVlbiBjb21wdXRlZCxcbmFuZCB0aHVzICoqbXVzdCBub3QqKiBpbnRyb2R1Y2UgYmxvY2sgd2lkZ2V0cyBvciByZXBsYWNpbmdcbmRlY29yYXRpb25zIHRoYXQgY292ZXIgbGluZSBicmVha3MuXG5cbklmIHlvdSB3YW50IGRlY29yYXRlZCByYW5nZXMgdG8gYmVoYXZlIGxpa2UgYXRvbWljIHVuaXRzIGZvclxuY3Vyc29yIG1vdGlvbiBhbmQgZGVsZXRpb24gcHVycG9zZXMsIGFsc28gcHJvdmlkZSB0aGUgcmFuZ2Ugc2V0XG5jb250YWluaW5nIHRoZSBkZWNvcmF0aW9ucyB0b1xuW2BFZGl0b3JWaWV3LmF0b21pY1Jhbmdlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmF0b21pY1JhbmdlcykuXG4qL1xuRWRpdG9yVmlldy5kZWNvcmF0aW9ucyA9IGRlY29yYXRpb25zO1xuLyoqXG5GYWNldCB0aGF0IHdvcmtzIG11Y2ggbGlrZVxuW2BkZWNvcmF0aW9uc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmRlY29yYXRpb25zKSwgYnV0IHB1dHMgaXRzXG5pbnB1dHMgYXQgdGhlIHZlcnkgYm90dG9tIG9mIHRoZSBwcmVjZWRlbmNlIHN0YWNrLCBtZWFuaW5nIG1hcmtcbmRlY29yYXRpb25zIHByb3ZpZGVkIGhlcmUgd2lsbCBvbmx5IGJlIHNwbGl0IGJ5IG90aGVyLCBwYXJ0aWFsbHlcbm92ZXJsYXBwaW5nIFxcYG91dGVyRGVjb3JhdGlvbnNcXGAgcmFuZ2VzLCBhbmQgd3JhcCBhcm91bmQgYWxsXG5yZWd1bGFyIGRlY29yYXRpb25zLiBVc2UgdGhpcyBmb3IgbWFyayBlbGVtZW50cyB0aGF0IHNob3VsZCwgYXNcbm11Y2ggYXMgcG9zc2libGUsIHJlbWFpbiBpbiBvbmUgcGllY2UuXG4qL1xuRWRpdG9yVmlldy5vdXRlckRlY29yYXRpb25zID0gb3V0ZXJEZWNvcmF0aW9ucztcbi8qKlxuVXNlZCB0byBwcm92aWRlIHJhbmdlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGF0b21zIGFzIGZhciBhc1xuY3Vyc29yIG1vdGlvbiBpcyBjb25jZXJuZWQuIFRoaXMgY2F1c2VzIG1ldGhvZHMgbGlrZVxuW2Btb3ZlQnlDaGFyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZUJ5Q2hhcikgYW5kXG5bYG1vdmVWZXJ0aWNhbGx5YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZVZlcnRpY2FsbHkpIChhbmQgdGhlXG5jb21tYW5kcyBidWlsdCBvbiB0b3Agb2YgdGhlbSkgdG8gc2tpcCBhY3Jvc3Mgc3VjaCByZWdpb25zIHdoZW5cbmEgc2VsZWN0aW9uIGVuZHBvaW50IHdvdWxkIGVudGVyIHRoZW0uIFRoaXMgZG9lcyBfbm90XyBwcmV2ZW50XG5kaXJlY3QgcHJvZ3JhbW1hdGljIFtzZWxlY3Rpb25cbnVwZGF0ZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbikgZnJvbSBtb3ZpbmcgaW50byBzdWNoXG5yZWdpb25zLlxuKi9cbkVkaXRvclZpZXcuYXRvbWljUmFuZ2VzID0gYXRvbWljUmFuZ2VzO1xuLyoqXG5XaGVuIHJhbmdlIGRlY29yYXRpb25zIGFkZCBhIGB1bmljb2RlLWJpZGk6IGlzb2xhdGVgIHN0eWxlLCB0aGV5XG5zaG91bGQgYWxzbyBpbmNsdWRlIGFcbltgYmlkaUlzb2xhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuTWFya0RlY29yYXRpb25TcGVjLmJpZGlJc29sYXRlKSBwcm9wZXJ0eVxuaW4gdGhlaXIgZGVjb3JhdGlvbiBzcGVjLCBhbmQgYmUgZXhwb3NlZCB0aHJvdWdoIHRoaXMgZmFjZXQsIHNvXG50aGF0IHRoZSBlZGl0b3IgY2FuIGNvbXB1dGUgdGhlIHByb3BlciB0ZXh0IG9yZGVyLiAoT3RoZXIgdmFsdWVzXG5mb3IgYHVuaWNvZGUtYmlkaWAsIGV4Y2VwdCBvZiBjb3Vyc2UgYG5vcm1hbGAsIGFyZSBub3RcbnN1cHBvcnRlZC4pXG4qL1xuRWRpdG9yVmlldy5iaWRpSXNvbGF0ZWRSYW5nZXMgPSBiaWRpSXNvbGF0ZWRSYW5nZXM7XG4vKipcbkZhY2V0IHRoYXQgYWxsb3dzIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHNjcm9sbFxubWFyZ2lucyAoc3BhY2UgYXJvdW5kIHRoZSBzaWRlcyBvZiB0aGUgc2Nyb2xsaW5nIGVsZW1lbnQgdGhhdFxuc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW52aXNpYmxlKS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlXG5wbHVnaW4gaW50cm9kdWNlcyBlbGVtZW50cyB0aGF0IGNvdmVyIHBhcnQgb2YgdGhhdCBlbGVtZW50IChmb3JcbmV4YW1wbGUgYSBob3Jpem9udGFsbHkgZml4ZWQgZ3V0dGVyKS5cbiovXG5FZGl0b3JWaWV3LnNjcm9sbE1hcmdpbnMgPSBzY3JvbGxNYXJnaW5zO1xuLyoqXG5UaGlzIGZhY2V0IHJlY29yZHMgd2hldGhlciBhIGRhcmsgdGhlbWUgaXMgYWN0aXZlLiBUaGUgZXh0ZW5zaW9uXG5yZXR1cm5lZCBieSBbYHRoZW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedGhlbWUpIGF1dG9tYXRpY2FsbHlcbmluY2x1ZGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgd2hlbiB0aGUgYGRhcmtgIG9wdGlvbiBpcyBzZXQgdG9cbnRydWUuXG4qL1xuRWRpdG9yVmlldy5kYXJrVGhlbWUgPSBkYXJrVGhlbWU7XG4vKipcblByb3ZpZGVzIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgbm9uY2UgdG8gdXNlIHdoZW4gY3JlYXRpbmdcbnRoZSBzdHlsZSBzaGVldHMgZm9yIHRoZSBlZGl0b3IuIEhvbGRzIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBub1xubm9uY2UgaGFzIGJlZW4gcHJvdmlkZWQuXG4qL1xuRWRpdG9yVmlldy5jc3BOb25jZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IFwiXCIgfSk7XG4vKipcbkZhY2V0IHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBET00gYXR0cmlidXRlcyBmb3IgdGhlIGVkaXRvcidzXG5lZGl0YWJsZSBET00gZWxlbWVudC5cbiovXG5FZGl0b3JWaWV3LmNvbnRlbnRBdHRyaWJ1dGVzID0gY29udGVudEF0dHJpYnV0ZXM7XG4vKipcbkZhY2V0IHRoYXQgcHJvdmlkZXMgRE9NIGF0dHJpYnV0ZXMgZm9yIHRoZSBlZGl0b3IncyBvdXRlclxuZWxlbWVudC5cbiovXG5FZGl0b3JWaWV3LmVkaXRvckF0dHJpYnV0ZXMgPSBlZGl0b3JBdHRyaWJ1dGVzO1xuLyoqXG5BbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIGxpbmUgd3JhcHBpbmcgaW4gdGhlIGVkaXRvciAoYnlcbnNldHRpbmcgQ1NTIGB3aGl0ZS1zcGFjZWAgdG8gYHByZS13cmFwYCBpbiB0aGUgY29udGVudCkuXG4qL1xuRWRpdG9yVmlldy5saW5lV3JhcHBpbmcgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih7IFwiY2xhc3NcIjogXCJjbS1saW5lV3JhcHBpbmdcIiB9KTtcbi8qKlxuU3RhdGUgZWZmZWN0IHVzZWQgdG8gaW5jbHVkZSBzY3JlZW4gcmVhZGVyIGFubm91bmNlbWVudHMgaW4gYVxudHJhbnNhY3Rpb24uIFRoZXNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIERPTSBpbiBhIHZpc3VhbGx5IGhpZGRlblxuZWxlbWVudCB3aXRoIGBhcmlhLWxpdmU9XCJwb2xpdGVcImAgc2V0LCBhbmQgc2hvdWxkIGJlIHVzZWQgdG9cbmRlc2NyaWJlIGVmZmVjdHMgdGhhdCBhcmUgdmlzdWFsbHkgb2J2aW91cyBidXQgbWF5IG5vdCBiZVxubm90aWNlZCBieSBzY3JlZW4gcmVhZGVyIHVzZXJzIChzdWNoIGFzIG1vdmluZyB0byB0aGUgbmV4dFxuc2VhcmNoIG1hdGNoKS5cbiovXG5FZGl0b3JWaWV3LmFubm91bmNlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLy8gTWF4aW11bSBsaW5lIGxlbmd0aCBmb3Igd2hpY2ggd2UgY29tcHV0ZSBhY2N1cmF0ZSBiaWRpIGluZm9cbmNvbnN0IE1heEJpZGlMaW5lID0gNDA5NjtcbmNvbnN0IEJhZE1lYXN1cmUgPSB7fTtcbmNsYXNzIENhY2hlZE9yZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgZGlyLCBpc29sYXRlcywgZnJlc2gsIG9yZGVyKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgIHRoaXMuaXNvbGF0ZXMgPSBpc29sYXRlcztcbiAgICAgICAgdGhpcy5mcmVzaCA9IGZyZXNoO1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgfVxuICAgIHN0YXRpYyB1cGRhdGUoY2FjaGUsIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuZW1wdHkgJiYgIWNhY2hlLnNvbWUoYyA9PiBjLmZyZXNoKSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBsYXN0RGlyID0gY2FjaGUubGVuZ3RoID8gY2FjaGVbY2FjaGUubGVuZ3RoIC0gMV0uZGlyIDogRGlyZWN0aW9uLkxUUjtcbiAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWF4KDAsIGNhY2hlLmxlbmd0aCAtIDEwKTsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBjYWNoZVtpXTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5kaXIgPT0gbGFzdERpciAmJiAhY2hhbmdlcy50b3VjaGVzUmFuZ2UoZW50cnkuZnJvbSwgZW50cnkudG8pKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBDYWNoZWRPcmRlcihjaGFuZ2VzLm1hcFBvcyhlbnRyeS5mcm9tLCAxKSwgY2hhbmdlcy5tYXBQb3MoZW50cnkudG8sIC0xKSwgZW50cnkuZGlyLCBlbnRyeS5pc29sYXRlcywgZmFsc2UsIGVudHJ5Lm9yZGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyc0Zyb21GYWNldCh2aWV3LCBmYWNldCwgYmFzZSkge1xuICAgIGZvciAobGV0IHNvdXJjZXMgPSB2aWV3LnN0YXRlLmZhY2V0KGZhY2V0KSwgaSA9IHNvdXJjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXNbaV0sIHZhbHVlID0gdHlwZW9mIHNvdXJjZSA9PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2UodmlldykgOiBzb3VyY2U7XG4gICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgIGNvbWJpbmVBdHRycyh2YWx1ZSwgYmFzZSk7XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xufVxuXG5jb25zdCBjdXJyZW50UGxhdGZvcm0gPSBicm93c2VyLm1hYyA/IFwibWFjXCIgOiBicm93c2VyLndpbmRvd3MgPyBcIndpblwiIDogYnJvd3Nlci5saW51eCA/IFwibGludXhcIiA6IFwia2V5XCI7XG5mdW5jdGlvbiBub3JtYWxpemVLZXlOYW1lKG5hbWUsIHBsYXRmb3JtKSB7XG4gICAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KC8tKD8hJCkvKTtcbiAgICBsZXQgcmVzdWx0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKHJlc3VsdCA9PSBcIlNwYWNlXCIpXG4gICAgICAgIHJlc3VsdCA9IFwiIFwiO1xuICAgIGxldCBhbHQsIGN0cmwsIHNoaWZ0LCBtZXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGFsdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBzaGlmdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ebW9kJC9pLnRlc3QobW9kKSkge1xuICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09IFwibWFjXCIpXG4gICAgICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3RybCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG1vZGlmaWVyIG5hbWU6IFwiICsgbW9kKTtcbiAgICB9XG4gICAgaWYgKGFsdClcbiAgICAgICAgcmVzdWx0ID0gXCJBbHQtXCIgKyByZXN1bHQ7XG4gICAgaWYgKGN0cmwpXG4gICAgICAgIHJlc3VsdCA9IFwiQ3RybC1cIiArIHJlc3VsdDtcbiAgICBpZiAobWV0YSlcbiAgICAgICAgcmVzdWx0ID0gXCJNZXRhLVwiICsgcmVzdWx0O1xuICAgIGlmIChzaGlmdClcbiAgICAgICAgcmVzdWx0ID0gXCJTaGlmdC1cIiArIHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBzaGlmdCkge1xuICAgIGlmIChldmVudC5hbHRLZXkpXG4gICAgICAgIG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpXG4gICAgICAgIG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICBuYW1lID0gXCJNZXRhLVwiICsgbmFtZTtcbiAgICBpZiAoc2hpZnQgIT09IGZhbHNlICYmIGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG59XG5jb25zdCBoYW5kbGVLZXlFdmVudHMgPSAvKkBfX1BVUkVfXyovUHJlYy5kZWZhdWx0KC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xuICAgIGtleWRvd24oZXZlbnQsIHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHJ1bkhhbmRsZXJzKGdldEtleW1hcCh2aWV3LnN0YXRlKSwgZXZlbnQsIHZpZXcsIFwiZWRpdG9yXCIpO1xuICAgIH1cbn0pKTtcbi8qKlxuRmFjZXQgdXNlZCBmb3IgcmVnaXN0ZXJpbmcga2V5bWFwcy5cblxuWW91IGNhbiBhZGQgbXVsdGlwbGUga2V5bWFwcyB0byBhbiBlZGl0b3IuIFRoZWlyIHByaW9yaXRpZXNcbmRldGVybWluZSB0aGVpciBwcmVjZWRlbmNlICh0aGUgb25lcyBzcGVjaWZpZWQgZWFybHkgb3Igd2l0aCBoaWdoXG5wcmlvcml0eSBnZXQgY2hlY2tlZCBmaXJzdCkuIFdoZW4gYSBoYW5kbGVyIGhhcyByZXR1cm5lZCBgdHJ1ZWBcbmZvciBhIGdpdmVuIGtleSwgbm8gZnVydGhlciBoYW5kbGVycyBhcmUgY2FsbGVkLlxuKi9cbmNvbnN0IGtleW1hcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBlbmFibGVzOiBoYW5kbGVLZXlFdmVudHMgfSk7XG5jb25zdCBLZXltYXBzID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4vLyBUaGlzIGlzIGhpZGRlbiBiZWhpbmQgYW4gaW5kaXJlY3Rpb24sIHJhdGhlciB0aGFuIGRpcmVjdGx5IGNvbXB1dGVkXG4vLyBieSB0aGUgZmFjZXQsIHRvIGtlZXAgaW50ZXJuYWwgdHlwZXMgb3V0IG9mIHRoZSBmYWNldCdzIHR5cGUuXG5mdW5jdGlvbiBnZXRLZXltYXAoc3RhdGUpIHtcbiAgICBsZXQgYmluZGluZ3MgPSBzdGF0ZS5mYWNldChrZXltYXApO1xuICAgIGxldCBtYXAgPSBLZXltYXBzLmdldChiaW5kaW5ncyk7XG4gICAgaWYgKCFtYXApXG4gICAgICAgIEtleW1hcHMuc2V0KGJpbmRpbmdzLCBtYXAgPSBidWlsZEtleW1hcChiaW5kaW5ncy5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSkpKTtcbiAgICByZXR1cm4gbWFwO1xufVxuLyoqXG5SdW4gdGhlIGtleSBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHNjb3BlLiBUaGUgZXZlbnRcbm9iamVjdCBzaG91bGQgYmUgYSBgXCJrZXlkb3duXCJgIGV2ZW50LiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZVxuaGFuZGxlcnMgaGFuZGxlZCBpdC5cbiovXG5mdW5jdGlvbiBydW5TY29wZUhhbmRsZXJzKHZpZXcsIGV2ZW50LCBzY29wZSkge1xuICAgIHJldHVybiBydW5IYW5kbGVycyhnZXRLZXltYXAodmlldy5zdGF0ZSksIGV2ZW50LCB2aWV3LCBzY29wZSk7XG59XG5sZXQgc3RvcmVkUHJlZml4ID0gbnVsbDtcbmNvbnN0IFByZWZpeFRpbWVvdXQgPSA0MDAwO1xuZnVuY3Rpb24gYnVpbGRLZXltYXAoYmluZGluZ3MsIHBsYXRmb3JtID0gY3VycmVudFBsYXRmb3JtKSB7XG4gICAgbGV0IGJvdW5kID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgaXNQcmVmaXggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGVja1ByZWZpeCA9IChuYW1lLCBpcykgPT4ge1xuICAgICAgICBsZXQgY3VycmVudCA9IGlzUHJlZml4W25hbWVdO1xuICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKVxuICAgICAgICAgICAgaXNQcmVmaXhbbmFtZV0gPSBpcztcbiAgICAgICAgZWxzZSBpZiAoY3VycmVudCAhPSBpcylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIktleSBiaW5kaW5nIFwiICsgbmFtZSArIFwiIGlzIHVzZWQgYm90aCBhcyBhIHJlZ3VsYXIgYmluZGluZyBhbmQgYXMgYSBtdWx0aS1zdHJva2UgcHJlZml4XCIpO1xuICAgIH07XG4gICAgbGV0IGFkZCA9IChzY29wZSwga2V5LCBjb21tYW5kLCBwcmV2ZW50RGVmYXVsdCwgc3RvcFByb3BhZ2F0aW9uKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGxldCBzY29wZU9iaiA9IGJvdW5kW3Njb3BlXSB8fCAoYm91bmRbc2NvcGVdID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIGxldCBwYXJ0cyA9IGtleS5zcGxpdCgvICg/ISQpLykubWFwKGsgPT4gbm9ybWFsaXplS2V5TmFtZShrLCBwbGF0Zm9ybSkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcHJlZml4ID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjaGVja1ByZWZpeChwcmVmaXgsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzY29wZU9ialtwcmVmaXhdKVxuICAgICAgICAgICAgICAgIHNjb3BlT2JqW3ByZWZpeF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBydW46IFsodmlldykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXJPYmogPSBzdG9yZWRQcmVmaXggPSB7IHZpZXcsIHByZWZpeCwgc2NvcGUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKHN0b3JlZFByZWZpeCA9PSBvdXJPYmopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZFByZWZpeCA9IG51bGw7IH0sIFByZWZpeFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBmdWxsID0gcGFydHMuam9pbihcIiBcIik7XG4gICAgICAgIGNoZWNrUHJlZml4KGZ1bGwsIGZhbHNlKTtcbiAgICAgICAgbGV0IGJpbmRpbmcgPSBzY29wZU9ialtmdWxsXSB8fCAoc2NvcGVPYmpbZnVsbF0gPSB7XG4gICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgcnVuOiAoKF9iID0gKF9hID0gc2NvcGVPYmouX2FueSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJ1bikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnNsaWNlKCkpIHx8IFtdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29tbWFuZClcbiAgICAgICAgICAgIGJpbmRpbmcucnVuLnB1c2goY29tbWFuZCk7XG4gICAgICAgIGlmIChwcmV2ZW50RGVmYXVsdClcbiAgICAgICAgICAgIGJpbmRpbmcucHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgYmluZGluZy5zdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgIH07XG4gICAgZm9yIChsZXQgYiBvZiBiaW5kaW5ncykge1xuICAgICAgICBsZXQgc2NvcGVzID0gYi5zY29wZSA/IGIuc2NvcGUuc3BsaXQoXCIgXCIpIDogW1wiZWRpdG9yXCJdO1xuICAgICAgICBpZiAoYi5hbnkpXG4gICAgICAgICAgICBmb3IgKGxldCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2NvcGVPYmogPSBib3VuZFtzY29wZV0gfHwgKGJvdW5kW3Njb3BlXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGVPYmouX2FueSlcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVPYmouX2FueSA9IHsgcHJldmVudERlZmF1bHQ6IGZhbHNlLCBzdG9wUHJvcGFnYXRpb246IGZhbHNlLCBydW46IFtdIH07XG4gICAgICAgICAgICAgICAgbGV0IHsgYW55IH0gPSBiO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBzY29wZU9iailcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVPYmpba2V5XS5ydW4ucHVzaCh2aWV3ID0+IGFueSh2aWV3LCBjdXJyZW50S2V5RXZlbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IG5hbWUgPSBiW3BsYXRmb3JtXSB8fCBiLmtleTtcbiAgICAgICAgaWYgKCFuYW1lKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IHNjb3BlIG9mIHNjb3Blcykge1xuICAgICAgICAgICAgYWRkKHNjb3BlLCBuYW1lLCBiLnJ1biwgYi5wcmV2ZW50RGVmYXVsdCwgYi5zdG9wUHJvcGFnYXRpb24pO1xuICAgICAgICAgICAgaWYgKGIuc2hpZnQpXG4gICAgICAgICAgICAgICAgYWRkKHNjb3BlLCBcIlNoaWZ0LVwiICsgbmFtZSwgYi5zaGlmdCwgYi5wcmV2ZW50RGVmYXVsdCwgYi5zdG9wUHJvcGFnYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBib3VuZDtcbn1cbmxldCBjdXJyZW50S2V5RXZlbnQgPSBudWxsO1xuZnVuY3Rpb24gcnVuSGFuZGxlcnMobWFwLCBldmVudCwgdmlldywgc2NvcGUpIHtcbiAgICBjdXJyZW50S2V5RXZlbnQgPSBldmVudDtcbiAgICBsZXQgbmFtZSA9IGtleU5hbWUoZXZlbnQpO1xuICAgIGxldCBjaGFyQ29kZSA9IGNvZGVQb2ludEF0KG5hbWUsIDApLCBpc0NoYXIgPSBjb2RlUG9pbnRTaXplKGNoYXJDb2RlKSA9PSBuYW1lLmxlbmd0aCAmJiBuYW1lICE9IFwiIFwiO1xuICAgIGxldCBwcmVmaXggPSBcIlwiLCBoYW5kbGVkID0gZmFsc2UsIHByZXZlbnRlZCA9IGZhbHNlLCBzdG9wUHJvcGFnYXRpb24gPSBmYWxzZTtcbiAgICBpZiAoc3RvcmVkUHJlZml4ICYmIHN0b3JlZFByZWZpeC52aWV3ID09IHZpZXcgJiYgc3RvcmVkUHJlZml4LnNjb3BlID09IHNjb3BlKSB7XG4gICAgICAgIHByZWZpeCA9IHN0b3JlZFByZWZpeC5wcmVmaXggKyBcIiBcIjtcbiAgICAgICAgaWYgKG1vZGlmaWVyQ29kZXMuaW5kZXhPZihldmVudC5rZXlDb2RlKSA8IDApIHtcbiAgICAgICAgICAgIHByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgICBzdG9yZWRQcmVmaXggPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCByYW4gPSBuZXcgU2V0O1xuICAgIGxldCBydW5Gb3IgPSAoYmluZGluZykgPT4ge1xuICAgICAgICBpZiAoYmluZGluZykge1xuICAgICAgICAgICAgZm9yIChsZXQgY21kIG9mIGJpbmRpbmcucnVuKVxuICAgICAgICAgICAgICAgIGlmICghcmFuLmhhcyhjbWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbi5hZGQoY21kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNtZCh2aWV3KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaW5kaW5nLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgbGV0IHNjb3BlT2JqID0gbWFwW3Njb3BlXSwgYmFzZU5hbWUsIHNoaWZ0TmFtZTtcbiAgICBpZiAoc2NvcGVPYmopIHtcbiAgICAgICAgaWYgKHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMobmFtZSwgZXZlbnQsICFpc0NoYXIpXSkpIHtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ2hhciAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcbiAgICAgICAgICAgIC8vIEN0cmwtQWx0IG1heSBiZSB1c2VkIGZvciBBbHRHciBvbiBXaW5kb3dzXG4gICAgICAgICAgICAhKGJyb3dzZXIud2luZG93cyAmJiBldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSkgJiZcbiAgICAgICAgICAgIChiYXNlTmFtZSA9IGJhc2VbZXZlbnQua2V5Q29kZV0pICYmIGJhc2VOYW1lICE9IG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKGJhc2VOYW1lLCBldmVudCwgdHJ1ZSldKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgKHNoaWZ0TmFtZSA9IHNoaWZ0W2V2ZW50LmtleUNvZGVdKSAhPSBuYW1lICYmIHNoaWZ0TmFtZSAhPSBiYXNlTmFtZSAmJlxuICAgICAgICAgICAgICAgIHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMoc2hpZnROYW1lLCBldmVudCwgZmFsc2UpXSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NoYXIgJiYgZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAgICAgICAgIHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMobmFtZSwgZXZlbnQsIHRydWUpXSkpIHtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFuZGxlZCAmJiBydW5Gb3Ioc2NvcGVPYmouX2FueSkpXG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByZXZlbnRlZClcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgaWYgKGhhbmRsZWQgJiYgc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjdXJyZW50S2V5RXZlbnQgPSBudWxsO1xuICAgIHJldHVybiBoYW5kbGVkO1xufVxuXG4vKipcbkltcGxlbWVudGF0aW9uIG9mIFtgTGF5ZXJNYXJrZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuTGF5ZXJNYXJrZXIpIHRoYXQgY3JlYXRlc1xuYSByZWN0YW5nbGUgYXQgYSBnaXZlbiBzZXQgb2YgY29vcmRpbmF0ZXMuXG4qL1xuY2xhc3MgUmVjdGFuZ2xlTWFya2VyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrZXIgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgYW5kIGRpbWVuc2lvbnMuIElmIGB3aWR0aGBcbiAgICBpcyBudWxsLCB0aGUgRE9NIGVsZW1lbnQgd2lsbCBnZXQgbm8gd2lkdGggc3R5bGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGFzc05hbWUsIFxuICAgIC8qKlxuICAgIFRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBtYXJrZXIgKGluIHBpeGVscywgZG9jdW1lbnQtcmVsYXRpdmUpLlxuICAgICovXG4gICAgbGVmdCwgXG4gICAgLyoqXG4gICAgVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyLlxuICAgICovXG4gICAgdG9wLCBcbiAgICAvKipcbiAgICBUaGUgd2lkdGggb2YgdGhlIG1hcmtlciwgb3IgbnVsbCBpZiBpdCBzaG91bGRuJ3QgZ2V0IGEgd2lkdGggYXNzaWduZWQuXG4gICAgKi9cbiAgICB3aWR0aCwgXG4gICAgLyoqXG4gICAgVGhlIGhlaWdodCBvZiB0aGUgbWFya2VyLlxuICAgICovXG4gICAgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsdC5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5hZGp1c3QoZWx0KTtcbiAgICAgICAgcmV0dXJuIGVsdDtcbiAgICB9XG4gICAgdXBkYXRlKGVsdCwgcHJldikge1xuICAgICAgICBpZiAocHJldi5jbGFzc05hbWUgIT0gdGhpcy5jbGFzc05hbWUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRqdXN0KGVsdCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhZGp1c3QoZWx0KSB7XG4gICAgICAgIGVsdC5zdHlsZS5sZWZ0ID0gdGhpcy5sZWZ0ICsgXCJweFwiO1xuICAgICAgICBlbHQuc3R5bGUudG9wID0gdGhpcy50b3AgKyBcInB4XCI7XG4gICAgICAgIGlmICh0aGlzLndpZHRoICE9IG51bGwpXG4gICAgICAgICAgICBlbHQuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG4gICAgfVxuICAgIGVxKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdCA9PSBwLmxlZnQgJiYgdGhpcy50b3AgPT0gcC50b3AgJiYgdGhpcy53aWR0aCA9PSBwLndpZHRoICYmIHRoaXMuaGVpZ2h0ID09IHAuaGVpZ2h0ICYmXG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9PSBwLmNsYXNzTmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIHJlY3RhbmdsZXMgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24gcmFuZ2UsXG4gICAgYXNzaWduaW5nIHRoZW0gdGhlY2xhc3NgY2xhc3NOYW1lYC4gV2lsbCBjcmVhdGUgYSBzaW5nbGVcbiAgICByZWN0YW5nbGUgZm9yIGVtcHR5IHJhbmdlcywgYW5kIGEgc2V0IG9mIHNlbGVjdGlvbi1zdHlsZVxuICAgIHJlY3RhbmdsZXMgY292ZXJpbmcgdGhlIHJhbmdlJ3MgY29udGVudCAoaW4gYSBiaWRpLWF3YXJlXG4gICAgd2F5KSBmb3Igbm9uLWVtcHR5IG9uZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgZm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSB2aWV3LmNvb3Jkc0F0UG9zKHJhbmdlLmhlYWQsIHJhbmdlLmFzc29jIHx8IDEpO1xuICAgICAgICAgICAgaWYgKCFwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgbGV0IGJhc2UgPSBnZXRCYXNlKHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgUmVjdGFuZ2xlTWFya2VyKGNsYXNzTmFtZSwgcG9zLmxlZnQgLSBiYXNlLmxlZnQsIHBvcy50b3AgLSBiYXNlLnRvcCwgbnVsbCwgcG9zLmJvdHRvbSAtIHBvcy50b3ApXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZWN0YW5nbGVzRm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRCYXNlKHZpZXcpIHtcbiAgICBsZXQgcmVjdCA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBsZWZ0ID0gdmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0IC0gdmlldy5zY3JvbGxET00uY2xpZW50V2lkdGggKiB2aWV3LnNjYWxlWDtcbiAgICByZXR1cm4geyBsZWZ0OiBsZWZ0IC0gdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCAqIHZpZXcuc2NhbGVYLCB0b3A6IHJlY3QudG9wIC0gdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICogdmlldy5zY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHdyYXBwZWRMaW5lKHZpZXcsIHBvcywgc2lkZSwgaW5zaWRlKSB7XG4gICAgbGV0IGNvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MocG9zLCBzaWRlICogMik7XG4gICAgaWYgKCFjb29yZHMpXG4gICAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgbGV0IGVkaXRvclJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgeSA9IChjb29yZHMudG9wICsgY29vcmRzLmJvdHRvbSkgLyAyO1xuICAgIGxldCBsZWZ0ID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGVkaXRvclJlY3QubGVmdCArIDEsIHkgfSk7XG4gICAgbGV0IHJpZ2h0ID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGVkaXRvclJlY3QucmlnaHQgLSAxLCB5IH0pO1xuICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICByZXR1cm4geyBmcm9tOiBNYXRoLm1heChpbnNpZGUuZnJvbSwgTWF0aC5taW4obGVmdCwgcmlnaHQpKSwgdG86IE1hdGgubWluKGluc2lkZS50bywgTWF0aC5tYXgobGVmdCwgcmlnaHQpKSB9O1xufVxuZnVuY3Rpb24gcmVjdGFuZ2xlc0ZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpIHtcbiAgICBpZiAocmFuZ2UudG8gPD0gdmlldy52aWV3cG9ydC5mcm9tIHx8IHJhbmdlLmZyb20gPj0gdmlldy52aWV3cG9ydC50bylcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIGxldCBmcm9tID0gTWF0aC5tYXgocmFuZ2UuZnJvbSwgdmlldy52aWV3cG9ydC5mcm9tKSwgdG8gPSBNYXRoLm1pbihyYW5nZS50bywgdmlldy52aWV3cG9ydC50byk7XG4gICAgbGV0IGx0ciA9IHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgIGxldCBjb250ZW50ID0gdmlldy5jb250ZW50RE9NLCBjb250ZW50UmVjdCA9IGNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGJhc2UgPSBnZXRCYXNlKHZpZXcpO1xuICAgIGxldCBsaW5lRWx0ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLmNtLWxpbmVcIiksIGxpbmVTdHlsZSA9IGxpbmVFbHQgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUobGluZUVsdCk7XG4gICAgbGV0IGxlZnRTaWRlID0gY29udGVudFJlY3QubGVmdCArXG4gICAgICAgIChsaW5lU3R5bGUgPyBwYXJzZUludChsaW5lU3R5bGUucGFkZGluZ0xlZnQpICsgTWF0aC5taW4oMCwgcGFyc2VJbnQobGluZVN0eWxlLnRleHRJbmRlbnQpKSA6IDApO1xuICAgIGxldCByaWdodFNpZGUgPSBjb250ZW50UmVjdC5yaWdodCAtIChsaW5lU3R5bGUgPyBwYXJzZUludChsaW5lU3R5bGUucGFkZGluZ1JpZ2h0KSA6IDApO1xuICAgIGxldCBzdGFydEJsb2NrID0gYmxvY2tBdCh2aWV3LCBmcm9tLCAxKSwgZW5kQmxvY2sgPSBibG9ja0F0KHZpZXcsIHRvLCAtMSk7XG4gICAgbGV0IHZpc3VhbFN0YXJ0ID0gc3RhcnRCbG9jay50eXBlID09IEJsb2NrVHlwZS5UZXh0ID8gc3RhcnRCbG9jayA6IG51bGw7XG4gICAgbGV0IHZpc3VhbEVuZCA9IGVuZEJsb2NrLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQgPyBlbmRCbG9jayA6IG51bGw7XG4gICAgaWYgKHZpc3VhbFN0YXJ0ICYmICh2aWV3LmxpbmVXcmFwcGluZyB8fCBzdGFydEJsb2NrLndpZGdldExpbmVCcmVha3MpKVxuICAgICAgICB2aXN1YWxTdGFydCA9IHdyYXBwZWRMaW5lKHZpZXcsIGZyb20sIDEsIHZpc3VhbFN0YXJ0KTtcbiAgICBpZiAodmlzdWFsRW5kICYmICh2aWV3LmxpbmVXcmFwcGluZyB8fCBlbmRCbG9jay53aWRnZXRMaW5lQnJlYWtzKSlcbiAgICAgICAgdmlzdWFsRW5kID0gd3JhcHBlZExpbmUodmlldywgdG8sIC0xLCB2aXN1YWxFbmQpO1xuICAgIGlmICh2aXN1YWxTdGFydCAmJiB2aXN1YWxFbmQgJiYgdmlzdWFsU3RhcnQuZnJvbSA9PSB2aXN1YWxFbmQuZnJvbSAmJiB2aXN1YWxTdGFydC50byA9PSB2aXN1YWxFbmQudG8pIHtcbiAgICAgICAgcmV0dXJuIHBpZWNlcyhkcmF3Rm9yTGluZShyYW5nZS5mcm9tLCByYW5nZS50bywgdmlzdWFsU3RhcnQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCB0b3AgPSB2aXN1YWxTdGFydCA/IGRyYXdGb3JMaW5lKHJhbmdlLmZyb20sIG51bGwsIHZpc3VhbFN0YXJ0KSA6IGRyYXdGb3JXaWRnZXQoc3RhcnRCbG9jaywgZmFsc2UpO1xuICAgICAgICBsZXQgYm90dG9tID0gdmlzdWFsRW5kID8gZHJhd0ZvckxpbmUobnVsbCwgcmFuZ2UudG8sIHZpc3VhbEVuZCkgOiBkcmF3Rm9yV2lkZ2V0KGVuZEJsb2NrLCB0cnVlKTtcbiAgICAgICAgbGV0IGJldHdlZW4gPSBbXTtcbiAgICAgICAgaWYgKCh2aXN1YWxTdGFydCB8fCBzdGFydEJsb2NrKS50byA8ICh2aXN1YWxFbmQgfHwgZW5kQmxvY2spLmZyb20gLSAodmlzdWFsU3RhcnQgJiYgdmlzdWFsRW5kID8gMSA6IDApIHx8XG4gICAgICAgICAgICBzdGFydEJsb2NrLndpZGdldExpbmVCcmVha3MgPiAxICYmIHRvcC5ib3R0b20gKyB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC8gMiA8IGJvdHRvbS50b3ApXG4gICAgICAgICAgICBiZXR3ZWVuLnB1c2gocGllY2UobGVmdFNpZGUsIHRvcC5ib3R0b20sIHJpZ2h0U2lkZSwgYm90dG9tLnRvcCkpO1xuICAgICAgICBlbHNlIGlmICh0b3AuYm90dG9tIDwgYm90dG9tLnRvcCAmJiB2aWV3LmVsZW1lbnRBdEhlaWdodCgodG9wLmJvdHRvbSArIGJvdHRvbS50b3ApIC8gMikudHlwZSA9PSBCbG9ja1R5cGUuVGV4dClcbiAgICAgICAgICAgIHRvcC5ib3R0b20gPSBib3R0b20udG9wID0gKHRvcC5ib3R0b20gKyBib3R0b20udG9wKSAvIDI7XG4gICAgICAgIHJldHVybiBwaWVjZXModG9wKS5jb25jYXQoYmV0d2VlbikuY29uY2F0KHBpZWNlcyhib3R0b20pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGllY2UobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlTWFya2VyKGNsYXNzTmFtZSwgbGVmdCAtIGJhc2UubGVmdCwgdG9wIC0gYmFzZS50b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGllY2VzKHsgdG9wLCBib3R0b20sIGhvcml6b250YWwgfSkge1xuICAgICAgICBsZXQgcGllY2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaG9yaXpvbnRhbC5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIHBpZWNlcy5wdXNoKHBpZWNlKGhvcml6b250YWxbaV0sIHRvcCwgaG9yaXpvbnRhbFtpICsgMV0sIGJvdHRvbSkpO1xuICAgICAgICByZXR1cm4gcGllY2VzO1xuICAgIH1cbiAgICAvLyBHZXRzIHBhc3NlZCBmcm9tL3RvIGluIGxpbmUtbG9jYWwgcG9zaXRpb25zXG4gICAgZnVuY3Rpb24gZHJhd0ZvckxpbmUoZnJvbSwgdG8sIGxpbmUpIHtcbiAgICAgICAgbGV0IHRvcCA9IDFlOSwgYm90dG9tID0gLTFlOSwgaG9yaXpvbnRhbCA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRTcGFuKGZyb20sIGZyb21PcGVuLCB0bywgdG9PcGVuLCBkaXIpIHtcbiAgICAgICAgICAgIC8vIFBhc3NpbmcgMi8tMiBpcyBhIGtsdWRnZSB0byBmb3JjZSB0aGUgdmlldyB0byByZXR1cm5cbiAgICAgICAgICAgIC8vIGNvb3JkaW5hdGVzIG9uIHRoZSBwcm9wZXIgc2lkZSBvZiBibG9jayB3aWRnZXRzLCBzaW5jZVxuICAgICAgICAgICAgLy8gbm9ybWFsaXppbmcgdGhlIHNpZGUgdGhlcmUsIHRob3VnaCBhcHByb3ByaWF0ZSBmb3IgbW9zdFxuICAgICAgICAgICAgLy8gY29vcmRzQXRQb3MgcXVlcmllcywgd291bGQgYnJlYWsgc2VsZWN0aW9uIGRyYXdpbmcuXG4gICAgICAgICAgICBsZXQgZnJvbUNvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MoZnJvbSwgKGZyb20gPT0gbGluZS50byA/IC0yIDogMikpO1xuICAgICAgICAgICAgbGV0IHRvQ29vcmRzID0gdmlldy5jb29yZHNBdFBvcyh0bywgKHRvID09IGxpbmUuZnJvbSA/IDIgOiAtMikpO1xuICAgICAgICAgICAgaWYgKCFmcm9tQ29vcmRzIHx8ICF0b0Nvb3JkcylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0b3AgPSBNYXRoLm1pbihmcm9tQ29vcmRzLnRvcCwgdG9Db29yZHMudG9wLCB0b3ApO1xuICAgICAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoZnJvbUNvb3Jkcy5ib3R0b20sIHRvQ29vcmRzLmJvdHRvbSwgYm90dG9tKTtcbiAgICAgICAgICAgIGlmIChkaXIgPT0gRGlyZWN0aW9uLkxUUilcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsLnB1c2gobHRyICYmIGZyb21PcGVuID8gbGVmdFNpZGUgOiBmcm9tQ29vcmRzLmxlZnQsIGx0ciAmJiB0b09wZW4gPyByaWdodFNpZGUgOiB0b0Nvb3Jkcy5yaWdodCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5wdXNoKCFsdHIgJiYgdG9PcGVuID8gbGVmdFNpZGUgOiB0b0Nvb3Jkcy5sZWZ0LCAhbHRyICYmIGZyb21PcGVuID8gcmlnaHRTaWRlIDogZnJvbUNvb3Jkcy5yaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0ID0gZnJvbSAhPT0gbnVsbCAmJiBmcm9tICE9PSB2b2lkIDAgPyBmcm9tIDogbGluZS5mcm9tLCBlbmQgPSB0byAhPT0gbnVsbCAmJiB0byAhPT0gdm9pZCAwID8gdG8gOiBsaW5lLnRvO1xuICAgICAgICAvLyBTcGxpdCB0aGUgcmFuZ2UgYnkgdmlzaWJsZSByYW5nZSBhbmQgZG9jdW1lbnQgbGluZVxuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcudmlzaWJsZVJhbmdlcylcbiAgICAgICAgICAgIGlmIChyLnRvID4gc3RhcnQgJiYgci5mcm9tIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcG9zID0gTWF0aC5tYXgoci5mcm9tLCBzdGFydCksIGVuZFBvcyA9IE1hdGgubWluKHIudG8sIGVuZCk7Oykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jTGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzcGFuIG9mIHZpZXcuYmlkaVNwYW5zKGRvY0xpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BhbkZyb20gPSBzcGFuLmZyb20gKyBkb2NMaW5lLmZyb20sIHNwYW5UbyA9IHNwYW4udG8gKyBkb2NMaW5lLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkZyb20gPj0gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5UbyA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTcGFuKE1hdGgubWF4KHNwYW5Gcm9tLCBwb3MpLCBmcm9tID09IG51bGwgJiYgc3BhbkZyb20gPD0gc3RhcnQsIE1hdGgubWluKHNwYW5UbywgZW5kUG9zKSwgdG8gPT0gbnVsbCAmJiBzcGFuVG8gPj0gZW5kLCBzcGFuLmRpcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcG9zID0gZG9jTGluZS50byArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoaG9yaXpvbnRhbC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIGFkZFNwYW4oc3RhcnQsIGZyb20gPT0gbnVsbCwgZW5kLCB0byA9PSBudWxsLCB2aWV3LnRleHREaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB0b3AsIGJvdHRvbSwgaG9yaXpvbnRhbCB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkcmF3Rm9yV2lkZ2V0KGJsb2NrLCB0b3ApIHtcbiAgICAgICAgbGV0IHkgPSBjb250ZW50UmVjdC50b3AgKyAodG9wID8gYmxvY2sudG9wIDogYmxvY2suYm90dG9tKTtcbiAgICAgICAgcmV0dXJuIHsgdG9wOiB5LCBib3R0b206IHksIGhvcml6b250YWw6IFtdIH07XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZU1hcmtlcihhLCBiKSB7XG4gICAgcmV0dXJuIGEuY29uc3RydWN0b3IgPT0gYi5jb25zdHJ1Y3RvciAmJiBhLmVxKGIpO1xufVxuY2xhc3MgTGF5ZXJWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBsYXllcikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmxheWVyID0gbGF5ZXI7XG4gICAgICAgIHRoaXMuZHJhd24gPSBbXTtcbiAgICAgICAgdGhpcy5zY2FsZVggPSAxO1xuICAgICAgICB0aGlzLnNjYWxlWSA9IDE7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5tZWFzdXJlLmJpbmQodGhpcyksIHdyaXRlOiB0aGlzLmRyYXcuYmluZCh0aGlzKSB9O1xuICAgICAgICB0aGlzLmRvbSA9IHZpZXcuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tbGF5ZXJcIik7XG4gICAgICAgIGlmIChsYXllci5hYm92ZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1sYXllci1hYm92ZVwiKTtcbiAgICAgICAgaWYgKGxheWVyLmNsYXNzKVxuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChsYXllci5jbGFzcyk7XG4gICAgICAgIHRoaXMuc2NhbGUoKTtcbiAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLnNldE9yZGVyKHZpZXcuc3RhdGUpO1xuICAgICAgICB2aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIGlmIChsYXllci5tb3VudClcbiAgICAgICAgICAgIGxheWVyLm1vdW50KHRoaXMuZG9tLCB2aWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQobGF5ZXJPcmRlcikgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxheWVyT3JkZXIpKVxuICAgICAgICAgICAgdGhpcy5zZXRPcmRlcih1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAodGhpcy5sYXllci51cGRhdGUodXBkYXRlLCB0aGlzLmRvbSkgfHwgdXBkYXRlLmdlb21ldHJ5Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5zY2FsZSgpO1xuICAgICAgICAgICAgdXBkYXRlLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb2NWaWV3VXBkYXRlKHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIudXBkYXRlT25Eb2NWaWV3VXBkYXRlICE9PSBmYWxzZSlcbiAgICAgICAgICAgIHZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICB9XG4gICAgc2V0T3JkZXIoc3RhdGUpIHtcbiAgICAgICAgbGV0IHBvcyA9IDAsIG9yZGVyID0gc3RhdGUuZmFjZXQobGF5ZXJPcmRlcik7XG4gICAgICAgIHdoaWxlIChwb3MgPCBvcmRlci5sZW5ndGggJiYgb3JkZXJbcG9zXSAhPSB0aGlzLmxheWVyKVxuICAgICAgICAgICAgcG9zKys7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLnpJbmRleCA9IFN0cmluZygodGhpcy5sYXllci5hYm92ZSA/IDE1MCA6IC0xKSAtIHBvcyk7XG4gICAgfVxuICAgIG1lYXN1cmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyLm1hcmtlcnModGhpcy52aWV3KTtcbiAgICB9XG4gICAgc2NhbGUoKSB7XG4gICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgIGlmIChzY2FsZVggIT0gdGhpcy5zY2FsZVggfHwgc2NhbGVZICE9IHRoaXMuc2NhbGVZKSB7XG4gICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHNjYWxlWDtcbiAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gc2NhbGVZO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MSAvIHNjYWxlWH0sICR7MSAvIHNjYWxlWX0pYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkcmF3KG1hcmtlcnMpIHtcbiAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoICE9IHRoaXMuZHJhd24ubGVuZ3RoIHx8IG1hcmtlcnMuc29tZSgocCwgaSkgPT4gIXNhbWVNYXJrZXIocCwgdGhpcy5kcmF3bltpXSkpKSB7XG4gICAgICAgICAgICBsZXQgb2xkID0gdGhpcy5kb20uZmlyc3RDaGlsZCwgb2xkSSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBtYXJrZXIgb2YgbWFya2Vycykge1xuICAgICAgICAgICAgICAgIGlmIChtYXJrZXIudXBkYXRlICYmIG9sZCAmJiBtYXJrZXIuY29uc3RydWN0b3IgJiYgdGhpcy5kcmF3bltvbGRJXS5jb25zdHJ1Y3RvciAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZXIudXBkYXRlKG9sZCwgdGhpcy5kcmF3bltvbGRJXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkID0gb2xkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBvbGRJKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUobWFya2VyLmRyYXcoKSwgb2xkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAob2xkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBvbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgb2xkLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIG9sZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyYXduID0gbWFya2VycztcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5sYXllci5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5sYXllci5kZXN0cm95KHRoaXMuZG9tLCB0aGlzLnZpZXcpO1xuICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICB9XG59XG5jb25zdCBsYXllck9yZGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5EZWZpbmUgYSBsYXllci5cbiovXG5mdW5jdGlvbiBsYXllcihjb25maWcpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBWaWV3UGx1Z2luLmRlZmluZSh2ID0+IG5ldyBMYXllclZpZXcodiwgY29uZmlnKSksXG4gICAgICAgIGxheWVyT3JkZXIub2YoY29uZmlnKVxuICAgIF07XG59XG5cbmNvbnN0IHNlbGVjdGlvbkNvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICBjdXJzb3JCbGlua1JhdGU6IDEyMDAsXG4gICAgICAgICAgICBkcmF3UmFuZ2VDdXJzb3I6IHRydWVcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgY3Vyc29yQmxpbmtSYXRlOiAoYSwgYikgPT4gTWF0aC5taW4oYSwgYiksXG4gICAgICAgICAgICBkcmF3UmFuZ2VDdXJzb3I6IChhLCBiKSA9PiBhIHx8IGJcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgaGlkZXMgdGhlIGJyb3dzZXIncyBuYXRpdmUgc2VsZWN0aW9uIGFuZFxuY3Vyc29yLCByZXBsYWNpbmcgdGhlIHNlbGVjdGlvbiB3aXRoIGEgYmFja2dyb3VuZCBiZWhpbmQgdGhlIHRleHRcbih3aXRoIHRoZSBgY20tc2VsZWN0aW9uQmFja2dyb3VuZGAgY2xhc3MpLCBhbmQgdGhlXG5jdXJzb3JzIHdpdGggZWxlbWVudHMgb3ZlcmxhaWQgb3ZlciB0aGUgY29kZSAodXNpbmdcbmBjbS1jdXJzb3ItcHJpbWFyeWAgYW5kIGBjbS1jdXJzb3Itc2Vjb25kYXJ5YCkuXG5cblRoaXMgYWxsb3dzIHRoZSBlZGl0b3IgdG8gZGlzcGxheSBzZWNvbmRhcnkgc2VsZWN0aW9uIHJhbmdlcywgYW5kXG50ZW5kcyB0byBwcm9kdWNlIGEgdHlwZSBvZiBzZWxlY3Rpb24gbW9yZSBpbiBsaW5lIHdpdGggdGhhdCB1c2Vyc1xuZXhwZWN0IGluIGEgdGV4dCBlZGl0b3IgKHRoZSBuYXRpdmUgc2VsZWN0aW9uIHN0eWxpbmcgd2lsbCBvZnRlblxubGVhdmUgZ2FwcyBiZXR3ZWVuIGxpbmVzIGFuZCB3b24ndCBmaWxsIHRoZSBob3Jpem9udGFsIHNwYWNlIGFmdGVyXG5hIGxpbmUgd2hlbiB0aGUgc2VsZWN0aW9uIGNvbnRpbnVlcyBwYXN0IGl0KS5cblxuSXQgZG9lcyBoYXZlIGEgcGVyZm9ybWFuY2UgY29zdCwgaW4gdGhhdCBpdCByZXF1aXJlcyBhbiBleHRyYSBET01cbmxheW91dCBjeWNsZSBmb3IgbWFueSB1cGRhdGVzICh0aGUgc2VsZWN0aW9uIGlzIGRyYXduIGJhc2VkIG9uIERPTVxubGF5b3V0IGluZm9ybWF0aW9uIHRoYXQncyBvbmx5IGF2YWlsYWJsZSBhZnRlciBsYXlpbmcgb3V0IHRoZVxuY29udGVudCkuXG4qL1xuZnVuY3Rpb24gZHJhd1NlbGVjdGlvbihjb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIHNlbGVjdGlvbkNvbmZpZy5vZihjb25maWcpLFxuICAgICAgICBjdXJzb3JMYXllcixcbiAgICAgICAgc2VsZWN0aW9uTGF5ZXIsXG4gICAgICAgIGhpZGVOYXRpdmVTZWxlY3Rpb24sXG4gICAgICAgIG5hdGl2ZVNlbGVjdGlvbkhpZGRlbi5vZih0cnVlKVxuICAgIF07XG59XG4vKipcblJldHJpZXZlIHRoZSBbYGRyYXdTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuZHJhd1NlbGVjdGlvbikgY29uZmlndXJhdGlvblxuZm9yIHRoaXMgc3RhdGUuIChOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBhIHNldCBvZiBkZWZhdWx0cyBldmVuXG5pZiBgZHJhd1NlbGVjdGlvbmAgaXNuJ3QgZW5hYmxlZC4pXG4qL1xuZnVuY3Rpb24gZ2V0RHJhd1NlbGVjdGlvbkNvbmZpZyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpO1xufVxuZnVuY3Rpb24gY29uZmlnQ2hhbmdlZCh1cGRhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbn1cbmNvbnN0IGN1cnNvckxheWVyID0gLypAX19QVVJFX18qL2xheWVyKHtcbiAgICBhYm92ZTogdHJ1ZSxcbiAgICBtYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNvbmYgPSBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpO1xuICAgICAgICBsZXQgY3Vyc29ycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBwcmltID0gciA9PSBzdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgICAgIGlmIChyLmVtcHR5IHx8IGNvbmYuZHJhd1JhbmdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHByaW0gPyBcImNtLWN1cnNvciBjbS1jdXJzb3ItcHJpbWFyeVwiIDogXCJjbS1jdXJzb3IgY20tY3Vyc29yLXNlY29uZGFyeVwiO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3IgPSByLmVtcHR5ID8gciA6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioci5oZWFkLCByLmhlYWQgPiByLmFuY2hvciA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcGllY2Ugb2YgUmVjdGFuZ2xlTWFya2VyLmZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgY3Vyc29yKSlcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29ycy5wdXNoKHBpZWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3Vyc29ycztcbiAgICB9LFxuICAgIHVwZGF0ZSh1cGRhdGUsIGRvbSkge1xuICAgICAgICBpZiAodXBkYXRlLnRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLnNlbGVjdGlvbikpXG4gICAgICAgICAgICBkb20uc3R5bGUuYW5pbWF0aW9uTmFtZSA9IGRvbS5zdHlsZS5hbmltYXRpb25OYW1lID09IFwiY20tYmxpbmtcIiA/IFwiY20tYmxpbmsyXCIgOiBcImNtLWJsaW5rXCI7XG4gICAgICAgIGxldCBjb25mQ2hhbmdlID0gY29uZmlnQ2hhbmdlZCh1cGRhdGUpO1xuICAgICAgICBpZiAoY29uZkNoYW5nZSlcbiAgICAgICAgICAgIHNldEJsaW5rUmF0ZSh1cGRhdGUuc3RhdGUsIGRvbSk7XG4gICAgICAgIHJldHVybiB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0IHx8IGNvbmZDaGFuZ2U7XG4gICAgfSxcbiAgICBtb3VudChkb20sIHZpZXcpIHtcbiAgICAgICAgc2V0QmxpbmtSYXRlKHZpZXcuc3RhdGUsIGRvbSk7XG4gICAgfSxcbiAgICBjbGFzczogXCJjbS1jdXJzb3JMYXllclwiXG59KTtcbmZ1bmN0aW9uIHNldEJsaW5rUmF0ZShzdGF0ZSwgZG9tKSB7XG4gICAgZG9tLnN0eWxlLmFuaW1hdGlvbkR1cmF0aW9uID0gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKS5jdXJzb3JCbGlua1JhdGUgKyBcIm1zXCI7XG59XG5jb25zdCBzZWxlY3Rpb25MYXllciA9IC8qQF9fUFVSRV9fKi9sYXllcih7XG4gICAgYWJvdmU6IGZhbHNlLFxuICAgIG1hcmtlcnModmlldykge1xuICAgICAgICByZXR1cm4gdmlldy5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLm1hcChyID0+IHIuZW1wdHkgPyBbXSA6IFJlY3RhbmdsZU1hcmtlci5mb3JSYW5nZSh2aWV3LCBcImNtLXNlbGVjdGlvbkJhY2tncm91bmRcIiwgcikpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSk7XG4gICAgfSxcbiAgICB1cGRhdGUodXBkYXRlLCBkb20pIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fCBjb25maWdDaGFuZ2VkKHVwZGF0ZSk7XG4gICAgfSxcbiAgICBjbGFzczogXCJjbS1zZWxlY3Rpb25MYXllclwiXG59KTtcbmNvbnN0IGhpZGVOYXRpdmVTZWxlY3Rpb24gPSAvKkBfX1BVUkVfXyovUHJlYy5oaWdoZXN0KC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LnRoZW1lKHtcbiAgICBcIi5jbS1saW5lXCI6IHtcbiAgICAgICAgXCImIDo6c2VsZWN0aW9uLCAmOjpzZWxlY3Rpb25cIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiIH0sXG4gICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiXG4gICAgfSxcbiAgICBcIi5jbS1jb250ZW50XCI6IHtcbiAgICAgICAgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudCAhaW1wb3J0YW50XCIsXG4gICAgICAgIFwiJiA6Zm9jdXNcIjoge1xuICAgICAgICAgICAgY2FyZXRDb2xvcjogXCJpbml0aWFsICFpbXBvcnRhbnRcIixcbiAgICAgICAgICAgIFwiJjo6c2VsZWN0aW9uLCAmIDo6c2VsZWN0aW9uXCI6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiSGlnaGxpZ2h0ICFpbXBvcnRhbnRcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSkpO1xuXG5jb25zdCBzZXREcm9wQ3Vyc29yUG9zID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7XG4gICAgbWFwKHBvcywgbWFwcGluZykgeyByZXR1cm4gcG9zID09IG51bGwgPyBudWxsIDogbWFwcGluZy5tYXBQb3MocG9zKTsgfVxufSk7XG5jb25zdCBkcm9wQ3Vyc29yUG9zID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7IHJldHVybiBudWxsOyB9LFxuICAgIHVwZGF0ZShwb3MsIHRyKSB7XG4gICAgICAgIGlmIChwb3MgIT0gbnVsbClcbiAgICAgICAgICAgIHBvcyA9IHRyLmNoYW5nZXMubWFwUG9zKHBvcyk7XG4gICAgICAgIHJldHVybiB0ci5lZmZlY3RzLnJlZHVjZSgocG9zLCBlKSA9PiBlLmlzKHNldERyb3BDdXJzb3JQb3MpID8gZS52YWx1ZSA6IHBvcywgcG9zKTtcbiAgICB9XG59KTtcbmNvbnN0IGRyYXdEcm9wQ3Vyc29yID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxID0geyByZWFkOiB0aGlzLnJlYWRQb3MuYmluZCh0aGlzKSwgd3JpdGU6IHRoaXMuZHJhd0N1cnNvci5iaW5kKHRoaXMpIH07XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY3Vyc29yUG9zID0gdXBkYXRlLnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpO1xuICAgICAgICBpZiAoY3Vyc29yUG9zID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgKF9hID0gdGhpcy5jdXJzb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSB0aGlzLnZpZXcuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLmNsYXNzTmFtZSA9IFwiY20tZHJvcEN1cnNvclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpICE9IGN1cnNvclBvcyB8fCB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWRQb3MoKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIGxldCBwb3MgPSB2aWV3LnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpO1xuICAgICAgICBsZXQgcmVjdCA9IHBvcyAhPSBudWxsICYmIHZpZXcuY29vcmRzQXRQb3MocG9zKTtcbiAgICAgICAgaWYgKCFyZWN0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBvdXRlciA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0IC0gb3V0ZXIubGVmdCArIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgKiB2aWV3LnNjYWxlWCxcbiAgICAgICAgICAgIHRvcDogcmVjdC50b3AgLSBvdXRlci50b3AgKyB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgKiB2aWV3LnNjYWxlWSxcbiAgICAgICAgICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICAgICAgICB9O1xuICAgIH1cbiAgICBkcmF3Q3Vyc29yKHBvcykge1xuICAgICAgICBpZiAodGhpcy5jdXJzb3IpIHtcbiAgICAgICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgICAgICBpZiAocG9zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUubGVmdCA9IHBvcy5sZWZ0IC8gc2NhbGVYICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLnRvcCA9IHBvcy50b3AgLyBzY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gcG9zLmhlaWdodCAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQgPSBcIi0xMDAwMDBweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvcilcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlbW92ZSgpO1xuICAgIH1cbiAgICBzZXREcm9wUG9zKHBvcykge1xuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpICE9IHBvcylcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHNldERyb3BDdXJzb3JQb3Mub2YocG9zKSB9KTtcbiAgICB9XG59LCB7XG4gICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgZHJhZ292ZXIoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyh0aGlzLnZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2xlYXZlKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09IHRoaXMudmlldy5jb250ZW50RE9NIHx8ICF0aGlzLnZpZXcuY29udGVudERPTS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdlbmQoKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyb3AoKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbi8qKlxuRHJhd3MgYSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgZHJvcCBwb3NpdGlvbiB3aGVuIHNvbWV0aGluZyBpc1xuZHJhZ2dlZCBvdmVyIHRoZSBlZGl0b3IuXG4qL1xuZnVuY3Rpb24gZHJvcEN1cnNvcigpIHtcbiAgICByZXR1cm4gW2Ryb3BDdXJzb3JQb3MsIGRyYXdEcm9wQ3Vyc29yXTtcbn1cblxuZnVuY3Rpb24gaXRlck1hdGNoZXMoZG9jLCByZSwgZnJvbSwgdG8sIGYpIHtcbiAgICByZS5sYXN0SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGN1cnNvciA9IGRvYy5pdGVyUmFuZ2UoZnJvbSwgdG8pLCBwb3MgPSBmcm9tLCBtOyAhY3Vyc29yLm5leHQoKS5kb25lOyBwb3MgKz0gY3Vyc29yLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICBpZiAoIWN1cnNvci5saW5lQnJlYWspXG4gICAgICAgICAgICB3aGlsZSAobSA9IHJlLmV4ZWMoY3Vyc29yLnZhbHVlKSlcbiAgICAgICAgICAgICAgICBmKHBvcyArIG0uaW5kZXgsIG0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hdGNoUmFuZ2VzKHZpZXcsIG1heExlbmd0aCkge1xuICAgIGxldCB2aXNpYmxlID0gdmlldy52aXNpYmxlUmFuZ2VzO1xuICAgIGlmICh2aXNpYmxlLmxlbmd0aCA9PSAxICYmIHZpc2libGVbMF0uZnJvbSA9PSB2aWV3LnZpZXdwb3J0LmZyb20gJiZcbiAgICAgICAgdmlzaWJsZVswXS50byA9PSB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gdmlzaWJsZTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHZpc2libGUpIHtcbiAgICAgICAgZnJvbSA9IE1hdGgubWF4KHZpZXcuc3RhdGUuZG9jLmxpbmVBdChmcm9tKS5mcm9tLCBmcm9tIC0gbWF4TGVuZ3RoKTtcbiAgICAgICAgdG8gPSBNYXRoLm1pbih2aWV3LnN0YXRlLmRvYy5saW5lQXQodG8pLnRvLCB0byArIG1heExlbmd0aCk7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICYmIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0udG8gPj0gZnJvbSlcbiAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0udG8gPSB0bztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuSGVscGVyIGNsYXNzIHVzZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gZGVjb3JhdGlvbnMgb25cbnZpc2libGUgY29kZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uIFRvIGJlIHVzZWRcbmluIGEgW3ZpZXcgcGx1Z2luXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuVmlld1BsdWdpbikuIEluc3RhbmNlcyBvZiB0aGlzIG9iamVjdFxucmVwcmVzZW50IGEgbWF0Y2hpbmcgY29uZmlndXJhdGlvbi5cbiovXG5jbGFzcyBNYXRjaERlY29yYXRvciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZGVjb3JhdG9yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgcmVnZXhwLCBkZWNvcmF0aW9uLCBkZWNvcmF0ZSwgYm91bmRhcnksIG1heExlbmd0aCA9IDEwMDAgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFyZWdleHAuZ2xvYmFsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIHRvIE1hdGNoRGVjb3JhdG9yIHNob3VsZCBoYXZlIGl0cyAnZycgZmxhZyBzZXRcIik7XG4gICAgICAgIHRoaXMucmVnZXhwID0gcmVnZXhwO1xuICAgICAgICBpZiAoZGVjb3JhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIHZpZXcsIGZyb20sIGFkZCkgPT4gZGVjb3JhdGUoYWRkLCBmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBtYXRjaCwgdmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlY29yYXRpb24gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hdGNoID0gKG1hdGNoLCB2aWV3LCBmcm9tLCBhZGQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbyA9IGRlY29yYXRpb24obWF0Y2gsIHZpZXcsIGZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChkZWNvKVxuICAgICAgICAgICAgICAgICAgICBhZGQoZnJvbSwgZnJvbSArIG1hdGNoWzBdLmxlbmd0aCwgZGVjbyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlY29yYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIF92aWV3LCBmcm9tLCBhZGQpID0+IGFkZChmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBkZWNvcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRWl0aGVyICdkZWNvcmF0ZScgb3IgJ2RlY29yYXRpb24nIHNob3VsZCBiZSBwcm92aWRlZCB0byBNYXRjaERlY29yYXRvclwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvdW5kYXJ5ID0gYm91bmRhcnk7XG4gICAgICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wdXRlIHRoZSBmdWxsIHNldCBvZiBkZWNvcmF0aW9ucyBmb3IgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW5cbiAgICB2aWV3J3Mgdmlld3BvcnQuIFlvdSdsbCB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIGluaXRpYWxpemluZyB5b3VyXG4gICAgcGx1Z2luLlxuICAgICovXG4gICAgY3JlYXRlRGVjbyh2aWV3KSB7XG4gICAgICAgIGxldCBidWlsZCA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKSwgYWRkID0gYnVpbGQuYWRkLmJpbmQoYnVpbGQpO1xuICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgbWF0Y2hSYW5nZXModmlldywgdGhpcy5tYXhMZW5ndGgpKVxuICAgICAgICAgICAgaXRlck1hdGNoZXModmlldy5zdGF0ZS5kb2MsIHRoaXMucmVnZXhwLCBmcm9tLCB0bywgKGZyb20sIG0pID0+IHRoaXMuYWRkTWF0Y2gobSwgdmlldywgZnJvbSwgYWRkKSk7XG4gICAgICAgIHJldHVybiBidWlsZC5maW5pc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIGEgc2V0IG9mIGRlY29yYXRpb25zIGZvciBhIHZpZXcgdXBkYXRlLiBgZGVjb2AgX211c3RfIGJlXG4gICAgdGhlIHNldCBvZiBkZWNvcmF0aW9ucyBwcm9kdWNlZCBieSBfdGhpc18gYE1hdGNoRGVjb3JhdG9yYCBmb3JcbiAgICB0aGUgdmlldyBzdGF0ZSBiZWZvcmUgdGhlIHVwZGF0ZS5cbiAgICAqL1xuICAgIHVwZGF0ZURlY28odXBkYXRlLCBkZWNvKSB7XG4gICAgICAgIGxldCBjaGFuZ2VGcm9tID0gMWU5LCBjaGFuZ2VUbyA9IC0xO1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpXG4gICAgICAgICAgICB1cGRhdGUuY2hhbmdlcy5pdGVyQ2hhbmdlcygoX2YsIF90LCBmcm9tLCB0bykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0byA+PSB1cGRhdGUudmlldy52aWV3cG9ydC5mcm9tICYmIGZyb20gPD0gdXBkYXRlLnZpZXcudmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRnJvbSA9IE1hdGgubWluKGZyb20sIGNoYW5nZUZyb20pO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUbyA9IE1hdGgubWF4KHRvLCBjaGFuZ2VUbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICh1cGRhdGUudmlld3BvcnRNb3ZlZCB8fCBjaGFuZ2VUbyAtIGNoYW5nZUZyb20gPiAxMDAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGVjbyh1cGRhdGUudmlldyk7XG4gICAgICAgIGlmIChjaGFuZ2VUbyA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmFuZ2UodXBkYXRlLnZpZXcsIGRlY28ubWFwKHVwZGF0ZS5jaGFuZ2VzKSwgY2hhbmdlRnJvbSwgY2hhbmdlVG8pO1xuICAgICAgICByZXR1cm4gZGVjbztcbiAgICB9XG4gICAgdXBkYXRlUmFuZ2UodmlldywgZGVjbywgdXBkYXRlRnJvbSwgdXBkYXRlVG8pIHtcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnZpc2libGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gTWF0aC5tYXgoci5mcm9tLCB1cGRhdGVGcm9tKSwgdG8gPSBNYXRoLm1pbihyLnRvLCB1cGRhdGVUbyk7XG4gICAgICAgICAgICBpZiAodG8gPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb21MaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KGZyb20pLCB0b0xpbmUgPSBmcm9tTGluZS50byA8IHRvID8gdmlldy5zdGF0ZS5kb2MubGluZUF0KHRvKSA6IGZyb21MaW5lO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHIuZnJvbSwgZnJvbUxpbmUuZnJvbSksIGVuZCA9IE1hdGgubWluKHIudG8sIHRvTGluZS50byk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGZyb20gPiBmcm9tTGluZS5mcm9tOyBmcm9tLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3VuZGFyeS50ZXN0KGZyb21MaW5lLnRleHRbZnJvbSAtIDEgLSBmcm9tTGluZS5mcm9tXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyB0byA8IHRvTGluZS50bzsgdG8rKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kYXJ5LnRlc3QodG9MaW5lLnRleHRbdG8gLSB0b0xpbmUuZnJvbV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gdG87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByYW5nZXMgPSBbXSwgbTtcbiAgICAgICAgICAgICAgICBsZXQgYWRkID0gKGZyb20sIHRvLCBkZWNvKSA9PiByYW5nZXMucHVzaChkZWNvLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21MaW5lID09IHRvTGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSBzdGFydCAtIGZyb21MaW5lLmZyb207XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobSA9IHRoaXMucmVnZXhwLmV4ZWMoZnJvbUxpbmUudGV4dCkpICYmIG0uaW5kZXggPCBlbmQgLSBmcm9tTGluZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNYXRjaChtLCB2aWV3LCBtLmluZGV4ICsgZnJvbUxpbmUuZnJvbSwgYWRkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJNYXRjaGVzKHZpZXcuc3RhdGUuZG9jLCB0aGlzLnJlZ2V4cCwgc3RhcnQsIGVuZCwgKGZyb20sIG0pID0+IHRoaXMuYWRkTWF0Y2gobSwgdmlldywgZnJvbSwgYWRkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlY28gPSBkZWNvLnVwZGF0ZSh7IGZpbHRlckZyb206IHN0YXJ0LCBmaWx0ZXJUbzogZW5kLCBmaWx0ZXI6IChmcm9tLCB0bykgPT4gZnJvbSA8IHN0YXJ0IHx8IHRvID4gZW5kLCBhZGQ6IHJhbmdlcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjbztcbiAgICB9XG59XG5cbmNvbnN0IFVuaWNvZGVSZWdleHBTdXBwb3J0ID0gL3gvLnVuaWNvZGUgIT0gbnVsbCA/IFwiZ3VcIiA6IFwiZ1wiO1xuY29uc3QgU3BlY2lhbHMgPSAvKkBfX1BVUkVfXyovbmV3IFJlZ0V4cChcIltcXHUwMDAwLVxcdTAwMDhcXHUwMDBhLVxcdTAwMWZcXHUwMDdmLVxcdTAwOWZcXHUwMGFkXFx1MDYxY1xcdTIwMGJcXHUyMDBlXFx1MjAwZlxcdTIwMjhcXHUyMDI5XFx1MjAyZFxcdTIwMmVcXHUyMDY2XFx1MjA2N1xcdTIwNjlcXHVmZWZmXFx1ZmZmOS1cXHVmZmZjXVwiLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG5jb25zdCBOYW1lcyA9IHtcbiAgICAwOiBcIm51bGxcIixcbiAgICA3OiBcImJlbGxcIixcbiAgICA4OiBcImJhY2tzcGFjZVwiLFxuICAgIDEwOiBcIm5ld2xpbmVcIixcbiAgICAxMTogXCJ2ZXJ0aWNhbCB0YWJcIixcbiAgICAxMzogXCJjYXJyaWFnZSByZXR1cm5cIixcbiAgICAyNzogXCJlc2NhcGVcIixcbiAgICA4MjAzOiBcInplcm8gd2lkdGggc3BhY2VcIixcbiAgICA4MjA0OiBcInplcm8gd2lkdGggbm9uLWpvaW5lclwiLFxuICAgIDgyMDU6IFwiemVybyB3aWR0aCBqb2luZXJcIixcbiAgICA4MjA2OiBcImxlZnQtdG8tcmlnaHQgbWFya1wiLFxuICAgIDgyMDc6IFwicmlnaHQtdG8tbGVmdCBtYXJrXCIsXG4gICAgODIzMjogXCJsaW5lIHNlcGFyYXRvclwiLFxuICAgIDgyMzc6IFwibGVmdC10by1yaWdodCBvdmVycmlkZVwiLFxuICAgIDgyMzg6IFwicmlnaHQtdG8tbGVmdCBvdmVycmlkZVwiLFxuICAgIDgyOTQ6IFwibGVmdC10by1yaWdodCBpc29sYXRlXCIsXG4gICAgODI5NTogXCJyaWdodC10by1sZWZ0IGlzb2xhdGVcIixcbiAgICA4Mjk3OiBcInBvcCBkaXJlY3Rpb25hbCBpc29sYXRlXCIsXG4gICAgODIzMzogXCJwYXJhZ3JhcGggc2VwYXJhdG9yXCIsXG4gICAgNjUyNzk6IFwiemVybyB3aWR0aCBuby1icmVhayBzcGFjZVwiLFxuICAgIDY1NTMyOiBcIm9iamVjdCByZXBsYWNlbWVudFwiXG59O1xubGV0IF9zdXBwb3J0c1RhYlNpemUgPSBudWxsO1xuZnVuY3Rpb24gc3VwcG9ydHNUYWJTaXplKCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoX3N1cHBvcnRzVGFiU2l6ZSA9PSBudWxsICYmIHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgbGV0IHN0eWxlcyA9IGRvY3VtZW50LmJvZHkuc3R5bGU7XG4gICAgICAgIF9zdXBwb3J0c1RhYlNpemUgPSAoKF9hID0gc3R5bGVzLnRhYlNpemUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHN0eWxlcy5Nb3pUYWJTaXplKSAhPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gX3N1cHBvcnRzVGFiU2l6ZSB8fCBmYWxzZTtcbn1cbmNvbnN0IHNwZWNpYWxDaGFyQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIGxldCBjb25maWcgPSBjb21iaW5lQ29uZmlnKGNvbmZpZ3MsIHtcbiAgICAgICAgICAgIHJlbmRlcjogbnVsbCxcbiAgICAgICAgICAgIHNwZWNpYWxDaGFyczogU3BlY2lhbHMsXG4gICAgICAgICAgICBhZGRTcGVjaWFsQ2hhcnM6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWcucmVwbGFjZVRhYnMgPSAhc3VwcG9ydHNUYWJTaXplKCkpXG4gICAgICAgICAgICBjb25maWcuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cChcIlxcdHxcIiArIGNvbmZpZy5zcGVjaWFsQ2hhcnMuc291cmNlLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG4gICAgICAgIGlmIChjb25maWcuYWRkU3BlY2lhbENoYXJzKVxuICAgICAgICAgICAgY29uZmlnLnNwZWNpYWxDaGFycyA9IG5ldyBSZWdFeHAoY29uZmlnLnNwZWNpYWxDaGFycy5zb3VyY2UgKyBcInxcIiArIGNvbmZpZy5hZGRTcGVjaWFsQ2hhcnMuc291cmNlLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgaW5zdGFsbHMgaGlnaGxpZ2h0aW5nIG9mIHNwZWNpYWxcbmNoYXJhY3RlcnMuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0U3BlY2lhbENoYXJzKFxuLyoqXG5Db25maWd1cmF0aW9uIG9wdGlvbnMuXG4qL1xuY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW3NwZWNpYWxDaGFyQ29uZmlnLm9mKGNvbmZpZyksIHNwZWNpYWxDaGFyUGx1Z2luKCldO1xufVxubGV0IF9wbHVnaW4gPSBudWxsO1xuZnVuY3Rpb24gc3BlY2lhbENoYXJQbHVnaW4oKSB7XG4gICAgcmV0dXJuIF9wbHVnaW4gfHwgKF9wbHVnaW4gPSBWaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9uQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0b3IgPSB0aGlzLm1ha2VEZWNvcmF0b3Iodmlldy5zdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZykpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdG9yLmNyZWF0ZURlY28odmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgbWFrZURlY29yYXRvcihjb25mKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICAgICAgICAgICAgICByZWdleHA6IGNvbmYuc3BlY2lhbENoYXJzLFxuICAgICAgICAgICAgICAgIGRlY29yYXRpb246IChtLCB2aWV3LCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgZG9jIH0gPSB2aWV3LnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZSA9IGNvZGVQb2ludEF0KG1bMF0sIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gdmlldy5zdGF0ZS50YWJTaXplLCBjb2wgPSBjb3VudENvbHVtbihsaW5lLnRleHQsIHNpemUsIHBvcyAtIGxpbmUuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBUYWJXaWRnZXQoKHNpemUgLSAoY29sICUgc2l6ZSkpICogdGhpcy52aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCAvIHRoaXMudmlldy5zY2FsZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvcmF0aW9uQ2FjaGVbY29kZV0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmRlY29yYXRpb25DYWNoZVtjb2RlXSA9IERlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogbmV3IFNwZWNpYWxDaGFyV2lkZ2V0KGNvbmYsIGNvZGUpIH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5OiBjb25mLnJlcGxhY2VUYWJzID8gdW5kZWZpbmVkIDogL1teXS9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgICAgIGxldCBjb25mID0gdXBkYXRlLnN0YXRlLmZhY2V0KHNwZWNpYWxDaGFyQ29uZmlnKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZykgIT0gY29uZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdG9yID0gdGhpcy5tYWtlRGVjb3JhdG9yKGNvbmYpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci5jcmVhdGVEZWNvKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci51cGRhdGVEZWNvKHVwZGF0ZSwgdGhpcy5kZWNvcmF0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbiAgICB9KSk7XG59XG5jb25zdCBEZWZhdWx0UGxhY2Vob2xkZXIgPSBcIlxcdTIwMjJcIjtcbi8vIEFzc2lnbnMgcGxhY2Vob2xkZXIgY2hhcmFjdGVycyBmcm9tIHRoZSBDb250cm9sIFBpY3R1cmVzIGJsb2NrIHRvXG4vLyBBU0NJSSBjb250cm9sIGNoYXJhY3RlcnNcbmZ1bmN0aW9uIHBsYWNlaG9sZGVyJDEoY29kZSkge1xuICAgIGlmIChjb2RlID49IDMyKVxuICAgICAgICByZXR1cm4gRGVmYXVsdFBsYWNlaG9sZGVyO1xuICAgIGlmIChjb2RlID09IDEwKVxuICAgICAgICByZXR1cm4gXCJcXHUyNDI0XCI7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoOTIxNiArIGNvZGUpO1xufVxuY2xhc3MgU3BlY2lhbENoYXJXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5jb2RlID09IHRoaXMuY29kZTsgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgbGV0IHBoID0gcGxhY2Vob2xkZXIkMSh0aGlzLmNvZGUpO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuc3RhdGUucGhyYXNlKFwiQ29udHJvbCBjaGFyYWN0ZXJcIikgKyBcIiBcIiArIChOYW1lc1t0aGlzLmNvZGVdIHx8IFwiMHhcIiArIHRoaXMuY29kZS50b1N0cmluZygxNikpO1xuICAgICAgICBsZXQgY3VzdG9tID0gdGhpcy5vcHRpb25zLnJlbmRlciAmJiB0aGlzLm9wdGlvbnMucmVuZGVyKHRoaXMuY29kZSwgZGVzYywgcGgpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHBoO1xuICAgICAgICBzcGFuLnRpdGxlID0gZGVzYztcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGRlc2MpO1xuICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IFwiY20tc3BlY2lhbENoYXJcIjtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbmNsYXNzIFRhYldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHdpZHRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLndpZHRoID09IHRoaXMud2lkdGg7IH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IFwiXFx0XCI7XG4gICAgICAgIHNwYW4uY2xhc3NOYW1lID0gXCJjbS10YWJcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyBcInB4XCI7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbmNvbnN0IHBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTAwMDtcbiAgICAgICAgdGhpcy5hdHRycyA9IHsgc3R5bGU6IFwicGFkZGluZy1ib3R0b206IDEwMDBweFwiIH07XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdXBkYXRlO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gdmlldy52aWV3U3RhdGUuZWRpdG9ySGVpZ2h0IC1cbiAgICAgICAgICAgIHZpZXcuZGVmYXVsdExpbmVIZWlnaHQgLSB2aWV3LmRvY3VtZW50UGFkZGluZy50b3AgLSAwLjU7XG4gICAgICAgIGlmIChoZWlnaHQgPj0gMCAmJiBoZWlnaHQgIT0gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5hdHRycyA9IHsgc3R5bGU6IGBwYWRkaW5nLWJvdHRvbTogJHtoZWlnaHR9cHhgIH07XG4gICAgICAgIH1cbiAgICB9XG59KTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBtYWtlcyBzdXJlIHRoZSBjb250ZW50IGhhcyBhIGJvdHRvbVxubWFyZ2luIGVxdWl2YWxlbnQgdG8gdGhlIGhlaWdodCBvZiB0aGUgZWRpdG9yLCBtaW51cyBvbmUgbGluZVxuaGVpZ2h0LCBzbyB0aGF0IGV2ZXJ5IGxpbmUgaW4gdGhlIGRvY3VtZW50IGNhbiBiZSBzY3JvbGxlZCB0byB0aGVcbnRvcCBvZiB0aGUgZWRpdG9yLlxuXG5UaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBlZGl0b3IgaXMgc2Nyb2xsYWJsZSwgYW5kIHNob3VsZFxubm90IGJlIGVuYWJsZWQgaW4gZWRpdG9ycyB0aGF0IHRha2UgdGhlIHNpemUgb2YgdGhlaXIgY29udGVudC5cbiovXG5mdW5jdGlvbiBzY3JvbGxQYXN0RW5kKCkge1xuICAgIHJldHVybiBbcGx1Z2luLCBjb250ZW50QXR0cmlidXRlcy5vZih2aWV3ID0+IHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBsdWdpbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hdHRycykgfHwgbnVsbDsgfSldO1xufVxuXG4vKipcbk1hcmsgbGluZXMgdGhhdCBoYXZlIGEgY3Vyc29yIG9uIHRoZW0gd2l0aCB0aGUgYFwiY20tYWN0aXZlTGluZVwiYFxuRE9NIGNsYXNzLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodEFjdGl2ZUxpbmUoKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUxpbmVIaWdobGlnaHRlcjtcbn1cbmNvbnN0IGxpbmVEZWNvID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubGluZSh7IGNsYXNzOiBcImNtLWFjdGl2ZUxpbmVcIiB9KTtcbmNvbnN0IGFjdGl2ZUxpbmVIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5nZXREZWNvKHZpZXcpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0KVxuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZ2V0RGVjbyh1cGRhdGUudmlldyk7XG4gICAgfVxuICAgIGdldERlY28odmlldykge1xuICAgICAgICBsZXQgbGFzdExpbmVTdGFydCA9IC0xLCBkZWNvID0gW107XG4gICAgICAgIGZvciAobGV0IHIgb2Ygdmlldy5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQoci5oZWFkKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmZyb20gPiBsYXN0TGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgZGVjby5wdXNoKGxpbmVEZWNvLnJhbmdlKGxpbmUuZnJvbSkpO1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lU3RhcnQgPSBsaW5lLmZyb207XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24uc2V0KGRlY28pO1xuICAgIH1cbn0sIHtcbiAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG59KTtcblxuY2xhc3MgUGxhY2Vob2xkZXIgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgbGV0IHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgd3JhcC5jbGFzc05hbWUgPSBcImNtLXBsYWNlaG9sZGVyXCI7XG4gICAgICAgIHdyYXAuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xuICAgICAgICB3cmFwLmFwcGVuZENoaWxkKHR5cGVvZiB0aGlzLmNvbnRlbnQgPT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29udGVudCkgOlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuY29udGVudCA9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQodmlldykgOlxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgICB3cmFwLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgfVxuICAgIGNvb3Jkc0F0KGRvbSkge1xuICAgICAgICBsZXQgcmVjdHMgPSBkb20uZmlyc3RDaGlsZCA/IGNsaWVudFJlY3RzRm9yKGRvbS5maXJzdENoaWxkKSA6IFtdO1xuICAgICAgICBpZiAoIXJlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20ucGFyZW50Tm9kZSk7XG4gICAgICAgIGxldCByZWN0ID0gZmxhdHRlblJlY3QocmVjdHNbMF0sIHN0eWxlLmRpcmVjdGlvbiAhPSBcInJ0bFwiKTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBwYXJzZUludChzdHlsZS5saW5lSGVpZ2h0KTtcbiAgICAgICAgaWYgKHJlY3QuYm90dG9tIC0gcmVjdC50b3AgPiBsaW5lSGVpZ2h0ICogMS41KVxuICAgICAgICAgICAgcmV0dXJuIHsgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCwgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LnRvcCArIGxpbmVIZWlnaHQgfTtcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbi8qKlxuRXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBhIHBsYWNlaG9sZGVyXHUyMDE0YSBwaWVjZSBvZiBleGFtcGxlIGNvbnRlbnRcbnRvIHNob3cgd2hlbiB0aGUgZWRpdG9yIGlzIGVtcHR5LlxuKi9cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyKGNvbnRlbnQpIHtcbiAgICBsZXQgcGx1Z2luID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGNvbnRlbnRcbiAgICAgICAgICAgICAgICA/IERlY29yYXRpb24uc2V0KFtEZWNvcmF0aW9uLndpZGdldCh7IHdpZGdldDogbmV3IFBsYWNlaG9sZGVyKGNvbnRlbnQpLCBzaWRlOiAxIH0pLnJhbmdlKDApXSlcbiAgICAgICAgICAgICAgICA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgZGVjb3JhdGlvbnMoKSB7IHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aCA/IERlY29yYXRpb24ubm9uZSA6IHRoaXMucGxhY2Vob2xkZXI7IH1cbiAgICB9LCB7IGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnMgfSk7XG4gICAgcmV0dXJuIHR5cGVvZiBjb250ZW50ID09IFwic3RyaW5nXCIgPyBbXG4gICAgICAgIHBsdWdpbiwgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih7IFwiYXJpYS1wbGFjZWhvbGRlclwiOiBjb250ZW50IH0pXG4gICAgXSA6IHBsdWdpbjtcbn1cblxuLy8gRG9uJ3QgY29tcHV0ZSBwcmVjaXNlIGNvbHVtbiBwb3NpdGlvbnMgZm9yIGxpbmUgb2Zmc2V0cyBhYm92ZSB0aGlzXG4vLyAoc2luY2UgaXQgY291bGQgZ2V0IGV4cGVuc2l2ZSkuIEFzc3VtZSBvZmZzZXQ9PWNvbHVtbiBmb3IgdGhlbS5cbmNvbnN0IE1heE9mZiA9IDIwMDA7XG5mdW5jdGlvbiByZWN0YW5nbGVGb3Ioc3RhdGUsIGEsIGIpIHtcbiAgICBsZXQgc3RhcnRMaW5lID0gTWF0aC5taW4oYS5saW5lLCBiLmxpbmUpLCBlbmRMaW5lID0gTWF0aC5tYXgoYS5saW5lLCBiLmxpbmUpO1xuICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICBpZiAoYS5vZmYgPiBNYXhPZmYgfHwgYi5vZmYgPiBNYXhPZmYgfHwgYS5jb2wgPCAwIHx8IGIuY29sIDwgMCkge1xuICAgICAgICBsZXQgc3RhcnRPZmYgPSBNYXRoLm1pbihhLm9mZiwgYi5vZmYpLCBlbmRPZmYgPSBNYXRoLm1heChhLm9mZiwgYi5vZmYpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRMaW5lOyBpIDw9IGVuZExpbmU7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShpKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA8PSBlbmRPZmYpXG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGxpbmUuZnJvbSArIHN0YXJ0T2ZmLCBsaW5lLnRvICsgZW5kT2ZmKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBzdGFydENvbCA9IE1hdGgubWluKGEuY29sLCBiLmNvbCksIGVuZENvbCA9IE1hdGgubWF4KGEuY29sLCBiLmNvbCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPD0gZW5kTGluZTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGkpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gZmluZENvbHVtbihsaW5lLnRleHQsIHN0YXJ0Q29sLCBzdGF0ZS50YWJTaXplLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKGxpbmUudG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBmaW5kQ29sdW1uKGxpbmUudGV4dCwgZW5kQ29sLCBzdGF0ZS50YWJTaXplKTtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChFZGl0b3JTZWxlY3Rpb24ucmFuZ2UobGluZS5mcm9tICsgc3RhcnQsIGxpbmUuZnJvbSArIGVuZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByYW5nZXM7XG59XG5mdW5jdGlvbiBhYnNvbHV0ZUNvbHVtbih2aWV3LCB4KSB7XG4gICAgbGV0IHJlZiA9IHZpZXcuY29vcmRzQXRQb3Modmlldy52aWV3cG9ydC5mcm9tKTtcbiAgICByZXR1cm4gcmVmID8gTWF0aC5yb3VuZChNYXRoLmFicygocmVmLmxlZnQgLSB4KSAvIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoKSkgOiAtMTtcbn1cbmZ1bmN0aW9uIGdldFBvcyh2aWV3LCBldmVudCkge1xuICAgIGxldCBvZmZzZXQgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LCBmYWxzZSk7XG4gICAgbGV0IGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQob2Zmc2V0KSwgb2ZmID0gb2Zmc2V0IC0gbGluZS5mcm9tO1xuICAgIGxldCBjb2wgPSBvZmYgPiBNYXhPZmYgPyAtMVxuICAgICAgICA6IG9mZiA9PSBsaW5lLmxlbmd0aCA/IGFic29sdXRlQ29sdW1uKHZpZXcsIGV2ZW50LmNsaWVudFgpXG4gICAgICAgICAgICA6IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgdmlldy5zdGF0ZS50YWJTaXplLCBvZmZzZXQgLSBsaW5lLmZyb20pO1xuICAgIHJldHVybiB7IGxpbmU6IGxpbmUubnVtYmVyLCBjb2wsIG9mZiB9O1xufVxuZnVuY3Rpb24gcmVjdGFuZ2xlU2VsZWN0aW9uU3R5bGUodmlldywgZXZlbnQpIHtcbiAgICBsZXQgc3RhcnQgPSBnZXRQb3ModmlldywgZXZlbnQpLCBzdGFydFNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghc3RhcnQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdTdGFydCA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh1cGRhdGUuc3RhcnRTdGF0ZS5kb2MubGluZShzdGFydC5saW5lKS5mcm9tKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3TGluZSA9IHVwZGF0ZS5zdGF0ZS5kb2MubGluZUF0KG5ld1N0YXJ0KTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHsgbGluZTogbmV3TGluZS5udW1iZXIsIGNvbDogc3RhcnQuY29sLCBvZmY6IE1hdGgubWluKHN0YXJ0Lm9mZiwgbmV3TGluZS5sZW5ndGgpIH07XG4gICAgICAgICAgICAgICAgc3RhcnRTZWwgPSBzdGFydFNlbC5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQoZXZlbnQsIF9leHRlbmQsIG11bHRpcGxlKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gZ2V0UG9zKHZpZXcsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmICghY3VyKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbDtcbiAgICAgICAgICAgIGxldCByYW5nZXMgPSByZWN0YW5nbGVGb3Iodmlldy5zdGF0ZSwgc3RhcnQsIGN1cik7XG4gICAgICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U2VsO1xuICAgICAgICAgICAgaWYgKG11bHRpcGxlKVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcy5jb25jYXQoc3RhcnRTZWwucmFuZ2VzKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIHJlY3Rhbmd1bGFyIHNlbGVjdGlvbnMuIEJ5XG5kZWZhdWx0LCBpdCB3aWxsIHJlYWN0IHRvIGxlZnQgbW91c2UgZHJhZyB3aXRoIHRoZSBBbHQga2V5IGhlbGRcbmRvd24uIFdoZW4gc3VjaCBhIHNlbGVjdGlvbiBvY2N1cnMsIHRoZSB0ZXh0IHdpdGhpbiB0aGUgcmVjdGFuZ2xlXG50aGF0IHdhcyBkcmFnZ2VkIG92ZXIgd2lsbCBiZSBzZWxlY3RlZCwgYXMgb25lIHNlbGVjdGlvblxuW3JhbmdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvblJhbmdlKSBwZXIgbGluZS5cbiovXG5mdW5jdGlvbiByZWN0YW5ndWxhclNlbGVjdGlvbihvcHRpb25zKSB7XG4gICAgbGV0IGZpbHRlciA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZXZlbnRGaWx0ZXIpIHx8IChlID0+IGUuYWx0S2V5ICYmIGUuYnV0dG9uID09IDApO1xuICAgIHJldHVybiBFZGl0b3JWaWV3Lm1vdXNlU2VsZWN0aW9uU3R5bGUub2YoKHZpZXcsIGV2ZW50KSA9PiBmaWx0ZXIoZXZlbnQpID8gcmVjdGFuZ2xlU2VsZWN0aW9uU3R5bGUodmlldywgZXZlbnQpIDogbnVsbCk7XG59XG5jb25zdCBrZXlzID0ge1xuICAgIEFsdDogWzE4LCBlID0+ICEhZS5hbHRLZXldLFxuICAgIENvbnRyb2w6IFsxNywgZSA9PiAhIWUuY3RybEtleV0sXG4gICAgU2hpZnQ6IFsxNiwgZSA9PiAhIWUuc2hpZnRLZXldLFxuICAgIE1ldGE6IFs5MSwgZSA9PiAhIWUubWV0YUtleV1cbn07XG5jb25zdCBzaG93Q3Jvc3NoYWlyID0geyBzdHlsZTogXCJjdXJzb3I6IGNyb3NzaGFpclwiIH07XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgdHVybnMgdGhlIHBvaW50ZXIgY3Vyc29yIGludG8gYVxuY3Jvc3NoYWlyIHdoZW4gYSBnaXZlbiBtb2RpZmllciBrZXksIGRlZmF1bHRpbmcgdG8gQWx0LCBpcyBoZWxkXG5kb3duLiBDYW4gc2VydmUgYXMgYSB2aXN1YWwgaGludCB0aGF0IHJlY3Rhbmd1bGFyIHNlbGVjdGlvbiBpc1xuZ29pbmcgdG8gaGFwcGVuIHdoZW4gcGFpcmVkIHdpdGhcbltgcmVjdGFuZ3VsYXJTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcucmVjdGFuZ3VsYXJTZWxlY3Rpb24pLlxuKi9cbmZ1bmN0aW9uIGNyb3NzaGFpckN1cnNvcihvcHRpb25zID0ge30pIHtcbiAgICBsZXQgW2NvZGUsIGdldHRlcl0gPSBrZXlzW29wdGlvbnMua2V5IHx8IFwiQWx0XCJdO1xuICAgIGxldCBwbHVnaW4gPSBWaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgICAgICB0aGlzLmlzRG93biA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHNldChpc0Rvd24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRG93biAhPSBpc0Rvd24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRG93biA9IGlzRG93bjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgICAgIGtleWRvd24oZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGUua2V5Q29kZSA9PSBjb2RlIHx8IGdldHRlcihlKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5dXAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gY29kZSB8fCAhZ2V0dGVyKGUpKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91c2Vtb3ZlKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChnZXR0ZXIoZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcGx1Z2luLFxuICAgICAgICBFZGl0b3JWaWV3LmNvbnRlbnRBdHRyaWJ1dGVzLm9mKHZpZXcgPT4geyB2YXIgX2E7IHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4ocGx1Z2luKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRG93bikgPyBzaG93Q3Jvc3NoYWlyIDogbnVsbDsgfSlcbiAgICBdO1xufVxuXG5jb25zdCBPdXRzaWRlID0gXCItMTAwMDBweFwiO1xuY2xhc3MgVG9vbHRpcFZpZXdNYW5hZ2VyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBmYWNldCwgY3JlYXRlVG9vbHRpcFZpZXcsIHJlbW92ZVRvb2x0aXBWaWV3KSB7XG4gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDtcbiAgICAgICAgdGhpcy5jcmVhdGVUb29sdGlwVmlldyA9IGNyZWF0ZVRvb2x0aXBWaWV3O1xuICAgICAgICB0aGlzLnJlbW92ZVRvb2x0aXBWaWV3ID0gcmVtb3ZlVG9vbHRpcFZpZXc7XG4gICAgICAgIHRoaXMuaW5wdXQgPSB2aWV3LnN0YXRlLmZhY2V0KGZhY2V0KTtcbiAgICAgICAgdGhpcy50b29sdGlwcyA9IHRoaXMuaW5wdXQuZmlsdGVyKHQgPT4gdCk7XG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgdGhpcy50b29sdGlwVmlld3MgPSB0aGlzLnRvb2x0aXBzLm1hcCh0ID0+IHByZXYgPSBjcmVhdGVUb29sdGlwVmlldyh0LCBwcmV2KSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUsIGFib3ZlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGlucHV0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KHRoaXMuZmFjZXQpO1xuICAgICAgICBsZXQgdG9vbHRpcHMgPSBpbnB1dC5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgaWYgKGlucHV0ID09PSB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIGlmICh0LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdC51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9vbHRpcFZpZXdzID0gW10sIG5ld0Fib3ZlID0gYWJvdmUgPyBbXSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0aXAgPSB0b29sdGlwc1tpXSwga25vd24gPSAtMTtcbiAgICAgICAgICAgIGlmICghdGlwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gdGhpcy50b29sdGlwc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob3RoZXIgJiYgb3RoZXIuY3JlYXRlID09IHRpcC5jcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgIGtub3duID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICB0b29sdGlwVmlld3NbaV0gPSB0aGlzLmNyZWF0ZVRvb2x0aXBWaWV3KHRpcCwgaSA/IHRvb2x0aXBWaWV3c1tpIC0gMV0gOiBudWxsKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3QWJvdmUpXG4gICAgICAgICAgICAgICAgICAgIG5ld0Fib3ZlW2ldID0gISF0aXAuYWJvdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9vbHRpcFZpZXcgPSB0b29sdGlwVmlld3NbaV0gPSB0aGlzLnRvb2x0aXBWaWV3c1trbm93bl07XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Fib3ZlKVxuICAgICAgICAgICAgICAgICAgICBuZXdBYm92ZVtpXSA9IGFib3ZlW2tub3duXTtcbiAgICAgICAgICAgICAgICBpZiAodG9vbHRpcFZpZXcudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgaWYgKHRvb2x0aXBWaWV3cy5pbmRleE9mKHQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVG9vbHRpcFZpZXcodCk7XG4gICAgICAgICAgICAgICAgKF9hID0gdC5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGFib3ZlKSB7XG4gICAgICAgICAgICBuZXdBYm92ZS5mb3JFYWNoKCh2YWwsIGkpID0+IGFib3ZlW2ldID0gdmFsKTtcbiAgICAgICAgICAgIGFib3ZlLmxlbmd0aCA9IG5ld0Fib3ZlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMudG9vbHRpcHMgPSB0b29sdGlwcztcbiAgICAgICAgdGhpcy50b29sdGlwVmlld3MgPSB0b29sdGlwVmlld3M7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbi8qKlxuQ3JlYXRlcyBhbiBleHRlbnNpb24gdGhhdCBjb25maWd1cmVzIHRvb2x0aXAgYmVoYXZpb3IuXG4qL1xuZnVuY3Rpb24gdG9vbHRpcHMoY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdG9vbHRpcENvbmZpZy5vZihjb25maWcpO1xufVxuZnVuY3Rpb24gd2luZG93U3BhY2Uodmlldykge1xuICAgIGxldCBkb2NFbHQgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAsIGJvdHRvbTogZG9jRWx0LmNsaWVudEhlaWdodCwgcmlnaHQ6IGRvY0VsdC5jbGllbnRXaWR0aCB9O1xufVxuY29uc3QgdG9vbHRpcENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICByZXR1cm4gKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBicm93c2VyLmlvcyA/IFwiYWJzb2x1dGVcIiA6ICgoX2EgPSB2YWx1ZXMuZmluZChjb25mID0+IGNvbmYucG9zaXRpb24pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucG9zaXRpb24pIHx8IFwiZml4ZWRcIixcbiAgICAgICAgICAgIHBhcmVudDogKChfYiA9IHZhbHVlcy5maW5kKGNvbmYgPT4gY29uZi5wYXJlbnQpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyZW50KSB8fCBudWxsLFxuICAgICAgICAgICAgdG9vbHRpcFNwYWNlOiAoKF9jID0gdmFsdWVzLmZpbmQoY29uZiA9PiBjb25mLnRvb2x0aXBTcGFjZSkpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b29sdGlwU3BhY2UpIHx8IHdpbmRvd1NwYWNlLFxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbmNvbnN0IGtub3duSGVpZ2h0ID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG5jb25zdCB0b29sdGlwUGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuYWJvdmUgPSBbXTtcbiAgICAgICAgdGhpcy5pblZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLm1hZGVBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxhc3RUcmFuc2FjdGlvbiA9IDA7XG4gICAgICAgIHRoaXMubWVhc3VyZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHZpZXcuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZyk7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBjb25maWcucG9zaXRpb247XG4gICAgICAgIHRoaXMucGFyZW50ID0gY29uZmlnLnBhcmVudDtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gdmlldy50aGVtZUNsYXNzZXM7XG4gICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5yZWFkTWVhc3VyZS5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy53cml0ZU1lYXN1cmUuYmluZCh0aGlzKSwga2V5OiB0aGlzIH07XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiID8gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMubWVhc3VyZVNvb24oKSkgOiBudWxsO1xuICAgICAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVG9vbHRpcFZpZXdNYW5hZ2VyKHZpZXcsIHNob3dUb29sdGlwLCAodCwgcCkgPT4gdGhpcy5jcmVhdGVUb29sdGlwKHQsIHApLCB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKVxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHQuZG9tKTtcbiAgICAgICAgICAgIHQuZG9tLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm92ZSA9IHRoaXMubWFuYWdlci50b29sdGlwcy5tYXAodCA9PiAhIXQuYWJvdmUpO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gdHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09IFwiZnVuY3Rpb25cIiA/IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID4gdGhpcy5sYXN0VHJhbnNhY3Rpb24gLSA1MCAmJlxuICAgICAgICAgICAgICAgIGVudHJpZXMubGVuZ3RoID4gMCAmJiBlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaW50ZXJzZWN0aW9uUmF0aW8gPCAxKVxuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVNvb24oKTtcbiAgICAgICAgfSwgeyB0aHJlc2hvbGQ6IFsxXSB9KSA6IG51bGw7XG4gICAgICAgIHRoaXMub2JzZXJ2ZUludGVyc2VjdGlvbigpO1xuICAgICAgICB2aWV3Lndpbi5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMubWVhc3VyZVNvb24gPSB0aGlzLm1lYXN1cmVTb29uLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgIH1cbiAgICBjcmVhdGVDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnZpZXcuZG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9ic2VydmVJbnRlcnNlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHRvb2x0aXAgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUodG9vbHRpcC5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmVTb29uKCkge1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IC0xO1xuICAgICAgICAgICAgICAgIHRoaXMubWF5YmVNZWFzdXJlKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5sYXN0VHJhbnNhY3Rpb24gPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IHRoaXMubWFuYWdlci51cGRhdGUodXBkYXRlLCB0aGlzLmFib3ZlKTtcbiAgICAgICAgaWYgKHVwZGF0ZWQpXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVJbnRlcnNlY3Rpb24oKTtcbiAgICAgICAgbGV0IHNob3VsZE1lYXN1cmUgPSB1cGRhdGVkIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQ7XG4gICAgICAgIGxldCBuZXdDb25maWcgPSB1cGRhdGUuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZyk7XG4gICAgICAgIGlmIChuZXdDb25maWcucG9zaXRpb24gIT0gdGhpcy5wb3NpdGlvbiAmJiAhdGhpcy5tYWRlQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdDb25maWcucG9zaXRpb247XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdC5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICAgICAgc2hvdWxkTWVhc3VyZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0NvbmZpZy5wYXJlbnQgIT0gdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gbmV3Q29uZmlnLnBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodC5kb20pO1xuICAgICAgICAgICAgc2hvdWxkTWVhc3VyZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy52aWV3LnRoZW1lQ2xhc3NlcyAhPSB0aGlzLmNsYXNzZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IHRoaXMudmlldy50aGVtZUNsYXNzZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZE1lYXN1cmUpXG4gICAgICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgIH1cbiAgICBjcmVhdGVUb29sdGlwKHRvb2x0aXAsIHByZXYpIHtcbiAgICAgICAgbGV0IHRvb2x0aXBWaWV3ID0gdG9vbHRpcC5jcmVhdGUodGhpcy52aWV3KTtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHByZXYgPyBwcmV2LmRvbSA6IG51bGw7XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcFwiKTtcbiAgICAgICAgaWYgKHRvb2x0aXAuYXJyb3cgJiYgIXRvb2x0aXBWaWV3LmRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLXRvb2x0aXAgPiAuY20tdG9vbHRpcC1hcnJvd1wiKSkge1xuICAgICAgICAgICAgbGV0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFycm93LmNsYXNzTmFtZSA9IFwiY20tdG9vbHRpcC1hcnJvd1wiO1xuICAgICAgICAgICAgdG9vbHRpcFZpZXcuZG9tLmFwcGVuZENoaWxkKGFycm93KTtcbiAgICAgICAgfVxuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9vbHRpcFZpZXcuZG9tLCBiZWZvcmUpO1xuICAgICAgICBpZiAodG9vbHRpcFZpZXcubW91bnQpXG4gICAgICAgICAgICB0b29sdGlwVmlldy5tb3VudCh0aGlzLnZpZXcpO1xuICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcilcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0b29sdGlwVmlldy5kb20pO1xuICAgICAgICByZXR1cm4gdG9vbHRpcFZpZXc7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnZpZXcud2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5tZWFzdXJlU29vbik7XG4gICAgICAgIGZvciAobGV0IHRvb2x0aXBWaWV3IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpIHtcbiAgICAgICAgICAgIHRvb2x0aXBWaWV3LmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgIChfYSA9IHRvb2x0aXBWaWV3LmRlc3Ryb3kpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHRvb2x0aXBWaWV3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgKF9iID0gdGhpcy5yZXNpemVPYnNlcnZlcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgKF9jID0gdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubWVhc3VyZVRpbWVvdXQpO1xuICAgIH1cbiAgICByZWFkTWVhc3VyZSgpIHtcbiAgICAgICAgbGV0IHNjYWxlWCA9IDEsIHNjYWxlWSA9IDEsIG1ha2VBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBcImZpeGVkXCIgJiYgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IGRvbSB9ID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3c1swXTtcbiAgICAgICAgICAgIGlmIChicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBzZXRzIHRoZSBlbGVtZW50J3MgYG9mZnNldFBhcmVudGAgdG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtZWQgZWxlbWVudCB3aGVuIGEgdHJhbnNmb3JtIGludGVyZmVyZXMgd2l0aCBmaXhlZFxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uaW5nLlxuICAgICAgICAgICAgICAgIG1ha2VBYnNvbHV0ZSA9IGRvbS5vZmZzZXRQYXJlbnQgIT0gdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLnN0eWxlLnRvcCA9PSBPdXRzaWRlICYmIGRvbS5zdHlsZS5sZWZ0ID09IFwiMHB4XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBPbiBvdGhlciBicm93c2Vycywgd2UgaGF2ZSB0byBhd2t3YXJkbHkgdHJ5IGFuZCB1c2Ugb3RoZXJcbiAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byBkZXRlY3QgYSB0cmFuc2Zvcm0uXG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgbWFrZUFic29sdXRlID0gTWF0aC5hYnMocmVjdC50b3AgKyAxMDAwMCkgPiAxIHx8IE1hdGguYWJzKHJlY3QubGVmdCkgPiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYWtlQWJzb2x1dGUgfHwgdGhpcy5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdGhpcy5wYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVYID0gcmVjdC53aWR0aCAvIHRoaXMucGFyZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBzY2FsZVkgPSByZWN0LmhlaWdodCAvIHRoaXMucGFyZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAoeyBzY2FsZVgsIHNjYWxlWSB9ID0gdGhpcy52aWV3LnZpZXdTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZpc2libGUgPSB0aGlzLnZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBtYXJnaW5zID0gZ2V0U2Nyb2xsTWFyZ2lucyh0aGlzLnZpZXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmlzaWJsZToge1xuICAgICAgICAgICAgICAgIGxlZnQ6IHZpc2libGUubGVmdCArIG1hcmdpbnMubGVmdCwgdG9wOiB2aXNpYmxlLnRvcCArIG1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiB2aXNpYmxlLnJpZ2h0IC0gbWFyZ2lucy5yaWdodCwgYm90dG9tOiB2aXNpYmxlLmJvdHRvbSAtIG1hcmdpbnMuYm90dG9tXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCA/IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogdGhpcy52aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIHBvczogdGhpcy5tYW5hZ2VyLnRvb2x0aXBzLm1hcCgodCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0diA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbaV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR2LmdldENvb3JkcyA/IHR2LmdldENvb3Jkcyh0LnBvcykgOiB0aGlzLnZpZXcuY29vcmRzQXRQb3ModC5wb3MpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaXplOiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzLm1hcCgoeyBkb20gfSkgPT4gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxcbiAgICAgICAgICAgIHNwYWNlOiB0aGlzLnZpZXcuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZykudG9vbHRpcFNwYWNlKHRoaXMudmlldyksXG4gICAgICAgICAgICBzY2FsZVgsIHNjYWxlWSwgbWFrZUFic29sdXRlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdyaXRlTWVhc3VyZShtZWFzdXJlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChtZWFzdXJlZC5tYWtlQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRoaXMubWFkZUFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdC5kb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgdmlzaWJsZSwgc3BhY2UsIHNjYWxlWCwgc2NhbGVZIH0gPSBtZWFzdXJlZDtcbiAgICAgICAgbGV0IG90aGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFuYWdlci50b29sdGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRvb2x0aXAgPSB0aGlzLm1hbmFnZXIudG9vbHRpcHNbaV0sIHRWaWV3ID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3c1tpXSwgeyBkb20gfSA9IHRWaWV3O1xuICAgICAgICAgICAgbGV0IHBvcyA9IG1lYXN1cmVkLnBvc1tpXSwgc2l6ZSA9IG1lYXN1cmVkLnNpemVbaV07XG4gICAgICAgICAgICAvLyBIaWRlIHRvb2x0aXBzIHRoYXQgYXJlIG91dHNpZGUgb2YgdGhlIGVkaXRvci5cbiAgICAgICAgICAgIGlmICghcG9zIHx8IHRvb2x0aXAuY2xpcCAhPT0gZmFsc2UgJiYgKHBvcy5ib3R0b20gPD0gTWF0aC5tYXgodmlzaWJsZS50b3AsIHNwYWNlLnRvcCkgfHxcbiAgICAgICAgICAgICAgICBwb3MudG9wID49IE1hdGgubWluKHZpc2libGUuYm90dG9tLCBzcGFjZS5ib3R0b20pIHx8XG4gICAgICAgICAgICAgICAgcG9zLnJpZ2h0IDwgTWF0aC5tYXgodmlzaWJsZS5sZWZ0LCBzcGFjZS5sZWZ0KSAtIC4xIHx8XG4gICAgICAgICAgICAgICAgcG9zLmxlZnQgPiBNYXRoLm1pbih2aXNpYmxlLnJpZ2h0LCBzcGFjZS5yaWdodCkgKyAuMSkpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhcnJvdyA9IHRvb2x0aXAuYXJyb3cgPyB0Vmlldy5kb20ucXVlcnlTZWxlY3RvcihcIi5jbS10b29sdGlwLWFycm93XCIpIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBhcnJvd0hlaWdodCA9IGFycm93ID8gNyAvKiBBcnJvdy5TaXplICovIDogMDtcbiAgICAgICAgICAgIGxldCB3aWR0aCA9IHNpemUucmlnaHQgLSBzaXplLmxlZnQsIGhlaWdodCA9IChfYSA9IGtub3duSGVpZ2h0LmdldCh0VmlldykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHNpemUuYm90dG9tIC0gc2l6ZS50b3A7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gdFZpZXcub2Zmc2V0IHx8IG5vT2Zmc2V0LCBsdHIgPSB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICAgICAgbGV0IGxlZnQgPSBzaXplLndpZHRoID4gc3BhY2UucmlnaHQgLSBzcGFjZS5sZWZ0XG4gICAgICAgICAgICAgICAgPyAobHRyID8gc3BhY2UubGVmdCA6IHNwYWNlLnJpZ2h0IC0gc2l6ZS53aWR0aClcbiAgICAgICAgICAgICAgICA6IGx0ciA/IE1hdGgubWF4KHNwYWNlLmxlZnQsIE1hdGgubWluKHBvcy5sZWZ0IC0gKGFycm93ID8gMTQgLyogQXJyb3cuT2Zmc2V0ICovIDogMCkgKyBvZmZzZXQueCwgc3BhY2UucmlnaHQgLSB3aWR0aCkpXG4gICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4oTWF0aC5tYXgoc3BhY2UubGVmdCwgcG9zLmxlZnQgLSB3aWR0aCArIChhcnJvdyA/IDE0IC8qIEFycm93Lk9mZnNldCAqLyA6IDApIC0gb2Zmc2V0LngpLCBzcGFjZS5yaWdodCAtIHdpZHRoKTtcbiAgICAgICAgICAgIGxldCBhYm92ZSA9IHRoaXMuYWJvdmVbaV07XG4gICAgICAgICAgICBpZiAoIXRvb2x0aXAuc3RyaWN0U2lkZSAmJiAoYWJvdmVcbiAgICAgICAgICAgICAgICA/IHBvcy50b3AgLSBoZWlnaHQgLSBhcnJvd0hlaWdodCAtIG9mZnNldC55IDwgc3BhY2UudG9wXG4gICAgICAgICAgICAgICAgOiBwb3MuYm90dG9tICsgaGVpZ2h0ICsgYXJyb3dIZWlnaHQgKyBvZmZzZXQueSA+IHNwYWNlLmJvdHRvbSkgJiZcbiAgICAgICAgICAgICAgICBhYm92ZSA9PSAoc3BhY2UuYm90dG9tIC0gcG9zLmJvdHRvbSA+IHBvcy50b3AgLSBzcGFjZS50b3ApKVxuICAgICAgICAgICAgICAgIGFib3ZlID0gdGhpcy5hYm92ZVtpXSA9ICFhYm92ZTtcbiAgICAgICAgICAgIGxldCBzcGFjZVZlcnQgPSAoYWJvdmUgPyBwb3MudG9wIC0gc3BhY2UudG9wIDogc3BhY2UuYm90dG9tIC0gcG9zLmJvdHRvbSkgLSBhcnJvd0hlaWdodDtcbiAgICAgICAgICAgIGlmIChzcGFjZVZlcnQgPCBoZWlnaHQgJiYgdFZpZXcucmVzaXplICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZVZlcnQgPCB0aGlzLnZpZXcuZGVmYXVsdExpbmVIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrbm93bkhlaWdodC5zZXQodFZpZXcsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLmhlaWdodCA9IChoZWlnaHQgPSBzcGFjZVZlcnQpIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLnN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRvcCA9IGFib3ZlID8gcG9zLnRvcCAtIGhlaWdodCAtIGFycm93SGVpZ2h0IC0gb2Zmc2V0LnkgOiBwb3MuYm90dG9tICsgYXJyb3dIZWlnaHQgKyBvZmZzZXQueTtcbiAgICAgICAgICAgIGxldCByaWdodCA9IGxlZnQgKyB3aWR0aDtcbiAgICAgICAgICAgIGlmICh0Vmlldy5vdmVybGFwICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2Ygb3RoZXJzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoci5sZWZ0IDwgcmlnaHQgJiYgci5yaWdodCA+IGxlZnQgJiYgci50b3AgPCB0b3AgKyBoZWlnaHQgJiYgci5ib3R0b20gPiB0b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBhYm92ZSA/IHIudG9wIC0gaGVpZ2h0IC0gMiAtIGFycm93SGVpZ2h0IDogci5ib3R0b20gKyBhcnJvd0hlaWdodCArIDI7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gKHRvcCAtIG1lYXN1cmVkLnBhcmVudC50b3ApIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHNldExlZnRTdHlsZShkb20sIChsZWZ0IC0gbWVhc3VyZWQucGFyZW50LmxlZnQpIC8gc2NhbGVYKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS50b3AgPSB0b3AgLyBzY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgc2V0TGVmdFN0eWxlKGRvbSwgbGVmdCAvIHNjYWxlWCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJyb3cpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyb3dMZWZ0ID0gcG9zLmxlZnQgKyAobHRyID8gb2Zmc2V0LnggOiAtb2Zmc2V0LngpIC0gKGxlZnQgKyAxNCAvKiBBcnJvdy5PZmZzZXQgKi8gLSA3IC8qIEFycm93LlNpemUgKi8pO1xuICAgICAgICAgICAgICAgIGFycm93LnN0eWxlLmxlZnQgPSBhcnJvd0xlZnQgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodFZpZXcub3ZlcmxhcCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICBvdGhlcnMucHVzaCh7IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTogdG9wICsgaGVpZ2h0IH0pO1xuICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC50b2dnbGUoXCJjbS10b29sdGlwLWFib3ZlXCIsIGFib3ZlKTtcbiAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QudG9nZ2xlKFwiY20tdG9vbHRpcC1iZWxvd1wiLCAhYWJvdmUpO1xuICAgICAgICAgICAgaWYgKHRWaWV3LnBvc2l0aW9uZWQpXG4gICAgICAgICAgICAgICAgdFZpZXcucG9zaXRpb25lZChtZWFzdXJlZC5zcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWF5YmVNZWFzdXJlKCkge1xuICAgICAgICBpZiAodGhpcy5tYW5hZ2VyLnRvb2x0aXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5pblZpZXcpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pblZpZXcgIT0gdGhpcy52aWV3LmluVmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5WaWV3ID0gdGhpcy52aWV3LmluVmlldztcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5WaWV3KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0diBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHYuZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59LCB7XG4gICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgc2Nyb2xsKCkgeyB0aGlzLm1heWJlTWVhc3VyZSgpOyB9XG4gICAgfVxufSk7XG5mdW5jdGlvbiBzZXRMZWZ0U3R5bGUoZWx0LCB2YWx1ZSkge1xuICAgIGxldCBjdXJyZW50ID0gcGFyc2VJbnQoZWx0LnN0eWxlLmxlZnQsIDEwKTtcbiAgICBpZiAoaXNOYU4oY3VycmVudCkgfHwgTWF0aC5hYnModmFsdWUgLSBjdXJyZW50KSA+IDEpXG4gICAgICAgIGVsdC5zdHlsZS5sZWZ0ID0gdmFsdWUgKyBcInB4XCI7XG59XG5jb25zdCBiYXNlVGhlbWUgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICB6SW5kZXg6IDUwMCxcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNiYmJcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRvb2x0aXAtc2VjdGlvbjpub3QoOmZpcnN0LWNoaWxkKVwiOiB7XG4gICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2JiYlwiLFxuICAgIH0sXG4gICAgXCImZGFyayAuY20tdG9vbHRpcFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMzMzMzM4XCIsXG4gICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICB9LFxuICAgIFwiLmNtLXRvb2x0aXAtYXJyb3dcIjoge1xuICAgICAgICBoZWlnaHQ6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weGAsXG4gICAgICAgIHdpZHRoOiBgJHs3IC8qIEFycm93LlNpemUgKi8gKiAyfXB4YCxcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgekluZGV4OiAtMSxcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIFwiJjpiZWZvcmUsICY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgY29udGVudDogXCInJ1wiLFxuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgYm9yZGVyTGVmdDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkIHRyYW5zcGFyZW50YCxcbiAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgdHJhbnNwYXJlbnRgLFxuICAgICAgICB9LFxuICAgICAgICBcIi5jbS10b29sdGlwLWFib3ZlICZcIjoge1xuICAgICAgICAgICAgYm90dG9tOiBgLSR7NyAvKiBBcnJvdy5TaXplICovfXB4YCxcbiAgICAgICAgICAgIFwiJjpiZWZvcmVcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlclRvcDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNiYmJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiJjphZnRlclwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyVG9wOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2Y1ZjVmNWAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBcIjFweFwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiLmNtLXRvb2x0aXAtYmVsb3cgJlwiOiB7XG4gICAgICAgICAgICB0b3A6IGAtJHs3IC8qIEFycm93LlNpemUgKi99cHhgLFxuICAgICAgICAgICAgXCImOmJlZm9yZVwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2JiYmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCImOmFmdGVyXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjZjVmNWY1YCxcbiAgICAgICAgICAgICAgICB0b3A6IFwiMXB4XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXRvb2x0aXAgLmNtLXRvb2x0aXAtYXJyb3dcIjoge1xuICAgICAgICBcIiY6YmVmb3JlXCI6IHtcbiAgICAgICAgICAgIGJvcmRlclRvcENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiBcIiMzMzMzMzhcIlxuICAgICAgICB9LFxuICAgICAgICBcIiY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgYm9yZGVyVG9wQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuY29uc3Qgbm9PZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbi8qKlxuRmFjZXQgdG8gd2hpY2ggYW4gZXh0ZW5zaW9uIGNhbiBhZGQgYSB2YWx1ZSB0byBzaG93IGEgdG9vbHRpcC5cbiovXG5jb25zdCBzaG93VG9vbHRpcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGVuYWJsZXM6IFt0b29sdGlwUGx1Z2luLCBiYXNlVGhlbWVdXG59KTtcbmNvbnN0IHNob3dIb3ZlclRvb2x0aXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiBpbnB1dHMgPT4gaW5wdXRzLnJlZHVjZSgoYSwgaSkgPT4gYS5jb25jYXQoaSksIFtdKVxufSk7XG5jbGFzcyBIb3ZlclRvb2x0aXBIb3N0IHtcbiAgICAvLyBOZWVkcyB0byBiZSBzdGF0aWMgc28gdGhhdCBob3N0IHRvb2x0aXAgaW5zdGFuY2VzIGFsd2F5cyBtYXRjaFxuICAgIHN0YXRpYyBjcmVhdGUodmlldykge1xuICAgICAgICByZXR1cm4gbmV3IEhvdmVyVG9vbHRpcEhvc3Qodmlldyk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLXRvb2x0aXAtaG92ZXJcIik7XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG5ldyBUb29sdGlwVmlld01hbmFnZXIodmlldywgc2hvd0hvdmVyVG9vbHRpcCwgKHQsIHApID0+IHRoaXMuY3JlYXRlSG9zdGVkVmlldyh0LCBwKSwgdCA9PiB0LmRvbS5yZW1vdmUoKSk7XG4gICAgfVxuICAgIGNyZWF0ZUhvc3RlZFZpZXcodG9vbHRpcCwgcHJldikge1xuICAgICAgICBsZXQgaG9zdGVkVmlldyA9IHRvb2x0aXAuY3JlYXRlKHRoaXMudmlldyk7XG4gICAgICAgIGhvc3RlZFZpZXcuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS10b29sdGlwLXNlY3Rpb25cIik7XG4gICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShob3N0ZWRWaWV3LmRvbSwgcHJldiA/IHByZXYuZG9tLm5leHRTaWJsaW5nIDogdGhpcy5kb20uZmlyc3RDaGlsZCk7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQgJiYgaG9zdGVkVmlldy5tb3VudClcbiAgICAgICAgICAgIGhvc3RlZFZpZXcubW91bnQodGhpcy52aWV3KTtcbiAgICAgICAgcmV0dXJuIGhvc3RlZFZpZXc7XG4gICAgfVxuICAgIG1vdW50KHZpZXcpIHtcbiAgICAgICAgZm9yIChsZXQgaG9zdGVkVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBpZiAoaG9zdGVkVmlldy5tb3VudClcbiAgICAgICAgICAgICAgICBob3N0ZWRWaWV3Lm1vdW50KHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHBvc2l0aW9uZWQoc3BhY2UpIHtcbiAgICAgICAgZm9yIChsZXQgaG9zdGVkVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBpZiAoaG9zdGVkVmlldy5wb3NpdGlvbmVkKVxuICAgICAgICAgICAgICAgIGhvc3RlZFZpZXcucG9zaXRpb25lZChzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIudXBkYXRlKHVwZGF0ZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgKF9hID0gdC5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0KTtcbiAgICB9XG4gICAgcGFzc1Byb3AobmFtZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgbGV0IGdpdmVuID0gdmlld1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChnaXZlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2l2ZW47XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IGdpdmVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IG9mZnNldCgpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJvZmZzZXRcIik7IH1cbiAgICBnZXQgZ2V0Q29vcmRzKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcImdldENvb3Jkc1wiKTsgfVxuICAgIGdldCBvdmVybGFwKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcIm92ZXJsYXBcIik7IH1cbiAgICBnZXQgcmVzaXplKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcInJlc2l6ZVwiKTsgfVxufVxuY29uc3Qgc2hvd0hvdmVyVG9vbHRpcEhvc3QgPSAvKkBfX1BVUkVfXyovc2hvd1Rvb2x0aXAuY29tcHV0ZShbc2hvd0hvdmVyVG9vbHRpcF0sIHN0YXRlID0+IHtcbiAgICBsZXQgdG9vbHRpcHMgPSBzdGF0ZS5mYWNldChzaG93SG92ZXJUb29sdGlwKTtcbiAgICBpZiAodG9vbHRpcHMubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBwb3M6IE1hdGgubWluKC4uLnRvb2x0aXBzLm1hcCh0ID0+IHQucG9zKSksXG4gICAgICAgIGVuZDogTWF0aC5tYXgoLi4udG9vbHRpcHMubWFwKHQgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSB0LmVuZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdC5wb3M7IH0pKSxcbiAgICAgICAgY3JlYXRlOiBIb3ZlclRvb2x0aXBIb3N0LmNyZWF0ZSxcbiAgICAgICAgYWJvdmU6IHRvb2x0aXBzWzBdLmFib3ZlLFxuICAgICAgICBhcnJvdzogdG9vbHRpcHMuc29tZSh0ID0+IHQuYXJyb3cpLFxuICAgIH07XG59KTtcbmNsYXNzIEhvdmVyUGx1Z2luIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzb3VyY2UsIGZpZWxkLCBzZXRIb3ZlciwgaG92ZXJUaW1lKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgICAgIHRoaXMuc2V0SG92ZXIgPSBzZXRIb3ZlcjtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWUgPSBob3ZlclRpbWU7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucmVzdGFydFRpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0TW92ZSA9IHsgeDogMCwgeTogMCwgdGFyZ2V0OiB2aWV3LmRvbSwgdGltZTogMCB9O1xuICAgICAgICB0aGlzLmNoZWNrSG92ZXIgPSB0aGlzLmNoZWNrSG92ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy5tb3VzZWxlYXZlID0gdGhpcy5tb3VzZWxlYXZlLmJpbmQodGhpcykpO1xuICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlID0gdGhpcy5tb3VzZW1vdmUuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc3RhcnRUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucmVzdGFydFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RhcnRIb3ZlcigpLCAyMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5zdGF0ZS5maWVsZCh0aGlzLmZpZWxkKTtcbiAgICB9XG4gICAgY2hlY2tIb3ZlcigpIHtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGhvdmVyZWQgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0TW92ZS50aW1lO1xuICAgICAgICBpZiAoaG92ZXJlZCA8IHRoaXMuaG92ZXJUaW1lKVxuICAgICAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuY2hlY2tIb3ZlciwgdGhpcy5ob3ZlclRpbWUgLSBob3ZlcmVkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5zdGFydEhvdmVyKCk7XG4gICAgfVxuICAgIHN0YXJ0SG92ZXIoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc3RhcnRUaW1lb3V0KTtcbiAgICAgICAgbGV0IHsgdmlldywgbGFzdE1vdmUgfSA9IHRoaXM7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3QobGFzdE1vdmUudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFkZXNjKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgcG9zLCBzaWRlID0gMTtcbiAgICAgICAgaWYgKGRlc2MgaW5zdGFuY2VvZiBXaWRnZXRWaWV3KSB7XG4gICAgICAgICAgICBwb3MgPSBkZXNjLnBvc0F0U3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKGxhc3RNb3ZlKTtcbiAgICAgICAgICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgcG9zQ29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhwb3MpO1xuICAgICAgICAgICAgaWYgKCFwb3NDb29yZHMgfHxcbiAgICAgICAgICAgICAgICBsYXN0TW92ZS55IDwgcG9zQ29vcmRzLnRvcCB8fCBsYXN0TW92ZS55ID4gcG9zQ29vcmRzLmJvdHRvbSB8fFxuICAgICAgICAgICAgICAgIGxhc3RNb3ZlLnggPCBwb3NDb29yZHMubGVmdCAtIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoIHx8XG4gICAgICAgICAgICAgICAgbGFzdE1vdmUueCA+IHBvc0Nvb3Jkcy5yaWdodCArIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBiaWRpID0gdmlldy5iaWRpU3BhbnModmlldy5zdGF0ZS5kb2MubGluZUF0KHBvcykpLmZpbmQocyA9PiBzLmZyb20gPD0gcG9zICYmIHMudG8gPj0gcG9zKTtcbiAgICAgICAgICAgIGxldCBydGwgPSBiaWRpICYmIGJpZGkuZGlyID09IERpcmVjdGlvbi5SVEwgPyAtMSA6IDE7XG4gICAgICAgICAgICBzaWRlID0gKGxhc3RNb3ZlLnggPCBwb3NDb29yZHMubGVmdCA/IC1ydGwgOiBydGwpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVuID0gdGhpcy5zb3VyY2UodmlldywgcG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKG9wZW4gPT09IG51bGwgfHwgb3BlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3Blbi50aGVuKSB7XG4gICAgICAgICAgICBsZXQgcGVuZGluZyA9IHRoaXMucGVuZGluZyA9IHsgcG9zIH07XG4gICAgICAgICAgICBvcGVuLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nID09IHBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhKEFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiAhcmVzdWx0Lmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZSA9PiBsb2dFeGNlcHRpb24odmlldy5zdGF0ZSwgZSwgXCJob3ZlciB0b29sdGlwXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcGVuICYmICEoQXJyYXkuaXNBcnJheShvcGVuKSAmJiAhb3Blbi5sZW5ndGgpKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihBcnJheS5pc0FycmF5KG9wZW4pID8gb3BlbiA6IFtvcGVuXSkgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRvb2x0aXAoKSB7XG4gICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLnZpZXcucGx1Z2luKHRvb2x0aXBQbHVnaW4pO1xuICAgICAgICBsZXQgaW5kZXggPSBwbHVnaW4gPyBwbHVnaW4ubWFuYWdlci50b29sdGlwcy5maW5kSW5kZXgodCA9PiB0LmNyZWF0ZSA9PSBIb3ZlclRvb2x0aXBIb3N0LmNyZWF0ZSkgOiAtMTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID4gLTEgPyBwbHVnaW4ubWFuYWdlci50b29sdGlwVmlld3NbaW5kZXhdIDogbnVsbDtcbiAgICB9XG4gICAgbW91c2Vtb3ZlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMubGFzdE1vdmUgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFksIHRhcmdldDogZXZlbnQudGFyZ2V0LCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGlmICh0aGlzLmhvdmVyVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5jaGVja0hvdmVyLCB0aGlzLmhvdmVyVGltZSk7XG4gICAgICAgIGxldCB7IGFjdGl2ZSwgdG9vbHRpcCB9ID0gdGhpcztcbiAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggJiYgdG9vbHRpcCAmJiAhaXNJblRvb2x0aXAodG9vbHRpcC5kb20sIGV2ZW50KSB8fCB0aGlzLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIGxldCB7IHBvcyB9ID0gYWN0aXZlWzBdIHx8IHRoaXMucGVuZGluZywgZW5kID0gKF9iID0gKF9hID0gYWN0aXZlWzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBwb3M7XG4gICAgICAgICAgICBpZiAoKHBvcyA9PSBlbmQgPyB0aGlzLnZpZXcucG9zQXRDb29yZHModGhpcy5sYXN0TW92ZSkgIT0gcG9zXG4gICAgICAgICAgICAgICAgOiAhaXNPdmVyUmFuZ2UodGhpcy52aWV3LCBwb3MsIGVuZCwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihbXSkgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBtb3VzZWxlYXZlKGV2ZW50KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhvdmVyVGltZW91dCk7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gLTE7XG4gICAgICAgIGxldCB7IGFjdGl2ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IHRvb2x0aXAgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgaW5Ub29sdGlwID0gdG9vbHRpcCAmJiB0b29sdGlwLmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICAgIGlmICghaW5Ub29sdGlwKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoW10pIH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hUb29sdGlwTGVhdmUodG9vbHRpcC5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdhdGNoVG9vbHRpcExlYXZlKHRvb2x0aXApIHtcbiAgICAgICAgbGV0IHdhdGNoID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0b29sdGlwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHdhdGNoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZS5sZW5ndGggJiYgIXRoaXMudmlldy5kb20uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihbXSkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRvb2x0aXAuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgd2F0Y2gpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVvdXQpO1xuICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHRoaXMubW91c2VsZWF2ZSk7XG4gICAgICAgIHRoaXMudmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSk7XG4gICAgfVxufVxuY29uc3QgdG9vbHRpcE1hcmdpbiA9IDQ7XG5mdW5jdGlvbiBpc0luVG9vbHRpcCh0b29sdGlwLCBldmVudCkge1xuICAgIGxldCB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9ID0gdG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgYXJyb3c7XG4gICAgaWYgKGFycm93ID0gdG9vbHRpcC5xdWVyeVNlbGVjdG9yKFwiLmNtLXRvb2x0aXAtYXJyb3dcIikpIHtcbiAgICAgICAgbGV0IGFycm93UmVjdCA9IGFycm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0b3AgPSBNYXRoLm1pbihhcnJvd1JlY3QudG9wLCB0b3ApO1xuICAgICAgICBib3R0b20gPSBNYXRoLm1heChhcnJvd1JlY3QuYm90dG9tLCBib3R0b20pO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQuY2xpZW50WCA+PSBsZWZ0IC0gdG9vbHRpcE1hcmdpbiAmJiBldmVudC5jbGllbnRYIDw9IHJpZ2h0ICsgdG9vbHRpcE1hcmdpbiAmJlxuICAgICAgICBldmVudC5jbGllbnRZID49IHRvcCAtIHRvb2x0aXBNYXJnaW4gJiYgZXZlbnQuY2xpZW50WSA8PSBib3R0b20gKyB0b29sdGlwTWFyZ2luO1xufVxuZnVuY3Rpb24gaXNPdmVyUmFuZ2UodmlldywgZnJvbSwgdG8sIHgsIHksIG1hcmdpbikge1xuICAgIGxldCByZWN0ID0gdmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRvY0JvdHRvbSA9IHZpZXcuZG9jdW1lbnRUb3AgKyB2aWV3LmRvY3VtZW50UGFkZGluZy50b3AgKyB2aWV3LmNvbnRlbnRIZWlnaHQ7XG4gICAgaWYgKHJlY3QubGVmdCA+IHggfHwgcmVjdC5yaWdodCA8IHggfHwgcmVjdC50b3AgPiB5IHx8IE1hdGgubWluKHJlY3QuYm90dG9tLCBkb2NCb3R0b20pIDwgeSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeCwgeSB9LCBmYWxzZSk7XG4gICAgcmV0dXJuIHBvcyA+PSBmcm9tICYmIHBvcyA8PSB0bztcbn1cbi8qKlxuU2V0IHVwIGEgaG92ZXIgdG9vbHRpcCwgd2hpY2ggc2hvd3MgdXAgd2hlbiB0aGUgcG9pbnRlciBob3ZlcnNcbm92ZXIgcmFuZ2VzIG9mIHRleHQuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgbW91c2UgaG92ZXJzXG5vdmVyIHRoZSBkb2N1bWVudCB0ZXh0LiBJdCBzaG91bGQsIGlmIHRoZXJlIGlzIGEgdG9vbHRpcFxuYXNzb2NpYXRlZCB3aXRoIHBvc2l0aW9uIGBwb3NgLCByZXR1cm4gdGhlIHRvb2x0aXAgZGVzY3JpcHRpb25cbihlaXRoZXIgZGlyZWN0bHkgb3IgaW4gYSBwcm9taXNlKS4gVGhlIGBzaWRlYCBhcmd1bWVudCBpbmRpY2F0ZXNcbm9uIHdoaWNoIHNpZGUgb2YgdGhlIHBvc2l0aW9uIHRoZSBwb2ludGVyIGlzXHUyMDE0aXQgd2lsbCBiZSAtMSBpZiB0aGVcbnBvaW50ZXIgaXMgYmVmb3JlIHRoZSBwb3NpdGlvbiwgMSBpZiBhZnRlciB0aGUgcG9zaXRpb24uXG5cbk5vdGUgdGhhdCBhbGwgaG92ZXIgdG9vbHRpcHMgYXJlIGhvc3RlZCB3aXRoaW4gYSBzaW5nbGUgdG9vbHRpcFxuY29udGFpbmVyIGVsZW1lbnQuIFRoaXMgYWxsb3dzIG11bHRpcGxlIHRvb2x0aXBzIG92ZXIgdGhlIHNhbWVcbnJhbmdlIHRvIGJlIFwibWVyZ2VkXCIgdG9nZXRoZXIgd2l0aG91dCBvdmVybGFwcGluZy5cblxuVGhlIHJldHVybiB2YWx1ZSBpcyBhIHZhbGlkIFtlZGl0b3IgZXh0ZW5zaW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkV4dGVuc2lvbilcbmJ1dCBhbHNvIHByb3ZpZGVzIGFuIGBhY3RpdmVgIHByb3BlcnR5IGhvbGRpbmcgYSBzdGF0ZSBmaWVsZCB0aGF0XG5jYW4gYmUgdXNlZCB0byByZWFkIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRvb2x0aXBzIHByb2R1Y2VkIGJ5IHRoaXNcbmV4dGVuc2lvbi5cbiovXG5mdW5jdGlvbiBob3ZlclRvb2x0aXAoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgc2V0SG92ZXIgPSBTdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbiAgICBsZXQgaG92ZXJTdGF0ZSA9IFN0YXRlRmllbGQuZGVmaW5lKHtcbiAgICAgICAgY3JlYXRlKCkgeyByZXR1cm4gW107IH0sXG4gICAgICAgIHVwZGF0ZSh2YWx1ZSwgdHIpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oaWRlT25DaGFuZ2UgJiYgKHRyLmRvY0NoYW5nZWQgfHwgdHIuc2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmhpZGVPbilcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5maWx0ZXIodiA9PiAhb3B0aW9ucy5oaWRlT24odHIsIHYpKTtcbiAgICAgICAgICAgICAgICBpZiAodHIuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFwcGVkID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHRvb2x0aXAgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQb3MgPSB0ci5jaGFuZ2VzLm1hcFBvcyh0b29sdGlwLnBvcywgLTEsIE1hcE1vZGUuVHJhY2tEZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BvcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRvb2x0aXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkucG9zID0gbmV3UG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5LmVuZCAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LmVuZCA9IHRyLmNoYW5nZXMubWFwUG9zKGNvcHkuZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWQucHVzaChjb3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hcHBlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgICAgIGlmIChlZmZlY3QuaXMoc2V0SG92ZXIpKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKGNsb3NlSG92ZXJUb29sdGlwRWZmZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdmlkZTogZiA9PiBzaG93SG92ZXJUb29sdGlwLmZyb20oZilcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhY3RpdmU6IGhvdmVyU3RhdGUsXG4gICAgICAgIGV4dGVuc2lvbjogW1xuICAgICAgICAgICAgaG92ZXJTdGF0ZSxcbiAgICAgICAgICAgIFZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gbmV3IEhvdmVyUGx1Z2luKHZpZXcsIHNvdXJjZSwgaG92ZXJTdGF0ZSwgc2V0SG92ZXIsIG9wdGlvbnMuaG92ZXJUaW1lIHx8IDMwMCAvKiBIb3Zlci5UaW1lICovKSksXG4gICAgICAgICAgICBzaG93SG92ZXJUb29sdGlwSG9zdFxuICAgICAgICBdXG4gICAgfTtcbn1cbi8qKlxuR2V0IHRoZSBhY3RpdmUgdG9vbHRpcCB2aWV3IGZvciBhIGdpdmVuIHRvb2x0aXAsIGlmIGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBnZXRUb29sdGlwKHZpZXcsIHRvb2x0aXApIHtcbiAgICBsZXQgcGx1Z2luID0gdmlldy5wbHVnaW4odG9vbHRpcFBsdWdpbik7XG4gICAgaWYgKCFwbHVnaW4pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmb3VuZCA9IHBsdWdpbi5tYW5hZ2VyLnRvb2x0aXBzLmluZGV4T2YodG9vbHRpcCk7XG4gICAgcmV0dXJuIGZvdW5kIDwgMCA/IG51bGwgOiBwbHVnaW4ubWFuYWdlci50b29sdGlwVmlld3NbZm91bmRdO1xufVxuLyoqXG5SZXR1cm5zIHRydWUgaWYgYW55IGhvdmVyIHRvb2x0aXBzIGFyZSBjdXJyZW50bHkgYWN0aXZlLlxuKi9cbmZ1bmN0aW9uIGhhc0hvdmVyVG9vbHRpcHMoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuZmFjZXQoc2hvd0hvdmVyVG9vbHRpcCkuc29tZSh4ID0+IHgpO1xufVxuY29uc3QgY2xvc2VIb3ZlclRvb2x0aXBFZmZlY3QgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcblRyYW5zYWN0aW9uIGVmZmVjdCB0aGF0IGNsb3NlcyBhbGwgaG92ZXIgdG9vbHRpcHMuXG4qL1xuY29uc3QgY2xvc2VIb3ZlclRvb2x0aXBzID0gLypAX19QVVJFX18qL2Nsb3NlSG92ZXJUb29sdGlwRWZmZWN0Lm9mKG51bGwpO1xuLyoqXG5UZWxsIHRoZSB0b29sdGlwIGV4dGVuc2lvbiB0byByZWNvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBhY3RpdmVcbnRvb2x0aXBzLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBzb21ldGhpbmcgaGFwcGVucyAoc3VjaCBhcyBhXG5yZS1wb3NpdGlvbmluZyBvciBDU1MgY2hhbmdlIGFmZmVjdGluZyB0aGUgZWRpdG9yKSB0aGF0IGNvdWxkXG5pbnZhbGlkYXRlIHRoZSBleGlzdGluZyB0b29sdGlwIHBvc2l0aW9ucy5cbiovXG5mdW5jdGlvbiByZXBvc2l0aW9uVG9vbHRpcHModmlldykge1xuICAgIGxldCBwbHVnaW4gPSB2aWV3LnBsdWdpbih0b29sdGlwUGx1Z2luKTtcbiAgICBpZiAocGx1Z2luKVxuICAgICAgICBwbHVnaW4ubWF5YmVNZWFzdXJlKCk7XG59XG5cbmNvbnN0IHBhbmVsQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIGxldCB0b3BDb250YWluZXIsIGJvdHRvbUNvbnRhaW5lcjtcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjb25maWdzKSB7XG4gICAgICAgICAgICB0b3BDb250YWluZXIgPSB0b3BDb250YWluZXIgfHwgYy50b3BDb250YWluZXI7XG4gICAgICAgICAgICBib3R0b21Db250YWluZXIgPSBib3R0b21Db250YWluZXIgfHwgYy5ib3R0b21Db250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdG9wQ29udGFpbmVyLCBib3R0b21Db250YWluZXIgfTtcbiAgICB9XG59KTtcbi8qKlxuQ29uZmlndXJlcyB0aGUgcGFuZWwtbWFuYWdpbmcgZXh0ZW5zaW9uLlxuKi9cbmZ1bmN0aW9uIHBhbmVscyhjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnID8gW3BhbmVsQ29uZmlnLm9mKGNvbmZpZyldIDogW107XG59XG4vKipcbkdldCB0aGUgYWN0aXZlIHBhbmVsIGNyZWF0ZWQgYnkgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLCBpZiBhbnkuXG5UaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3UgbmVlZCBhY2Nlc3MgdG8geW91ciBwYW5lbHMnIERPTVxuc3RydWN0dXJlLlxuKi9cbmZ1bmN0aW9uIGdldFBhbmVsKHZpZXcsIHBhbmVsKSB7XG4gICAgbGV0IHBsdWdpbiA9IHZpZXcucGx1Z2luKHBhbmVsUGx1Z2luKTtcbiAgICBsZXQgaW5kZXggPSBwbHVnaW4gPyBwbHVnaW4uc3BlY3MuaW5kZXhPZihwYW5lbCkgOiAtMTtcbiAgICByZXR1cm4gaW5kZXggPiAtMSA/IHBsdWdpbi5wYW5lbHNbaW5kZXhdIDogbnVsbDtcbn1cbmNvbnN0IHBhbmVsUGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSB2aWV3LnN0YXRlLmZhY2V0KHNob3dQYW5lbCk7XG4gICAgICAgIHRoaXMuc3BlY3MgPSB0aGlzLmlucHV0LmZpbHRlcihzID0+IHMpO1xuICAgICAgICB0aGlzLnBhbmVscyA9IHRoaXMuc3BlY3MubWFwKHNwZWMgPT4gc3BlYyh2aWV3KSk7XG4gICAgICAgIGxldCBjb25mID0gdmlldy5zdGF0ZS5mYWNldChwYW5lbENvbmZpZyk7XG4gICAgICAgIHRoaXMudG9wID0gbmV3IFBhbmVsR3JvdXAodmlldywgdHJ1ZSwgY29uZi50b3BDb250YWluZXIpO1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG5ldyBQYW5lbEdyb3VwKHZpZXcsIGZhbHNlLCBjb25mLmJvdHRvbUNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMudG9wLnN5bmModGhpcy5wYW5lbHMuZmlsdGVyKHAgPT4gcC50b3ApKTtcbiAgICAgICAgdGhpcy5ib3R0b20uc3luYyh0aGlzLnBhbmVscy5maWx0ZXIocCA9PiAhcC50b3ApKTtcbiAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhbmVscykge1xuICAgICAgICAgICAgcC5kb20uY2xhc3NMaXN0LmFkZChcImNtLXBhbmVsXCIpO1xuICAgICAgICAgICAgaWYgKHAubW91bnQpXG4gICAgICAgICAgICAgICAgcC5tb3VudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGNvbmYgPSB1cGRhdGUuc3RhdGUuZmFjZXQocGFuZWxDb25maWcpO1xuICAgICAgICBpZiAodGhpcy50b3AuY29udGFpbmVyICE9IGNvbmYudG9wQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnRvcC5zeW5jKFtdKTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gbmV3IFBhbmVsR3JvdXAodXBkYXRlLnZpZXcsIHRydWUsIGNvbmYudG9wQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ib3R0b20uY29udGFpbmVyICE9IGNvbmYuYm90dG9tQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbS5zeW5jKFtdKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gbmV3IFBhbmVsR3JvdXAodXBkYXRlLnZpZXcsIGZhbHNlLCBjb25mLmJvdHRvbUNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b3Auc3luY0NsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5ib3R0b20uc3luY0NsYXNzZXMoKTtcbiAgICAgICAgbGV0IGlucHV0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KHNob3dQYW5lbCk7XG4gICAgICAgIGlmIChpbnB1dCAhPSB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICBsZXQgc3BlY3MgPSBpbnB1dC5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgICAgIGxldCBwYW5lbHMgPSBbXSwgdG9wID0gW10sIGJvdHRvbSA9IFtdLCBtb3VudCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICAgICAgICAgIGxldCBrbm93biA9IHRoaXMuc3BlY3MuaW5kZXhPZihzcGVjKSwgcGFuZWw7XG4gICAgICAgICAgICAgICAgaWYgKGtub3duIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IHNwZWModXBkYXRlLnZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBtb3VudC5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsID0gdGhpcy5wYW5lbHNba25vd25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuZWwudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhbmVscy5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgICAgICAocGFuZWwudG9wID8gdG9wIDogYm90dG9tKS5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3BlY3MgPSBzcGVjcztcbiAgICAgICAgICAgIHRoaXMucGFuZWxzID0gcGFuZWxzO1xuICAgICAgICAgICAgdGhpcy50b3Auc3luYyh0b3ApO1xuICAgICAgICAgICAgdGhpcy5ib3R0b20uc3luYyhib3R0b20pO1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBtb3VudCkge1xuICAgICAgICAgICAgICAgIHAuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1wYW5lbFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocC5tb3VudClcbiAgICAgICAgICAgICAgICAgICAgcC5tb3VudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhbmVscylcbiAgICAgICAgICAgICAgICBpZiAocC51cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHAudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50b3Auc3luYyhbXSk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmMoW10pO1xuICAgIH1cbn0sIHtcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4gRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zLm9mKHZpZXcgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICByZXR1cm4gdmFsdWUgJiYgeyB0b3A6IHZhbHVlLnRvcC5zY3JvbGxNYXJnaW4oKSwgYm90dG9tOiB2YWx1ZS5ib3R0b20uc2Nyb2xsTWFyZ2luKCkgfTtcbiAgICB9KVxufSk7XG5jbGFzcyBQYW5lbEdyb3VwIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCB0b3AsIGNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIHRoaXMuZG9tID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSBcIlwiO1xuICAgICAgICB0aGlzLnBhbmVscyA9IFtdO1xuICAgICAgICB0aGlzLnN5bmNDbGFzc2VzKCk7XG4gICAgfVxuICAgIHN5bmMocGFuZWxzKSB7XG4gICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpXG4gICAgICAgICAgICBpZiAocC5kZXN0cm95ICYmIHBhbmVscy5pbmRleE9mKHApIDwgMClcbiAgICAgICAgICAgICAgICBwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSBwYW5lbHM7XG4gICAgICAgIHRoaXMuc3luY0RPTSgpO1xuICAgIH1cbiAgICBzeW5jRE9NKCkge1xuICAgICAgICBpZiAodGhpcy5wYW5lbHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IHRoaXMudG9wID8gXCJjbS1wYW5lbHMgY20tcGFuZWxzLXRvcFwiIDogXCJjbS1wYW5lbHMgY20tcGFuZWxzLWJvdHRvbVwiO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGVbdGhpcy50b3AgPyBcInRvcFwiIDogXCJib3R0b21cIl0gPSBcIjBcIjtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmNvbnRhaW5lciB8fCB0aGlzLnZpZXcuZG9tO1xuICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLmRvbSwgdGhpcy50b3AgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJET00gPSB0aGlzLmRvbS5maXJzdENoaWxkO1xuICAgICAgICBmb3IgKGxldCBwYW5lbCBvZiB0aGlzLnBhbmVscykge1xuICAgICAgICAgICAgaWYgKHBhbmVsLmRvbS5wYXJlbnROb2RlID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckRPTSAhPSBwYW5lbC5kb20pXG4gICAgICAgICAgICAgICAgICAgIGN1ckRPTSA9IHJtKGN1ckRPTSk7XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gY3VyRE9NLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKHBhbmVsLmRvbSwgY3VyRE9NKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY3VyRE9NKVxuICAgICAgICAgICAgY3VyRE9NID0gcm0oY3VyRE9NKTtcbiAgICB9XG4gICAgc2Nyb2xsTWFyZ2luKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZG9tIHx8IHRoaXMuY29udGFpbmVyID8gMFxuICAgICAgICAgICAgOiBNYXRoLm1heCgwLCB0aGlzLnRvcCA/XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIC0gTWF0aC5tYXgoMCwgdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApIDpcbiAgICAgICAgICAgICAgICBNYXRoLm1pbihpbm5lckhlaWdodCwgdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20pIC0gdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKTtcbiAgICB9XG4gICAgc3luY0NsYXNzZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgdGhpcy5jbGFzc2VzID09IHRoaXMudmlldy50aGVtZUNsYXNzZXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAobGV0IGNscyBvZiB0aGlzLmNsYXNzZXMuc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKGNscyk7XG4gICAgICAgIGZvciAobGV0IGNscyBvZiAodGhpcy5jbGFzc2VzID0gdGhpcy52aWV3LnRoZW1lQ2xhc3Nlcykuc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNscyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcm0obm9kZSkge1xuICAgIGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICBub2RlLnJlbW92ZSgpO1xuICAgIHJldHVybiBuZXh0O1xufVxuLyoqXG5PcGVuaW5nIGEgcGFuZWwgaXMgZG9uZSBieSBwcm92aWRpbmcgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3JcbnRoZSBwYW5lbCB0aHJvdWdoIHRoaXMgZmFjZXQuIChUaGUgcGFuZWwgaXMgY2xvc2VkIGFnYWluIHdoZW4gaXRzXG5jb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgcHJvdmlkZWQuKSBWYWx1ZXMgb2YgYG51bGxgIGFyZSBpZ25vcmVkLlxuKi9cbmNvbnN0IHNob3dQYW5lbCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGVuYWJsZXM6IHBhbmVsUGx1Z2luXG59KTtcblxuLyoqXG5BIGd1dHRlciBtYXJrZXIgcmVwcmVzZW50cyBhIGJpdCBvZiBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBhIGxpbmVcbmluIGEgc3BlY2lmaWMgZ3V0dGVyLiBZb3VyIG93biBjdXN0b20gbWFya2VycyBoYXZlIHRvIGV4dGVuZCB0aGlzXG5jbGFzcy5cbiovXG5jbGFzcyBHdXR0ZXJNYXJrZXIgZXh0ZW5kcyBSYW5nZVZhbHVlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgdGhpcy5jb25zdHJ1Y3RvciA9PSBvdGhlci5jb25zdHJ1Y3RvciAmJiB0aGlzLmVxKG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIG1hcmtlciB0byBhbm90aGVyIG1hcmtlciBvZiB0aGUgc2FtZSB0eXBlLlxuICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQ2FsbGVkIGlmIHRoZSBtYXJrZXIgaGFzIGEgYHRvRE9NYCBtZXRob2QgYW5kIGl0cyByZXByZXNlbnRhdGlvblxuICAgIHdhcyByZW1vdmVkIGZyb20gYSBndXR0ZXIuXG4gICAgKi9cbiAgICBkZXN0cm95KGRvbSkgeyB9XG59XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLmVsZW1lbnRDbGFzcyA9IFwiXCI7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnRvRE9NID0gdW5kZWZpbmVkO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0JlZm9yZTtcbkd1dHRlck1hcmtlci5wcm90b3R5cGUuc3RhcnRTaWRlID0gR3V0dGVyTWFya2VyLnByb3RvdHlwZS5lbmRTaWRlID0gLTE7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbi8qKlxuRmFjZXQgdXNlZCB0byBhZGQgYSBjbGFzcyB0byBhbGwgZ3V0dGVyIGVsZW1lbnRzIGZvciBhIGdpdmVuIGxpbmUuXG5NYXJrZXJzIGdpdmVuIHRvIHRoaXMgZmFjZXQgc2hvdWxkIF9vbmx5XyBkZWZpbmUgYW5cbltgZWxlbWVudGNsYXNzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3Lkd1dHRlck1hcmtlci5lbGVtZW50Q2xhc3MpLCBub3QgYVxuW2B0b0RPTWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5HdXR0ZXJNYXJrZXIudG9ET00pIChvciB0aGUgbWFya2VyIHdpbGwgYXBwZWFyXG5pbiBhbGwgZ3V0dGVycyBmb3IgdGhlIGxpbmUpLlxuKi9cbmNvbnN0IGd1dHRlckxpbmVDbGFzcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuRmFjZXQgdXNlZCB0byBhZGQgYSBjbGFzcyB0byBhbGwgZ3V0dGVyIGVsZW1lbnRzIG5leHQgdG8gYSB3aWRnZXQuXG5TaG91bGQgbm90IHByb3ZpZGUgd2lkZ2V0cyB3aXRoIGEgYHRvRE9NYCBtZXRob2QuXG4qL1xuY29uc3QgZ3V0dGVyV2lkZ2V0Q2xhc3MgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgICBjbGFzczogXCJcIixcbiAgICByZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcbiAgICBlbGVtZW50U3R5bGU6IFwiXCIsXG4gICAgbWFya2VyczogKCkgPT4gUmFuZ2VTZXQuZW1wdHksXG4gICAgbGluZU1hcmtlcjogKCkgPT4gbnVsbCxcbiAgICB3aWRnZXRNYXJrZXI6ICgpID0+IG51bGwsXG4gICAgbGluZU1hcmtlckNoYW5nZTogbnVsbCxcbiAgICBpbml0aWFsU3BhY2VyOiBudWxsLFxuICAgIHVwZGF0ZVNwYWNlcjogbnVsbCxcbiAgICBkb21FdmVudEhhbmRsZXJzOiB7fVxufTtcbmNvbnN0IGFjdGl2ZUd1dHRlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkRlZmluZSBhbiBlZGl0b3IgZ3V0dGVyLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGd1dHRlcnMgYXBwZWFyIGlzXG5kZXRlcm1pbmVkIGJ5IHRoZWlyIGV4dGVuc2lvbiBwcmlvcml0eS5cbiovXG5mdW5jdGlvbiBndXR0ZXIoY29uZmlnKSB7XG4gICAgcmV0dXJuIFtndXR0ZXJzKCksIGFjdGl2ZUd1dHRlcnMub2YoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyksIGNvbmZpZykpXTtcbn1cbmNvbnN0IHVuZml4R3V0dGVycyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpXG59KTtcbi8qKlxuVGhlIGd1dHRlci1kcmF3aW5nIHBsdWdpbiBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiB5b3UgYWRkIGFcbmd1dHRlciwgYnV0IHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZXhwbGljaXRseSBjb25maWd1cmUgaXQuXG5cblVubGVzcyBgZml4ZWRgIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGBmYWxzZWAsIHRoZSBndXR0ZXJzIGFyZVxuZml4ZWQsIG1lYW5pbmcgdGhleSBkb24ndCBzY3JvbGwgYWxvbmcgd2l0aCB0aGUgY29udGVudFxuaG9yaXpvbnRhbGx5IChleGNlcHQgb24gSW50ZXJuZXQgRXhwbG9yZXIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydFxuQ1NTIFtgcG9zaXRpb246XG5zdGlja3lgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcG9zaXRpb24jc3RpY2t5KSkuXG4qL1xuZnVuY3Rpb24gZ3V0dGVycyhjb25maWcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW1xuICAgICAgICBndXR0ZXJWaWV3LFxuICAgIF07XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuZml4ZWQgPT09IGZhbHNlKVxuICAgICAgICByZXN1bHQucHVzaCh1bmZpeEd1dHRlcnMub2YodHJ1ZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBndXR0ZXJWaWV3ID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucHJldlZpZXdwb3J0ID0gdmlldy52aWV3cG9ydDtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlcnNcIjtcbiAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSAodGhpcy52aWV3LmNvbnRlbnRIZWlnaHQgLyB0aGlzLnZpZXcuc2NhbGVZKSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5ndXR0ZXJzID0gdmlldy5zdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKS5tYXAoY29uZiA9PiBuZXcgU2luZ2xlR3V0dGVyVmlldyh2aWV3LCBjb25mKSk7XG4gICAgICAgIGZvciAobGV0IGd1dHRlciBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChndXR0ZXIuZG9tKTtcbiAgICAgICAgdGhpcy5maXhlZCA9ICF2aWV3LnN0YXRlLmZhY2V0KHVuZml4R3V0dGVycyk7XG4gICAgICAgIGlmICh0aGlzLmZpeGVkKSB7XG4gICAgICAgICAgICAvLyBGSVhNRSBJRTExIGZhbGxiYWNrLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgcG9zaXRpb246IHN0aWNreSxcbiAgICAgICAgICAgIC8vIGJ5IHVzaW5nIHBvc2l0aW9uOiByZWxhdGl2ZSArIGV2ZW50IGhhbmRsZXJzIHRoYXQgcmVhbGlnbiB0aGVcbiAgICAgICAgICAgIC8vIGd1dHRlciAob3IganVzdCBmb3JjZSBmaXhlZD1mYWxzZSBvbiBJRTExPylcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnBvc2l0aW9uID0gXCJzdGlja3lcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNHdXR0ZXJzKGZhbHNlKTtcbiAgICAgICAgdmlldy5zY3JvbGxET00uaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCB2aWV3LmNvbnRlbnRET00pO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUd1dHRlcnModXBkYXRlKSkge1xuICAgICAgICAgICAgLy8gRGV0YWNoIGR1cmluZyBzeW5jIHdoZW4gdGhlIHZpZXdwb3J0IGNoYW5nZWQgc2lnbmlmaWNhbnRseVxuICAgICAgICAgICAgLy8gKHN1Y2ggYXMgZHVyaW5nIHNjcm9sbGluZyksIHNpbmNlIGZvciBsYXJnZSB1cGRhdGVzIHRoYXQgaXNcbiAgICAgICAgICAgIC8vIGZhc3Rlci5cbiAgICAgICAgICAgIGxldCB2cEEgPSB0aGlzLnByZXZWaWV3cG9ydCwgdnBCID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG4gICAgICAgICAgICBsZXQgdnBPdmVybGFwID0gTWF0aC5taW4odnBBLnRvLCB2cEIudG8pIC0gTWF0aC5tYXgodnBBLmZyb20sIHZwQi5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0d1dHRlcnModnBPdmVybGFwIDwgKHZwQi50byAtIHZwQi5mcm9tKSAqIDAuOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLm1pbkhlaWdodCA9ICh0aGlzLnZpZXcuY29udGVudEhlaWdodCAvIHRoaXMudmlldy5zY2FsZVkpICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnZpZXcuc3RhdGUuZmFjZXQodW5maXhHdXR0ZXJzKSAhPSAhdGhpcy5maXhlZCkge1xuICAgICAgICAgICAgdGhpcy5maXhlZCA9ICF0aGlzLmZpeGVkO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLmZpeGVkID8gXCJzdGlja3lcIiA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2Vmlld3BvcnQgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcbiAgICB9XG4gICAgc3luY0d1dHRlcnMoZGV0YWNoKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMuZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICBpZiAoZGV0YWNoKVxuICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgICAgIGxldCBsaW5lQ2xhc3NlcyA9IFJhbmdlU2V0Lml0ZXIodGhpcy52aWV3LnN0YXRlLmZhY2V0KGd1dHRlckxpbmVDbGFzcyksIHRoaXMudmlldy52aWV3cG9ydC5mcm9tKTtcbiAgICAgICAgbGV0IGNsYXNzU2V0ID0gW107XG4gICAgICAgIGxldCBjb250ZXh0cyA9IHRoaXMuZ3V0dGVycy5tYXAoZ3V0dGVyID0+IG5ldyBVcGRhdGVDb250ZXh0KGd1dHRlciwgdGhpcy52aWV3LnZpZXdwb3J0LCAtdGhpcy52aWV3LmRvY3VtZW50UGFkZGluZy50b3ApKTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0aGlzLnZpZXcudmlld3BvcnRMaW5lQmxvY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2xhc3NTZXQubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGNsYXNzU2V0ID0gW107XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsaW5lLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiIG9mIGxpbmUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYi50eXBlID09IEJsb2NrVHlwZS5UZXh0ICYmIGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlQ3Vyc29yKGxpbmVDbGFzc2VzLCBjbGFzc1NldCwgYi5mcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LmxpbmUodGhpcy52aWV3LCBiLCBjbGFzc1NldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC53aWRnZXQodGhpcy52aWV3LCBiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCkge1xuICAgICAgICAgICAgICAgIGFkdmFuY2VDdXJzb3IobGluZUNsYXNzZXMsIGNsYXNzU2V0LCBsaW5lLmZyb20pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgICAgICAgICBjeC5saW5lKHRoaXMudmlldywgbGluZSwgY2xhc3NTZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGluZS53aWRnZXQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgY3gud2lkZ2V0KHRoaXMudmlldywgbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICBjeC5maW5pc2goKTtcbiAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCBhZnRlcik7XG4gICAgfVxuICAgIHVwZGF0ZUd1dHRlcnModXBkYXRlKSB7XG4gICAgICAgIGxldCBwcmV2ID0gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoYWN0aXZlR3V0dGVycyksIGN1ciA9IHVwZGF0ZS5zdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKTtcbiAgICAgICAgbGV0IGNoYW5nZSA9IHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5oZWlnaHRDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHxcbiAgICAgICAgICAgICFSYW5nZVNldC5lcSh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLCB1cGRhdGUuc3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdXBkYXRlLnZpZXcudmlld3BvcnQuZnJvbSwgdXBkYXRlLnZpZXcudmlld3BvcnQudG8pO1xuICAgICAgICBpZiAocHJldiA9PSBjdXIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGd1dHRlciBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICAgICAgaWYgKGd1dHRlci51cGRhdGUodXBkYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZ3V0dGVycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgY29uZiBvZiBjdXIpIHtcbiAgICAgICAgICAgICAgICBsZXQga25vd24gPSBwcmV2LmluZGV4T2YoY29uZik7XG4gICAgICAgICAgICAgICAgaWYgKGtub3duIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBndXR0ZXJzLnB1c2gobmV3IFNpbmdsZUd1dHRlclZpZXcodGhpcy52aWV3LCBjb25mKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmd1dHRlcnNba25vd25dLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBndXR0ZXJzLnB1c2godGhpcy5ndXR0ZXJzW2tub3duXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZyBvZiB0aGlzLmd1dHRlcnMpIHtcbiAgICAgICAgICAgICAgICBnLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3V0dGVycy5pbmRleE9mKGcpIDwgMClcbiAgICAgICAgICAgICAgICAgICAgZy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBnIG9mIGd1dHRlcnMpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQoZy5kb20pO1xuICAgICAgICAgICAgdGhpcy5ndXR0ZXJzID0gZ3V0dGVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCB2aWV3IG9mIHRoaXMuZ3V0dGVycylcbiAgICAgICAgICAgIHZpZXcuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IEVkaXRvclZpZXcuc2Nyb2xsTWFyZ2lucy5vZih2aWV3ID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdmlldy5wbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5ndXR0ZXJzLmxlbmd0aCA9PSAwIHx8ICF2YWx1ZS5maXhlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFJcbiAgICAgICAgICAgID8geyBsZWZ0OiB2YWx1ZS5kb20ub2Zmc2V0V2lkdGggKiB2aWV3LnNjYWxlWCB9XG4gICAgICAgICAgICA6IHsgcmlnaHQ6IHZhbHVlLmRvbS5vZmZzZXRXaWR0aCAqIHZpZXcuc2NhbGVYIH07XG4gICAgfSlcbn0pO1xuZnVuY3Rpb24gYXNBcnJheSh2YWwpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXSk7IH1cbmZ1bmN0aW9uIGFkdmFuY2VDdXJzb3IoY3Vyc29yLCBjb2xsZWN0LCBwb3MpIHtcbiAgICB3aGlsZSAoY3Vyc29yLnZhbHVlICYmIGN1cnNvci5mcm9tIDw9IHBvcykge1xuICAgICAgICBpZiAoY3Vyc29yLmZyb20gPT0gcG9zKVxuICAgICAgICAgICAgY29sbGVjdC5wdXNoKGN1cnNvci52YWx1ZSk7XG4gICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgfVxufVxuY2xhc3MgVXBkYXRlQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoZ3V0dGVyLCB2aWV3cG9ydCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuZ3V0dGVyID0gZ3V0dGVyO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5pID0gMDtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBSYW5nZVNldC5pdGVyKGd1dHRlci5tYXJrZXJzLCB2aWV3cG9ydC5mcm9tKTtcbiAgICB9XG4gICAgYWRkRWxlbWVudCh2aWV3LCBibG9jaywgbWFya2Vycykge1xuICAgICAgICBsZXQgeyBndXR0ZXIgfSA9IHRoaXMsIGFib3ZlID0gKGJsb2NrLnRvcCAtIHRoaXMuaGVpZ2h0KSAvIHZpZXcuc2NhbGVZLCBoZWlnaHQgPSBibG9jay5oZWlnaHQgLyB2aWV3LnNjYWxlWTtcbiAgICAgICAgaWYgKHRoaXMuaSA9PSBndXR0ZXIuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV3RWx0ID0gbmV3IEd1dHRlckVsZW1lbnQodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgICAgICAgICBndXR0ZXIuZWxlbWVudHMucHVzaChuZXdFbHQpO1xuICAgICAgICAgICAgZ3V0dGVyLmRvbS5hcHBlbmRDaGlsZChuZXdFbHQuZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGd1dHRlci5lbGVtZW50c1t0aGlzLmldLnVwZGF0ZSh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhlaWdodCA9IGJsb2NrLmJvdHRvbTtcbiAgICAgICAgdGhpcy5pKys7XG4gICAgfVxuICAgIGxpbmUodmlldywgbGluZSwgZXh0cmFNYXJrZXJzKSB7XG4gICAgICAgIGxldCBsb2NhbE1hcmtlcnMgPSBbXTtcbiAgICAgICAgYWR2YW5jZUN1cnNvcih0aGlzLmN1cnNvciwgbG9jYWxNYXJrZXJzLCBsaW5lLmZyb20pO1xuICAgICAgICBpZiAoZXh0cmFNYXJrZXJzLmxlbmd0aClcbiAgICAgICAgICAgIGxvY2FsTWFya2VycyA9IGxvY2FsTWFya2Vycy5jb25jYXQoZXh0cmFNYXJrZXJzKTtcbiAgICAgICAgbGV0IGZvckxpbmUgPSB0aGlzLmd1dHRlci5jb25maWcubGluZU1hcmtlcih2aWV3LCBsaW5lLCBsb2NhbE1hcmtlcnMpO1xuICAgICAgICBpZiAoZm9yTGluZSlcbiAgICAgICAgICAgIGxvY2FsTWFya2Vycy51bnNoaWZ0KGZvckxpbmUpO1xuICAgICAgICBsZXQgZ3V0dGVyID0gdGhpcy5ndXR0ZXI7XG4gICAgICAgIGlmIChsb2NhbE1hcmtlcnMubGVuZ3RoID09IDAgJiYgIWd1dHRlci5jb25maWcucmVuZGVyRW1wdHlFbGVtZW50cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50KHZpZXcsIGxpbmUsIGxvY2FsTWFya2Vycyk7XG4gICAgfVxuICAgIHdpZGdldCh2aWV3LCBibG9jaykge1xuICAgICAgICBsZXQgbWFya2VyID0gdGhpcy5ndXR0ZXIuY29uZmlnLndpZGdldE1hcmtlcih2aWV3LCBibG9jay53aWRnZXQsIGJsb2NrKSwgbWFya2VycyA9IG1hcmtlciA/IFttYXJrZXJdIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgY2xzIG9mIHZpZXcuc3RhdGUuZmFjZXQoZ3V0dGVyV2lkZ2V0Q2xhc3MpKSB7XG4gICAgICAgICAgICBsZXQgbWFya2VyID0gY2xzKHZpZXcsIGJsb2NrLndpZGdldCwgYmxvY2spO1xuICAgICAgICAgICAgaWYgKG1hcmtlcilcbiAgICAgICAgICAgICAgICAobWFya2VycyB8fCAobWFya2VycyA9IFtdKSkucHVzaChtYXJrZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrZXJzKVxuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KHZpZXcsIGJsb2NrLCBtYXJrZXJzKTtcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICBsZXQgZ3V0dGVyID0gdGhpcy5ndXR0ZXI7XG4gICAgICAgIHdoaWxlIChndXR0ZXIuZWxlbWVudHMubGVuZ3RoID4gdGhpcy5pKSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGd1dHRlci5lbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgIGd1dHRlci5kb20ucmVtb3ZlQ2hpbGQobGFzdC5kb20pO1xuICAgICAgICAgICAgbGFzdC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTaW5nbGVHdXR0ZXJWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5zcGFjZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tZ3V0dGVyXCIgKyAodGhpcy5jb25maWcuY2xhc3MgPyBcIiBcIiArIHRoaXMuY29uZmlnLmNsYXNzIDogXCJcIik7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gY29uZmlnLmRvbUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIocHJvcCwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCwgeTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IHRoaXMuZG9tICYmIHRoaXMuZG9tLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldC5wYXJlbnROb2RlICE9IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB5ID0gKHJlY3QudG9wICsgcmVjdC5ib3R0b20pIC8gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBldmVudC5jbGllbnRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXRIZWlnaHQoeSAtIHZpZXcuZG9jdW1lbnRUb3ApO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZG9tRXZlbnRIYW5kbGVyc1twcm9wXSh2aWV3LCBsaW5lLCBldmVudCkpXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtlcnMgPSBhc0FycmF5KGNvbmZpZy5tYXJrZXJzKHZpZXcpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbml0aWFsU3BhY2VyKSB7XG4gICAgICAgICAgICB0aGlzLnNwYWNlciA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIDAsIDAsIFtjb25maWcuaW5pdGlhbFNwYWNlcih2aWV3KV0pO1xuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5zcGFjZXIuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2VyLmRvbS5zdHlsZS5jc3NUZXh0ICs9IFwidmlzaWJpbGl0eTogaGlkZGVuOyBwb2ludGVyLWV2ZW50czogbm9uZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXZNYXJrZXJzID0gdGhpcy5tYXJrZXJzO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBhc0FycmF5KHRoaXMuY29uZmlnLm1hcmtlcnModXBkYXRlLnZpZXcpKTtcbiAgICAgICAgaWYgKHRoaXMuc3BhY2VyICYmIHRoaXMuY29uZmlnLnVwZGF0ZVNwYWNlcikge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIodGhpcy5zcGFjZXIubWFya2Vyc1swXSwgdXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVkICE9IHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0pXG4gICAgICAgICAgICAgICAgdGhpcy5zcGFjZXIudXBkYXRlKHVwZGF0ZS52aWV3LCAwLCAwLCBbdXBkYXRlZF0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2cCA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuICAgICAgICByZXR1cm4gIVJhbmdlU2V0LmVxKHRoaXMubWFya2VycywgcHJldk1hcmtlcnMsIHZwLmZyb20sIHZwLnRvKSB8fFxuICAgICAgICAgICAgKHRoaXMuY29uZmlnLmxpbmVNYXJrZXJDaGFuZ2UgPyB0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlKHVwZGF0ZSkgOiBmYWxzZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IGVsdCBvZiB0aGlzLmVsZW1lbnRzKVxuICAgICAgICAgICAgZWx0LmRlc3Ryb3koKTtcbiAgICB9XG59XG5jbGFzcyBHdXR0ZXJFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gLTE7XG4gICAgICAgIHRoaXMuYWJvdmUgPSAwO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlckVsZW1lbnRcIjtcbiAgICAgICAgdGhpcy51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgfVxuICAgIHVwZGF0ZSh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodCAhPSBoZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFib3ZlICE9IGFib3ZlKVxuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUubWFyZ2luVG9wID0gKHRoaXMuYWJvdmUgPSBhYm92ZSkgPyBhYm92ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgICAgIGlmICghc2FtZU1hcmtlcnModGhpcy5tYXJrZXJzLCBtYXJrZXJzKSlcbiAgICAgICAgICAgIHRoaXMuc2V0TWFya2Vycyh2aWV3LCBtYXJrZXJzKTtcbiAgICB9XG4gICAgc2V0TWFya2Vycyh2aWV3LCBtYXJrZXJzKSB7XG4gICAgICAgIGxldCBjbHMgPSBcImNtLWd1dHRlckVsZW1lbnRcIiwgZG9tUG9zID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcbiAgICAgICAgZm9yIChsZXQgaU5ldyA9IDAsIGlPbGQgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBza2lwVG8gPSBpT2xkLCBtYXJrZXIgPSBpTmV3IDwgbWFya2Vycy5sZW5ndGggPyBtYXJrZXJzW2lOZXcrK10gOiBudWxsLCBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGMgPSBtYXJrZXIuZWxlbWVudENsYXNzO1xuICAgICAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCIgKyBjO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpT2xkOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJzW2ldLmNvbXBhcmUobWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFRvID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNraXBUbyA9IHRoaXMubWFya2Vycy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoaU9sZCA8IHNraXBUbykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5tYXJrZXJzW2lPbGQrK107XG4gICAgICAgICAgICAgICAgaWYgKG5leHQudG9ET00pIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5kZXN0cm95KGRvbVBvcyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBkb21Qb3MgPSBhZnRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1hcmtlcilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChtYXJrZXIudG9ET00pIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZClcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zID0gZG9tUG9zLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKG1hcmtlci50b0RPTSh2aWV3KSwgZG9tUG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGVkKVxuICAgICAgICAgICAgICAgIGlPbGQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBjbHM7XG4gICAgICAgIHRoaXMubWFya2VycyA9IG1hcmtlcnM7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2V0TWFya2VycyhudWxsLCBbXSk7IC8vIEZpcnN0IGFyZ3VtZW50IG5vdCB1c2VkIHVubGVzcyBjcmVhdGluZyBtYXJrZXJzXG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZU1hcmtlcnMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFhW2ldLmNvbXBhcmUoYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbkZhY2V0IHVzZWQgdG8gcHJvdmlkZSBtYXJrZXJzIHRvIHRoZSBsaW5lIG51bWJlciBndXR0ZXIuXG4qL1xuY29uc3QgbGluZU51bWJlck1hcmtlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkZhY2V0IHVzZWQgdG8gY3JlYXRlIG1hcmtlcnMgaW4gdGhlIGxpbmUgbnVtYmVyIGd1dHRlciBuZXh0IHRvIHdpZGdldHMuXG4qL1xuY29uc3QgbGluZU51bWJlcldpZGdldE1hcmtlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGxpbmVOdW1iZXJDb25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyh2YWx1ZXMsIHsgZm9ybWF0TnVtYmVyOiBTdHJpbmcsIGRvbUV2ZW50SGFuZGxlcnM6IHt9IH0sIHtcbiAgICAgICAgICAgIGRvbUV2ZW50SGFuZGxlcnMoYSwgYikge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBhKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBldmVudCBpbiBiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdHMgPSByZXN1bHRbZXZlbnRdLCBhZGQgPSBiW2V2ZW50XTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V2ZW50XSA9IGV4aXN0cyA/ICh2aWV3LCBsaW5lLCBldmVudCkgPT4gZXhpc3RzKHZpZXcsIGxpbmUsIGV2ZW50KSB8fCBhZGQodmlldywgbGluZSwgZXZlbnQpIDogYWRkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbmNsYXNzIE51bWJlck1hcmtlciBleHRlbmRzIEd1dHRlck1hcmtlciB7XG4gICAgY29uc3RydWN0b3IobnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gdGhpcy5udW1iZXIgPT0gb3RoZXIubnVtYmVyOyB9XG4gICAgdG9ET00oKSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm51bWJlcik7IH1cbn1cbmZ1bmN0aW9uIGZvcm1hdE51bWJlcih2aWV3LCBudW1iZXIpIHtcbiAgICByZXR1cm4gdmlldy5zdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKS5mb3JtYXROdW1iZXIobnVtYmVyLCB2aWV3LnN0YXRlKTtcbn1cbmNvbnN0IGxpbmVOdW1iZXJHdXR0ZXIgPSAvKkBfX1BVUkVfXyovYWN0aXZlR3V0dGVycy5jb21wdXRlKFtsaW5lTnVtYmVyQ29uZmlnXSwgc3RhdGUgPT4gKHtcbiAgICBjbGFzczogXCJjbS1saW5lTnVtYmVyc1wiLFxuICAgIHJlbmRlckVtcHR5RWxlbWVudHM6IGZhbHNlLFxuICAgIG1hcmtlcnModmlldykgeyByZXR1cm4gdmlldy5zdGF0ZS5mYWNldChsaW5lTnVtYmVyTWFya2Vycyk7IH0sXG4gICAgbGluZU1hcmtlcih2aWV3LCBsaW5lLCBvdGhlcnMpIHtcbiAgICAgICAgaWYgKG90aGVycy5zb21lKG0gPT4gbS50b0RPTSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJNYXJrZXIoZm9ybWF0TnVtYmVyKHZpZXcsIHZpZXcuc3RhdGUuZG9jLmxpbmVBdChsaW5lLmZyb20pLm51bWJlcikpO1xuICAgIH0sXG4gICAgd2lkZ2V0TWFya2VyOiAodmlldywgd2lkZ2V0LCBibG9jaykgPT4ge1xuICAgICAgICBmb3IgKGxldCBtIG9mIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlcldpZGdldE1hcmtlcikpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBtKHZpZXcsIHdpZGdldCwgYmxvY2spO1xuICAgICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgbGluZU1hcmtlckNoYW5nZTogdXBkYXRlID0+IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKSxcbiAgICBpbml0aWFsU3BhY2VyKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJNYXJrZXIoZm9ybWF0TnVtYmVyKHZpZXcsIG1heExpbmVOdW1iZXIodmlldy5zdGF0ZS5kb2MubGluZXMpKSk7XG4gICAgfSxcbiAgICB1cGRhdGVTcGFjZXIoc3BhY2VyLCB1cGRhdGUpIHtcbiAgICAgICAgbGV0IG1heCA9IGZvcm1hdE51bWJlcih1cGRhdGUudmlldywgbWF4TGluZU51bWJlcih1cGRhdGUudmlldy5zdGF0ZS5kb2MubGluZXMpKTtcbiAgICAgICAgcmV0dXJuIG1heCA9PSBzcGFjZXIubnVtYmVyID8gc3BhY2VyIDogbmV3IE51bWJlck1hcmtlcihtYXgpO1xuICAgIH0sXG4gICAgZG9tRXZlbnRIYW5kbGVyczogc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykuZG9tRXZlbnRIYW5kbGVyc1xufSkpO1xuLyoqXG5DcmVhdGUgYSBsaW5lIG51bWJlciBndXR0ZXIgZXh0ZW5zaW9uLlxuKi9cbmZ1bmN0aW9uIGxpbmVOdW1iZXJzKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbGluZU51bWJlckNvbmZpZy5vZihjb25maWcpLFxuICAgICAgICBndXR0ZXJzKCksXG4gICAgICAgIGxpbmVOdW1iZXJHdXR0ZXJcbiAgICBdO1xufVxuZnVuY3Rpb24gbWF4TGluZU51bWJlcihsaW5lcykge1xuICAgIGxldCBsYXN0ID0gOTtcbiAgICB3aGlsZSAobGFzdCA8IGxpbmVzKVxuICAgICAgICBsYXN0ID0gbGFzdCAqIDEwICsgOTtcbiAgICByZXR1cm4gbGFzdDtcbn1cbmNvbnN0IGFjdGl2ZUxpbmVHdXR0ZXJNYXJrZXIgPSAvKkBfX1BVUkVfXyovbmV3IGNsYXNzIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5lbGVtZW50Q2xhc3MgPSBcImNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjtcbiAgICB9XG59O1xuY29uc3QgYWN0aXZlTGluZUd1dHRlckhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL2d1dHRlckxpbmVDbGFzcy5jb21wdXRlKFtcInNlbGVjdGlvblwiXSwgc3RhdGUgPT4ge1xuICAgIGxldCBtYXJrcyA9IFtdLCBsYXN0ID0gLTE7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICBsZXQgbGluZVBvcyA9IHN0YXRlLmRvYy5saW5lQXQocmFuZ2UuaGVhZCkuZnJvbTtcbiAgICAgICAgaWYgKGxpbmVQb3MgPiBsYXN0KSB7XG4gICAgICAgICAgICBsYXN0ID0gbGluZVBvcztcbiAgICAgICAgICAgIG1hcmtzLnB1c2goYWN0aXZlTGluZUd1dHRlck1hcmtlci5yYW5nZShsaW5lUG9zKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFJhbmdlU2V0Lm9mKG1hcmtzKTtcbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgYSBgY20tYWN0aXZlTGluZUd1dHRlcmAgY2xhc3MgdG9cbmFsbCBndXR0ZXIgZWxlbWVudHMgb24gdGhlIFthY3RpdmVcbmxpbmVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5oaWdobGlnaHRBY3RpdmVMaW5lKS5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRBY3RpdmVMaW5lR3V0dGVyKCkge1xuICAgIHJldHVybiBhY3RpdmVMaW5lR3V0dGVySGlnaGxpZ2h0ZXI7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXIoZGVjb3JhdG9yKSB7XG4gICAgcmV0dXJuIFZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gKHtcbiAgICAgICAgZGVjb3JhdGlvbnM6IGRlY29yYXRvci5jcmVhdGVEZWNvKHZpZXcpLFxuICAgICAgICB1cGRhdGUodSkge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IGRlY29yYXRvci51cGRhdGVEZWNvKHUsIHRoaXMuZGVjb3JhdGlvbnMpO1xuICAgICAgICB9LFxuICAgIH0pLCB7XG4gICAgICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbiAgICB9KTtcbn1cbmNvbnN0IHRhYkRlY28gPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taGlnaGxpZ2h0VGFiXCIgfSk7XG5jb25zdCBzcGFjZURlY28gPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taGlnaGxpZ2h0U3BhY2VcIiB9KTtcbmNvbnN0IHdoaXRlc3BhY2VIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9tYXRjaGVyKC8qQF9fUFVSRV9fKi9uZXcgTWF0Y2hEZWNvcmF0b3Ioe1xuICAgIHJlZ2V4cDogL1xcdHwgL2csXG4gICAgZGVjb3JhdGlvbjogbWF0Y2ggPT4gbWF0Y2hbMF0gPT0gXCJcXHRcIiA/IHRhYkRlY28gOiBzcGFjZURlY28sXG4gICAgYm91bmRhcnk6IC9cXFMvLFxufSkpO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGhpZ2hsaWdodHMgd2hpdGVzcGFjZSwgYWRkaW5nIGFcbmBjbS1oaWdobGlnaHRTcGFjZWAgY2xhc3MgdG8gc3RyZXRjaGVzIG9mIHNwYWNlcywgYW5kIGFcbmBjbS1oaWdobGlnaHRUYWJgIGNsYXNzIHRvIGluZGl2aWR1YWwgdGFiIGNoYXJhY3RlcnMuIEJ5IGRlZmF1bHQsXG50aGUgZm9ybWVyIGFyZSBzaG93biBhcyBmYWludCBkb3RzLCBhbmQgdGhlIGxhdHRlciBhcyBhcnJvd3MuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0V2hpdGVzcGFjZSgpIHtcbiAgICByZXR1cm4gd2hpdGVzcGFjZUhpZ2hsaWdodGVyO1xufVxuY29uc3QgdHJhaWxpbmdIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9tYXRjaGVyKC8qQF9fUFVSRV9fKi9uZXcgTWF0Y2hEZWNvcmF0b3Ioe1xuICAgIHJlZ2V4cDogL1xccyskL2csXG4gICAgZGVjb3JhdGlvbjogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLXRyYWlsaW5nU3BhY2VcIiB9KSxcbiAgICBib3VuZGFyeTogL1xcUy8sXG59KSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyBhIGBjbS10cmFpbGluZ1NwYWNlYCBjbGFzcyB0byBhbGxcbnRyYWlsaW5nIHdoaXRlc3BhY2UuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0VHJhaWxpbmdXaGl0ZXNwYWNlKCkge1xuICAgIHJldHVybiB0cmFpbGluZ0hpZ2hsaWdodGVyO1xufVxuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmNvbnN0IF9fdGVzdCA9IHsgSGVpZ2h0TWFwLCBIZWlnaHRPcmFjbGUsIE1lYXN1cmVkSGVpZ2h0cywgUXVlcnlUeXBlLCBDaGFuZ2VkUmFuZ2UsIGNvbXB1dGVPcmRlcixcbiAgICBtb3ZlVmlzdWFsbHksIGNsZWFySGVpZ2h0Q2hhbmdlRmxhZywgZ2V0SGVpZ2h0Q2hhbmdlRmxhZzogKCkgPT4gaGVpZ2h0Q2hhbmdlRmxhZyB9O1xuXG5leHBvcnQgeyBCaWRpU3BhbiwgQmxvY2tJbmZvLCBCbG9ja1R5cGUsIERlY29yYXRpb24sIERpcmVjdGlvbiwgRWRpdG9yVmlldywgR3V0dGVyTWFya2VyLCBNYXRjaERlY29yYXRvciwgUmVjdGFuZ2xlTWFya2VyLCBWaWV3UGx1Z2luLCBWaWV3VXBkYXRlLCBXaWRnZXRUeXBlLCBfX3Rlc3QsIGNsb3NlSG92ZXJUb29sdGlwcywgY3Jvc3NoYWlyQ3Vyc29yLCBkcmF3U2VsZWN0aW9uLCBkcm9wQ3Vyc29yLCBnZXREcmF3U2VsZWN0aW9uQ29uZmlnLCBnZXRQYW5lbCwgZ2V0VG9vbHRpcCwgZ3V0dGVyLCBndXR0ZXJMaW5lQ2xhc3MsIGd1dHRlcldpZGdldENsYXNzLCBndXR0ZXJzLCBoYXNIb3ZlclRvb2x0aXBzLCBoaWdobGlnaHRBY3RpdmVMaW5lLCBoaWdobGlnaHRBY3RpdmVMaW5lR3V0dGVyLCBoaWdobGlnaHRTcGVjaWFsQ2hhcnMsIGhpZ2hsaWdodFRyYWlsaW5nV2hpdGVzcGFjZSwgaGlnaGxpZ2h0V2hpdGVzcGFjZSwgaG92ZXJUb29sdGlwLCBrZXltYXAsIGxheWVyLCBsaW5lTnVtYmVyTWFya2VycywgbGluZU51bWJlcldpZGdldE1hcmtlciwgbGluZU51bWJlcnMsIGxvZ0V4Y2VwdGlvbiwgcGFuZWxzLCBwbGFjZWhvbGRlciwgcmVjdGFuZ3VsYXJTZWxlY3Rpb24sIHJlcG9zaXRpb25Ub29sdGlwcywgcnVuU2NvcGVIYW5kbGVycywgc2Nyb2xsUGFzdEVuZCwgc2hvd1BhbmVsLCBzaG93VG9vbHRpcCwgdG9vbHRpcHMgfTtcbiIsICIvKipcblRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIG9mIGEgYFRyZWVCdWZmZXJgIG5vZGUuXG4qL1xuY29uc3QgRGVmYXVsdEJ1ZmZlckxlbmd0aCA9IDEwMjQ7XG5sZXQgbmV4dFByb3BJRCA9IDA7XG5jbGFzcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8pIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgIH1cbn1cbi8qKlxuRWFjaCBbbm9kZSB0eXBlXSgjY29tbW9uLk5vZGVUeXBlKSBvciBbaW5kaXZpZHVhbCB0cmVlXSgjY29tbW9uLlRyZWUpXG5jYW4gaGF2ZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgaW4gcHJvcHMuIEluc3RhbmNlcyBvZiB0aGlzXG5jbGFzcyByZXByZXNlbnQgcHJvcCBuYW1lcy5cbiovXG5jbGFzcyBOb2RlUHJvcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IG5vZGUgcHJvcCB0eXBlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgdGhpcy5pZCA9IG5leHRQcm9wSUQrKztcbiAgICAgICAgdGhpcy5wZXJOb2RlID0gISFjb25maWcucGVyTm9kZTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZSA9IGNvbmZpZy5kZXNlcmlhbGl6ZSB8fCAoKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBub2RlIHR5cGUgZG9lc24ndCBkZWZpbmUgYSBkZXNlcmlhbGl6ZSBmdW5jdGlvblwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoXG4gICAgW2BOb2RlU2V0LmV4dGVuZGBdKCNjb21tb24uTm9kZVNldC5leHRlbmQpIG9yXG4gICAgW2BMUlBhcnNlci5jb25maWd1cmVgXSgjbHIuUGFyc2VyQ29uZmlnLnByb3BzKSB0byBjb21wdXRlXG4gICAgcHJvcCB2YWx1ZXMgZm9yIGVhY2ggbm9kZSB0eXBlIGluIHRoZSBzZXQuIFRha2VzIGEgW21hdGNoXG4gICAgb2JqZWN0XSgjY29tbW9uLk5vZGVUeXBlXm1hdGNoKSBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdW5kZWZpbmVkXG4gICAgaWYgdGhlIG5vZGUgdHlwZSBkb2Vzbid0IGdldCB0aGlzIHByb3AsIGFuZCB0aGUgcHJvcCdzIHZhbHVlIGlmXG4gICAgaXQgZG9lcy5cbiAgICAqL1xuICAgIGFkZChtYXRjaCkge1xuICAgICAgICBpZiAodGhpcy5wZXJOb2RlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBhZGQgcGVyLW5vZGUgcHJvcHMgdG8gbm9kZSB0eXBlc1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaCAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBtYXRjaCA9IE5vZGVUeXBlLm1hdGNoKG1hdGNoKTtcbiAgICAgICAgcmV0dXJuICh0eXBlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbWF0Y2godHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBudWxsIDogW3RoaXMsIHJlc3VsdF07XG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG5Qcm9wIHRoYXQgaXMgdXNlZCB0byBkZXNjcmliZSBtYXRjaGluZyBkZWxpbWl0ZXJzLiBGb3Igb3BlbmluZ1xuZGVsaW1pdGVycywgdGhpcyBob2xkcyBhbiBhcnJheSBvZiBub2RlIG5hbWVzICh3cml0dGVuIGFzIGFcbnNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgd2hlbiBkZWNsYXJpbmcgdGhpcyBwcm9wIGluIGEgZ3JhbW1hcilcbmZvciB0aGUgbm9kZSB0eXBlcyBvZiBjbG9zaW5nIGRlbGltaXRlcnMgdGhhdCBtYXRjaCBpdC5cbiovXG5Ob2RlUHJvcC5jbG9zZWRCeSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuVGhlIGludmVyc2Ugb2YgW2BjbG9zZWRCeWBdKCNjb21tb24uTm9kZVByb3BeY2xvc2VkQnkpLiBUaGlzIGlzXG5hdHRhY2hlZCB0byBjbG9zaW5nIGRlbGltaXRlcnMsIGhvbGRpbmcgYW4gYXJyYXkgb2Ygbm9kZSBuYW1lc1xub2YgdHlwZXMgb2YgbWF0Y2hpbmcgb3BlbmluZyBkZWxpbWl0ZXJzLlxuKi9cbk5vZGVQcm9wLm9wZW5lZEJ5ID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHN0ciA9PiBzdHIuc3BsaXQoXCIgXCIpIH0pO1xuLyoqXG5Vc2VkIHRvIGFzc2lnbiBub2RlIHR5cGVzIHRvIGdyb3VwcyAoZm9yIGV4YW1wbGUsIGFsbCBub2RlXG50eXBlcyB0aGF0IHJlcHJlc2VudCBhbiBleHByZXNzaW9uIGNvdWxkIGJlIHRhZ2dlZCB3aXRoIGFuXG5gXCJFeHByZXNzaW9uXCJgIGdyb3VwKS5cbiovXG5Ob2RlUHJvcC5ncm91cCA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuQXR0YWNoZWQgdG8gbm9kZXMgdG8gaW5kaWNhdGUgdGhlc2Ugc2hvdWxkIGJlXG5bZGlzcGxheWVkXShodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhUcmVlKVxuaW4gYSBiaWRpcmVjdGlvbmFsIHRleHQgaXNvbGF0ZSwgc28gdGhhdCBkaXJlY3Rpb24tbmV1dHJhbFxuY2hhcmFjdGVycyBvbiB0aGVpciBzaWRlcyBkb24ndCBpbmNvcnJlY3RseSBnZXQgYXNzb2NpYXRlZCB3aXRoXG5zdXJyb3VuZGluZyB0ZXh0LiBZb3UnbGwgZ2VuZXJhbGx5IHdhbnQgdG8gc2V0IHRoaXMgZm9yIG5vZGVzXG50aGF0IGNvbnRhaW4gYXJiaXRyYXJ5IHRleHQsIGxpa2Ugc3RyaW5ncyBhbmQgY29tbWVudHMsIGFuZCBmb3Jcbm5vZGVzIHRoYXQgYXBwZWFyIF9pbnNpZGVfIGFyYml0cmFyeSB0ZXh0LCBsaWtlIEhUTUwgdGFncy4gV2hlblxubm90IGdpdmVuIGEgdmFsdWUsIGluIGEgZ3JhbW1hciBkZWNsYXJhdGlvbiwgZGVmYXVsdHMgdG9cbmBcImF1dG9cImAuXG4qL1xuTm9kZVByb3AuaXNvbGF0ZSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSBcInJ0bFwiICYmIHZhbHVlICE9IFwibHRyXCIgJiYgdmFsdWUgIT0gXCJhdXRvXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIGlzb2xhdGU6IFwiICsgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWUgfHwgXCJhdXRvXCI7XG4gICAgfSB9KTtcbi8qKlxuVGhlIGhhc2ggb2YgdGhlIFtjb250ZXh0XSgjbHIuQ29udGV4dFRyYWNrZXIuY29uc3RydWN0b3IpXG50aGF0IHRoZSBub2RlIHdhcyBwYXJzZWQgaW4sIGlmIGFueS4gVXNlZCB0byBsaW1pdCByZXVzZSBvZlxuY29udGV4dHVhbCBub2Rlcy5cbiovXG5Ob2RlUHJvcC5jb250ZXh0SGFzaCA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4vKipcblRoZSBkaXN0YW5jZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbm9kZSB0aGF0IHRoZSB0b2tlbml6ZXJcbmxvb2tlZCBhaGVhZCBmb3IgYW55IG9mIHRoZSB0b2tlbnMgaW5zaWRlIHRoZSBub2RlLiAoVGhlIExSXG5wYXJzZXIgb25seSBzdG9yZXMgdGhpcyB3aGVuIGl0IGlzIGxhcmdlciB0aGFuIDI1LCBmb3JcbmVmZmljaWVuY3kgcmVhc29ucy4pXG4qL1xuTm9kZVByb3AubG9va0FoZWFkID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbi8qKlxuVGhpcyBwZXItbm9kZSBwcm9wIGlzIHVzZWQgdG8gcmVwbGFjZSBhIGdpdmVuIG5vZGUsIG9yIHBhcnQgb2YgYVxubm9kZSwgd2l0aCBhbm90aGVyIHRyZWUuIFRoaXMgaXMgdXNlZnVsIHRvIGluY2x1ZGUgdHJlZXMgZnJvbVxuZGlmZmVyZW50IGxhbmd1YWdlcyBpbiBtaXhlZC1sYW5ndWFnZSBwYXJzZXJzLlxuKi9cbk5vZGVQcm9wLm1vdW50ZWQgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuLyoqXG5BIG1vdW50ZWQgdHJlZSwgd2hpY2ggY2FuIGJlIFtzdG9yZWRdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgb25cbmEgdHJlZSBub2RlIHRvIGluZGljYXRlIHRoYXQgcGFydHMgb2YgaXRzIGNvbnRlbnQgYXJlXG5yZXByZXNlbnRlZCBieSBhbm90aGVyIHRyZWUuXG4qL1xuY2xhc3MgTW91bnRlZFRyZWUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBpbm5lciB0cmVlLlxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBudWxsLCB0aGlzIHRyZWUgcmVwbGFjZXMgdGhlIGVudGlyZSBub2RlIChpdCB3aWxsXG4gICAgYmUgaW5jbHVkZWQgaW4gdGhlIHJlZ3VsYXIgaXRlcmF0aW9uIGluc3RlYWQgb2YgaXRzIGhvc3RcbiAgICBub2RlKS4gSWYgbm90LCBvbmx5IHRoZSBnaXZlbiByYW5nZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmVcbiAgICBjb3ZlcmVkIGJ5IHRoaXMgdHJlZS4gVGhpcyBpcyB1c2VkIGZvciB0cmVlcyB0aGF0IGFyZSBtaXhlZCBpblxuICAgIGEgd2F5IHRoYXQgaXNuJ3Qgc3RyaWN0bHkgaGllcmFyY2hpY2FsLiBTdWNoIG1vdW50ZWQgdHJlZXMgYXJlXG4gICAgb25seSBlbnRlcmVkIGJ5IFtgcmVzb2x2ZUlubmVyYF0oI2NvbW1vbi5UcmVlLnJlc29sdmVJbm5lcilcbiAgICBhbmQgW2BlbnRlcmBdKCNjb21tb24uU3ludGF4Tm9kZS5lbnRlcikuXG4gICAgKi9cbiAgICBvdmVybGF5LCBcbiAgICAvKipcbiAgICBUaGUgcGFyc2VyIHVzZWQgdG8gY3JlYXRlIHRoaXMgc3VidHJlZS5cbiAgICAqL1xuICAgIHBhcnNlcikge1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0KHRyZWUpIHtcbiAgICAgICAgcmV0dXJuIHRyZWUgJiYgdHJlZS5wcm9wcyAmJiB0cmVlLnByb3BzW05vZGVQcm9wLm1vdW50ZWQuaWRdO1xuICAgIH1cbn1cbmNvbnN0IG5vUHJvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG5FYWNoIG5vZGUgaW4gYSBzeW50YXggdHJlZSBoYXMgYSBub2RlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0LlxuKi9cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIG9mIHRoZSBub2RlIHR5cGUuIE5vdCBuZWNlc3NhcmlseSB1bmlxdWUsIGJ1dCBpZiB0aGVcbiAgICBncmFtbWFyIHdhcyB3cml0dGVuIHByb3Blcmx5LCBkaWZmZXJlbnQgbm9kZSB0eXBlcyB3aXRoIHRoZVxuICAgIHNhbWUgbmFtZSB3aXRoaW4gYSBub2RlIHNldCBzaG91bGQgcGxheSB0aGUgc2FtZSBzZW1hbnRpY1xuICAgIHJvbGUuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHByb3BzLCBcbiAgICAvKipcbiAgICBUaGUgaWQgb2YgdGhpcyBub2RlIGluIGl0cyBzZXQuIENvcnJlc3BvbmRzIHRvIHRoZSB0ZXJtIGlkc1xuICAgIHVzZWQgaW4gdGhlIHBhcnNlci5cbiAgICAqL1xuICAgIGlkLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZsYWdzID0gMCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBub2RlIHR5cGUuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWMpIHtcbiAgICAgICAgbGV0IHByb3BzID0gc3BlYy5wcm9wcyAmJiBzcGVjLnByb3BzLmxlbmd0aCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBub1Byb3BzO1xuICAgICAgICBsZXQgZmxhZ3MgPSAoc3BlYy50b3AgPyAxIC8qIE5vZGVGbGFnLlRvcCAqLyA6IDApIHwgKHNwZWMuc2tpcHBlZCA/IDIgLyogTm9kZUZsYWcuU2tpcHBlZCAqLyA6IDApIHxcbiAgICAgICAgICAgIChzcGVjLmVycm9yID8gNCAvKiBOb2RlRmxhZy5FcnJvciAqLyA6IDApIHwgKHNwZWMubmFtZSA9PSBudWxsID8gOCAvKiBOb2RlRmxhZy5Bbm9ueW1vdXMgKi8gOiAwKTtcbiAgICAgICAgbGV0IHR5cGUgPSBuZXcgTm9kZVR5cGUoc3BlYy5uYW1lIHx8IFwiXCIsIHByb3BzLCBzcGVjLmlkLCBmbGFncyk7XG4gICAgICAgIGlmIChzcGVjLnByb3BzKVxuICAgICAgICAgICAgZm9yIChsZXQgc3JjIG9mIHNwZWMucHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3JjKSlcbiAgICAgICAgICAgICAgICAgICAgc3JjID0gc3JjKHR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1swXS5wZXJOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBzdG9yZSBhIHBlci1ub2RlIHByb3Agb24gYSBub2RlIHR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzW3NyY1swXS5pZF0gPSBzcmNbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmVzIGEgbm9kZSBwcm9wIGZvciB0aGlzIHR5cGUuIFdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGlmXG4gICAgdGhlIHByb3AgaXNuJ3QgcHJlc2VudCBvbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBwcm9wKHByb3ApIHsgcmV0dXJuIHRoaXMucHJvcHNbcHJvcC5pZF07IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyB0aGUgdG9wIG5vZGUgb2YgYSBncmFtbWFyLlxuICAgICovXG4gICAgZ2V0IGlzVG9wKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAxIC8qIE5vZGVGbGFnLlRvcCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbm9kZSBpcyBwcm9kdWNlZCBieSBhIHNraXAgcnVsZS5cbiAgICAqL1xuICAgIGdldCBpc1NraXBwZWQoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDIgLyogTm9kZUZsYWcuU2tpcHBlZCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBlcnJvciBub2RlLlxuICAgICovXG4gICAgZ2V0IGlzRXJyb3IoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDQgLyogTm9kZUZsYWcuRXJyb3IgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFdoZW4gdHJ1ZSwgdGhpcyBub2RlIHR5cGUgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgdXNlci1kZWNsYXJlZFxuICAgIG5hbWVkIG5vZGUsIGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaXMgdXNlZCB0byBjYWNoZSByZXBldGl0aW9uLlxuICAgICovXG4gICAgZ2V0IGlzQW5vbnltb3VzKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiA4IC8qIE5vZGVGbGFnLkFub255bW91cyAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhpcyBub2RlJ3MgbmFtZSBvciBvbmUgb2YgaXRzXG4gICAgW2dyb3Vwc10oI2NvbW1vbi5Ob2RlUHJvcF5ncm91cCkgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgaXMobmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gbmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBncm91cCA9IHRoaXMucHJvcChOb2RlUHJvcC5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAgPyBncm91cC5pbmRleE9mKG5hbWUpID4gLTEgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pZCA9PSBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmdW5jdGlvbiBmcm9tIG5vZGUgdHlwZXMgdG8gYXJiaXRyYXJ5IHZhbHVlcyBieVxuICAgIHNwZWNpZnlpbmcgYW4gb2JqZWN0IHdob3NlIHByb3BlcnR5IG5hbWVzIGFyZSBub2RlIG9yXG4gICAgW2dyb3VwXSgjY29tbW9uLk5vZGVQcm9wXmdyb3VwKSBuYW1lcy4gT2Z0ZW4gdXNlZnVsIHdpdGhcbiAgICBbYE5vZGVQcm9wLmFkZGBdKCNjb21tb24uTm9kZVByb3AuYWRkKS4gWW91IGNhbiBwdXQgbXVsdGlwbGVcbiAgICBuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywgaW4gYSBzaW5nbGUgcHJvcGVydHkgbmFtZSB0byBtYXBcbiAgICBtdWx0aXBsZSBub2RlIG5hbWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuICAgICovXG4gICAgc3RhdGljIG1hdGNoKG1hcCkge1xuICAgICAgICBsZXQgZGlyZWN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBtYXApXG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIG9mIHByb3Auc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgICAgIGRpcmVjdFtuYW1lXSA9IG1hcFtwcm9wXTtcbiAgICAgICAgcmV0dXJuIChub2RlKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBncm91cHMgPSBub2RlLnByb3AoTm9kZVByb3AuZ3JvdXApLCBpID0gLTE7IGkgPCAoZ3JvdXBzID8gZ3JvdXBzLmxlbmd0aCA6IDApOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBkaXJlY3RbaSA8IDAgPyBub2RlLm5hbWUgOiBncm91cHNbaV1dO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuQW4gZW1wdHkgZHVtbXkgbm9kZSB0eXBlIHRvIHVzZSB3aGVuIG5vIGFjdHVhbCB0eXBlIGlzIGF2YWlsYWJsZS5cbiovXG5Ob2RlVHlwZS5ub25lID0gbmV3IE5vZGVUeXBlKFwiXCIsIE9iamVjdC5jcmVhdGUobnVsbCksIDAsIDggLyogTm9kZUZsYWcuQW5vbnltb3VzICovKTtcbi8qKlxuQSBub2RlIHNldCBob2xkcyBhIGNvbGxlY3Rpb24gb2Ygbm9kZSB0eXBlcy4gSXQgaXMgdXNlZCB0b1xuY29tcGFjdGx5IHJlcHJlc2VudCB0cmVlcyBieSBzdG9yaW5nIHRoZWlyIHR5cGUgaWRzLCByYXRoZXIgdGhhbiBhXG5mdWxsIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2JqZWN0LCBpbiBhIG51bWVyaWMgYXJyYXkuIEVhY2ggcGFyc2VyXG5baGFzXSgjbHIuTFJQYXJzZXIubm9kZVNldCkgYSBub2RlIHNldCwgYW5kIFt0cmVlXG5idWZmZXJzXSgjY29tbW9uLlRyZWVCdWZmZXIpIGNhbiBvbmx5IHN0b3JlIGNvbGxlY3Rpb25zIG9mIG5vZGVzXG5mcm9tIHRoZSBzYW1lIHNldC4gQSBzZXQgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDIqKjE2ICg2NTUzNikgbm9kZVxudHlwZXMgaW4gaXQsIHNvIHRoYXQgdGhlIGlkcyBmaXQgaW50byAxNi1iaXQgdHlwZWQgYXJyYXkgc2xvdHMuXG4qL1xuY2xhc3MgTm9kZVNldCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IHdpdGggdGhlIGdpdmVuIHR5cGVzLiBUaGUgYGlkYCBwcm9wZXJ0eSBvZiBlYWNoXG4gICAgdHlwZSBzaG91bGQgY29ycmVzcG9uZCB0byBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBhcnJheS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHR5cGVzIGluIHRoaXMgc2V0LCBieSBpZC5cbiAgICAqL1xuICAgIHR5cGVzKSB7XG4gICAgICAgIHRoaXMudHlwZXMgPSB0eXBlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pZCAhPSBpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm9kZSB0eXBlIGlkcyBzaG91bGQgY29ycmVzcG9uZCB0byBhcnJheSBwb3NpdGlvbnMgd2hlbiBjcmVhdGluZyBhIG5vZGUgc2V0XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgc2V0IHdpdGggc29tZSBub2RlIHByb3BlcnRpZXMgYWRkZWQuIFRoZVxuICAgIGFyZ3VtZW50cyB0byB0aGlzIG1ldGhvZCBjYW4gYmUgY3JlYXRlZCB3aXRoXG4gICAgW2BOb2RlUHJvcC5hZGRgXSgjY29tbW9uLk5vZGVQcm9wLmFkZCkuXG4gICAgKi9cbiAgICBleHRlbmQoLi4ucHJvcHMpIHtcbiAgICAgICAgbGV0IG5ld1R5cGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHR5cGUgb2YgdGhpcy50eXBlcykge1xuICAgICAgICAgICAgbGV0IG5ld1Byb3BzID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBwcm9wcykge1xuICAgICAgICAgICAgICAgIGxldCBhZGQgPSBzb3VyY2UodHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1Byb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCB0eXBlLnByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHNbYWRkWzBdLmlkXSA9IGFkZFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdUeXBlcy5wdXNoKG5ld1Byb3BzID8gbmV3IE5vZGVUeXBlKHR5cGUubmFtZSwgbmV3UHJvcHMsIHR5cGUuaWQsIHR5cGUuZmxhZ3MpIDogdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2V0KG5ld1R5cGVzKTtcbiAgICB9XG59XG5jb25zdCBDYWNoZWROb2RlID0gbmV3IFdlYWtNYXAoKSwgQ2FjaGVkSW5uZXJOb2RlID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuT3B0aW9ucyB0aGF0IGNvbnRyb2wgaXRlcmF0aW9uLiBDYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgYHxgXG5vcGVyYXRvciB0byBlbmFibGUgbXVsdGlwbGUgb25lcy5cbiovXG52YXIgSXRlck1vZGU7XG4oZnVuY3Rpb24gKEl0ZXJNb2RlKSB7XG4gICAgLyoqXG4gICAgV2hlbiBlbmFibGVkLCBpdGVyYXRpb24gd2lsbCBvbmx5IHZpc2l0IFtgVHJlZWBdKCNjb21tb24uVHJlZSlcbiAgICBvYmplY3RzLCBub3Qgbm9kZXMgcGFja2VkIGludG9cbiAgICBbYFRyZWVCdWZmZXJgXSgjY29tbW9uLlRyZWVCdWZmZXIpcy5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiRXhjbHVkZUJ1ZmZlcnNcIl0gPSAxXSA9IFwiRXhjbHVkZUJ1ZmZlcnNcIjtcbiAgICAvKipcbiAgICBFbmFibGUgdGhpcyB0byBtYWtlIGl0ZXJhdGlvbiBpbmNsdWRlIGFub255bW91cyBub2RlcyAoc3VjaCBhc1xuICAgIHRoZSBub2RlcyB0aGF0IHdyYXAgcmVwZWF0ZWQgZ3JhbW1hciBjb25zdHJ1Y3RzIGludG8gYSBiYWxhbmNlZFxuICAgIHRyZWUpLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJJbmNsdWRlQW5vbnltb3VzXCJdID0gMl0gPSBcIkluY2x1ZGVBbm9ueW1vdXNcIjtcbiAgICAvKipcbiAgICBCeSBkZWZhdWx0LCByZWd1bGFyIFttb3VudGVkXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIG5vZGVzXG4gICAgcmVwbGFjZSB0aGVpciBiYXNlIG5vZGUgaW4gaXRlcmF0aW9uLiBFbmFibGUgdGhpcyB0byBpZ25vcmUgdGhlbVxuICAgIGluc3RlYWQuXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIklnbm9yZU1vdW50c1wiXSA9IDRdID0gXCJJZ25vcmVNb3VudHNcIjtcbiAgICAvKipcbiAgICBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgaW5cbiAgICBbYGVudGVyYF0oI2NvbW1vbi5TeW50YXhOb2RlLmVudGVyKS1zdHlsZSBtZXRob2RzLiBJdCB0ZWxscyB0aGVcbiAgICBsaWJyYXJ5IHRvIG5vdCBlbnRlciBtb3VudGVkIG92ZXJsYXlzIGlmIG9uZSBjb3ZlcnMgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIklnbm9yZU92ZXJsYXlzXCJdID0gOF0gPSBcIklnbm9yZU92ZXJsYXlzXCI7XG59KShJdGVyTW9kZSB8fCAoSXRlck1vZGUgPSB7fSkpO1xuLyoqXG5BIHBpZWNlIG9mIHN5bnRheCB0cmVlLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gYXBwcm9hY2ggdGhlc2VcbnRyZWVzOiB0aGUgd2F5IHRoZXkgYXJlIGFjdHVhbGx5IHN0b3JlZCBpbiBtZW1vcnksIGFuZCB0aGVcbmNvbnZlbmllbnQgd2F5LlxuXG5TeW50YXggdHJlZXMgYXJlIHN0b3JlZCBhcyBhIHRyZWUgb2YgYFRyZWVgIGFuZCBgVHJlZUJ1ZmZlcmBcbm9iamVjdHMuIEJ5IHBhY2tpbmcgZGV0YWlsIGluZm9ybWF0aW9uIGludG8gYFRyZWVCdWZmZXJgIGxlYWZcbm5vZGVzLCB0aGUgcmVwcmVzZW50YXRpb24gaXMgbWFkZSBhIGxvdCBtb3JlIG1lbW9yeS1lZmZpY2llbnQuXG5cbkhvd2V2ZXIsIHdoZW4geW91IHdhbnQgdG8gYWN0dWFsbHkgd29yayB3aXRoIHRyZWUgbm9kZXMsIHRoaXNcbnJlcHJlc2VudGF0aW9uIGlzIHZlcnkgYXdrd2FyZCwgc28gbW9zdCBjbGllbnQgY29kZSB3aWxsIHdhbnQgdG9cbnVzZSB0aGUgW2BUcmVlQ3Vyc29yYF0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBvclxuW2BTeW50YXhOb2RlYF0oI2NvbW1vbi5TeW50YXhOb2RlKSBpbnRlcmZhY2UgaW5zdGVhZCwgd2hpY2ggcHJvdmlkZXNcbmEgdmlldyBvbiBzb21lIHBhcnQgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSwgYW5kIGNhbiBiZSB1c2VkIHRvXG5tb3ZlIGFyb3VuZCB0byBhZGphY2VudCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBuZXcgdHJlZS4gU2VlIGFsc28gW2BUcmVlLmJ1aWxkYF0oI2NvbW1vbi5UcmVlXmJ1aWxkKS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIHRoZSB0b3Agbm9kZS5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoaXMgbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgICovXG4gICAgY2hpbGRyZW4sIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbnMgKG9mZnNldHMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgdHJlZSkgb2ZcbiAgICB0aGUgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBwb3NpdGlvbnMsIFxuICAgIC8qKlxuICAgIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhpcyB0cmVlXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFBlci1ub2RlIFtub2RlIHByb3BzXSgjY29tbW9uLk5vZGVQcm9wKSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBwcm9wcykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3BzID0gbnVsbDtcbiAgICAgICAgaWYgKHByb3BzICYmIHByb3BzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICBmb3IgKGxldCBbcHJvcCwgdmFsdWVdIG9mIHByb3BzKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHNbdHlwZW9mIHByb3AgPT0gXCJudW1iZXJcIiA/IHByb3AgOiBwcm9wLmlkXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBtb3VudGVkID0gTW91bnRlZFRyZWUuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAobW91bnRlZCAmJiAhbW91bnRlZC5vdmVybGF5KVxuICAgICAgICAgICAgcmV0dXJuIG1vdW50ZWQudHJlZS50b1N0cmluZygpO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gY2gudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuICs9IFwiLFwiO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuICs9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRoaXMudHlwZS5uYW1lID8gY2hpbGRyZW4gOlxuICAgICAgICAgICAgKC9cXFcvLnRlc3QodGhpcy50eXBlLm5hbWUpICYmICF0aGlzLnR5cGUuaXNFcnJvciA/IEpTT04uc3RyaW5naWZ5KHRoaXMudHlwZS5uYW1lKSA6IHRoaXMudHlwZS5uYW1lKSArXG4gICAgICAgICAgICAgICAgKGNoaWxkcmVuLmxlbmd0aCA/IFwiKFwiICsgY2hpbGRyZW4gKyBcIilcIiA6IFwiXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbdHJlZSBjdXJzb3JdKCNjb21tb24uVHJlZUN1cnNvcikgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9mXG4gICAgdGhlIHRyZWUuIE1vZGUgY2FuIGJlIHVzZWQgdG8gW2NvbnRyb2xdKCNjb21tb24uSXRlck1vZGUpIHdoaWNoXG4gICAgbm9kZXMgdGhlIGN1cnNvciB2aXNpdHMuXG4gICAgKi9cbiAgICBjdXJzb3IobW9kZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlQ3Vyc29yKHRoaXMudG9wTm9kZSwgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFt0cmVlIGN1cnNvcl0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBwb2ludGluZyBpbnRvIHRoaXMgdHJlZVxuICAgIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2lkZSAoc2VlXG4gICAgW2Btb3ZlVG9gXSgjY29tbW9uLlRyZWVDdXJzb3IubW92ZVRvKS5cbiAgICAqL1xuICAgIGN1cnNvckF0KHBvcywgc2lkZSA9IDAsIG1vZGUgPSAwKSB7XG4gICAgICAgIGxldCBzY29wZSA9IENhY2hlZE5vZGUuZ2V0KHRoaXMpIHx8IHRoaXMudG9wTm9kZTtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBUcmVlQ3Vyc29yKHNjb3BlKTtcbiAgICAgICAgY3Vyc29yLm1vdmVUbyhwb3MsIHNpZGUpO1xuICAgICAgICBDYWNoZWROb2RlLnNldCh0aGlzLCBjdXJzb3IuX3RyZWUpO1xuICAgICAgICByZXR1cm4gY3Vyc29yO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgb2JqZWN0IGZvciB0aGUgdG9wIG9mIHRoZVxuICAgIHRyZWUuXG4gICAgKi9cbiAgICBnZXQgdG9wTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZSh0aGlzLCAwLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgIElmIGBzaWRlYCBpcyAtMSwgdGhpcyB3aWxsIG1vdmUgaW50byBub2RlcyB0aGF0IGVuZCBhdCB0aGVcbiAgICBwb3NpdGlvbi4gSWYgMSwgaXQnbGwgbW92ZSBpbnRvIG5vZGVzIHRoYXQgc3RhcnQgYXQgdGhlXG4gICAgcG9zaXRpb24uIFdpdGggMCwgaXQnbGwgb25seSBlbnRlciBub2RlcyB0aGF0IGNvdmVyIHRoZSBwb3NpdGlvblxuICAgIGZyb20gYm90aCBzaWRlcy5cbiAgICBcbiAgICBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCBlbnRlclxuICAgIFtvdmVybGF5c10oI2NvbW1vbi5Nb3VudGVkVHJlZS5vdmVybGF5KSwgYW5kIHlvdSBvZnRlbiB3YW50XG4gICAgW2ByZXNvbHZlSW5uZXJgXSgjY29tbW9uLlRyZWUucmVzb2x2ZUlubmVyKSBpbnN0ZWFkLlxuICAgICovXG4gICAgcmVzb2x2ZShwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIGxldCBub2RlID0gcmVzb2x2ZU5vZGUoQ2FjaGVkTm9kZS5nZXQodGhpcykgfHwgdGhpcy50b3BOb2RlLCBwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVkTm9kZS5zZXQodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgcmVzb2x2ZWBdKCNjb21tb24uVHJlZS5yZXNvbHZlKSwgYnV0IHdpbGwgZW50ZXJcbiAgICBbb3ZlcmxhaWRdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSkgbm9kZXMsIHByb2R1Y2luZyBhIHN5bnRheCBub2RlXG4gICAgcG9pbnRpbmcgaW50byB0aGUgaW5uZXJtb3N0IG92ZXJsYWlkIHRyZWUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uXG4gICAgKHdpdGggcGFyZW50IGxpbmtzIGdvaW5nIHRocm91Z2ggYWxsIHBhcmVudCBzdHJ1Y3R1cmUsIGluY2x1ZGluZ1xuICAgIHRoZSBob3N0IHRyZWVzKS5cbiAgICAqL1xuICAgIHJlc29sdmVJbm5lcihwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIGxldCBub2RlID0gcmVzb2x2ZU5vZGUoQ2FjaGVkSW5uZXJOb2RlLmdldCh0aGlzKSB8fCB0aGlzLnRvcE5vZGUsIHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgICAgIENhY2hlZElubmVyTm9kZS5zZXQodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbiBzb21lIHNpdHVhdGlvbnMsIGl0IGNhbiBiZSB1c2VmdWwgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbFxuICAgIG5vZGVzIGFyb3VuZCBhIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGhvc2UgaW4gb3ZlcmxheXMgdGhhdCBkb24ndFxuICAgIGRpcmVjdGx5IGNvdmVyIHRoZSBwb3NpdGlvbi4gVGhpcyBtZXRob2QgZ2l2ZXMgeW91IGFuIGl0ZXJhdG9yXG4gICAgdGhhdCB3aWxsIHByb2R1Y2UgYWxsIG5vZGVzLCBmcm9tIHNtYWxsIHRvIGJpZywgYXJvdW5kIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgcmVzb2x2ZVN0YWNrKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrSXRlcmF0b3IodGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGFuZCBpdHMgY2hpbGRyZW4sIGNhbGxpbmcgYGVudGVyYCBmb3IgYW55XG4gICAgbm9kZSB0aGF0IHRvdWNoZXMgdGhlIGBmcm9tYC9gdG9gIHJlZ2lvbiAoaWYgZ2l2ZW4pIGJlZm9yZVxuICAgIHJ1bm5pbmcgb3ZlciBzdWNoIGEgbm9kZSdzIGNoaWxkcmVuLCBhbmQgYGxlYXZlYCAoaWYgZ2l2ZW4pIHdoZW5cbiAgICBsZWF2aW5nIHRoZSBub2RlLiBXaGVuIGBlbnRlcmAgcmV0dXJucyBgZmFsc2VgLCB0aGF0IG5vZGUgd2lsbFxuICAgIG5vdCBoYXZlIGl0cyBjaGlsZHJlbiBpdGVyYXRlZCBvdmVyIChvciBgbGVhdmVgIGNhbGxlZCkuXG4gICAgKi9cbiAgICBpdGVyYXRlKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgZW50ZXIsIGxlYXZlLCBmcm9tID0gMCwgdG8gPSB0aGlzLmxlbmd0aCB9ID0gc3BlYztcbiAgICAgICAgbGV0IG1vZGUgPSBzcGVjLm1vZGUgfHwgMCwgYW5vbiA9IChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgPiAwO1xuICAgICAgICBmb3IgKGxldCBjID0gdGhpcy5jdXJzb3IobW9kZSB8IEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpOzspIHtcbiAgICAgICAgICAgIGxldCBlbnRlcmVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYy5mcm9tIDw9IHRvICYmIGMudG8gPj0gZnJvbSAmJiAoIWFub24gJiYgYy50eXBlLmlzQW5vbnltb3VzIHx8IGVudGVyKGMpICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYy5maXJzdENoaWxkKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGVudGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChlbnRlcmVkICYmIGxlYXZlICYmIChhbm9uIHx8ICFjLnR5cGUuaXNBbm9ueW1vdXMpKVxuICAgICAgICAgICAgICAgICAgICBsZWF2ZShjKTtcbiAgICAgICAgICAgICAgICBpZiAoYy5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIWMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBbbm9kZSBwcm9wXSgjY29tbW9uLk5vZGVQcm9wKSBmb3IgdGhpc1xuICAgIG5vZGUuIFdvcmtzIHdpdGggYm90aCBwZXItbm9kZSBhbmQgcGVyLXR5cGUgcHJvcHMuXG4gICAgKi9cbiAgICBwcm9wKHByb3ApIHtcbiAgICAgICAgcmV0dXJuICFwcm9wLnBlck5vZGUgPyB0aGlzLnR5cGUucHJvcChwcm9wKSA6IHRoaXMucHJvcHMgPyB0aGlzLnByb3BzW3Byb3AuaWRdIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBub2RlJ3MgW3Blci1ub2RlIHByb3BzXSgjY29tbW9uLk5vZGVQcm9wLnBlck5vZGUpIGluIGFcbiAgICBmb3JtYXQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBbYFRyZWVgXSgjY29tbW9uLlRyZWUpXG4gICAgY29uc3RydWN0b3IuXG4gICAgKi9cbiAgICBnZXQgcHJvcFZhbHVlcygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5wcm9wcylcbiAgICAgICAgICAgIGZvciAobGV0IGlkIGluIHRoaXMucHJvcHMpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goWytpZCwgdGhpcy5wcm9wc1tpZF1dKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQmFsYW5jZSB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgdHJlZSwgcHJvZHVjaW5nIGEgY29weSBvZlxuICAgIHdoaWNoIG1heSBoYXZlIGNoaWxkcmVuIGdyb3VwZWQgaW50byBzdWJ0cmVlcyB3aXRoIHR5cGVcbiAgICBbYE5vZGVUeXBlLm5vbmVgXSgjY29tbW9uLk5vZGVUeXBlXm5vbmUpLlxuICAgICovXG4gICAgYmFsYW5jZShjb25maWcgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGggPD0gOCAvKiBCYWxhbmNlLkJyYW5jaEZhY3RvciAqLyA/IHRoaXMgOlxuICAgICAgICAgICAgYmFsYW5jZVJhbmdlKE5vZGVUeXBlLm5vbmUsIHRoaXMuY2hpbGRyZW4sIHRoaXMucG9zaXRpb25zLCAwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgMCwgdGhpcy5sZW5ndGgsIChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IG5ldyBUcmVlKHRoaXMudHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCB0aGlzLnByb3BWYWx1ZXMpLCBjb25maWcubWFrZVRyZWUgfHwgKChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSB0cmVlIGZyb20gYSBwb3N0Zml4LW9yZGVyZWQgYnVmZmVyIG9mIG5vZGUgaW5mb3JtYXRpb24sXG4gICAgb3IgYSBjdXJzb3Igb3ZlciBzdWNoIGEgYnVmZmVyLlxuICAgICovXG4gICAgc3RhdGljIGJ1aWxkKGRhdGEpIHsgcmV0dXJuIGJ1aWxkVHJlZShkYXRhKTsgfVxufVxuLyoqXG5UaGUgZW1wdHkgdHJlZVxuKi9cblRyZWUuZW1wdHkgPSBuZXcgVHJlZShOb2RlVHlwZS5ub25lLCBbXSwgW10sIDApO1xuY2xhc3MgRmxhdEJ1ZmZlckN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoYnVmZmVyLCBpbmRleCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBnZXQgaWQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gNF07IH1cbiAgICBnZXQgc3RhcnQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gM107IH1cbiAgICBnZXQgZW5kKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDJdOyB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gMV07IH1cbiAgICBnZXQgcG9zKCkgeyByZXR1cm4gdGhpcy5pbmRleDsgfVxuICAgIG5leHQoKSB7IHRoaXMuaW5kZXggLT0gNDsgfVxuICAgIGZvcmsoKSB7IHJldHVybiBuZXcgRmxhdEJ1ZmZlckN1cnNvcih0aGlzLmJ1ZmZlciwgdGhpcy5pbmRleCk7IH1cbn1cbi8qKlxuVHJlZSBidWZmZXJzIGNvbnRhaW4gKHR5cGUsIHN0YXJ0LCBlbmQsIGVuZEluZGV4KSBxdWFkcyBmb3IgZWFjaFxubm9kZS4gSW4gc3VjaCBhIGJ1ZmZlciwgbm9kZXMgYXJlIHN0b3JlZCBpbiBwcmVmaXggb3JkZXIgKHBhcmVudHNcbmJlZm9yZSBjaGlsZHJlbiwgd2l0aCB0aGUgZW5kSW5kZXggb2YgdGhlIHBhcmVudCBpbmRpY2F0aW5nIHdoaWNoXG5jaGlsZHJlbiBiZWxvbmcgdG8gaXQpLlxuKi9cbmNsYXNzIFRyZWVCdWZmZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRyZWUgYnVmZmVyLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGJ1ZmZlcidzIGNvbnRlbnQuXG4gICAgKi9cbiAgICBidWZmZXIsIFxuICAgIC8qKlxuICAgIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGdyb3VwIG9mIG5vZGVzIGluIHRoZSBidWZmZXIuXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNldCB1c2VkIGluIHRoaXMgYnVmZmVyLlxuICAgICovXG4gICAgc2V0KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5zZXQgPSBzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IHR5cGUoKSB7IHJldHVybiBOb2RlVHlwZS5ub25lOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5idWZmZXIubGVuZ3RoOykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZFN0cmluZyhpbmRleCkpO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmJ1ZmZlcltpbmRleCArIDNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIixcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hpbGRTdHJpbmcoaW5kZXgpIHtcbiAgICAgICAgbGV0IGlkID0gdGhpcy5idWZmZXJbaW5kZXhdLCBlbmRJbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy5zZXQudHlwZXNbaWRdLCByZXN1bHQgPSB0eXBlLm5hbWU7XG4gICAgICAgIGlmICgvXFxXLy50ZXN0KHJlc3VsdCkgJiYgIXR5cGUuaXNFcnJvcilcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7XG4gICAgICAgIGluZGV4ICs9IDQ7XG4gICAgICAgIGlmIChlbmRJbmRleCA9PSBpbmRleClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmRJbmRleCkge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkU3RyaW5nKGluZGV4KSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIFwiKFwiICsgY2hpbGRyZW4uam9pbihcIixcIikgKyBcIilcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5kQ2hpbGQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcywgcGljayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSAhPSBlbmRJbmRleDsgaSA9IGJ1ZmZlcltpICsgM10pIHtcbiAgICAgICAgICAgIGlmIChjaGVja1NpZGUoc2lkZSwgcG9zLCBidWZmZXJbaSArIDFdLCBidWZmZXJbaSArIDJdKSkge1xuICAgICAgICAgICAgICAgIHBpY2sgPSBpO1xuICAgICAgICAgICAgICAgIGlmIChkaXIgPiAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGljaztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzbGljZShzdGFydEksIGVuZEksIGZyb20pIHtcbiAgICAgICAgbGV0IGIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgbGV0IGNvcHkgPSBuZXcgVWludDE2QXJyYXkoZW5kSSAtIHN0YXJ0SSksIGxlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEksIGogPSAwOyBpIDwgZW5kSTspIHtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXTtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXSAtIGZyb207XG4gICAgICAgICAgICBsZXQgdG8gPSBjb3B5W2orK10gPSBiW2krK10gLSBmcm9tO1xuICAgICAgICAgICAgY29weVtqKytdID0gYltpKytdIC0gc3RhcnRJO1xuICAgICAgICAgICAgbGVuID0gTWF0aC5tYXgobGVuLCB0byk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlQnVmZmVyKGNvcHksIGxlbiwgdGhpcy5zZXQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrU2lkZShzaWRlLCBwb3MsIGZyb20sIHRvKSB7XG4gICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICAgIGNhc2UgLTIgLyogU2lkZS5CZWZvcmUgKi86IHJldHVybiBmcm9tIDwgcG9zO1xuICAgICAgICBjYXNlIC0xIC8qIFNpZGUuQXRPckJlZm9yZSAqLzogcmV0dXJuIHRvID49IHBvcyAmJiBmcm9tIDwgcG9zO1xuICAgICAgICBjYXNlIDAgLyogU2lkZS5Bcm91bmQgKi86IHJldHVybiBmcm9tIDwgcG9zICYmIHRvID4gcG9zO1xuICAgICAgICBjYXNlIDEgLyogU2lkZS5BdE9yQWZ0ZXIgKi86IHJldHVybiBmcm9tIDw9IHBvcyAmJiB0byA+IHBvcztcbiAgICAgICAgY2FzZSAyIC8qIFNpZGUuQWZ0ZXIgKi86IHJldHVybiB0byA+IHBvcztcbiAgICAgICAgY2FzZSA0IC8qIFNpZGUuRG9udENhcmUgKi86IHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVOb2RlKG5vZGUsIHBvcywgc2lkZSwgb3ZlcmxheXMpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gTW92ZSB1cCB0byBhIG5vZGUgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgcG9zaXRpb24sIGlmIHBvc3NpYmxlXG4gICAgd2hpbGUgKG5vZGUuZnJvbSA9PSBub2RlLnRvIHx8XG4gICAgICAgIChzaWRlIDwgMSA/IG5vZGUuZnJvbSA+PSBwb3MgOiBub2RlLmZyb20gPiBwb3MpIHx8XG4gICAgICAgIChzaWRlID4gLTEgPyBub2RlLnRvIDw9IHBvcyA6IG5vZGUudG8gPCBwb3MpKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSAhb3ZlcmxheXMgJiYgbm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIG5vZGUuaW5kZXggPCAwID8gbnVsbCA6IG5vZGUucGFyZW50O1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBub2RlID0gcGFyZW50O1xuICAgIH1cbiAgICBsZXQgbW9kZSA9IG92ZXJsYXlzID8gMCA6IEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzO1xuICAgIC8vIE11c3QgZ28gdXAgb3V0IG9mIG92ZXJsYXlzIHdoZW4gdGhvc2UgZG8gbm90IG92ZXJsYXAgd2l0aCBwb3NcbiAgICBpZiAob3ZlcmxheXMpXG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBub2RlLCBwYXJlbnQgPSBzY2FuLnBhcmVudDsgcGFyZW50OyBzY2FuID0gcGFyZW50LCBwYXJlbnQgPSBzY2FuLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHNjYW4gaW5zdGFuY2VvZiBUcmVlTm9kZSAmJiBzY2FuLmluZGV4IDwgMCAmJiAoKF9hID0gcGFyZW50LmVudGVyKHBvcywgc2lkZSwgbW9kZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mcm9tKSAhPSBzY2FuLmZyb20pXG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IGlubmVyID0gbm9kZS5lbnRlcihwb3MsIHNpZGUsIG1vZGUpO1xuICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBpbm5lcjtcbiAgICB9XG59XG5jbGFzcyBCYXNlTm9kZSB7XG4gICAgY3Vyc29yKG1vZGUgPSAwKSB7IHJldHVybiBuZXcgVHJlZUN1cnNvcih0aGlzLCBtb2RlKTsgfVxuICAgIGdldENoaWxkKHR5cGUsIGJlZm9yZSA9IG51bGwsIGFmdGVyID0gbnVsbCkge1xuICAgICAgICBsZXQgciA9IGdldENoaWxkcmVuKHRoaXMsIHR5cGUsIGJlZm9yZSwgYWZ0ZXIpO1xuICAgICAgICByZXR1cm4gci5sZW5ndGggPyByWzBdIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0Q2hpbGRyZW4odHlwZSwgYmVmb3JlID0gbnVsbCwgYWZ0ZXIgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbih0aGlzLCB0eXBlLCBiZWZvcmUsIGFmdGVyKTtcbiAgICB9XG4gICAgcmVzb2x2ZShwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlTm9kZSh0aGlzLCBwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICB9XG4gICAgcmVzb2x2ZUlubmVyKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVOb2RlKHRoaXMsIHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgfVxuICAgIG1hdGNoQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBtYXRjaE5vZGVDb250ZXh0KHRoaXMucGFyZW50LCBjb250ZXh0KTtcbiAgICB9XG4gICAgZW50ZXJVbmZpbmlzaGVkTm9kZXNCZWZvcmUocG9zKSB7XG4gICAgICAgIGxldCBzY2FuID0gdGhpcy5jaGlsZEJlZm9yZShwb3MpLCBub2RlID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHNjYW4pIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gc2Nhbi5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoIWxhc3QgfHwgbGFzdC50byAhPSBzY2FuLnRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKGxhc3QudHlwZS5pc0Vycm9yICYmIGxhc3QuZnJvbSA9PSBsYXN0LnRvKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHNjYW47XG4gICAgICAgICAgICAgICAgc2NhbiA9IGxhc3QucHJldlNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY2FuID0gbGFzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0IG5vZGUoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgZ2V0IG5leHQoKSB7IHJldHVybiB0aGlzLnBhcmVudDsgfVxufVxuY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBCYXNlTm9kZSB7XG4gICAgY29uc3RydWN0b3IoX3RyZWUsIGZyb20sIFxuICAgIC8vIEluZGV4IGluIHBhcmVudCBub2RlLCBzZXQgdG8gLTEgaWYgdGhlIG5vZGUgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIF9wYXJlbnQubm9kZSAob3ZlcmxheSlcbiAgICBpbmRleCwgX3BhcmVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmVlID0gX3RyZWU7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICB9XG4gICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90cmVlLnR5cGU7IH1cbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWUudHlwZS5uYW1lOyB9XG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5mcm9tICsgdGhpcy5fdHJlZS5sZW5ndGg7IH1cbiAgICBuZXh0Q2hpbGQoaSwgZGlyLCBwb3MsIHNpZGUsIG1vZGUgPSAwKSB7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCA9IHRoaXM7Oykge1xuICAgICAgICAgICAgZm9yIChsZXQgeyBjaGlsZHJlbiwgcG9zaXRpb25zIH0gPSBwYXJlbnQuX3RyZWUsIGUgPSBkaXIgPiAwID8gY2hpbGRyZW4ubGVuZ3RoIDogLTE7IGkgIT0gZTsgaSArPSBkaXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGNoaWxkcmVuW2ldLCBzdGFydCA9IHBvc2l0aW9uc1tpXSArIHBhcmVudC5mcm9tO1xuICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWRlKHNpZGUsIHBvcywgc3RhcnQsIHN0YXJ0ICsgbmV4dC5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0LmZpbmRDaGlsZCgwLCBuZXh0LmJ1ZmZlci5sZW5ndGgsIGRpciwgcG9zIC0gc3RhcnQsIHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyTm9kZShuZXcgQnVmZmVyQ29udGV4dChwYXJlbnQsIG5leHQsIGksIHN0YXJ0KSwgbnVsbCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8ICghbmV4dC50eXBlLmlzQW5vbnltb3VzIHx8IGhhc0NoaWxkKG5leHQpKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW91bnRlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEobW9kZSAmIEl0ZXJNb2RlLklnbm9yZU1vdW50cykgJiYgKG1vdW50ZWQgPSBNb3VudGVkVHJlZS5nZXQobmV4dCkpICYmICFtb3VudGVkLm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKG1vdW50ZWQudHJlZSwgc3RhcnQsIGksIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IG5ldyBUcmVlTm9kZShuZXh0LCBzdGFydCwgaSwgcGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHwgIWlubmVyLnR5cGUuaXNBbm9ueW1vdXMgPyBpbm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpbm5lci5uZXh0Q2hpbGQoZGlyIDwgMCA/IG5leHQuY2hpbGRyZW4ubGVuZ3RoIC0gMSA6IDAsIGRpciwgcG9zLCBzaWRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fCAhcGFyZW50LnR5cGUuaXNBbm9ueW1vdXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAocGFyZW50LmluZGV4ID49IDApXG4gICAgICAgICAgICAgICAgaSA9IHBhcmVudC5pbmRleCArIGRpcjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBpID0gZGlyIDwgMCA/IC0xIDogcGFyZW50Ll9wYXJlbnQuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKDAsIDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQodGhpcy5fdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGNoaWxkQWZ0ZXIocG9zKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCgwLCAxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICBjaGlsZEJlZm9yZShwb3MpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKHRoaXMuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgLTEsIHBvcywgLTIgLyogU2lkZS5CZWZvcmUgKi8pOyB9XG4gICAgZW50ZXIocG9zLCBzaWRlLCBtb2RlID0gMCkge1xuICAgICAgICBsZXQgbW91bnRlZDtcbiAgICAgICAgaWYgKCEobW9kZSAmIEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzKSAmJiAobW91bnRlZCA9IE1vdW50ZWRUcmVlLmdldCh0aGlzLl90cmVlKSkgJiYgbW91bnRlZC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgclBvcyA9IHBvcyAtIHRoaXMuZnJvbTtcbiAgICAgICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiBtb3VudGVkLm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHNpZGUgPiAwID8gZnJvbSA8PSByUG9zIDogZnJvbSA8IHJQb3MpICYmXG4gICAgICAgICAgICAgICAgICAgIChzaWRlIDwgMCA/IHRvID49IHJQb3MgOiB0byA+IHJQb3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKG1vdW50ZWQudHJlZSwgbW91bnRlZC5vdmVybGF5WzBdLmZyb20gKyB0aGlzLmZyb20sIC0xLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0Q2hpbGQoMCwgMSwgcG9zLCBzaWRlLCBtb2RlKTtcbiAgICB9XG4gICAgbmV4dFNpZ25pZmljYW50UGFyZW50KCkge1xuICAgICAgICBsZXQgdmFsID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHZhbC50eXBlLmlzQW5vbnltb3VzICYmIHZhbC5fcGFyZW50KVxuICAgICAgICAgICAgdmFsID0gdmFsLl9wYXJlbnQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCkgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbmV4dFNpYmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgJiYgdGhpcy5pbmRleCA+PSAwID8gdGhpcy5fcGFyZW50Lm5leHRDaGlsZCh0aGlzLmluZGV4ICsgMSwgMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBwcmV2U2libGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCAmJiB0aGlzLmluZGV4ID49IDAgPyB0aGlzLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuaW5kZXggLSAxLCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCB0cmVlKCkgeyByZXR1cm4gdGhpcy5fdHJlZTsgfVxuICAgIHRvVHJlZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5fdHJlZS50b1N0cmluZygpOyB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZHJlbihub2RlLCB0eXBlLCBiZWZvcmUsIGFmdGVyKSB7XG4gICAgbGV0IGN1ciA9IG5vZGUuY3Vyc29yKCksIHJlc3VsdCA9IFtdO1xuICAgIGlmICghY3VyLmZpcnN0Q2hpbGQoKSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoYmVmb3JlICE9IG51bGwpXG4gICAgICAgIGZvciAobGV0IGZvdW5kID0gZmFsc2U7ICFmb3VuZDspIHtcbiAgICAgICAgICAgIGZvdW5kID0gY3VyLnR5cGUuaXMoYmVmb3JlKTtcbiAgICAgICAgICAgIGlmICghY3VyLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGFmdGVyICE9IG51bGwgJiYgY3VyLnR5cGUuaXMoYWZ0ZXIpKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgaWYgKGN1ci50eXBlLmlzKHR5cGUpKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VyLm5vZGUpO1xuICAgICAgICBpZiAoIWN1ci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgcmV0dXJuIGFmdGVyID09IG51bGwgPyByZXN1bHQgOiBbXTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXRjaE5vZGVDb250ZXh0KG5vZGUsIGNvbnRleHQsIGkgPSBjb250ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICBmb3IgKGxldCBwID0gbm9kZTsgaSA+PSAwOyBwID0gcC5wYXJlbnQpIHtcbiAgICAgICAgaWYgKCFwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXAudHlwZS5pc0Fub255bW91cykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaV0gJiYgY29udGV4dFtpXSAhPSBwLm5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuY2xhc3MgQnVmZmVyQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBidWZmZXIsIGluZGV4LCBzdGFydCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIH1cbn1cbmNsYXNzIEJ1ZmZlck5vZGUgZXh0ZW5kcyBCYXNlTm9kZSB7XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLnR5cGUubmFtZTsgfVxuICAgIGdldCBmcm9tKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LnN0YXJ0ICsgdGhpcy5jb250ZXh0LmJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDFdOyB9XG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LnN0YXJ0ICsgdGhpcy5jb250ZXh0LmJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDJdOyB9XG4gICAgY29uc3RydWN0b3IoY29udGV4dCwgX3BhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnR5cGUgPSBjb250ZXh0LmJ1ZmZlci5zZXQudHlwZXNbY29udGV4dC5idWZmZXIuYnVmZmVyW2luZGV4XV07XG4gICAgfVxuICAgIGNoaWxkKGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgaW5kZXggPSBidWZmZXIuZmluZENoaWxkKHRoaXMuaW5kZXggKyA0LCBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXSwgZGlyLCBwb3MgLSB0aGlzLmNvbnRleHQuc3RhcnQsIHNpZGUpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gbnVsbCA6IG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcywgaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY2hpbGQoMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNoaWxkKC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMuY2hpbGQoMSwgcG9zLCAyIC8qIFNpZGUuQWZ0ZXIgKi8pOyB9XG4gICAgY2hpbGRCZWZvcmUocG9zKSB7IHJldHVybiB0aGlzLmNoaWxkKC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IDApIHtcbiAgICAgICAgaWYgKG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGluZGV4ID0gYnVmZmVyLmZpbmRDaGlsZCh0aGlzLmluZGV4ICsgNCwgYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM10sIHNpZGUgPiAwID8gMSA6IC0xLCBwb3MgLSB0aGlzLmNvbnRleHQuc3RhcnQsIHNpZGUpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gbnVsbCA6IG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcywgaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50IHx8IHRoaXMuY29udGV4dC5wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCk7XG4gICAgfVxuICAgIGV4dGVybmFsU2libGluZyhkaXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IG51bGwgOiB0aGlzLmNvbnRleHQucGFyZW50Lm5leHRDaGlsZCh0aGlzLmNvbnRleHQuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTtcbiAgICB9XG4gICAgZ2V0IG5leHRTaWJsaW5nKCkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGFmdGVyID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgIGlmIChhZnRlciA8ICh0aGlzLl9wYXJlbnQgPyBidWZmZXIuYnVmZmVyW3RoaXMuX3BhcmVudC5pbmRleCArIDNdIDogYnVmZmVyLmJ1ZmZlci5sZW5ndGgpKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcy5fcGFyZW50LCBhZnRlcik7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dGVybmFsU2libGluZygxKTtcbiAgICB9XG4gICAgZ2V0IHByZXZTaWJsaW5nKCkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHBhcmVudFN0YXJ0ID0gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmluZGV4ICsgNCA6IDA7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09IHBhcmVudFN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZXJuYWxTaWJsaW5nKC0xKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcy5fcGFyZW50LCBidWZmZXIuZmluZENoaWxkKHBhcmVudFN0YXJ0LCB0aGlzLmluZGV4LCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSk7XG4gICAgfVxuICAgIGdldCB0cmVlKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIHRvVHJlZSgpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHN0YXJ0SSA9IHRoaXMuaW5kZXggKyA0LCBlbmRJID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgIGlmIChlbmRJID4gc3RhcnRJKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDFdO1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChidWZmZXIuc2xpY2Uoc3RhcnRJLCBlbmRJLCBmcm9tKSk7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyZWUodGhpcy50eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCB0aGlzLnRvIC0gdGhpcy5mcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5idWZmZXIuY2hpbGRTdHJpbmcodGhpcy5pbmRleCk7IH1cbn1cbmZ1bmN0aW9uIGl0ZXJTdGFjayhoZWFkcykge1xuICAgIGlmICghaGVhZHMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcGljayA9IDAsIHBpY2tlZCA9IGhlYWRzWzBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaGVhZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBoZWFkc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuZnJvbSA+IHBpY2tlZC5mcm9tIHx8IG5vZGUudG8gPCBwaWNrZWQudG8pIHtcbiAgICAgICAgICAgIHBpY2tlZCA9IG5vZGU7XG4gICAgICAgICAgICBwaWNrID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgbmV4dCA9IHBpY2tlZCBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIHBpY2tlZC5pbmRleCA8IDAgPyBudWxsIDogcGlja2VkLnBhcmVudDtcbiAgICBsZXQgbmV3SGVhZHMgPSBoZWFkcy5zbGljZSgpO1xuICAgIGlmIChuZXh0KVxuICAgICAgICBuZXdIZWFkc1twaWNrXSA9IG5leHQ7XG4gICAgZWxzZVxuICAgICAgICBuZXdIZWFkcy5zcGxpY2UocGljaywgMSk7XG4gICAgcmV0dXJuIG5ldyBTdGFja0l0ZXJhdG9yKG5ld0hlYWRzLCBwaWNrZWQpO1xufVxuY2xhc3MgU3RhY2tJdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IoaGVhZHMsIG5vZGUpIHtcbiAgICAgICAgdGhpcy5oZWFkcyA9IGhlYWRzO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbiAgICBnZXQgbmV4dCgpIHsgcmV0dXJuIGl0ZXJTdGFjayh0aGlzLmhlYWRzKTsgfVxufVxuZnVuY3Rpb24gc3RhY2tJdGVyYXRvcih0cmVlLCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgaW5uZXIgPSB0cmVlLnJlc29sdmVJbm5lcihwb3MsIHNpZGUpLCBsYXllcnMgPSBudWxsO1xuICAgIGZvciAobGV0IHNjYW4gPSBpbm5lciBpbnN0YW5jZW9mIFRyZWVOb2RlID8gaW5uZXIgOiBpbm5lci5jb250ZXh0LnBhcmVudDsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50KSB7XG4gICAgICAgIGlmIChzY2FuLmluZGV4IDwgMCkgeyAvLyBUaGlzIGlzIGFuIG92ZXJsYXkgcm9vdFxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHNjYW4ucGFyZW50O1xuICAgICAgICAgICAgKGxheWVycyB8fCAobGF5ZXJzID0gW2lubmVyXSkpLnB1c2gocGFyZW50LnJlc29sdmUocG9zLCBzaWRlKSk7XG4gICAgICAgICAgICBzY2FuID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1vdW50ID0gTW91bnRlZFRyZWUuZ2V0KHNjYW4udHJlZSk7XG4gICAgICAgICAgICAvLyBSZWxldmFudCBvdmVybGF5IGJyYW5jaGluZyBvZmZcbiAgICAgICAgICAgIGlmIChtb3VudCAmJiBtb3VudC5vdmVybGF5ICYmIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSA8PSBwb3MgJiYgbW91bnQub3ZlcmxheVttb3VudC5vdmVybGF5Lmxlbmd0aCAtIDFdLnRvID49IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCByb290ID0gbmV3IFRyZWVOb2RlKG1vdW50LnRyZWUsIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSArIHNjYW4uZnJvbSwgLTEsIHNjYW4pO1xuICAgICAgICAgICAgICAgIChsYXllcnMgfHwgKGxheWVycyA9IFtpbm5lcl0pKS5wdXNoKHJlc29sdmVOb2RlKHJvb3QsIHBvcywgc2lkZSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF5ZXJzID8gaXRlclN0YWNrKGxheWVycykgOiBpbm5lcjtcbn1cbi8qKlxuQSB0cmVlIGN1cnNvciBvYmplY3QgZm9jdXNlcyBvbiBhIGdpdmVuIG5vZGUgaW4gYSBzeW50YXggdHJlZSwgYW5kXG5hbGxvd3MgeW91IHRvIG1vdmUgdG8gYWRqYWNlbnQgbm9kZXMuXG4qL1xuY2xhc3MgVHJlZUN1cnNvciB7XG4gICAgLyoqXG4gICAgU2hvcnRoYW5kIGZvciBgLnR5cGUubmFtZWAuXG4gICAgKi9cbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMudHlwZS5uYW1lOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1vZGUgPSAwKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyTm9kZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMueWllbGROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdHJlZSA9IG5vZGUuY29udGV4dC5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSBub2RlLl9wYXJlbnQ7IG47IG4gPSBuLl9wYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay51bnNoaWZ0KG4uaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJOb2RlID0gbm9kZTtcbiAgICAgICAgICAgIHRoaXMueWllbGRCdWYobm9kZS5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeWllbGROb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLl90cmVlID0gbm9kZTtcbiAgICAgICAgdGhpcy50eXBlID0gbm9kZS50eXBlO1xuICAgICAgICB0aGlzLmZyb20gPSBub2RlLmZyb207XG4gICAgICAgIHRoaXMudG8gPSBub2RlLnRvO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgeWllbGRCdWYoaW5kZXgsIHR5cGUpIHtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICBsZXQgeyBzdGFydCwgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCBidWZmZXIuc2V0LnR5cGVzW2J1ZmZlci5idWZmZXJbaW5kZXhdXTtcbiAgICAgICAgdGhpcy5mcm9tID0gc3RhcnQgKyBidWZmZXIuYnVmZmVyW2luZGV4ICsgMV07XG4gICAgICAgIHRoaXMudG8gPSBzdGFydCArIGJ1ZmZlci5idWZmZXJbaW5kZXggKyAyXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgeWllbGQobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkTm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYobm9kZS5pbmRleCwgbm9kZS50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuYnVmZmVyLmNoaWxkU3RyaW5nKHRoaXMuaW5kZXgpIDogdGhpcy5fdHJlZS50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVudGVyQ2hpbGQoZGlyLCBwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkKHRoaXMuX3RyZWUubmV4dENoaWxkKGRpciA8IDAgPyB0aGlzLl90cmVlLl90cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDEgOiAwLCBkaXIsIHBvcywgc2lkZSwgdGhpcy5tb2RlKSk7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGxldCBpbmRleCA9IGJ1ZmZlci5maW5kQ2hpbGQodGhpcy5pbmRleCArIDQsIGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdLCBkaXIsIHBvcyAtIHRoaXMuYnVmZmVyLnN0YXJ0LCBzaWRlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuaW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGlzIG5vZGUncyBmaXJzdCBjaGlsZC4gV2hlbiB0aGlzIHJldHVybnNcbiAgICBmYWxzZSwgdGhlIG5vZGUgaGFzIG5vIGNoaWxkLCBhbmQgdGhlIGN1cnNvciBoYXMgbm90IGJlZW4gbW92ZWQuXG4gICAgKi9cbiAgICBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhpcyBub2RlJ3MgbGFzdCBjaGlsZC5cbiAgICAqL1xuICAgIGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgY2hpbGQgdGhhdCBlbmRzIGFmdGVyIGBwb3NgLlxuICAgICovXG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBsYXN0IGNoaWxkIHRoYXQgc3RhcnRzIGJlZm9yZSBgcG9zYC5cbiAgICAqL1xuICAgIGNoaWxkQmVmb3JlKHBvcykgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgY2hpbGQgYXJvdW5kIGBwb3NgLiBJZiBzaWRlIGlzIC0xIHRoZVxuICAgIGNoaWxkIG1heSBlbmQgYXQgdGhhdCBwb3NpdGlvbiwgd2hlbiAxIGl0IG1heSBzdGFydCB0aGVyZS4gVGhpc1xuICAgIHdpbGwgYWxzbyBlbnRlciBbb3ZlcmxhaWRdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSlcbiAgICBbbW91bnRlZF0oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSB0cmVlcyB1bmxlc3MgYG92ZXJsYXlzYCBpc1xuICAgIHNldCB0byBmYWxzZS5cbiAgICAqL1xuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IHRoaXMubW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGQodGhpcy5fdHJlZS5lbnRlcihwb3MsIHNpZGUsIG1vZGUpKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycyA/IGZhbHNlIDogdGhpcy5lbnRlckNoaWxkKDEsIHBvcywgc2lkZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5vZGUncyBwYXJlbnQgbm9kZSwgaWYgdGhpcyBpc24ndCB0aGUgdG9wIG5vZGUuXG4gICAgKi9cbiAgICBwYXJlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUoKHRoaXMubW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpID8gdGhpcy5fdHJlZS5fcGFyZW50IDogdGhpcy5fdHJlZS5wYXJlbnQpO1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1Zih0aGlzLnN0YWNrLnBvcCgpKTtcbiAgICAgICAgbGV0IHBhcmVudCA9ICh0aGlzLm1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSA/IHRoaXMuYnVmZmVyLnBhcmVudCA6IHRoaXMuYnVmZmVyLnBhcmVudC5uZXh0U2lnbmlmaWNhbnRQYXJlbnQoKTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUocGFyZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaWJsaW5nKGRpcikge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLl90cmVlLl9wYXJlbnQgPyBmYWxzZVxuICAgICAgICAgICAgICAgIDogdGhpcy55aWVsZCh0aGlzLl90cmVlLmluZGV4IDwgMCA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl90cmVlLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuX3RyZWUuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovLCB0aGlzLm1vZGUpKTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlciwgZCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGRpciA8IDApIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRTdGFydCA9IGQgPCAwID8gMCA6IHRoaXMuc3RhY2tbZF0gKyA0O1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggIT0gcGFyZW50U3RhcnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYoYnVmZmVyLmZpbmRDaGlsZChwYXJlbnRTdGFydCwgdGhpcy5pbmRleCwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgICAgICBpZiAoYWZ0ZXIgPCAoZCA8IDAgPyBidWZmZXIuYnVmZmVyLmxlbmd0aCA6IGJ1ZmZlci5idWZmZXJbdGhpcy5zdGFja1tkXSArIDNdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihhZnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQgPCAwID8gdGhpcy55aWVsZCh0aGlzLmJ1ZmZlci5wYXJlbnQubmV4dENoaWxkKHRoaXMuYnVmZmVyLmluZGV4ICsgZGlyLCBkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLywgdGhpcy5tb2RlKSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGlzIG5vZGUncyBuZXh0IHNpYmxpbmcsIGlmIGFueS5cbiAgICAqL1xuICAgIG5leHRTaWJsaW5nKCkgeyByZXR1cm4gdGhpcy5zaWJsaW5nKDEpOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGlzIG5vZGUncyBwcmV2aW91cyBzaWJsaW5nLCBpZiBhbnkuXG4gICAgKi9cbiAgICBwcmV2U2libGluZygpIHsgcmV0dXJuIHRoaXMuc2libGluZygtMSk7IH1cbiAgICBhdExhc3ROb2RlKGRpcikge1xuICAgICAgICBsZXQgaW5kZXgsIHBhcmVudCwgeyBidWZmZXIgfSA9IHRoaXM7XG4gICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICAgIGlmIChkaXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPCBidWZmZXIuYnVmZmVyLmJ1ZmZlci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmRleDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmJ1ZmZlci5idWZmZXJbaSArIDNdIDwgdGhpcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICh7IGluZGV4LCBwYXJlbnQgfSA9IGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoeyBpbmRleCwgX3BhcmVudDogcGFyZW50IH0gPSB0aGlzLl90cmVlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgcGFyZW50OyB7IGluZGV4LCBfcGFyZW50OiBwYXJlbnQgfSA9IHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ICsgZGlyLCBlID0gZGlyIDwgMCA/IC0xIDogcGFyZW50Ll90cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSAhPSBlOyBpICs9IGRpcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnQuX3RyZWUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5tb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkIGluc3RhbmNlb2YgVHJlZUJ1ZmZlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIWNoaWxkLnR5cGUuaXNBbm9ueW1vdXMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1vdmUoZGlyLCBlbnRlcikge1xuICAgICAgICBpZiAoZW50ZXIgJiYgdGhpcy5lbnRlckNoaWxkKGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaWJsaW5nKGRpcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5hdExhc3ROb2RlKGRpcikgfHwgIXRoaXMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbm9kZSBpbiBhXG4gICAgW3ByZS1vcmRlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJlZV90cmF2ZXJzYWwjUHJlLW9yZGVyLF9OTFIpXG4gICAgdHJhdmVyc2FsLCBnb2luZyBmcm9tIGEgbm9kZSB0byBpdHMgZmlyc3QgY2hpbGQgb3IsIGlmIHRoZVxuICAgIGN1cnJlbnQgbm9kZSBpcyBlbXB0eSBvciBgZW50ZXJgIGlzIGZhbHNlLCBpdHMgbmV4dCBzaWJsaW5nIG9yXG4gICAgdGhlIG5leHQgc2libGluZyBvZiB0aGUgZmlyc3QgcGFyZW50IG5vZGUgdGhhdCBoYXMgb25lLlxuICAgICovXG4gICAgbmV4dChlbnRlciA9IHRydWUpIHsgcmV0dXJuIHRoaXMubW92ZSgxLCBlbnRlcik7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IG5vZGUgaW4gYSBsYXN0LXRvLWZpcnN0IHByZS1vcmRlciB0cmF2ZXJzYWwuIEFcbiAgICBub2RlIGlzIGZvbGxvd2VkIGJ5IGl0cyBsYXN0IGNoaWxkIG9yLCBpZiBpdCBoYXMgbm9uZSwgaXRzXG4gICAgcHJldmlvdXMgc2libGluZyBvciB0aGUgcHJldmlvdXMgc2libGluZyBvZiB0aGUgZmlyc3QgcGFyZW50XG4gICAgbm9kZSB0aGF0IGhhcyBvbmUuXG4gICAgKi9cbiAgICBwcmV2KGVudGVyID0gdHJ1ZSkgeyByZXR1cm4gdGhpcy5tb3ZlKC0xLCBlbnRlcik7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGlubmVybW9zdCBub2RlIHRoYXQgY292ZXJzIGBwb3NgLiBJZlxuICAgIGBzaWRlYCBpcyAtMSwgaXQgd2lsbCBlbnRlciBub2RlcyB0aGF0IGVuZCBhdCBgcG9zYC4gSWYgaXQgaXMgMSxcbiAgICBpdCB3aWxsIGVudGVyIG5vZGVzIHRoYXQgc3RhcnQgYXQgYHBvc2AuXG4gICAgKi9cbiAgICBtb3ZlVG8ocG9zLCBzaWRlID0gMCkge1xuICAgICAgICAvLyBNb3ZlIHVwIHRvIGEgbm9kZSB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSBwb3NpdGlvbiwgaWYgcG9zc2libGVcbiAgICAgICAgd2hpbGUgKHRoaXMuZnJvbSA9PSB0aGlzLnRvIHx8XG4gICAgICAgICAgICAoc2lkZSA8IDEgPyB0aGlzLmZyb20gPj0gcG9zIDogdGhpcy5mcm9tID4gcG9zKSB8fFxuICAgICAgICAgICAgKHNpZGUgPiAtMSA/IHRoaXMudG8gPD0gcG9zIDogdGhpcy50byA8IHBvcykpXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFRoZW4gc2NhbiBkb3duIGludG8gY2hpbGQgbm9kZXMgYXMgZmFyIGFzIHBvc3NpYmxlXG4gICAgICAgIHdoaWxlICh0aGlzLmVudGVyQ2hpbGQoMSwgcG9zLCBzaWRlKSkgeyB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgYXQgdGhlIGN1cnNvcidzIGN1cnJlbnRcbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGdldCBub2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyZWU7XG4gICAgICAgIGxldCBjYWNoZSA9IHRoaXMuYnVmZmVyTm9kZSwgcmVzdWx0ID0gbnVsbCwgZGVwdGggPSAwO1xuICAgICAgICBpZiAoY2FjaGUgJiYgY2FjaGUuY29udGV4dCA9PSB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgc2NhbjogZm9yIChsZXQgaW5kZXggPSB0aGlzLmluZGV4LCBkID0gdGhpcy5zdGFjay5sZW5ndGg7IGQgPj0gMDspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gY2FjaGU7IGM7IGMgPSBjLl9wYXJlbnQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLmluZGV4ID09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IGQgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5zdGFja1stLWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBkZXB0aDsgaSA8IHRoaXMuc3RhY2subGVuZ3RoOyBpKyspXG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgQnVmZmVyTm9kZSh0aGlzLmJ1ZmZlciwgcmVzdWx0LCB0aGlzLnN0YWNrW2ldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTm9kZSA9IG5ldyBCdWZmZXJOb2RlKHRoaXMuYnVmZmVyLCByZXN1bHQsIHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIFt0cmVlXSgjY29tbW9uLlRyZWUpIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBub2RlLCBpZlxuICAgIGFueS4gV2lsbCByZXR1cm4gbnVsbCB3aGVuIHRoZSBub2RlIGlzIGluIGEgW3RyZWVcbiAgICBidWZmZXJdKCNjb21tb24uVHJlZUJ1ZmZlcikuXG4gICAgKi9cbiAgICBnZXQgdHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gbnVsbCA6IHRoaXMuX3RyZWUuX3RyZWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgY3VycmVudCBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzLCBjYWxsaW5nXG4gICAgYGVudGVyYCB3aGVuIGVudGVyaW5nIGEgbm9kZSBhbmQgYGxlYXZlYCwgaWYgZ2l2ZW4sIHdoZW4gbGVhdmluZ1xuICAgIG9uZS4gV2hlbiBgZW50ZXJgIHJldHVybnMgYGZhbHNlYCwgYW55IGNoaWxkcmVuIG9mIHRoYXQgbm9kZSBhcmVcbiAgICBza2lwcGVkLCBhbmQgYGxlYXZlYCBpc24ndCBjYWxsZWQgZm9yIGl0LlxuICAgICovXG4gICAgaXRlcmF0ZShlbnRlciwgbGVhdmUpIHtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBtdXN0TGVhdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUuaXNBbm9ueW1vdXMgfHwgZW50ZXIodGhpcykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHlwZS5pc0Fub255bW91cylcbiAgICAgICAgICAgICAgICAgICAgbXVzdExlYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAobXVzdExlYXZlICYmIGxlYXZlKVxuICAgICAgICAgICAgICAgICAgICBsZWF2ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0aGlzLnR5cGUuaXNBbm9ueW1vdXM7XG4gICAgICAgICAgICAgICAgaWYgKCFkZXB0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGUgY3VycmVudCBub2RlIG1hdGNoZXMgYSBnaXZlbiBjb250ZXh0XHUyMDE0YSBzZXF1ZW5jZVxuICAgIG9mIGRpcmVjdCBwYXJlbnQgbm9kZSBuYW1lcy4gRW1wdHkgc3RyaW5ncyBpbiB0aGUgY29udGV4dCBhcnJheVxuICAgIGFyZSB0cmVhdGVkIGFzIHdpbGRjYXJkcy5cbiAgICAqL1xuICAgIG1hdGNoQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLm5vZGUucGFyZW50LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlciwgeyB0eXBlcyB9ID0gYnVmZmVyLnNldDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbnRleHQubGVuZ3RoIC0gMSwgZCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGlmIChkIDwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLl90cmVlLCBjb250ZXh0LCBpKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbYnVmZmVyLmJ1ZmZlclt0aGlzLnN0YWNrW2RdXV07XG4gICAgICAgICAgICBpZiAoIXR5cGUuaXNBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dFtpXSAmJiBjb250ZXh0W2ldICE9IHR5cGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNDaGlsZCh0cmVlKSB7XG4gICAgcmV0dXJuIHRyZWUuY2hpbGRyZW4uc29tZShjaCA9PiBjaCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHwgIWNoLnR5cGUuaXNBbm9ueW1vdXMgfHwgaGFzQ2hpbGQoY2gpKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVHJlZShkYXRhKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCB7IGJ1ZmZlciwgbm9kZVNldCwgbWF4QnVmZmVyTGVuZ3RoID0gRGVmYXVsdEJ1ZmZlckxlbmd0aCwgcmV1c2VkID0gW10sIG1pblJlcGVhdFR5cGUgPSBub2RlU2V0LnR5cGVzLmxlbmd0aCB9ID0gZGF0YTtcbiAgICBsZXQgY3Vyc29yID0gQXJyYXkuaXNBcnJheShidWZmZXIpID8gbmV3IEZsYXRCdWZmZXJDdXJzb3IoYnVmZmVyLCBidWZmZXIubGVuZ3RoKSA6IGJ1ZmZlcjtcbiAgICBsZXQgdHlwZXMgPSBub2RlU2V0LnR5cGVzO1xuICAgIGxldCBjb250ZXh0SGFzaCA9IDAsIGxvb2tBaGVhZCA9IDA7XG4gICAgZnVuY3Rpb24gdGFrZU5vZGUocGFyZW50U3RhcnQsIG1pblBvcywgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5SZXBlYXQsIGRlcHRoKSB7XG4gICAgICAgIGxldCB7IGlkLCBzdGFydCwgZW5kLCBzaXplIH0gPSBjdXJzb3I7XG4gICAgICAgIGxldCBsb29rQWhlYWRBdFN0YXJ0ID0gbG9va0FoZWFkLCBjb250ZXh0QXRTdGFydCA9IGNvbnRleHRIYXNoO1xuICAgICAgICB3aGlsZSAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PSAtMSAvKiBTcGVjaWFsUmVjb3JkLlJldXNlICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSByZXVzZWRbaWRdO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnQgLSBwYXJlbnRTdGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pIHsgLy8gQ29udGV4dCBjaGFuZ2VcbiAgICAgICAgICAgICAgICBjb250ZXh0SGFzaCA9IGlkO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTQgLyogU3BlY2lhbFJlY29yZC5Mb29rQWhlYWQgKi8pIHtcbiAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5yZWNvZ25pemVkIHJlY29yZCBzaXplOiAke3NpemV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpZF0sIG5vZGUsIGJ1ZmZlcjtcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gc3RhcnQgLSBwYXJlbnRTdGFydDtcbiAgICAgICAgaWYgKGVuZCAtIHN0YXJ0IDw9IG1heEJ1ZmZlckxlbmd0aCAmJiAoYnVmZmVyID0gZmluZEJ1ZmZlclNpemUoY3Vyc29yLnBvcyAtIG1pblBvcywgaW5SZXBlYXQpKSkge1xuICAgICAgICAgICAgLy8gU21hbGwgZW5vdWdoIGZvciBhIGJ1ZmZlciwgYW5kIG5vIHJldXNlZCBub2RlcyBpbnNpZGVcbiAgICAgICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQxNkFycmF5KGJ1ZmZlci5zaXplIC0gYnVmZmVyLnNraXApO1xuICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSBidWZmZXIuc2l6ZSwgaW5kZXggPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gZW5kUG9zKVxuICAgICAgICAgICAgICAgIGluZGV4ID0gY29weVRvQnVmZmVyKGJ1ZmZlci5zdGFydCwgZGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgbm9kZSA9IG5ldyBUcmVlQnVmZmVyKGRhdGEsIGVuZCAtIGJ1ZmZlci5zdGFydCwgbm9kZVNldCk7XG4gICAgICAgICAgICBzdGFydFBvcyA9IGJ1ZmZlci5zdGFydCAtIHBhcmVudFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBNYWtlIGl0IGEgbm9kZVxuICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSBzaXplO1xuICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgICAgICAgICBsZXQgbG9jYWxJblJlcGVhdCA9IGlkID49IG1pblJlcGVhdFR5cGUgPyBpZCA6IC0xO1xuICAgICAgICAgICAgbGV0IGxhc3RHcm91cCA9IDAsIGxhc3RFbmQgPSBlbmQ7XG4gICAgICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IGVuZFBvcykge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID49IDAgJiYgY3Vyc29yLmlkID09IGxvY2FsSW5SZXBlYXQgJiYgY3Vyc29yLnNpemUgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmVuZCA8PSBsYXN0RW5kIC0gbWF4QnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlUmVwZWF0TGVhZihsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgc3RhcnQsIGxhc3RHcm91cCwgY3Vyc29yLmVuZCwgbGFzdEVuZCwgbG9jYWxJblJlcGVhdCwgbG9va0FoZWFkQXRTdGFydCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdyb3VwID0gbG9jYWxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW5kID0gY3Vyc29yLmVuZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXB0aCA+IDI1MDAgLyogQ3V0T2ZmLkRlcHRoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHRha2VGbGF0Tm9kZShzdGFydCwgZW5kUG9zLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YWtlTm9kZShzdGFydCwgZW5kUG9zLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgbG9jYWxJblJlcGVhdCwgZGVwdGggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobG9jYWxJblJlcGVhdCA+PSAwICYmIGxhc3RHcm91cCA+IDAgJiYgbGFzdEdyb3VwIDwgbG9jYWxDaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgbWFrZVJlcGVhdExlYWYobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIHN0YXJ0LCBsYXN0R3JvdXAsIHN0YXJ0LCBsYXN0RW5kLCBsb2NhbEluUmVwZWF0LCBsb29rQWhlYWRBdFN0YXJ0LCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICBsb2NhbENoaWxkcmVuLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb25zLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID4gLTEgJiYgbGFzdEdyb3VwID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBtYWtlID0gbWFrZUJhbGFuY2VkKHR5cGUsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgICAgICBub2RlID0gYmFsYW5jZVJhbmdlKHR5cGUsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCAwLCBsb2NhbENoaWxkcmVuLmxlbmd0aCwgMCwgZW5kIC0gc3RhcnQsIG1ha2UsIG1ha2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG1ha2VUcmVlKHR5cGUsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBlbmQgLSBzdGFydCwgbG9va0FoZWFkQXRTdGFydCAtIGVuZCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0UG9zKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGFrZUZsYXROb2RlKHBhcmVudFN0YXJ0LCBtaW5Qb3MsIGNoaWxkcmVuLCBwb3NpdGlvbnMpIHtcbiAgICAgICAgbGV0IG5vZGVzID0gW107IC8vIFRlbXBvcmFyeSwgaW52ZXJ0ZWQgYXJyYXkgb2YgbGVhZiBub2RlcyBmb3VuZCwgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbnNcbiAgICAgICAgbGV0IG5vZGVDb3VudCA9IDAsIHN0b3BBdCA9IC0xO1xuICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IG1pblBvcykge1xuICAgICAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgICAgIGlmIChzaXplID4gNCkgeyAvLyBOb3QgYSBsZWFmXG4gICAgICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0b3BBdCA+IC0xICYmIHN0YXJ0IDwgc3RvcEF0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcEF0IDwgMClcbiAgICAgICAgICAgICAgICAgICAgc3RvcEF0ID0gZW5kIC0gbWF4QnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2goaWQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgICAgIG5vZGVDb3VudCsrO1xuICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVDb3VudCkge1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50MTZBcnJheShub2RlQ291bnQgKiA0KTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5vZGVzLmxlbmd0aCAtIDMsIGogPSAwOyBpID49IDA7IGkgLT0gMykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbm9kZXNbaV07XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBub2Rlc1tpICsgMV0gLSBzdGFydDtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IG5vZGVzW2kgKyAyXSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobmV3IFRyZWVCdWZmZXIoYnVmZmVyLCBub2Rlc1syXSAtIHN0YXJ0LCBub2RlU2V0KSk7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChzdGFydCAtIHBhcmVudFN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlQmFsYW5jZWQodHlwZSwgY29udGV4dEhhc2gpIHtcbiAgICAgICAgcmV0dXJuIChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IHtcbiAgICAgICAgICAgIGxldCBsb29rQWhlYWQgPSAwLCBsYXN0SSA9IGNoaWxkcmVuLmxlbmd0aCAtIDEsIGxhc3QsIGxvb2tBaGVhZFByb3A7XG4gICAgICAgICAgICBpZiAobGFzdEkgPj0gMCAmJiAobGFzdCA9IGNoaWxkcmVuW2xhc3RJXSkgaW5zdGFuY2VvZiBUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsYXN0SSAmJiBsYXN0LnR5cGUgPT0gdHlwZSAmJiBsYXN0Lmxlbmd0aCA9PSBsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICAgICAgICAgIGlmIChsb29rQWhlYWRQcm9wID0gbGFzdC5wcm9wKE5vZGVQcm9wLmxvb2tBaGVhZCkpXG4gICAgICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IHBvc2l0aW9uc1tsYXN0SV0gKyBsYXN0Lmxlbmd0aCArIGxvb2tBaGVhZFByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFrZVRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCBsb29rQWhlYWQsIGNvbnRleHRIYXNoKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZVJlcGVhdExlYWYoY2hpbGRyZW4sIHBvc2l0aW9ucywgYmFzZSwgaSwgZnJvbSwgdG8sIHR5cGUsIGxvb2tBaGVhZCwgY29udGV4dEhhc2gpIHtcbiAgICAgICAgbGV0IGxvY2FsQ2hpbGRyZW4gPSBbXSwgbG9jYWxQb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgd2hpbGUgKGNoaWxkcmVuLmxlbmd0aCA+IGkpIHtcbiAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaChjaGlsZHJlbi5wb3AoKSk7XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5wdXNoKHBvc2l0aW9ucy5wb3AoKSArIGJhc2UgLSBmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5wdXNoKG1ha2VUcmVlKG5vZGVTZXQudHlwZXNbdHlwZV0sIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCB0byAtIGZyb20sIGxvb2tBaGVhZCAtIHRvLCBjb250ZXh0SGFzaCkpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gYmFzZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgbG9va0FoZWFkLCBjb250ZXh0SGFzaCwgcHJvcHMpIHtcbiAgICAgICAgaWYgKGNvbnRleHRIYXNoKSB7XG4gICAgICAgICAgICBsZXQgcGFpciA9IFtOb2RlUHJvcC5jb250ZXh0SGFzaCwgY29udGV4dEhhc2hdO1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyA/IFtwYWlyXS5jb25jYXQocHJvcHMpIDogW3BhaXJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb29rQWhlYWQgPiAyNSkge1xuICAgICAgICAgICAgbGV0IHBhaXIgPSBbTm9kZVByb3AubG9va0FoZWFkLCBsb29rQWhlYWRdO1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyA/IFtwYWlyXS5jb25jYXQocHJvcHMpIDogW3BhaXJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIHByb3BzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZEJ1ZmZlclNpemUobWF4U2l6ZSwgaW5SZXBlYXQpIHtcbiAgICAgICAgLy8gU2NhbiB0aHJvdWdoIHRoZSBidWZmZXIgdG8gZmluZCBwcmV2aW91cyBzaWJsaW5ncyB0aGF0IGZpdFxuICAgICAgICAvLyB0b2dldGhlciBpbiBhIFRyZWVCdWZmZXIsIGFuZCBkb24ndCBjb250YWluIGFueSByZXVzZWQgbm9kZXNcbiAgICAgICAgLy8gKHdoaWNoIGNhbid0IGJlIHN0b3JlZCBpbiBhIGJ1ZmZlcikuXG4gICAgICAgIC8vIElmIGBpblJlcGVhdGAgaXMgPiAtMSwgaWdub3JlIG5vZGUgYm91bmRhcmllcyBvZiB0aGF0IHR5cGUgZm9yXG4gICAgICAgIC8vIG5lc3RpbmcsIGJ1dCBtYWtlIHN1cmUgdGhlIGVuZCBmYWxscyBlaXRoZXIgYXQgdGhlIHN0YXJ0XG4gICAgICAgIC8vIChgbWF4U2l6ZWApIG9yIGJlZm9yZSBzdWNoIGEgbm9kZS5cbiAgICAgICAgbGV0IGZvcmsgPSBjdXJzb3IuZm9yaygpO1xuICAgICAgICBsZXQgc2l6ZSA9IDAsIHN0YXJ0ID0gMCwgc2tpcCA9IDAsIG1pblN0YXJ0ID0gZm9yay5lbmQgLSBtYXhCdWZmZXJMZW5ndGg7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHNpemU6IDAsIHN0YXJ0OiAwLCBza2lwOiAwIH07XG4gICAgICAgIHNjYW46IGZvciAobGV0IG1pblBvcyA9IGZvcmsucG9zIC0gbWF4U2l6ZTsgZm9yay5wb3MgPiBtaW5Qb3M7KSB7XG4gICAgICAgICAgICBsZXQgbm9kZVNpemUgPSBmb3JrLnNpemU7XG4gICAgICAgICAgICAvLyBQcmV0ZW5kIG5lc3RlZCByZXBlYXQgbm9kZXMgb2YgdGhlIHNhbWUgdHlwZSBkb24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKGZvcmsuaWQgPT0gaW5SZXBlYXQgJiYgbm9kZVNpemUgPj0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2VwdCB0aGF0IHdlIHN0b3JlIHRoZSBjdXJyZW50IHN0YXRlIGFzIGEgdmFsaWQgcmV0dXJuXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNpemUgPSBzaXplO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgIHJlc3VsdC5za2lwID0gc2tpcDtcbiAgICAgICAgICAgICAgICBza2lwICs9IDQ7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSA0O1xuICAgICAgICAgICAgICAgIGZvcmsubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0YXJ0UG9zID0gZm9yay5wb3MgLSBub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChub2RlU2l6ZSA8IDAgfHwgc3RhcnRQb3MgPCBtaW5Qb3MgfHwgZm9yay5zdGFydCA8IG1pblN0YXJ0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IGxvY2FsU2tpcHBlZCA9IGZvcmsuaWQgPj0gbWluUmVwZWF0VHlwZSA/IDQgOiAwO1xuICAgICAgICAgICAgbGV0IG5vZGVTdGFydCA9IGZvcmsuc3RhcnQ7XG4gICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgIHdoaWxlIChmb3JrLnBvcyA+IHN0YXJ0UG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcmsuc2l6ZSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmsuc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFNraXBwZWQgKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9yay5pZCA+PSBtaW5SZXBlYXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU2tpcHBlZCArPSA0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXJ0ID0gbm9kZVN0YXJ0O1xuICAgICAgICAgICAgc2l6ZSArPSBub2RlU2l6ZTtcbiAgICAgICAgICAgIHNraXAgKz0gbG9jYWxTa2lwcGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpblJlcGVhdCA8IDAgfHwgc2l6ZSA9PSBtYXhTaXplKSB7XG4gICAgICAgICAgICByZXN1bHQuc2l6ZSA9IHNpemU7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgIHJlc3VsdC5za2lwID0gc2tpcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnNpemUgPiA0ID8gcmVzdWx0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb3B5VG9CdWZmZXIoYnVmZmVyU3RhcnQsIGJ1ZmZlciwgaW5kZXgpIHtcbiAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgaWYgKHNpemUgPj0gMCAmJiBpZCA8IG1pblJlcGVhdFR5cGUpIHtcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kUG9zID0gY3Vyc29yLnBvcyAtIChzaXplIC0gNCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBlbmRQb3MpXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gY29weVRvQnVmZmVyKGJ1ZmZlclN0YXJ0LCBidWZmZXIsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IHN0YXJ0SW5kZXg7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBlbmQgLSBidWZmZXJTdGFydDtcbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IHN0YXJ0IC0gYnVmZmVyU3RhcnQ7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaXplID09IC0zIC8qIFNwZWNpYWxSZWNvcmQuQ29udGV4dENoYW5nZSAqLykge1xuICAgICAgICAgICAgY29udGV4dEhhc2ggPSBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaXplID09IC00IC8qIFNwZWNpYWxSZWNvcmQuTG9va0FoZWFkICovKSB7XG4gICAgICAgICAgICBsb29rQWhlYWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGxldCBjaGlsZHJlbiA9IFtdLCBwb3NpdGlvbnMgPSBbXTtcbiAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IDApXG4gICAgICAgIHRha2VOb2RlKGRhdGEuc3RhcnQgfHwgMCwgZGF0YS5idWZmZXJTdGFydCB8fCAwLCBjaGlsZHJlbiwgcG9zaXRpb25zLCAtMSwgMCk7XG4gICAgbGV0IGxlbmd0aCA9IChfYSA9IGRhdGEubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoY2hpbGRyZW4ubGVuZ3RoID8gcG9zaXRpb25zWzBdICsgY2hpbGRyZW5bMF0ubGVuZ3RoIDogMCk7XG4gICAgcmV0dXJuIG5ldyBUcmVlKHR5cGVzW2RhdGEudG9wSURdLCBjaGlsZHJlbi5yZXZlcnNlKCksIHBvc2l0aW9ucy5yZXZlcnNlKCksIGxlbmd0aCk7XG59XG5jb25zdCBub2RlU2l6ZUNhY2hlID0gbmV3IFdlYWtNYXA7XG5mdW5jdGlvbiBub2RlU2l6ZShiYWxhbmNlVHlwZSwgbm9kZSkge1xuICAgIGlmICghYmFsYW5jZVR5cGUuaXNBbm9ueW1vdXMgfHwgbm9kZSBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHwgbm9kZS50eXBlICE9IGJhbGFuY2VUeXBlKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBsZXQgc2l6ZSA9IG5vZGVTaXplQ2FjaGUuZ2V0KG5vZGUpO1xuICAgIGlmIChzaXplID09IG51bGwpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlICE9IGJhbGFuY2VUeXBlIHx8ICEoY2hpbGQgaW5zdGFuY2VvZiBUcmVlKSkge1xuICAgICAgICAgICAgICAgIHNpemUgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2l6ZSArPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVTaXplQ2FjaGUuc2V0KG5vZGUsIHNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbmZ1bmN0aW9uIGJhbGFuY2VSYW5nZShcbi8vIFRoZSB0eXBlIHRoZSBiYWxhbmNlZCB0cmVlJ3MgaW5uZXIgbm9kZXMuXG5iYWxhbmNlVHlwZSwgXG4vLyBUaGUgZGlyZWN0IGNoaWxkcmVuIGFuZCB0aGVpciBwb3NpdGlvbnNcbmNoaWxkcmVuLCBwb3NpdGlvbnMsIFxuLy8gVGhlIGluZGV4IHJhbmdlIGluIGNoaWxkcmVuL3Bvc2l0aW9ucyB0byB1c2VcbmZyb20sIHRvLCBcbi8vIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbm9kZXMsIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudC5cbnN0YXJ0LCBcbi8vIExlbmd0aCBvZiB0aGUgb3V0ZXIgbm9kZVxubGVuZ3RoLCBcbi8vIEZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSB0b3Agbm9kZSBvZiB0aGUgYmFsYW5jZWQgdHJlZVxubWtUb3AsIFxuLy8gRnVuY3Rpb24gdG8gYnVpbGQgaW50ZXJuYWwgbm9kZXMgZm9yIHRoZSBiYWxhbmNlZCB0cmVlXG5ta1RyZWUpIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKylcbiAgICAgICAgdG90YWwgKz0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICBsZXQgbWF4Q2hpbGQgPSBNYXRoLmNlaWwoKHRvdGFsICogMS41KSAvIDggLyogQmFsYW5jZS5CcmFuY2hGYWN0b3IgKi8pO1xuICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgZnVuY3Rpb24gZGl2aWRlKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGZyb20sIHRvLCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzspIHtcbiAgICAgICAgICAgIGxldCBncm91cEZyb20gPSBpLCBncm91cFN0YXJ0ID0gcG9zaXRpb25zW2ldLCBncm91cFNpemUgPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgZm9yICg7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRTaXplID0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBTaXplICsgbmV4dFNpemUgPj0gbWF4Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGdyb3VwU2l6ZSArPSBuZXh0U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID09IGdyb3VwRnJvbSArIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBTaXplID4gbWF4Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9ubHkgPSBjaGlsZHJlbltncm91cEZyb21dOyAvLyBPbmx5IHRyZWVzIGNhbiBoYXZlIGEgc2l6ZSA+IDFcbiAgICAgICAgICAgICAgICAgICAgZGl2aWRlKG9ubHkuY2hpbGRyZW4sIG9ubHkucG9zaXRpb25zLCAwLCBvbmx5LmNoaWxkcmVuLmxlbmd0aCwgcG9zaXRpb25zW2dyb3VwRnJvbV0gKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5wdXNoKGNoaWxkcmVuW2dyb3VwRnJvbV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9uc1tpIC0gMV0gKyBjaGlsZHJlbltpIC0gMV0ubGVuZ3RoIC0gZ3JvdXBTdGFydDtcbiAgICAgICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goYmFsYW5jZVJhbmdlKGJhbGFuY2VUeXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBncm91cEZyb20sIGksIGdyb3VwU3RhcnQsIGxlbmd0aCwgbnVsbCwgbWtUcmVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5wdXNoKGdyb3VwU3RhcnQgKyBvZmZzZXQgLSBzdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGl2aWRlKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGZyb20sIHRvLCAwKTtcbiAgICByZXR1cm4gKG1rVG9wIHx8IG1rVHJlZSkobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIGxlbmd0aCk7XG59XG4vKipcblByb3ZpZGVzIGEgd2F5IHRvIGFzc29jaWF0ZSB2YWx1ZXMgd2l0aCBwaWVjZXMgb2YgdHJlZXMuIEFzIGxvbmdcbmFzIHRoYXQgcGFydCBvZiB0aGUgdHJlZSBpcyByZXVzZWQsIHRoZSBhc3NvY2lhdGVkIHZhbHVlcyBjYW4gYmVcbnJldHJpZXZlZCBmcm9tIGFuIHVwZGF0ZWQgdHJlZS5cbiovXG5jbGFzcyBOb2RlV2Vha01hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICB9XG4gICAgc2V0QnVmZmVyKGJ1ZmZlciwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMubWFwLmdldChidWZmZXIpO1xuICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGJ1ZmZlciwgaW5uZXIgPSBuZXcgTWFwKTtcbiAgICAgICAgaW5uZXIuc2V0KGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICAgIGdldEJ1ZmZlcihidWZmZXIsIGluZGV4KSB7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMubWFwLmdldChidWZmZXIpO1xuICAgICAgICByZXR1cm4gaW5uZXIgJiYgaW5uZXIuZ2V0KGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IHRoZSB2YWx1ZSBmb3IgdGhpcyBzeW50YXggbm9kZS5cbiAgICAqL1xuICAgIHNldChub2RlLCB2YWx1ZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEJ1ZmZlck5vZGUpXG4gICAgICAgICAgICB0aGlzLnNldEJ1ZmZlcihub2RlLmNvbnRleHQuYnVmZmVyLCBub2RlLmluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSlcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChub2RlLnRyZWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdmFsdWUgZm9yIHRoaXMgc3ludGF4IG5vZGUsIGlmIGl0IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICovXG4gICAgZ2V0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBCdWZmZXJOb2RlID8gdGhpcy5nZXRCdWZmZXIobm9kZS5jb250ZXh0LmJ1ZmZlciwgbm9kZS5pbmRleClcbiAgICAgICAgICAgIDogbm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlID8gdGhpcy5tYXAuZ2V0KG5vZGUudHJlZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCB0aGUgdmFsdWUgZm9yIHRoZSBub2RlIHRoYXQgYSBjdXJzb3IgY3VycmVudGx5IHBvaW50cyB0by5cbiAgICAqL1xuICAgIGN1cnNvclNldChjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIGlmIChjdXJzb3IuYnVmZmVyKVxuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXIoY3Vyc29yLmJ1ZmZlci5idWZmZXIsIGN1cnNvci5pbmRleCwgdmFsdWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoY3Vyc29yLnRyZWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdGhlIHZhbHVlIGZvciB0aGUgbm9kZSB0aGF0IGEgY3Vyc29yIGN1cnJlbnRseSBwb2ludHNcbiAgICB0by5cbiAgICAqL1xuICAgIGN1cnNvckdldChjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvci5idWZmZXIgPyB0aGlzLmdldEJ1ZmZlcihjdXJzb3IuYnVmZmVyLmJ1ZmZlciwgY3Vyc29yLmluZGV4KSA6IHRoaXMubWFwLmdldChjdXJzb3IudHJlZSk7XG4gICAgfVxufVxuXG4vKipcblRyZWUgZnJhZ21lbnRzIGFyZSB1c2VkIGR1cmluZyBbaW5jcmVtZW50YWxcbnBhcnNpbmddKCNjb21tb24uUGFyc2VyLnN0YXJ0UGFyc2UpIHRvIHRyYWNrIHBhcnRzIG9mIG9sZCB0cmVlc1xudGhhdCBjYW4gYmUgcmV1c2VkIGluIGEgbmV3IHBhcnNlLiBBbiBhcnJheSBvZiBmcmFnbWVudHMgaXMgdXNlZFxudG8gdHJhY2sgcmVnaW9ucyBvZiBhbiBvbGQgdHJlZSB3aG9zZSBub2RlcyBtaWdodCBiZSByZXVzZWQgaW4gbmV3XG5wYXJzZXMuIFVzZSB0aGUgc3RhdGljXG5bYGFwcGx5Q2hhbmdlc2BdKCNjb21tb24uVHJlZUZyYWdtZW50XmFwcGx5Q2hhbmdlcykgbWV0aG9kIHRvXG51cGRhdGUgZnJhZ21lbnRzIGZvciBkb2N1bWVudCBjaGFuZ2VzLlxuKi9cbmNsYXNzIFRyZWVGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgdHJlZSBmcmFnbWVudC4gWW91J2xsIHVzdWFsbHkgd2FudCB0byB1c2VcbiAgICBbYGFkZFRyZWVgXSgjY29tbW9uLlRyZWVGcmFnbWVudF5hZGRUcmVlKSBhbmRcbiAgICBbYGFwcGx5Q2hhbmdlc2BdKCNjb21tb24uVHJlZUZyYWdtZW50XmFwcGx5Q2hhbmdlcykgaW5zdGVhZCBvZlxuICAgIGNhbGxpbmcgdGhpcyBkaXJlY3RseS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgdW5jaGFuZ2VkIHJhbmdlIHBvaW50ZWQgdG8gYnkgdGhpcyBmcmFnbWVudC5cbiAgICBUaGlzIHJlZmVycyB0byBhbiBvZmZzZXQgaW4gdGhlIF91cGRhdGVkXyBkb2N1bWVudCAoYXMgb3Bwb3NlZFxuICAgIHRvIHRoZSBvcmlnaW5hbCB0cmVlKS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHVuY2hhbmdlZCByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgdHJlZSB0aGF0IHRoaXMgZnJhZ21lbnQgaXMgYmFzZWQgb24uXG4gICAgKi9cbiAgICB0cmVlLCBcbiAgICAvKipcbiAgICBUaGUgb2Zmc2V0IGJldHdlZW4gdGhlIGZyYWdtZW50J3MgdHJlZSBhbmQgdGhlIGRvY3VtZW50IHRoYXRcbiAgICB0aGlzIGZyYWdtZW50IGNhbiBiZSB1c2VkIGFnYWluc3QuIEFkZCB0aGlzIHdoZW4gZ29pbmcgZnJvbVxuICAgIGRvY3VtZW50IHRvIHRyZWUgcG9zaXRpb25zLCBzdWJ0cmFjdCBpdCB0byBnbyBmcm9tIHRyZWUgdG9cbiAgICBkb2N1bWVudCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBvZmZzZXQsIG9wZW5TdGFydCA9IGZhbHNlLCBvcGVuRW5kID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5vcGVuID0gKG9wZW5TdGFydCA/IDEgLyogT3Blbi5TdGFydCAqLyA6IDApIHwgKG9wZW5FbmQgPyAyIC8qIE9wZW4uRW5kICovIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHN0YXJ0IG9mIHRoZSBmcmFnbWVudCByZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhXG4gICAgcGFyc2UsIG9yIHRoZSBlbmQgb2YgYSBjaGFuZ2UuIChJbiB0aGUgc2Vjb25kIGNhc2UsIGl0IG1heSBub3RcbiAgICBiZSBzYWZlIHRvIHJldXNlIHNvbWUgbm9kZXMgYXQgdGhlIHN0YXJ0LCBkZXBlbmRpbmcgb24gdGhlXG4gICAgcGFyc2luZyBhbGdvcml0aG0uKVxuICAgICovXG4gICAgZ2V0IG9wZW5TdGFydCgpIHsgcmV0dXJuICh0aGlzLm9wZW4gJiAxIC8qIE9wZW4uU3RhcnQgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQgcmVwcmVzZW50cyB0aGUgZW5kIG9mIGFcbiAgICBmdWxsLWRvY3VtZW50IHBhcnNlLCBvciB0aGUgc3RhcnQgb2YgYSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgb3BlbkVuZCgpIHsgcmV0dXJuICh0aGlzLm9wZW4gJiAyIC8qIE9wZW4uRW5kICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgZnJhZ21lbnRzIGZyb20gYSBmcmVzaGx5IHBhcnNlZCB0cmVlLCBvciB1cGRhdGVcbiAgICBhbiBleGlzdGluZyBzZXQgb2YgZnJhZ21lbnRzIGJ5IHJlcGxhY2luZyB0aGUgb25lcyB0aGF0IG92ZXJsYXBcbiAgICB3aXRoIGEgdHJlZSB3aXRoIGNvbnRlbnQgZnJvbSB0aGUgbmV3IHRyZWUuIFdoZW4gYHBhcnRpYWxgIGlzXG4gICAgdHJ1ZSwgdGhlIHBhcnNlIGlzIHRyZWF0ZWQgYXMgaW5jb21wbGV0ZSwgYW5kIHRoZSByZXN1bHRpbmdcbiAgICBmcmFnbWVudCBoYXMgW2BvcGVuRW5kYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnQub3BlbkVuZCkgc2V0IHRvXG4gICAgdHJ1ZS5cbiAgICAqL1xuICAgIHN0YXRpYyBhZGRUcmVlKHRyZWUsIGZyYWdtZW50cyA9IFtdLCBwYXJ0aWFsID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtuZXcgVHJlZUZyYWdtZW50KDAsIHRyZWUubGVuZ3RoLCB0cmVlLCAwLCBmYWxzZSwgcGFydGlhbCldO1xuICAgICAgICBmb3IgKGxldCBmIG9mIGZyYWdtZW50cylcbiAgICAgICAgICAgIGlmIChmLnRvID4gdHJlZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGx5IGEgc2V0IG9mIGVkaXRzIHRvIGFuIGFycmF5IG9mIGZyYWdtZW50cywgcmVtb3Zpbmcgb3JcbiAgICBzcGxpdHRpbmcgZnJhZ21lbnRzIGFzIG5lY2Vzc2FyeSB0byByZW1vdmUgZWRpdGVkIHJhbmdlcywgYW5kXG4gICAgYWRqdXN0aW5nIG9mZnNldHMgZm9yIGZyYWdtZW50cyB0aGF0IG1vdmVkLlxuICAgICovXG4gICAgc3RhdGljIGFwcGx5Q2hhbmdlcyhmcmFnbWVudHMsIGNoYW5nZXMsIG1pbkdhcCA9IDEyOCkge1xuICAgICAgICBpZiAoIWNoYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50cztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZkkgPSAxLCBuZXh0RiA9IGZyYWdtZW50cy5sZW5ndGggPyBmcmFnbWVudHNbMF0gOiBudWxsO1xuICAgICAgICBmb3IgKGxldCBjSSA9IDAsIHBvcyA9IDAsIG9mZiA9IDA7OyBjSSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEMgPSBjSSA8IGNoYW5nZXMubGVuZ3RoID8gY2hhbmdlc1tjSV0gOiBudWxsO1xuICAgICAgICAgICAgbGV0IG5leHRQb3MgPSBuZXh0QyA/IG5leHRDLmZyb21BIDogMWU5O1xuICAgICAgICAgICAgaWYgKG5leHRQb3MgLSBwb3MgPj0gbWluR2FwKVxuICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0RiAmJiBuZXh0Ri5mcm9tIDwgbmV4dFBvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3V0ID0gbmV4dEY7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gY3V0LmZyb20gfHwgbmV4dFBvcyA8PSBjdXQudG8gfHwgb2ZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkZyb20gPSBNYXRoLm1heChjdXQuZnJvbSwgcG9zKSAtIG9mZiwgZlRvID0gTWF0aC5taW4oY3V0LnRvLCBuZXh0UG9zKSAtIG9mZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1dCA9IGZGcm9tID49IGZUbyA/IG51bGwgOiBuZXcgVHJlZUZyYWdtZW50KGZGcm9tLCBmVG8sIGN1dC50cmVlLCBjdXQub2Zmc2V0ICsgb2ZmLCBjSSA+IDAsICEhbmV4dEMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjdXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEYudG8gPiBuZXh0UG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIG5leHRGID0gZkkgPCBmcmFnbWVudHMubGVuZ3RoID8gZnJhZ21lbnRzW2ZJKytdIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRDKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcG9zID0gbmV4dEMudG9BO1xuICAgICAgICAgICAgb2ZmID0gbmV4dEMudG9BIC0gbmV4dEMudG9CO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG5BIHN1cGVyY2xhc3MgdGhhdCBwYXJzZXJzIHNob3VsZCBleHRlbmQuXG4qL1xuY2xhc3MgUGFyc2VyIHtcbiAgICAvKipcbiAgICBTdGFydCBhIHBhcnNlLCByZXR1cm5pbmcgYSBbcGFydGlhbCBwYXJzZV0oI2NvbW1vbi5QYXJ0aWFsUGFyc2UpXG4gICAgb2JqZWN0LiBbYGZyYWdtZW50c2BdKCNjb21tb24uVHJlZUZyYWdtZW50KSBjYW4gYmUgcGFzc2VkIGluIHRvXG4gICAgbWFrZSB0aGUgcGFyc2UgaW5jcmVtZW50YWwuXG4gICAgXG4gICAgQnkgZGVmYXVsdCwgdGhlIGVudGlyZSBpbnB1dCBpcyBwYXJzZWQuIFlvdSBjYW4gcGFzcyBgcmFuZ2VzYCxcbiAgICB3aGljaCBzaG91bGQgYmUgYSBzb3J0ZWQgYXJyYXkgb2Ygbm9uLWVtcHR5LCBub24tb3ZlcmxhcHBpbmdcbiAgICByYW5nZXMsIHRvIHBhcnNlIG9ubHkgdGhvc2UgcmFuZ2VzLiBUaGUgdHJlZSByZXR1cm5lZCBpbiB0aGF0XG4gICAgY2FzZSB3aWxsIHN0YXJ0IGF0IGByYW5nZXNbMF0uZnJvbWAuXG4gICAgKi9cbiAgICBzdGFydFBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICBpbnB1dCA9IG5ldyBTdHJpbmdJbnB1dChpbnB1dCk7XG4gICAgICAgIHJhbmdlcyA9ICFyYW5nZXMgPyBbbmV3IFJhbmdlKDAsIGlucHV0Lmxlbmd0aCldIDogcmFuZ2VzLmxlbmd0aCA/IHJhbmdlcy5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tLCByLnRvKSkgOiBbbmV3IFJhbmdlKDAsIDApXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cyB8fCBbXSwgcmFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUnVuIGEgZnVsbCBwYXJzZSwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAqL1xuICAgIHBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICBsZXQgcGFyc2UgPSB0aGlzLnN0YXJ0UGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGRvbmUgPSBwYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICBpZiAoZG9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFN0cmluZ0lucHV0IHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICBjaHVuayhmcm9tKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tKTsgfVxuICAgIGdldCBsaW5lQ2h1bmtzKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZWFkKGZyb20sIHRvKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tLCB0byk7IH1cbn1cblxuLyoqXG5DcmVhdGUgYSBwYXJzZSB3cmFwcGVyIHRoYXQsIGFmdGVyIHRoZSBpbm5lciBwYXJzZSBjb21wbGV0ZXMsXG5zY2FucyBpdHMgdHJlZSBmb3IgbWl4ZWQgbGFuZ3VhZ2UgcmVnaW9ucyB3aXRoIHRoZSBgbmVzdGBcbmZ1bmN0aW9uLCBydW5zIHRoZSByZXN1bHRpbmcgW2lubmVyIHBhcnNlc10oI2NvbW1vbi5OZXN0ZWRQYXJzZSksXG5hbmQgdGhlbiBbbW91bnRzXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIHRoZWlyIHJlc3VsdHMgb250byB0aGVcbnRyZWUuXG4qL1xuZnVuY3Rpb24gcGFyc2VNaXhlZChuZXN0KSB7XG4gICAgcmV0dXJuIChwYXJzZSwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSA9PiBuZXcgTWl4ZWRQYXJzZShwYXJzZSwgbmVzdCwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbn1cbmNsYXNzIElubmVyUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgcGFyc2UsIG92ZXJsYXksIHRhcmdldCwgZnJvbSkge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IHBhcnNlO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja1JhbmdlcyhyYW5nZXMpIHtcbiAgICBpZiAoIXJhbmdlcy5sZW5ndGggfHwgcmFuZ2VzLnNvbWUociA9PiByLmZyb20gPj0gci50bykpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbm5lciBwYXJzZSByYW5nZXMgZ2l2ZW46IFwiICsgSlNPTi5zdHJpbmdpZnkocmFuZ2VzKSk7XG59XG5jbGFzcyBBY3RpdmVPdmVybGF5IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIHByZWRpY2F0ZSwgbW91bnRzLCBpbmRleCwgc3RhcnQsIHRhcmdldCwgcHJldikge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMubW91bnRzID0gbW91bnRzO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMucHJldiA9IHByZXY7XG4gICAgICAgIHRoaXMuZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IFtdO1xuICAgIH1cbn1cbmNvbnN0IHN0b3BwZWRJbm5lciA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG5jbGFzcyBNaXhlZFBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihiYXNlLCBuZXN0LCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5uZXN0ID0gbmVzdDtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBbXTtcbiAgICAgICAgdGhpcy5pbm5lckRvbmUgPSAwO1xuICAgICAgICB0aGlzLmJhc2VUcmVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmJhc2VQYXJzZSA9IGJhc2U7XG4gICAgfVxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VQYXJzZSkge1xuICAgICAgICAgICAgbGV0IGRvbmUgPSB0aGlzLmJhc2VQYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICBpZiAoIWRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXJzZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmJhc2VUcmVlID0gZG9uZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRJbm5lcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5uZXIgb2YgdGhpcy5pbm5lcilcbiAgICAgICAgICAgICAgICAgICAgaW5uZXIucGFyc2Uuc3RvcEF0KHRoaXMuc3RvcHBlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbm5lckRvbmUgPT0gdGhpcy5pbm5lci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmJhc2VUcmVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRyZWUocmVzdWx0LnR5cGUsIHJlc3VsdC5jaGlsZHJlbiwgcmVzdWx0LnBvc2l0aW9ucywgcmVzdWx0Lmxlbmd0aCwgcmVzdWx0LnByb3BWYWx1ZXMuY29uY2F0KFtbc3RvcHBlZElubmVyLCB0aGlzLnN0b3BwZWRBdF1dKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMuaW5uZXJbdGhpcy5pbm5lckRvbmVdLCBkb25lID0gaW5uZXIucGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgdGhpcy5pbm5lckRvbmUrKztcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBkb2RneSBidXQgc3VwZXIgaGVscGZ1bCBoYWNrIHdoZXJlIHdlXG4gICAgICAgICAgICAvLyBwYXRjaCB1cCBub2RlcyBjcmVhdGVkIGJ5IHRoZSBpbm5lciBwYXJzZSAoYW5kIHRodXNcbiAgICAgICAgICAgIC8vIHByZXN1bWFibHkgbm90IGFsaWFzZWQgYW55d2hlcmUgZWxzZSkgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIC8vIGFib3V0IHRoZSBpbm5lciBwYXJzZS5cbiAgICAgICAgICAgIGxldCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgaW5uZXIudGFyZ2V0LnByb3BzKTtcbiAgICAgICAgICAgIHByb3BzW05vZGVQcm9wLm1vdW50ZWQuaWRdID0gbmV3IE1vdW50ZWRUcmVlKGRvbmUsIGlubmVyLm92ZXJsYXksIGlubmVyLnBhcnNlcik7XG4gICAgICAgICAgICBpbm5lci50YXJnZXQucHJvcHMgPSBwcm9wcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0IHBhcnNlZFBvcygpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVBhcnNlKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLmlucHV0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5uZXJEb25lOyBpIDwgdGhpcy5pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5uZXJbaV0uZnJvbSA8IHBvcylcbiAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihwb3MsIHRoaXMuaW5uZXJbaV0ucGFyc2UucGFyc2VkUG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICBzdG9wQXQocG9zKSB7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gcG9zO1xuICAgICAgICBpZiAodGhpcy5iYXNlUGFyc2UpXG4gICAgICAgICAgICB0aGlzLmJhc2VQYXJzZS5zdG9wQXQocG9zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5uZXJEb25lOyBpIDwgdGhpcy5pbm5lci5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLmlubmVyW2ldLnBhcnNlLnN0b3BBdChwb3MpO1xuICAgIH1cbiAgICBzdGFydElubmVyKCkge1xuICAgICAgICBsZXQgZnJhZ21lbnRDdXJzb3IgPSBuZXcgRnJhZ21lbnRDdXJzb3IodGhpcy5mcmFnbWVudHMpO1xuICAgICAgICBsZXQgb3ZlcmxheSA9IG51bGw7XG4gICAgICAgIGxldCBjb3ZlcmVkID0gbnVsbDtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBUcmVlQ3Vyc29yKG5ldyBUcmVlTm9kZSh0aGlzLmJhc2VUcmVlLCB0aGlzLnJhbmdlc1swXS5mcm9tLCAwLCBudWxsKSwgSXRlck1vZGUuSW5jbHVkZUFub255bW91cyB8IEl0ZXJNb2RlLklnbm9yZU1vdW50cyk7XG4gICAgICAgIHNjYW46IGZvciAobGV0IG5lc3QsIGlzQ292ZXJlZDs7KSB7XG4gICAgICAgICAgICBsZXQgZW50ZXIgPSB0cnVlLCByYW5nZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsICYmIGN1cnNvci5mcm9tID49IHRoaXMuc3RvcHBlZEF0KSB7XG4gICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyYWdtZW50Q3Vyc29yLmhhc05vZGUoY3Vyc29yKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IG92ZXJsYXkubW91bnRzLmZpbmQobSA9PiBtLmZyYWcuZnJvbSA8PSBjdXJzb3IuZnJvbSAmJiBtLmZyYWcudG8gPj0gY3Vyc29yLnRvICYmIG0ubW91bnQub3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgbWF0Y2gubW91bnQub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gci5mcm9tICsgbWF0Y2gucG9zLCB0byA9IHIudG8gKyBtYXRjaC5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gY3Vyc29yLmZyb20gJiYgdG8gPD0gY3Vyc29yLnRvICYmICFvdmVybGF5LnJhbmdlcy5zb21lKHIgPT4gci5mcm9tIDwgdG8gJiYgci50byA+IGZyb20pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlcy5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3ZlcmVkICYmIChpc0NvdmVyZWQgPSBjaGVja0NvdmVyKGNvdmVyZWQucmFuZ2VzLCBjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKSkpIHtcbiAgICAgICAgICAgICAgICBlbnRlciA9IGlzQ292ZXJlZCAhPSAyIC8qIENvdmVyLkZ1bGwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghY3Vyc29yLnR5cGUuaXNBbm9ueW1vdXMgJiYgKG5lc3QgPSB0aGlzLm5lc3QoY3Vyc29yLCB0aGlzLmlucHV0KSkgJiZcbiAgICAgICAgICAgICAgICAoY3Vyc29yLmZyb20gPCBjdXJzb3IudG8gfHwgIW5lc3Qub3ZlcmxheSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci50cmVlKVxuICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgIGxldCBvbGRNb3VudHMgPSBmcmFnbWVudEN1cnNvci5maW5kTW91bnRzKGN1cnNvci5mcm9tLCBuZXN0LnBhcnNlcik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXN0Lm92ZXJsYXkgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgPSBuZXcgQWN0aXZlT3ZlcmxheShuZXN0LnBhcnNlciwgbmVzdC5vdmVybGF5LCBvbGRNb3VudHMsIHRoaXMuaW5uZXIubGVuZ3RoLCBjdXJzb3IuZnJvbSwgY3Vyc29yLnRyZWUsIG92ZXJsYXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHB1bmNoUmFuZ2VzKHRoaXMucmFuZ2VzLCBuZXN0Lm92ZXJsYXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJzb3IuZnJvbSA8IGN1cnNvci50byA/IFtuZXcgUmFuZ2UoY3Vyc29yLmZyb20sIGN1cnNvci50byldIDogW10pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1JhbmdlcyhyYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCB8fCAhbmVzdC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lci5wdXNoKG5ldyBJbm5lclBhcnNlKG5lc3QucGFyc2VyLCByYW5nZXMubGVuZ3RoID8gbmVzdC5wYXJzZXIuc3RhcnRQYXJzZSh0aGlzLmlucHV0LCBlbnRlckZyYWdtZW50cyhvbGRNb3VudHMsIHJhbmdlcyksIHJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5lc3QucGFyc2VyLnN0YXJ0UGFyc2UoXCJcIiksIG5lc3Qub3ZlcmxheSA/IG5lc3Qub3ZlcmxheS5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tIC0gY3Vyc29yLmZyb20sIHIudG8gLSBjdXJzb3IuZnJvbSkpIDogbnVsbCwgY3Vyc29yLnRyZWUsIHJhbmdlcy5sZW5ndGggPyByYW5nZXNbMF0uZnJvbSA6IGN1cnNvci5mcm9tKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmVzdC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSB7IHJhbmdlcywgZGVwdGg6IDAsIHByZXY6IGNvdmVyZWQgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdmVybGF5ICYmIChyYW5nZSA9IG92ZXJsYXkucHJlZGljYXRlKGN1cnNvcikpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbSA8IHJhbmdlLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gb3ZlcmxheS5yYW5nZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPj0gMCAmJiBvdmVybGF5LnJhbmdlc1tsYXN0XS50byA9PSByYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5yYW5nZXNbbGFzdF0gPSB7IGZyb206IG92ZXJsYXkucmFuZ2VzW2xhc3RdLmZyb20sIHRvOiByYW5nZS50byB9O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlcy5wdXNoKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW50ZXIgJiYgY3Vyc29yLmZpcnN0Q2hpbGQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5LmRlcHRoKys7XG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyZWQuZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkgJiYgIS0tb3ZlcmxheS5kZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHB1bmNoUmFuZ2VzKHRoaXMucmFuZ2VzLCBvdmVybGF5LnJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmFuZ2VzKHJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lci5zcGxpY2Uob3ZlcmxheS5pbmRleCwgMCwgbmV3IElubmVyUGFyc2Uob3ZlcmxheS5wYXJzZXIsIG92ZXJsYXkucGFyc2VyLnN0YXJ0UGFyc2UodGhpcy5pbnB1dCwgZW50ZXJGcmFnbWVudHMob3ZlcmxheS5tb3VudHMsIHJhbmdlcyksIHJhbmdlcyksIG92ZXJsYXkucmFuZ2VzLm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20gLSBvdmVybGF5LnN0YXJ0LCByLnRvIC0gb3ZlcmxheS5zdGFydCkpLCBvdmVybGF5LnRhcmdldCwgcmFuZ2VzWzBdLmZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgPSBvdmVybGF5LnByZXY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdmVyZWQgJiYgIS0tY292ZXJlZC5kZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSBjb3ZlcmVkLnByZXY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tDb3Zlcihjb3ZlcmVkLCBmcm9tLCB0bykge1xuICAgIGZvciAobGV0IHJhbmdlIG9mIGNvdmVyZWQpIHtcbiAgICAgICAgaWYgKHJhbmdlLmZyb20gPj0gdG8pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHJhbmdlLnRvID4gZnJvbSlcbiAgICAgICAgICAgIHJldHVybiByYW5nZS5mcm9tIDw9IGZyb20gJiYgcmFuZ2UudG8gPj0gdG8gPyAyIC8qIENvdmVyLkZ1bGwgKi8gOiAxIC8qIENvdmVyLlBhcnRpYWwgKi87XG4gICAgfVxuICAgIHJldHVybiAwIC8qIENvdmVyLk5vbmUgKi87XG59XG4vLyBUYWtlIGEgcGllY2Ugb2YgYnVmZmVyIGFuZCBjb252ZXJ0IGl0IGludG8gYSBzdGFuZC1hbG9uZVxuLy8gVHJlZUJ1ZmZlci5cbmZ1bmN0aW9uIHNsaWNlQnVmKGJ1Ziwgc3RhcnRJLCBlbmRJLCBub2RlcywgcG9zaXRpb25zLCBvZmYpIHtcbiAgICBpZiAoc3RhcnRJIDwgZW5kSSkge1xuICAgICAgICBsZXQgZnJvbSA9IGJ1Zi5idWZmZXJbc3RhcnRJICsgMV07XG4gICAgICAgIG5vZGVzLnB1c2goYnVmLnNsaWNlKHN0YXJ0SSwgZW5kSSwgZnJvbSkpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gb2ZmKTtcbiAgICB9XG59XG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbm9kZSB0aGF0J3MgaW4gYSBidWZmZXIsIGFuZCBjb252ZXJ0cyBpdCwgYW5kXG4vLyBpdHMgcGFyZW50IGJ1ZmZlciBub2RlcywgaW50byBhIFRyZWUuIFRoaXMgaXMgYWdhaW4gYWN0aW5nIG9uIHRoZVxuLy8gYXNzdW1wdGlvbiB0aGF0IHRoZSB0cmVlcyBhbmQgYnVmZmVycyBoYXZlIGJlZW4gY29uc3RydWN0ZWQgYnkgdGhlXG4vLyBwYXJzZSB0aGF0IHdhcyByYW4gdmlhIHRoZSBtaXggcGFyc2VyLCBhbmQgdGh1cyBhcmVuJ3Qgc2hhcmVkIHdpdGhcbi8vIGFueSBvdGhlciBjb2RlLCBtYWtpbmcgdmlvbGF0aW9ucyBvZiB0aGUgaW1tdXRhYmlsaXR5IHNhZmUuXG5mdW5jdGlvbiBtYXRlcmlhbGl6ZShjdXJzb3IpIHtcbiAgICBsZXQgeyBub2RlIH0gPSBjdXJzb3IsIHN0YWNrID0gW107XG4gICAgbGV0IGJ1ZmZlciA9IG5vZGUuY29udGV4dC5idWZmZXI7XG4gICAgLy8gU2NhbiB1cCB0byB0aGUgbmVhcmVzdCB0cmVlXG4gICAgZG8ge1xuICAgICAgICBzdGFjay5wdXNoKGN1cnNvci5pbmRleCk7XG4gICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICB9IHdoaWxlICghY3Vyc29yLnRyZWUpO1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBidWZmZXIgaW4gdGhhdCB0cmVlXG4gICAgbGV0IGJhc2UgPSBjdXJzb3IudHJlZSwgaSA9IGJhc2UuY2hpbGRyZW4uaW5kZXhPZihidWZmZXIpO1xuICAgIGxldCBidWYgPSBiYXNlLmNoaWxkcmVuW2ldLCBiID0gYnVmLmJ1ZmZlciwgbmV3U3RhY2sgPSBbaV07XG4gICAgLy8gU3BsaXQgYSBsZXZlbCBpbiB0aGUgYnVmZmVyLCBwdXR0aW5nIHRoZSBub2RlcyBiZWZvcmUgYW5kIGFmdGVyXG4gICAgLy8gdGhlIGNoaWxkIHRoYXQgY29udGFpbnMgYG5vZGVgIGludG8gbmV3IGJ1ZmZlcnMuXG4gICAgZnVuY3Rpb24gc3BsaXQoc3RhcnRJLCBlbmRJLCB0eXBlLCBpbm5lck9mZnNldCwgbGVuZ3RoLCBzdGFja1Bvcykge1xuICAgICAgICBsZXQgdGFyZ2V0SSA9IHN0YWNrW3N0YWNrUG9zXTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBzbGljZUJ1ZihidWYsIHN0YXJ0SSwgdGFyZ2V0SSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5uZXJPZmZzZXQpO1xuICAgICAgICBsZXQgZnJvbSA9IGJbdGFyZ2V0SSArIDFdLCB0byA9IGJbdGFyZ2V0SSArIDJdO1xuICAgICAgICBuZXdTdGFjay5wdXNoKGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIGxldCBjaGlsZCA9IHN0YWNrUG9zXG4gICAgICAgICAgICA/IHNwbGl0KHRhcmdldEkgKyA0LCBiW3RhcmdldEkgKyAzXSwgYnVmLnNldC50eXBlc1tiW3RhcmdldEldXSwgZnJvbSwgdG8gLSBmcm9tLCBzdGFja1BvcyAtIDEpXG4gICAgICAgICAgICA6IG5vZGUudG9UcmVlKCk7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gaW5uZXJPZmZzZXQpO1xuICAgICAgICBzbGljZUJ1ZihidWYsIGJbdGFyZ2V0SSArIDNdLCBlbmRJLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBpbm5lck9mZnNldCk7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpO1xuICAgIH1cbiAgICBiYXNlLmNoaWxkcmVuW2ldID0gc3BsaXQoMCwgYi5sZW5ndGgsIE5vZGVUeXBlLm5vbmUsIDAsIGJ1Zi5sZW5ndGgsIHN0YWNrLmxlbmd0aCAtIDEpO1xuICAgIC8vIE1vdmUgdGhlIGN1cnNvciBiYWNrIHRvIHRoZSB0YXJnZXQgbm9kZVxuICAgIGZvciAobGV0IGluZGV4IG9mIG5ld1N0YWNrKSB7XG4gICAgICAgIGxldCB0cmVlID0gY3Vyc29yLnRyZWUuY2hpbGRyZW5baW5kZXhdLCBwb3MgPSBjdXJzb3IudHJlZS5wb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICBjdXJzb3IueWllbGQobmV3IFRyZWVOb2RlKHRyZWUsIHBvcyArIGN1cnNvci5mcm9tLCBpbmRleCwgY3Vyc29yLl90cmVlKSk7XG4gICAgfVxufVxuY2xhc3MgU3RydWN0dXJlQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcihyb290LCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnNvciA9IHJvb3QuY3Vyc29yKEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMgfCBJdGVyTW9kZS5JZ25vcmVNb3VudHMpO1xuICAgIH1cbiAgICAvLyBNb3ZlIHRvIHRoZSBmaXJzdCBub2RlIChpbiBwcmUtb3JkZXIpIHRoYXQgc3RhcnRzIGF0IG9yIGFmdGVyIGBwb3NgLlxuICAgIG1vdmVUbyhwb3MpIHtcbiAgICAgICAgbGV0IHsgY3Vyc29yIH0gPSB0aGlzLCBwID0gcG9zIC0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIHdoaWxlICghdGhpcy5kb25lICYmIGN1cnNvci5mcm9tIDwgcCkge1xuICAgICAgICAgICAgaWYgKGN1cnNvci50byA+PSBwb3MgJiYgY3Vyc29yLmVudGVyKHAsIDEsIEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzIHwgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpKSA7XG4gICAgICAgICAgICBlbHNlIGlmICghY3Vyc29yLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzTm9kZShjdXJzb3IpIHtcbiAgICAgICAgdGhpcy5tb3ZlVG8oY3Vyc29yLmZyb20pO1xuICAgICAgICBpZiAoIXRoaXMuZG9uZSAmJiB0aGlzLmN1cnNvci5mcm9tICsgdGhpcy5vZmZzZXQgPT0gY3Vyc29yLmZyb20gJiYgdGhpcy5jdXJzb3IudHJlZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgdHJlZSA9IHRoaXMuY3Vyc29yLnRyZWU7Oykge1xuICAgICAgICAgICAgICAgIGlmICh0cmVlID09IGN1cnNvci50cmVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHJlZS5jaGlsZHJlbi5sZW5ndGggJiYgdHJlZS5wb3NpdGlvbnNbMF0gPT0gMCAmJiB0cmVlLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgVHJlZSlcbiAgICAgICAgICAgICAgICAgICAgdHJlZSA9IHRyZWUuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuY2xhc3MgRnJhZ21lbnRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGZyYWdtZW50cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLmN1clRvID0gMDtcbiAgICAgICAgdGhpcy5mcmFnSSA9IDA7XG4gICAgICAgIGlmIChmcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0aGlzLmN1ckZyYWcgPSBmcmFnbWVudHNbMF07XG4gICAgICAgICAgICB0aGlzLmN1clRvID0gKF9hID0gZmlyc3QudHJlZS5wcm9wKHN0b3BwZWRJbm5lcikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZpcnN0LnRvO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBTdHJ1Y3R1cmVDdXJzb3IoZmlyc3QudHJlZSwgLWZpcnN0Lm9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1ckZyYWcgPSB0aGlzLmlubmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNOb2RlKG5vZGUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VyRnJhZyAmJiBub2RlLmZyb20gPj0gdGhpcy5jdXJUbylcbiAgICAgICAgICAgIHRoaXMubmV4dEZyYWcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyRnJhZyAmJiB0aGlzLmN1ckZyYWcuZnJvbSA8PSBub2RlLmZyb20gJiYgdGhpcy5jdXJUbyA+PSBub2RlLnRvICYmIHRoaXMuaW5uZXIuaGFzTm9kZShub2RlKTtcbiAgICB9XG4gICAgbmV4dEZyYWcoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5mcmFnSSsrO1xuICAgICAgICBpZiAodGhpcy5mcmFnSSA9PSB0aGlzLmZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyRnJhZyA9IHRoaXMuaW5uZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyYWcgPSB0aGlzLmN1ckZyYWcgPSB0aGlzLmZyYWdtZW50c1t0aGlzLmZyYWdJXTtcbiAgICAgICAgICAgIHRoaXMuY3VyVG8gPSAoX2EgPSBmcmFnLnRyZWUucHJvcChzdG9wcGVkSW5uZXIpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmcmFnLnRvO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBTdHJ1Y3R1cmVDdXJzb3IoZnJhZy50cmVlLCAtZnJhZy5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRNb3VudHMocG9zLCBwYXJzZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0aGlzLmlubmVyKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVyLmN1cnNvci5tb3ZlVG8ocG9zLCAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IHRoaXMuaW5uZXIuY3Vyc29yLm5vZGU7IHBvczsgcG9zID0gcG9zLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCBtb3VudCA9IChfYSA9IHBvcy50cmVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHJvcChOb2RlUHJvcC5tb3VudGVkKTtcbiAgICAgICAgICAgICAgICBpZiAobW91bnQgJiYgbW91bnQucGFyc2VyID09IHBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5mcmFnSTsgaSA8IHRoaXMuZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJhZyA9IHRoaXMuZnJhZ21lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWcuZnJvbSA+PSBwb3MudG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZy50cmVlID09IHRoaXMuY3VyRnJhZy50cmVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3MuZnJvbSAtIGZyYWcub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gcHVuY2hSYW5nZXMob3V0ZXIsIHJhbmdlcykge1xuICAgIGxldCBjb3B5ID0gbnVsbCwgY3VycmVudCA9IHJhbmdlcztcbiAgICBmb3IgKGxldCBpID0gMSwgaiA9IDA7IGkgPCBvdXRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZ2FwRnJvbSA9IG91dGVyW2kgLSAxXS50bywgZ2FwVG8gPSBvdXRlcltpXS5mcm9tO1xuICAgICAgICBmb3IgKDsgaiA8IGN1cnJlbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCByID0gY3VycmVudFtqXTtcbiAgICAgICAgICAgIGlmIChyLmZyb20gPj0gZ2FwVG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoci50byA8PSBnYXBGcm9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjb3B5ID0gcmFuZ2VzLnNsaWNlKCk7XG4gICAgICAgICAgICBpZiAoci5mcm9tIDwgZ2FwRnJvbSkge1xuICAgICAgICAgICAgICAgIGNvcHlbal0gPSBuZXcgUmFuZ2Uoci5mcm9tLCBnYXBGcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoci50byA+IGdhcFRvKVxuICAgICAgICAgICAgICAgICAgICBjb3B5LnNwbGljZShqICsgMSwgMCwgbmV3IFJhbmdlKGdhcFRvLCByLnRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyLnRvID4gZ2FwVG8pIHtcbiAgICAgICAgICAgICAgICBjb3B5W2otLV0gPSBuZXcgUmFuZ2UoZ2FwVG8sIHIudG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29weS5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmZ1bmN0aW9uIGZpbmRDb3ZlckNoYW5nZXMoYSwgYiwgZnJvbSwgdG8pIHtcbiAgICBsZXQgaUEgPSAwLCBpQiA9IDAsIGluQSA9IGZhbHNlLCBpbkIgPSBmYWxzZSwgcG9zID0gLTFlOTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgbmV4dEEgPSBpQSA9PSBhLmxlbmd0aCA/IDFlOSA6IGluQSA/IGFbaUFdLnRvIDogYVtpQV0uZnJvbTtcbiAgICAgICAgbGV0IG5leHRCID0gaUIgPT0gYi5sZW5ndGggPyAxZTkgOiBpbkIgPyBiW2lCXS50byA6IGJbaUJdLmZyb207XG4gICAgICAgIGlmIChpbkEgIT0gaW5CKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChwb3MsIGZyb20pLCBlbmQgPSBNYXRoLm1pbihuZXh0QSwgbmV4dEIsIHRvKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZClcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgUmFuZ2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IE1hdGgubWluKG5leHRBLCBuZXh0Qik7XG4gICAgICAgIGlmIChwb3MgPT0gMWU5KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChuZXh0QSA9PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICghaW5BKVxuICAgICAgICAgICAgICAgIGluQSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbkEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpQSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0QiA9PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICghaW5CKVxuICAgICAgICAgICAgICAgIGluQiA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbkIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpQisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBHaXZlbiBhIG51bWJlciBvZiBmcmFnbWVudHMgZm9yIHRoZSBvdXRlciB0cmVlLCBhbmQgYSBzZXQgb2YgcmFuZ2VzXG4vLyB0byBwYXJzZSwgZmluZCBmcmFnbWVudHMgZm9yIGlubmVyIHRyZWVzIG1vdW50ZWQgYXJvdW5kIHRob3NlXG4vLyByYW5nZXMsIGlmIGFueS5cbmZ1bmN0aW9uIGVudGVyRnJhZ21lbnRzKG1vdW50cywgcmFuZ2VzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IHsgcG9zLCBtb3VudCwgZnJhZyB9IG9mIG1vdW50cykge1xuICAgICAgICBsZXQgc3RhcnRQb3MgPSBwb3MgKyAobW91bnQub3ZlcmxheSA/IG1vdW50Lm92ZXJsYXlbMF0uZnJvbSA6IDApLCBlbmRQb3MgPSBzdGFydFBvcyArIG1vdW50LnRyZWUubGVuZ3RoO1xuICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWF4KGZyYWcuZnJvbSwgc3RhcnRQb3MpLCB0byA9IE1hdGgubWluKGZyYWcudG8sIGVuZFBvcyk7XG4gICAgICAgIGlmIChtb3VudC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgb3ZlcmxheSA9IG1vdW50Lm92ZXJsYXkubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSArIHBvcywgci50byArIHBvcykpO1xuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSBmaW5kQ292ZXJDaGFuZ2VzKHJhbmdlcywgb3ZlcmxheSwgZnJvbSwgdG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IGZyb207OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGkgPT0gY2hhbmdlcy5sZW5ndGgsIGVuZCA9IGxhc3QgPyB0byA6IGNoYW5nZXNbaV0uZnJvbTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVHJlZUZyYWdtZW50KHBvcywgZW5kLCBtb3VudC50cmVlLCAtc3RhcnRQb3MsIGZyYWcuZnJvbSA+PSBwb3MgfHwgZnJhZy5vcGVuU3RhcnQsIGZyYWcudG8gPD0gZW5kIHx8IGZyYWcub3BlbkVuZCkpO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwb3MgPSBjaGFuZ2VzW2ldLnRvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFRyZWVGcmFnbWVudChmcm9tLCB0bywgbW91bnQudHJlZSwgLXN0YXJ0UG9zLCBmcmFnLmZyb20gPj0gc3RhcnRQb3MgfHwgZnJhZy5vcGVuU3RhcnQsIGZyYWcudG8gPD0gZW5kUG9zIHx8IGZyYWcub3BlbkVuZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7IERlZmF1bHRCdWZmZXJMZW5ndGgsIEl0ZXJNb2RlLCBNb3VudGVkVHJlZSwgTm9kZVByb3AsIE5vZGVTZXQsIE5vZGVUeXBlLCBOb2RlV2Vha01hcCwgUGFyc2VyLCBUcmVlLCBUcmVlQnVmZmVyLCBUcmVlQ3Vyc29yLCBUcmVlRnJhZ21lbnQsIHBhcnNlTWl4ZWQgfTtcbiIsICJpbXBvcnQgeyBOb2RlUHJvcCB9IGZyb20gJ0BsZXplci9jb21tb24nO1xuXG5sZXQgbmV4dFRhZ0lEID0gMDtcbi8qKlxuSGlnaGxpZ2h0aW5nIHRhZ3MgYXJlIG1hcmtlcnMgdGhhdCBkZW5vdGUgYSBoaWdobGlnaHRpbmcgY2F0ZWdvcnkuXG5UaGV5IGFyZSBbYXNzb2NpYXRlZF0oI2hpZ2hsaWdodC5zdHlsZVRhZ3MpIHdpdGggcGFydHMgb2YgYSBzeW50YXhcbnRyZWUgYnkgYSBsYW5ndWFnZSBtb2RlLCBhbmQgdGhlbiBtYXBwZWQgdG8gYW4gYWN0dWFsIENTUyBzdHlsZSBieVxuYSBbaGlnaGxpZ2h0ZXJdKCNoaWdobGlnaHQuSGlnaGxpZ2h0ZXIpLlxuXG5CZWNhdXNlIHN5bnRheCB0cmVlIG5vZGUgdHlwZXMgYW5kIGhpZ2hsaWdodCBzdHlsZXMgaGF2ZSB0byBiZVxuYWJsZSB0byB0YWxrIHRoZSBzYW1lIGxhbmd1YWdlLCBDb2RlTWlycm9yIHVzZXMgYSBtb3N0bHkgX2Nsb3NlZF9cblt2b2NhYnVsYXJ5XSgjaGlnaGxpZ2h0LnRhZ3MpIG9mIHN5bnRheCB0YWdzIChhcyBvcHBvc2VkIHRvXG50cmFkaXRpb25hbCBvcGVuIHN0cmluZy1iYXNlZCBzeXN0ZW1zLCB3aGljaCBtYWtlIGl0IGhhcmQgZm9yXG5oaWdobGlnaHRpbmcgdGhlbWVzIHRvIGNvdmVyIGFsbCB0aGUgdG9rZW5zIHByb2R1Y2VkIGJ5IHRoZVxudmFyaW91cyBsYW5ndWFnZXMpLlxuXG5JdCBfaXNfIHBvc3NpYmxlIHRvIFtkZWZpbmVdKCNoaWdobGlnaHQuVGFnXmRlZmluZSkgeW91ciBvd25cbmhpZ2hsaWdodGluZyB0YWdzIGZvciBzeXN0ZW0taW50ZXJuYWwgdXNlICh3aGVyZSB5b3UgY29udHJvbCBib3RoXG50aGUgbGFuZ3VhZ2UgcGFja2FnZSBhbmQgdGhlIGhpZ2hsaWdodGVyKSwgYnV0IHN1Y2ggdGFncyB3aWxsIG5vdFxuYmUgcGlja2VkIHVwIGJ5IHJlZ3VsYXIgaGlnaGxpZ2h0ZXJzICh0aG91Z2ggeW91IGNhbiBkZXJpdmUgdGhlbVxuZnJvbSBzdGFuZGFyZCB0YWdzIHRvIGFsbG93IGhpZ2hsaWdodGVycyB0byBmYWxsIGJhY2sgdG8gdGhvc2UpLlxuKi9cbmNsYXNzIFRhZyB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgYmFzZSB0YWcgQGludGVybmFsXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBUaGUgc2V0IG9mIHRoaXMgdGFnIGFuZCBhbGwgaXRzIHBhcmVudCB0YWdzLCBzdGFydGluZyB3aXRoXG4gICAgdGhpcyBvbmUgaXRzZWxmIGFuZCBzb3J0ZWQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBzcGVjaWZpY2l0eS5cbiAgICAqL1xuICAgIHNldCwgXG4gICAgLyoqXG4gICAgVGhlIGJhc2UgdW5tb2RpZmllZCB0YWcgdGhhdCB0aGlzIG9uZSBpcyBiYXNlZCBvbiwgaWYgaXQnc1xuICAgIG1vZGlmaWVkIEBpbnRlcm5hbFxuICAgICovXG4gICAgYmFzZSwgXG4gICAgLyoqXG4gICAgVGhlIG1vZGlmaWVycyBhcHBsaWVkIHRvIHRoaXMuYmFzZSBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1vZGlmaWVkKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgICAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgICAgICB0aGlzLm1vZGlmaWVkID0gbW9kaWZpZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IG5leHRUYWdJRCsrO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHsgbmFtZSB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgbW9kIG9mIHRoaXMubW9kaWZpZWQpXG4gICAgICAgICAgICBpZiAobW9kLm5hbWUpXG4gICAgICAgICAgICAgICAgbmFtZSA9IGAke21vZC5uYW1lfSgke25hbWV9KWA7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICBzdGF0aWMgZGVmaW5lKG5hbWVPclBhcmVudCwgcGFyZW50KSB7XG4gICAgICAgIGxldCBuYW1lID0gdHlwZW9mIG5hbWVPclBhcmVudCA9PSBcInN0cmluZ1wiID8gbmFtZU9yUGFyZW50IDogXCI/XCI7XG4gICAgICAgIGlmIChuYW1lT3JQYXJlbnQgaW5zdGFuY2VvZiBUYWcpXG4gICAgICAgICAgICBwYXJlbnQgPSBuYW1lT3JQYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwgfHwgcGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnQuYmFzZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbiBub3QgZGVyaXZlIGZyb20gYSBtb2RpZmllZCB0YWdcIik7XG4gICAgICAgIGxldCB0YWcgPSBuZXcgVGFnKG5hbWUsIFtdLCBudWxsLCBbXSk7XG4gICAgICAgIHRhZy5zZXQucHVzaCh0YWcpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiBwYXJlbnQuc2V0KVxuICAgICAgICAgICAgICAgIHRhZy5zZXQucHVzaCh0KTtcbiAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgdGFnIF9tb2RpZmllcl8sIHdoaWNoIGlzIGEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSB0YWcsXG4gICAgd2lsbCByZXR1cm4gYSB0YWcgdGhhdCBpcyBhIHN1YnRhZyBvZiB0aGUgb3JpZ2luYWwuIEFwcGx5aW5nIHRoZVxuICAgIHNhbWUgbW9kaWZpZXIgdG8gYSB0d2ljZSB0YWcgd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgKGBtMSh0MSlcbiAgICA9PSBtMSh0MSlgKSBhbmQgYXBwbHlpbmcgbXVsdGlwbGUgbW9kaWZpZXJzIHdpbGwsIHJlZ2FyZGxlc3Mgb3JcbiAgICBvcmRlciwgcHJvZHVjZSB0aGUgc2FtZSB0YWcgKGBtMShtMih0MSkpID09IG0yKG0xKHQxKSlgKS5cbiAgICBcbiAgICBXaGVuIG11bHRpcGxlIG1vZGlmaWVycyBhcmUgYXBwbGllZCB0byBhIGdpdmVuIGJhc2UgdGFnLCBlYWNoXG4gICAgc21hbGxlciBzZXQgb2YgbW9kaWZpZXJzIGlzIHJlZ2lzdGVyZWQgYXMgYSBwYXJlbnQsIHNvIHRoYXQgZm9yXG4gICAgZXhhbXBsZSBgbTEobTIobTModDEpKSlgIGlzIGEgc3VidHlwZSBvZiBgbTEobTIodDEpKWAsXG4gICAgYG0xKG0zKHQxKWAsIGFuZCBzbyBvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVNb2RpZmllcihuYW1lKSB7XG4gICAgICAgIGxldCBtb2QgPSBuZXcgTW9kaWZpZXIobmFtZSk7XG4gICAgICAgIHJldHVybiAodGFnKSA9PiB7XG4gICAgICAgICAgICBpZiAodGFnLm1vZGlmaWVkLmluZGV4T2YobW9kKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgICAgICByZXR1cm4gTW9kaWZpZXIuZ2V0KHRhZy5iYXNlIHx8IHRhZywgdGFnLm1vZGlmaWVkLmNvbmNhdChtb2QpLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKSk7XG4gICAgICAgIH07XG4gICAgfVxufVxubGV0IG5leHRNb2RpZmllcklEID0gMDtcbmNsYXNzIE1vZGlmaWVyIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzID0gW107XG4gICAgICAgIHRoaXMuaWQgPSBuZXh0TW9kaWZpZXJJRCsrO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0KGJhc2UsIG1vZHMpIHtcbiAgICAgICAgaWYgKCFtb2RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICBsZXQgZXhpc3RzID0gbW9kc1swXS5pbnN0YW5jZXMuZmluZCh0ID0+IHQuYmFzZSA9PSBiYXNlICYmIHNhbWVBcnJheShtb2RzLCB0Lm1vZGlmaWVkKSk7XG4gICAgICAgIGlmIChleGlzdHMpXG4gICAgICAgICAgICByZXR1cm4gZXhpc3RzO1xuICAgICAgICBsZXQgc2V0ID0gW10sIHRhZyA9IG5ldyBUYWcoYmFzZS5uYW1lLCBzZXQsIGJhc2UsIG1vZHMpO1xuICAgICAgICBmb3IgKGxldCBtIG9mIG1vZHMpXG4gICAgICAgICAgICBtLmluc3RhbmNlcy5wdXNoKHRhZyk7XG4gICAgICAgIGxldCBjb25maWdzID0gcG93ZXJTZXQobW9kcyk7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCBvZiBiYXNlLnNldClcbiAgICAgICAgICAgIGlmICghcGFyZW50Lm1vZGlmaWVkLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb25maWcgb2YgY29uZmlncylcbiAgICAgICAgICAgICAgICAgICAgc2V0LnB1c2goTW9kaWZpZXIuZ2V0KHBhcmVudCwgY29uZmlnKSk7XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZUFycmF5KGEsIGIpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggPT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoeCwgaSkgPT4geCA9PSBiW2ldKTtcbn1cbmZ1bmN0aW9uIHBvd2VyU2V0KGFycmF5KSB7XG4gICAgbGV0IHNldHMgPSBbW11dO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGUgPSBzZXRzLmxlbmd0aDsgaiA8IGU7IGorKykge1xuICAgICAgICAgICAgc2V0cy5wdXNoKHNldHNbal0uY29uY2F0KGFycmF5W2ldKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNldHMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aCk7XG59XG4vKipcblRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSBzZXQgb2YgdGFncyB0byBhIGxhbmd1YWdlIHN5bnRheFxudmlhIFtgTm9kZVNldC5leHRlbmRgXSgjY29tbW9uLk5vZGVTZXQuZXh0ZW5kKSBvclxuW2BMUlBhcnNlci5jb25maWd1cmVgXSgjbHIuTFJQYXJzZXIuY29uZmlndXJlKS5cblxuVGhlIGFyZ3VtZW50IG9iamVjdCBtYXBzIG5vZGUgc2VsZWN0b3JzIHRvIFtoaWdobGlnaHRpbmdcbnRhZ3NdKCNoaWdobGlnaHQuVGFnKSBvciBhcnJheXMgb2YgdGFncy5cblxuTm9kZSBzZWxlY3RvcnMgbWF5IGhvbGQgb25lIG9yIG1vcmUgKHNwYWNlLXNlcGFyYXRlZCkgbm9kZSBwYXRocy5cblN1Y2ggYSBwYXRoIGNhbiBiZSBhIFtub2RlIG5hbWVdKCNjb21tb24uTm9kZVR5cGUubmFtZSksIG9yXG5tdWx0aXBsZSBub2RlIG5hbWVzIChvciBgKmAgd2lsZGNhcmRzKSBzZXBhcmF0ZWQgYnkgc2xhc2hcbmNoYXJhY3RlcnMsIGFzIGluIGBcIkJsb2NrL0RlY2xhcmF0aW9uL1ZhcmlhYmxlTmFtZVwiYC4gU3VjaCBhIHBhdGhcbm1hdGNoZXMgdGhlIGZpbmFsIG5vZGUgYnV0IG9ubHkgaWYgaXRzIGRpcmVjdCBwYXJlbnQgbm9kZXMgYXJlIHRoZVxub3RoZXIgbm9kZXMgbWVudGlvbmVkLiBBIGAqYCBpbiBzdWNoIGEgcGF0aCBtYXRjaGVzIGFueSBwYXJlbnQsXG5idXQgb25seSBhIHNpbmdsZSBsZXZlbFx1MjAxNHdpbGRjYXJkcyB0aGF0IG1hdGNoIG11bHRpcGxlIHBhcmVudHNcbmFyZW4ndCBzdXBwb3J0ZWQsIGJvdGggZm9yIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBMZXplclxudHJlZXMgbWFrZSBpdCByYXRoZXIgaGFyZCB0byByZWFzb24gYWJvdXQgd2hhdCB0aGV5IHdvdWxkIG1hdGNoLilcblxuQSBwYXRoIGNhbiBiZSBlbmRlZCB3aXRoIGAvLi4uYCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0YWcgYXNzaWduZWRcbnRvIHRoZSBub2RlIHNob3VsZCBhbHNvIGFwcGx5IHRvIGFsbCBjaGlsZCBub2RlcywgZXZlbiBpZiB0aGV5XG5tYXRjaCB0aGVpciBvd24gc3R5bGUgKGJ5IGRlZmF1bHQsIG9ubHkgdGhlIGlubmVybW9zdCBzdHlsZSBpc1xudXNlZCkuXG5cbldoZW4gYSBwYXRoIGVuZHMgaW4gYCFgLCBhcyBpbiBgQXR0cmlidXRlIWAsIG5vIGZ1cnRoZXIgbWF0Y2hpbmdcbmhhcHBlbnMgZm9yIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMsIGFuZCB0aGUgZW50aXJlIG5vZGUgZ2V0cyB0aGVcbmdpdmVuIHN0eWxlLlxuXG5JbiB0aGlzIG5vdGF0aW9uLCBub2RlIG5hbWVzIHRoYXQgY29udGFpbiBgL2AsIGAhYCwgYCpgLCBvciBgLi4uYFxubXVzdCBiZSBxdW90ZWQgYXMgSlNPTiBzdHJpbmdzLlxuXG5Gb3IgZXhhbXBsZTpcblxuYGBgamF2YXNjcmlwdFxucGFyc2VyLndpdGhQcm9wcyhcbiAgc3R5bGVUYWdzKHtcbiAgICAvLyBTdHlsZSBOdW1iZXIgYW5kIEJpZ051bWJlciBub2Rlc1xuICAgIFwiTnVtYmVyIEJpZ051bWJlclwiOiB0YWdzLm51bWJlcixcbiAgICAvLyBTdHlsZSBFc2NhcGUgbm9kZXMgd2hvc2UgcGFyZW50IGlzIFN0cmluZ1xuICAgIFwiU3RyaW5nL0VzY2FwZVwiOiB0YWdzLmVzY2FwZSxcbiAgICAvLyBTdHlsZSBhbnl0aGluZyBpbnNpZGUgQXR0cmlidXRlcyBub2Rlc1xuICAgIFwiQXR0cmlidXRlcyFcIjogdGFncy5tZXRhLFxuICAgIC8vIEFkZCBhIHN0eWxlIHRvIGFsbCBjb250ZW50IGluc2lkZSBJdGFsaWMgbm9kZXNcbiAgICBcIkl0YWxpYy8uLi5cIjogdGFncy5lbXBoYXNpcyxcbiAgICAvLyBTdHlsZSBJbnZhbGlkU3RyaW5nIG5vZGVzIGFzIGJvdGggYHN0cmluZ2AgYW5kIGBpbnZhbGlkYFxuICAgIFwiSW52YWxpZFN0cmluZ1wiOiBbdGFncy5zdHJpbmcsIHRhZ3MuaW52YWxpZF0sXG4gICAgLy8gU3R5bGUgdGhlIG5vZGUgbmFtZWQgXCIvXCIgYXMgcHVuY3R1YXRpb25cbiAgICAnXCIvXCInOiB0YWdzLnB1bmN0dWF0aW9uXG4gIH0pXG4pXG5gYGBcbiovXG5mdW5jdGlvbiBzdHlsZVRhZ3Moc3BlYykge1xuICAgIGxldCBieU5hbWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgICAgICBsZXQgdGFncyA9IHNwZWNbcHJvcF07XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSlcbiAgICAgICAgICAgIHRhZ3MgPSBbdGFnc107XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcHJvcC5zcGxpdChcIiBcIikpXG4gICAgICAgICAgICBpZiAocGFydCkge1xuICAgICAgICAgICAgICAgIGxldCBwaWVjZXMgPSBbXSwgbW9kZSA9IDIgLyogTW9kZS5Ob3JtYWwgKi8sIHJlc3QgPSBwYXJ0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IDA7Oykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PSBcIi4uLlwiICYmIHBvcyA+IDAgJiYgcG9zICsgMyA9PSBwYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDEgLyogTW9kZS5Jbmhlcml0ICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSAvXlwiKD86W15cIlxcXFxdfFxcXFwuKSo/XCJ8W15cXC8hXSsvLmV4ZWMocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICBwaWVjZXMucHVzaChtWzBdID09IFwiKlwiID8gXCJcIiA6IG1bMF1bMF0gPT0gJ1wiJyA/IEpTT04ucGFyc2UobVswXSkgOiBtWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IG1bMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IHBhcnQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcGFydFtwb3MrK107XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gcGFydC5sZW5ndGggJiYgbmV4dCA9PSBcIiFcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDAgLyogTW9kZS5PcGFxdWUgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBcIi9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICByZXN0ID0gcGFydC5zbGljZShwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IHBpZWNlcy5sZW5ndGggLSAxLCBpbm5lciA9IHBpZWNlc1tsYXN0XTtcbiAgICAgICAgICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcGF0aDogXCIgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG5ldyBSdWxlKHRhZ3MsIG1vZGUsIGxhc3QgPiAwID8gcGllY2VzLnNsaWNlKDAsIGxhc3QpIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgYnlOYW1lW2lubmVyXSA9IHJ1bGUuc29ydChieU5hbWVbaW5uZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ1bGVOb2RlUHJvcC5hZGQoYnlOYW1lKTtcbn1cbmNvbnN0IHJ1bGVOb2RlUHJvcCA9IG5ldyBOb2RlUHJvcCgpO1xuY2xhc3MgUnVsZSB7XG4gICAgY29uc3RydWN0b3IodGFncywgbW9kZSwgY29udGV4dCwgbmV4dCkge1xuICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLm5leHQgPSBuZXh0O1xuICAgIH1cbiAgICBnZXQgb3BhcXVlKCkgeyByZXR1cm4gdGhpcy5tb2RlID09IDAgLyogTW9kZS5PcGFxdWUgKi87IH1cbiAgICBnZXQgaW5oZXJpdCgpIHsgcmV0dXJuIHRoaXMubW9kZSA9PSAxIC8qIE1vZGUuSW5oZXJpdCAqLzsgfVxuICAgIHNvcnQob3RoZXIpIHtcbiAgICAgICAgaWYgKCFvdGhlciB8fCBvdGhlci5kZXB0aCA8IHRoaXMuZGVwdGgpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCA9IG90aGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXIubmV4dCA9IHRoaXMuc29ydChvdGhlci5uZXh0KTtcbiAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgIH1cbiAgICBnZXQgZGVwdGgoKSB7IHJldHVybiB0aGlzLmNvbnRleHQgPyB0aGlzLmNvbnRleHQubGVuZ3RoIDogMDsgfVxufVxuUnVsZS5lbXB0eSA9IG5ldyBSdWxlKFtdLCAyIC8qIE1vZGUuTm9ybWFsICovLCBudWxsKTtcbi8qKlxuRGVmaW5lIGEgW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKSBmcm9tIGFuIGFycmF5IG9mXG50YWcvY2xhc3MgcGFpcnMuIENsYXNzZXMgYXNzb2NpYXRlZCB3aXRoIG1vcmUgc3BlY2lmaWMgdGFncyB3aWxsXG50YWtlIHByZWNlZGVuY2UuXG4qL1xuZnVuY3Rpb24gdGFnSGlnaGxpZ2h0ZXIodGFncywgb3B0aW9ucykge1xuICAgIGxldCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHN0eWxlIG9mIHRhZ3MpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0eWxlLnRhZykpXG4gICAgICAgICAgICBtYXBbc3R5bGUudGFnLmlkXSA9IHN0eWxlLmNsYXNzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmb3IgKGxldCB0YWcgb2Ygc3R5bGUudGFnKVxuICAgICAgICAgICAgICAgIG1hcFt0YWcuaWRdID0gc3R5bGUuY2xhc3M7XG4gICAgfVxuICAgIGxldCB7IHNjb3BlLCBhbGwgPSBudWxsIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiAodGFncykgPT4ge1xuICAgICAgICAgICAgbGV0IGNscyA9IGFsbDtcbiAgICAgICAgICAgIGZvciAobGV0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViIG9mIHRhZy5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ0NsYXNzID0gbWFwW3N1Yi5pZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2xzID8gY2xzICsgXCIgXCIgKyB0YWdDbGFzcyA6IHRhZ0NsYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgICB9LFxuICAgICAgICBzY29wZVxuICAgIH07XG59XG5mdW5jdGlvbiBoaWdobGlnaHRUYWdzKGhpZ2hsaWdodGVycywgdGFncykge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGZvciAobGV0IGhpZ2hsaWdodGVyIG9mIGhpZ2hsaWdodGVycykge1xuICAgICAgICBsZXQgdmFsdWUgPSBoaWdobGlnaHRlci5zdHlsZSh0YWdzKTtcbiAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gcmVzdWx0ICsgXCIgXCIgKyB2YWx1ZSA6IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5IaWdobGlnaHQgdGhlIGdpdmVuIFt0cmVlXSgjY29tbW9uLlRyZWUpIHdpdGggdGhlIGdpdmVuXG5baGlnaGxpZ2h0ZXJdKCNoaWdobGlnaHQuSGlnaGxpZ2h0ZXIpLiBPZnRlbiwgdGhlIGhpZ2hlci1sZXZlbFxuW2BoaWdobGlnaHRDb2RlYF0oI2hpZ2hsaWdodC5oaWdobGlnaHRDb2RlKSBmdW5jdGlvbiBpcyBlYXNpZXIgdG9cbnVzZS5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRUcmVlKHRyZWUsIGhpZ2hsaWdodGVyLCBcbi8qKlxuQXNzaWduIHN0eWxpbmcgdG8gYSByZWdpb24gb2YgdGhlIHRleHQuIFdpbGwgYmUgY2FsbGVkLCBpbiBvcmRlclxub2YgcG9zaXRpb24sIGZvciBhbnkgcmFuZ2VzIHdoZXJlIG1vcmUgdGhhbiB6ZXJvIGNsYXNzZXMgYXBwbHkuXG5gY2xhc3Nlc2AgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIENTUyBjbGFzc2VzLlxuKi9cbnB1dFN0eWxlLCBcbi8qKlxuVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBoaWdobGlnaHQuXG4qL1xuZnJvbSA9IDAsIFxuLyoqXG5UaGUgZW5kIG9mIHRoZSByYW5nZS5cbiovXG50byA9IHRyZWUubGVuZ3RoKSB7XG4gICAgbGV0IGJ1aWxkZXIgPSBuZXcgSGlnaGxpZ2h0QnVpbGRlcihmcm9tLCBBcnJheS5pc0FycmF5KGhpZ2hsaWdodGVyKSA/IGhpZ2hsaWdodGVyIDogW2hpZ2hsaWdodGVyXSwgcHV0U3R5bGUpO1xuICAgIGJ1aWxkZXIuaGlnaGxpZ2h0UmFuZ2UodHJlZS5jdXJzb3IoKSwgZnJvbSwgdG8sIFwiXCIsIGJ1aWxkZXIuaGlnaGxpZ2h0ZXJzKTtcbiAgICBidWlsZGVyLmZsdXNoKHRvKTtcbn1cbi8qKlxuSGlnaGxpZ2h0IHRoZSBnaXZlbiB0cmVlIHdpdGggdGhlIGdpdmVuIGhpZ2hsaWdodGVyLCBjYWxsaW5nXG5gcHV0VGV4dGAgZm9yIGV2ZXJ5IHBpZWNlIG9mIHRleHQsIGVpdGhlciB3aXRoIGEgc2V0IG9mIGNsYXNzZXMgb3JcbndpdGggdGhlIGVtcHR5IHN0cmluZyB3aGVuIHVuc3R5bGVkLCBhbmQgYHB1dEJyZWFrYCBmb3IgZXZlcnkgbGluZVxuYnJlYWsuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0Q29kZShjb2RlLCB0cmVlLCBoaWdobGlnaHRlciwgcHV0VGV4dCwgcHV0QnJlYWssIGZyb20gPSAwLCB0byA9IGNvZGUubGVuZ3RoKSB7XG4gICAgbGV0IHBvcyA9IGZyb207XG4gICAgZnVuY3Rpb24gd3JpdGVUbyhwLCBjbGFzc2VzKSB7XG4gICAgICAgIGlmIChwIDw9IHBvcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgdGV4dCA9IGNvZGUuc2xpY2UocG9zLCBwKSwgaSA9IDA7Oykge1xuICAgICAgICAgICAgbGV0IG5leHRCcmVhayA9IHRleHQuaW5kZXhPZihcIlxcblwiLCBpKTtcbiAgICAgICAgICAgIGxldCB1cHRvID0gbmV4dEJyZWFrIDwgMCA/IHRleHQubGVuZ3RoIDogbmV4dEJyZWFrO1xuICAgICAgICAgICAgaWYgKHVwdG8gPiBpKVxuICAgICAgICAgICAgICAgIHB1dFRleHQodGV4dC5zbGljZShpLCB1cHRvKSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICBpZiAobmV4dEJyZWFrIDwgMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHB1dEJyZWFrKCk7XG4gICAgICAgICAgICBpID0gbmV4dEJyZWFrICsgMTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBwO1xuICAgIH1cbiAgICBoaWdobGlnaHRUcmVlKHRyZWUsIGhpZ2hsaWdodGVyLCAoZnJvbSwgdG8sIGNsYXNzZXMpID0+IHtcbiAgICAgICAgd3JpdGVUbyhmcm9tLCBcIlwiKTtcbiAgICAgICAgd3JpdGVUbyh0bywgY2xhc3Nlcyk7XG4gICAgfSwgZnJvbSwgdG8pO1xuICAgIHdyaXRlVG8odG8sIFwiXCIpO1xufVxuY2xhc3MgSGlnaGxpZ2h0QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoYXQsIGhpZ2hsaWdodGVycywgc3Bhbikge1xuICAgICAgICB0aGlzLmF0ID0gYXQ7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZXJzID0gaGlnaGxpZ2h0ZXJzO1xuICAgICAgICB0aGlzLnNwYW4gPSBzcGFuO1xuICAgICAgICB0aGlzLmNsYXNzID0gXCJcIjtcbiAgICB9XG4gICAgc3RhcnRTcGFuKGF0LCBjbHMpIHtcbiAgICAgICAgaWYgKGNscyAhPSB0aGlzLmNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKGF0KTtcbiAgICAgICAgICAgIGlmIChhdCA+IHRoaXMuYXQpXG4gICAgICAgICAgICAgICAgdGhpcy5hdCA9IGF0O1xuICAgICAgICAgICAgdGhpcy5jbGFzcyA9IGNscztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaCh0bykge1xuICAgICAgICBpZiAodG8gPiB0aGlzLmF0ICYmIHRoaXMuY2xhc3MpXG4gICAgICAgICAgICB0aGlzLnNwYW4odGhpcy5hdCwgdG8sIHRoaXMuY2xhc3MpO1xuICAgIH1cbiAgICBoaWdobGlnaHRSYW5nZShjdXJzb3IsIGZyb20sIHRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGxldCB7IHR5cGUsIGZyb206IHN0YXJ0LCB0bzogZW5kIH0gPSBjdXJzb3I7XG4gICAgICAgIGlmIChzdGFydCA+PSB0byB8fCBlbmQgPD0gZnJvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGUuaXNUb3ApXG4gICAgICAgICAgICBoaWdobGlnaHRlcnMgPSB0aGlzLmhpZ2hsaWdodGVycy5maWx0ZXIoaCA9PiAhaC5zY29wZSB8fCBoLnNjb3BlKHR5cGUpKTtcbiAgICAgICAgbGV0IGNscyA9IGluaGVyaXRlZENsYXNzO1xuICAgICAgICBsZXQgcnVsZSA9IGdldFN0eWxlVGFncyhjdXJzb3IpIHx8IFJ1bGUuZW1wdHk7XG4gICAgICAgIGxldCB0YWdDbHMgPSBoaWdobGlnaHRUYWdzKGhpZ2hsaWdodGVycywgcnVsZS50YWdzKTtcbiAgICAgICAgaWYgKHRhZ0Nscykge1xuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCI7XG4gICAgICAgICAgICBjbHMgKz0gdGFnQ2xzO1xuICAgICAgICAgICAgaWYgKHJ1bGUubW9kZSA9PSAxIC8qIE1vZGUuSW5oZXJpdCAqLylcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWRDbGFzcyArPSAoaW5oZXJpdGVkQ2xhc3MgPyBcIiBcIiA6IFwiXCIpICsgdGFnQ2xzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWF4KGZyb20sIHN0YXJ0KSwgY2xzKTtcbiAgICAgICAgaWYgKHJ1bGUub3BhcXVlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbW91bnRlZCA9IGN1cnNvci50cmVlICYmIGN1cnNvci50cmVlLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgIGlmIChtb3VudGVkICYmIG1vdW50ZWQub3ZlcmxheSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gY3Vyc29yLm5vZGUuZW50ZXIobW91bnRlZC5vdmVybGF5WzBdLmZyb20gKyBzdGFydCwgMSk7XG4gICAgICAgICAgICBsZXQgaW5uZXJIaWdobGlnaHRlcnMgPSB0aGlzLmhpZ2hsaWdodGVycy5maWx0ZXIoaCA9PiAhaC5zY29wZSB8fCBoLnNjb3BlKG1vdW50ZWQudHJlZS50eXBlKSk7XG4gICAgICAgICAgICBsZXQgaGFzQ2hpbGQgPSBjdXJzb3IuZmlyc3RDaGlsZCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IHN0YXJ0OzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBpIDwgbW91bnRlZC5vdmVybGF5Lmxlbmd0aCA/IG1vdW50ZWQub3ZlcmxheVtpXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRQb3MgPSBuZXh0ID8gbmV4dC5mcm9tICsgc3RhcnQgOiBlbmQ7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlRnJvbSA9IE1hdGgubWF4KGZyb20sIHBvcyksIHJhbmdlVG8gPSBNYXRoLm1pbih0bywgbmV4dFBvcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlRnJvbSA8IHJhbmdlVG8gJiYgaGFzQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5mcm9tIDwgcmFuZ2VUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShjdXJzb3IsIHJhbmdlRnJvbSwgcmFuZ2VUbywgaW5oZXJpdGVkQ2xhc3MsIGhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbihyYW5nZVRvLCBjdXJzb3IudG8pLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci50byA+PSBuZXh0UG9zIHx8ICFjdXJzb3IubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dFBvcyA+IHRvKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwb3MgPSBuZXh0LnRvICsgc3RhcnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShpbm5lci5jdXJzb3IoKSwgTWF0aC5tYXgoZnJvbSwgbmV4dC5mcm9tICsgc3RhcnQpLCBNYXRoLm1pbih0bywgcG9zKSwgXCJcIiwgaW5uZXJIaWdobGlnaHRlcnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbih0bywgcG9zKSwgY2xzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzQ2hpbGQpXG4gICAgICAgICAgICAgICAgY3Vyc29yLnBhcmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnNvci5maXJzdENoaWxkKCkpIHtcbiAgICAgICAgICAgIGlmIChtb3VudGVkKVxuICAgICAgICAgICAgICAgIGluaGVyaXRlZENsYXNzID0gXCJcIjtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLnRvIDw9IGZyb20pXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZnJvbSA+PSB0bylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShjdXJzb3IsIGZyb20sIHRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbih0bywgY3Vyc29yLnRvKSwgY2xzKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5uZXh0U2libGluZygpKTtcbiAgICAgICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuTWF0Y2ggYSBzeW50YXggbm9kZSdzIFtoaWdobGlnaHQgcnVsZXNdKCNoaWdobGlnaHQuc3R5bGVUYWdzKS4gSWZcbnRoZXJlJ3MgYSBtYXRjaCwgcmV0dXJuIGl0cyBzZXQgb2YgdGFncywgYW5kIHdoZXRoZXIgaXQgaXNcbm9wYXF1ZSAodXNlcyBhIGAhYCkgb3IgYXBwbGllcyB0byBhbGwgY2hpbGQgbm9kZXMgKGAvLi4uYCkuXG4qL1xuZnVuY3Rpb24gZ2V0U3R5bGVUYWdzKG5vZGUpIHtcbiAgICBsZXQgcnVsZSA9IG5vZGUudHlwZS5wcm9wKHJ1bGVOb2RlUHJvcCk7XG4gICAgd2hpbGUgKHJ1bGUgJiYgcnVsZS5jb250ZXh0ICYmICFub2RlLm1hdGNoQ29udGV4dChydWxlLmNvbnRleHQpKVxuICAgICAgICBydWxlID0gcnVsZS5uZXh0O1xuICAgIHJldHVybiBydWxlIHx8IG51bGw7XG59XG5jb25zdCB0ID0gVGFnLmRlZmluZTtcbmNvbnN0IGNvbW1lbnQgPSB0KCksIG5hbWUgPSB0KCksIHR5cGVOYW1lID0gdChuYW1lKSwgcHJvcGVydHlOYW1lID0gdChuYW1lKSwgbGl0ZXJhbCA9IHQoKSwgc3RyaW5nID0gdChsaXRlcmFsKSwgbnVtYmVyID0gdChsaXRlcmFsKSwgY29udGVudCA9IHQoKSwgaGVhZGluZyA9IHQoY29udGVudCksIGtleXdvcmQgPSB0KCksIG9wZXJhdG9yID0gdCgpLCBwdW5jdHVhdGlvbiA9IHQoKSwgYnJhY2tldCA9IHQocHVuY3R1YXRpb24pLCBtZXRhID0gdCgpO1xuLyoqXG5UaGUgZGVmYXVsdCBzZXQgb2YgaGlnaGxpZ2h0aW5nIFt0YWdzXSgjaGlnaGxpZ2h0LlRhZykuXG5cblRoaXMgY29sbGVjdGlvbiBpcyBoZWF2aWx5IGJpYXNlZCB0b3dhcmRzIHByb2dyYW1taW5nIGxhbmd1YWdlcyxcbmFuZCBuZWNlc3NhcmlseSBpbmNvbXBsZXRlLiBBIGZ1bGwgb250b2xvZ3kgb2Ygc3ludGFjdGljXG5jb25zdHJ1Y3RzIHdvdWxkIGZpbGwgYSBzdGFjayBvZiBib29rcywgYW5kIGJlIGltcHJhY3RpY2FsIHRvXG53cml0ZSB0aGVtZXMgZm9yLiBTbyB0cnkgdG8gbWFrZSBkbyB3aXRoIHRoaXMgc2V0LiBJZiBhbGwgZWxzZVxuZmFpbHMsIFtvcGVuIGFuXG5pc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvci5uZXh0KSB0byBwcm9wb3NlIGFcbm5ldyB0YWcsIG9yIFtkZWZpbmVdKCNoaWdobGlnaHQuVGFnXmRlZmluZSkgYSBsb2NhbCBjdXN0b20gdGFnIGZvclxueW91ciB1c2UgY2FzZS5cblxuTm90ZSB0aGF0IGl0IGlzIG5vdCBvYmxpZ2F0b3J5IHRvIGFsd2F5cyBhdHRhY2ggdGhlIG1vc3Qgc3BlY2lmaWNcbnRhZyBwb3NzaWJsZSB0byBhbiBlbGVtZW50XHUyMDE0aWYgeW91ciBncmFtbWFyIGNhbid0IGVhc2lseVxuZGlzdGluZ3Vpc2ggYSBjZXJ0YWluIHR5cGUgb2YgZWxlbWVudCAoc3VjaCBhcyBhIGxvY2FsIHZhcmlhYmxlKSxcbml0IGlzIG9rYXkgdG8gc3R5bGUgaXQgYXMgaXRzIG1vcmUgZ2VuZXJhbCB2YXJpYW50IChhIHZhcmlhYmxlKS5cblxuRm9yIHRhZ3MgdGhhdCBleHRlbmQgc29tZSBwYXJlbnQgdGFnLCB0aGUgZG9jdW1lbnRhdGlvbiBsaW5rcyB0b1xudGhlIHBhcmVudC5cbiovXG5jb25zdCB0YWdzID0ge1xuICAgIC8qKlxuICAgIEEgY29tbWVudC5cbiAgICAqL1xuICAgIGNvbW1lbnQsXG4gICAgLyoqXG4gICAgQSBsaW5lIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBsaW5lQ29tbWVudDogdChjb21tZW50KSxcbiAgICAvKipcbiAgICBBIGJsb2NrIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBibG9ja0NvbW1lbnQ6IHQoY29tbWVudCksXG4gICAgLyoqXG4gICAgQSBkb2N1bWVudGF0aW9uIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBkb2NDb21tZW50OiB0KGNvbW1lbnQpLFxuICAgIC8qKlxuICAgIEFueSBraW5kIG9mIGlkZW50aWZpZXIuXG4gICAgKi9cbiAgICBuYW1lLFxuICAgIC8qKlxuICAgIFRoZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIG9mIGEgdmFyaWFibGUuXG4gICAgKi9cbiAgICB2YXJpYWJsZU5hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSB0eXBlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICB0eXBlTmFtZTogdHlwZU5hbWUsXG4gICAgLyoqXG4gICAgQSB0YWcgbmFtZSAoc3VidGFnIG9mIFtgdHlwZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudHlwZU5hbWUpKS5cbiAgICAqL1xuICAgIHRhZ05hbWU6IHQodHlwZU5hbWUpLFxuICAgIC8qKlxuICAgIEEgcHJvcGVydHkgb3IgZmllbGQgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgIC8qKlxuICAgIEFuIGF0dHJpYnV0ZSBuYW1lIChzdWJ0YWcgb2YgW2Bwcm9wZXJ0eU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKSkuXG4gICAgKi9cbiAgICBhdHRyaWJ1dGVOYW1lOiB0KHByb3BlcnR5TmFtZSksXG4gICAgLyoqXG4gICAgVGhlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgb2YgYSBjbGFzcy5cbiAgICAqL1xuICAgIGNsYXNzTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIGxhYmVsIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICBsYWJlbE5hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSBuYW1lc3BhY2UgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIG5hbWVzcGFjZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBUaGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSBvZiBhIG1hY3JvLlxuICAgICovXG4gICAgbWFjcm9OYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgbGl0ZXJhbCB2YWx1ZS5cbiAgICAqL1xuICAgIGxpdGVyYWwsXG4gICAgLyoqXG4gICAgQSBzdHJpbmcgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHN0cmluZyxcbiAgICAvKipcbiAgICBBIGRvY3VtZW50YXRpb24gW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykuXG4gICAgKi9cbiAgICBkb2NTdHJpbmc6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBIGNoYXJhY3RlciBsaXRlcmFsIChzdWJ0YWcgb2YgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykpLlxuICAgICovXG4gICAgY2hhcmFjdGVyOiB0KHN0cmluZyksXG4gICAgLyoqXG4gICAgQW4gYXR0cmlidXRlIHZhbHVlIChzdWJ0YWcgb2YgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykpLlxuICAgICovXG4gICAgYXR0cmlidXRlVmFsdWU6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBIG51bWJlciBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgbnVtYmVyLFxuICAgIC8qKlxuICAgIEFuIGludGVnZXIgW251bWJlcl0oI2hpZ2hsaWdodC50YWdzLm51bWJlcikgbGl0ZXJhbC5cbiAgICAqL1xuICAgIGludGVnZXI6IHQobnVtYmVyKSxcbiAgICAvKipcbiAgICBBIGZsb2F0aW5nLXBvaW50IFtudW1iZXJdKCNoaWdobGlnaHQudGFncy5udW1iZXIpIGxpdGVyYWwuXG4gICAgKi9cbiAgICBmbG9hdDogdChudW1iZXIpLFxuICAgIC8qKlxuICAgIEEgYm9vbGVhbiBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgYm9vbDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBSZWd1bGFyIGV4cHJlc3Npb24gW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHJlZ2V4cDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBbiBlc2NhcGUgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKSwgZm9yIGV4YW1wbGUgYVxuICAgIGJhY2tzbGFzaCBlc2NhcGUgaW4gYSBzdHJpbmcuXG4gICAgKi9cbiAgICBlc2NhcGU6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBjb2xvciBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgY29sb3I6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBVUkwgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHVybDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBIGxhbmd1YWdlIGtleXdvcmQuXG4gICAgKi9cbiAgICBrZXl3b3JkLFxuICAgIC8qKlxuICAgIFRoZSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGZvciB0aGUgc2VsZiBvciB0aGlzXG4gICAgb2JqZWN0LlxuICAgICovXG4gICAgc2VsZjogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBUaGUgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSBmb3IgbnVsbC5cbiAgICAqL1xuICAgIG51bGw6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGRlbm90aW5nIHNvbWUgYXRvbWljIHZhbHVlLlxuICAgICovXG4gICAgYXRvbTogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCByZXByZXNlbnRzIGEgdW5pdC5cbiAgICAqL1xuICAgIHVuaXQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBtb2RpZmllciBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpLlxuICAgICovXG4gICAgbW9kaWZpZXI6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHRoYXQgYWN0cyBhcyBhbiBvcGVyYXRvci5cbiAgICAqL1xuICAgIG9wZXJhdG9yS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIGNvbnRyb2wtZmxvdyByZWxhdGVkIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkuXG4gICAgKi9cbiAgICBjb250cm9sS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCBkZWZpbmVzIHNvbWV0aGluZy5cbiAgICAqL1xuICAgIGRlZmluaXRpb25LZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSByZWxhdGVkIHRvIGRlZmluaW5nIG9yXG4gICAgaW50ZXJmYWNpbmcgd2l0aCBtb2R1bGVzLlxuICAgICovXG4gICAgbW9kdWxlS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBbiBvcGVyYXRvci5cbiAgICAqL1xuICAgIG9wZXJhdG9yLFxuICAgIC8qKlxuICAgIEFuIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IGRlcmVmZXJlbmNlcyBzb21ldGhpbmcuXG4gICAgKi9cbiAgICBkZXJlZk9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBBcml0aG1ldGljLXJlbGF0ZWQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgYXJpdGhtZXRpY09wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBMb2dpY2FsIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGxvZ2ljT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIEJpdCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBiaXR3aXNlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIENvbXBhcmlzb24gW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgY29tcGFyZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBbT3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikgdGhhdCB1cGRhdGVzIGl0cyBvcGVyYW5kLlxuICAgICovXG4gICAgdXBkYXRlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFtPcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IGRlZmluZXMgc29tZXRoaW5nLlxuICAgICovXG4gICAgZGVmaW5pdGlvbk9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBUeXBlLXJlbGF0ZWQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgdHlwZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBDb250cm9sLWZsb3cgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgY29udHJvbE9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBQcm9ncmFtIG9yIG1hcmt1cCBwdW5jdHVhdGlvbi5cbiAgICAqL1xuICAgIHB1bmN0dWF0aW9uLFxuICAgIC8qKlxuICAgIFtQdW5jdHVhdGlvbl0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKSB0aGF0IHNlcGFyYXRlc1xuICAgIHRoaW5ncy5cbiAgICAqL1xuICAgIHNlcGFyYXRvcjogdChwdW5jdHVhdGlvbiksXG4gICAgLyoqXG4gICAgQnJhY2tldC1zdHlsZSBbcHVuY3R1YXRpb25dKCNoaWdobGlnaHQudGFncy5wdW5jdHVhdGlvbikuXG4gICAgKi9cbiAgICBicmFja2V0LFxuICAgIC8qKlxuICAgIEFuZ2xlIFticmFja2V0c10oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpICh1c3VhbGx5IGA8YCBhbmQgYD5gXG4gICAgdG9rZW5zKS5cbiAgICAqL1xuICAgIGFuZ2xlQnJhY2tldDogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBTcXVhcmUgW2JyYWNrZXRzXSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkgKHVzdWFsbHkgYFtgIGFuZCBgXWBcbiAgICB0b2tlbnMpLlxuICAgICovXG4gICAgc3F1YXJlQnJhY2tldDogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBQYXJlbnRoZXNlcyAodXN1YWxseSBgKGAgYW5kIGApYCB0b2tlbnMpLiBTdWJ0YWcgb2ZcbiAgICBbYnJhY2tldF0oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpLlxuICAgICovXG4gICAgcGFyZW46IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgQnJhY2VzICh1c3VhbGx5IGB7YCBhbmQgYH1gIHRva2VucykuIFN1YnRhZyBvZlxuICAgIFticmFja2V0XSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkuXG4gICAgKi9cbiAgICBicmFjZTogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBDb250ZW50LCBmb3IgZXhhbXBsZSBwbGFpbiB0ZXh0IGluIFhNTCBvciBtYXJrdXAgZG9jdW1lbnRzLlxuICAgICovXG4gICAgY29udGVudCxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIGhlYWRpbmcuXG4gICAgKi9cbiAgICBoZWFkaW5nLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgMSBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzE6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCAyIFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nMjogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDMgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmczOiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgNCBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzQ6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCA1IFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nNTogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDYgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmc2OiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgcHJvc2UgW2NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSBzZXBhcmF0b3IgKHN1Y2ggYXMgYSBob3Jpem9udGFsIHJ1bGUpLlxuICAgICovXG4gICAgY29udGVudFNlcGFyYXRvcjogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIGxpc3QuXG4gICAgKi9cbiAgICBsaXN0OiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCByZXByZXNlbnRzIGEgcXVvdGUuXG4gICAgKi9cbiAgICBxdW90ZTogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgZW1waGFzaXplZC5cbiAgICAqL1xuICAgIGVtcGhhc2lzOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBzdHlsZWQgc3Ryb25nLlxuICAgICovXG4gICAgc3Ryb25nOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBwYXJ0IG9mIGEgbGluay5cbiAgICAqL1xuICAgIGxpbms6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IGlzIHN0eWxlZCBhcyBjb2RlIG9yXG4gICAgbW9ub3NwYWNlLlxuICAgICovXG4gICAgbW9ub3NwYWNlOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBoYXMgYSBzdHJpa2UtdGhyb3VnaFxuICAgIHN0eWxlLlxuICAgICovXG4gICAgc3RyaWtldGhyb3VnaDogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBJbnNlcnRlZCB0ZXh0IGluIGEgY2hhbmdlLXRyYWNraW5nIGZvcm1hdC5cbiAgICAqL1xuICAgIGluc2VydGVkOiB0KCksXG4gICAgLyoqXG4gICAgRGVsZXRlZCB0ZXh0LlxuICAgICovXG4gICAgZGVsZXRlZDogdCgpLFxuICAgIC8qKlxuICAgIENoYW5nZWQgdGV4dC5cbiAgICAqL1xuICAgIGNoYW5nZWQ6IHQoKSxcbiAgICAvKipcbiAgICBBbiBpbnZhbGlkIG9yIHVuc3ludGFjdGljIGVsZW1lbnQuXG4gICAgKi9cbiAgICBpbnZhbGlkOiB0KCksXG4gICAgLyoqXG4gICAgTWV0YWRhdGEgb3IgbWV0YS1pbnN0cnVjdGlvbi5cbiAgICAqL1xuICAgIG1ldGEsXG4gICAgLyoqXG4gICAgW01ldGFkYXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkgdGhhdCBhcHBsaWVzIHRvIHRoZSBlbnRpcmVcbiAgICBkb2N1bWVudC5cbiAgICAqL1xuICAgIGRvY3VtZW50TWV0YTogdChtZXRhKSxcbiAgICAvKipcbiAgICBbTWV0YWRhdGFdKCNoaWdobGlnaHQudGFncy5tZXRhKSB0aGF0IGFubm90YXRlcyBvciBhZGRzXG4gICAgYXR0cmlidXRlcyB0byBhIGdpdmVuIHN5bnRhY3RpYyBlbGVtZW50LlxuICAgICovXG4gICAgYW5ub3RhdGlvbjogdChtZXRhKSxcbiAgICAvKipcbiAgICBQcm9jZXNzaW5nIGluc3RydWN0aW9uIG9yIHByZXByb2Nlc3NvciBkaXJlY3RpdmUuIFN1YnRhZyBvZlxuICAgIFttZXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkuXG4gICAgKi9cbiAgICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb246IHQobWV0YSksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhXG4gICAgZ2l2ZW4gZWxlbWVudCBpcyBiZWluZyBkZWZpbmVkLiBFeHBlY3RlZCB0byBiZSB1c2VkIHdpdGggdGhlXG4gICAgdmFyaW91cyBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIHRhZ3MuXG4gICAgKi9cbiAgICBkZWZpbml0aW9uOiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJkZWZpbml0aW9uXCIpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgaW5kaWNhdGVzIHRoYXRcbiAgICBzb21ldGhpbmcgaXMgY29uc3RhbnQuIE1vc3RseSBleHBlY3RlZCB0byBiZSB1c2VkIHdpdGhcbiAgICBbdmFyaWFibGUgbmFtZXNdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpLlxuICAgICovXG4gICAgY29uc3RhbnQ6IFRhZy5kZWZpbmVNb2RpZmllcihcImNvbnN0YW50XCIpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHVzZWQgdG8gaW5kaWNhdGUgdGhhdFxuICAgIGEgW3ZhcmlhYmxlXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKSBvciBbcHJvcGVydHlcbiAgICBuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKSBpcyBiZWluZyBjYWxsZWQgb3IgZGVmaW5lZFxuICAgIGFzIGEgZnVuY3Rpb24uXG4gICAgKi9cbiAgICBmdW5jdGlvbjogVGFnLmRlZmluZU1vZGlmaWVyKFwiZnVuY3Rpb25cIiksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBjYW4gYmUgYXBwbGllZCB0b1xuICAgIFtuYW1lc10oI2hpZ2hsaWdodC50YWdzLm5hbWUpIHRvIGluZGljYXRlIHRoYXQgdGhleSBiZWxvbmcgdG9cbiAgICB0aGUgbGFuZ3VhZ2UncyBzdGFuZGFyZCBlbnZpcm9ubWVudC5cbiAgICAqL1xuICAgIHN0YW5kYXJkOiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJzdGFuZGFyZFwiKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0IGluZGljYXRlcyBhIGdpdmVuXG4gICAgW25hbWVzXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgaXMgbG9jYWwgdG8gc29tZSBzY29wZS5cbiAgICAqL1xuICAgIGxvY2FsOiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJsb2NhbFwiKSxcbiAgICAvKipcbiAgICBBIGdlbmVyaWMgdmFyaWFudCBbbW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0XG4gICAgY2FuIGJlIHVzZWQgdG8gdGFnIGxhbmd1YWdlLXNwZWNpZmljIGFsdGVybmF0aXZlIHZhcmlhbnRzIG9mXG4gICAgc29tZSBjb21tb24gdGFnLiBJdCBpcyByZWNvbW1lbmRlZCBmb3IgdGhlbWVzIHRvIGRlZmluZSBzcGVjaWFsXG4gICAgZm9ybXMgb2YgYXQgbGVhc3QgdGhlIFtzdHJpbmddKCNoaWdobGlnaHQudGFncy5zdHJpbmcpIGFuZFxuICAgIFt2YXJpYWJsZSBuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKSB0YWdzLCBzaW5jZSB0aG9zZVxuICAgIGNvbWUgdXAgYSBsb3QuXG4gICAgKi9cbiAgICBzcGVjaWFsOiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJzcGVjaWFsXCIpXG59O1xuZm9yIChsZXQgbmFtZSBpbiB0YWdzKSB7XG4gICAgbGV0IHZhbCA9IHRhZ3NbbmFtZV07XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIFRhZylcbiAgICAgICAgdmFsLm5hbWUgPSBuYW1lO1xufVxuLyoqXG5UaGlzIGlzIGEgaGlnaGxpZ2h0ZXIgdGhhdCBhZGRzIHN0YWJsZSwgcHJlZGljdGFibGUgY2xhc3NlcyB0b1xudG9rZW5zLCBmb3Igc3R5bGluZyB3aXRoIGV4dGVybmFsIENTUy5cblxuVGhlIGZvbGxvd2luZyB0YWdzIGFyZSBtYXBwZWQgdG8gdGhlaXIgbmFtZSBwcmVmaXhlZCB3aXRoIGBcInRvay1cImBcbihmb3IgZXhhbXBsZSBgXCJ0b2stY29tbWVudFwiYCk6XG5cbiogW2BsaW5rYF0oI2hpZ2hsaWdodC50YWdzLmxpbmspXG4qIFtgaGVhZGluZ2BdKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKVxuKiBbYGVtcGhhc2lzYF0oI2hpZ2hsaWdodC50YWdzLmVtcGhhc2lzKVxuKiBbYHN0cm9uZ2BdKCNoaWdobGlnaHQudGFncy5zdHJvbmcpXG4qIFtga2V5d29yZGBdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKVxuKiBbYGF0b21gXSgjaGlnaGxpZ2h0LnRhZ3MuYXRvbSlcbiogW2Bib29sYF0oI2hpZ2hsaWdodC50YWdzLmJvb2wpXG4qIFtgdXJsYF0oI2hpZ2hsaWdodC50YWdzLnVybClcbiogW2BsYWJlbE5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MubGFiZWxOYW1lKVxuKiBbYGluc2VydGVkYF0oI2hpZ2hsaWdodC50YWdzLmluc2VydGVkKVxuKiBbYGRlbGV0ZWRgXSgjaGlnaGxpZ2h0LnRhZ3MuZGVsZXRlZClcbiogW2BsaXRlcmFsYF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpXG4qIFtgc3RyaW5nYF0oI2hpZ2hsaWdodC50YWdzLnN0cmluZylcbiogW2BudW1iZXJgXSgjaGlnaGxpZ2h0LnRhZ3MubnVtYmVyKVxuKiBbYHZhcmlhYmxlTmFtZWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4qIFtgdHlwZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudHlwZU5hbWUpXG4qIFtgbmFtZXNwYWNlYF0oI2hpZ2hsaWdodC50YWdzLm5hbWVzcGFjZSlcbiogW2BjbGFzc05hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MuY2xhc3NOYW1lKVxuKiBbYG1hY3JvTmFtZWBdKCNoaWdobGlnaHQudGFncy5tYWNyb05hbWUpXG4qIFtgcHJvcGVydHlOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSlcbiogW2BvcGVyYXRvcmBdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcilcbiogW2Bjb21tZW50YF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpXG4qIFtgbWV0YWBdKCNoaWdobGlnaHQudGFncy5tZXRhKVxuKiBbYHB1bmN0dWF0aW9uYF0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKVxuKiBbYGludmFsaWRgXSgjaGlnaGxpZ2h0LnRhZ3MuaW52YWxpZClcblxuSW4gYWRkaXRpb24sIHRoZXNlIG1hcHBpbmdzIGFyZSBwcm92aWRlZDpcblxuKiBbYHJlZ2V4cGBdKCNoaWdobGlnaHQudGFncy5yZWdleHApLFxuICBbYGVzY2FwZWBdKCNoaWdobGlnaHQudGFncy5lc2NhcGUpLCBhbmRcbiAgW2BzcGVjaWFsYF0oI2hpZ2hsaWdodC50YWdzLnNwZWNpYWwpW2Aoc3RyaW5nKWBdKCNoaWdobGlnaHQudGFncy5zdHJpbmcpXG4gIGFyZSBtYXBwZWQgdG8gYFwidG9rLXN0cmluZzJcImBcbiogW2BzcGVjaWFsYF0oI2hpZ2hsaWdodC50YWdzLnNwZWNpYWwpW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUyXCJgXG4qIFtgbG9jYWxgXSgjaGlnaGxpZ2h0LnRhZ3MubG9jYWwpW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUgdG9rLWxvY2FsXCJgXG4qIFtgZGVmaW5pdGlvbmBdKCNoaWdobGlnaHQudGFncy5kZWZpbml0aW9uKVtgKHZhcmlhYmxlTmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuICB0byBgXCJ0b2stdmFyaWFibGVOYW1lIHRvay1kZWZpbml0aW9uXCJgXG4qIFtgZGVmaW5pdGlvbmBdKCNoaWdobGlnaHQudGFncy5kZWZpbml0aW9uKVtgKHByb3BlcnR5TmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKVxuICB0byBgXCJ0b2stcHJvcGVydHlOYW1lIHRvay1kZWZpbml0aW9uXCJgXG4qL1xuY29uc3QgY2xhc3NIaWdobGlnaHRlciA9IHRhZ0hpZ2hsaWdodGVyKFtcbiAgICB7IHRhZzogdGFncy5saW5rLCBjbGFzczogXCJ0b2stbGlua1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaGVhZGluZywgY2xhc3M6IFwidG9rLWhlYWRpbmdcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmVtcGhhc2lzLCBjbGFzczogXCJ0b2stZW1waGFzaXNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cm9uZywgY2xhc3M6IFwidG9rLXN0cm9uZ1wiIH0sXG4gICAgeyB0YWc6IHRhZ3Mua2V5d29yZCwgY2xhc3M6IFwidG9rLWtleXdvcmRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmF0b20sIGNsYXNzOiBcInRvay1hdG9tXCIgfSxcbiAgICB7IHRhZzogdGFncy5ib29sLCBjbGFzczogXCJ0b2stYm9vbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MudXJsLCBjbGFzczogXCJ0b2stdXJsXCIgfSxcbiAgICB7IHRhZzogdGFncy5sYWJlbE5hbWUsIGNsYXNzOiBcInRvay1sYWJlbE5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmluc2VydGVkLCBjbGFzczogXCJ0b2staW5zZXJ0ZWRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmRlbGV0ZWQsIGNsYXNzOiBcInRvay1kZWxldGVkXCIgfSxcbiAgICB7IHRhZzogdGFncy5saXRlcmFsLCBjbGFzczogXCJ0b2stbGl0ZXJhbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3RyaW5nLCBjbGFzczogXCJ0b2stc3RyaW5nXCIgfSxcbiAgICB7IHRhZzogdGFncy5udW1iZXIsIGNsYXNzOiBcInRvay1udW1iZXJcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5yZWdleHAsIHRhZ3MuZXNjYXBlLCB0YWdzLnNwZWNpYWwodGFncy5zdHJpbmcpXSwgY2xhc3M6IFwidG9rLXN0cmluZzJcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnZhcmlhYmxlTmFtZSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubG9jYWwodGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lIHRvay1sb2NhbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVmaW5pdGlvbih0YWdzLnZhcmlhYmxlTmFtZSksIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWUgdG9rLWRlZmluaXRpb25cIiB9LFxuICAgIHsgdGFnOiB0YWdzLnNwZWNpYWwodGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lMlwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVmaW5pdGlvbih0YWdzLnByb3BlcnR5TmFtZSksIGNsYXNzOiBcInRvay1wcm9wZXJ0eU5hbWUgdG9rLWRlZmluaXRpb25cIiB9LFxuICAgIHsgdGFnOiB0YWdzLnR5cGVOYW1lLCBjbGFzczogXCJ0b2stdHlwZU5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm5hbWVzcGFjZSwgY2xhc3M6IFwidG9rLW5hbWVzcGFjZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY2xhc3NOYW1lLCBjbGFzczogXCJ0b2stY2xhc3NOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5tYWNyb05hbWUsIGNsYXNzOiBcInRvay1tYWNyb05hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnByb3BlcnR5TmFtZSwgY2xhc3M6IFwidG9rLXByb3BlcnR5TmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3Mub3BlcmF0b3IsIGNsYXNzOiBcInRvay1vcGVyYXRvclwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY29tbWVudCwgY2xhc3M6IFwidG9rLWNvbW1lbnRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm1ldGEsIGNsYXNzOiBcInRvay1tZXRhXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnZhbGlkLCBjbGFzczogXCJ0b2staW52YWxpZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MucHVuY3R1YXRpb24sIGNsYXNzOiBcInRvay1wdW5jdHVhdGlvblwiIH1cbl0pO1xuXG5leHBvcnQgeyBUYWcsIGNsYXNzSGlnaGxpZ2h0ZXIsIGdldFN0eWxlVGFncywgaGlnaGxpZ2h0Q29kZSwgaGlnaGxpZ2h0VHJlZSwgc3R5bGVUYWdzLCB0YWdIaWdobGlnaHRlciwgdGFncyB9O1xuIiwgImltcG9ydCB7IE5vZGVQcm9wLCBJdGVyTW9kZSwgVHJlZSwgVHJlZUZyYWdtZW50LCBQYXJzZXIsIE5vZGVUeXBlLCBOb2RlU2V0IH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5pbXBvcnQgeyBTdGF0ZUVmZmVjdCwgU3RhdGVGaWVsZCwgRmFjZXQsIEVkaXRvclN0YXRlLCBjb3VudENvbHVtbiwgY29tYmluZUNvbmZpZywgUmFuZ2VTZXQsIFJhbmdlU2V0QnVpbGRlciwgUHJlYyB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IFZpZXdQbHVnaW4sIGxvZ0V4Y2VwdGlvbiwgRWRpdG9yVmlldywgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSwgZ3V0dGVyLCBHdXR0ZXJNYXJrZXIsIERpcmVjdGlvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHsgdGFncywgdGFnSGlnaGxpZ2h0ZXIsIGhpZ2hsaWdodFRyZWUgfSBmcm9tICdAbGV6ZXIvaGlnaGxpZ2h0JztcbmltcG9ydCB7IFN0eWxlTW9kdWxlIH0gZnJvbSAnc3R5bGUtbW9kJztcblxudmFyIF9hO1xuLyoqXG5Ob2RlIHByb3Agc3RvcmVkIGluIGEgcGFyc2VyJ3MgdG9wIHN5bnRheCBub2RlIHRvIHByb3ZpZGUgdGhlXG5mYWNldCB0aGF0IHN0b3JlcyBsYW5ndWFnZS1zcGVjaWZpYyBkYXRhIGZvciB0aGF0IGxhbmd1YWdlLlxuKi9cbmNvbnN0IGxhbmd1YWdlRGF0YVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vKipcbkhlbHBlciBmdW5jdGlvbiB0byBkZWZpbmUgYSBmYWNldCAodG8gYmUgYWRkZWQgdG8gdGhlIHRvcCBzeW50YXhcbm5vZGUocykgZm9yIGEgbGFuZ3VhZ2UgdmlhXG5bYGxhbmd1YWdlRGF0YVByb3BgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmxhbmd1YWdlRGF0YVByb3ApKSwgdGhhdCB3aWxsIGJlXG51c2VkIHRvIGFzc29jaWF0ZSBsYW5ndWFnZSBkYXRhIHdpdGggdGhlIGxhbmd1YWdlLiBZb3VcbnByb2JhYmx5IG9ubHkgbmVlZCB0aGlzIHdoZW4gc3ViY2xhc3NpbmdcbltgTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKS5cbiovXG5mdW5jdGlvbiBkZWZpbmVMYW5ndWFnZUZhY2V0KGJhc2VEYXRhKSB7XG4gICAgcmV0dXJuIEZhY2V0LmRlZmluZSh7XG4gICAgICAgIGNvbWJpbmU6IGJhc2VEYXRhID8gdmFsdWVzID0+IHZhbHVlcy5jb25jYXQoYmFzZURhdGEpIDogdW5kZWZpbmVkXG4gICAgfSk7XG59XG4vKipcblN5bnRheCBub2RlIHByb3AgdXNlZCB0byByZWdpc3RlciBzdWJsYW5ndWFnZXMuIFNob3VsZCBiZSBhZGRlZCB0b1xudGhlIHRvcCBsZXZlbCBub2RlIHR5cGUgZm9yIHRoZSBsYW5ndWFnZS5cbiovXG5jb25zdCBzdWJsYW5ndWFnZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vKipcbkEgbGFuZ3VhZ2Ugb2JqZWN0IG1hbmFnZXMgcGFyc2luZyBhbmQgcGVyLWxhbmd1YWdlXG5bbWV0YWRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpLiBQYXJzZSBkYXRhIGlzXG5tYW5hZ2VkIGFzIGEgW0xlemVyXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0KSB0cmVlLiBUaGUgY2xhc3NcbmNhbiBiZSB1c2VkIGRpcmVjdGx5LCB2aWEgdGhlIFtgTFJMYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTFJMYW5ndWFnZSlcbnN1YmNsYXNzIGZvciBbTGV6ZXJdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvKSBMUiBwYXJzZXJzLCBvclxudmlhIHRoZSBbYFN0cmVhbUxhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5TdHJlYW1MYW5ndWFnZSkgc3ViY2xhc3NcbmZvciBzdHJlYW0gcGFyc2Vycy5cbiovXG5jbGFzcyBMYW5ndWFnZSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgbGFuZ3VhZ2Ugb2JqZWN0LiBJZiB5b3UgbmVlZCB0byBpbnZva2UgdGhpc1xuICAgIGRpcmVjdGx5LCBmaXJzdCBkZWZpbmUgYSBkYXRhIGZhY2V0IHdpdGhcbiAgICBbYGRlZmluZUxhbmd1YWdlRmFjZXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmRlZmluZUxhbmd1YWdlRmFjZXQpLCBhbmQgdGhlblxuICAgIGNvbmZpZ3VyZSB5b3VyIHBhcnNlciB0byBbYXR0YWNoXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmxhbmd1YWdlRGF0YVByb3ApIGl0XG4gICAgdG8gdGhlIGxhbmd1YWdlJ3Mgb3V0ZXIgc3ludGF4IG5vZGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgW2xhbmd1YWdlIGRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpIGZhY2V0XG4gICAgdXNlZCBmb3IgdGhpcyBsYW5ndWFnZS5cbiAgICAqL1xuICAgIGRhdGEsIHBhcnNlciwgZXh0cmFFeHRlbnNpb25zID0gW10sIFxuICAgIC8qKlxuICAgIEEgbGFuZ3VhZ2UgbmFtZS5cbiAgICAqL1xuICAgIG5hbWUgPSBcIlwiKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIEtsdWRnZSB0byBkZWZpbmUgRWRpdG9yU3RhdGUudHJlZSBhcyBhIGRlYnVnZ2luZyBoZWxwZXIsXG4gICAgICAgIC8vIHdpdGhvdXQgdGhlIEVkaXRvclN0YXRlIHBhY2thZ2UgYWN0dWFsbHkga25vd2luZyBhYm91dFxuICAgICAgICAvLyBsYW5ndWFnZXMgYW5kIGxlemVyIHRyZWVzLlxuICAgICAgICBpZiAoIUVkaXRvclN0YXRlLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcInRyZWVcIikpXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWRpdG9yU3RhdGUucHJvdG90eXBlLCBcInRyZWVcIiwgeyBnZXQoKSB7IHJldHVybiBzeW50YXhUcmVlKHRoaXMpOyB9IH0pO1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBbXG4gICAgICAgICAgICBsYW5ndWFnZS5vZih0aGlzKSxcbiAgICAgICAgICAgIEVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YS5vZigoc3RhdGUsIHBvcywgc2lkZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0b3AgPSB0b3BOb2RlQXQoc3RhdGUsIHBvcywgc2lkZSksIGRhdGEgPSB0b3AudHlwZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIGxldCBiYXNlID0gc3RhdGUuZmFjZXQoZGF0YSksIHN1YiA9IHRvcC50eXBlLnByb3Aoc3VibGFuZ3VhZ2VQcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAoc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lck5vZGUgPSB0b3AucmVzb2x2ZShwb3MgLSB0b3AuZnJvbSwgc2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN1Ymxhbmcgb2Ygc3ViKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmxhbmcudGVzdChpbm5lck5vZGUsIHN0YXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gc3RhdGUuZmFjZXQoc3VibGFuZy5mYWNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YmxhbmcudHlwZSA9PSBcInJlcGxhY2VcIiA/IGRhdGEgOiBkYXRhLmNvbmNhdChiYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICBdLmNvbmNhdChleHRyYUV4dGVuc2lvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBRdWVyeSB3aGV0aGVyIHRoaXMgbGFuZ3VhZ2UgaXMgYWN0aXZlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGlzQWN0aXZlQXQoc3RhdGUsIHBvcywgc2lkZSA9IC0xKSB7XG4gICAgICAgIHJldHVybiB0b3BOb2RlQXQoc3RhdGUsIHBvcywgc2lkZSkudHlwZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZG9jdW1lbnQgcmVnaW9ucyB0aGF0IHdlcmUgcGFyc2VkIHVzaW5nIHRoaXMgbGFuZ3VhZ2UuXG4gICAgVGhlIHJldHVybmVkIHJlZ2lvbnMgd2lsbCBfaW5jbHVkZV8gYW55IG5lc3RlZCBsYW5ndWFnZXMgcm9vdGVkXG4gICAgaW4gdGhpcyBsYW5ndWFnZSwgd2hlbiB0aG9zZSBleGlzdC5cbiAgICAqL1xuICAgIGZpbmRSZWdpb25zKHN0YXRlKSB7XG4gICAgICAgIGxldCBsYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoKGxhbmcgPT09IG51bGwgfHwgbGFuZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGFuZy5kYXRhKSA9PSB0aGlzLmRhdGEpXG4gICAgICAgICAgICByZXR1cm4gW3sgZnJvbTogMCwgdG86IHN0YXRlLmRvYy5sZW5ndGggfV07XG4gICAgICAgIGlmICghbGFuZyB8fCAhbGFuZy5hbGxvd3NOZXN0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCBleHBsb3JlID0gKHRyZWUsIGZyb20pID0+IHtcbiAgICAgICAgICAgIGlmICh0cmVlLnByb3AobGFuZ3VhZ2VEYXRhUHJvcCkgPT0gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tLCB0bzogZnJvbSArIHRyZWUubGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb3VudCA9IHRyZWUucHJvcChOb2RlUHJvcC5tb3VudGVkKTtcbiAgICAgICAgICAgIGlmIChtb3VudCkge1xuICAgICAgICAgICAgICAgIGlmIChtb3VudC50cmVlLnByb3AobGFuZ3VhZ2VEYXRhUHJvcCkgPT0gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3VudC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiBtb3VudC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbTogci5mcm9tICsgZnJvbSwgdG86IHIudG8gKyBmcm9tIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb206IGZyb20sIHRvOiBmcm9tICsgdHJlZS5sZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW91bnQub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGV4cGxvcmUobW91bnQudHJlZSwgbW91bnQub3ZlcmxheVswXS5mcm9tICsgZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gc2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyZWUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0cmVlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaCBpbnN0YW5jZW9mIFRyZWUpXG4gICAgICAgICAgICAgICAgICAgIGV4cGxvcmUoY2gsIHRyZWUucG9zaXRpb25zW2ldICsgZnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGV4cGxvcmUoc3ludGF4VHJlZShzdGF0ZSksIDApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGxhbmd1YWdlIGFsbG93cyBuZXN0ZWQgbGFuZ3VhZ2VzLiBUaGVcbiAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZS5cbiAgICAqL1xuICAgIGdldCBhbGxvd3NOZXN0aW5nKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5MYW5ndWFnZS5zZXRTdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbmZ1bmN0aW9uIHRvcE5vZGVBdChzdGF0ZSwgcG9zLCBzaWRlKSB7XG4gICAgbGV0IHRvcExhbmcgPSBzdGF0ZS5mYWNldChsYW5ndWFnZSksIHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKS50b3BOb2RlO1xuICAgIGlmICghdG9wTGFuZyB8fCB0b3BMYW5nLmFsbG93c05lc3RpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHRyZWU7IG5vZGU7IG5vZGUgPSBub2RlLmVudGVyKHBvcywgc2lkZSwgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpKVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5pc1RvcClcbiAgICAgICAgICAgICAgICB0cmVlID0gbm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHRyZWU7XG59XG4vKipcbkEgc3ViY2xhc3Mgb2YgW2BMYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpIGZvciB1c2Ugd2l0aCBMZXplclxuW0xSIHBhcnNlcnNdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjbHIuTFJQYXJzZXIpXG5wYXJzZXJzLlxuKi9cbmNsYXNzIExSTGFuZ3VhZ2UgZXh0ZW5kcyBMYW5ndWFnZSB7XG4gICAgY29uc3RydWN0b3IoZGF0YSwgcGFyc2VyLCBuYW1lKSB7XG4gICAgICAgIHN1cGVyKGRhdGEsIHBhcnNlciwgW10sIG5hbWUpO1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbGFuZ3VhZ2UgZnJvbSBhIHBhcnNlci5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYykge1xuICAgICAgICBsZXQgZGF0YSA9IGRlZmluZUxhbmd1YWdlRmFjZXQoc3BlYy5sYW5ndWFnZURhdGEpO1xuICAgICAgICByZXR1cm4gbmV3IExSTGFuZ3VhZ2UoZGF0YSwgc3BlYy5wYXJzZXIuY29uZmlndXJlKHtcbiAgICAgICAgICAgIHByb3BzOiBbbGFuZ3VhZ2VEYXRhUHJvcC5hZGQodHlwZSA9PiB0eXBlLmlzVG9wID8gZGF0YSA6IHVuZGVmaW5lZCldXG4gICAgICAgIH0pLCBzcGVjLm5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBsYW5ndWFnZSB3aXRoIGEgcmVjb25maWd1cmVkXG4gICAgdmVyc2lvbiBvZiBpdHMgcGFyc2VyIGFuZCBvcHRpb25hbGx5IGEgbmV3IG5hbWUuXG4gICAgKi9cbiAgICBjb25maWd1cmUob3B0aW9ucywgbmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IExSTGFuZ3VhZ2UodGhpcy5kYXRhLCB0aGlzLnBhcnNlci5jb25maWd1cmUob3B0aW9ucyksIG5hbWUgfHwgdGhpcy5uYW1lKTtcbiAgICB9XG4gICAgZ2V0IGFsbG93c05lc3RpbmcoKSB7IHJldHVybiB0aGlzLnBhcnNlci5oYXNXcmFwcGVycygpOyB9XG59XG4vKipcbkdldCB0aGUgc3ludGF4IHRyZWUgZm9yIGEgc3RhdGUsIHdoaWNoIGlzIHRoZSBjdXJyZW50IChwb3NzaWJseVxuaW5jb21wbGV0ZSkgcGFyc2UgdHJlZSBvZiB0aGUgYWN0aXZlXG5bbGFuZ3VhZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpLCBvciB0aGUgZW1wdHkgdHJlZSBpZiB0aGVyZSBpcyBub1xubGFuZ3VhZ2UgYXZhaWxhYmxlLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFRyZWUoc3RhdGUpIHtcbiAgICBsZXQgZmllbGQgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSwgZmFsc2UpO1xuICAgIHJldHVybiBmaWVsZCA/IGZpZWxkLnRyZWUgOiBUcmVlLmVtcHR5O1xufVxuLyoqXG5UcnkgdG8gZ2V0IGEgcGFyc2UgdHJlZSB0aGF0IHNwYW5zIGF0IGxlYXN0IHVwIHRvIGB1cHRvYC4gVGhlXG5tZXRob2Qgd2lsbCBkbyBhdCBtb3N0IGB0aW1lb3V0YCBtaWxsaXNlY29uZHMgb2Ygd29yayB0byBwYXJzZVxudXAgdG8gdGhhdCBwb2ludCBpZiB0aGUgdHJlZSBpc24ndCBhbHJlYWR5IGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBlbnN1cmVTeW50YXhUcmVlKHN0YXRlLCB1cHRvLCB0aW1lb3V0ID0gNTApIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IHBhcnNlID0gKF9hID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbnRleHQ7XG4gICAgaWYgKCFwYXJzZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG9sZFZpZXBvcnQgPSBwYXJzZS52aWV3cG9ydDtcbiAgICBwYXJzZS51cGRhdGVWaWV3cG9ydCh7IGZyb206IDAsIHRvOiB1cHRvIH0pO1xuICAgIGxldCByZXN1bHQgPSBwYXJzZS5pc0RvbmUodXB0bykgfHwgcGFyc2Uud29yayh0aW1lb3V0LCB1cHRvKSA/IHBhcnNlLnRyZWUgOiBudWxsO1xuICAgIHBhcnNlLnVwZGF0ZVZpZXdwb3J0KG9sZFZpZXBvcnQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcblF1ZXJpZXMgd2hldGhlciB0aGVyZSBpcyBhIGZ1bGwgc3ludGF4IHRyZWUgYXZhaWxhYmxlIHVwIHRvIHRoZVxuZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uIElmIHRoZXJlIGlzbid0LCB0aGUgYmFja2dyb3VuZCBwYXJzZVxucHJvY2VzcyBfbWlnaHRfIHN0aWxsIGJlIHdvcmtpbmcgYW5kIHVwZGF0ZSB0aGUgdHJlZSBmdXJ0aGVyLCBidXRcbnRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvZiB0aGF0XHUyMDE0dGhlIHBhcnNlciB3aWxsIFtzdG9wXG53b3JraW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnN5bnRheFBhcnNlclJ1bm5pbmcpIHdoZW4gaXQgaGFzIHNwZW50IGFcbmNlcnRhaW4gYW1vdW50IG9mIHRpbWUgb3IgaGFzIG1vdmVkIGJleW9uZCB0aGUgdmlzaWJsZSB2aWV3cG9ydC5cbkFsd2F5cyByZXR1cm5zIGZhbHNlIGlmIG5vIGxhbmd1YWdlIGhhcyBiZWVuIGVuYWJsZWQuXG4qL1xuZnVuY3Rpb24gc3ludGF4VHJlZUF2YWlsYWJsZShzdGF0ZSwgdXB0byA9IHN0YXRlLmRvYy5sZW5ndGgpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuICgoX2EgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSwgZmFsc2UpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGV4dC5pc0RvbmUodXB0bykpIHx8IGZhbHNlO1xufVxuLyoqXG5Nb3ZlIHBhcnNpbmcgZm9yd2FyZCwgYW5kIHVwZGF0ZSB0aGUgZWRpdG9yIHN0YXRlIGFmdGVyd2FyZHMgdG9cbnJlZmxlY3QgdGhlIG5ldyB0cmVlLiBXaWxsIHdvcmsgZm9yIGF0IG1vc3QgYHRpbWVvdXRgXG5taWxsaXNlY29uZHMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyc2VyIG1hbmFnZWQgZ2V0IHRvIHRoZSBnaXZlblxucG9zaXRpb24gaW4gdGhhdCB0aW1lLlxuKi9cbmZ1bmN0aW9uIGZvcmNlUGFyc2luZyh2aWV3LCB1cHRvID0gdmlldy52aWV3cG9ydC50bywgdGltZW91dCA9IDEwMCkge1xuICAgIGxldCBzdWNjZXNzID0gZW5zdXJlU3ludGF4VHJlZSh2aWV3LnN0YXRlLCB1cHRvLCB0aW1lb3V0KTtcbiAgICBpZiAoc3VjY2VzcyAhPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpKVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHt9KTtcbiAgICByZXR1cm4gISFzdWNjZXNzO1xufVxuLyoqXG5UZWxscyB5b3Ugd2hldGhlciB0aGUgbGFuZ3VhZ2UgcGFyc2VyIGlzIHBsYW5uaW5nIHRvIGRvIG1vcmVcbnBhcnNpbmcgd29yayAoaW4gYSBgcmVxdWVzdElkbGVDYWxsYmFja2AgcHNldWRvLXRocmVhZCkgb3IgaGFzXG5zdG9wcGVkIHJ1bm5pbmcsIGVpdGhlciBiZWNhdXNlIGl0IHBhcnNlZCB0aGUgZW50aXJlIGRvY3VtZW50LFxuYmVjYXVzZSBpdCBzcGVudCB0b28gbXVjaCB0aW1lIGFuZCB3YXMgY3V0IG9mZiwgb3IgYmVjYXVzZSB0aGVyZVxuaXMgbm8gbGFuZ3VhZ2UgcGFyc2VyIGVuYWJsZWQuXG4qL1xuZnVuY3Rpb24gc3ludGF4UGFyc2VyUnVubmluZyh2aWV3KSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4ocGFyc2VXb3JrZXIpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNXb3JraW5nKCkpIHx8IGZhbHNlO1xufVxuLyoqXG5MZXplci1zdHlsZVxuW2BJbnB1dGBdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjY29tbW9uLklucHV0KVxub2JqZWN0IGZvciBhIFtgVGV4dGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dCkgb2JqZWN0LlxuKi9cbmNsYXNzIERvY0lucHV0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5wdXQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihkb2MpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuY3Vyc29yUG9zID0gMDtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBcIlwiO1xuICAgICAgICB0aGlzLmN1cnNvciA9IGRvYy5pdGVyKCk7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLmRvYy5sZW5ndGg7IH1cbiAgICBzeW5jVG8ocG9zKSB7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gdGhpcy5jdXJzb3IubmV4dChwb3MgLSB0aGlzLmN1cnNvclBvcykudmFsdWU7XG4gICAgICAgIHRoaXMuY3Vyc29yUG9zID0gcG9zICsgdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJzb3JQb3MgLSB0aGlzLnN0cmluZy5sZW5ndGg7XG4gICAgfVxuICAgIGNodW5rKHBvcykge1xuICAgICAgICB0aGlzLnN5bmNUbyhwb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmc7XG4gICAgfVxuICAgIGdldCBsaW5lQ2h1bmtzKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIHJlYWQoZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IHN0cmluZ1N0YXJ0ID0gdGhpcy5jdXJzb3JQb3MgLSB0aGlzLnN0cmluZy5sZW5ndGg7XG4gICAgICAgIGlmIChmcm9tIDwgc3RyaW5nU3RhcnQgfHwgdG8gPj0gdGhpcy5jdXJzb3JQb3MpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb2Muc2xpY2VTdHJpbmcoZnJvbSwgdG8pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UoZnJvbSAtIHN0cmluZ1N0YXJ0LCB0byAtIHN0cmluZ1N0YXJ0KTtcbiAgICB9XG59XG5sZXQgY3VycmVudENvbnRleHQgPSBudWxsO1xuLyoqXG5BIHBhcnNlIGNvbnRleHQgcHJvdmlkZWQgdG8gcGFyc2VycyB3b3JraW5nIG9uIHRoZSBlZGl0b3IgY29udGVudC5cbiovXG5jbGFzcyBQYXJzZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIFRyZWUgZnJhZ21lbnRzIHRoYXQgY2FuIGJlIHJldXNlZCBieSBpbmNyZW1lbnRhbCByZS1wYXJzZXMuXG4gICAgKi9cbiAgICBmcmFnbWVudHMgPSBbXSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0cmVlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRyZWVMZW4sIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciB2aWV3cG9ydCAob3Igc29tZSBvdmVyYXBwcm94aW1hdGlvblxuICAgIHRoZXJlb2YpLiBJbnRlbmRlZCB0byBiZSB1c2VkIGZvciBvcHBvcnR1bmlzdGljYWxseSBhdm9pZGluZ1xuICAgIHdvcmsgKGluIHdoaWNoIGNhc2VcbiAgICBbYHNraXBVbnRpbEluVmlld2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuUGFyc2VDb250ZXh0LnNraXBVbnRpbEluVmlldylcbiAgICBzaG91bGQgYmUgY2FsbGVkIHRvIG1ha2Ugc3VyZSB0aGUgcGFyc2VyIGlzIHJlc3RhcnRlZCB3aGVuIHRoZVxuICAgIHNraXBwZWQgcmVnaW9uIGJlY29tZXMgdmlzaWJsZSkuXG4gICAgKi9cbiAgICB2aWV3cG9ydCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBza2lwcGVkLCBcbiAgICAvKipcbiAgICBUaGlzIGlzIHdoZXJlIHNraXBwaW5nIHBhcnNlcnMgY2FuIHJlZ2lzdGVyIGEgcHJvbWlzZSB0aGF0LFxuICAgIHdoZW4gcmVzb2x2ZWQsIHdpbGwgc2NoZWR1bGUgYSBuZXcgcGFyc2UuIEl0IGlzIGNsZWFyZWQgd2hlblxuICAgIHRoZSBwYXJzZSB3b3JrZXIgcGlja3MgdXAgdGhlIHByb21pc2UuIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2NoZWR1bGVPbikge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgdGhpcy50cmVlTGVuID0gdHJlZUxlbjtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICB0aGlzLnNraXBwZWQgPSBza2lwcGVkO1xuICAgICAgICB0aGlzLnNjaGVkdWxlT24gPSBzY2hlZHVsZU9uO1xuICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRlbXBTa2lwcGVkID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShwYXJzZXIsIHN0YXRlLCB2aWV3cG9ydCkge1xuICAgICAgICByZXR1cm4gbmV3IFBhcnNlQ29udGV4dChwYXJzZXIsIHN0YXRlLCBbXSwgVHJlZS5lbXB0eSwgMCwgdmlld3BvcnQsIFtdLCBudWxsKTtcbiAgICB9XG4gICAgc3RhcnRQYXJzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VyLnN0YXJ0UGFyc2UobmV3IERvY0lucHV0KHRoaXMuc3RhdGUuZG9jKSwgdGhpcy5mcmFnbWVudHMpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHdvcmsodW50aWwsIHVwdG8pIHtcbiAgICAgICAgaWYgKHVwdG8gIT0gbnVsbCAmJiB1cHRvID49IHRoaXMuc3RhdGUuZG9jLmxlbmd0aClcbiAgICAgICAgICAgIHVwdG8gPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnRyZWUgIT0gVHJlZS5lbXB0eSAmJiB0aGlzLmlzRG9uZSh1cHRvICE9PSBudWxsICYmIHVwdG8gIT09IHZvaWQgMCA/IHVwdG8gOiB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpKSB7XG4gICAgICAgICAgICB0aGlzLnRha2VUcmVlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy53aXRoQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVudGlsID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kVGltZSA9IERhdGUubm93KCkgKyB1bnRpbDtcbiAgICAgICAgICAgICAgICB1bnRpbCA9ICgpID0+IERhdGUubm93KCkgPiBlbmRUaW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlKVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnN0YXJ0UGFyc2UoKTtcbiAgICAgICAgICAgIGlmICh1cHRvICE9IG51bGwgJiYgKHRoaXMucGFyc2Uuc3RvcHBlZEF0ID09IG51bGwgfHwgdGhpcy5wYXJzZS5zdG9wcGVkQXQgPiB1cHRvKSAmJlxuICAgICAgICAgICAgICAgIHVwdG8gPCB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZS5zdG9wQXQodXB0byk7XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgbGV0IGRvbmUgPSB0aGlzLnBhcnNlLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IHRoaXMud2l0aG91dFRlbXBTa2lwcGVkKFRyZWVGcmFnbWVudC5hZGRUcmVlKGRvbmUsIHRoaXMuZnJhZ21lbnRzLCB0aGlzLnBhcnNlLnN0b3BwZWRBdCAhPSBudWxsKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZUxlbiA9IChfYSA9IHRoaXMucGFyc2Uuc3RvcHBlZEF0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnN0YXRlLmRvYy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZSA9IGRvbmU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmVlTGVuIDwgKHVwdG8gIT09IG51bGwgJiYgdXB0byAhPT0gdm9pZCAwID8gdXB0byA6IHRoaXMuc3RhdGUuZG9jLmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5zdGFydFBhcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodW50aWwoKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0YWtlVHJlZSgpIHtcbiAgICAgICAgbGV0IHBvcywgdHJlZTtcbiAgICAgICAgaWYgKHRoaXMucGFyc2UgJiYgKHBvcyA9IHRoaXMucGFyc2UucGFyc2VkUG9zKSA+PSB0aGlzLnRyZWVMZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlLnN0b3BwZWRBdCA9PSBudWxsIHx8IHRoaXMucGFyc2Uuc3RvcHBlZEF0ID4gcG9zKVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2Uuc3RvcEF0KHBvcyk7XG4gICAgICAgICAgICB0aGlzLndpdGhDb250ZXh0KCgpID0+IHsgd2hpbGUgKCEodHJlZSA9IHRoaXMucGFyc2UuYWR2YW5jZSgpKSkgeyB9IH0pO1xuICAgICAgICAgICAgdGhpcy50cmVlTGVuID0gcG9zO1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzID0gdGhpcy53aXRob3V0VGVtcFNraXBwZWQoVHJlZUZyYWdtZW50LmFkZFRyZWUodGhpcy50cmVlLCB0aGlzLmZyYWdtZW50cywgdHJ1ZSkpO1xuICAgICAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2l0aENvbnRleHQoZikge1xuICAgICAgICBsZXQgcHJldiA9IGN1cnJlbnRDb250ZXh0O1xuICAgICAgICBjdXJyZW50Q29udGV4dCA9IHRoaXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZigpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBwcmV2O1xuICAgICAgICB9XG4gICAgfVxuICAgIHdpdGhvdXRUZW1wU2tpcHBlZChmcmFnbWVudHMpIHtcbiAgICAgICAgZm9yIChsZXQgcjsgciA9IHRoaXMudGVtcFNraXBwZWQucG9wKCk7KVxuICAgICAgICAgICAgZnJhZ21lbnRzID0gY3V0RnJhZ21lbnRzKGZyYWdtZW50cywgci5mcm9tLCByLnRvKTtcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50cztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGFuZ2VzKGNoYW5nZXMsIG5ld1N0YXRlKSB7XG4gICAgICAgIGxldCB7IGZyYWdtZW50cywgdHJlZSwgdHJlZUxlbiwgdmlld3BvcnQsIHNraXBwZWQgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMudGFrZVRyZWUoKTtcbiAgICAgICAgaWYgKCFjaGFuZ2VzLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgICAgICBjaGFuZ2VzLml0ZXJDaGFuZ2VkUmFuZ2VzKChmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSA9PiByYW5nZXMucHVzaCh7IGZyb21BLCB0b0EsIGZyb21CLCB0b0IgfSkpO1xuICAgICAgICAgICAgZnJhZ21lbnRzID0gVHJlZUZyYWdtZW50LmFwcGx5Q2hhbmdlcyhmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgICAgICB0cmVlID0gVHJlZS5lbXB0eTtcbiAgICAgICAgICAgIHRyZWVMZW4gPSAwO1xuICAgICAgICAgICAgdmlld3BvcnQgPSB7IGZyb206IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LmZyb20sIC0xKSwgdG86IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LnRvLCAxKSB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuc2tpcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiB0aGlzLnNraXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSBjaGFuZ2VzLm1hcFBvcyhyLmZyb20sIDEpLCB0byA9IGNoYW5nZXMubWFwUG9zKHIudG8sIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gPCB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFBhcnNlQ29udGV4dCh0aGlzLnBhcnNlciwgbmV3U3RhdGUsIGZyYWdtZW50cywgdHJlZSwgdHJlZUxlbiwgdmlld3BvcnQsIHNraXBwZWQsIHRoaXMuc2NoZWR1bGVPbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdXBkYXRlVmlld3BvcnQodmlld3BvcnQpIHtcbiAgICAgICAgaWYgKHRoaXMudmlld3BvcnQuZnJvbSA9PSB2aWV3cG9ydC5mcm9tICYmIHRoaXMudmlld3BvcnQudG8gPT0gdmlld3BvcnQudG8pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgbGV0IHN0YXJ0TGVuID0gdGhpcy5za2lwcGVkLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNraXBwZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLnNraXBwZWRbaV07XG4gICAgICAgICAgICBpZiAoZnJvbSA8IHZpZXdwb3J0LnRvICYmIHRvID4gdmlld3BvcnQuZnJvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzID0gY3V0RnJhZ21lbnRzKHRoaXMuZnJhZ21lbnRzLCBmcm9tLCB0byk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwcGVkLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWQubGVuZ3RoID49IHN0YXJ0TGVuKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJzZSkge1xuICAgICAgICAgICAgdGhpcy50YWtlVHJlZSgpO1xuICAgICAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTm90aWZ5IHRoZSBwYXJzZSBzY2hlZHVsZXIgdGhhdCB0aGUgZ2l2ZW4gcmVnaW9uIHdhcyBza2lwcGVkXG4gICAgYmVjYXVzZSBpdCB3YXNuJ3QgaW4gdmlldywgYW5kIHRoZSBwYXJzZSBzaG91bGQgYmUgcmVzdGFydGVkXG4gICAgd2hlbiBpdCBjb21lcyBpbnRvIHZpZXcuXG4gICAgKi9cbiAgICBza2lwVW50aWxJblZpZXcoZnJvbSwgdG8pIHtcbiAgICAgICAgdGhpcy5za2lwcGVkLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIHBhcnNlciBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHBsYWNlaG9sZGVyIHdoZW5cbiAgICBhc3luY2hyb25vdXNseSBsb2FkaW5nIGEgbmVzdGVkIHBhcnNlci4gSXQnbGwgc2tpcCBpdHMgaW5wdXQgYW5kXG4gICAgbWFyayBpdCBhcyBub3QtcmVhbGx5LXBhcnNlZCwgc28gdGhhdCB0aGUgbmV4dCB1cGRhdGUgd2lsbCBwYXJzZVxuICAgIGl0IGFnYWluLlxuICAgIFxuICAgIFdoZW4gYHVudGlsYCBpcyBnaXZlbiwgYSByZXBhcnNlIHdpbGwgYmUgc2NoZWR1bGVkIHdoZW4gdGhhdFxuICAgIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0U2tpcHBpbmdQYXJzZXIodW50aWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFBhcnNlciB7XG4gICAgICAgICAgICBjcmVhdGVQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHJhbmdlc1swXS5mcm9tLCB0byA9IHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0udG87XG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkUG9zOiBmcm9tLFxuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN4ID0gY3VycmVudENvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIHJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3gudGVtcFNraXBwZWQucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW50aWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LnNjaGVkdWxlT24gPSBjeC5zY2hlZHVsZU9uID8gUHJvbWlzZS5hbGwoW2N4LnNjaGVkdWxlT24sIHVudGlsXSkgOiB1bnRpbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkUG9zID0gdG87XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWUoTm9kZVR5cGUubm9uZSwgW10sIFtdLCB0byAtIGZyb20pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdG9wcGVkQXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN0b3BBdCgpIHsgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpc0RvbmUodXB0bykge1xuICAgICAgICB1cHRvID0gTWF0aC5taW4odXB0bywgdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICAgICAgbGV0IGZyYWdzID0gdGhpcy5mcmFnbWVudHM7XG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVMZW4gPj0gdXB0byAmJiBmcmFncy5sZW5ndGggJiYgZnJhZ3NbMF0uZnJvbSA9PSAwICYmIGZyYWdzWzBdLnRvID49IHVwdG87XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY29udGV4dCBmb3IgdGhlIGN1cnJlbnQgcGFyc2UsIG9yIGBudWxsYCBpZiBubyBlZGl0b3JcbiAgICBwYXJzZSBpcyBpbiBwcm9ncmVzcy5cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQoKSB7IHJldHVybiBjdXJyZW50Q29udGV4dDsgfVxufVxuZnVuY3Rpb24gY3V0RnJhZ21lbnRzKGZyYWdtZW50cywgZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gVHJlZUZyYWdtZW50LmFwcGx5Q2hhbmdlcyhmcmFnbWVudHMsIFt7IGZyb21BOiBmcm9tLCB0b0E6IHRvLCBmcm9tQjogZnJvbSwgdG9COiB0byB9XSk7XG59XG5jbGFzcyBMYW5ndWFnZVN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBBIG11dGFibGUgcGFyc2Ugc3RhdGUgdGhhdCBpcyB1c2VkIHRvIHByZXNlcnZlIHdvcmsgZG9uZSBkdXJpbmdcbiAgICAvLyB0aGUgbGlmZXRpbWUgb2YgYSBzdGF0ZSB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMudHJlZSA9IGNvbnRleHQudHJlZTtcbiAgICB9XG4gICAgYXBwbHkodHIpIHtcbiAgICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkICYmIHRoaXMudHJlZSA9PSB0aGlzLmNvbnRleHQudHJlZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgbmV3Q3ggPSB0aGlzLmNvbnRleHQuY2hhbmdlcyh0ci5jaGFuZ2VzLCB0ci5zdGF0ZSk7XG4gICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBwYXJzZSB3YXNuJ3QgZG9uZSwgZ28gZm9yd2FyZCBvbmx5IHVwIHRvIGl0c1xuICAgICAgICAvLyBlbmQgcG9zaXRpb24gb3IgdGhlIGVuZCBvZiB0aGUgdmlld3BvcnQsIHRvIGF2b2lkIHNsb3dpbmcgZG93blxuICAgICAgICAvLyBzdGF0ZSB1cGRhdGVzIHdpdGggcGFyc2Ugd29yayBiZXlvbmQgdGhlIHZpZXdwb3J0LlxuICAgICAgICBsZXQgdXB0byA9IHRoaXMuY29udGV4dC50cmVlTGVuID09IHRyLnN0YXJ0U3RhdGUuZG9jLmxlbmd0aCA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBNYXRoLm1heCh0ci5jaGFuZ2VzLm1hcFBvcyh0aGlzLmNvbnRleHQudHJlZUxlbiksIG5ld0N4LnZpZXdwb3J0LnRvKTtcbiAgICAgICAgaWYgKCFuZXdDeC53b3JrKDIwIC8qIFdvcmsuQXBwbHkgKi8sIHVwdG8pKVxuICAgICAgICAgICAgbmV3Q3gudGFrZVRyZWUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZVN0YXRlKG5ld0N4KTtcbiAgICB9XG4gICAgc3RhdGljIGluaXQoc3RhdGUpIHtcbiAgICAgICAgbGV0IHZwVG8gPSBNYXRoLm1pbigzMDAwIC8qIFdvcmsuSW5pdFZpZXdwb3J0ICovLCBzdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICAgICAgbGV0IHBhcnNlU3RhdGUgPSBQYXJzZUNvbnRleHQuY3JlYXRlKHN0YXRlLmZhY2V0KGxhbmd1YWdlKS5wYXJzZXIsIHN0YXRlLCB7IGZyb206IDAsIHRvOiB2cFRvIH0pO1xuICAgICAgICBpZiAoIXBhcnNlU3RhdGUud29yaygyMCAvKiBXb3JrLkFwcGx5ICovLCB2cFRvKSlcbiAgICAgICAgICAgIHBhcnNlU3RhdGUudGFrZVRyZWUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZVN0YXRlKHBhcnNlU3RhdGUpO1xuICAgIH1cbn1cbkxhbmd1YWdlLnN0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGU6IExhbmd1YWdlU3RhdGUuaW5pdCxcbiAgICB1cGRhdGUodmFsdWUsIHRyKSB7XG4gICAgICAgIGZvciAobGV0IGUgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgIGlmIChlLmlzKExhbmd1YWdlLnNldFN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZTtcbiAgICAgICAgaWYgKHRyLnN0YXJ0U3RhdGUuZmFjZXQobGFuZ3VhZ2UpICE9IHRyLnN0YXRlLmZhY2V0KGxhbmd1YWdlKSlcbiAgICAgICAgICAgIHJldHVybiBMYW5ndWFnZVN0YXRlLmluaXQodHIuc3RhdGUpO1xuICAgICAgICByZXR1cm4gdmFsdWUuYXBwbHkodHIpO1xuICAgIH1cbn0pO1xubGV0IHJlcXVlc3RJZGxlID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgbGV0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKCksIDUwMCAvKiBXb3JrLk1heFBhdXNlICovKTtcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufTtcbmlmICh0eXBlb2YgcmVxdWVzdElkbGVDYWxsYmFjayAhPSBcInVuZGVmaW5lZFwiKVxuICAgIHJlcXVlc3RJZGxlID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGxldCBpZGxlID0gLTEsIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlkbGUgPSByZXF1ZXN0SWRsZUNhbGxiYWNrKGNhbGxiYWNrLCB7IHRpbWVvdXQ6IDUwMCAvKiBXb3JrLk1heFBhdXNlICovIC0gMTAwIC8qIFdvcmsuTWluUGF1c2UgKi8gfSk7XG4gICAgICAgIH0sIDEwMCAvKiBXb3JrLk1pblBhdXNlICovKTtcbiAgICAgICAgcmV0dXJuICgpID0+IGlkbGUgPCAwID8gY2xlYXJUaW1lb3V0KHRpbWVvdXQpIDogY2FuY2VsSWRsZUNhbGxiYWNrKGlkbGUpO1xuICAgIH07XG5jb25zdCBpc0lucHV0UGVuZGluZyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAoKF9hID0gbmF2aWdhdG9yLnNjaGVkdWxpbmcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0lucHV0UGVuZGluZylcbiAgICA/ICgpID0+IG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nKCkgOiBudWxsO1xuY29uc3QgcGFyc2VXb3JrZXIgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3MgUGFyc2VXb3JrZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy53b3JraW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy53b3JrU2NoZWR1bGVkID0gMDtcbiAgICAgICAgLy8gRW5kIG9mIHRoZSBjdXJyZW50IHRpbWUgY2h1bmtcbiAgICAgICAgdGhpcy5jaHVua0VuZCA9IC0xO1xuICAgICAgICAvLyBNaWxsaXNlY29uZHMgb2YgYnVkZ2V0IGxlZnQgZm9yIHRoaXMgY2h1bmtcbiAgICAgICAgdGhpcy5jaHVua0J1ZGdldCA9IC0xO1xuICAgICAgICB0aGlzLndvcmsgPSB0aGlzLndvcmsuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmsoKTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgY3ggPSB0aGlzLnZpZXcuc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUpLmNvbnRleHQ7XG4gICAgICAgIGlmIChjeC51cGRhdGVWaWV3cG9ydCh1cGRhdGUudmlldy52aWV3cG9ydCkgfHwgdGhpcy52aWV3LnZpZXdwb3J0LnRvID4gY3gudHJlZUxlbilcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Lmhhc0ZvY3VzKVxuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgKz0gNTAgLyogV29yay5DaGFuZ2VCb251cyAqLztcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGVja0FzeW5jU2NoZWR1bGUoY3gpO1xuICAgIH1cbiAgICBzY2hlZHVsZVdvcmsoKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSB0aGlzLnZpZXcsIGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUpO1xuICAgICAgICBpZiAoZmllbGQudHJlZSAhPSBmaWVsZC5jb250ZXh0LnRyZWUgfHwgIWZpZWxkLmNvbnRleHQuaXNEb25lKHN0YXRlLmRvYy5sZW5ndGgpKVxuICAgICAgICAgICAgdGhpcy53b3JraW5nID0gcmVxdWVzdElkbGUodGhpcy53b3JrKTtcbiAgICB9XG4gICAgd29yayhkZWFkbGluZSkge1xuICAgICAgICB0aGlzLndvcmtpbmcgPSBudWxsO1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtFbmQgPCBub3cgJiYgKHRoaXMuY2h1bmtFbmQgPCAwIHx8IHRoaXMudmlldy5oYXNGb2N1cykpIHsgLy8gU3RhcnQgYSBuZXcgY2h1bmtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtFbmQgPSBub3cgKyAzMDAwMCAvKiBXb3JrLkNodW5rVGltZSAqLztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgPSAzMDAwIC8qIFdvcmsuQ2h1bmtCdWRnZXQgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2h1bmtCdWRnZXQgPD0gMClcbiAgICAgICAgICAgIHJldHVybjsgLy8gTm8gbW9yZSBidWRnZXRcbiAgICAgICAgbGV0IHsgc3RhdGUsIHZpZXdwb3J0OiB7IHRvOiB2cFRvIH0gfSA9IHRoaXMudmlldywgZmllbGQgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSk7XG4gICAgICAgIGlmIChmaWVsZC50cmVlID09IGZpZWxkLmNvbnRleHQudHJlZSAmJiBmaWVsZC5jb250ZXh0LmlzRG9uZSh2cFRvICsgMTAwMDAwIC8qIFdvcmsuTWF4UGFyc2VBaGVhZCAqLykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBlbmRUaW1lID0gRGF0ZS5ub3coKSArIE1hdGgubWluKHRoaXMuY2h1bmtCdWRnZXQsIDEwMCAvKiBXb3JrLlNsaWNlICovLCBkZWFkbGluZSAmJiAhaXNJbnB1dFBlbmRpbmcgPyBNYXRoLm1heCgyNSAvKiBXb3JrLk1pblNsaWNlICovLCBkZWFkbGluZS50aW1lUmVtYWluaW5nKCkgLSA1KSA6IDFlOSk7XG4gICAgICAgIGxldCB2aWV3cG9ydEZpcnN0ID0gZmllbGQuY29udGV4dC50cmVlTGVuIDwgdnBUbyAmJiBzdGF0ZS5kb2MubGVuZ3RoID4gdnBUbyArIDEwMDA7XG4gICAgICAgIGxldCBkb25lID0gZmllbGQuY29udGV4dC53b3JrKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpc0lucHV0UGVuZGluZyAmJiBpc0lucHV0UGVuZGluZygpIHx8IERhdGUubm93KCkgPiBlbmRUaW1lO1xuICAgICAgICB9LCB2cFRvICsgKHZpZXdwb3J0Rmlyc3QgPyAwIDogMTAwMDAwIC8qIFdvcmsuTWF4UGFyc2VBaGVhZCAqLykpO1xuICAgICAgICB0aGlzLmNodW5rQnVkZ2V0IC09IERhdGUubm93KCkgLSBub3c7XG4gICAgICAgIGlmIChkb25lIHx8IHRoaXMuY2h1bmtCdWRnZXQgPD0gMCkge1xuICAgICAgICAgICAgZmllbGQuY29udGV4dC50YWtlVHJlZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogTGFuZ3VhZ2Uuc2V0U3RhdGUub2YobmV3IExhbmd1YWdlU3RhdGUoZmllbGQuY29udGV4dCkpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rQnVkZ2V0ID4gMCAmJiAhKGRvbmUgJiYgIXZpZXdwb3J0Rmlyc3QpKVxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmsoKTtcbiAgICAgICAgdGhpcy5jaGVja0FzeW5jU2NoZWR1bGUoZmllbGQuY29udGV4dCk7XG4gICAgfVxuICAgIGNoZWNrQXN5bmNTY2hlZHVsZShjeCkge1xuICAgICAgICBpZiAoY3guc2NoZWR1bGVPbikge1xuICAgICAgICAgICAgdGhpcy53b3JrU2NoZWR1bGVkKys7XG4gICAgICAgICAgICBjeC5zY2hlZHVsZU9uXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5zY2hlZHVsZVdvcmsoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IGxvZ0V4Y2VwdGlvbih0aGlzLnZpZXcuc3RhdGUsIGVycikpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy53b3JrU2NoZWR1bGVkLS0pO1xuICAgICAgICAgICAgY3guc2NoZWR1bGVPbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMud29ya2luZylcbiAgICAgICAgICAgIHRoaXMud29ya2luZygpO1xuICAgIH1cbiAgICBpc1dvcmtpbmcoKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLndvcmtpbmcgfHwgdGhpcy53b3JrU2NoZWR1bGVkID4gMCk7XG4gICAgfVxufSwge1xuICAgIGV2ZW50SGFuZGxlcnM6IHsgZm9jdXMoKSB7IHRoaXMuc2NoZWR1bGVXb3JrKCk7IH0gfVxufSk7XG4vKipcblRoZSBmYWNldCB1c2VkIHRvIGFzc29jaWF0ZSBhIGxhbmd1YWdlIHdpdGggYW4gZWRpdG9yIHN0YXRlLiBVc2VkXG5ieSBgTGFuZ3VhZ2VgIG9iamVjdCdzIGBleHRlbnNpb25gIHByb3BlcnR5IChzbyB5b3UgZG9uJ3QgbmVlZCB0b1xubWFudWFsbHkgd3JhcCB5b3VyIGxhbmd1YWdlcyBpbiB0aGlzKS4gQ2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZVxuY3VycmVudCBsYW5ndWFnZSBvbiBhIHN0YXRlLlxuKi9cbmNvbnN0IGxhbmd1YWdlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShsYW5ndWFnZXMpIHsgcmV0dXJuIGxhbmd1YWdlcy5sZW5ndGggPyBsYW5ndWFnZXNbMF0gOiBudWxsOyB9LFxuICAgIGVuYWJsZXM6IGxhbmd1YWdlID0+IFtcbiAgICAgICAgTGFuZ3VhZ2Uuc3RhdGUsXG4gICAgICAgIHBhcnNlV29ya2VyLFxuICAgICAgICBFZGl0b3JWaWV3LmNvbnRlbnRBdHRyaWJ1dGVzLmNvbXB1dGUoW2xhbmd1YWdlXSwgc3RhdGUgPT4ge1xuICAgICAgICAgICAgbGV0IGxhbmcgPSBzdGF0ZS5mYWNldChsYW5ndWFnZSk7XG4gICAgICAgICAgICByZXR1cm4gbGFuZyAmJiBsYW5nLm5hbWUgPyB7IFwiZGF0YS1sYW5ndWFnZVwiOiBsYW5nLm5hbWUgfSA6IHt9O1xuICAgICAgICB9KVxuICAgIF1cbn0pO1xuLyoqXG5UaGlzIGNsYXNzIGJ1bmRsZXMgYSBbbGFuZ3VhZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpIHdpdGggYW5cbm9wdGlvbmFsIHNldCBvZiBzdXBwb3J0aW5nIGV4dGVuc2lvbnMuIExhbmd1YWdlIHBhY2thZ2VzIGFyZVxuZW5jb3VyYWdlZCB0byBleHBvcnQgYSBmdW5jdGlvbiB0aGF0IG9wdGlvbmFsbHkgdGFrZXMgYVxuY29uZmlndXJhdGlvbiBvYmplY3QgYW5kIHJldHVybnMgYSBgTGFuZ3VhZ2VTdXBwb3J0YCBpbnN0YW5jZSwgYXNcbnRoZSBtYWluIHdheSBmb3IgY2xpZW50IGNvZGUgdG8gdXNlIHRoZSBwYWNrYWdlLlxuKi9cbmNsYXNzIExhbmd1YWdlU3VwcG9ydCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbGFuZ3VhZ2Ugc3VwcG9ydCBvYmplY3QuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbGFuZ3VhZ2Ugb2JqZWN0LlxuICAgICovXG4gICAgbGFuZ3VhZ2UsIFxuICAgIC8qKlxuICAgIEFuIG9wdGlvbmFsIHNldCBvZiBzdXBwb3J0aW5nIGV4dGVuc2lvbnMuIFdoZW4gbmVzdGluZyBhXG4gICAgbGFuZ3VhZ2UgaW4gYW5vdGhlciBsYW5ndWFnZSwgdGhlIG91dGVyIGxhbmd1YWdlIGlzIGVuY291cmFnZWRcbiAgICB0byBpbmNsdWRlIHRoZSBzdXBwb3J0aW5nIGV4dGVuc2lvbnMgZm9yIGl0cyBpbm5lciBsYW5ndWFnZXNcbiAgICBpbiBpdHMgb3duIHNldCBvZiBzdXBwb3J0IGV4dGVuc2lvbnMuXG4gICAgKi9cbiAgICBzdXBwb3J0ID0gW10pIHtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgICAgICB0aGlzLnN1cHBvcnQgPSBzdXBwb3J0O1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IFtsYW5ndWFnZSwgc3VwcG9ydF07XG4gICAgfVxufVxuLyoqXG5MYW5ndWFnZSBkZXNjcmlwdGlvbnMgYXJlIHVzZWQgdG8gc3RvcmUgbWV0YWRhdGEgYWJvdXQgbGFuZ3VhZ2VzXG5hbmQgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGVtLiBUaGVpciBtYWluIHJvbGUgaXMgZmluZGluZyB0aGVcbmFwcHJvcHJpYXRlIGxhbmd1YWdlIGZvciBhIGZpbGVuYW1lIG9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgbmVzdGVkXG5wYXJzZXJzLlxuKi9cbmNsYXNzIExhbmd1YWdlRGVzY3JpcHRpb24ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIG9mIHRoaXMgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBBbHRlcm5hdGl2ZSBuYW1lcyBmb3IgdGhlIG1vZGUgKGxvd2VyY2FzZWQsIGluY2x1ZGVzIGB0aGlzLm5hbWVgKS5cbiAgICAqL1xuICAgIGFsaWFzLCBcbiAgICAvKipcbiAgICBGaWxlIGV4dGVuc2lvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBleHRlbnNpb25zLCBcbiAgICAvKipcbiAgICBPcHRpb25hbCBmaWxlbmFtZSBwYXR0ZXJuIHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzXG4gICAgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBmaWxlbmFtZSwgbG9hZEZ1bmMsIFxuICAgIC8qKlxuICAgIElmIHRoZSBsYW5ndWFnZSBoYXMgYmVlbiBsb2FkZWQsIHRoaXMgd2lsbCBob2xkIGl0cyB2YWx1ZS5cbiAgICAqL1xuICAgIHN1cHBvcnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xuICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgICAgIHRoaXMubG9hZEZ1bmMgPSBsb2FkRnVuYztcbiAgICAgICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhcnQgbG9hZGluZyB0aGUgdGhlIGxhbmd1YWdlLiBXaWxsIHJldHVybiBhIHByb21pc2UgdGhhdFxuICAgIHJlc29sdmVzIHRvIGEgW2BMYW5ndWFnZVN1cHBvcnRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlU3VwcG9ydClcbiAgICBvYmplY3Qgd2hlbiB0aGUgbGFuZ3VhZ2Ugc3VjY2Vzc2Z1bGx5IGxvYWRzLlxuICAgICovXG4gICAgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCAodGhpcy5sb2FkaW5nID0gdGhpcy5sb2FkRnVuYygpLnRoZW4oc3VwcG9ydCA9PiB0aGlzLnN1cHBvcnQgPSBzdXBwb3J0LCBlcnIgPT4geyB0aGlzLmxvYWRpbmcgPSBudWxsOyB0aHJvdyBlcnI7IH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbGFuZ3VhZ2UgZGVzY3JpcHRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgb2Yoc3BlYykge1xuICAgICAgICBsZXQgeyBsb2FkLCBzdXBwb3J0IH0gPSBzcGVjO1xuICAgICAgICBpZiAoIWxvYWQpIHtcbiAgICAgICAgICAgIGlmICghc3VwcG9ydClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11c3QgcGFzcyBlaXRoZXIgJ2xvYWQnIG9yICdzdXBwb3J0JyB0byBMYW5ndWFnZURlc2NyaXB0aW9uLm9mXCIpO1xuICAgICAgICAgICAgbG9hZCA9ICgpID0+IFByb21pc2UucmVzb2x2ZShzdXBwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IExhbmd1YWdlRGVzY3JpcHRpb24oc3BlYy5uYW1lLCAoc3BlYy5hbGlhcyB8fCBbXSkuY29uY2F0KHNwZWMubmFtZSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSwgc3BlYy5leHRlbnNpb25zIHx8IFtdLCBzcGVjLmZpbGVuYW1lLCBsb2FkLCBzdXBwb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgTG9vayBmb3IgYSBsYW5ndWFnZSBpbiB0aGUgZ2l2ZW4gYXJyYXkgb2YgZGVzY3JpcHRpb25zIHRoYXRcbiAgICBtYXRjaGVzIHRoZSBmaWxlbmFtZS4gV2lsbCBmaXJzdCBtYXRjaFxuICAgIFtgZmlsZW5hbWVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlRGVzY3JpcHRpb24uZmlsZW5hbWUpIHBhdHRlcm5zLFxuICAgIGFuZCB0aGVuIFtleHRlbnNpb25zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlRGVzY3JpcHRpb24uZXh0ZW5zaW9ucyksXG4gICAgYW5kIHJldHVybiB0aGUgZmlyc3QgbGFuZ3VhZ2UgdGhhdCBtYXRjaGVzLlxuICAgICovXG4gICAgc3RhdGljIG1hdGNoRmlsZW5hbWUoZGVzY3MsIGZpbGVuYW1lKSB7XG4gICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICBpZiAoZC5maWxlbmFtZSAmJiBkLmZpbGVuYW1lLnRlc3QoZmlsZW5hbWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICBsZXQgZXh0ID0gL1xcLihbXi5dKykkLy5leGVjKGZpbGVuYW1lKTtcbiAgICAgICAgaWYgKGV4dClcbiAgICAgICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICAgICAgaWYgKGQuZXh0ZW5zaW9ucy5pbmRleE9mKGV4dFsxXSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBMb29rIGZvciBhIGxhbmd1YWdlIHdob3NlIG5hbWUgb3IgYWxpYXMgbWF0Y2hlcyB0aGUgdGhlIGdpdmVuXG4gICAgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZWx5KS4gSWYgYGZ1enp5YCBpcyB0cnVlLCBhbmQgbm8gZGlyZWN0XG4gICAgbWF0Y2hzIGlzIGZvdW5kLCB0aGlzJ2xsIGFsc28gc2VhcmNoIGZvciBhIGxhbmd1YWdlIHdob3NlIG5hbWVcbiAgICBvciBhbGlhcyBvY2N1cnMgaW4gdGhlIHN0cmluZyAoZm9yIG5hbWVzIHNob3J0ZXIgdGhhbiB0aHJlZVxuICAgIGNoYXJhY3RlcnMsIG9ubHkgd2hlbiBzdXJyb3VuZGVkIGJ5IG5vbi13b3JkIGNoYXJhY3RlcnMpLlxuICAgICovXG4gICAgc3RhdGljIG1hdGNoTGFuZ3VhZ2VOYW1lKGRlc2NzLCBuYW1lLCBmdXp6eSA9IHRydWUpIHtcbiAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgIGlmIChkLmFsaWFzLnNvbWUoYSA9PiBhID09IG5hbWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICBpZiAoZnV6enkpXG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGEgb2YgZC5hbGlhcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBuYW1lLmluZGV4T2YoYSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xICYmIChhLmxlbmd0aCA+IDIgfHwgIS9cXHcvLnRlc3QobmFtZVtmb3VuZCAtIDFdKSAmJiAhL1xcdy8udGVzdChuYW1lW2ZvdW5kICsgYS5sZW5ndGhdKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLyoqXG5GYWNldCB0aGF0IGRlZmluZXMgYSB3YXkgdG8gcHJvdmlkZSBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgdGhlXG5hcHByb3ByaWF0ZSBpbmRlbnRhdGlvbiBkZXB0aCwgYXMgYSBjb2x1bW4gbnVtYmVyIChzZWVcbltgaW5kZW50U3RyaW5nYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTdHJpbmcpKSwgYXQgdGhlIHN0YXJ0IG9mIGEgZ2l2ZW5cbmxpbmUuIEEgcmV0dXJuIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgbm8gaW5kZW50YXRpb24gY2FuIGJlXG5kZXRlcm1pbmVkLCBhbmQgdGhlIGxpbmUgc2hvdWxkIGluaGVyaXQgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBvbmVcbmFib3ZlIGl0LiBBIHJldHVybiB2YWx1ZSBvZiBgdW5kZWZpbmVkYCBkZWZlcnMgdG8gdGhlIG5leHQgaW5kZW50XG5zZXJ2aWNlLlxuKi9cbmNvbnN0IGluZGVudFNlcnZpY2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkZhY2V0IGZvciBvdmVycmlkaW5nIHRoZSB1bml0IGJ5IHdoaWNoIGluZGVudGF0aW9uIGhhcHBlbnMuIFNob3VsZFxuYmUgYSBzdHJpbmcgY29uc2lzdGluZyBlaXRoZXIgZW50aXJlbHkgb2YgdGhlIHNhbWUgd2hpdGVzcGFjZVxuY2hhcmFjdGVyLiBXaGVuIG5vdCBzZXQsIHRoaXMgZGVmYXVsdHMgdG8gMiBzcGFjZXMuXG4qL1xuY29uc3QgaW5kZW50VW5pdCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB7XG4gICAgICAgIGlmICghdmFsdWVzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBcIiAgXCI7XG4gICAgICAgIGxldCB1bml0ID0gdmFsdWVzWzBdO1xuICAgICAgICBpZiAoIXVuaXQgfHwgL1xcUy8udGVzdCh1bml0KSB8fCBBcnJheS5mcm9tKHVuaXQpLnNvbWUoZSA9PiBlICE9IHVuaXRbMF0pKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbmRlbnQgdW5pdDogXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZXNbMF0pKTtcbiAgICAgICAgcmV0dXJuIHVuaXQ7XG4gICAgfVxufSk7XG4vKipcblJldHVybiB0aGUgX2NvbHVtbiB3aWR0aF8gb2YgYW4gaW5kZW50IHVuaXQgaW4gdGhlIHN0YXRlLlxuRGV0ZXJtaW5lZCBieSB0aGUgW2BpbmRlbnRVbml0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRVbml0KVxuZmFjZXQsIGFuZCBbYHRhYlNpemVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpIHdoZW4gdGhhdFxuY29udGFpbnMgdGFicy5cbiovXG5mdW5jdGlvbiBnZXRJbmRlbnRVbml0KHN0YXRlKSB7XG4gICAgbGV0IHVuaXQgPSBzdGF0ZS5mYWNldChpbmRlbnRVbml0KTtcbiAgICByZXR1cm4gdW5pdC5jaGFyQ29kZUF0KDApID09IDkgPyBzdGF0ZS50YWJTaXplICogdW5pdC5sZW5ndGggOiB1bml0Lmxlbmd0aDtcbn1cbi8qKlxuQ3JlYXRlIGFuIGluZGVudGF0aW9uIHN0cmluZyB0aGF0IGNvdmVycyBjb2x1bW5zIDAgdG8gYGNvbHNgLlxuV2lsbCB1c2UgdGFicyBmb3IgYXMgbXVjaCBvZiB0aGUgY29sdW1ucyBhcyBwb3NzaWJsZSB3aGVuIHRoZVxuW2BpbmRlbnRVbml0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRVbml0KSBmYWNldCBjb250YWluc1xudGFicy5cbiovXG5mdW5jdGlvbiBpbmRlbnRTdHJpbmcoc3RhdGUsIGNvbHMpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIiwgdHMgPSBzdGF0ZS50YWJTaXplLCBjaCA9IHN0YXRlLmZhY2V0KGluZGVudFVuaXQpWzBdO1xuICAgIGlmIChjaCA9PSBcIlxcdFwiKSB7XG4gICAgICAgIHdoaWxlIChjb2xzID49IHRzKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gXCJcXHRcIjtcbiAgICAgICAgICAgIGNvbHMgLT0gdHM7XG4gICAgICAgIH1cbiAgICAgICAgY2ggPSBcIiBcIjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xzOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5HZXQgdGhlIGluZGVudGF0aW9uLCBhcyBhIGNvbHVtbiBudW1iZXIsIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbldpbGwgZmlyc3QgY29uc3VsdCBhbnkgW2luZGVudCBzZXJ2aWNlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTZXJ2aWNlKVxudGhhdCBhcmUgcmVnaXN0ZXJlZCwgYW5kIGlmIG5vbmUgb2YgdGhvc2UgcmV0dXJuIGFuIGluZGVudGF0aW9uLFxudGhpcyB3aWxsIGNoZWNrIHRoZSBzeW50YXggdHJlZSBmb3IgdGhlIFtpbmRlbnQgbm9kZVxucHJvcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnROb2RlUHJvcCkgYW5kIHVzZSB0aGF0IGlmIGZvdW5kLiBSZXR1cm5zIGFcbm51bWJlciB3aGVuIGFuIGluZGVudGF0aW9uIGNvdWxkIGJlIGRldGVybWluZWQsIGFuZCBudWxsXG5vdGhlcndpc2UuXG4qL1xuZnVuY3Rpb24gZ2V0SW5kZW50YXRpb24oY29udGV4dCwgcG9zKSB7XG4gICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFZGl0b3JTdGF0ZSlcbiAgICAgICAgY29udGV4dCA9IG5ldyBJbmRlbnRDb250ZXh0KGNvbnRleHQpO1xuICAgIGZvciAobGV0IHNlcnZpY2Ugb2YgY29udGV4dC5zdGF0ZS5mYWNldChpbmRlbnRTZXJ2aWNlKSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZShjb250ZXh0LCBwb3MpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUoY29udGV4dC5zdGF0ZSk7XG4gICAgcmV0dXJuIHRyZWUubGVuZ3RoID49IHBvcyA/IHN5bnRheEluZGVudGF0aW9uKGNvbnRleHQsIHRyZWUsIHBvcykgOiBudWxsO1xufVxuLyoqXG5DcmVhdGUgYSBjaGFuZ2Ugc2V0IHRoYXQgYXV0by1pbmRlbnRzIGFsbCBsaW5lcyB0b3VjaGVkIGJ5IHRoZVxuZ2l2ZW4gZG9jdW1lbnQgcmFuZ2UuXG4qL1xuZnVuY3Rpb24gaW5kZW50UmFuZ2Uoc3RhdGUsIGZyb20sIHRvKSB7XG4gICAgbGV0IHVwZGF0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjb250ZXh0ID0gbmV3IEluZGVudENvbnRleHQoc3RhdGUsIHsgb3ZlcnJpZGVJbmRlbnRhdGlvbjogc3RhcnQgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSB1cGRhdGVkW3N0YXJ0XSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogLTE7IH0gfSk7XG4gICAgbGV0IGNoYW5nZXMgPSBbXTtcbiAgICBmb3IgKGxldCBwb3MgPSBmcm9tOyBwb3MgPD0gdG87KSB7XG4gICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBwb3MgPSBsaW5lLnRvICsgMTtcbiAgICAgICAgbGV0IGluZGVudCA9IGdldEluZGVudGF0aW9uKGNvbnRleHQsIGxpbmUuZnJvbSk7XG4gICAgICAgIGlmIChpbmRlbnQgPT0gbnVsbClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIS9cXFMvLnRlc3QobGluZS50ZXh0KSlcbiAgICAgICAgICAgIGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjdXIgPSAvXlxccyovLmV4ZWMobGluZS50ZXh0KVswXTtcbiAgICAgICAgbGV0IG5vcm0gPSBpbmRlbnRTdHJpbmcoc3RhdGUsIGluZGVudCk7XG4gICAgICAgIGlmIChjdXIgIT0gbm9ybSkge1xuICAgICAgICAgICAgdXBkYXRlZFtsaW5lLmZyb21dID0gaW5kZW50O1xuICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogbGluZS5mcm9tICsgY3VyLmxlbmd0aCwgaW5zZXJ0OiBub3JtIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZS5jaGFuZ2VzKGNoYW5nZXMpO1xufVxuLyoqXG5JbmRlbnRhdGlvbiBjb250ZXh0cyBhcmUgdXNlZCB3aGVuIGNhbGxpbmcgW2luZGVudGF0aW9uXG5zZXJ2aWNlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTZXJ2aWNlKS4gVGhleSBwcm92aWRlIGhlbHBlciB1dGlsaXRpZXNcbnVzZWZ1bCBpbiBpbmRlbnRhdGlvbiBsb2dpYywgYW5kIGNhbiBzZWxlY3RpdmVseSBvdmVycmlkZSB0aGVcbmluZGVudGF0aW9uIHJlcG9ydGVkIGZvciBzb21lIGxpbmVzLlxuKi9cbmNsYXNzIEluZGVudENvbnRleHQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbmRlbnQgY29udGV4dC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBzdGF0ZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnVuaXQgPSBnZXRJbmRlbnRVbml0KHN0YXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCB0YWtpbmdcbiAgICBbc2ltdWxhdGVkIGxpbmVcbiAgICBicmVha3NdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuSW5kZW50Q29udGV4dC5jb25zdHJ1Y3Rvcl5vcHRpb25zLnNpbXVsYXRlQnJlYWspXG4gICAgaW50byBhY2NvdW50LiBJZiB0aGVyZSBpcyBzdWNoIGEgYnJlYWsgYXQgYHBvc2AsIHRoZSBgYmlhc2BcbiAgICBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhcnQgb2YgdGhlIGxpbmUgbGluZSBiZWZvcmUgb3JcbiAgICBhZnRlciB0aGUgYnJlYWsgaXMgdXNlZC5cbiAgICAqL1xuICAgIGxpbmVBdChwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgIGxldCB7IHNpbXVsYXRlQnJlYWssIHNpbXVsYXRlRG91YmxlQnJlYWsgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKHNpbXVsYXRlQnJlYWsgIT0gbnVsbCAmJiBzaW11bGF0ZUJyZWFrID49IGxpbmUuZnJvbSAmJiBzaW11bGF0ZUJyZWFrIDw9IGxpbmUudG8pIHtcbiAgICAgICAgICAgIGlmIChzaW11bGF0ZURvdWJsZUJyZWFrICYmIHNpbXVsYXRlQnJlYWsgPT0gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IFwiXCIsIGZyb206IHBvcyB9O1xuICAgICAgICAgICAgZWxzZSBpZiAoYmlhcyA8IDAgPyBzaW11bGF0ZUJyZWFrIDwgcG9zIDogc2ltdWxhdGVCcmVhayA8PSBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dDogbGluZS50ZXh0LnNsaWNlKHNpbXVsYXRlQnJlYWsgLSBsaW5lLmZyb20pLCBmcm9tOiBzaW11bGF0ZUJyZWFrIH07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dDogbGluZS50ZXh0LnNsaWNlKDAsIHNpbXVsYXRlQnJlYWsgLSBsaW5lLmZyb20pLCBmcm9tOiBsaW5lLmZyb20gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSB0ZXh0IGRpcmVjdGx5IGFmdGVyIGBwb3NgLCBlaXRoZXIgdGhlIGVudGlyZSBsaW5lXG4gICAgb3IgdGhlIG5leHQgMTAwIGNoYXJhY3RlcnMsIHdoaWNoZXZlciBpcyBzaG9ydGVyLlxuICAgICovXG4gICAgdGV4dEFmdGVyUG9zKHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaW11bGF0ZURvdWJsZUJyZWFrICYmIHBvcyA9PSB0aGlzLm9wdGlvbnMuc2ltdWxhdGVCcmVhaylcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tIH0gPSB0aGlzLmxpbmVBdChwb3MsIGJpYXMpO1xuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShwb3MgLSBmcm9tLCBNYXRoLm1pbih0ZXh0Lmxlbmd0aCwgcG9zICsgMTAwIC0gZnJvbSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBjb2x1bW4gZm9yIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGNvbHVtbihwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20gfSA9IHRoaXMubGluZUF0KHBvcywgYmlhcyk7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmNvdW50Q29sdW1uKHRleHQsIHBvcyAtIGZyb20pO1xuICAgICAgICBsZXQgb3ZlcnJpZGUgPSB0aGlzLm9wdGlvbnMub3ZlcnJpZGVJbmRlbnRhdGlvbiA/IHRoaXMub3B0aW9ucy5vdmVycmlkZUluZGVudGF0aW9uKGZyb20pIDogLTE7XG4gICAgICAgIGlmIChvdmVycmlkZSA+IC0xKVxuICAgICAgICAgICAgcmVzdWx0ICs9IG92ZXJyaWRlIC0gdGhpcy5jb3VudENvbHVtbih0ZXh0LCB0ZXh0LnNlYXJjaCgvXFxTfCQvKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGNvbHVtbiBwb3NpdGlvbiAodGFraW5nIHRhYnMgaW50byBhY2NvdW50KSBvZiB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbiBpbiB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgY291bnRDb2x1bW4obGluZSwgcG9zID0gbGluZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGNvdW50Q29sdW1uKGxpbmUsIHRoaXMuc3RhdGUudGFiU2l6ZSwgcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgaW5kZW50YXRpb24gY29sdW1uIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBwb2ludC5cbiAgICAqL1xuICAgIGxpbmVJbmRlbnQocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tIH0gPSB0aGlzLmxpbmVBdChwb3MsIGJpYXMpO1xuICAgICAgICBsZXQgb3ZlcnJpZGUgPSB0aGlzLm9wdGlvbnMub3ZlcnJpZGVJbmRlbnRhdGlvbjtcbiAgICAgICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICAgICAgICBsZXQgb3ZlcnJpZGVuID0gb3ZlcnJpZGUoZnJvbSk7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGVuID4gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb3VudENvbHVtbih0ZXh0LCB0ZXh0LnNlYXJjaCgvXFxTfCQvKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhlIFtzaW11bGF0ZWQgbGluZVxuICAgIGJyZWFrXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkluZGVudENvbnRleHQuY29uc3RydWN0b3Jeb3B0aW9ucy5zaW11bGF0ZUJyZWFrKVxuICAgIGZvciB0aGlzIGNvbnRleHQsIGlmIGFueS5cbiAgICAqL1xuICAgIGdldCBzaW11bGF0ZWRCcmVhaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zaW11bGF0ZUJyZWFrIHx8IG51bGw7XG4gICAgfVxufVxuLyoqXG5BIHN5bnRheCB0cmVlIG5vZGUgcHJvcCB1c2VkIHRvIGFzc29jaWF0ZSBpbmRlbnRhdGlvbiBzdHJhdGVnaWVzXG53aXRoIG5vZGUgdHlwZXMuIFN1Y2ggYSBzdHJhdGVneSBpcyBhIGZ1bmN0aW9uIGZyb20gYW4gaW5kZW50YXRpb25cbmNvbnRleHQgdG8gYSBjb2x1bW4gbnVtYmVyIChzZWUgYWxzb1xuW2BpbmRlbnRTdHJpbmdgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFN0cmluZykpIG9yIG51bGwsIHdoZXJlIG51bGxcbmluZGljYXRlcyB0aGF0IG5vIGRlZmluaXRpdmUgaW5kZW50YXRpb24gY2FuIGJlIGRldGVybWluZWQuXG4qL1xuY29uc3QgaW5kZW50Tm9kZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vLyBDb21wdXRlIHRoZSBpbmRlbnRhdGlvbiBmb3IgYSBnaXZlbiBwb3NpdGlvbiBmcm9tIHRoZSBzeW50YXggdHJlZS5cbmZ1bmN0aW9uIHN5bnRheEluZGVudGF0aW9uKGN4LCBhc3QsIHBvcykge1xuICAgIGxldCBzdGFjayA9IGFzdC5yZXNvbHZlU3RhY2socG9zKTtcbiAgICBsZXQgaW5uZXIgPSBhc3QucmVzb2x2ZUlubmVyKHBvcywgLTEpLnJlc29sdmUocG9zLCAwKS5lbnRlclVuZmluaXNoZWROb2Rlc0JlZm9yZShwb3MpO1xuICAgIGlmIChpbm5lciAhPSBzdGFjay5ub2RlKSB7XG4gICAgICAgIGxldCBhZGQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gaW5uZXI7IGN1ciAmJiAhKGN1ci5mcm9tID09IHN0YWNrLm5vZGUuZnJvbSAmJiBjdXIudHlwZSA9PSBzdGFjay5ub2RlLnR5cGUpOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICAgICAgYWRkLnB1c2goY3VyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFkZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIHN0YWNrID0geyBub2RlOiBhZGRbaV0sIG5leHQ6IHN0YWNrIH07XG4gICAgfVxuICAgIHJldHVybiBpbmRlbnRGb3Ioc3RhY2ssIGN4LCBwb3MpO1xufVxuZnVuY3Rpb24gaW5kZW50Rm9yKHN0YWNrLCBjeCwgcG9zKSB7XG4gICAgZm9yIChsZXQgY3VyID0gc3RhY2s7IGN1cjsgY3VyID0gY3VyLm5leHQpIHtcbiAgICAgICAgbGV0IHN0cmF0ZWd5ID0gaW5kZW50U3RyYXRlZ3koY3VyLm5vZGUpO1xuICAgICAgICBpZiAoc3RyYXRlZ3kpXG4gICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3koVHJlZUluZGVudENvbnRleHQuY3JlYXRlKGN4LCBwb3MsIGN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlnbm9yZUNsb3NlZChjeCkge1xuICAgIHJldHVybiBjeC5wb3MgPT0gY3gub3B0aW9ucy5zaW11bGF0ZUJyZWFrICYmIGN4Lm9wdGlvbnMuc2ltdWxhdGVEb3VibGVCcmVhaztcbn1cbmZ1bmN0aW9uIGluZGVudFN0cmF0ZWd5KHRyZWUpIHtcbiAgICBsZXQgc3RyYXRlZ3kgPSB0cmVlLnR5cGUucHJvcChpbmRlbnROb2RlUHJvcCk7XG4gICAgaWYgKHN0cmF0ZWd5KVxuICAgICAgICByZXR1cm4gc3RyYXRlZ3k7XG4gICAgbGV0IGZpcnN0ID0gdHJlZS5maXJzdENoaWxkLCBjbG9zZTtcbiAgICBpZiAoZmlyc3QgJiYgKGNsb3NlID0gZmlyc3QudHlwZS5wcm9wKE5vZGVQcm9wLmNsb3NlZEJ5KSkpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0cmVlLmxhc3RDaGlsZCwgY2xvc2VkID0gbGFzdCAmJiBjbG9zZS5pbmRleE9mKGxhc3QubmFtZSkgPiAtMTtcbiAgICAgICAgcmV0dXJuIGN4ID0+IGRlbGltaXRlZFN0cmF0ZWd5KGN4LCB0cnVlLCAxLCB1bmRlZmluZWQsIGNsb3NlZCAmJiAhaWdub3JlQ2xvc2VkKGN4KSA/IGxhc3QuZnJvbSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmVlLnBhcmVudCA9PSBudWxsID8gdG9wSW5kZW50IDogbnVsbDtcbn1cbmZ1bmN0aW9uIHRvcEluZGVudCgpIHsgcmV0dXJuIDA7IH1cbi8qKlxuT2JqZWN0cyBvZiB0aGlzIHR5cGUgcHJvdmlkZSBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBoZWxwZXJcbm1ldGhvZHMgdG8gaW5kZW50YXRpb24gZnVuY3Rpb25zIHJlZ2lzdGVyZWQgb24gc3ludGF4IG5vZGVzLlxuKi9cbmNsYXNzIFRyZWVJbmRlbnRDb250ZXh0IGV4dGVuZHMgSW5kZW50Q29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHdoaWNoIGluZGVudGF0aW9uIGlzIGJlaW5nIGNvbXB1dGVkLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoYmFzZS5zdGF0ZSwgYmFzZS5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzeW50YXggdHJlZSBub2RlIHRvIHdoaWNoIHRoZSBpbmRlbnRhdGlvbiBzdHJhdGVneVxuICAgIGFwcGxpZXMuXG4gICAgKi9cbiAgICBnZXQgbm9kZSgpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5ub2RlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGJhc2UsIHBvcywgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWVJbmRlbnRDb250ZXh0KGJhc2UsIHBvcywgY29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdGV4dCBkaXJlY3RseSBhZnRlciBgdGhpcy5wb3NgLCBlaXRoZXIgdGhlIGVudGlyZSBsaW5lXG4gICAgb3IgdGhlIG5leHQgMTAwIGNoYXJhY3RlcnMsIHdoaWNoZXZlciBpcyBzaG9ydGVyLlxuICAgICovXG4gICAgZ2V0IHRleHRBZnRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dEFmdGVyUG9zKHRoaXMucG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgcmVmZXJlbmNlIGxpbmUgZm9yIGB0aGlzLm5vZGVgLCB3aGljaFxuICAgIGlzIHRoZSBsaW5lIG9uIHdoaWNoIGl0IHN0YXJ0cywgdW5sZXNzIHRoZXJlIGlzIGEgbm9kZSB0aGF0IGlzXG4gICAgX25vdF8gYSBwYXJlbnQgb2YgdGhpcyBub2RlIGNvdmVyaW5nIHRoZSBzdGFydCBvZiB0aGF0IGxpbmUuIElmXG4gICAgc28sIHRoZSBsaW5lIGF0IHRoZSBzdGFydCBvZiB0aGF0IG5vZGUgaXMgdHJpZWQsIGFnYWluIHNraXBwaW5nXG4gICAgb24gaWYgaXQgaXMgY292ZXJlZCBieSBhbm90aGVyIHN1Y2ggbm9kZS5cbiAgICAqL1xuICAgIGdldCBiYXNlSW5kZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlSW5kZW50Rm9yKHRoaXMubm9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gZm9yIHRoZSByZWZlcmVuY2UgbGluZSBvZiB0aGUgZ2l2ZW4gbm9kZVxuICAgIChzZWUgW2BiYXNlSW5kZW50YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5UcmVlSW5kZW50Q29udGV4dC5iYXNlSW5kZW50KSkuXG4gICAgKi9cbiAgICBiYXNlSW5kZW50Rm9yKG5vZGUpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQobm9kZS5mcm9tKTtcbiAgICAgICAgLy8gU2tpcCBsaW5lIHN0YXJ0cyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IGEgc2libGluZyAob3IgY291c2luLCBldGMpXG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhdEJyZWFrID0gbm9kZS5yZXNvbHZlKGxpbmUuZnJvbSk7XG4gICAgICAgICAgICB3aGlsZSAoYXRCcmVhay5wYXJlbnQgJiYgYXRCcmVhay5wYXJlbnQuZnJvbSA9PSBhdEJyZWFrLmZyb20pXG4gICAgICAgICAgICAgICAgYXRCcmVhayA9IGF0QnJlYWsucGFyZW50O1xuICAgICAgICAgICAgaWYgKGlzUGFyZW50KGF0QnJlYWssIG5vZGUpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGluZSA9IHRoaXMuc3RhdGUuZG9jLmxpbmVBdChhdEJyZWFrLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbmRlbnQobGluZS5mcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udGludWUgbG9va2luZyBmb3IgaW5kZW50YXRpb25zIGluIHRoZSBub2RlJ3MgcGFyZW50IG5vZGVzLFxuICAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0LlxuICAgICovXG4gICAgY29udGludWUoKSB7XG4gICAgICAgIHJldHVybiBpbmRlbnRGb3IodGhpcy5jb250ZXh0Lm5leHQsIHRoaXMuYmFzZSwgdGhpcy5wb3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUGFyZW50KHBhcmVudCwgb2YpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBvZjsgY3VyOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICBpZiAocGFyZW50ID09IGN1cilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIENoZWNrIHdoZXRoZXIgYSBkZWxpbWl0ZWQgbm9kZSBpcyBhbGlnbmVkIChtZWFuaW5nIHRoZXJlIGFyZVxuLy8gbm9uLXNraXBwZWQgbm9kZXMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgb3BlbmluZyBkZWxpbWl0ZXIpLiBBbmRcbi8vIGlmIHNvLCByZXR1cm4gdGhlIG9wZW5pbmcgdG9rZW4uXG5mdW5jdGlvbiBicmFja2V0ZWRBbGlnbmVkKGNvbnRleHQpIHtcbiAgICBsZXQgdHJlZSA9IGNvbnRleHQubm9kZTtcbiAgICBsZXQgb3BlblRva2VuID0gdHJlZS5jaGlsZEFmdGVyKHRyZWUuZnJvbSksIGxhc3QgPSB0cmVlLmxhc3RDaGlsZDtcbiAgICBpZiAoIW9wZW5Ub2tlbilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHNpbSA9IGNvbnRleHQub3B0aW9ucy5zaW11bGF0ZUJyZWFrO1xuICAgIGxldCBvcGVuTGluZSA9IGNvbnRleHQuc3RhdGUuZG9jLmxpbmVBdChvcGVuVG9rZW4uZnJvbSk7XG4gICAgbGV0IGxpbmVFbmQgPSBzaW0gPT0gbnVsbCB8fCBzaW0gPD0gb3BlbkxpbmUuZnJvbSA/IG9wZW5MaW5lLnRvIDogTWF0aC5taW4ob3BlbkxpbmUudG8sIHNpbSk7XG4gICAgZm9yIChsZXQgcG9zID0gb3BlblRva2VuLnRvOzspIHtcbiAgICAgICAgbGV0IG5leHQgPSB0cmVlLmNoaWxkQWZ0ZXIocG9zKTtcbiAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQgPT0gbGFzdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIW5leHQudHlwZS5pc1NraXBwZWQpIHtcbiAgICAgICAgICAgIGlmIChuZXh0LmZyb20gPj0gbGluZUVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCBzcGFjZSA9IC9eICovLmV4ZWMob3BlbkxpbmUudGV4dC5zbGljZShvcGVuVG9rZW4udG8gLSBvcGVuTGluZS5mcm9tKSlbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogb3BlblRva2VuLmZyb20sIHRvOiBvcGVuVG9rZW4udG8gKyBzcGFjZSB9O1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IG5leHQudG87XG4gICAgfVxufVxuLyoqXG5BbiBpbmRlbnRhdGlvbiBzdHJhdGVneSBmb3IgZGVsaW1pdGVkICh1c3VhbGx5IGJyYWNrZXRlZCkgbm9kZXMuXG5XaWxsLCBieSBkZWZhdWx0LCBpbmRlbnQgb25lIHVuaXQgbW9yZSB0aGFuIHRoZSBwYXJlbnQncyBiYXNlXG5pbmRlbnQgdW5sZXNzIHRoZSBsaW5lIHN0YXJ0cyB3aXRoIGEgY2xvc2luZyB0b2tlbi4gV2hlbiBgYWxpZ25gXG5pcyB0cnVlIGFuZCB0aGVyZSBhcmUgbm9uLXNraXBwZWQgbm9kZXMgb24gdGhlIG5vZGUncyBvcGVuaW5nXG5saW5lLCB0aGUgY29udGVudCBvZiB0aGUgbm9kZSB3aWxsIGJlIGFsaWduZWQgd2l0aCB0aGUgZW5kIG9mIHRoZVxub3BlbmluZyBub2RlLCBsaWtlIHRoaXM6XG5cbiAgICBmb28oYmFyLFxuICAgICAgICBiYXopXG4qL1xuZnVuY3Rpb24gZGVsaW1pdGVkSW5kZW50KHsgY2xvc2luZywgYWxpZ24gPSB0cnVlLCB1bml0cyA9IDEgfSkge1xuICAgIHJldHVybiAoY29udGV4dCkgPT4gZGVsaW1pdGVkU3RyYXRlZ3koY29udGV4dCwgYWxpZ24sIHVuaXRzLCBjbG9zaW5nKTtcbn1cbmZ1bmN0aW9uIGRlbGltaXRlZFN0cmF0ZWd5KGNvbnRleHQsIGFsaWduLCB1bml0cywgY2xvc2luZywgY2xvc2VkQXQpIHtcbiAgICBsZXQgYWZ0ZXIgPSBjb250ZXh0LnRleHRBZnRlciwgc3BhY2UgPSBhZnRlci5tYXRjaCgvXlxccyovKVswXS5sZW5ndGg7XG4gICAgbGV0IGNsb3NlZCA9IGNsb3NpbmcgJiYgYWZ0ZXIuc2xpY2Uoc3BhY2UsIHNwYWNlICsgY2xvc2luZy5sZW5ndGgpID09IGNsb3NpbmcgfHwgY2xvc2VkQXQgPT0gY29udGV4dC5wb3MgKyBzcGFjZTtcbiAgICBsZXQgYWxpZ25lZCA9IGFsaWduID8gYnJhY2tldGVkQWxpZ25lZChjb250ZXh0KSA6IG51bGw7XG4gICAgaWYgKGFsaWduZWQpXG4gICAgICAgIHJldHVybiBjbG9zZWQgPyBjb250ZXh0LmNvbHVtbihhbGlnbmVkLmZyb20pIDogY29udGV4dC5jb2x1bW4oYWxpZ25lZC50byk7XG4gICAgcmV0dXJuIGNvbnRleHQuYmFzZUluZGVudCArIChjbG9zZWQgPyAwIDogY29udGV4dC51bml0ICogdW5pdHMpO1xufVxuLyoqXG5BbiBpbmRlbnRhdGlvbiBzdHJhdGVneSB0aGF0IGFsaWducyBhIG5vZGUncyBjb250ZW50IHRvIGl0cyBiYXNlXG5pbmRlbnRhdGlvbi5cbiovXG5jb25zdCBmbGF0SW5kZW50ID0gKGNvbnRleHQpID0+IGNvbnRleHQuYmFzZUluZGVudDtcbi8qKlxuQ3JlYXRlcyBhbiBpbmRlbnRhdGlvbiBzdHJhdGVneSB0aGF0LCBieSBkZWZhdWx0LCBpbmRlbnRzXG5jb250aW51ZWQgbGluZXMgb25lIHVuaXQgbW9yZSB0aGFuIHRoZSBub2RlJ3MgYmFzZSBpbmRlbnRhdGlvbi5cbllvdSBjYW4gcHJvdmlkZSBgZXhjZXB0YCB0byBwcmV2ZW50IGluZGVudGF0aW9uIG9mIGxpbmVzIHRoYXRcbm1hdGNoIGEgcGF0dGVybiAoZm9yIGV4YW1wbGUgYC9eZWxzZVxcYi9gIGluIGBpZmAvYGVsc2VgXG5jb25zdHJ1Y3RzKSwgYW5kIHlvdSBjYW4gY2hhbmdlIHRoZSBhbW91bnQgb2YgdW5pdHMgdXNlZCB3aXRoIHRoZVxuYHVuaXRzYCBvcHRpb24uXG4qL1xuZnVuY3Rpb24gY29udGludWVkSW5kZW50KHsgZXhjZXB0LCB1bml0cyA9IDEgfSA9IHt9KSB7XG4gICAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCBtYXRjaEV4Y2VwdCA9IGV4Y2VwdCAmJiBleGNlcHQudGVzdChjb250ZXh0LnRleHRBZnRlcik7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmJhc2VJbmRlbnQgKyAobWF0Y2hFeGNlcHQgPyAwIDogdW5pdHMgKiBjb250ZXh0LnVuaXQpO1xuICAgIH07XG59XG5jb25zdCBEb250SW5kZW50QmV5b25kID0gMjAwO1xuLyoqXG5FbmFibGVzIHJlaW5kZW50YXRpb24gb24gaW5wdXQuIFdoZW4gYSBsYW5ndWFnZSBkZWZpbmVzIGFuXG5gaW5kZW50T25JbnB1dGAgZmllbGQgaW4gaXRzIFtsYW5ndWFnZVxuZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCksIHdoaWNoIG11c3QgaG9sZCBhIHJlZ3VsYXJcbmV4cHJlc3Npb24sIHRoZSBsaW5lIGF0IHRoZSBjdXJzb3Igd2lsbCBiZSByZWluZGVudGVkIHdoZW5ldmVyIG5ld1xudGV4dCBpcyB0eXBlZCBhbmQgdGhlIGlucHV0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHVwIHRvIHRoZVxuY3Vyc29yIG1hdGNoZXMgdGhhdCByZWdleHAuXG5cblRvIGF2b2lkIHVubmVjY2VzYXJ5IHJlaW5kZW50cywgaXQgaXMgcmVjb21tZW5kZWQgdG8gc3RhcnQgdGhlXG5yZWdleHAgd2l0aCBgXmAgKHVzdWFsbHkgZm9sbG93ZWQgYnkgYFxccypgKSwgYW5kIGVuZCBpdCB3aXRoIGAkYC5cbkZvciBleGFtcGxlLCBgL15cXHMqXFx9JC9gIHdpbGwgcmVpbmRlbnQgd2hlbiBhIGNsb3NpbmcgYnJhY2UgaXNcbmFkZGVkIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuXG4qL1xuZnVuY3Rpb24gaW5kZW50T25JbnB1dCgpIHtcbiAgICByZXR1cm4gRWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIub2YodHIgPT4ge1xuICAgICAgICBpZiAoIXRyLmRvY0NoYW5nZWQgfHwgIXRyLmlzVXNlckV2ZW50KFwiaW5wdXQudHlwZVwiKSAmJiAhdHIuaXNVc2VyRXZlbnQoXCJpbnB1dC5jb21wbGV0ZVwiKSlcbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgbGV0IHJ1bGVzID0gdHIuc3RhcnRTdGF0ZS5sYW5ndWFnZURhdGFBdChcImluZGVudE9uSW5wdXRcIiwgdHIuc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkKTtcbiAgICAgICAgaWYgKCFydWxlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBkb2MgPSB0ci5uZXdEb2MsIHsgaGVhZCB9ID0gdHIubmV3U2VsZWN0aW9uLm1haW4sIGxpbmUgPSBkb2MubGluZUF0KGhlYWQpO1xuICAgICAgICBpZiAoaGVhZCA+IGxpbmUuZnJvbSArIERvbnRJbmRlbnRCZXlvbmQpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBsaW5lU3RhcnQgPSBkb2Muc2xpY2VTdHJpbmcobGluZS5mcm9tLCBoZWFkKTtcbiAgICAgICAgaWYgKCFydWxlcy5zb21lKHIgPT4gci50ZXN0KGxpbmVTdGFydCkpKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgeyBzdGF0ZSB9ID0gdHIsIGxhc3QgPSAtMSwgY2hhbmdlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB7IGhlYWQgfSBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQoaGVhZCk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID09IGxhc3QpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsYXN0ID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IGdldEluZGVudGF0aW9uKHN0YXRlLCBsaW5lLmZyb20pO1xuICAgICAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGN1ciA9IC9eXFxzKi8uZXhlYyhsaW5lLnRleHQpWzBdO1xuICAgICAgICAgICAgbGV0IG5vcm0gPSBpbmRlbnRTdHJpbmcoc3RhdGUsIGluZGVudCk7XG4gICAgICAgICAgICBpZiAoY3VyICE9IG5vcm0pXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogbGluZS5mcm9tICsgY3VyLmxlbmd0aCwgaW5zZXJ0OiBub3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VzLmxlbmd0aCA/IFt0ciwgeyBjaGFuZ2VzLCBzZXF1ZW50aWFsOiB0cnVlIH1dIDogdHI7XG4gICAgfSk7XG59XG5cbi8qKlxuQSBmYWNldCB0aGF0IHJlZ2lzdGVycyBhIGNvZGUgZm9sZGluZyBzZXJ2aWNlLiBXaGVuIGNhbGxlZCB3aXRoXG50aGUgZXh0ZW50IG9mIGEgbGluZSwgc3VjaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBmb2xkYWJsZVxucmFuZ2UgdGhhdCBzdGFydHMgb24gdGhhdCBsaW5lIChidXQgY29udGludWVzIGJleW9uZCBpdCksIGlmIG9uZVxuY2FuIGJlIGZvdW5kLlxuKi9cbmNvbnN0IGZvbGRTZXJ2aWNlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5UaGlzIG5vZGUgcHJvcCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBmb2xkaW5nIGluZm9ybWF0aW9uIHdpdGhcbnN5bnRheCBub2RlIHR5cGVzLiBHaXZlbiBhIHN5bnRheCBub2RlLCBpdCBzaG91bGQgY2hlY2sgd2hldGhlclxudGhhdCB0cmVlIGlzIGZvbGRhYmxlIGFuZCByZXR1cm4gdGhlIHJhbmdlIHRoYXQgY2FuIGJlIGNvbGxhcHNlZFxud2hlbiBpdCBpcy5cbiovXG5jb25zdCBmb2xkTm9kZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vKipcbltGb2xkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGROb2RlUHJvcCkgZnVuY3Rpb24gdGhhdCBmb2xkcyBldmVyeXRoaW5nIGJ1dFxudGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBjaGlsZCBvZiBhIHN5bnRheCBub2RlLiBVc2VmdWwgZm9yIG5vZGVzXG50aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCBkZWxpbWl0ZXJzLlxuKi9cbmZ1bmN0aW9uIGZvbGRJbnNpZGUobm9kZSkge1xuICAgIGxldCBmaXJzdCA9IG5vZGUuZmlyc3RDaGlsZCwgbGFzdCA9IG5vZGUubGFzdENoaWxkO1xuICAgIHJldHVybiBmaXJzdCAmJiBmaXJzdC50byA8IGxhc3QuZnJvbSA/IHsgZnJvbTogZmlyc3QudG8sIHRvOiBsYXN0LnR5cGUuaXNFcnJvciA/IG5vZGUudG8gOiBsYXN0LmZyb20gfSA6IG51bGw7XG59XG5mdW5jdGlvbiBzeW50YXhGb2xkaW5nKHN0YXRlLCBzdGFydCwgZW5kKSB7XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcbiAgICBpZiAodHJlZS5sZW5ndGggPCBlbmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzdGFjayA9IHRyZWUucmVzb2x2ZVN0YWNrKGVuZCwgMSk7XG4gICAgbGV0IGZvdW5kID0gbnVsbDtcbiAgICBmb3IgKGxldCBpdGVyID0gc3RhY2s7IGl0ZXI7IGl0ZXIgPSBpdGVyLm5leHQpIHtcbiAgICAgICAgbGV0IGN1ciA9IGl0ZXIubm9kZTtcbiAgICAgICAgaWYgKGN1ci50byA8PSBlbmQgfHwgY3VyLmZyb20gPiBlbmQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGZvdW5kICYmIGN1ci5mcm9tIDwgc3RhcnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IHByb3AgPSBjdXIudHlwZS5wcm9wKGZvbGROb2RlUHJvcCk7XG4gICAgICAgIGlmIChwcm9wICYmIChjdXIudG8gPCB0cmVlLmxlbmd0aCAtIDUwIHx8IHRyZWUubGVuZ3RoID09IHN0YXRlLmRvYy5sZW5ndGggfHwgIWlzVW5maW5pc2hlZChjdXIpKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gcHJvcChjdXIsIHN0YXRlKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5mcm9tIDw9IGVuZCAmJiB2YWx1ZS5mcm9tID49IHN0YXJ0ICYmIHZhbHVlLnRvID4gZW5kKVxuICAgICAgICAgICAgICAgIGZvdW5kID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gaXNVbmZpbmlzaGVkKG5vZGUpIHtcbiAgICBsZXQgY2ggPSBub2RlLmxhc3RDaGlsZDtcbiAgICByZXR1cm4gY2ggJiYgY2gudG8gPT0gbm9kZS50byAmJiBjaC50eXBlLmlzRXJyb3I7XG59XG4vKipcbkNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmUgaXMgZm9sZGFibGUuIEZpcnN0IGFza3MgYW55IGZvbGRcbnNlcnZpY2VzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuW2Bmb2xkU2VydmljZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZFNlcnZpY2UpLCBhbmQgaWYgbm9uZSBvZiB0aGVtIHJldHVyblxuYSByZXN1bHQsIHRyaWVzIHRvIHF1ZXJ5IHRoZSBbZm9sZCBub2RlXG5wcm9wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGROb2RlUHJvcCkgb2Ygc3ludGF4IG5vZGVzIHRoYXQgY292ZXIgdGhlIGVuZFxub2YgdGhlIGxpbmUuXG4qL1xuZnVuY3Rpb24gZm9sZGFibGUoc3RhdGUsIGxpbmVTdGFydCwgbGluZUVuZCkge1xuICAgIGZvciAobGV0IHNlcnZpY2Ugb2Ygc3RhdGUuZmFjZXQoZm9sZFNlcnZpY2UpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHN5bnRheEZvbGRpbmcoc3RhdGUsIGxpbmVTdGFydCwgbGluZUVuZCk7XG59XG5mdW5jdGlvbiBtYXBSYW5nZShyYW5nZSwgbWFwcGluZykge1xuICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBQb3MocmFuZ2UuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBQb3MocmFuZ2UudG8sIC0xKTtcbiAgICByZXR1cm4gZnJvbSA+PSB0byA/IHVuZGVmaW5lZCA6IHsgZnJvbSwgdG8gfTtcbn1cbi8qKlxuU3RhdGUgZWZmZWN0IHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdHJhbnNhY3Rpb24gdG8gZm9sZCB0aGVcbmdpdmVuIHJhbmdlLiAoWW91IHByb2JhYmx5IG9ubHkgbmVlZCB0aGlzIGluIGV4Y2VwdGlvbmFsXG5jaXJjdW1zdGFuY2VzXHUyMDE0dXN1YWxseSB5b3UnbGwganVzdCB3YW50IHRvIGxldFxuW2Bmb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZENvZGUpIGFuZCB0aGUgW2ZvbGRcbmd1dHRlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkR3V0dGVyKSBjcmVhdGUgdGhlIHRyYW5zYWN0aW9ucy4pXG4qL1xuY29uc3QgZm9sZEVmZmVjdCA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6IG1hcFJhbmdlIH0pO1xuLyoqXG5TdGF0ZSBlZmZlY3QgdGhhdCB1bmZvbGRzIHRoZSBnaXZlbiByYW5nZSAoaWYgaXQgd2FzIGZvbGRlZCkuXG4qL1xuY29uc3QgdW5mb2xkRWZmZWN0ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7IG1hcDogbWFwUmFuZ2UgfSk7XG5mdW5jdGlvbiBzZWxlY3RlZExpbmVzKHZpZXcpIHtcbiAgICBsZXQgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCB7IGhlYWQgfSBvZiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgaWYgKGxpbmVzLnNvbWUobCA9PiBsLmZyb20gPD0gaGVhZCAmJiBsLnRvID49IGhlYWQpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxpbmVzLnB1c2godmlldy5saW5lQmxvY2tBdChoZWFkKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cbi8qKlxuVGhlIHN0YXRlIGZpZWxkIHRoYXQgc3RvcmVzIHRoZSBmb2xkZWQgcmFuZ2VzIChhcyBhIFtkZWNvcmF0aW9uXG5zZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uU2V0KSkuIENhbiBiZSBwYXNzZWQgdG9cbltgRWRpdG9yU3RhdGUudG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS50b0pTT04pIGFuZFxuW2Bmcm9tSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVeZnJvbUpTT04pIHRvIHNlcmlhbGl6ZSB0aGUgZm9sZFxuc3RhdGUuXG4qL1xuY29uc3QgZm9sZFN0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgfSxcbiAgICB1cGRhdGUoZm9sZGVkLCB0cikge1xuICAgICAgICBmb2xkZWQgPSBmb2xkZWQubWFwKHRyLmNoYW5nZXMpO1xuICAgICAgICBmb3IgKGxldCBlIG9mIHRyLmVmZmVjdHMpIHtcbiAgICAgICAgICAgIGlmIChlLmlzKGZvbGRFZmZlY3QpICYmICFmb2xkRXhpc3RzKGZvbGRlZCwgZS52YWx1ZS5mcm9tLCBlLnZhbHVlLnRvKSkge1xuICAgICAgICAgICAgICAgIGxldCB7IHByZXBhcmVQbGFjZWhvbGRlciB9ID0gdHIuc3RhdGUuZmFjZXQoZm9sZENvbmZpZyk7XG4gICAgICAgICAgICAgICAgbGV0IHdpZGdldCA9ICFwcmVwYXJlUGxhY2Vob2xkZXIgPyBmb2xkV2lkZ2V0IDpcbiAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiBuZXcgUHJlcGFyZWRGb2xkV2lkZ2V0KHByZXBhcmVQbGFjZWhvbGRlcih0ci5zdGF0ZSwgZS52YWx1ZSkpIH0pO1xuICAgICAgICAgICAgICAgIGZvbGRlZCA9IGZvbGRlZC51cGRhdGUoeyBhZGQ6IFt3aWRnZXQucmFuZ2UoZS52YWx1ZS5mcm9tLCBlLnZhbHVlLnRvKV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLmlzKHVuZm9sZEVmZmVjdCkpIHtcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHsgZmlsdGVyOiAoZnJvbSwgdG8pID0+IGUudmFsdWUuZnJvbSAhPSBmcm9tIHx8IGUudmFsdWUudG8gIT0gdG8sXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckZyb206IGUudmFsdWUuZnJvbSwgZmlsdGVyVG86IGUudmFsdWUudG8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgZm9sZGVkIHJhbmdlcyB0aGF0IGNvdmVyIHRoZSBzZWxlY3Rpb24gaGVhZFxuICAgICAgICBpZiAodHIuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgb25TZWxlY3Rpb24gPSBmYWxzZSwgeyBoZWFkIH0gPSB0ci5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgICAgIGZvbGRlZC5iZXR3ZWVuKGhlYWQsIGhlYWQsIChhLCBiKSA9PiB7IGlmIChhIDwgaGVhZCAmJiBiID4gaGVhZClcbiAgICAgICAgICAgICAgICBvblNlbGVjdGlvbiA9IHRydWU7IH0pO1xuICAgICAgICAgICAgaWYgKG9uU2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgIGZvbGRlZCA9IGZvbGRlZC51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGcm9tOiBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUbzogaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiAoYSwgYikgPT4gYiA8PSBoZWFkIHx8IGEgPj0gaGVhZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb2xkZWQ7XG4gICAgfSxcbiAgICBwcm92aWRlOiBmID0+IEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmKSxcbiAgICB0b0pTT04oZm9sZGVkLCBzdGF0ZSkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvbGRlZC5iZXR3ZWVuKDAsIHN0YXRlLmRvYy5sZW5ndGgsIChmcm9tLCB0bykgPT4geyByYW5nZXMucHVzaChmcm9tLCB0byk7IH0pO1xuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH0sXG4gICAgZnJvbUpTT04odmFsdWUpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggJSAyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gZm9yIGZvbGQgc3RhdGVcIik7XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IHZhbHVlW2krK10sIHRvID0gdmFsdWVbaSsrXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiB0byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIGZvciBmb2xkIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2goZm9sZFdpZGdldC5yYW5nZShmcm9tLCB0bykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChyYW5nZXMsIHRydWUpO1xuICAgIH1cbn0pO1xuLyoqXG5HZXQgYSBbcmFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0KSBjb250YWluaW5nIHRoZSBmb2xkZWQgcmFuZ2VzXG5pbiB0aGUgZ2l2ZW4gc3RhdGUuXG4qL1xuZnVuY3Rpb24gZm9sZGVkUmFuZ2VzKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpIHx8IFJhbmdlU2V0LmVtcHR5O1xufVxuZnVuY3Rpb24gZmluZEZvbGQoc3RhdGUsIGZyb20sIHRvKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgKF9hID0gc3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5iZXR3ZWVuKGZyb20sIHRvLCAoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgaWYgKCFmb3VuZCB8fCBmb3VuZC5mcm9tID4gZnJvbSlcbiAgICAgICAgICAgIGZvdW5kID0geyBmcm9tLCB0byB9O1xuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGZvbGRFeGlzdHMoZm9sZGVkLCBmcm9tLCB0bykge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvbGRlZC5iZXR3ZWVuKGZyb20sIGZyb20sIChhLCBiKSA9PiB7IGlmIChhID09IGZyb20gJiYgYiA9PSB0bylcbiAgICAgICAgZm91bmQgPSB0cnVlOyB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBtYXliZUVuYWJsZShzdGF0ZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gc3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkgPyBvdGhlciA6IG90aGVyLmNvbmNhdChTdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcub2YoY29kZUZvbGRpbmcoKSkpO1xufVxuLyoqXG5Gb2xkIHRoZSBsaW5lcyB0aGF0IGFyZSBzZWxlY3RlZCwgaWYgcG9zc2libGUuXG4qL1xuY29uc3QgZm9sZENvZGUgPSB2aWV3ID0+IHtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZm9sZGFibGUodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogbWF5YmVFbmFibGUodmlldy5zdGF0ZSwgW2ZvbGRFZmZlY3Qub2YocmFuZ2UpLCBhbm5vdW5jZUZvbGQodmlldywgcmFuZ2UpXSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5VbmZvbGQgZm9sZGVkIHJhbmdlcyBvbiBzZWxlY3RlZCBsaW5lcy5cbiovXG5jb25zdCB1bmZvbGRDb2RlID0gdmlldyA9PiB7XG4gICAgaWYgKCF2aWV3LnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpXG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkZWQsIGZhbHNlKSk7XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHMgfSk7XG4gICAgcmV0dXJuIGVmZmVjdHMubGVuZ3RoID4gMDtcbn07XG5mdW5jdGlvbiBhbm5vdW5jZUZvbGQodmlldywgcmFuZ2UsIGZvbGQgPSB0cnVlKSB7XG4gICAgbGV0IGxpbmVGcm9tID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHJhbmdlLmZyb20pLm51bWJlciwgbGluZVRvID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHJhbmdlLnRvKS5udW1iZXI7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcuYW5ub3VuY2Uub2YoYCR7dmlldy5zdGF0ZS5waHJhc2UoZm9sZCA/IFwiRm9sZGVkIGxpbmVzXCIgOiBcIlVuZm9sZGVkIGxpbmVzXCIpfSAke2xpbmVGcm9tfSAke3ZpZXcuc3RhdGUucGhyYXNlKFwidG9cIil9ICR7bGluZVRvfS5gKTtcbn1cbi8qKlxuRm9sZCBhbGwgdG9wLWxldmVsIGZvbGRhYmxlIHJhbmdlcy4gTm90ZSB0aGF0LCBpbiBtb3N0IGNhc2VzLFxuZm9sZGluZyBpbmZvcm1hdGlvbiB3aWxsIGRlcGVuZCBvbiB0aGUgW3N5bnRheFxudHJlZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhUcmVlKSwgYW5kIGZvbGRpbmcgZXZlcnl0aGluZyBtYXkgbm90IHdvcmtcbnJlbGlhYmx5IHdoZW4gdGhlIGRvY3VtZW50IGhhc24ndCBiZWVuIGZ1bGx5IHBhcnNlZCAoZWl0aGVyXG5iZWNhdXNlIHRoZSBlZGl0b3Igc3RhdGUgd2FzIG9ubHkganVzdCBpbml0aWFsaXplZCwgb3IgYmVjYXVzZSB0aGVcbmRvY3VtZW50IGlzIHNvIGJpZyB0aGF0IHRoZSBwYXJzZXIgZGVjaWRlZCBub3QgdG8gcGFyc2UgaXRcbmVudGlyZWx5KS5cbiovXG5jb25zdCBmb2xkQWxsID0gdmlldyA9PiB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBwb3MgPSAwOyBwb3MgPCBzdGF0ZS5kb2MubGVuZ3RoOykge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQocG9zKSwgcmFuZ2UgPSBmb2xkYWJsZShzdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlKVxuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKGZvbGRFZmZlY3Qub2YocmFuZ2UpKTtcbiAgICAgICAgcG9zID0gKHJhbmdlID8gdmlldy5saW5lQmxvY2tBdChyYW5nZS50bykgOiBsaW5lKS50byArIDE7XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IG1heWJlRW5hYmxlKHZpZXcuc3RhdGUsIGVmZmVjdHMpIH0pO1xuICAgIHJldHVybiAhIWVmZmVjdHMubGVuZ3RoO1xufTtcbi8qKlxuVW5mb2xkIGFsbCBmb2xkZWQgY29kZS5cbiovXG5jb25zdCB1bmZvbGRBbGwgPSB2aWV3ID0+IHtcbiAgICBsZXQgZmllbGQgPSB2aWV3LnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpO1xuICAgIGlmICghZmllbGQgfHwgIWZpZWxkLnNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZWZmZWN0cyA9IFtdO1xuICAgIGZpZWxkLmJldHdlZW4oMCwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoLCAoZnJvbSwgdG8pID0+IHsgZWZmZWN0cy5wdXNoKHVuZm9sZEVmZmVjdC5vZih7IGZyb20sIHRvIH0pKTsgfSk7XG4gICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLy8gRmluZCB0aGUgZm9sZGFibGUgcmVnaW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGxpbmUsIGlmIG9uZSBleGlzdHNcbmZ1bmN0aW9uIGZvbGRhYmxlQ29udGFpbmVyKHZpZXcsIGxpbmVCbG9jaykge1xuICAgIC8vIExvb2sgYmFja3dhcmRzIHRocm91Z2ggbGluZSBibG9ja3MgdW50aWwgd2UgZmluZCBhIGZvbGRhYmxlIHJlZ2lvbiB0aGF0XG4gICAgLy8gaW50ZXJzZWN0cyB3aXRoIHRoZSBsaW5lXG4gICAgZm9yIChsZXQgbGluZSA9IGxpbmVCbG9jazs7KSB7XG4gICAgICAgIGxldCBmb2xkYWJsZVJlZ2lvbiA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkYWJsZVJlZ2lvbiAmJiBmb2xkYWJsZVJlZ2lvbi50byA+IGxpbmVCbG9jay5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIGZvbGRhYmxlUmVnaW9uO1xuICAgICAgICBpZiAoIWxpbmUuZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsaW5lID0gdmlldy5saW5lQmxvY2tBdChsaW5lLmZyb20gLSAxKTtcbiAgICB9XG59XG4vKipcblRvZ2dsZSBmb2xkaW5nIGF0IGN1cnNvcnMuIFVuZm9sZHMgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgZm9sZFxuc3RhcnRpbmcgaW4gdGhhdCBsaW5lLCB0cmllcyB0byBmaW5kIGEgZm9sZGFibGUgcmFuZ2UgYXJvdW5kIGl0XG5vdGhlcndpc2UuXG4qL1xuY29uc3QgdG9nZ2xlRm9sZCA9ICh2aWV3KSA9PiB7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpIHtcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1bmZvbGRFZmZlY3Qub2YoZm9sZGVkKSwgYW5ub3VuY2VGb2xkKHZpZXcsIGZvbGRlZCwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmb2xkUmFuZ2UgPSBmb2xkYWJsZUNvbnRhaW5lcih2aWV3LCBsaW5lKTtcbiAgICAgICAgICAgIGlmIChmb2xkUmFuZ2UpXG4gICAgICAgICAgICAgICAgZWZmZWN0cy5wdXNoKGZvbGRFZmZlY3Qub2YoZm9sZFJhbmdlKSwgYW5ub3VuY2VGb2xkKHZpZXcsIGZvbGRSYW5nZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aCA+IDApXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBtYXliZUVuYWJsZSh2aWV3LnN0YXRlLCBlZmZlY3RzKSB9KTtcbiAgICByZXR1cm4gISFlZmZlY3RzLmxlbmd0aDtcbn07XG4vKipcbkRlZmF1bHQgZm9sZC1yZWxhdGVkIGtleSBiaW5kaW5ncy5cblxuIC0gQ3RybC1TaGlmdC1bIChDbWQtQWx0LVsgb24gbWFjT1MpOiBbYGZvbGRDb2RlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkQ29kZSkuXG4gLSBDdHJsLVNoaWZ0LV0gKENtZC1BbHQtXSBvbiBtYWNPUyk6IFtgdW5mb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UudW5mb2xkQ29kZSkuXG4gLSBDdHJsLUFsdC1bOiBbYGZvbGRBbGxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRBbGwpLlxuIC0gQ3RybC1BbHQtXTogW2B1bmZvbGRBbGxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnVuZm9sZEFsbCkuXG4qL1xuY29uc3QgZm9sZEtleW1hcCA9IFtcbiAgICB7IGtleTogXCJDdHJsLVNoaWZ0LVtcIiwgbWFjOiBcIkNtZC1BbHQtW1wiLCBydW46IGZvbGRDb2RlIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1TaGlmdC1dXCIsIG1hYzogXCJDbWQtQWx0LV1cIiwgcnVuOiB1bmZvbGRDb2RlIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1BbHQtW1wiLCBydW46IGZvbGRBbGwgfSxcbiAgICB7IGtleTogXCJDdHJsLUFsdC1dXCIsIHJ1bjogdW5mb2xkQWxsIH1cbl07XG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICAgIHBsYWNlaG9sZGVyRE9NOiBudWxsLFxuICAgIHByZXBhcmVQbGFjZWhvbGRlcjogbnVsbCxcbiAgICBwbGFjZWhvbGRlclRleHQ6IFwiXHUyMDI2XCJcbn07XG5jb25zdCBmb2xkQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHsgcmV0dXJuIGNvbWJpbmVDb25maWcodmFsdWVzLCBkZWZhdWx0Q29uZmlnKTsgfVxufSk7XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBjb25maWd1cmVzIGNvZGUgZm9sZGluZy5cbiovXG5mdW5jdGlvbiBjb2RlRm9sZGluZyhjb25maWcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW2ZvbGRTdGF0ZSwgYmFzZVRoZW1lJDFdO1xuICAgIGlmIChjb25maWcpXG4gICAgICAgIHJlc3VsdC5wdXNoKGZvbGRDb25maWcub2YoY29uZmlnKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHdpZGdldFRvRE9NKHZpZXcsIHByZXBhcmVkKSB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNvbmYgPSBzdGF0ZS5mYWNldChmb2xkQ29uZmlnKTtcbiAgICBsZXQgb25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQodmlldy5wb3NBdERPTShldmVudC50YXJnZXQpKTtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCkgfSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICBpZiAoY29uZi5wbGFjZWhvbGRlckRPTSlcbiAgICAgICAgcmV0dXJuIGNvbmYucGxhY2Vob2xkZXJET00odmlldywgb25jbGljaywgcHJlcGFyZWQpO1xuICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGNvbmYucGxhY2Vob2xkZXJUZXh0O1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBzdGF0ZS5waHJhc2UoXCJmb2xkZWQgY29kZVwiKSk7XG4gICAgZWxlbWVudC50aXRsZSA9IHN0YXRlLnBocmFzZShcInVuZm9sZFwiKTtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwiY20tZm9sZFBsYWNlaG9sZGVyXCI7XG4gICAgZWxlbWVudC5vbmNsaWNrID0gb25jbGljaztcbiAgICByZXR1cm4gZWxlbWVudDtcbn1cbmNvbnN0IGZvbGRXaWRnZXQgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiAvKkBfX1BVUkVfXyovbmV3IGNsYXNzIGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgICAgIHRvRE9NKHZpZXcpIHsgcmV0dXJuIHdpZGdldFRvRE9NKHZpZXcsIG51bGwpOyB9XG4gICAgfSB9KTtcbmNsYXNzIFByZXBhcmVkRm9sZFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT0gb3RoZXIudmFsdWU7IH1cbiAgICB0b0RPTSh2aWV3KSB7IHJldHVybiB3aWRnZXRUb0RPTSh2aWV3LCB0aGlzLnZhbHVlKTsgfVxufVxuY29uc3QgZm9sZEd1dHRlckRlZmF1bHRzID0ge1xuICAgIG9wZW5UZXh0OiBcIlx1MjMwNFwiLFxuICAgIGNsb3NlZFRleHQ6IFwiXHUyMDNBXCIsXG4gICAgbWFya2VyRE9NOiBudWxsLFxuICAgIGRvbUV2ZW50SGFuZGxlcnM6IHt9LFxuICAgIGZvbGRpbmdDaGFuZ2VkOiAoKSA9PiBmYWxzZVxufTtcbmNsYXNzIEZvbGRNYXJrZXIgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgb3Blbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMuY29uZmlnID09IG90aGVyLmNvbmZpZyAmJiB0aGlzLm9wZW4gPT0gb3RoZXIub3BlbjsgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm1hcmtlckRPTSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tYXJrZXJET00odGhpcy5vcGVuKTtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHRoaXMub3BlbiA/IHRoaXMuY29uZmlnLm9wZW5UZXh0IDogdGhpcy5jb25maWcuY2xvc2VkVGV4dDtcbiAgICAgICAgc3Bhbi50aXRsZSA9IHZpZXcuc3RhdGUucGhyYXNlKHRoaXMub3BlbiA/IFwiRm9sZCBsaW5lXCIgOiBcIlVuZm9sZCBsaW5lXCIpO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG59XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCByZWdpc3RlcnMgYSBmb2xkIGd1dHRlciwgd2hpY2ggc2hvd3MgYVxuZm9sZCBzdGF0dXMgaW5kaWNhdG9yIGJlZm9yZSBmb2xkYWJsZSBsaW5lcyAod2hpY2ggY2FuIGJlIGNsaWNrZWRcbnRvIGZvbGQgb3IgdW5mb2xkIHRoZSBsaW5lKS5cbiovXG5mdW5jdGlvbiBmb2xkR3V0dGVyKGNvbmZpZyA9IHt9KSB7XG4gICAgbGV0IGZ1bGxDb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvbGRHdXR0ZXJEZWZhdWx0cyksIGNvbmZpZyk7XG4gICAgbGV0IGNhbkZvbGQgPSBuZXcgRm9sZE1hcmtlcihmdWxsQ29uZmlnLCB0cnVlKSwgY2FuVW5mb2xkID0gbmV3IEZvbGRNYXJrZXIoZnVsbENvbmZpZywgZmFsc2UpO1xuICAgIGxldCBtYXJrZXJzID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmZyb20gPSB2aWV3LnZpZXdwb3J0LmZyb207XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSB0aGlzLmJ1aWxkTWFya2Vycyh2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxhbmd1YWdlKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQobGFuZ3VhZ2UpIHx8XG4gICAgICAgICAgICAgICAgdXBkYXRlLnN0YXJ0U3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkgIT0gdXBkYXRlLnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgc3ludGF4VHJlZSh1cGRhdGUuc3RhcnRTdGF0ZSkgIT0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpIHx8XG4gICAgICAgICAgICAgICAgZnVsbENvbmZpZy5mb2xkaW5nQ2hhbmdlZCh1cGRhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya2VycyA9IHRoaXMuYnVpbGRNYXJrZXJzKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZE1hcmtlcnModmlldykge1xuICAgICAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHZpZXcudmlld3BvcnRMaW5lQmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pID8gY2FuVW5mb2xkXG4gICAgICAgICAgICAgICAgICAgIDogZm9sZGFibGUodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKSA/IGNhbkZvbGQgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChtYXJrKVxuICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChsaW5lLmZyb20sIGxpbmUuZnJvbSwgbWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB7IGRvbUV2ZW50SGFuZGxlcnMgfSA9IGZ1bGxDb25maWc7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbWFya2VycyxcbiAgICAgICAgZ3V0dGVyKHtcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWZvbGRHdXR0ZXJcIixcbiAgICAgICAgICAgIG1hcmtlcnModmlldykgeyB2YXIgX2E7IHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4obWFya2VycykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXJrZXJzKSB8fCBSYW5nZVNldC5lbXB0eTsgfSxcbiAgICAgICAgICAgIGluaXRpYWxTcGFjZXIoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb2xkTWFya2VyKGZ1bGxDb25maWcsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRvbUV2ZW50SGFuZGxlcnMpLCB7IGNsaWNrOiAodmlldywgbGluZSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbUV2ZW50SGFuZGxlcnMuY2xpY2sgJiYgZG9tRXZlbnRIYW5kbGVycy5jbGljayh2aWV3LCBsaW5lLCBldmVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB1bmZvbGRFZmZlY3Qub2YoZm9sZGVkKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IGZvbGRFZmZlY3Qub2YocmFuZ2UpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gfSlcbiAgICAgICAgfSksXG4gICAgICAgIGNvZGVGb2xkaW5nKClcbiAgICBdO1xufVxuY29uc3QgYmFzZVRoZW1lJDEgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiLmNtLWZvbGRQbGFjZWhvbGRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZWVlXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI2RkZFwiLFxuICAgICAgICBjb2xvcjogXCIjODg4XCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIuMmVtXCIsXG4gICAgICAgIG1hcmdpbjogXCIwIDFweFwiLFxuICAgICAgICBwYWRkaW5nOiBcIjAgMXB4XCIsXG4gICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICB9LFxuICAgIFwiLmNtLWZvbGRHdXR0ZXIgc3BhblwiOiB7XG4gICAgICAgIHBhZGRpbmc6IFwiMCAxcHhcIixcbiAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgIH1cbn0pO1xuXG4vKipcbkEgaGlnaGxpZ2h0IHN0eWxlIGFzc29jaWF0ZXMgQ1NTIHN0eWxlcyB3aXRoIGhpZ2xpZ2h0aW5nXG5bdGFnc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNoaWdobGlnaHQuVGFnKS5cbiovXG5jbGFzcyBIaWdobGlnaHRTdHlsZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHRhZyBzdHlsZXMgdXNlZCB0byBjcmVhdGUgdGhpcyBoaWdobGlnaHQgc3R5bGUuXG4gICAgKi9cbiAgICBzcGVjcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnNwZWNzID0gc3BlY3M7XG4gICAgICAgIGxldCBtb2RTcGVjO1xuICAgICAgICBmdW5jdGlvbiBkZWYoc3BlYykge1xuICAgICAgICAgICAgbGV0IGNscyA9IFN0eWxlTW9kdWxlLm5ld05hbWUoKTtcbiAgICAgICAgICAgIChtb2RTcGVjIHx8IChtb2RTcGVjID0gT2JqZWN0LmNyZWF0ZShudWxsKSkpW1wiLlwiICsgY2xzXSA9IHNwZWM7XG4gICAgICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbCA9IHR5cGVvZiBvcHRpb25zLmFsbCA9PSBcInN0cmluZ1wiID8gb3B0aW9ucy5hbGwgOiBvcHRpb25zLmFsbCA/IGRlZihvcHRpb25zLmFsbCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNjb3BlT3B0ID0gb3B0aW9ucy5zY29wZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlT3B0IGluc3RhbmNlb2YgTGFuZ3VhZ2UgPyAodHlwZSkgPT4gdHlwZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHNjb3BlT3B0LmRhdGFcbiAgICAgICAgICAgIDogc2NvcGVPcHQgPyAodHlwZSkgPT4gdHlwZSA9PSBzY29wZU9wdCA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHRhZ0hpZ2hsaWdodGVyKHNwZWNzLm1hcChzdHlsZSA9PiAoe1xuICAgICAgICAgICAgdGFnOiBzdHlsZS50YWcsXG4gICAgICAgICAgICBjbGFzczogc3R5bGUuY2xhc3MgfHwgZGVmKE9iamVjdC5hc3NpZ24oe30sIHN0eWxlLCB7IHRhZzogbnVsbCB9KSlcbiAgICAgICAgfSkpLCB7XG4gICAgICAgICAgICBhbGwsXG4gICAgICAgIH0pLnN0eWxlO1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZFNwZWMgPyBuZXcgU3R5bGVNb2R1bGUobW9kU3BlYykgOiBudWxsO1xuICAgICAgICB0aGlzLnRoZW1lVHlwZSA9IG9wdGlvbnMudGhlbWVUeXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBoaWdobGlnaHRlciBzdHlsZSB0aGF0IGFzc29jaWF0ZXMgdGhlIGdpdmVuIHN0eWxlcyB0b1xuICAgIHRoZSBnaXZlbiB0YWdzLiBUaGUgc3BlY3MgbXVzdCBiZSBvYmplY3RzIHRoYXQgaG9sZCBhIHN0eWxlIHRhZ1xuICAgIG9yIGFycmF5IG9mIHRhZ3MgaW4gdGhlaXIgYHRhZ2AgcHJvcGVydHksIGFuZCBlaXRoZXIgYSBzaW5nbGVcbiAgICBgY2xhc3NgIHByb3BlcnR5IHByb3ZpZGluZyBhIHN0YXRpYyBDU1MgY2xhc3MgKGZvciBoaWdobGlnaHRlclxuICAgIHRoYXQgcmVseSBvbiBleHRlcm5hbCBzdHlsaW5nKSwgb3IgYVxuICAgIFtgc3R5bGUtbW9kYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pLXN0eWxlXG4gICAgc2V0IG9mIENTUyBwcm9wZXJ0aWVzICh3aGljaCBkZWZpbmUgdGhlIHN0eWxpbmcgZm9yIHRob3NlIHRhZ3MpLlxuICAgIFxuICAgIFRoZSBDU1MgcnVsZXMgY3JlYXRlZCBmb3IgYSBoaWdobGlnaHRlciB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlXG4gICAgb3JkZXIgb2YgdGhlIHNwZWMncyBwcm9wZXJ0aWVzLiBUaGF0IG1lYW5zIHRoYXQgZm9yIGVsZW1lbnRzIHRoYXRcbiAgICBoYXZlIG11bHRpcGxlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZW0sIHN0eWxlcyBkZWZpbmVkIGZ1cnRoZXJcbiAgICBkb3duIGluIHRoZSBsaXN0IHdpbGwgaGF2ZSBhIGhpZ2hlciBDU1MgcHJlY2VkZW5jZSB0aGFuIHN0eWxlc1xuICAgIGRlZmluZWQgZWFybGllci5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaWdobGlnaHRTdHlsZShzcGVjcywgb3B0aW9ucyB8fCB7fSk7XG4gICAgfVxufVxuY29uc3QgaGlnaGxpZ2h0ZXJGYWNldCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGZhbGxiYWNrSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKHZhbHVlcykgeyByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IFt2YWx1ZXNbMF1dIDogbnVsbDsgfVxufSk7XG5mdW5jdGlvbiBnZXRIaWdobGlnaHRlcnMoc3RhdGUpIHtcbiAgICBsZXQgbWFpbiA9IHN0YXRlLmZhY2V0KGhpZ2hsaWdodGVyRmFjZXQpO1xuICAgIHJldHVybiBtYWluLmxlbmd0aCA/IG1haW4gOiBzdGF0ZS5mYWNldChmYWxsYmFja0hpZ2hsaWdodGVyKTtcbn1cbi8qKlxuV3JhcCBhIGhpZ2hsaWdodGVyIGluIGFuIGVkaXRvciBleHRlbnNpb24gdGhhdCB1c2VzIGl0IHRvIGFwcGx5XG5zeW50YXggaGlnaGxpZ2h0aW5nIHRvIHRoZSBlZGl0b3IgY29udGVudC5cblxuV2hlbiBtdWx0aXBsZSAobm9uLWZhbGxiYWNrKSBzdHlsZXMgYXJlIHByb3ZpZGVkLCB0aGUgc3R5bGluZ1xuYXBwbGllZCBpcyB0aGUgdW5pb24gb2YgdGhlIGNsYXNzZXMgdGhleSBlbWl0LlxuKi9cbmZ1bmN0aW9uIHN5bnRheEhpZ2hsaWdodGluZyhoaWdobGlnaHRlciwgb3B0aW9ucykge1xuICAgIGxldCBleHQgPSBbdHJlZUhpZ2hsaWdodGVyXSwgdGhlbWVUeXBlO1xuICAgIGlmIChoaWdobGlnaHRlciBpbnN0YW5jZW9mIEhpZ2hsaWdodFN0eWxlKSB7XG4gICAgICAgIGlmIChoaWdobGlnaHRlci5tb2R1bGUpXG4gICAgICAgICAgICBleHQucHVzaChFZGl0b3JWaWV3LnN0eWxlTW9kdWxlLm9mKGhpZ2hsaWdodGVyLm1vZHVsZSkpO1xuICAgICAgICB0aGVtZVR5cGUgPSBoaWdobGlnaHRlci50aGVtZVR5cGU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmFsbGJhY2spXG4gICAgICAgIGV4dC5wdXNoKGZhbGxiYWNrSGlnaGxpZ2h0ZXIub2YoaGlnaGxpZ2h0ZXIpKTtcbiAgICBlbHNlIGlmICh0aGVtZVR5cGUpXG4gICAgICAgIGV4dC5wdXNoKGhpZ2hsaWdodGVyRmFjZXQuY29tcHV0ZU4oW0VkaXRvclZpZXcuZGFya1RoZW1lXSwgc3RhdGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmZhY2V0KEVkaXRvclZpZXcuZGFya1RoZW1lKSA9PSAodGhlbWVUeXBlID09IFwiZGFya1wiKSA/IFtoaWdobGlnaHRlcl0gOiBbXTtcbiAgICAgICAgfSkpO1xuICAgIGVsc2VcbiAgICAgICAgZXh0LnB1c2goaGlnaGxpZ2h0ZXJGYWNldC5vZihoaWdobGlnaHRlcikpO1xuICAgIHJldHVybiBleHQ7XG59XG4vKipcblJldHVybnMgdGhlIENTUyBjbGFzc2VzIChpZiBhbnkpIHRoYXQgdGhlIGhpZ2hsaWdodGVycyBhY3RpdmUgaW5cbnRoZSBzdGF0ZSB3b3VsZCBhc3NpZ24gdG8gdGhlIGdpdmVuIHN0eWxlXG5bdGFnc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNoaWdobGlnaHQuVGFnKSBhbmRcbihvcHRpb25hbCkgbGFuZ3VhZ2VcbltzY29wZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5IaWdobGlnaHRTdHlsZV5kZWZpbmVeb3B0aW9ucy5zY29wZSkuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0aW5nRm9yKHN0YXRlLCB0YWdzLCBzY29wZSkge1xuICAgIGxldCBoaWdobGlnaHRlcnMgPSBnZXRIaWdobGlnaHRlcnMoc3RhdGUpO1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGlmIChoaWdobGlnaHRlcnMpXG4gICAgICAgIGZvciAobGV0IGhpZ2hsaWdodGVyIG9mIGhpZ2hsaWdodGVycykge1xuICAgICAgICAgICAgaWYgKCFoaWdobGlnaHRlci5zY29wZSB8fCBzY29wZSAmJiBoaWdobGlnaHRlci5zY29wZShzY29wZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xzID0gaGlnaGxpZ2h0ZXIuc3R5bGUodGFncyk7XG4gICAgICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gcmVzdWx0ICsgXCIgXCIgKyBjbHMgOiBjbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgVHJlZUhpZ2hsaWdodGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMubWFya0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHZpZXcsIGdldEhpZ2hsaWdodGVycyh2aWV3LnN0YXRlKSk7XG4gICAgICAgIHRoaXMuZGVjb3JhdGVkVG8gPSB2aWV3LnZpZXdwb3J0LnRvO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpLCBoaWdobGlnaHRlcnMgPSBnZXRIaWdobGlnaHRlcnModXBkYXRlLnN0YXRlKTtcbiAgICAgICAgbGV0IHN0eWxlQ2hhbmdlID0gaGlnaGxpZ2h0ZXJzICE9IGdldEhpZ2hsaWdodGVycyh1cGRhdGUuc3RhcnRTdGF0ZSk7XG4gICAgICAgIGxldCB7IHZpZXdwb3J0IH0gPSB1cGRhdGUudmlldywgZGVjb3JhdGVkVG9NYXBwZWQgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModGhpcy5kZWNvcmF0ZWRUbywgMSk7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA8IHZpZXdwb3J0LnRvICYmICFzdHlsZUNoYW5nZSAmJiB0cmVlLnR5cGUgPT0gdGhpcy50cmVlLnR5cGUgJiYgZGVjb3JhdGVkVG9NYXBwZWQgPj0gdmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRpb25zLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlZFRvID0gZGVjb3JhdGVkVG9NYXBwZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJlZSAhPSB0aGlzLnRyZWUgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fCBzdHlsZUNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh1cGRhdGUudmlldywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGVkVG8gPSB2aWV3cG9ydC50bztcbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsZERlY28odmlldywgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGlmICghaGlnaGxpZ2h0ZXJzIHx8ICF0aGlzLnRyZWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiB2aWV3LnZpc2libGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGhpZ2hsaWdodFRyZWUodGhpcy50cmVlLCBoaWdobGlnaHRlcnMsIChmcm9tLCB0bywgc3R5bGUpID0+IHtcbiAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChmcm9tLCB0bywgdGhpcy5tYXJrQ2FjaGVbc3R5bGVdIHx8ICh0aGlzLm1hcmtDYWNoZVtzdHlsZV0gPSBEZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogc3R5bGUgfSkpKTtcbiAgICAgICAgICAgIH0sIGZyb20sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICB9XG59XG5jb25zdCB0cmVlSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovUHJlYy5oaWdoKC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhUcmVlSGlnaGxpZ2h0ZXIsIHtcbiAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG59KSk7XG4vKipcbkEgZGVmYXVsdCBoaWdobGlnaHQgc3R5bGUgKHdvcmtzIHdlbGwgd2l0aCBsaWdodCB0aGVtZXMpLlxuKi9cbmNvbnN0IGRlZmF1bHRIaWdobGlnaHRTdHlsZSA9IC8qQF9fUFVSRV9fKi9IaWdobGlnaHRTdHlsZS5kZWZpbmUoW1xuICAgIHsgdGFnOiB0YWdzLm1ldGEsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQ3NDBcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxpbmssXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaGVhZGluZyxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFwidW5kZXJsaW5lXCIsXG4gICAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZW1waGFzaXMsXG4gICAgICAgIGZvbnRTdHlsZTogXCJpdGFsaWNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cm9uZyxcbiAgICAgICAgZm9udFdlaWdodDogXCJib2xkXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJpa2V0aHJvdWdoLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJsaW5lLXRocm91Z2hcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmtleXdvcmQsXG4gICAgICAgIGNvbG9yOiBcIiM3MDhcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5hdG9tLCB0YWdzLmJvb2wsIHRhZ3MudXJsLCB0YWdzLmNvbnRlbnRTZXBhcmF0b3IsIHRhZ3MubGFiZWxOYW1lXSxcbiAgICAgICAgY29sb3I6IFwiIzIxOVwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLmxpdGVyYWwsIHRhZ3MuaW5zZXJ0ZWRdLFxuICAgICAgICBjb2xvcjogXCIjMTY0XCIgfSxcbiAgICB7IHRhZzogW3RhZ3Muc3RyaW5nLCB0YWdzLmRlbGV0ZWRdLFxuICAgICAgICBjb2xvcjogXCIjYTExXCIgfSxcbiAgICB7IHRhZzogW3RhZ3MucmVnZXhwLCB0YWdzLmVzY2FwZSwgLypAX19QVVJFX18qL3RhZ3Muc3BlY2lhbCh0YWdzLnN0cmluZyldLFxuICAgICAgICBjb2xvcjogXCIjZTQwXCIgfSxcbiAgICB7IHRhZzogLypAX19QVVJFX18qL3RhZ3MuZGVmaW5pdGlvbih0YWdzLnZhcmlhYmxlTmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMwMGZcIiB9LFxuICAgIHsgdGFnOiAvKkBfX1BVUkVfXyovdGFncy5sb2NhbCh0YWdzLnZhcmlhYmxlTmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMzMGFcIiB9LFxuICAgIHsgdGFnOiBbdGFncy50eXBlTmFtZSwgdGFncy5uYW1lc3BhY2VdLFxuICAgICAgICBjb2xvcjogXCIjMDg1XCIgfSxcbiAgICB7IHRhZzogdGFncy5jbGFzc05hbWUsXG4gICAgICAgIGNvbG9yOiBcIiMxNjdcIiB9LFxuICAgIHsgdGFnOiBbLypAX19QVVJFX18qL3RhZ3Muc3BlY2lhbCh0YWdzLnZhcmlhYmxlTmFtZSksIHRhZ3MubWFjcm9OYW1lXSxcbiAgICAgICAgY29sb3I6IFwiIzI1NlwiIH0sXG4gICAgeyB0YWc6IC8qQF9fUFVSRV9fKi90YWdzLmRlZmluaXRpb24odGFncy5wcm9wZXJ0eU5hbWUpLFxuICAgICAgICBjb2xvcjogXCIjMDBjXCIgfSxcbiAgICB7IHRhZzogdGFncy5jb21tZW50LFxuICAgICAgICBjb2xvcjogXCIjOTQwXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnZhbGlkLFxuICAgICAgICBjb2xvcjogXCIjZjAwXCIgfVxuXSk7XG5cbmNvbnN0IGJhc2VUaGVtZSA9IC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmJhc2VUaGVtZSh7XG4gICAgXCImLmNtLWZvY3VzZWQgLmNtLW1hdGNoaW5nQnJhY2tldFwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjMzI4YzgyNTJcIiB9LFxuICAgIFwiJi5jbS1mb2N1c2VkIC5jbS1ub25tYXRjaGluZ0JyYWNrZXRcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiI2JiNTU1NTQ0XCIgfVxufSk7XG5jb25zdCBEZWZhdWx0U2NhbkRpc3QgPSAxMDAwMCwgRGVmYXVsdEJyYWNrZXRzID0gXCIoKVtde31cIjtcbmNvbnN0IGJyYWNrZXRNYXRjaGluZ0NvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICBhZnRlckN1cnNvcjogdHJ1ZSxcbiAgICAgICAgICAgIGJyYWNrZXRzOiBEZWZhdWx0QnJhY2tldHMsXG4gICAgICAgICAgICBtYXhTY2FuRGlzdGFuY2U6IERlZmF1bHRTY2FuRGlzdCxcbiAgICAgICAgICAgIHJlbmRlck1hdGNoOiBkZWZhdWx0UmVuZGVyTWF0Y2hcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jb25zdCBtYXRjaGluZ01hcmsgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20tbWF0Y2hpbmdCcmFja2V0XCIgfSksIG5vbm1hdGNoaW5nTWFyayA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1ub25tYXRjaGluZ0JyYWNrZXRcIiB9KTtcbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJNYXRjaChtYXRjaCkge1xuICAgIGxldCBkZWNvcmF0aW9ucyA9IFtdO1xuICAgIGxldCBtYXJrID0gbWF0Y2gubWF0Y2hlZCA/IG1hdGNoaW5nTWFyayA6IG5vbm1hdGNoaW5nTWFyaztcbiAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcmsucmFuZ2UobWF0Y2guc3RhcnQuZnJvbSwgbWF0Y2guc3RhcnQudG8pKTtcbiAgICBpZiAobWF0Y2guZW5kKVxuICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcmsucmFuZ2UobWF0Y2guZW5kLmZyb20sIG1hdGNoLmVuZC50bykpO1xuICAgIHJldHVybiBkZWNvcmF0aW9ucztcbn1cbmNvbnN0IGJyYWNrZXRNYXRjaGluZ1N0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7IHJldHVybiBEZWNvcmF0aW9uLm5vbmU7IH0sXG4gICAgdXBkYXRlKGRlY28sIHRyKSB7XG4gICAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiAhdHIuc2VsZWN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGRlY287XG4gICAgICAgIGxldCBkZWNvcmF0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgY29uZmlnID0gdHIuc3RhdGUuZmFjZXQoYnJhY2tldE1hdGNoaW5nQ29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2YgdHIuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQsIC0xLCBjb25maWcpXG4gICAgICAgICAgICAgICAgfHwgKHJhbmdlLmhlYWQgPiAwICYmIG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQgLSAxLCAxLCBjb25maWcpKVxuICAgICAgICAgICAgICAgIHx8IChjb25maWcuYWZ0ZXJDdXJzb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgKG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQsIDEsIGNvbmZpZykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyYW5nZS5oZWFkIDwgdHIuc3RhdGUuZG9jLmxlbmd0aCAmJiBtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkICsgMSwgLTEsIGNvbmZpZykpKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9ucy5jb25jYXQoY29uZmlnLnJlbmRlck1hdGNoKG1hdGNoLCB0ci5zdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvcmF0aW9ucywgdHJ1ZSk7XG4gICAgfSxcbiAgICBwcm92aWRlOiBmID0+IEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmKVxufSk7XG5jb25zdCBicmFja2V0TWF0Y2hpbmdVbmlxdWUgPSBbXG4gICAgYnJhY2tldE1hdGNoaW5nU3RhdGUsXG4gICAgYmFzZVRoZW1lXG5dO1xuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBicmFja2V0IG1hdGNoaW5nLiBXaGVuZXZlciB0aGVcbmN1cnNvciBpcyBuZXh0IHRvIGEgYnJhY2tldCwgdGhhdCBicmFja2V0IGFuZCB0aGUgb25lIGl0IG1hdGNoZXNcbmFyZSBoaWdobGlnaHRlZC4gT3IsIHdoZW4gbm8gbWF0Y2hpbmcgYnJhY2tldCBpcyBmb3VuZCwgYW5vdGhlclxuaGlnaGxpZ2h0aW5nIHN0eWxlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhpcy5cbiovXG5mdW5jdGlvbiBicmFja2V0TWF0Y2hpbmcoY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW2JyYWNrZXRNYXRjaGluZ0NvbmZpZy5vZihjb25maWcpLCBicmFja2V0TWF0Y2hpbmdVbmlxdWVdO1xufVxuLyoqXG5XaGVuIGxhcmdlciBzeW50YXggbm9kZXMsIHN1Y2ggYXMgSFRNTCB0YWdzLCBhcmUgbWFya2VkIGFzXG5vcGVuaW5nL2Nsb3NpbmcsIGl0IGNhbiBiZSBhIGJpdCBtZXNzeSB0byB0cmVhdCB0aGUgd2hvbGUgbm9kZSBhc1xuYSBtYXRjaGFibGUgYnJhY2tldC4gVGhpcyBub2RlIHByb3AgYWxsb3dzIHlvdSB0byBkZWZpbmUsIGZvciBzdWNoXG5hIG5vZGUsIGEgXHUyMDE4aGFuZGxlXHUyMDE5XHUyMDE0dGhlIHBhcnQgb2YgdGhlIG5vZGUgdGhhdCBpcyBoaWdobGlnaHRlZCwgYW5kXG50aGF0IHRoZSBjdXJzb3IgbXVzdCBiZSBvbiB0byBhY3RpdmF0ZSBoaWdobGlnaHRpbmcgaW4gdGhlIGZpcnN0XG5wbGFjZS5cbiovXG5jb25zdCBicmFja2V0TWF0Y2hpbmdIYW5kbGUgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG5mdW5jdGlvbiBtYXRjaGluZ05vZGVzKG5vZGUsIGRpciwgYnJhY2tldHMpIHtcbiAgICBsZXQgYnlQcm9wID0gbm9kZS5wcm9wKGRpciA8IDAgPyBOb2RlUHJvcC5vcGVuZWRCeSA6IE5vZGVQcm9wLmNsb3NlZEJ5KTtcbiAgICBpZiAoYnlQcm9wKVxuICAgICAgICByZXR1cm4gYnlQcm9wO1xuICAgIGlmIChub2RlLm5hbWUubGVuZ3RoID09IDEpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gYnJhY2tldHMuaW5kZXhPZihub2RlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCAlIDIgPT0gKGRpciA8IDAgPyAxIDogMCkpXG4gICAgICAgICAgICByZXR1cm4gW2JyYWNrZXRzW2luZGV4ICsgZGlyXV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmluZEhhbmRsZShub2RlKSB7XG4gICAgbGV0IGhhc0hhbmRsZSA9IG5vZGUudHlwZS5wcm9wKGJyYWNrZXRNYXRjaGluZ0hhbmRsZSk7XG4gICAgcmV0dXJuIGhhc0hhbmRsZSA/IGhhc0hhbmRsZShub2RlLm5vZGUpIDogbm9kZTtcbn1cbi8qKlxuRmluZCB0aGUgbWF0Y2hpbmcgYnJhY2tldCBmb3IgdGhlIHRva2VuIGF0IGBwb3NgLCBzY2FubmluZ1xuZGlyZWN0aW9uIGBkaXJgLiBPbmx5IHRoZSBgYnJhY2tldHNgIGFuZCBgbWF4U2NhbkRpc3RhbmNlYFxucHJvcGVydGllcyBhcmUgdXNlZCBmcm9tIGBjb25maWdgLCBpZiBnaXZlbi4gUmV0dXJucyBudWxsIGlmIG5vXG5icmFja2V0IHdhcyBmb3VuZCBhdCBgcG9zYCwgb3IgYSBtYXRjaCByZXN1bHQgb3RoZXJ3aXNlLlxuKi9cbmZ1bmN0aW9uIG1hdGNoQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCBjb25maWcgPSB7fSkge1xuICAgIGxldCBtYXhTY2FuRGlzdGFuY2UgPSBjb25maWcubWF4U2NhbkRpc3RhbmNlIHx8IERlZmF1bHRTY2FuRGlzdCwgYnJhY2tldHMgPSBjb25maWcuYnJhY2tldHMgfHwgRGVmYXVsdEJyYWNrZXRzO1xuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSksIG5vZGUgPSB0cmVlLnJlc29sdmVJbm5lcihwb3MsIGRpcik7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZTsgY3VyOyBjdXIgPSBjdXIucGFyZW50KSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gbWF0Y2hpbmdOb2RlcyhjdXIudHlwZSwgZGlyLCBicmFja2V0cyk7XG4gICAgICAgIGlmIChtYXRjaGVzICYmIGN1ci5mcm9tIDwgY3VyLnRvKSB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gZmluZEhhbmRsZShjdXIpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZSAmJiAoZGlyID4gMCA/IHBvcyA+PSBoYW5kbGUuZnJvbSAmJiBwb3MgPCBoYW5kbGUudG8gOiBwb3MgPiBoYW5kbGUuZnJvbSAmJiBwb3MgPD0gaGFuZGxlLnRvKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hNYXJrZWRCcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIGN1ciwgaGFuZGxlLCBtYXRjaGVzLCBicmFja2V0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoUGxhaW5CcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIHRyZWUsIG5vZGUudHlwZSwgbWF4U2NhbkRpc3RhbmNlLCBicmFja2V0cyk7XG59XG5mdW5jdGlvbiBtYXRjaE1hcmtlZEJyYWNrZXRzKF9zdGF0ZSwgX3BvcywgZGlyLCB0b2tlbiwgaGFuZGxlLCBtYXRjaGluZywgYnJhY2tldHMpIHtcbiAgICBsZXQgcGFyZW50ID0gdG9rZW4ucGFyZW50LCBmaXJzdFRva2VuID0geyBmcm9tOiBoYW5kbGUuZnJvbSwgdG86IGhhbmRsZS50byB9O1xuICAgIGxldCBkZXB0aCA9IDAsIGN1cnNvciA9IHBhcmVudCA9PT0gbnVsbCB8fCBwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudC5jdXJzb3IoKTtcbiAgICBpZiAoY3Vyc29yICYmIChkaXIgPCAwID8gY3Vyc29yLmNoaWxkQmVmb3JlKHRva2VuLmZyb20pIDogY3Vyc29yLmNoaWxkQWZ0ZXIodG9rZW4udG8pKSlcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGRpciA8IDAgPyBjdXJzb3IudG8gPD0gdG9rZW4uZnJvbSA6IGN1cnNvci5mcm9tID49IHRva2VuLnRvKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDAgJiYgbWF0Y2hpbmcuaW5kZXhPZihjdXJzb3IudHlwZS5uYW1lKSA+IC0xICYmIGN1cnNvci5mcm9tIDwgY3Vyc29yLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmRIYW5kbGUgPSBmaW5kSGFuZGxlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBmaXJzdFRva2VuLCBlbmQ6IGVuZEhhbmRsZSA/IHsgZnJvbTogZW5kSGFuZGxlLmZyb20sIHRvOiBlbmRIYW5kbGUudG8gfSA6IHVuZGVmaW5lZCwgbWF0Y2hlZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaGluZ05vZGVzKGN1cnNvci50eXBlLCBkaXIsIGJyYWNrZXRzKSkge1xuICAgICAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaGluZ05vZGVzKGN1cnNvci50eXBlLCAtZGlyLCBicmFja2V0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRIYW5kbGUgPSBmaW5kSGFuZGxlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBmaXJzdFRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZW5kSGFuZGxlICYmIGVuZEhhbmRsZS5mcm9tIDwgZW5kSGFuZGxlLnRvID8geyBmcm9tOiBlbmRIYW5kbGUuZnJvbSwgdG86IGVuZEhhbmRsZS50byB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChkaXIgPCAwID8gY3Vyc29yLnByZXZTaWJsaW5nKCkgOiBjdXJzb3IubmV4dFNpYmxpbmcoKSk7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IGZpcnN0VG9rZW4sIG1hdGNoZWQ6IGZhbHNlIH07XG59XG5mdW5jdGlvbiBtYXRjaFBsYWluQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCB0cmVlLCB0b2tlblR5cGUsIG1heFNjYW5EaXN0YW5jZSwgYnJhY2tldHMpIHtcbiAgICBsZXQgc3RhcnRDaCA9IGRpciA8IDAgPyBzdGF0ZS5zbGljZURvYyhwb3MgLSAxLCBwb3MpIDogc3RhdGUuc2xpY2VEb2MocG9zLCBwb3MgKyAxKTtcbiAgICBsZXQgYnJhY2tldCA9IGJyYWNrZXRzLmluZGV4T2Yoc3RhcnRDaCk7XG4gICAgaWYgKGJyYWNrZXQgPCAwIHx8IChicmFja2V0ICUgMiA9PSAwKSAhPSAoZGlyID4gMCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzdGFydFRva2VuID0geyBmcm9tOiBkaXIgPCAwID8gcG9zIC0gMSA6IHBvcywgdG86IGRpciA+IDAgPyBwb3MgKyAxIDogcG9zIH07XG4gICAgbGV0IGl0ZXIgPSBzdGF0ZS5kb2MuaXRlclJhbmdlKHBvcywgZGlyID4gMCA/IHN0YXRlLmRvYy5sZW5ndGggOiAwKSwgZGVwdGggPSAwO1xuICAgIGZvciAobGV0IGRpc3RhbmNlID0gMDsgIShpdGVyLm5leHQoKSkuZG9uZSAmJiBkaXN0YW5jZSA8PSBtYXhTY2FuRGlzdGFuY2U7KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gaXRlci52YWx1ZTtcbiAgICAgICAgaWYgKGRpciA8IDApXG4gICAgICAgICAgICBkaXN0YW5jZSArPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgbGV0IGJhc2VQb3MgPSBwb3MgKyBkaXN0YW5jZSAqIGRpcjtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gZGlyID4gMCA/IDAgOiB0ZXh0Lmxlbmd0aCAtIDEsIGVuZCA9IGRpciA+IDAgPyB0ZXh0Lmxlbmd0aCA6IC0xOyBwb3MgIT0gZW5kOyBwb3MgKz0gZGlyKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBicmFja2V0cy5pbmRleE9mKHRleHRbcG9zXSk7XG4gICAgICAgICAgICBpZiAoZm91bmQgPCAwIHx8IHRyZWUucmVzb2x2ZUlubmVyKGJhc2VQb3MgKyBwb3MsIDEpLnR5cGUgIT0gdG9rZW5UeXBlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKChmb3VuZCAlIDIgPT0gMCkgPT0gKGRpciA+IDApKSB7XG4gICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRlcHRoID09IDEpIHsgLy8gQ2xvc2luZ1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydFRva2VuLCBlbmQ6IHsgZnJvbTogYmFzZVBvcyArIHBvcywgdG86IGJhc2VQb3MgKyBwb3MgKyAxIH0sIG1hdGNoZWQ6IChmb3VuZCA+PiAxKSA9PSAoYnJhY2tldCA+PiAxKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyID4gMClcbiAgICAgICAgICAgIGRpc3RhbmNlICs9IHRleHQubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gaXRlci5kb25lID8geyBzdGFydDogc3RhcnRUb2tlbiwgbWF0Y2hlZDogZmFsc2UgfSA6IG51bGw7XG59XG5cbi8vIENvdW50cyB0aGUgY29sdW1uIG9mZnNldCBpbiBhIHN0cmluZywgdGFraW5nIHRhYnMgaW50byBhY2NvdW50LlxuLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi5cbmZ1bmN0aW9uIGNvdW50Q29sKHN0cmluZywgZW5kLCB0YWJTaXplLCBzdGFydEluZGV4ID0gMCwgc3RhcnRWYWx1ZSA9IDApIHtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgICAgZW5kID0gc3RyaW5nLnNlYXJjaCgvW15cXHNcXHUwMGEwXS8pO1xuICAgICAgICBpZiAoZW5kID09IC0xKVxuICAgICAgICAgICAgZW5kID0gc3RyaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgbGV0IG4gPSBzdGFydFZhbHVlO1xuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KGkpID09IDkpXG4gICAgICAgICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuKys7XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuLyoqXG5FbmNhcHN1bGF0ZXMgYSBzaW5nbGUgbGluZSBvZiBpbnB1dC4gR2l2ZW4gdG8gc3RyZWFtIHN5bnRheCBjb2RlLFxud2hpY2ggdXNlcyBpdCB0byB0b2tlbml6ZSB0aGUgY29udGVudC5cbiovXG5jbGFzcyBTdHJpbmdTdHJlYW0ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHN0cmVhbS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsaW5lLlxuICAgICovXG4gICAgc3RyaW5nLCB0YWJTaXplLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBpbmRlbnQgdW5pdCBzaXplLlxuICAgICovXG4gICAgaW5kZW50VW5pdCwgbG9va0FoZWFkLCBvdmVycmlkZUluZGVudCkge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICAgICAgdGhpcy50YWJTaXplID0gdGFiU2l6ZTtcbiAgICAgICAgdGhpcy5pbmRlbnRVbml0ID0gaW5kZW50VW5pdDtcbiAgICAgICAgdGhpcy5sb29rQWhlYWQgPSBsb29rQWhlYWQ7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVJbmRlbnQgPSBvdmVycmlkZUluZGVudDtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBsaW5lLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhcnQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBlb2woKSB7IHJldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBzb2woKSB7IHJldHVybiB0aGlzLnBvcyA9PSAwOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBuZXh0IGNvZGUgdW5pdCBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbiwgb3IgdW5kZWZpbmVkXG4gICAgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHBlZWsoKSB7IHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpIHx8IHVuZGVmaW5lZDsgfVxuICAgIC8qKlxuICAgIFJlYWQgdGhlIG5leHQgY29kZSB1bml0IGFuZCBhZHZhbmNlIGB0aGlzLnBvc2AuXG4gICAgKi9cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPCB0aGlzLnN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCB0aGUgbmV4dCBjaGFyYWN0ZXIgYWdhaW5zdCB0aGUgZ2l2ZW4gc3RyaW5nLCByZWd1bGFyXG4gICAgZXhwcmVzc2lvbiwgb3IgcHJlZGljYXRlLiBDb25zdW1lIGFuZCByZXR1cm4gaXQgaWYgaXQgbWF0Y2hlcy5cbiAgICAqL1xuICAgIGVhdChtYXRjaCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpO1xuICAgICAgICBsZXQgb2s7XG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIG9rID0gY2ggPT0gbWF0Y2g7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9rID0gY2ggJiYgKG1hdGNoIGluc3RhbmNlb2YgUmVnRXhwID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpO1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ29udGludWUgbWF0Y2hpbmcgY2hhcmFjdGVycyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBzdHJpbmcsXG4gICAgcmVndWxhciBleHByZXNzaW9uLCBvciBwcmVkaWNhdGUgZnVuY3Rpb24uIFJldHVybiB0cnVlIGlmIGFueVxuICAgIGNoYXJhY3RlcnMgd2VyZSBjb25zdW1lZC5cbiAgICAqL1xuICAgIGVhdFdoaWxlKG1hdGNoKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgICAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKSB7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnN1bWUgd2hpdGVzcGFjZSBhaGVhZCBvZiBgdGhpcy5wb3NgLiBSZXR1cm4gdHJ1ZSBpZiBhbnkgd2FzXG4gICAgZm91bmQuXG4gICAgKi9cbiAgICBlYXRTcGFjZSgpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICgvW1xcc1xcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKVxuICAgICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHNraXBUb0VuZCgpIHsgdGhpcy5wb3MgPSB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIGRpcmVjdGx5IGJlZm9yZSB0aGUgZ2l2ZW4gY2hhcmFjdGVyLCBpZiBmb3VuZCBvbiB0aGVcbiAgICBjdXJyZW50IGxpbmUuXG4gICAgKi9cbiAgICBza2lwVG8oY2gpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpO1xuICAgICAgICBpZiAoZm91bmQgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBmb3VuZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYmFjayBgbmAgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIGJhY2tVcChuKSB7IHRoaXMucG9zIC09IG47IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbHVtbiBwb3NpdGlvbiBhdCBgdGhpcy5wb3NgLlxuICAgICovXG4gICAgY29sdW1uKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0Q29sdW1uUG9zIDwgdGhpcy5zdGFydCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSBjb3VudENvbCh0aGlzLnN0cmluZywgdGhpcy5zdGFydCwgdGhpcy50YWJTaXplLCB0aGlzLmxhc3RDb2x1bW5Qb3MsIHRoaXMubGFzdENvbHVtblZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubGFzdENvbHVtblBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdENvbHVtblZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGluZGVudGF0aW9uIGNvbHVtbiBvZiB0aGUgY3VycmVudCBsaW5lLlxuICAgICovXG4gICAgaW5kZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMub3ZlcnJpZGVJbmRlbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvdW50Q29sKHRoaXMuc3RyaW5nLCBudWxsLCB0aGlzLnRhYlNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCB0aGUgaW5wdXQgYWdhaW5zdCB0aGUgZ2l2ZW4gc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgICh3aGljaCBzaG91bGQgc3RhcnQgd2l0aCBhIGBeYCkuIFJldHVybiB0cnVlIG9yIHRoZSByZWdleHAgbWF0Y2hcbiAgICBpZiBpdCBtYXRjaGVzLlxuICAgIFxuICAgIFVubGVzcyBgY29uc3VtZWAgaXMgc2V0IHRvIGBmYWxzZWAsIHRoaXMgd2lsbCBtb3ZlIGB0aGlzLnBvc2BcbiAgICBwYXN0IHRoZSBtYXRjaGVkIHRleHQuXG4gICAgXG4gICAgV2hlbiBtYXRjaGluZyBhIHN0cmluZyBgY2FzZUluc2Vuc2l0aXZlYCBjYW4gYmUgc2V0IHRvIHRydWUgdG9cbiAgICBtYWtlIHRoZSBtYXRjaCBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICovXG4gICAgbWF0Y2gocGF0dGVybiwgY29uc3VtZSwgY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgY2FzZWQgPSAoc3RyKSA9PiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjtcbiAgICAgICAgICAgIGxldCBzdWJzdHIgPSB0aGlzLnN0cmluZy5zdWJzdHIodGhpcy5wb3MsIHBhdHRlcm4ubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChjYXNlZChzdWJzdHIpID09IGNhc2VkKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgY29uc3VtZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY3VycmVudCB0b2tlbi5cbiAgICAqL1xuICAgIGN1cnJlbnQoKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyk7IH1cbn1cblxuZnVuY3Rpb24gZnVsbFBhcnNlcihzcGVjKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogc3BlYy5uYW1lIHx8IFwiXCIsXG4gICAgICAgIHRva2VuOiBzcGVjLnRva2VuLFxuICAgICAgICBibGFua0xpbmU6IHNwZWMuYmxhbmtMaW5lIHx8ICgoKSA9PiBudWxsKSxcbiAgICAgICAgc3RhcnRTdGF0ZTogc3BlYy5zdGFydFN0YXRlIHx8ICgoKSA9PiB0cnVlKSxcbiAgICAgICAgY29weVN0YXRlOiBzcGVjLmNvcHlTdGF0ZSB8fCBkZWZhdWx0Q29weVN0YXRlLFxuICAgICAgICBpbmRlbnQ6IHNwZWMuaW5kZW50IHx8ICgoKSA9PiBudWxsKSxcbiAgICAgICAgbGFuZ3VhZ2VEYXRhOiBzcGVjLmxhbmd1YWdlRGF0YSB8fCB7fSxcbiAgICB9O1xufVxuZnVuY3Rpb24gZGVmYXVsdENvcHlTdGF0ZShzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgIT0gXCJvYmplY3RcIilcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIGxldCBuZXdTdGF0ZSA9IHt9O1xuICAgIGZvciAobGV0IHByb3AgaW4gc3RhdGUpIHtcbiAgICAgICAgbGV0IHZhbCA9IHN0YXRlW3Byb3BdO1xuICAgICAgICBuZXdTdGF0ZVtwcm9wXSA9ICh2YWwgaW5zdGFuY2VvZiBBcnJheSA/IHZhbC5zbGljZSgpIDogdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xufVxuY29uc3QgSW5kZW50ZWRGcm9tID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4vKipcbkEgW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSBjbGFzcyBiYXNlZCBvbiBhIENvZGVNaXJyb3JcbjUtc3R5bGUgW3N0cmVhbWluZyBwYXJzZXJdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuU3RyZWFtUGFyc2VyKS5cbiovXG5jbGFzcyBTdHJlYW1MYW5ndWFnZSBleHRlbmRzIExhbmd1YWdlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBkZWZpbmVMYW5ndWFnZUZhY2V0KHBhcnNlci5sYW5ndWFnZURhdGEpO1xuICAgICAgICBsZXQgcCA9IGZ1bGxQYXJzZXIocGFyc2VyKSwgc2VsZjtcbiAgICAgICAgbGV0IGltcGwgPSBuZXcgY2xhc3MgZXh0ZW5kcyBQYXJzZXIge1xuICAgICAgICAgICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZShzZWxmLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihkYXRhLCBpbXBsLCBbXSwgcGFyc2VyLm5hbWUpO1xuICAgICAgICB0aGlzLnRvcE5vZGUgPSBkb2NJRChkYXRhLCB0aGlzKTtcbiAgICAgICAgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3RyZWFtUGFyc2VyID0gcDtcbiAgICAgICAgdGhpcy5zdGF0ZUFmdGVyID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgc3RyZWFtIGxhbmd1YWdlLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjKSB7IHJldHVybiBuZXcgU3RyZWFtTGFuZ3VhZ2Uoc3BlYyk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldEluZGVudChjeCkge1xuICAgICAgICBsZXQgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHsgb3ZlcnJpZGVJbmRlbnRhdGlvbiB9ID0gY3gub3B0aW9ucztcbiAgICAgICAgaWYgKG92ZXJyaWRlSW5kZW50YXRpb24pIHtcbiAgICAgICAgICAgIGZyb20gPSBJbmRlbnRlZEZyb20uZ2V0KGN4LnN0YXRlKTtcbiAgICAgICAgICAgIGlmIChmcm9tICE9IG51bGwgJiYgZnJvbSA8IGN4LnBvcyAtIDFlNClcbiAgICAgICAgICAgICAgICBmcm9tID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IGZpbmRTdGF0ZSh0aGlzLCBjeC5ub2RlLnRyZWUsIGN4Lm5vZGUuZnJvbSwgY3gubm9kZS5mcm9tLCBmcm9tICE9PSBudWxsICYmIGZyb20gIT09IHZvaWQgMCA/IGZyb20gOiBjeC5wb3MpLCBzdGF0ZVBvcywgc3RhdGU7XG4gICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBzdGFydC5zdGF0ZTtcbiAgICAgICAgICAgIHN0YXRlUG9zID0gc3RhcnQucG9zICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gdGhpcy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShjeC51bml0KTtcbiAgICAgICAgICAgIHN0YXRlUG9zID0gY3gubm9kZS5mcm9tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjeC5wb3MgLSBzdGF0ZVBvcyA+IDEwMDAwIC8qIEMuTWF4SW5kZW50U2NhbkRpc3QgKi8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKHN0YXRlUG9zIDwgY3gucG9zKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGN4LnN0YXRlLmRvYy5saW5lQXQoc3RhdGVQb3MpLCBlbmQgPSBNYXRoLm1pbihjeC5wb3MsIGxpbmUudG8pO1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGVudGF0aW9uID0gb3ZlcnJpZGVJbmRlbnRhdGlvbiA/IG92ZXJyaWRlSW5kZW50YXRpb24obGluZS5mcm9tKSA6IC0xO1xuICAgICAgICAgICAgICAgIGxldCBsb29rYWhlYWQgPSAobikgPT4gbiArIGxpbmUubnVtYmVyID4gY3guc3RhdGUuZG9jLmxpbmVzID8gJycgOiBjeC5zdGF0ZS5kb2MubGluZShuICsgbGluZS5udW1iZXIpLnRleHQ7XG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZS50ZXh0LCBjeC5zdGF0ZS50YWJTaXplLCBjeC51bml0LCBsb29rYWhlYWQsIGluZGVudGF0aW9uIDwgMCA/IHVuZGVmaW5lZCA6IGluZGVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IGVuZCAtIGxpbmUuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgcmVhZFRva2VuKHRoaXMuc3RyZWFtUGFyc2VyLnRva2VuLCBzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtUGFyc2VyLmJsYW5rTGluZShzdGF0ZSwgY3gudW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID09IGN4LnBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0YXRlUG9zID0gbGluZS50byArIDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmUgPSBjeC5saW5lQXQoY3gucG9zKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlSW5kZW50YXRpb24gJiYgZnJvbSA9PSBudWxsKVxuICAgICAgICAgICAgSW5kZW50ZWRGcm9tLnNldChjeC5zdGF0ZSwgbGluZS5mcm9tKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuc3RyZWFtUGFyc2VyLmluZGVudChzdGF0ZSwgL15cXHMqKC4qKS8uZXhlYyhsaW5lLnRleHQpWzFdLCBjeCk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnRvU3RyaW5nKCkgPT09ICdDb2RlTWlycm9yLlBhc3MnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5mdW5jdGlvbiBmaW5kU3RhdGUobGFuZywgdHJlZSwgb2ZmLCBzdGFydFBvcywgYmVmb3JlKSB7XG4gICAgbGV0IHN0YXRlID0gb2ZmID49IHN0YXJ0UG9zICYmIG9mZiArIHRyZWUubGVuZ3RoIDw9IGJlZm9yZSAmJiB0cmVlLnByb3AobGFuZy5zdGF0ZUFmdGVyKTtcbiAgICBpZiAoc3RhdGUpXG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBsYW5nLnN0cmVhbVBhcnNlci5jb3B5U3RhdGUoc3RhdGUpLCBwb3M6IG9mZiArIHRyZWUubGVuZ3RoIH07XG4gICAgZm9yIChsZXQgaSA9IHRyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGNoaWxkID0gdHJlZS5jaGlsZHJlbltpXSwgcG9zID0gb2ZmICsgdHJlZS5wb3NpdGlvbnNbaV07XG4gICAgICAgIGxldCBmb3VuZCA9IGNoaWxkIGluc3RhbmNlb2YgVHJlZSAmJiBwb3MgPCBiZWZvcmUgJiYgZmluZFN0YXRlKGxhbmcsIGNoaWxkLCBwb3MsIHN0YXJ0UG9zLCBiZWZvcmUpO1xuICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY3V0VHJlZShsYW5nLCB0cmVlLCBmcm9tLCB0bywgaW5zaWRlKSB7XG4gICAgaWYgKGluc2lkZSAmJiBmcm9tIDw9IDAgJiYgdG8gPj0gdHJlZS5sZW5ndGgpXG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIGlmICghaW5zaWRlICYmIGZyb20gPT0gMCAmJiB0cmVlLnR5cGUgPT0gbGFuZy50b3BOb2RlKVxuICAgICAgICBpbnNpZGUgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSB0cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBwb3MgPSB0cmVlLnBvc2l0aW9uc1tpXSwgY2hpbGQgPSB0cmVlLmNoaWxkcmVuW2ldLCBpbm5lcjtcbiAgICAgICAgaWYgKHBvcyA8IHRvICYmIGNoaWxkIGluc3RhbmNlb2YgVHJlZSkge1xuICAgICAgICAgICAgaWYgKCEoaW5uZXIgPSBjdXRUcmVlKGxhbmcsIGNoaWxkLCBmcm9tIC0gcG9zLCB0byAtIHBvcywgaW5zaWRlKSkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICByZXR1cm4gIWluc2lkZSA/IGlubmVyXG4gICAgICAgICAgICAgICAgOiBuZXcgVHJlZSh0cmVlLnR5cGUsIHRyZWUuY2hpbGRyZW4uc2xpY2UoMCwgaSkuY29uY2F0KGlubmVyKSwgdHJlZS5wb3NpdGlvbnMuc2xpY2UoMCwgaSArIDEpLCBwb3MgKyBpbm5lci5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmluZFN0YXJ0SW5GcmFnbWVudHMobGFuZywgZnJhZ21lbnRzLCBzdGFydFBvcywgZW5kUG9zLCBlZGl0b3JTdGF0ZSkge1xuICAgIGZvciAobGV0IGYgb2YgZnJhZ21lbnRzKSB7XG4gICAgICAgIGxldCBmcm9tID0gZi5mcm9tICsgKGYub3BlblN0YXJ0ID8gMjUgOiAwKSwgdG8gPSBmLnRvIC0gKGYub3BlbkVuZCA/IDI1IDogMCk7XG4gICAgICAgIGxldCBmb3VuZCA9IGZyb20gPD0gc3RhcnRQb3MgJiYgdG8gPiBzdGFydFBvcyAmJiBmaW5kU3RhdGUobGFuZywgZi50cmVlLCAwIC0gZi5vZmZzZXQsIHN0YXJ0UG9zLCB0byksIHRyZWU7XG4gICAgICAgIGlmIChmb3VuZCAmJiBmb3VuZC5wb3MgPD0gZW5kUG9zICYmICh0cmVlID0gY3V0VHJlZShsYW5nLCBmLnRyZWUsIHN0YXJ0UG9zICsgZi5vZmZzZXQsIGZvdW5kLnBvcyArIGYub2Zmc2V0LCBmYWxzZSkpKVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IGZvdW5kLnN0YXRlLCB0cmVlIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXRlOiBsYW5nLnN0cmVhbVBhcnNlci5zdGFydFN0YXRlKGVkaXRvclN0YXRlID8gZ2V0SW5kZW50VW5pdChlZGl0b3JTdGF0ZSkgOiA0KSwgdHJlZTogVHJlZS5lbXB0eSB9O1xufVxuY2xhc3MgUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKGxhbmcsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICB0aGlzLmxhbmcgPSBsYW5nO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gW107XG4gICAgICAgIHRoaXMuY2h1bmsgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1JldXNlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50b2tlbkNhY2hlID0ge307XG4gICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMudG8gPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICBsZXQgY29udGV4dCA9IFBhcnNlQ29udGV4dC5nZXQoKSwgZnJvbSA9IHJhbmdlc1swXS5mcm9tO1xuICAgICAgICBsZXQgeyBzdGF0ZSwgdHJlZSB9ID0gZmluZFN0YXJ0SW5GcmFnbWVudHMobGFuZywgZnJhZ21lbnRzLCBmcm9tLCB0aGlzLnRvLCBjb250ZXh0ID09PSBudWxsIHx8IGNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbnRleHQuc3RhdGUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMucGFyc2VkUG9zID0gdGhpcy5jaHVua1N0YXJ0ID0gZnJvbSArIHRyZWUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyZWUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtzLnB1c2godHJlZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2godHJlZS5wb3NpdGlvbnNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0ICYmIHRoaXMucGFyc2VkUG9zIDwgY29udGV4dC52aWV3cG9ydC5mcm9tIC0gMTAwMDAwIC8qIEMuTWF4RGlzdGFuY2VCZWZvcmVWaWV3cG9ydCAqLyAmJlxuICAgICAgICAgICAgcmFuZ2VzLnNvbWUociA9PiByLmZyb20gPD0gY29udGV4dC52aWV3cG9ydC5mcm9tICYmIHIudG8gPj0gY29udGV4dC52aWV3cG9ydC5mcm9tKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMubGFuZy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShnZXRJbmRlbnRVbml0KGNvbnRleHQuc3RhdGUpKTtcbiAgICAgICAgICAgIGNvbnRleHQuc2tpcFVudGlsSW5WaWV3KHRoaXMucGFyc2VkUG9zLCBjb250ZXh0LnZpZXdwb3J0LmZyb20pO1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSBjb250ZXh0LnZpZXdwb3J0LmZyb207XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb3ZlUmFuZ2VJbmRleCgpO1xuICAgIH1cbiAgICBhZHZhbmNlKCkge1xuICAgICAgICBsZXQgY29udGV4dCA9IFBhcnNlQ29udGV4dC5nZXQoKTtcbiAgICAgICAgbGV0IHBhcnNlRW5kID0gdGhpcy5zdG9wcGVkQXQgPT0gbnVsbCA/IHRoaXMudG8gOiBNYXRoLm1pbih0aGlzLnRvLCB0aGlzLnN0b3BwZWRBdCk7XG4gICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbihwYXJzZUVuZCwgdGhpcy5jaHVua1N0YXJ0ICsgMjA0OCAvKiBDLkNodW5rU2l6ZSAqLyk7XG4gICAgICAgIC8vIFBhcnNlIGp1c3QgYSBsaXR0bGUgYml0IG1vcmUgdGhhbiB0aGUgdmlld3BvcnQuXG4gICAgICAgIGxldCBvdmVyYnVmZmVyID0gNTAwMDtcbiAgICAgICAgbGV0IHZpZXdwb3J0RW5kID0gY29udGV4dC52aWV3cG9ydC50byArIG92ZXJidWZmZXI7XG4gICAgICAgIGlmIChjb250ZXh0KVxuICAgICAgICAgICAgZW5kID0gTWF0aC5taW4oZW5kLCB2aWV3cG9ydEVuZCk7XG4gICAgICAgIHdoaWxlICh0aGlzLnBhcnNlZFBvcyA8IGVuZClcbiAgICAgICAgICAgIHRoaXMucGFyc2VMaW5lKGNvbnRleHQpO1xuICAgICAgICBpZiAodGhpcy5jaHVua1N0YXJ0IDwgdGhpcy5wYXJzZWRQb3MpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKCk7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlZFBvcyA+PSBwYXJzZUVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaCgpO1xuICAgICAgICBpZiAoY29udGV4dCAmJiB0aGlzLnBhcnNlZFBvcyA+PSB2aWV3cG9ydEVuZCkge1xuICAgICAgICAgICAgY29udGV4dC5za2lwVW50aWxJblZpZXcodGhpcy5wYXJzZWRQb3MgLSBvdmVyYnVmZmVyLCBwYXJzZUVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3RvcEF0KHBvcykge1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IHBvcztcbiAgICB9XG4gICAgbGluZUFmdGVyKHBvcykge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmlucHV0LmNodW5rKHBvcyk7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dC5saW5lQ2h1bmtzKSB7XG4gICAgICAgICAgICBsZXQgZW9sID0gY2h1bmsuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgICAgIGlmIChlb2wgPiAtMSlcbiAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rLnNsaWNlKDAsIGVvbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2h1bmsgPT0gXCJcXG5cIikge1xuICAgICAgICAgICAgY2h1bmsgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3MgKyBjaHVuay5sZW5ndGggPD0gdGhpcy50byA/IGNodW5rIDogY2h1bmsuc2xpY2UoMCwgdGhpcy50byAtIHBvcyk7XG4gICAgfVxuICAgIG5leHRMaW5lKCkge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMucGFyc2VkUG9zLCBsaW5lID0gdGhpcy5saW5lQWZ0ZXIoZnJvbSksIGVuZCA9IGZyb20gKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLnJhbmdlSW5kZXg7Oykge1xuICAgICAgICAgICAgbGV0IHJhbmdlRW5kID0gdGhpcy5yYW5nZXNbaW5kZXhdLnRvO1xuICAgICAgICAgICAgaWYgKHJhbmdlRW5kID49IGVuZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKDAsIHJhbmdlRW5kIC0gKGVuZCAtIGxpbmUubGVuZ3RoKSk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IHRoaXMucmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCByYW5nZVN0YXJ0ID0gdGhpcy5yYW5nZXNbaW5kZXhdLmZyb207XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmxpbmVBZnRlcihyYW5nZVN0YXJ0KTtcbiAgICAgICAgICAgIGxpbmUgKz0gYWZ0ZXI7XG4gICAgICAgICAgICBlbmQgPSByYW5nZVN0YXJ0ICsgYWZ0ZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGVuZCB9O1xuICAgIH1cbiAgICBza2lwR2Fwc1RvKHBvcywgb2Zmc2V0LCBzaWRlKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXhdLnRvLCBvZmZQb3MgPSBwb3MgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoc2lkZSA+IDAgPyBlbmQgPiBvZmZQb3MgOiBlbmQgPj0gb2ZmUG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbKyt0aGlzLnJhbmdlSW5kZXhdLmZyb207XG4gICAgICAgICAgICBvZmZzZXQgKz0gc3RhcnQgLSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgbW92ZVJhbmdlSW5kZXgoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXhdLnRvIDwgdGhpcy5wYXJzZWRQb3MpXG4gICAgICAgICAgICB0aGlzLnJhbmdlSW5kZXgrKztcbiAgICB9XG4gICAgZW1pdFRva2VuKGlkLCBmcm9tLCB0bywgc2l6ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnNraXBHYXBzVG8oZnJvbSwgb2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIGZyb20gKz0gb2Zmc2V0O1xuICAgICAgICAgICAgbGV0IGxlbjAgPSB0aGlzLmNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuc2tpcEdhcHNUbyh0bywgb2Zmc2V0LCAtMSk7XG4gICAgICAgICAgICB0byArPSBvZmZzZXQ7XG4gICAgICAgICAgICBzaXplICs9IHRoaXMuY2h1bmsubGVuZ3RoIC0gbGVuMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuY2h1bmsubGVuZ3RoIC0gNDtcbiAgICAgICAgaWYgKHNpemUgPT0gNCAmJiBsYXN0ID49IDAgJiYgdGhpcy5jaHVua1tsYXN0XSA9PSBpZCAmJiB0aGlzLmNodW5rW2xhc3QgKyAyXSA9PSBmcm9tKVxuICAgICAgICAgICAgdGhpcy5jaHVua1tsYXN0ICsgMl0gPSB0bztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5jaHVuay5wdXNoKGlkLCBmcm9tLCB0bywgc2l6ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHBhcnNlTGluZShjb250ZXh0KSB7XG4gICAgICAgIGxldCB7IGxpbmUsIGVuZCB9ID0gdGhpcy5uZXh0TGluZSgpLCBvZmZzZXQgPSAwLCB7IHN0cmVhbVBhcnNlciB9ID0gdGhpcy5sYW5nLCB7IHRva2VuQ2FjaGUgfSA9IHRoaXM7XG4gICAgICAgIGxldCBsb29rYWhlYWQgPSAobikgPT4ge1xuICAgICAgICAgICAgbGV0IHBvcyA9IHRoaXMucGFyc2VkUG9zO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwb3MgKz0gdGhpcy5saW5lQWZ0ZXIocG9zKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA8IHRoaXMuaW5wdXQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmVBZnRlcihwb3MpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShsaW5lLCBjb250ZXh0ID8gY29udGV4dC5zdGF0ZS50YWJTaXplIDogNCwgY29udGV4dCA/IGdldEluZGVudFVuaXQoY29udGV4dC5zdGF0ZSkgOiAyLCBsb29rYWhlYWQpO1xuICAgICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAgIGxldCBsaW5lQ2xhc3NlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgaWYgKHN0cmVhbS5lb2woKSkge1xuICAgICAgICAgICAgbGV0IHRva2VuID0gc3RyZWFtUGFyc2VyLmJsYW5rTGluZSh0aGlzLnN0YXRlLCBzdHJlYW0uaW5kZW50VW5pdCk7XG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0b2tlbi5zcGxpdCgnICcpLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVDbGFzcyA9IHQubWF0Y2goL15saW5lLShiYWNrZ3JvdW5kLSk/KC4qKSQvKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUNsYXNzZXMuYWRkKGxpbmVDbGFzc1syXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbnVsbDtcbiAgICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRva2VuID0gcmVhZFRva2VuKHN0cmVhbVBhcnNlci50b2tlbiwgc3RyZWFtLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhY2hlZCA9IHRva2VuQ2FjaGVbdG9rZW5dO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZWNscyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2xzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjYWNoZWRbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lY2xzID0gY2FjaGVkWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRva2VucyA9IHRva2VuLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbnMuZmlsdGVyKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lQ2xhc3MgPSB0Lm1hdGNoKC9ebGluZS0oYmFja2dyb3VuZC0pPyguKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lY2xzLnB1c2gobGluZUNsYXNzWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gdG9rZW5zLnNvcnQoKS5qb2luKCcgJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkNhY2hlW3Rva2VuXSA9IFtjbHMsIGxpbmVjbHNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lY2xzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNscyBvZiBsaW5lY2xzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUNsYXNzZXMuYWRkKGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSB0aGlzLnBhcnNlZFBvcyArIHN0cmVhbS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvID0gdGhpcy5wYXJzZWRQb3MgKyBzdHJlYW0ucG9zO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBsYXN0LmNscyA9PT0gY2xzICYmIGxhc3QudG8gPT09IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QudG8gPSB0bztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSB7IGNscywgZnJvbSwgdG8gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGxhc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5lbWl0VG9rZW4odG9rZW5JRChjaHVuay5jbHMpLCBjaHVuay5mcm9tLCBjaHVuay50bywgNCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZUNsYXNzZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZW1pdFRva2VuKHRva2VuSUQoQXJyYXkuZnJvbShsaW5lQ2xhc3Nlcykuc29ydCgpLmpvaW4oJyAnKSwgdHJ1ZSksIHRoaXMucGFyc2VkUG9zLCB0aGlzLnBhcnNlZFBvcyArIGxpbmUubGVuZ3RoLCAoY2h1bmtzLmxlbmd0aCArIDEpICogNCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IGVuZDtcbiAgICAgICAgdGhpcy5tb3ZlUmFuZ2VJbmRleCgpO1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRQb3MgPCB0aGlzLnRvKVxuICAgICAgICAgICAgdGhpcy5wYXJzZWRQb3MrKztcbiAgICB9XG4gICAgZmluaXNoQ2h1bmsoKSB7XG4gICAgICAgIGxldCB0cmVlID0gVHJlZS5idWlsZCh7XG4gICAgICAgICAgICBidWZmZXI6IHRoaXMuY2h1bmssXG4gICAgICAgICAgICBzdGFydDogdGhpcy5jaHVua1N0YXJ0LFxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLnBhcnNlZFBvcyAtIHRoaXMuY2h1bmtTdGFydCxcbiAgICAgICAgICAgIG5vZGVTZXQsXG4gICAgICAgICAgICB0b3BJRDogMCxcbiAgICAgICAgICAgIG1heEJ1ZmZlckxlbmd0aDogMjA0OCAvKiBDLkNodW5rU2l6ZSAqLyxcbiAgICAgICAgICAgIHJldXNlZDogdGhpcy5jaHVua1JldXNlZFxuICAgICAgICB9KTtcbiAgICAgICAgdHJlZSA9IG5ldyBUcmVlKHRyZWUudHlwZSwgdHJlZS5jaGlsZHJlbiwgdHJlZS5wb3NpdGlvbnMsIHRyZWUubGVuZ3RoLCBbW3RoaXMubGFuZy5zdGF0ZUFmdGVyLCB0aGlzLmxhbmcuc3RyZWFtUGFyc2VyLmNvcHlTdGF0ZSh0aGlzLnN0YXRlKV1dKTtcbiAgICAgICAgdGhpcy5jaHVua3MucHVzaCh0cmVlKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKHRoaXMuY2h1bmtTdGFydCAtIHRoaXMucmFuZ2VzWzBdLmZyb20pO1xuICAgICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtSZXVzZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IHRoaXMucGFyc2VkUG9zO1xuICAgIH1cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0aGlzLmxhbmcudG9wTm9kZSwgdGhpcy5jaHVua3MsIHRoaXMuY2h1bmtQb3MsIHRoaXMucGFyc2VkUG9zIC0gdGhpcy5yYW5nZXNbMF0uZnJvbSkuYmFsYW5jZSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlYWRUb2tlbih0b2tlbiwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0b2tlbihzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgaWYgKHN0cmVhbS5wb3MgPiBzdHJlYW0uc3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJlYW0gcGFyc2VyIGZhaWxlZCB0byBhZHZhbmNlIHN0cmVhbS5cIik7XG59XG5jb25zdCB0b2tlblRhYmxlID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCB0eXBlQXJyYXkgPSBbTm9kZVR5cGUubm9uZV07XG5jb25zdCBub2RlU2V0ID0gLypAX19QVVJFX18qL25ldyBOb2RlU2V0KHR5cGVBcnJheSk7XG4vLyBDYWNoZSBvZiBub2RlIHR5cGVzIGJ5IG5hbWUgYW5kIHRhZ3NcbmNvbnN0IGJ5VGFnID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5mdW5jdGlvbiB0b2tlbklEKHRhZywgbGluZU1vZGUpIHtcbiAgICByZXR1cm4gIXRhZyA/IDAgOiB0b2tlblRhYmxlW3RhZ10gfHwgKHRva2VuVGFibGVbdGFnXSA9IGNyZWF0ZVRva2VuVHlwZSh0YWcsIGxpbmVNb2RlKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUb2tlblR5cGUodGFnU3RyLCBsaW5lTW9kZSkge1xuICAgIGxldCBuYW1lID0gdGFnU3RyLnJlcGxhY2UoLyAvZywgXCJfXCIpLCBrZXkgPSBuYW1lO1xuICAgIGxldCBrbm93biA9IGJ5VGFnW2tleV07XG4gICAgaWYgKGtub3duKVxuICAgICAgICByZXR1cm4ga25vd24uaWQ7XG4gICAgbGV0IHR5cGUgPSBieVRhZ1trZXldID0gTm9kZVR5cGUuZGVmaW5lKHtcbiAgICAgICAgaWQ6IHR5cGVBcnJheS5sZW5ndGgsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByb3BzOiBbbGluZU1vZGUgPyBsaW5lQ2xhc3NOb2RlUHJvcC5hZGQoeyBbbmFtZV06IHRhZ1N0ciB9KSA6IHRva2VuQ2xhc3NOb2RlUHJvcC5hZGQoeyBbbmFtZV06IHRhZ1N0ciB9KV1cbiAgICB9KTtcbiAgICB0eXBlQXJyYXkucHVzaCh0eXBlKTtcbiAgICByZXR1cm4gdHlwZS5pZDtcbn1cbmZ1bmN0aW9uIGRvY0lEKGRhdGEsIGxhbmcpIHtcbiAgICBsZXQgdHlwZSA9IE5vZGVUeXBlLmRlZmluZSh7IGlkOiB0eXBlQXJyYXkubGVuZ3RoLCBuYW1lOiBcIkRvY3VtZW50XCIsIHByb3BzOiBbXG4gICAgICAgICAgICBsYW5ndWFnZURhdGFQcm9wLmFkZCgoKSA9PiBkYXRhKSxcbiAgICAgICAgICAgIGluZGVudE5vZGVQcm9wLmFkZCgoKSA9PiBjeCA9PiBsYW5nLmdldEluZGVudChjeCkpXG4gICAgICAgIF0sIHRvcDogdHJ1ZSB9KTtcbiAgICB0eXBlQXJyYXkucHVzaCh0eXBlKTtcbiAgICByZXR1cm4gdHlwZTtcbn1cbi8vIFRoZSBOb2RlUHJvcCB0aGF0IGhvbGRzIHRoZSBjc3MgY2xhc3Mgd2Ugd2FudCB0byBhcHBseVxuY29uc3QgdG9rZW5DbGFzc05vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuY29uc3QgbGluZUNsYXNzTm9kZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG5jbGFzcyBMaW5lSGlnaGxpZ2h0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy5saW5lQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLnRva2VuQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLnRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5idWlsZERlY28odmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA8IHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvIHx8IHVwZGF0ZS52aWV3LmNvbXBvc2l0aW9uU3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdGlvbnMubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmVlICE9IHRoaXMudHJlZSB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsZERlY28odmlldykge1xuICAgICAgICBpZiAoIXRoaXMudHJlZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICBsZXQgc3BlbGxjaGVja0lnbm9yZVRva2VucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzdHIgb2Ygdmlldy5zdGF0ZS5mYWNldChpZ25vcmVTcGVsbGNoZWNrVG9rZW4pKSB7XG4gICAgICAgICAgICBzcGVsbGNoZWNrSWdub3JlVG9rZW5zLnB1c2goLi4uc3RyLnNwbGl0KCcgJykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzcGVsbENoZWNrSWdub3JlU2V0ID0gbmV3IFNldChzcGVsbGNoZWNrSWdub3JlVG9rZW5zKTtcbiAgICAgICAgbGV0IGhhc1NwZWxsY2hlY2tJZ25vcmVUb2tlbnMgPSBzcGVsbENoZWNrSWdub3JlU2V0LnNpemUgPiAwO1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgbGV0IGxhc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUuaXRlcmF0ZSh7XG4gICAgICAgICAgICAgICAgZnJvbSwgdG8sXG4gICAgICAgICAgICAgICAgZW50ZXI6ICh7IHR5cGUsIGZyb20sIHRvIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVTdHlsZSA9IHR5cGUucHJvcChsaW5lQ2xhc3NOb2RlUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lU3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lRGVjbyA9IHRoaXMubGluZUNhY2hlW2xpbmVTdHlsZV0gfHwgKHRoaXMubGluZUNhY2hlW2xpbmVTdHlsZV0gPSBEZWNvcmF0aW9uLmxpbmUoeyBhdHRyaWJ1dGVzOiB7IGNsYXNzOiBsaW5lU3R5bGUgfSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RnJvbSA9IHZpZXcubGluZUJsb2NrQXQoZnJvbSkuZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBsaW5lIG1vZGVzIHRoYXQgc3RhcnQgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSBsaW5lIHRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UG9zID4gbmV3RnJvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKG5ld0Zyb20sIG5ld0Zyb20sIGxpbmVEZWNvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBuZXdGcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b2tlblN0eWxlID0gdHlwZS5wcm9wKHRva2VuQ2xhc3NOb2RlUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBvcyA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZURlY28gPSB0aGlzLnRva2VuQ2FjaGVbdG9rZW5TdHlsZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVEZWNvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRva2VucyA9IHRva2VuU3R5bGUuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BlYyA9IHsgY2xhc3M6IHRva2Vucy5tYXAoYyA9PiAnY20tJyArIGMpLmpvaW4oJyAnKSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNTcGVsbGNoZWNrSWdub3JlVG9rZW5zICYmIHRva2Vucy5zb21lKHRva2VuID0+IHNwZWxsQ2hlY2tJZ25vcmVTZXQuaGFzKHRva2VuKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5hdHRyaWJ1dGVzID0geyBzcGVsbGNoZWNrOiAnZmFsc2UnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVEZWNvID0gdGhpcy50b2tlbkNhY2hlW3Rva2VuU3R5bGVdID0gRGVjb3JhdGlvbi5tYXJrKHNwZWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoZnJvbSwgdG8sIGxpbmVEZWNvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQb3MgPSB0bztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmZpbmlzaCgpO1xuICAgIH1cbn1cbi8vIFRoaXMgZXh0ZW5zaW9uIGluc3RhbGxzIGEgaGlnaGxpZ2h0ZXIgdGhhdCBoaWdobGlnaHRzIGxpbmVzIGJhc2VkIG9uIHRoZSBub2RlIHByb3AgYWJvdmVcbmNvbnN0IGxpbmVIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9QcmVjLmxvd2VzdCgvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5kZWZpbmUodmlldyA9PiBuZXcgTGluZUhpZ2hsaWdodGVyKHZpZXcpLCB7XG4gICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xufSkpO1xuY29uc3QgaWdub3JlU3BlbGxjaGVja1Rva2VuID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7fSk7XG5cbmZ1bmN0aW9uIGJ1aWxkRm9yTGluZShsaW5lKSB7XG4gICAgcmV0dXJuIGxpbmUubGVuZ3RoIDw9IDQwOTYgJiYgL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNcXHVmYjUwLVxcdWZkZmZdLy50ZXN0KGxpbmUpO1xufVxuZnVuY3Rpb24gdGV4dEhhc1JUTCh0ZXh0KSB7XG4gICAgZm9yIChsZXQgaSA9IHRleHQuaXRlcigpOyAhaS5uZXh0KCkuZG9uZTspXG4gICAgICAgIGlmIChidWlsZEZvckxpbmUoaS52YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGFuZ2VBZGRzUlRMKGNoYW5nZSkge1xuICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgIGNoYW5nZS5pdGVyQ2hhbmdlcygoZkEsIHRBLCBmQiwgdEIsIGlucykgPT4ge1xuICAgICAgICBpZiAoIWFkZGVkICYmIHRleHRIYXNSVEwoaW5zKSlcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWRkZWQ7XG59XG5jb25zdCBhbHdheXNJc29sYXRlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpIH0pO1xuLyoqXG5NYWtlIHN1cmUgbm9kZXNcblttYXJrZWRdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1vbi5Ob2RlUHJvcF5pc29sYXRlKVxuYXMgaXNvbGF0aW5nIGZvciBiaWRpcmVjdGlvbmFsIHRleHQgYXJlIHJlbmRlcmVkIGluIGEgd2F5IHRoYXRcbmlzb2xhdGVzIHRoZW0gZnJvbSB0aGUgc3Vycm91bmRpbmcgdGV4dC5cbiovXG5mdW5jdGlvbiBiaWRpSXNvbGF0ZXMob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGV4dGVuc2lvbnMgPSBbaXNvbGF0ZU1hcmtzXTtcbiAgICBpZiAob3B0aW9ucy5hbHdheXNJc29sYXRlKVxuICAgICAgICBleHRlbnNpb25zLnB1c2goYWx3YXlzSXNvbGF0ZS5vZih0cnVlKSk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbnM7XG59XG5jb25zdCBpc29sYXRlTWFya3MgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy5hbHdheXMgPSB2aWV3LnN0YXRlLmZhY2V0KGFsd2F5c0lzb2xhdGUpIHx8XG4gICAgICAgICAgICB2aWV3LnRleHREaXJlY3Rpb24gIT0gRGlyZWN0aW9uLkxUUiB8fFxuICAgICAgICAgICAgdmlldy5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgdGhpcy5oYXNSVEwgPSAhdGhpcy5hbHdheXMgJiYgdGV4dEhhc1JUTCh2aWV3LnN0YXRlLmRvYyk7XG4gICAgICAgIHRoaXMudHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG4gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmFsd2F5cyB8fCB0aGlzLmhhc1JUTCA/IGJ1aWxkRGVjbyh2aWV3LCB0aGlzLnRyZWUsIHRoaXMuYWx3YXlzKSA6IERlY29yYXRpb24ubm9uZTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgYWx3YXlzID0gdXBkYXRlLnN0YXRlLmZhY2V0KGFsd2F5c0lzb2xhdGUpIHx8XG4gICAgICAgICAgICB1cGRhdGUudmlldy50ZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgfHxcbiAgICAgICAgICAgIHVwZGF0ZS5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKCFhbHdheXMgJiYgIXRoaXMuaGFzUlRMICYmIGNoYW5nZUFkZHNSVEwodXBkYXRlLmNoYW5nZXMpKVxuICAgICAgICAgICAgdGhpcy5oYXNSVEwgPSB0cnVlO1xuICAgICAgICBpZiAoIWFsd2F5cyAmJiAhdGhpcy5oYXNSVEwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAoYWx3YXlzICE9IHRoaXMuYWx3YXlzIHx8IHRyZWUgIT0gdGhpcy50cmVlIHx8IHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmFsd2F5cyA9IGFsd2F5cztcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBidWlsZERlY28odXBkYXRlLnZpZXcsIHRyZWUsIGFsd2F5cyk7XG4gICAgICAgIH1cbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IHtcbiAgICAgICAgZnVuY3Rpb24gYWNjZXNzKHZpZXcpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdmlldy5wbHVnaW4ocGx1Z2luKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29yYXRpb25zKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtFZGl0b3JWaWV3Lm91dGVyRGVjb3JhdGlvbnMub2YoYWNjZXNzKSxcbiAgICAgICAgICAgIFByZWMubG93ZXN0KEVkaXRvclZpZXcuYmlkaUlzb2xhdGVkUmFuZ2VzLm9mKGFjY2VzcykpXTtcbiAgICB9XG59KTtcbmZ1bmN0aW9uIGJ1aWxkRGVjbyh2aWV3LCB0cmVlLCBhbHdheXMpIHtcbiAgICBsZXQgZGVjbyA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICBsZXQgcmFuZ2VzID0gdmlldy52aXNpYmxlUmFuZ2VzO1xuICAgIGlmICghYWx3YXlzKVxuICAgICAgICByYW5nZXMgPSBjbGlwUlRMTGluZXMocmFuZ2VzLCB2aWV3LnN0YXRlLmRvYyk7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHJhbmdlcykge1xuICAgICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICAgICAgZW50ZXI6IG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc28gPSBub2RlLnR5cGUucHJvcChOb2RlUHJvcC5pc29sYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNvKVxuICAgICAgICAgICAgICAgICAgICBkZWNvLmFkZChub2RlLmZyb20sIG5vZGUudG8sIG1hcmtzW2lzb10pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZyb20sIHRvXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVjby5maW5pc2goKTtcbn1cbmZ1bmN0aW9uIGNsaXBSVExMaW5lcyhyYW5nZXMsIGRvYykge1xuICAgIGxldCBjdXIgPSBkb2MuaXRlcigpLCBwb3MgPSAwLCByZXN1bHQgPSBbXSwgbGFzdCA9IG51bGw7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHJhbmdlcykge1xuICAgICAgICBpZiAobGFzdCAmJiBsYXN0LnRvID4gZnJvbSkge1xuICAgICAgICAgICAgZnJvbSA9IGxhc3QudG87XG4gICAgICAgICAgICBpZiAoZnJvbSA+PSB0bylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zICsgY3VyLnZhbHVlLmxlbmd0aCA8IGZyb20pIHtcbiAgICAgICAgICAgIGN1ci5uZXh0KGZyb20gLSAocG9zICsgY3VyLnZhbHVlLmxlbmd0aCkpO1xuICAgICAgICAgICAgcG9zID0gZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBwb3MsIGVuZCA9IHBvcyArIGN1ci52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIWN1ci5saW5lQnJlYWsgJiYgYnVpbGRGb3JMaW5lKGN1ci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBsYXN0LnRvID4gc3RhcnQgLSAxMClcbiAgICAgICAgICAgICAgICAgICAgbGFzdC50byA9IE1hdGgubWluKHRvLCBlbmQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGFzdCA9IHsgZnJvbTogc3RhcnQsIHRvOiBNYXRoLm1pbih0bywgZW5kKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmQgPj0gdG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgICBjdXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBtYXJrcyA9IHtcbiAgICBydGw6IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJydGxcIiB9LCBiaWRpSXNvbGF0ZTogRGlyZWN0aW9uLlJUTCB9KSxcbiAgICBsdHI6IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJsdHJcIiB9LCBiaWRpSXNvbGF0ZTogRGlyZWN0aW9uLkxUUiB9KSxcbiAgICBhdXRvOiAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taXNvXCIsIGluY2x1c2l2ZTogdHJ1ZSwgYXR0cmlidXRlczogeyBkaXI6IFwiYXV0b1wiIH0sIGJpZGlJc29sYXRlOiBudWxsIH0pXG59O1xuXG5leHBvcnQgeyBEb2NJbnB1dCwgSGlnaGxpZ2h0U3R5bGUsIEluZGVudENvbnRleHQsIExSTGFuZ3VhZ2UsIExhbmd1YWdlLCBMYW5ndWFnZURlc2NyaXB0aW9uLCBMYW5ndWFnZVN1cHBvcnQsIFBhcnNlQ29udGV4dCwgU3RyZWFtTGFuZ3VhZ2UsIFN0cmluZ1N0cmVhbSwgVHJlZUluZGVudENvbnRleHQsIGJpZGlJc29sYXRlcywgYnJhY2tldE1hdGNoaW5nLCBicmFja2V0TWF0Y2hpbmdIYW5kbGUsIGNvZGVGb2xkaW5nLCBjb250aW51ZWRJbmRlbnQsIGRlZmF1bHRIaWdobGlnaHRTdHlsZSwgZGVmaW5lTGFuZ3VhZ2VGYWNldCwgZGVsaW1pdGVkSW5kZW50LCBlbnN1cmVTeW50YXhUcmVlLCBmbGF0SW5kZW50LCBmb2xkQWxsLCBmb2xkQ29kZSwgZm9sZEVmZmVjdCwgZm9sZEd1dHRlciwgZm9sZEluc2lkZSwgZm9sZEtleW1hcCwgZm9sZE5vZGVQcm9wLCBmb2xkU2VydmljZSwgZm9sZFN0YXRlLCBmb2xkYWJsZSwgZm9sZGVkUmFuZ2VzLCBmb3JjZVBhcnNpbmcsIGdldEluZGVudFVuaXQsIGdldEluZGVudGF0aW9uLCBoaWdobGlnaHRpbmdGb3IsIGlnbm9yZVNwZWxsY2hlY2tUb2tlbiwgaW5kZW50Tm9kZVByb3AsIGluZGVudE9uSW5wdXQsIGluZGVudFJhbmdlLCBpbmRlbnRTZXJ2aWNlLCBpbmRlbnRTdHJpbmcsIGluZGVudFVuaXQsIGxhbmd1YWdlLCBsYW5ndWFnZURhdGFQcm9wLCBsaW5lQ2xhc3NOb2RlUHJvcCwgbGluZUhpZ2hsaWdodGVyLCBtYXRjaEJyYWNrZXRzLCBzdWJsYW5ndWFnZVByb3AsIHN5bnRheEhpZ2hsaWdodGluZywgc3ludGF4UGFyc2VyUnVubmluZywgc3ludGF4VHJlZSwgc3ludGF4VHJlZUF2YWlsYWJsZSwgdG9nZ2xlRm9sZCwgdG9rZW5DbGFzc05vZGVQcm9wLCB1bmZvbGRBbGwsIHVuZm9sZENvZGUsIHVuZm9sZEVmZmVjdCB9O1xuIiwgImltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyB0eXBlIFBsdWdpblNldHRpbmdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgQ09NTUVOVEFUT1JfR0xPQkFMIHtcblx0LyoqXG5cdCAqIFRyYWRpbmcgb25lIGdsb2JhbCBmb3IgYW4gYWRtaXR0ZWRseSB3b3JzZSBnbG9iYWxcblx0ICogUGFzc2luZyB0aGUgQXBwIGluc3RhbmNlIHRvIENNIHBsdWdpbnMgaXMganVzdCBhIG1ham9yIFBpdEFcblx0ICovXG5cdGV4cG9ydCBsZXQgYXBwOiBBcHA7XG5cdGV4cG9ydCBsZXQgUExVR0lOX1NFVFRJTkdTOiBQbHVnaW5TZXR0aW5ncztcbn1cbiIsICJpbXBvcnQgeyBDb21wYXJ0bWVudCwgRmFjZXQsIFN0YXRlRWZmZWN0LCBTdGF0ZUVmZmVjdFR5cGUsIFN0YXRlRmllbGQgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7IEVkaXRNb2RlLCBQcmV2aWV3TW9kZSB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG4vKipcbiAqIFByb3ZpZGUgYSBTdGF0ZUZpZWxkIGV4dGVuc2lvbiBmb3IgYW4gYXJiaXRyYXJ5IHZhbHVlIHRoYXQgY2FuIGJlIHVwZGF0ZWQgdmlhIGVmZmVjdHNcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBmaWVsZFxuICogQHBhcmFtIGVmZmVjdCAtIEVmZmVjdCB0byB1cGRhdGUgdGhlIHZhbHVlIG9uXG4gKiBAcmVtYXJrIFVzaW5nIGltcGxlbWVudGF0aW9uIGZyb20gT2JzaWRpYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFZhbHVlPFQ+KHZhbHVlOiBULCBlZmZlY3Q6IFN0YXRlRWZmZWN0VHlwZTxUPikge1xuXHRjb25zdCBmaWVsZDogU3RhdGVGaWVsZDxUPiA9IFN0YXRlRmllbGQuZGVmaW5lKHtcblx0XHRjcmVhdGUoKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZShlLCBuKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGN1cnJfZWZmZWN0IG9mIG4uZWZmZWN0cykge1xuXHRcdFx0XHRpZiAoY3Vycl9lZmZlY3QuaXMoZWZmZWN0KSlcblx0XHRcdFx0XHRyZXR1cm4gY3Vycl9lZmZlY3QudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0fSk7XG5cblx0cmV0dXJuIGZpZWxkO1xufVxuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSA9IEZhY2V0LmRlZmluZTxudW1iZXIsIG51bWJlcj4oeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzWzBdIH0pO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJJbmNsdWRlZFR5cGVzID0gbmV3IENvbXBhcnRtZW50KCk7XG5cbmV4cG9ydCBjb25zdCBoaWRlRW1wdHlEaWZmR3V0dGVyU3RhdGUgPSBGYWNldC5kZWZpbmU8Ym9vbGVhbiwgYm9vbGVhbj4oeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzWzBdIH0pO1xuZXhwb3J0IGNvbnN0IGhpZGVFbXB0eURpZmZHdXR0ZXIgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IHByZXZpZXdNb2RlU3RhdGUgPSBGYWNldC5kZWZpbmU8UHJldmlld01vZGUsIFByZXZpZXdNb2RlPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgcHJldmlld01vZGUgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IGVkaXRNb2RlVmFsdWVTdGF0ZSA9IEZhY2V0LmRlZmluZTxFZGl0TW9kZSwgRWRpdE1vZGU+KHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlc1swXSB9KTtcbmV4cG9ydCBjb25zdCBlZGl0TW9kZVZhbHVlID0gbmV3IENvbXBhcnRtZW50KCk7XG5leHBvcnQgY29uc3QgZWRpdE1vZGUgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IGZ1bGxSZWxvYWRFZmZlY3QgPSBTdGF0ZUVmZmVjdC5kZWZpbmU8Ym9vbGVhbj4oKTtcbiIsICIvKipcblRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIG9mIGEgYFRyZWVCdWZmZXJgIG5vZGUuXG4qL1xuY29uc3QgRGVmYXVsdEJ1ZmZlckxlbmd0aCA9IDEwMjQ7XG5sZXQgbmV4dFByb3BJRCA9IDA7XG5jbGFzcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8pIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgIH1cbn1cbi8qKlxuRWFjaCBbbm9kZSB0eXBlXSgjY29tbW9uLk5vZGVUeXBlKSBvciBbaW5kaXZpZHVhbCB0cmVlXSgjY29tbW9uLlRyZWUpXG5jYW4gaGF2ZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgaW4gcHJvcHMuIEluc3RhbmNlcyBvZiB0aGlzXG5jbGFzcyByZXByZXNlbnQgcHJvcCBuYW1lcy5cbiovXG5jbGFzcyBOb2RlUHJvcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IG5vZGUgcHJvcCB0eXBlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgdGhpcy5pZCA9IG5leHRQcm9wSUQrKztcbiAgICAgICAgdGhpcy5wZXJOb2RlID0gISFjb25maWcucGVyTm9kZTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZSA9IGNvbmZpZy5kZXNlcmlhbGl6ZSB8fCAoKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBub2RlIHR5cGUgZG9lc24ndCBkZWZpbmUgYSBkZXNlcmlhbGl6ZSBmdW5jdGlvblwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoXG4gICAgW2BOb2RlU2V0LmV4dGVuZGBdKCNjb21tb24uTm9kZVNldC5leHRlbmQpIG9yXG4gICAgW2BMUlBhcnNlci5jb25maWd1cmVgXSgjbHIuUGFyc2VyQ29uZmlnLnByb3BzKSB0byBjb21wdXRlXG4gICAgcHJvcCB2YWx1ZXMgZm9yIGVhY2ggbm9kZSB0eXBlIGluIHRoZSBzZXQuIFRha2VzIGEgW21hdGNoXG4gICAgb2JqZWN0XSgjY29tbW9uLk5vZGVUeXBlXm1hdGNoKSBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdW5kZWZpbmVkXG4gICAgaWYgdGhlIG5vZGUgdHlwZSBkb2Vzbid0IGdldCB0aGlzIHByb3AsIGFuZCB0aGUgcHJvcCdzIHZhbHVlIGlmXG4gICAgaXQgZG9lcy5cbiAgICAqL1xuICAgIGFkZChtYXRjaCkge1xuICAgICAgICBpZiAodGhpcy5wZXJOb2RlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBhZGQgcGVyLW5vZGUgcHJvcHMgdG8gbm9kZSB0eXBlc1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaCAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBtYXRjaCA9IE5vZGVUeXBlLm1hdGNoKG1hdGNoKTtcbiAgICAgICAgcmV0dXJuICh0eXBlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbWF0Y2godHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBudWxsIDogW3RoaXMsIHJlc3VsdF07XG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG5Qcm9wIHRoYXQgaXMgdXNlZCB0byBkZXNjcmliZSBtYXRjaGluZyBkZWxpbWl0ZXJzLiBGb3Igb3BlbmluZ1xuZGVsaW1pdGVycywgdGhpcyBob2xkcyBhbiBhcnJheSBvZiBub2RlIG5hbWVzICh3cml0dGVuIGFzIGFcbnNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgd2hlbiBkZWNsYXJpbmcgdGhpcyBwcm9wIGluIGEgZ3JhbW1hcilcbmZvciB0aGUgbm9kZSB0eXBlcyBvZiBjbG9zaW5nIGRlbGltaXRlcnMgdGhhdCBtYXRjaCBpdC5cbiovXG5Ob2RlUHJvcC5jbG9zZWRCeSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuVGhlIGludmVyc2Ugb2YgW2BjbG9zZWRCeWBdKCNjb21tb24uTm9kZVByb3BeY2xvc2VkQnkpLiBUaGlzIGlzXG5hdHRhY2hlZCB0byBjbG9zaW5nIGRlbGltaXRlcnMsIGhvbGRpbmcgYW4gYXJyYXkgb2Ygbm9kZSBuYW1lc1xub2YgdHlwZXMgb2YgbWF0Y2hpbmcgb3BlbmluZyBkZWxpbWl0ZXJzLlxuKi9cbk5vZGVQcm9wLm9wZW5lZEJ5ID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHN0ciA9PiBzdHIuc3BsaXQoXCIgXCIpIH0pO1xuLyoqXG5Vc2VkIHRvIGFzc2lnbiBub2RlIHR5cGVzIHRvIGdyb3VwcyAoZm9yIGV4YW1wbGUsIGFsbCBub2RlXG50eXBlcyB0aGF0IHJlcHJlc2VudCBhbiBleHByZXNzaW9uIGNvdWxkIGJlIHRhZ2dlZCB3aXRoIGFuXG5gXCJFeHByZXNzaW9uXCJgIGdyb3VwKS5cbiovXG5Ob2RlUHJvcC5ncm91cCA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuQXR0YWNoZWQgdG8gbm9kZXMgdG8gaW5kaWNhdGUgdGhlc2Ugc2hvdWxkIGJlXG5bZGlzcGxheWVkXShodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhUcmVlKVxuaW4gYSBiaWRpcmVjdGlvbmFsIHRleHQgaXNvbGF0ZSwgc28gdGhhdCBkaXJlY3Rpb24tbmV1dHJhbFxuY2hhcmFjdGVycyBvbiB0aGVpciBzaWRlcyBkb24ndCBpbmNvcnJlY3RseSBnZXQgYXNzb2NpYXRlZCB3aXRoXG5zdXJyb3VuZGluZyB0ZXh0LiBZb3UnbGwgZ2VuZXJhbGx5IHdhbnQgdG8gc2V0IHRoaXMgZm9yIG5vZGVzXG50aGF0IGNvbnRhaW4gYXJiaXRyYXJ5IHRleHQsIGxpa2Ugc3RyaW5ncyBhbmQgY29tbWVudHMsIGFuZCBmb3Jcbm5vZGVzIHRoYXQgYXBwZWFyIF9pbnNpZGVfIGFyYml0cmFyeSB0ZXh0LCBsaWtlIEhUTUwgdGFncy4gV2hlblxubm90IGdpdmVuIGEgdmFsdWUsIGluIGEgZ3JhbW1hciBkZWNsYXJhdGlvbiwgZGVmYXVsdHMgdG9cbmBcImF1dG9cImAuXG4qL1xuTm9kZVByb3AuaXNvbGF0ZSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSBcInJ0bFwiICYmIHZhbHVlICE9IFwibHRyXCIgJiYgdmFsdWUgIT0gXCJhdXRvXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIGlzb2xhdGU6IFwiICsgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWUgfHwgXCJhdXRvXCI7XG4gICAgfSB9KTtcbi8qKlxuVGhlIGhhc2ggb2YgdGhlIFtjb250ZXh0XSgjbHIuQ29udGV4dFRyYWNrZXIuY29uc3RydWN0b3IpXG50aGF0IHRoZSBub2RlIHdhcyBwYXJzZWQgaW4sIGlmIGFueS4gVXNlZCB0byBsaW1pdCByZXVzZSBvZlxuY29udGV4dHVhbCBub2Rlcy5cbiovXG5Ob2RlUHJvcC5jb250ZXh0SGFzaCA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4vKipcblRoZSBkaXN0YW5jZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbm9kZSB0aGF0IHRoZSB0b2tlbml6ZXJcbmxvb2tlZCBhaGVhZCBmb3IgYW55IG9mIHRoZSB0b2tlbnMgaW5zaWRlIHRoZSBub2RlLiAoVGhlIExSXG5wYXJzZXIgb25seSBzdG9yZXMgdGhpcyB3aGVuIGl0IGlzIGxhcmdlciB0aGFuIDI1LCBmb3JcbmVmZmljaWVuY3kgcmVhc29ucy4pXG4qL1xuTm9kZVByb3AubG9va0FoZWFkID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbi8qKlxuVGhpcyBwZXItbm9kZSBwcm9wIGlzIHVzZWQgdG8gcmVwbGFjZSBhIGdpdmVuIG5vZGUsIG9yIHBhcnQgb2YgYVxubm9kZSwgd2l0aCBhbm90aGVyIHRyZWUuIFRoaXMgaXMgdXNlZnVsIHRvIGluY2x1ZGUgdHJlZXMgZnJvbVxuZGlmZmVyZW50IGxhbmd1YWdlcyBpbiBtaXhlZC1sYW5ndWFnZSBwYXJzZXJzLlxuKi9cbk5vZGVQcm9wLm1vdW50ZWQgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuLyoqXG5BIG1vdW50ZWQgdHJlZSwgd2hpY2ggY2FuIGJlIFtzdG9yZWRdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgb25cbmEgdHJlZSBub2RlIHRvIGluZGljYXRlIHRoYXQgcGFydHMgb2YgaXRzIGNvbnRlbnQgYXJlXG5yZXByZXNlbnRlZCBieSBhbm90aGVyIHRyZWUuXG4qL1xuY2xhc3MgTW91bnRlZFRyZWUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBpbm5lciB0cmVlLlxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBudWxsLCB0aGlzIHRyZWUgcmVwbGFjZXMgdGhlIGVudGlyZSBub2RlIChpdCB3aWxsXG4gICAgYmUgaW5jbHVkZWQgaW4gdGhlIHJlZ3VsYXIgaXRlcmF0aW9uIGluc3RlYWQgb2YgaXRzIGhvc3RcbiAgICBub2RlKS4gSWYgbm90LCBvbmx5IHRoZSBnaXZlbiByYW5nZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmVcbiAgICBjb3ZlcmVkIGJ5IHRoaXMgdHJlZS4gVGhpcyBpcyB1c2VkIGZvciB0cmVlcyB0aGF0IGFyZSBtaXhlZCBpblxuICAgIGEgd2F5IHRoYXQgaXNuJ3Qgc3RyaWN0bHkgaGllcmFyY2hpY2FsLiBTdWNoIG1vdW50ZWQgdHJlZXMgYXJlXG4gICAgb25seSBlbnRlcmVkIGJ5IFtgcmVzb2x2ZUlubmVyYF0oI2NvbW1vbi5UcmVlLnJlc29sdmVJbm5lcilcbiAgICBhbmQgW2BlbnRlcmBdKCNjb21tb24uU3ludGF4Tm9kZS5lbnRlcikuXG4gICAgKi9cbiAgICBvdmVybGF5LCBcbiAgICAvKipcbiAgICBUaGUgcGFyc2VyIHVzZWQgdG8gY3JlYXRlIHRoaXMgc3VidHJlZS5cbiAgICAqL1xuICAgIHBhcnNlcikge1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0KHRyZWUpIHtcbiAgICAgICAgcmV0dXJuIHRyZWUgJiYgdHJlZS5wcm9wcyAmJiB0cmVlLnByb3BzW05vZGVQcm9wLm1vdW50ZWQuaWRdO1xuICAgIH1cbn1cbmNvbnN0IG5vUHJvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG5FYWNoIG5vZGUgaW4gYSBzeW50YXggdHJlZSBoYXMgYSBub2RlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0LlxuKi9cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIG9mIHRoZSBub2RlIHR5cGUuIE5vdCBuZWNlc3NhcmlseSB1bmlxdWUsIGJ1dCBpZiB0aGVcbiAgICBncmFtbWFyIHdhcyB3cml0dGVuIHByb3Blcmx5LCBkaWZmZXJlbnQgbm9kZSB0eXBlcyB3aXRoIHRoZVxuICAgIHNhbWUgbmFtZSB3aXRoaW4gYSBub2RlIHNldCBzaG91bGQgcGxheSB0aGUgc2FtZSBzZW1hbnRpY1xuICAgIHJvbGUuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHByb3BzLCBcbiAgICAvKipcbiAgICBUaGUgaWQgb2YgdGhpcyBub2RlIGluIGl0cyBzZXQuIENvcnJlc3BvbmRzIHRvIHRoZSB0ZXJtIGlkc1xuICAgIHVzZWQgaW4gdGhlIHBhcnNlci5cbiAgICAqL1xuICAgIGlkLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZsYWdzID0gMCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBub2RlIHR5cGUuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWMpIHtcbiAgICAgICAgbGV0IHByb3BzID0gc3BlYy5wcm9wcyAmJiBzcGVjLnByb3BzLmxlbmd0aCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBub1Byb3BzO1xuICAgICAgICBsZXQgZmxhZ3MgPSAoc3BlYy50b3AgPyAxIC8qIE5vZGVGbGFnLlRvcCAqLyA6IDApIHwgKHNwZWMuc2tpcHBlZCA/IDIgLyogTm9kZUZsYWcuU2tpcHBlZCAqLyA6IDApIHxcbiAgICAgICAgICAgIChzcGVjLmVycm9yID8gNCAvKiBOb2RlRmxhZy5FcnJvciAqLyA6IDApIHwgKHNwZWMubmFtZSA9PSBudWxsID8gOCAvKiBOb2RlRmxhZy5Bbm9ueW1vdXMgKi8gOiAwKTtcbiAgICAgICAgbGV0IHR5cGUgPSBuZXcgTm9kZVR5cGUoc3BlYy5uYW1lIHx8IFwiXCIsIHByb3BzLCBzcGVjLmlkLCBmbGFncyk7XG4gICAgICAgIGlmIChzcGVjLnByb3BzKVxuICAgICAgICAgICAgZm9yIChsZXQgc3JjIG9mIHNwZWMucHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3JjKSlcbiAgICAgICAgICAgICAgICAgICAgc3JjID0gc3JjKHR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1swXS5wZXJOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBzdG9yZSBhIHBlci1ub2RlIHByb3Agb24gYSBub2RlIHR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzW3NyY1swXS5pZF0gPSBzcmNbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmVzIGEgbm9kZSBwcm9wIGZvciB0aGlzIHR5cGUuIFdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGlmXG4gICAgdGhlIHByb3AgaXNuJ3QgcHJlc2VudCBvbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBwcm9wKHByb3ApIHsgcmV0dXJuIHRoaXMucHJvcHNbcHJvcC5pZF07IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyB0aGUgdG9wIG5vZGUgb2YgYSBncmFtbWFyLlxuICAgICovXG4gICAgZ2V0IGlzVG9wKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAxIC8qIE5vZGVGbGFnLlRvcCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbm9kZSBpcyBwcm9kdWNlZCBieSBhIHNraXAgcnVsZS5cbiAgICAqL1xuICAgIGdldCBpc1NraXBwZWQoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDIgLyogTm9kZUZsYWcuU2tpcHBlZCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBlcnJvciBub2RlLlxuICAgICovXG4gICAgZ2V0IGlzRXJyb3IoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDQgLyogTm9kZUZsYWcuRXJyb3IgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFdoZW4gdHJ1ZSwgdGhpcyBub2RlIHR5cGUgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgdXNlci1kZWNsYXJlZFxuICAgIG5hbWVkIG5vZGUsIGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaXMgdXNlZCB0byBjYWNoZSByZXBldGl0aW9uLlxuICAgICovXG4gICAgZ2V0IGlzQW5vbnltb3VzKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiA4IC8qIE5vZGVGbGFnLkFub255bW91cyAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhpcyBub2RlJ3MgbmFtZSBvciBvbmUgb2YgaXRzXG4gICAgW2dyb3Vwc10oI2NvbW1vbi5Ob2RlUHJvcF5ncm91cCkgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgaXMobmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gbmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBncm91cCA9IHRoaXMucHJvcChOb2RlUHJvcC5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAgPyBncm91cC5pbmRleE9mKG5hbWUpID4gLTEgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pZCA9PSBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmdW5jdGlvbiBmcm9tIG5vZGUgdHlwZXMgdG8gYXJiaXRyYXJ5IHZhbHVlcyBieVxuICAgIHNwZWNpZnlpbmcgYW4gb2JqZWN0IHdob3NlIHByb3BlcnR5IG5hbWVzIGFyZSBub2RlIG9yXG4gICAgW2dyb3VwXSgjY29tbW9uLk5vZGVQcm9wXmdyb3VwKSBuYW1lcy4gT2Z0ZW4gdXNlZnVsIHdpdGhcbiAgICBbYE5vZGVQcm9wLmFkZGBdKCNjb21tb24uTm9kZVByb3AuYWRkKS4gWW91IGNhbiBwdXQgbXVsdGlwbGVcbiAgICBuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywgaW4gYSBzaW5nbGUgcHJvcGVydHkgbmFtZSB0byBtYXBcbiAgICBtdWx0aXBsZSBub2RlIG5hbWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuICAgICovXG4gICAgc3RhdGljIG1hdGNoKG1hcCkge1xuICAgICAgICBsZXQgZGlyZWN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBtYXApXG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIG9mIHByb3Auc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgICAgIGRpcmVjdFtuYW1lXSA9IG1hcFtwcm9wXTtcbiAgICAgICAgcmV0dXJuIChub2RlKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBncm91cHMgPSBub2RlLnByb3AoTm9kZVByb3AuZ3JvdXApLCBpID0gLTE7IGkgPCAoZ3JvdXBzID8gZ3JvdXBzLmxlbmd0aCA6IDApOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBkaXJlY3RbaSA8IDAgPyBub2RlLm5hbWUgOiBncm91cHNbaV1dO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuQW4gZW1wdHkgZHVtbXkgbm9kZSB0eXBlIHRvIHVzZSB3aGVuIG5vIGFjdHVhbCB0eXBlIGlzIGF2YWlsYWJsZS5cbiovXG5Ob2RlVHlwZS5ub25lID0gbmV3IE5vZGVUeXBlKFwiXCIsIE9iamVjdC5jcmVhdGUobnVsbCksIDAsIDggLyogTm9kZUZsYWcuQW5vbnltb3VzICovKTtcbi8qKlxuQSBub2RlIHNldCBob2xkcyBhIGNvbGxlY3Rpb24gb2Ygbm9kZSB0eXBlcy4gSXQgaXMgdXNlZCB0b1xuY29tcGFjdGx5IHJlcHJlc2VudCB0cmVlcyBieSBzdG9yaW5nIHRoZWlyIHR5cGUgaWRzLCByYXRoZXIgdGhhbiBhXG5mdWxsIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2JqZWN0LCBpbiBhIG51bWVyaWMgYXJyYXkuIEVhY2ggcGFyc2VyXG5baGFzXSgjbHIuTFJQYXJzZXIubm9kZVNldCkgYSBub2RlIHNldCwgYW5kIFt0cmVlXG5idWZmZXJzXSgjY29tbW9uLlRyZWVCdWZmZXIpIGNhbiBvbmx5IHN0b3JlIGNvbGxlY3Rpb25zIG9mIG5vZGVzXG5mcm9tIHRoZSBzYW1lIHNldC4gQSBzZXQgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDIqKjE2ICg2NTUzNikgbm9kZVxudHlwZXMgaW4gaXQsIHNvIHRoYXQgdGhlIGlkcyBmaXQgaW50byAxNi1iaXQgdHlwZWQgYXJyYXkgc2xvdHMuXG4qL1xuY2xhc3MgTm9kZVNldCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IHdpdGggdGhlIGdpdmVuIHR5cGVzLiBUaGUgYGlkYCBwcm9wZXJ0eSBvZiBlYWNoXG4gICAgdHlwZSBzaG91bGQgY29ycmVzcG9uZCB0byBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBhcnJheS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHR5cGVzIGluIHRoaXMgc2V0LCBieSBpZC5cbiAgICAqL1xuICAgIHR5cGVzKSB7XG4gICAgICAgIHRoaXMudHlwZXMgPSB0eXBlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pZCAhPSBpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm9kZSB0eXBlIGlkcyBzaG91bGQgY29ycmVzcG9uZCB0byBhcnJheSBwb3NpdGlvbnMgd2hlbiBjcmVhdGluZyBhIG5vZGUgc2V0XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgc2V0IHdpdGggc29tZSBub2RlIHByb3BlcnRpZXMgYWRkZWQuIFRoZVxuICAgIGFyZ3VtZW50cyB0byB0aGlzIG1ldGhvZCBjYW4gYmUgY3JlYXRlZCB3aXRoXG4gICAgW2BOb2RlUHJvcC5hZGRgXSgjY29tbW9uLk5vZGVQcm9wLmFkZCkuXG4gICAgKi9cbiAgICBleHRlbmQoLi4ucHJvcHMpIHtcbiAgICAgICAgbGV0IG5ld1R5cGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHR5cGUgb2YgdGhpcy50eXBlcykge1xuICAgICAgICAgICAgbGV0IG5ld1Byb3BzID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBwcm9wcykge1xuICAgICAgICAgICAgICAgIGxldCBhZGQgPSBzb3VyY2UodHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1Byb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCB0eXBlLnByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHNbYWRkWzBdLmlkXSA9IGFkZFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdUeXBlcy5wdXNoKG5ld1Byb3BzID8gbmV3IE5vZGVUeXBlKHR5cGUubmFtZSwgbmV3UHJvcHMsIHR5cGUuaWQsIHR5cGUuZmxhZ3MpIDogdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2V0KG5ld1R5cGVzKTtcbiAgICB9XG59XG5jb25zdCBDYWNoZWROb2RlID0gbmV3IFdlYWtNYXAoKSwgQ2FjaGVkSW5uZXJOb2RlID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuT3B0aW9ucyB0aGF0IGNvbnRyb2wgaXRlcmF0aW9uLiBDYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgYHxgXG5vcGVyYXRvciB0byBlbmFibGUgbXVsdGlwbGUgb25lcy5cbiovXG52YXIgSXRlck1vZGU7XG4oZnVuY3Rpb24gKEl0ZXJNb2RlKSB7XG4gICAgLyoqXG4gICAgV2hlbiBlbmFibGVkLCBpdGVyYXRpb24gd2lsbCBvbmx5IHZpc2l0IFtgVHJlZWBdKCNjb21tb24uVHJlZSlcbiAgICBvYmplY3RzLCBub3Qgbm9kZXMgcGFja2VkIGludG9cbiAgICBbYFRyZWVCdWZmZXJgXSgjY29tbW9uLlRyZWVCdWZmZXIpcy5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiRXhjbHVkZUJ1ZmZlcnNcIl0gPSAxXSA9IFwiRXhjbHVkZUJ1ZmZlcnNcIjtcbiAgICAvKipcbiAgICBFbmFibGUgdGhpcyB0byBtYWtlIGl0ZXJhdGlvbiBpbmNsdWRlIGFub255bW91cyBub2RlcyAoc3VjaCBhc1xuICAgIHRoZSBub2RlcyB0aGF0IHdyYXAgcmVwZWF0ZWQgZ3JhbW1hciBjb25zdHJ1Y3RzIGludG8gYSBiYWxhbmNlZFxuICAgIHRyZWUpLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJJbmNsdWRlQW5vbnltb3VzXCJdID0gMl0gPSBcIkluY2x1ZGVBbm9ueW1vdXNcIjtcbiAgICAvKipcbiAgICBCeSBkZWZhdWx0LCByZWd1bGFyIFttb3VudGVkXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIG5vZGVzXG4gICAgcmVwbGFjZSB0aGVpciBiYXNlIG5vZGUgaW4gaXRlcmF0aW9uLiBFbmFibGUgdGhpcyB0byBpZ25vcmUgdGhlbVxuICAgIGluc3RlYWQuXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIklnbm9yZU1vdW50c1wiXSA9IDRdID0gXCJJZ25vcmVNb3VudHNcIjtcbiAgICAvKipcbiAgICBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgaW5cbiAgICBbYGVudGVyYF0oI2NvbW1vbi5TeW50YXhOb2RlLmVudGVyKS1zdHlsZSBtZXRob2RzLiBJdCB0ZWxscyB0aGVcbiAgICBsaWJyYXJ5IHRvIG5vdCBlbnRlciBtb3VudGVkIG92ZXJsYXlzIGlmIG9uZSBjb3ZlcnMgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIklnbm9yZU92ZXJsYXlzXCJdID0gOF0gPSBcIklnbm9yZU92ZXJsYXlzXCI7XG59KShJdGVyTW9kZSB8fCAoSXRlck1vZGUgPSB7fSkpO1xuLyoqXG5BIHBpZWNlIG9mIHN5bnRheCB0cmVlLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gYXBwcm9hY2ggdGhlc2VcbnRyZWVzOiB0aGUgd2F5IHRoZXkgYXJlIGFjdHVhbGx5IHN0b3JlZCBpbiBtZW1vcnksIGFuZCB0aGVcbmNvbnZlbmllbnQgd2F5LlxuXG5TeW50YXggdHJlZXMgYXJlIHN0b3JlZCBhcyBhIHRyZWUgb2YgYFRyZWVgIGFuZCBgVHJlZUJ1ZmZlcmBcbm9iamVjdHMuIEJ5IHBhY2tpbmcgZGV0YWlsIGluZm9ybWF0aW9uIGludG8gYFRyZWVCdWZmZXJgIGxlYWZcbm5vZGVzLCB0aGUgcmVwcmVzZW50YXRpb24gaXMgbWFkZSBhIGxvdCBtb3JlIG1lbW9yeS1lZmZpY2llbnQuXG5cbkhvd2V2ZXIsIHdoZW4geW91IHdhbnQgdG8gYWN0dWFsbHkgd29yayB3aXRoIHRyZWUgbm9kZXMsIHRoaXNcbnJlcHJlc2VudGF0aW9uIGlzIHZlcnkgYXdrd2FyZCwgc28gbW9zdCBjbGllbnQgY29kZSB3aWxsIHdhbnQgdG9cbnVzZSB0aGUgW2BUcmVlQ3Vyc29yYF0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBvclxuW2BTeW50YXhOb2RlYF0oI2NvbW1vbi5TeW50YXhOb2RlKSBpbnRlcmZhY2UgaW5zdGVhZCwgd2hpY2ggcHJvdmlkZXNcbmEgdmlldyBvbiBzb21lIHBhcnQgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSwgYW5kIGNhbiBiZSB1c2VkIHRvXG5tb3ZlIGFyb3VuZCB0byBhZGphY2VudCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBuZXcgdHJlZS4gU2VlIGFsc28gW2BUcmVlLmJ1aWxkYF0oI2NvbW1vbi5UcmVlXmJ1aWxkKS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIHRoZSB0b3Agbm9kZS5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoaXMgbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgICovXG4gICAgY2hpbGRyZW4sIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbnMgKG9mZnNldHMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgdHJlZSkgb2ZcbiAgICB0aGUgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBwb3NpdGlvbnMsIFxuICAgIC8qKlxuICAgIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhpcyB0cmVlXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFBlci1ub2RlIFtub2RlIHByb3BzXSgjY29tbW9uLk5vZGVQcm9wKSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBwcm9wcykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3BzID0gbnVsbDtcbiAgICAgICAgaWYgKHByb3BzICYmIHByb3BzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICBmb3IgKGxldCBbcHJvcCwgdmFsdWVdIG9mIHByb3BzKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHNbdHlwZW9mIHByb3AgPT0gXCJudW1iZXJcIiA/IHByb3AgOiBwcm9wLmlkXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBtb3VudGVkID0gTW91bnRlZFRyZWUuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAobW91bnRlZCAmJiAhbW91bnRlZC5vdmVybGF5KVxuICAgICAgICAgICAgcmV0dXJuIG1vdW50ZWQudHJlZS50b1N0cmluZygpO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gY2gudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuICs9IFwiLFwiO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuICs9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRoaXMudHlwZS5uYW1lID8gY2hpbGRyZW4gOlxuICAgICAgICAgICAgKC9cXFcvLnRlc3QodGhpcy50eXBlLm5hbWUpICYmICF0aGlzLnR5cGUuaXNFcnJvciA/IEpTT04uc3RyaW5naWZ5KHRoaXMudHlwZS5uYW1lKSA6IHRoaXMudHlwZS5uYW1lKSArXG4gICAgICAgICAgICAgICAgKGNoaWxkcmVuLmxlbmd0aCA/IFwiKFwiICsgY2hpbGRyZW4gKyBcIilcIiA6IFwiXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbdHJlZSBjdXJzb3JdKCNjb21tb24uVHJlZUN1cnNvcikgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9mXG4gICAgdGhlIHRyZWUuIE1vZGUgY2FuIGJlIHVzZWQgdG8gW2NvbnRyb2xdKCNjb21tb24uSXRlck1vZGUpIHdoaWNoXG4gICAgbm9kZXMgdGhlIGN1cnNvciB2aXNpdHMuXG4gICAgKi9cbiAgICBjdXJzb3IobW9kZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlQ3Vyc29yKHRoaXMudG9wTm9kZSwgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFt0cmVlIGN1cnNvcl0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBwb2ludGluZyBpbnRvIHRoaXMgdHJlZVxuICAgIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2lkZSAoc2VlXG4gICAgW2Btb3ZlVG9gXSgjY29tbW9uLlRyZWVDdXJzb3IubW92ZVRvKS5cbiAgICAqL1xuICAgIGN1cnNvckF0KHBvcywgc2lkZSA9IDAsIG1vZGUgPSAwKSB7XG4gICAgICAgIGxldCBzY29wZSA9IENhY2hlZE5vZGUuZ2V0KHRoaXMpIHx8IHRoaXMudG9wTm9kZTtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBUcmVlQ3Vyc29yKHNjb3BlKTtcbiAgICAgICAgY3Vyc29yLm1vdmVUbyhwb3MsIHNpZGUpO1xuICAgICAgICBDYWNoZWROb2RlLnNldCh0aGlzLCBjdXJzb3IuX3RyZWUpO1xuICAgICAgICByZXR1cm4gY3Vyc29yO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgb2JqZWN0IGZvciB0aGUgdG9wIG9mIHRoZVxuICAgIHRyZWUuXG4gICAgKi9cbiAgICBnZXQgdG9wTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZSh0aGlzLCAwLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgIElmIGBzaWRlYCBpcyAtMSwgdGhpcyB3aWxsIG1vdmUgaW50byBub2RlcyB0aGF0IGVuZCBhdCB0aGVcbiAgICBwb3NpdGlvbi4gSWYgMSwgaXQnbGwgbW92ZSBpbnRvIG5vZGVzIHRoYXQgc3RhcnQgYXQgdGhlXG4gICAgcG9zaXRpb24uIFdpdGggMCwgaXQnbGwgb25seSBlbnRlciBub2RlcyB0aGF0IGNvdmVyIHRoZSBwb3NpdGlvblxuICAgIGZyb20gYm90aCBzaWRlcy5cbiAgICBcbiAgICBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCBlbnRlclxuICAgIFtvdmVybGF5c10oI2NvbW1vbi5Nb3VudGVkVHJlZS5vdmVybGF5KSwgYW5kIHlvdSBvZnRlbiB3YW50XG4gICAgW2ByZXNvbHZlSW5uZXJgXSgjY29tbW9uLlRyZWUucmVzb2x2ZUlubmVyKSBpbnN0ZWFkLlxuICAgICovXG4gICAgcmVzb2x2ZShwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIGxldCBub2RlID0gcmVzb2x2ZU5vZGUoQ2FjaGVkTm9kZS5nZXQodGhpcykgfHwgdGhpcy50b3BOb2RlLCBwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVkTm9kZS5zZXQodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgcmVzb2x2ZWBdKCNjb21tb24uVHJlZS5yZXNvbHZlKSwgYnV0IHdpbGwgZW50ZXJcbiAgICBbb3ZlcmxhaWRdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSkgbm9kZXMsIHByb2R1Y2luZyBhIHN5bnRheCBub2RlXG4gICAgcG9pbnRpbmcgaW50byB0aGUgaW5uZXJtb3N0IG92ZXJsYWlkIHRyZWUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uXG4gICAgKHdpdGggcGFyZW50IGxpbmtzIGdvaW5nIHRocm91Z2ggYWxsIHBhcmVudCBzdHJ1Y3R1cmUsIGluY2x1ZGluZ1xuICAgIHRoZSBob3N0IHRyZWVzKS5cbiAgICAqL1xuICAgIHJlc29sdmVJbm5lcihwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIGxldCBub2RlID0gcmVzb2x2ZU5vZGUoQ2FjaGVkSW5uZXJOb2RlLmdldCh0aGlzKSB8fCB0aGlzLnRvcE5vZGUsIHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgICAgIENhY2hlZElubmVyTm9kZS5zZXQodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbiBzb21lIHNpdHVhdGlvbnMsIGl0IGNhbiBiZSB1c2VmdWwgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbFxuICAgIG5vZGVzIGFyb3VuZCBhIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGhvc2UgaW4gb3ZlcmxheXMgdGhhdCBkb24ndFxuICAgIGRpcmVjdGx5IGNvdmVyIHRoZSBwb3NpdGlvbi4gVGhpcyBtZXRob2QgZ2l2ZXMgeW91IGFuIGl0ZXJhdG9yXG4gICAgdGhhdCB3aWxsIHByb2R1Y2UgYWxsIG5vZGVzLCBmcm9tIHNtYWxsIHRvIGJpZywgYXJvdW5kIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgcmVzb2x2ZVN0YWNrKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrSXRlcmF0b3IodGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGFuZCBpdHMgY2hpbGRyZW4sIGNhbGxpbmcgYGVudGVyYCBmb3IgYW55XG4gICAgbm9kZSB0aGF0IHRvdWNoZXMgdGhlIGBmcm9tYC9gdG9gIHJlZ2lvbiAoaWYgZ2l2ZW4pIGJlZm9yZVxuICAgIHJ1bm5pbmcgb3ZlciBzdWNoIGEgbm9kZSdzIGNoaWxkcmVuLCBhbmQgYGxlYXZlYCAoaWYgZ2l2ZW4pIHdoZW5cbiAgICBsZWF2aW5nIHRoZSBub2RlLiBXaGVuIGBlbnRlcmAgcmV0dXJucyBgZmFsc2VgLCB0aGF0IG5vZGUgd2lsbFxuICAgIG5vdCBoYXZlIGl0cyBjaGlsZHJlbiBpdGVyYXRlZCBvdmVyIChvciBgbGVhdmVgIGNhbGxlZCkuXG4gICAgKi9cbiAgICBpdGVyYXRlKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgZW50ZXIsIGxlYXZlLCBmcm9tID0gMCwgdG8gPSB0aGlzLmxlbmd0aCB9ID0gc3BlYztcbiAgICAgICAgbGV0IG1vZGUgPSBzcGVjLm1vZGUgfHwgMCwgYW5vbiA9IChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgPiAwO1xuICAgICAgICBmb3IgKGxldCBjID0gdGhpcy5jdXJzb3IobW9kZSB8IEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpOzspIHtcbiAgICAgICAgICAgIGxldCBlbnRlcmVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYy5mcm9tIDw9IHRvICYmIGMudG8gPj0gZnJvbSAmJiAoIWFub24gJiYgYy50eXBlLmlzQW5vbnltb3VzIHx8IGVudGVyKGMpICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYy5maXJzdENoaWxkKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGVudGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChlbnRlcmVkICYmIGxlYXZlICYmIChhbm9uIHx8ICFjLnR5cGUuaXNBbm9ueW1vdXMpKVxuICAgICAgICAgICAgICAgICAgICBsZWF2ZShjKTtcbiAgICAgICAgICAgICAgICBpZiAoYy5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIWMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBbbm9kZSBwcm9wXSgjY29tbW9uLk5vZGVQcm9wKSBmb3IgdGhpc1xuICAgIG5vZGUuIFdvcmtzIHdpdGggYm90aCBwZXItbm9kZSBhbmQgcGVyLXR5cGUgcHJvcHMuXG4gICAgKi9cbiAgICBwcm9wKHByb3ApIHtcbiAgICAgICAgcmV0dXJuICFwcm9wLnBlck5vZGUgPyB0aGlzLnR5cGUucHJvcChwcm9wKSA6IHRoaXMucHJvcHMgPyB0aGlzLnByb3BzW3Byb3AuaWRdIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBub2RlJ3MgW3Blci1ub2RlIHByb3BzXSgjY29tbW9uLk5vZGVQcm9wLnBlck5vZGUpIGluIGFcbiAgICBmb3JtYXQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBbYFRyZWVgXSgjY29tbW9uLlRyZWUpXG4gICAgY29uc3RydWN0b3IuXG4gICAgKi9cbiAgICBnZXQgcHJvcFZhbHVlcygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5wcm9wcylcbiAgICAgICAgICAgIGZvciAobGV0IGlkIGluIHRoaXMucHJvcHMpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goWytpZCwgdGhpcy5wcm9wc1tpZF1dKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQmFsYW5jZSB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgdHJlZSwgcHJvZHVjaW5nIGEgY29weSBvZlxuICAgIHdoaWNoIG1heSBoYXZlIGNoaWxkcmVuIGdyb3VwZWQgaW50byBzdWJ0cmVlcyB3aXRoIHR5cGVcbiAgICBbYE5vZGVUeXBlLm5vbmVgXSgjY29tbW9uLk5vZGVUeXBlXm5vbmUpLlxuICAgICovXG4gICAgYmFsYW5jZShjb25maWcgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGggPD0gOCAvKiBCYWxhbmNlLkJyYW5jaEZhY3RvciAqLyA/IHRoaXMgOlxuICAgICAgICAgICAgYmFsYW5jZVJhbmdlKE5vZGVUeXBlLm5vbmUsIHRoaXMuY2hpbGRyZW4sIHRoaXMucG9zaXRpb25zLCAwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgMCwgdGhpcy5sZW5ndGgsIChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IG5ldyBUcmVlKHRoaXMudHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCB0aGlzLnByb3BWYWx1ZXMpLCBjb25maWcubWFrZVRyZWUgfHwgKChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSB0cmVlIGZyb20gYSBwb3N0Zml4LW9yZGVyZWQgYnVmZmVyIG9mIG5vZGUgaW5mb3JtYXRpb24sXG4gICAgb3IgYSBjdXJzb3Igb3ZlciBzdWNoIGEgYnVmZmVyLlxuICAgICovXG4gICAgc3RhdGljIGJ1aWxkKGRhdGEpIHsgcmV0dXJuIGJ1aWxkVHJlZShkYXRhKTsgfVxufVxuLyoqXG5UaGUgZW1wdHkgdHJlZVxuKi9cblRyZWUuZW1wdHkgPSBuZXcgVHJlZShOb2RlVHlwZS5ub25lLCBbXSwgW10sIDApO1xuY2xhc3MgRmxhdEJ1ZmZlckN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoYnVmZmVyLCBpbmRleCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBnZXQgaWQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gNF07IH1cbiAgICBnZXQgc3RhcnQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gM107IH1cbiAgICBnZXQgZW5kKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDJdOyB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gMV07IH1cbiAgICBnZXQgcG9zKCkgeyByZXR1cm4gdGhpcy5pbmRleDsgfVxuICAgIG5leHQoKSB7IHRoaXMuaW5kZXggLT0gNDsgfVxuICAgIGZvcmsoKSB7IHJldHVybiBuZXcgRmxhdEJ1ZmZlckN1cnNvcih0aGlzLmJ1ZmZlciwgdGhpcy5pbmRleCk7IH1cbn1cbi8qKlxuVHJlZSBidWZmZXJzIGNvbnRhaW4gKHR5cGUsIHN0YXJ0LCBlbmQsIGVuZEluZGV4KSBxdWFkcyBmb3IgZWFjaFxubm9kZS4gSW4gc3VjaCBhIGJ1ZmZlciwgbm9kZXMgYXJlIHN0b3JlZCBpbiBwcmVmaXggb3JkZXIgKHBhcmVudHNcbmJlZm9yZSBjaGlsZHJlbiwgd2l0aCB0aGUgZW5kSW5kZXggb2YgdGhlIHBhcmVudCBpbmRpY2F0aW5nIHdoaWNoXG5jaGlsZHJlbiBiZWxvbmcgdG8gaXQpLlxuKi9cbmNsYXNzIFRyZWVCdWZmZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRyZWUgYnVmZmVyLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGJ1ZmZlcidzIGNvbnRlbnQuXG4gICAgKi9cbiAgICBidWZmZXIsIFxuICAgIC8qKlxuICAgIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGdyb3VwIG9mIG5vZGVzIGluIHRoZSBidWZmZXIuXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNldCB1c2VkIGluIHRoaXMgYnVmZmVyLlxuICAgICovXG4gICAgc2V0KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5zZXQgPSBzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IHR5cGUoKSB7IHJldHVybiBOb2RlVHlwZS5ub25lOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5idWZmZXIubGVuZ3RoOykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZFN0cmluZyhpbmRleCkpO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmJ1ZmZlcltpbmRleCArIDNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIixcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hpbGRTdHJpbmcoaW5kZXgpIHtcbiAgICAgICAgbGV0IGlkID0gdGhpcy5idWZmZXJbaW5kZXhdLCBlbmRJbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy5zZXQudHlwZXNbaWRdLCByZXN1bHQgPSB0eXBlLm5hbWU7XG4gICAgICAgIGlmICgvXFxXLy50ZXN0KHJlc3VsdCkgJiYgIXR5cGUuaXNFcnJvcilcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7XG4gICAgICAgIGluZGV4ICs9IDQ7XG4gICAgICAgIGlmIChlbmRJbmRleCA9PSBpbmRleClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmRJbmRleCkge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkU3RyaW5nKGluZGV4KSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIFwiKFwiICsgY2hpbGRyZW4uam9pbihcIixcIikgKyBcIilcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5kQ2hpbGQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcywgcGljayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSAhPSBlbmRJbmRleDsgaSA9IGJ1ZmZlcltpICsgM10pIHtcbiAgICAgICAgICAgIGlmIChjaGVja1NpZGUoc2lkZSwgcG9zLCBidWZmZXJbaSArIDFdLCBidWZmZXJbaSArIDJdKSkge1xuICAgICAgICAgICAgICAgIHBpY2sgPSBpO1xuICAgICAgICAgICAgICAgIGlmIChkaXIgPiAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGljaztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzbGljZShzdGFydEksIGVuZEksIGZyb20pIHtcbiAgICAgICAgbGV0IGIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgbGV0IGNvcHkgPSBuZXcgVWludDE2QXJyYXkoZW5kSSAtIHN0YXJ0SSksIGxlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEksIGogPSAwOyBpIDwgZW5kSTspIHtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXTtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXSAtIGZyb207XG4gICAgICAgICAgICBsZXQgdG8gPSBjb3B5W2orK10gPSBiW2krK10gLSBmcm9tO1xuICAgICAgICAgICAgY29weVtqKytdID0gYltpKytdIC0gc3RhcnRJO1xuICAgICAgICAgICAgbGVuID0gTWF0aC5tYXgobGVuLCB0byk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlQnVmZmVyKGNvcHksIGxlbiwgdGhpcy5zZXQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrU2lkZShzaWRlLCBwb3MsIGZyb20sIHRvKSB7XG4gICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICAgIGNhc2UgLTIgLyogU2lkZS5CZWZvcmUgKi86IHJldHVybiBmcm9tIDwgcG9zO1xuICAgICAgICBjYXNlIC0xIC8qIFNpZGUuQXRPckJlZm9yZSAqLzogcmV0dXJuIHRvID49IHBvcyAmJiBmcm9tIDwgcG9zO1xuICAgICAgICBjYXNlIDAgLyogU2lkZS5Bcm91bmQgKi86IHJldHVybiBmcm9tIDwgcG9zICYmIHRvID4gcG9zO1xuICAgICAgICBjYXNlIDEgLyogU2lkZS5BdE9yQWZ0ZXIgKi86IHJldHVybiBmcm9tIDw9IHBvcyAmJiB0byA+IHBvcztcbiAgICAgICAgY2FzZSAyIC8qIFNpZGUuQWZ0ZXIgKi86IHJldHVybiB0byA+IHBvcztcbiAgICAgICAgY2FzZSA0IC8qIFNpZGUuRG9udENhcmUgKi86IHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVOb2RlKG5vZGUsIHBvcywgc2lkZSwgb3ZlcmxheXMpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gTW92ZSB1cCB0byBhIG5vZGUgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgcG9zaXRpb24sIGlmIHBvc3NpYmxlXG4gICAgd2hpbGUgKG5vZGUuZnJvbSA9PSBub2RlLnRvIHx8XG4gICAgICAgIChzaWRlIDwgMSA/IG5vZGUuZnJvbSA+PSBwb3MgOiBub2RlLmZyb20gPiBwb3MpIHx8XG4gICAgICAgIChzaWRlID4gLTEgPyBub2RlLnRvIDw9IHBvcyA6IG5vZGUudG8gPCBwb3MpKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSAhb3ZlcmxheXMgJiYgbm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIG5vZGUuaW5kZXggPCAwID8gbnVsbCA6IG5vZGUucGFyZW50O1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBub2RlID0gcGFyZW50O1xuICAgIH1cbiAgICBsZXQgbW9kZSA9IG92ZXJsYXlzID8gMCA6IEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzO1xuICAgIC8vIE11c3QgZ28gdXAgb3V0IG9mIG92ZXJsYXlzIHdoZW4gdGhvc2UgZG8gbm90IG92ZXJsYXAgd2l0aCBwb3NcbiAgICBpZiAob3ZlcmxheXMpXG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBub2RlLCBwYXJlbnQgPSBzY2FuLnBhcmVudDsgcGFyZW50OyBzY2FuID0gcGFyZW50LCBwYXJlbnQgPSBzY2FuLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHNjYW4gaW5zdGFuY2VvZiBUcmVlTm9kZSAmJiBzY2FuLmluZGV4IDwgMCAmJiAoKF9hID0gcGFyZW50LmVudGVyKHBvcywgc2lkZSwgbW9kZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mcm9tKSAhPSBzY2FuLmZyb20pXG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IGlubmVyID0gbm9kZS5lbnRlcihwb3MsIHNpZGUsIG1vZGUpO1xuICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBpbm5lcjtcbiAgICB9XG59XG5jbGFzcyBCYXNlTm9kZSB7XG4gICAgY3Vyc29yKG1vZGUgPSAwKSB7IHJldHVybiBuZXcgVHJlZUN1cnNvcih0aGlzLCBtb2RlKTsgfVxuICAgIGdldENoaWxkKHR5cGUsIGJlZm9yZSA9IG51bGwsIGFmdGVyID0gbnVsbCkge1xuICAgICAgICBsZXQgciA9IGdldENoaWxkcmVuKHRoaXMsIHR5cGUsIGJlZm9yZSwgYWZ0ZXIpO1xuICAgICAgICByZXR1cm4gci5sZW5ndGggPyByWzBdIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0Q2hpbGRyZW4odHlwZSwgYmVmb3JlID0gbnVsbCwgYWZ0ZXIgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbih0aGlzLCB0eXBlLCBiZWZvcmUsIGFmdGVyKTtcbiAgICB9XG4gICAgcmVzb2x2ZShwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlTm9kZSh0aGlzLCBwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICB9XG4gICAgcmVzb2x2ZUlubmVyKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVOb2RlKHRoaXMsIHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgfVxuICAgIG1hdGNoQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBtYXRjaE5vZGVDb250ZXh0KHRoaXMucGFyZW50LCBjb250ZXh0KTtcbiAgICB9XG4gICAgZW50ZXJVbmZpbmlzaGVkTm9kZXNCZWZvcmUocG9zKSB7XG4gICAgICAgIGxldCBzY2FuID0gdGhpcy5jaGlsZEJlZm9yZShwb3MpLCBub2RlID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHNjYW4pIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gc2Nhbi5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoIWxhc3QgfHwgbGFzdC50byAhPSBzY2FuLnRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKGxhc3QudHlwZS5pc0Vycm9yICYmIGxhc3QuZnJvbSA9PSBsYXN0LnRvKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHNjYW47XG4gICAgICAgICAgICAgICAgc2NhbiA9IGxhc3QucHJldlNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY2FuID0gbGFzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0IG5vZGUoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgZ2V0IG5leHQoKSB7IHJldHVybiB0aGlzLnBhcmVudDsgfVxufVxuY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBCYXNlTm9kZSB7XG4gICAgY29uc3RydWN0b3IoX3RyZWUsIGZyb20sIFxuICAgIC8vIEluZGV4IGluIHBhcmVudCBub2RlLCBzZXQgdG8gLTEgaWYgdGhlIG5vZGUgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIF9wYXJlbnQubm9kZSAob3ZlcmxheSlcbiAgICBpbmRleCwgX3BhcmVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmVlID0gX3RyZWU7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICB9XG4gICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90cmVlLnR5cGU7IH1cbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWUudHlwZS5uYW1lOyB9XG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5mcm9tICsgdGhpcy5fdHJlZS5sZW5ndGg7IH1cbiAgICBuZXh0Q2hpbGQoaSwgZGlyLCBwb3MsIHNpZGUsIG1vZGUgPSAwKSB7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCA9IHRoaXM7Oykge1xuICAgICAgICAgICAgZm9yIChsZXQgeyBjaGlsZHJlbiwgcG9zaXRpb25zIH0gPSBwYXJlbnQuX3RyZWUsIGUgPSBkaXIgPiAwID8gY2hpbGRyZW4ubGVuZ3RoIDogLTE7IGkgIT0gZTsgaSArPSBkaXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGNoaWxkcmVuW2ldLCBzdGFydCA9IHBvc2l0aW9uc1tpXSArIHBhcmVudC5mcm9tO1xuICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWRlKHNpZGUsIHBvcywgc3RhcnQsIHN0YXJ0ICsgbmV4dC5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0LmZpbmRDaGlsZCgwLCBuZXh0LmJ1ZmZlci5sZW5ndGgsIGRpciwgcG9zIC0gc3RhcnQsIHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyTm9kZShuZXcgQnVmZmVyQ29udGV4dChwYXJlbnQsIG5leHQsIGksIHN0YXJ0KSwgbnVsbCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8ICghbmV4dC50eXBlLmlzQW5vbnltb3VzIHx8IGhhc0NoaWxkKG5leHQpKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW91bnRlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEobW9kZSAmIEl0ZXJNb2RlLklnbm9yZU1vdW50cykgJiYgKG1vdW50ZWQgPSBNb3VudGVkVHJlZS5nZXQobmV4dCkpICYmICFtb3VudGVkLm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKG1vdW50ZWQudHJlZSwgc3RhcnQsIGksIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IG5ldyBUcmVlTm9kZShuZXh0LCBzdGFydCwgaSwgcGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHwgIWlubmVyLnR5cGUuaXNBbm9ueW1vdXMgPyBpbm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpbm5lci5uZXh0Q2hpbGQoZGlyIDwgMCA/IG5leHQuY2hpbGRyZW4ubGVuZ3RoIC0gMSA6IDAsIGRpciwgcG9zLCBzaWRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fCAhcGFyZW50LnR5cGUuaXNBbm9ueW1vdXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAocGFyZW50LmluZGV4ID49IDApXG4gICAgICAgICAgICAgICAgaSA9IHBhcmVudC5pbmRleCArIGRpcjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBpID0gZGlyIDwgMCA/IC0xIDogcGFyZW50Ll9wYXJlbnQuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKDAsIDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQodGhpcy5fdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGNoaWxkQWZ0ZXIocG9zKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCgwLCAxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICBjaGlsZEJlZm9yZShwb3MpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKHRoaXMuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgLTEsIHBvcywgLTIgLyogU2lkZS5CZWZvcmUgKi8pOyB9XG4gICAgZW50ZXIocG9zLCBzaWRlLCBtb2RlID0gMCkge1xuICAgICAgICBsZXQgbW91bnRlZDtcbiAgICAgICAgaWYgKCEobW9kZSAmIEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzKSAmJiAobW91bnRlZCA9IE1vdW50ZWRUcmVlLmdldCh0aGlzLl90cmVlKSkgJiYgbW91bnRlZC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgclBvcyA9IHBvcyAtIHRoaXMuZnJvbTtcbiAgICAgICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiBtb3VudGVkLm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHNpZGUgPiAwID8gZnJvbSA8PSByUG9zIDogZnJvbSA8IHJQb3MpICYmXG4gICAgICAgICAgICAgICAgICAgIChzaWRlIDwgMCA/IHRvID49IHJQb3MgOiB0byA+IHJQb3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKG1vdW50ZWQudHJlZSwgbW91bnRlZC5vdmVybGF5WzBdLmZyb20gKyB0aGlzLmZyb20sIC0xLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0Q2hpbGQoMCwgMSwgcG9zLCBzaWRlLCBtb2RlKTtcbiAgICB9XG4gICAgbmV4dFNpZ25pZmljYW50UGFyZW50KCkge1xuICAgICAgICBsZXQgdmFsID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHZhbC50eXBlLmlzQW5vbnltb3VzICYmIHZhbC5fcGFyZW50KVxuICAgICAgICAgICAgdmFsID0gdmFsLl9wYXJlbnQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCkgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbmV4dFNpYmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgJiYgdGhpcy5pbmRleCA+PSAwID8gdGhpcy5fcGFyZW50Lm5leHRDaGlsZCh0aGlzLmluZGV4ICsgMSwgMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBwcmV2U2libGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCAmJiB0aGlzLmluZGV4ID49IDAgPyB0aGlzLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuaW5kZXggLSAxLCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCB0cmVlKCkgeyByZXR1cm4gdGhpcy5fdHJlZTsgfVxuICAgIHRvVHJlZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5fdHJlZS50b1N0cmluZygpOyB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZHJlbihub2RlLCB0eXBlLCBiZWZvcmUsIGFmdGVyKSB7XG4gICAgbGV0IGN1ciA9IG5vZGUuY3Vyc29yKCksIHJlc3VsdCA9IFtdO1xuICAgIGlmICghY3VyLmZpcnN0Q2hpbGQoKSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoYmVmb3JlICE9IG51bGwpXG4gICAgICAgIGZvciAobGV0IGZvdW5kID0gZmFsc2U7ICFmb3VuZDspIHtcbiAgICAgICAgICAgIGZvdW5kID0gY3VyLnR5cGUuaXMoYmVmb3JlKTtcbiAgICAgICAgICAgIGlmICghY3VyLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGFmdGVyICE9IG51bGwgJiYgY3VyLnR5cGUuaXMoYWZ0ZXIpKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgaWYgKGN1ci50eXBlLmlzKHR5cGUpKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VyLm5vZGUpO1xuICAgICAgICBpZiAoIWN1ci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgcmV0dXJuIGFmdGVyID09IG51bGwgPyByZXN1bHQgOiBbXTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXRjaE5vZGVDb250ZXh0KG5vZGUsIGNvbnRleHQsIGkgPSBjb250ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICBmb3IgKGxldCBwID0gbm9kZTsgaSA+PSAwOyBwID0gcC5wYXJlbnQpIHtcbiAgICAgICAgaWYgKCFwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXAudHlwZS5pc0Fub255bW91cykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaV0gJiYgY29udGV4dFtpXSAhPSBwLm5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuY2xhc3MgQnVmZmVyQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBidWZmZXIsIGluZGV4LCBzdGFydCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIH1cbn1cbmNsYXNzIEJ1ZmZlck5vZGUgZXh0ZW5kcyBCYXNlTm9kZSB7XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLnR5cGUubmFtZTsgfVxuICAgIGdldCBmcm9tKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LnN0YXJ0ICsgdGhpcy5jb250ZXh0LmJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDFdOyB9XG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LnN0YXJ0ICsgdGhpcy5jb250ZXh0LmJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDJdOyB9XG4gICAgY29uc3RydWN0b3IoY29udGV4dCwgX3BhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnR5cGUgPSBjb250ZXh0LmJ1ZmZlci5zZXQudHlwZXNbY29udGV4dC5idWZmZXIuYnVmZmVyW2luZGV4XV07XG4gICAgfVxuICAgIGNoaWxkKGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgaW5kZXggPSBidWZmZXIuZmluZENoaWxkKHRoaXMuaW5kZXggKyA0LCBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXSwgZGlyLCBwb3MgLSB0aGlzLmNvbnRleHQuc3RhcnQsIHNpZGUpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gbnVsbCA6IG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcywgaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY2hpbGQoMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNoaWxkKC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMuY2hpbGQoMSwgcG9zLCAyIC8qIFNpZGUuQWZ0ZXIgKi8pOyB9XG4gICAgY2hpbGRCZWZvcmUocG9zKSB7IHJldHVybiB0aGlzLmNoaWxkKC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IDApIHtcbiAgICAgICAgaWYgKG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGluZGV4ID0gYnVmZmVyLmZpbmRDaGlsZCh0aGlzLmluZGV4ICsgNCwgYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM10sIHNpZGUgPiAwID8gMSA6IC0xLCBwb3MgLSB0aGlzLmNvbnRleHQuc3RhcnQsIHNpZGUpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gbnVsbCA6IG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcywgaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50IHx8IHRoaXMuY29udGV4dC5wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCk7XG4gICAgfVxuICAgIGV4dGVybmFsU2libGluZyhkaXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IG51bGwgOiB0aGlzLmNvbnRleHQucGFyZW50Lm5leHRDaGlsZCh0aGlzLmNvbnRleHQuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTtcbiAgICB9XG4gICAgZ2V0IG5leHRTaWJsaW5nKCkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGFmdGVyID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgIGlmIChhZnRlciA8ICh0aGlzLl9wYXJlbnQgPyBidWZmZXIuYnVmZmVyW3RoaXMuX3BhcmVudC5pbmRleCArIDNdIDogYnVmZmVyLmJ1ZmZlci5sZW5ndGgpKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcy5fcGFyZW50LCBhZnRlcik7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dGVybmFsU2libGluZygxKTtcbiAgICB9XG4gICAgZ2V0IHByZXZTaWJsaW5nKCkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHBhcmVudFN0YXJ0ID0gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmluZGV4ICsgNCA6IDA7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09IHBhcmVudFN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZXJuYWxTaWJsaW5nKC0xKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcy5fcGFyZW50LCBidWZmZXIuZmluZENoaWxkKHBhcmVudFN0YXJ0LCB0aGlzLmluZGV4LCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSk7XG4gICAgfVxuICAgIGdldCB0cmVlKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIHRvVHJlZSgpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHN0YXJ0SSA9IHRoaXMuaW5kZXggKyA0LCBlbmRJID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgIGlmIChlbmRJID4gc3RhcnRJKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDFdO1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChidWZmZXIuc2xpY2Uoc3RhcnRJLCBlbmRJLCBmcm9tKSk7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyZWUodGhpcy50eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCB0aGlzLnRvIC0gdGhpcy5mcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5idWZmZXIuY2hpbGRTdHJpbmcodGhpcy5pbmRleCk7IH1cbn1cbmZ1bmN0aW9uIGl0ZXJTdGFjayhoZWFkcykge1xuICAgIGlmICghaGVhZHMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcGljayA9IDAsIHBpY2tlZCA9IGhlYWRzWzBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaGVhZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBoZWFkc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuZnJvbSA+IHBpY2tlZC5mcm9tIHx8IG5vZGUudG8gPCBwaWNrZWQudG8pIHtcbiAgICAgICAgICAgIHBpY2tlZCA9IG5vZGU7XG4gICAgICAgICAgICBwaWNrID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgbmV4dCA9IHBpY2tlZCBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIHBpY2tlZC5pbmRleCA8IDAgPyBudWxsIDogcGlja2VkLnBhcmVudDtcbiAgICBsZXQgbmV3SGVhZHMgPSBoZWFkcy5zbGljZSgpO1xuICAgIGlmIChuZXh0KVxuICAgICAgICBuZXdIZWFkc1twaWNrXSA9IG5leHQ7XG4gICAgZWxzZVxuICAgICAgICBuZXdIZWFkcy5zcGxpY2UocGljaywgMSk7XG4gICAgcmV0dXJuIG5ldyBTdGFja0l0ZXJhdG9yKG5ld0hlYWRzLCBwaWNrZWQpO1xufVxuY2xhc3MgU3RhY2tJdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IoaGVhZHMsIG5vZGUpIHtcbiAgICAgICAgdGhpcy5oZWFkcyA9IGhlYWRzO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbiAgICBnZXQgbmV4dCgpIHsgcmV0dXJuIGl0ZXJTdGFjayh0aGlzLmhlYWRzKTsgfVxufVxuZnVuY3Rpb24gc3RhY2tJdGVyYXRvcih0cmVlLCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgaW5uZXIgPSB0cmVlLnJlc29sdmVJbm5lcihwb3MsIHNpZGUpLCBsYXllcnMgPSBudWxsO1xuICAgIGZvciAobGV0IHNjYW4gPSBpbm5lciBpbnN0YW5jZW9mIFRyZWVOb2RlID8gaW5uZXIgOiBpbm5lci5jb250ZXh0LnBhcmVudDsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50KSB7XG4gICAgICAgIGlmIChzY2FuLmluZGV4IDwgMCkgeyAvLyBUaGlzIGlzIGFuIG92ZXJsYXkgcm9vdFxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHNjYW4ucGFyZW50O1xuICAgICAgICAgICAgKGxheWVycyB8fCAobGF5ZXJzID0gW2lubmVyXSkpLnB1c2gocGFyZW50LnJlc29sdmUocG9zLCBzaWRlKSk7XG4gICAgICAgICAgICBzY2FuID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1vdW50ID0gTW91bnRlZFRyZWUuZ2V0KHNjYW4udHJlZSk7XG4gICAgICAgICAgICAvLyBSZWxldmFudCBvdmVybGF5IGJyYW5jaGluZyBvZmZcbiAgICAgICAgICAgIGlmIChtb3VudCAmJiBtb3VudC5vdmVybGF5ICYmIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSA8PSBwb3MgJiYgbW91bnQub3ZlcmxheVttb3VudC5vdmVybGF5Lmxlbmd0aCAtIDFdLnRvID49IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCByb290ID0gbmV3IFRyZWVOb2RlKG1vdW50LnRyZWUsIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSArIHNjYW4uZnJvbSwgLTEsIHNjYW4pO1xuICAgICAgICAgICAgICAgIChsYXllcnMgfHwgKGxheWVycyA9IFtpbm5lcl0pKS5wdXNoKHJlc29sdmVOb2RlKHJvb3QsIHBvcywgc2lkZSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF5ZXJzID8gaXRlclN0YWNrKGxheWVycykgOiBpbm5lcjtcbn1cbi8qKlxuQSB0cmVlIGN1cnNvciBvYmplY3QgZm9jdXNlcyBvbiBhIGdpdmVuIG5vZGUgaW4gYSBzeW50YXggdHJlZSwgYW5kXG5hbGxvd3MgeW91IHRvIG1vdmUgdG8gYWRqYWNlbnQgbm9kZXMuXG4qL1xuY2xhc3MgVHJlZUN1cnNvciB7XG4gICAgLyoqXG4gICAgU2hvcnRoYW5kIGZvciBgLnR5cGUubmFtZWAuXG4gICAgKi9cbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMudHlwZS5uYW1lOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1vZGUgPSAwKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyTm9kZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMueWllbGROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdHJlZSA9IG5vZGUuY29udGV4dC5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSBub2RlLl9wYXJlbnQ7IG47IG4gPSBuLl9wYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay51bnNoaWZ0KG4uaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJOb2RlID0gbm9kZTtcbiAgICAgICAgICAgIHRoaXMueWllbGRCdWYobm9kZS5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeWllbGROb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLl90cmVlID0gbm9kZTtcbiAgICAgICAgdGhpcy50eXBlID0gbm9kZS50eXBlO1xuICAgICAgICB0aGlzLmZyb20gPSBub2RlLmZyb207XG4gICAgICAgIHRoaXMudG8gPSBub2RlLnRvO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgeWllbGRCdWYoaW5kZXgsIHR5cGUpIHtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICBsZXQgeyBzdGFydCwgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCBidWZmZXIuc2V0LnR5cGVzW2J1ZmZlci5idWZmZXJbaW5kZXhdXTtcbiAgICAgICAgdGhpcy5mcm9tID0gc3RhcnQgKyBidWZmZXIuYnVmZmVyW2luZGV4ICsgMV07XG4gICAgICAgIHRoaXMudG8gPSBzdGFydCArIGJ1ZmZlci5idWZmZXJbaW5kZXggKyAyXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgeWllbGQobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkTm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYobm9kZS5pbmRleCwgbm9kZS50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuYnVmZmVyLmNoaWxkU3RyaW5nKHRoaXMuaW5kZXgpIDogdGhpcy5fdHJlZS50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVudGVyQ2hpbGQoZGlyLCBwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkKHRoaXMuX3RyZWUubmV4dENoaWxkKGRpciA8IDAgPyB0aGlzLl90cmVlLl90cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDEgOiAwLCBkaXIsIHBvcywgc2lkZSwgdGhpcy5tb2RlKSk7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGxldCBpbmRleCA9IGJ1ZmZlci5maW5kQ2hpbGQodGhpcy5pbmRleCArIDQsIGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdLCBkaXIsIHBvcyAtIHRoaXMuYnVmZmVyLnN0YXJ0LCBzaWRlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuaW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGlzIG5vZGUncyBmaXJzdCBjaGlsZC4gV2hlbiB0aGlzIHJldHVybnNcbiAgICBmYWxzZSwgdGhlIG5vZGUgaGFzIG5vIGNoaWxkLCBhbmQgdGhlIGN1cnNvciBoYXMgbm90IGJlZW4gbW92ZWQuXG4gICAgKi9cbiAgICBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhpcyBub2RlJ3MgbGFzdCBjaGlsZC5cbiAgICAqL1xuICAgIGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgY2hpbGQgdGhhdCBlbmRzIGFmdGVyIGBwb3NgLlxuICAgICovXG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBsYXN0IGNoaWxkIHRoYXQgc3RhcnRzIGJlZm9yZSBgcG9zYC5cbiAgICAqL1xuICAgIGNoaWxkQmVmb3JlKHBvcykgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgY2hpbGQgYXJvdW5kIGBwb3NgLiBJZiBzaWRlIGlzIC0xIHRoZVxuICAgIGNoaWxkIG1heSBlbmQgYXQgdGhhdCBwb3NpdGlvbiwgd2hlbiAxIGl0IG1heSBzdGFydCB0aGVyZS4gVGhpc1xuICAgIHdpbGwgYWxzbyBlbnRlciBbb3ZlcmxhaWRdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSlcbiAgICBbbW91bnRlZF0oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSB0cmVlcyB1bmxlc3MgYG92ZXJsYXlzYCBpc1xuICAgIHNldCB0byBmYWxzZS5cbiAgICAqL1xuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IHRoaXMubW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGQodGhpcy5fdHJlZS5lbnRlcihwb3MsIHNpZGUsIG1vZGUpKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycyA/IGZhbHNlIDogdGhpcy5lbnRlckNoaWxkKDEsIHBvcywgc2lkZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5vZGUncyBwYXJlbnQgbm9kZSwgaWYgdGhpcyBpc24ndCB0aGUgdG9wIG5vZGUuXG4gICAgKi9cbiAgICBwYXJlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUoKHRoaXMubW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpID8gdGhpcy5fdHJlZS5fcGFyZW50IDogdGhpcy5fdHJlZS5wYXJlbnQpO1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1Zih0aGlzLnN0YWNrLnBvcCgpKTtcbiAgICAgICAgbGV0IHBhcmVudCA9ICh0aGlzLm1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSA/IHRoaXMuYnVmZmVyLnBhcmVudCA6IHRoaXMuYnVmZmVyLnBhcmVudC5uZXh0U2lnbmlmaWNhbnRQYXJlbnQoKTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUocGFyZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaWJsaW5nKGRpcikge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLl90cmVlLl9wYXJlbnQgPyBmYWxzZVxuICAgICAgICAgICAgICAgIDogdGhpcy55aWVsZCh0aGlzLl90cmVlLmluZGV4IDwgMCA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl90cmVlLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuX3RyZWUuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovLCB0aGlzLm1vZGUpKTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlciwgZCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGRpciA8IDApIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRTdGFydCA9IGQgPCAwID8gMCA6IHRoaXMuc3RhY2tbZF0gKyA0O1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggIT0gcGFyZW50U3RhcnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYoYnVmZmVyLmZpbmRDaGlsZChwYXJlbnRTdGFydCwgdGhpcy5pbmRleCwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgICAgICBpZiAoYWZ0ZXIgPCAoZCA8IDAgPyBidWZmZXIuYnVmZmVyLmxlbmd0aCA6IGJ1ZmZlci5idWZmZXJbdGhpcy5zdGFja1tkXSArIDNdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihhZnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQgPCAwID8gdGhpcy55aWVsZCh0aGlzLmJ1ZmZlci5wYXJlbnQubmV4dENoaWxkKHRoaXMuYnVmZmVyLmluZGV4ICsgZGlyLCBkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLywgdGhpcy5tb2RlKSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGlzIG5vZGUncyBuZXh0IHNpYmxpbmcsIGlmIGFueS5cbiAgICAqL1xuICAgIG5leHRTaWJsaW5nKCkgeyByZXR1cm4gdGhpcy5zaWJsaW5nKDEpOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGlzIG5vZGUncyBwcmV2aW91cyBzaWJsaW5nLCBpZiBhbnkuXG4gICAgKi9cbiAgICBwcmV2U2libGluZygpIHsgcmV0dXJuIHRoaXMuc2libGluZygtMSk7IH1cbiAgICBhdExhc3ROb2RlKGRpcikge1xuICAgICAgICBsZXQgaW5kZXgsIHBhcmVudCwgeyBidWZmZXIgfSA9IHRoaXM7XG4gICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICAgIGlmIChkaXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPCBidWZmZXIuYnVmZmVyLmJ1ZmZlci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmRleDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmJ1ZmZlci5idWZmZXJbaSArIDNdIDwgdGhpcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICh7IGluZGV4LCBwYXJlbnQgfSA9IGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoeyBpbmRleCwgX3BhcmVudDogcGFyZW50IH0gPSB0aGlzLl90cmVlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgcGFyZW50OyB7IGluZGV4LCBfcGFyZW50OiBwYXJlbnQgfSA9IHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ICsgZGlyLCBlID0gZGlyIDwgMCA/IC0xIDogcGFyZW50Ll90cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSAhPSBlOyBpICs9IGRpcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnQuX3RyZWUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5tb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkIGluc3RhbmNlb2YgVHJlZUJ1ZmZlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIWNoaWxkLnR5cGUuaXNBbm9ueW1vdXMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1vdmUoZGlyLCBlbnRlcikge1xuICAgICAgICBpZiAoZW50ZXIgJiYgdGhpcy5lbnRlckNoaWxkKGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaWJsaW5nKGRpcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5hdExhc3ROb2RlKGRpcikgfHwgIXRoaXMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbm9kZSBpbiBhXG4gICAgW3ByZS1vcmRlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJlZV90cmF2ZXJzYWwjUHJlLW9yZGVyLF9OTFIpXG4gICAgdHJhdmVyc2FsLCBnb2luZyBmcm9tIGEgbm9kZSB0byBpdHMgZmlyc3QgY2hpbGQgb3IsIGlmIHRoZVxuICAgIGN1cnJlbnQgbm9kZSBpcyBlbXB0eSBvciBgZW50ZXJgIGlzIGZhbHNlLCBpdHMgbmV4dCBzaWJsaW5nIG9yXG4gICAgdGhlIG5leHQgc2libGluZyBvZiB0aGUgZmlyc3QgcGFyZW50IG5vZGUgdGhhdCBoYXMgb25lLlxuICAgICovXG4gICAgbmV4dChlbnRlciA9IHRydWUpIHsgcmV0dXJuIHRoaXMubW92ZSgxLCBlbnRlcik7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IG5vZGUgaW4gYSBsYXN0LXRvLWZpcnN0IHByZS1vcmRlciB0cmF2ZXJzYWwuIEFcbiAgICBub2RlIGlzIGZvbGxvd2VkIGJ5IGl0cyBsYXN0IGNoaWxkIG9yLCBpZiBpdCBoYXMgbm9uZSwgaXRzXG4gICAgcHJldmlvdXMgc2libGluZyBvciB0aGUgcHJldmlvdXMgc2libGluZyBvZiB0aGUgZmlyc3QgcGFyZW50XG4gICAgbm9kZSB0aGF0IGhhcyBvbmUuXG4gICAgKi9cbiAgICBwcmV2KGVudGVyID0gdHJ1ZSkgeyByZXR1cm4gdGhpcy5tb3ZlKC0xLCBlbnRlcik7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGlubmVybW9zdCBub2RlIHRoYXQgY292ZXJzIGBwb3NgLiBJZlxuICAgIGBzaWRlYCBpcyAtMSwgaXQgd2lsbCBlbnRlciBub2RlcyB0aGF0IGVuZCBhdCBgcG9zYC4gSWYgaXQgaXMgMSxcbiAgICBpdCB3aWxsIGVudGVyIG5vZGVzIHRoYXQgc3RhcnQgYXQgYHBvc2AuXG4gICAgKi9cbiAgICBtb3ZlVG8ocG9zLCBzaWRlID0gMCkge1xuICAgICAgICAvLyBNb3ZlIHVwIHRvIGEgbm9kZSB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSBwb3NpdGlvbiwgaWYgcG9zc2libGVcbiAgICAgICAgd2hpbGUgKHRoaXMuZnJvbSA9PSB0aGlzLnRvIHx8XG4gICAgICAgICAgICAoc2lkZSA8IDEgPyB0aGlzLmZyb20gPj0gcG9zIDogdGhpcy5mcm9tID4gcG9zKSB8fFxuICAgICAgICAgICAgKHNpZGUgPiAtMSA/IHRoaXMudG8gPD0gcG9zIDogdGhpcy50byA8IHBvcykpXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFRoZW4gc2NhbiBkb3duIGludG8gY2hpbGQgbm9kZXMgYXMgZmFyIGFzIHBvc3NpYmxlXG4gICAgICAgIHdoaWxlICh0aGlzLmVudGVyQ2hpbGQoMSwgcG9zLCBzaWRlKSkgeyB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgYXQgdGhlIGN1cnNvcidzIGN1cnJlbnRcbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGdldCBub2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyZWU7XG4gICAgICAgIGxldCBjYWNoZSA9IHRoaXMuYnVmZmVyTm9kZSwgcmVzdWx0ID0gbnVsbCwgZGVwdGggPSAwO1xuICAgICAgICBpZiAoY2FjaGUgJiYgY2FjaGUuY29udGV4dCA9PSB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgc2NhbjogZm9yIChsZXQgaW5kZXggPSB0aGlzLmluZGV4LCBkID0gdGhpcy5zdGFjay5sZW5ndGg7IGQgPj0gMDspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gY2FjaGU7IGM7IGMgPSBjLl9wYXJlbnQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLmluZGV4ID09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IGQgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5zdGFja1stLWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBkZXB0aDsgaSA8IHRoaXMuc3RhY2subGVuZ3RoOyBpKyspXG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgQnVmZmVyTm9kZSh0aGlzLmJ1ZmZlciwgcmVzdWx0LCB0aGlzLnN0YWNrW2ldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTm9kZSA9IG5ldyBCdWZmZXJOb2RlKHRoaXMuYnVmZmVyLCByZXN1bHQsIHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIFt0cmVlXSgjY29tbW9uLlRyZWUpIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBub2RlLCBpZlxuICAgIGFueS4gV2lsbCByZXR1cm4gbnVsbCB3aGVuIHRoZSBub2RlIGlzIGluIGEgW3RyZWVcbiAgICBidWZmZXJdKCNjb21tb24uVHJlZUJ1ZmZlcikuXG4gICAgKi9cbiAgICBnZXQgdHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gbnVsbCA6IHRoaXMuX3RyZWUuX3RyZWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgY3VycmVudCBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzLCBjYWxsaW5nXG4gICAgYGVudGVyYCB3aGVuIGVudGVyaW5nIGEgbm9kZSBhbmQgYGxlYXZlYCwgaWYgZ2l2ZW4sIHdoZW4gbGVhdmluZ1xuICAgIG9uZS4gV2hlbiBgZW50ZXJgIHJldHVybnMgYGZhbHNlYCwgYW55IGNoaWxkcmVuIG9mIHRoYXQgbm9kZSBhcmVcbiAgICBza2lwcGVkLCBhbmQgYGxlYXZlYCBpc24ndCBjYWxsZWQgZm9yIGl0LlxuICAgICovXG4gICAgaXRlcmF0ZShlbnRlciwgbGVhdmUpIHtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBtdXN0TGVhdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUuaXNBbm9ueW1vdXMgfHwgZW50ZXIodGhpcykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHlwZS5pc0Fub255bW91cylcbiAgICAgICAgICAgICAgICAgICAgbXVzdExlYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAobXVzdExlYXZlICYmIGxlYXZlKVxuICAgICAgICAgICAgICAgICAgICBsZWF2ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0aGlzLnR5cGUuaXNBbm9ueW1vdXM7XG4gICAgICAgICAgICAgICAgaWYgKCFkZXB0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGUgY3VycmVudCBub2RlIG1hdGNoZXMgYSBnaXZlbiBjb250ZXh0XHUyMDE0YSBzZXF1ZW5jZVxuICAgIG9mIGRpcmVjdCBwYXJlbnQgbm9kZSBuYW1lcy4gRW1wdHkgc3RyaW5ncyBpbiB0aGUgY29udGV4dCBhcnJheVxuICAgIGFyZSB0cmVhdGVkIGFzIHdpbGRjYXJkcy5cbiAgICAqL1xuICAgIG1hdGNoQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLm5vZGUucGFyZW50LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlciwgeyB0eXBlcyB9ID0gYnVmZmVyLnNldDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbnRleHQubGVuZ3RoIC0gMSwgZCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGlmIChkIDwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLl90cmVlLCBjb250ZXh0LCBpKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbYnVmZmVyLmJ1ZmZlclt0aGlzLnN0YWNrW2RdXV07XG4gICAgICAgICAgICBpZiAoIXR5cGUuaXNBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dFtpXSAmJiBjb250ZXh0W2ldICE9IHR5cGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNDaGlsZCh0cmVlKSB7XG4gICAgcmV0dXJuIHRyZWUuY2hpbGRyZW4uc29tZShjaCA9PiBjaCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHwgIWNoLnR5cGUuaXNBbm9ueW1vdXMgfHwgaGFzQ2hpbGQoY2gpKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVHJlZShkYXRhKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCB7IGJ1ZmZlciwgbm9kZVNldCwgbWF4QnVmZmVyTGVuZ3RoID0gRGVmYXVsdEJ1ZmZlckxlbmd0aCwgcmV1c2VkID0gW10sIG1pblJlcGVhdFR5cGUgPSBub2RlU2V0LnR5cGVzLmxlbmd0aCB9ID0gZGF0YTtcbiAgICBsZXQgY3Vyc29yID0gQXJyYXkuaXNBcnJheShidWZmZXIpID8gbmV3IEZsYXRCdWZmZXJDdXJzb3IoYnVmZmVyLCBidWZmZXIubGVuZ3RoKSA6IGJ1ZmZlcjtcbiAgICBsZXQgdHlwZXMgPSBub2RlU2V0LnR5cGVzO1xuICAgIGxldCBjb250ZXh0SGFzaCA9IDAsIGxvb2tBaGVhZCA9IDA7XG4gICAgZnVuY3Rpb24gdGFrZU5vZGUocGFyZW50U3RhcnQsIG1pblBvcywgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5SZXBlYXQsIGRlcHRoKSB7XG4gICAgICAgIGxldCB7IGlkLCBzdGFydCwgZW5kLCBzaXplIH0gPSBjdXJzb3I7XG4gICAgICAgIGxldCBsb29rQWhlYWRBdFN0YXJ0ID0gbG9va0FoZWFkLCBjb250ZXh0QXRTdGFydCA9IGNvbnRleHRIYXNoO1xuICAgICAgICB3aGlsZSAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PSAtMSAvKiBTcGVjaWFsUmVjb3JkLlJldXNlICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSByZXVzZWRbaWRdO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnQgLSBwYXJlbnRTdGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pIHsgLy8gQ29udGV4dCBjaGFuZ2VcbiAgICAgICAgICAgICAgICBjb250ZXh0SGFzaCA9IGlkO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTQgLyogU3BlY2lhbFJlY29yZC5Mb29rQWhlYWQgKi8pIHtcbiAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5yZWNvZ25pemVkIHJlY29yZCBzaXplOiAke3NpemV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpZF0sIG5vZGUsIGJ1ZmZlcjtcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gc3RhcnQgLSBwYXJlbnRTdGFydDtcbiAgICAgICAgaWYgKGVuZCAtIHN0YXJ0IDw9IG1heEJ1ZmZlckxlbmd0aCAmJiAoYnVmZmVyID0gZmluZEJ1ZmZlclNpemUoY3Vyc29yLnBvcyAtIG1pblBvcywgaW5SZXBlYXQpKSkge1xuICAgICAgICAgICAgLy8gU21hbGwgZW5vdWdoIGZvciBhIGJ1ZmZlciwgYW5kIG5vIHJldXNlZCBub2RlcyBpbnNpZGVcbiAgICAgICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQxNkFycmF5KGJ1ZmZlci5zaXplIC0gYnVmZmVyLnNraXApO1xuICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSBidWZmZXIuc2l6ZSwgaW5kZXggPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gZW5kUG9zKVxuICAgICAgICAgICAgICAgIGluZGV4ID0gY29weVRvQnVmZmVyKGJ1ZmZlci5zdGFydCwgZGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgbm9kZSA9IG5ldyBUcmVlQnVmZmVyKGRhdGEsIGVuZCAtIGJ1ZmZlci5zdGFydCwgbm9kZVNldCk7XG4gICAgICAgICAgICBzdGFydFBvcyA9IGJ1ZmZlci5zdGFydCAtIHBhcmVudFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBNYWtlIGl0IGEgbm9kZVxuICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSBzaXplO1xuICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgICAgICAgICBsZXQgbG9jYWxJblJlcGVhdCA9IGlkID49IG1pblJlcGVhdFR5cGUgPyBpZCA6IC0xO1xuICAgICAgICAgICAgbGV0IGxhc3RHcm91cCA9IDAsIGxhc3RFbmQgPSBlbmQ7XG4gICAgICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IGVuZFBvcykge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID49IDAgJiYgY3Vyc29yLmlkID09IGxvY2FsSW5SZXBlYXQgJiYgY3Vyc29yLnNpemUgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmVuZCA8PSBsYXN0RW5kIC0gbWF4QnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlUmVwZWF0TGVhZihsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgc3RhcnQsIGxhc3RHcm91cCwgY3Vyc29yLmVuZCwgbGFzdEVuZCwgbG9jYWxJblJlcGVhdCwgbG9va0FoZWFkQXRTdGFydCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdyb3VwID0gbG9jYWxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW5kID0gY3Vyc29yLmVuZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXB0aCA+IDI1MDAgLyogQ3V0T2ZmLkRlcHRoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHRha2VGbGF0Tm9kZShzdGFydCwgZW5kUG9zLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YWtlTm9kZShzdGFydCwgZW5kUG9zLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgbG9jYWxJblJlcGVhdCwgZGVwdGggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobG9jYWxJblJlcGVhdCA+PSAwICYmIGxhc3RHcm91cCA+IDAgJiYgbGFzdEdyb3VwIDwgbG9jYWxDaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgbWFrZVJlcGVhdExlYWYobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIHN0YXJ0LCBsYXN0R3JvdXAsIHN0YXJ0LCBsYXN0RW5kLCBsb2NhbEluUmVwZWF0LCBsb29rQWhlYWRBdFN0YXJ0LCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICBsb2NhbENoaWxkcmVuLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb25zLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID4gLTEgJiYgbGFzdEdyb3VwID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBtYWtlID0gbWFrZUJhbGFuY2VkKHR5cGUsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgICAgICBub2RlID0gYmFsYW5jZVJhbmdlKHR5cGUsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCAwLCBsb2NhbENoaWxkcmVuLmxlbmd0aCwgMCwgZW5kIC0gc3RhcnQsIG1ha2UsIG1ha2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG1ha2VUcmVlKHR5cGUsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBlbmQgLSBzdGFydCwgbG9va0FoZWFkQXRTdGFydCAtIGVuZCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0UG9zKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGFrZUZsYXROb2RlKHBhcmVudFN0YXJ0LCBtaW5Qb3MsIGNoaWxkcmVuLCBwb3NpdGlvbnMpIHtcbiAgICAgICAgbGV0IG5vZGVzID0gW107IC8vIFRlbXBvcmFyeSwgaW52ZXJ0ZWQgYXJyYXkgb2YgbGVhZiBub2RlcyBmb3VuZCwgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbnNcbiAgICAgICAgbGV0IG5vZGVDb3VudCA9IDAsIHN0b3BBdCA9IC0xO1xuICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IG1pblBvcykge1xuICAgICAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgICAgIGlmIChzaXplID4gNCkgeyAvLyBOb3QgYSBsZWFmXG4gICAgICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0b3BBdCA+IC0xICYmIHN0YXJ0IDwgc3RvcEF0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcEF0IDwgMClcbiAgICAgICAgICAgICAgICAgICAgc3RvcEF0ID0gZW5kIC0gbWF4QnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2goaWQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgICAgIG5vZGVDb3VudCsrO1xuICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVDb3VudCkge1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50MTZBcnJheShub2RlQ291bnQgKiA0KTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5vZGVzLmxlbmd0aCAtIDMsIGogPSAwOyBpID49IDA7IGkgLT0gMykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbm9kZXNbaV07XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBub2Rlc1tpICsgMV0gLSBzdGFydDtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IG5vZGVzW2kgKyAyXSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobmV3IFRyZWVCdWZmZXIoYnVmZmVyLCBub2Rlc1syXSAtIHN0YXJ0LCBub2RlU2V0KSk7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChzdGFydCAtIHBhcmVudFN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlQmFsYW5jZWQodHlwZSwgY29udGV4dEhhc2gpIHtcbiAgICAgICAgcmV0dXJuIChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IHtcbiAgICAgICAgICAgIGxldCBsb29rQWhlYWQgPSAwLCBsYXN0SSA9IGNoaWxkcmVuLmxlbmd0aCAtIDEsIGxhc3QsIGxvb2tBaGVhZFByb3A7XG4gICAgICAgICAgICBpZiAobGFzdEkgPj0gMCAmJiAobGFzdCA9IGNoaWxkcmVuW2xhc3RJXSkgaW5zdGFuY2VvZiBUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsYXN0SSAmJiBsYXN0LnR5cGUgPT0gdHlwZSAmJiBsYXN0Lmxlbmd0aCA9PSBsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICAgICAgICAgIGlmIChsb29rQWhlYWRQcm9wID0gbGFzdC5wcm9wKE5vZGVQcm9wLmxvb2tBaGVhZCkpXG4gICAgICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IHBvc2l0aW9uc1tsYXN0SV0gKyBsYXN0Lmxlbmd0aCArIGxvb2tBaGVhZFByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFrZVRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCBsb29rQWhlYWQsIGNvbnRleHRIYXNoKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZVJlcGVhdExlYWYoY2hpbGRyZW4sIHBvc2l0aW9ucywgYmFzZSwgaSwgZnJvbSwgdG8sIHR5cGUsIGxvb2tBaGVhZCwgY29udGV4dEhhc2gpIHtcbiAgICAgICAgbGV0IGxvY2FsQ2hpbGRyZW4gPSBbXSwgbG9jYWxQb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgd2hpbGUgKGNoaWxkcmVuLmxlbmd0aCA+IGkpIHtcbiAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaChjaGlsZHJlbi5wb3AoKSk7XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5wdXNoKHBvc2l0aW9ucy5wb3AoKSArIGJhc2UgLSBmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5wdXNoKG1ha2VUcmVlKG5vZGVTZXQudHlwZXNbdHlwZV0sIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCB0byAtIGZyb20sIGxvb2tBaGVhZCAtIHRvLCBjb250ZXh0SGFzaCkpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gYmFzZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgbG9va0FoZWFkLCBjb250ZXh0SGFzaCwgcHJvcHMpIHtcbiAgICAgICAgaWYgKGNvbnRleHRIYXNoKSB7XG4gICAgICAgICAgICBsZXQgcGFpciA9IFtOb2RlUHJvcC5jb250ZXh0SGFzaCwgY29udGV4dEhhc2hdO1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyA/IFtwYWlyXS5jb25jYXQocHJvcHMpIDogW3BhaXJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb29rQWhlYWQgPiAyNSkge1xuICAgICAgICAgICAgbGV0IHBhaXIgPSBbTm9kZVByb3AubG9va0FoZWFkLCBsb29rQWhlYWRdO1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyA/IFtwYWlyXS5jb25jYXQocHJvcHMpIDogW3BhaXJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIHByb3BzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZEJ1ZmZlclNpemUobWF4U2l6ZSwgaW5SZXBlYXQpIHtcbiAgICAgICAgLy8gU2NhbiB0aHJvdWdoIHRoZSBidWZmZXIgdG8gZmluZCBwcmV2aW91cyBzaWJsaW5ncyB0aGF0IGZpdFxuICAgICAgICAvLyB0b2dldGhlciBpbiBhIFRyZWVCdWZmZXIsIGFuZCBkb24ndCBjb250YWluIGFueSByZXVzZWQgbm9kZXNcbiAgICAgICAgLy8gKHdoaWNoIGNhbid0IGJlIHN0b3JlZCBpbiBhIGJ1ZmZlcikuXG4gICAgICAgIC8vIElmIGBpblJlcGVhdGAgaXMgPiAtMSwgaWdub3JlIG5vZGUgYm91bmRhcmllcyBvZiB0aGF0IHR5cGUgZm9yXG4gICAgICAgIC8vIG5lc3RpbmcsIGJ1dCBtYWtlIHN1cmUgdGhlIGVuZCBmYWxscyBlaXRoZXIgYXQgdGhlIHN0YXJ0XG4gICAgICAgIC8vIChgbWF4U2l6ZWApIG9yIGJlZm9yZSBzdWNoIGEgbm9kZS5cbiAgICAgICAgbGV0IGZvcmsgPSBjdXJzb3IuZm9yaygpO1xuICAgICAgICBsZXQgc2l6ZSA9IDAsIHN0YXJ0ID0gMCwgc2tpcCA9IDAsIG1pblN0YXJ0ID0gZm9yay5lbmQgLSBtYXhCdWZmZXJMZW5ndGg7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHNpemU6IDAsIHN0YXJ0OiAwLCBza2lwOiAwIH07XG4gICAgICAgIHNjYW46IGZvciAobGV0IG1pblBvcyA9IGZvcmsucG9zIC0gbWF4U2l6ZTsgZm9yay5wb3MgPiBtaW5Qb3M7KSB7XG4gICAgICAgICAgICBsZXQgbm9kZVNpemUgPSBmb3JrLnNpemU7XG4gICAgICAgICAgICAvLyBQcmV0ZW5kIG5lc3RlZCByZXBlYXQgbm9kZXMgb2YgdGhlIHNhbWUgdHlwZSBkb24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKGZvcmsuaWQgPT0gaW5SZXBlYXQgJiYgbm9kZVNpemUgPj0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2VwdCB0aGF0IHdlIHN0b3JlIHRoZSBjdXJyZW50IHN0YXRlIGFzIGEgdmFsaWQgcmV0dXJuXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNpemUgPSBzaXplO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgIHJlc3VsdC5za2lwID0gc2tpcDtcbiAgICAgICAgICAgICAgICBza2lwICs9IDQ7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSA0O1xuICAgICAgICAgICAgICAgIGZvcmsubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0YXJ0UG9zID0gZm9yay5wb3MgLSBub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChub2RlU2l6ZSA8IDAgfHwgc3RhcnRQb3MgPCBtaW5Qb3MgfHwgZm9yay5zdGFydCA8IG1pblN0YXJ0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IGxvY2FsU2tpcHBlZCA9IGZvcmsuaWQgPj0gbWluUmVwZWF0VHlwZSA/IDQgOiAwO1xuICAgICAgICAgICAgbGV0IG5vZGVTdGFydCA9IGZvcmsuc3RhcnQ7XG4gICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgIHdoaWxlIChmb3JrLnBvcyA+IHN0YXJ0UG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcmsuc2l6ZSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmsuc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFNraXBwZWQgKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9yay5pZCA+PSBtaW5SZXBlYXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU2tpcHBlZCArPSA0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXJ0ID0gbm9kZVN0YXJ0O1xuICAgICAgICAgICAgc2l6ZSArPSBub2RlU2l6ZTtcbiAgICAgICAgICAgIHNraXAgKz0gbG9jYWxTa2lwcGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpblJlcGVhdCA8IDAgfHwgc2l6ZSA9PSBtYXhTaXplKSB7XG4gICAgICAgICAgICByZXN1bHQuc2l6ZSA9IHNpemU7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgIHJlc3VsdC5za2lwID0gc2tpcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnNpemUgPiA0ID8gcmVzdWx0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb3B5VG9CdWZmZXIoYnVmZmVyU3RhcnQsIGJ1ZmZlciwgaW5kZXgpIHtcbiAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgaWYgKHNpemUgPj0gMCAmJiBpZCA8IG1pblJlcGVhdFR5cGUpIHtcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kUG9zID0gY3Vyc29yLnBvcyAtIChzaXplIC0gNCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBlbmRQb3MpXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gY29weVRvQnVmZmVyKGJ1ZmZlclN0YXJ0LCBidWZmZXIsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IHN0YXJ0SW5kZXg7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBlbmQgLSBidWZmZXJTdGFydDtcbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IHN0YXJ0IC0gYnVmZmVyU3RhcnQ7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaXplID09IC0zIC8qIFNwZWNpYWxSZWNvcmQuQ29udGV4dENoYW5nZSAqLykge1xuICAgICAgICAgICAgY29udGV4dEhhc2ggPSBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaXplID09IC00IC8qIFNwZWNpYWxSZWNvcmQuTG9va0FoZWFkICovKSB7XG4gICAgICAgICAgICBsb29rQWhlYWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGxldCBjaGlsZHJlbiA9IFtdLCBwb3NpdGlvbnMgPSBbXTtcbiAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IDApXG4gICAgICAgIHRha2VOb2RlKGRhdGEuc3RhcnQgfHwgMCwgZGF0YS5idWZmZXJTdGFydCB8fCAwLCBjaGlsZHJlbiwgcG9zaXRpb25zLCAtMSwgMCk7XG4gICAgbGV0IGxlbmd0aCA9IChfYSA9IGRhdGEubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoY2hpbGRyZW4ubGVuZ3RoID8gcG9zaXRpb25zWzBdICsgY2hpbGRyZW5bMF0ubGVuZ3RoIDogMCk7XG4gICAgcmV0dXJuIG5ldyBUcmVlKHR5cGVzW2RhdGEudG9wSURdLCBjaGlsZHJlbi5yZXZlcnNlKCksIHBvc2l0aW9ucy5yZXZlcnNlKCksIGxlbmd0aCk7XG59XG5jb25zdCBub2RlU2l6ZUNhY2hlID0gbmV3IFdlYWtNYXA7XG5mdW5jdGlvbiBub2RlU2l6ZShiYWxhbmNlVHlwZSwgbm9kZSkge1xuICAgIGlmICghYmFsYW5jZVR5cGUuaXNBbm9ueW1vdXMgfHwgbm9kZSBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHwgbm9kZS50eXBlICE9IGJhbGFuY2VUeXBlKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBsZXQgc2l6ZSA9IG5vZGVTaXplQ2FjaGUuZ2V0KG5vZGUpO1xuICAgIGlmIChzaXplID09IG51bGwpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlICE9IGJhbGFuY2VUeXBlIHx8ICEoY2hpbGQgaW5zdGFuY2VvZiBUcmVlKSkge1xuICAgICAgICAgICAgICAgIHNpemUgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2l6ZSArPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVTaXplQ2FjaGUuc2V0KG5vZGUsIHNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbmZ1bmN0aW9uIGJhbGFuY2VSYW5nZShcbi8vIFRoZSB0eXBlIHRoZSBiYWxhbmNlZCB0cmVlJ3MgaW5uZXIgbm9kZXMuXG5iYWxhbmNlVHlwZSwgXG4vLyBUaGUgZGlyZWN0IGNoaWxkcmVuIGFuZCB0aGVpciBwb3NpdGlvbnNcbmNoaWxkcmVuLCBwb3NpdGlvbnMsIFxuLy8gVGhlIGluZGV4IHJhbmdlIGluIGNoaWxkcmVuL3Bvc2l0aW9ucyB0byB1c2VcbmZyb20sIHRvLCBcbi8vIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbm9kZXMsIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudC5cbnN0YXJ0LCBcbi8vIExlbmd0aCBvZiB0aGUgb3V0ZXIgbm9kZVxubGVuZ3RoLCBcbi8vIEZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSB0b3Agbm9kZSBvZiB0aGUgYmFsYW5jZWQgdHJlZVxubWtUb3AsIFxuLy8gRnVuY3Rpb24gdG8gYnVpbGQgaW50ZXJuYWwgbm9kZXMgZm9yIHRoZSBiYWxhbmNlZCB0cmVlXG5ta1RyZWUpIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKylcbiAgICAgICAgdG90YWwgKz0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICBsZXQgbWF4Q2hpbGQgPSBNYXRoLmNlaWwoKHRvdGFsICogMS41KSAvIDggLyogQmFsYW5jZS5CcmFuY2hGYWN0b3IgKi8pO1xuICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgZnVuY3Rpb24gZGl2aWRlKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGZyb20sIHRvLCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzspIHtcbiAgICAgICAgICAgIGxldCBncm91cEZyb20gPSBpLCBncm91cFN0YXJ0ID0gcG9zaXRpb25zW2ldLCBncm91cFNpemUgPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgZm9yICg7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRTaXplID0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBTaXplICsgbmV4dFNpemUgPj0gbWF4Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGdyb3VwU2l6ZSArPSBuZXh0U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID09IGdyb3VwRnJvbSArIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBTaXplID4gbWF4Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9ubHkgPSBjaGlsZHJlbltncm91cEZyb21dOyAvLyBPbmx5IHRyZWVzIGNhbiBoYXZlIGEgc2l6ZSA+IDFcbiAgICAgICAgICAgICAgICAgICAgZGl2aWRlKG9ubHkuY2hpbGRyZW4sIG9ubHkucG9zaXRpb25zLCAwLCBvbmx5LmNoaWxkcmVuLmxlbmd0aCwgcG9zaXRpb25zW2dyb3VwRnJvbV0gKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5wdXNoKGNoaWxkcmVuW2dyb3VwRnJvbV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9uc1tpIC0gMV0gKyBjaGlsZHJlbltpIC0gMV0ubGVuZ3RoIC0gZ3JvdXBTdGFydDtcbiAgICAgICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goYmFsYW5jZVJhbmdlKGJhbGFuY2VUeXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBncm91cEZyb20sIGksIGdyb3VwU3RhcnQsIGxlbmd0aCwgbnVsbCwgbWtUcmVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5wdXNoKGdyb3VwU3RhcnQgKyBvZmZzZXQgLSBzdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGl2aWRlKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGZyb20sIHRvLCAwKTtcbiAgICByZXR1cm4gKG1rVG9wIHx8IG1rVHJlZSkobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIGxlbmd0aCk7XG59XG4vKipcblByb3ZpZGVzIGEgd2F5IHRvIGFzc29jaWF0ZSB2YWx1ZXMgd2l0aCBwaWVjZXMgb2YgdHJlZXMuIEFzIGxvbmdcbmFzIHRoYXQgcGFydCBvZiB0aGUgdHJlZSBpcyByZXVzZWQsIHRoZSBhc3NvY2lhdGVkIHZhbHVlcyBjYW4gYmVcbnJldHJpZXZlZCBmcm9tIGFuIHVwZGF0ZWQgdHJlZS5cbiovXG5jbGFzcyBOb2RlV2Vha01hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICB9XG4gICAgc2V0QnVmZmVyKGJ1ZmZlciwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMubWFwLmdldChidWZmZXIpO1xuICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGJ1ZmZlciwgaW5uZXIgPSBuZXcgTWFwKTtcbiAgICAgICAgaW5uZXIuc2V0KGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICAgIGdldEJ1ZmZlcihidWZmZXIsIGluZGV4KSB7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMubWFwLmdldChidWZmZXIpO1xuICAgICAgICByZXR1cm4gaW5uZXIgJiYgaW5uZXIuZ2V0KGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IHRoZSB2YWx1ZSBmb3IgdGhpcyBzeW50YXggbm9kZS5cbiAgICAqL1xuICAgIHNldChub2RlLCB2YWx1ZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEJ1ZmZlck5vZGUpXG4gICAgICAgICAgICB0aGlzLnNldEJ1ZmZlcihub2RlLmNvbnRleHQuYnVmZmVyLCBub2RlLmluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSlcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChub2RlLnRyZWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdmFsdWUgZm9yIHRoaXMgc3ludGF4IG5vZGUsIGlmIGl0IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICovXG4gICAgZ2V0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBCdWZmZXJOb2RlID8gdGhpcy5nZXRCdWZmZXIobm9kZS5jb250ZXh0LmJ1ZmZlciwgbm9kZS5pbmRleClcbiAgICAgICAgICAgIDogbm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlID8gdGhpcy5tYXAuZ2V0KG5vZGUudHJlZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCB0aGUgdmFsdWUgZm9yIHRoZSBub2RlIHRoYXQgYSBjdXJzb3IgY3VycmVudGx5IHBvaW50cyB0by5cbiAgICAqL1xuICAgIGN1cnNvclNldChjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIGlmIChjdXJzb3IuYnVmZmVyKVxuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXIoY3Vyc29yLmJ1ZmZlci5idWZmZXIsIGN1cnNvci5pbmRleCwgdmFsdWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoY3Vyc29yLnRyZWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdGhlIHZhbHVlIGZvciB0aGUgbm9kZSB0aGF0IGEgY3Vyc29yIGN1cnJlbnRseSBwb2ludHNcbiAgICB0by5cbiAgICAqL1xuICAgIGN1cnNvckdldChjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvci5idWZmZXIgPyB0aGlzLmdldEJ1ZmZlcihjdXJzb3IuYnVmZmVyLmJ1ZmZlciwgY3Vyc29yLmluZGV4KSA6IHRoaXMubWFwLmdldChjdXJzb3IudHJlZSk7XG4gICAgfVxufVxuXG4vKipcblRyZWUgZnJhZ21lbnRzIGFyZSB1c2VkIGR1cmluZyBbaW5jcmVtZW50YWxcbnBhcnNpbmddKCNjb21tb24uUGFyc2VyLnN0YXJ0UGFyc2UpIHRvIHRyYWNrIHBhcnRzIG9mIG9sZCB0cmVlc1xudGhhdCBjYW4gYmUgcmV1c2VkIGluIGEgbmV3IHBhcnNlLiBBbiBhcnJheSBvZiBmcmFnbWVudHMgaXMgdXNlZFxudG8gdHJhY2sgcmVnaW9ucyBvZiBhbiBvbGQgdHJlZSB3aG9zZSBub2RlcyBtaWdodCBiZSByZXVzZWQgaW4gbmV3XG5wYXJzZXMuIFVzZSB0aGUgc3RhdGljXG5bYGFwcGx5Q2hhbmdlc2BdKCNjb21tb24uVHJlZUZyYWdtZW50XmFwcGx5Q2hhbmdlcykgbWV0aG9kIHRvXG51cGRhdGUgZnJhZ21lbnRzIGZvciBkb2N1bWVudCBjaGFuZ2VzLlxuKi9cbmNsYXNzIFRyZWVGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgdHJlZSBmcmFnbWVudC4gWW91J2xsIHVzdWFsbHkgd2FudCB0byB1c2VcbiAgICBbYGFkZFRyZWVgXSgjY29tbW9uLlRyZWVGcmFnbWVudF5hZGRUcmVlKSBhbmRcbiAgICBbYGFwcGx5Q2hhbmdlc2BdKCNjb21tb24uVHJlZUZyYWdtZW50XmFwcGx5Q2hhbmdlcykgaW5zdGVhZCBvZlxuICAgIGNhbGxpbmcgdGhpcyBkaXJlY3RseS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgdW5jaGFuZ2VkIHJhbmdlIHBvaW50ZWQgdG8gYnkgdGhpcyBmcmFnbWVudC5cbiAgICBUaGlzIHJlZmVycyB0byBhbiBvZmZzZXQgaW4gdGhlIF91cGRhdGVkXyBkb2N1bWVudCAoYXMgb3Bwb3NlZFxuICAgIHRvIHRoZSBvcmlnaW5hbCB0cmVlKS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHVuY2hhbmdlZCByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgdHJlZSB0aGF0IHRoaXMgZnJhZ21lbnQgaXMgYmFzZWQgb24uXG4gICAgKi9cbiAgICB0cmVlLCBcbiAgICAvKipcbiAgICBUaGUgb2Zmc2V0IGJldHdlZW4gdGhlIGZyYWdtZW50J3MgdHJlZSBhbmQgdGhlIGRvY3VtZW50IHRoYXRcbiAgICB0aGlzIGZyYWdtZW50IGNhbiBiZSB1c2VkIGFnYWluc3QuIEFkZCB0aGlzIHdoZW4gZ29pbmcgZnJvbVxuICAgIGRvY3VtZW50IHRvIHRyZWUgcG9zaXRpb25zLCBzdWJ0cmFjdCBpdCB0byBnbyBmcm9tIHRyZWUgdG9cbiAgICBkb2N1bWVudCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBvZmZzZXQsIG9wZW5TdGFydCA9IGZhbHNlLCBvcGVuRW5kID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5vcGVuID0gKG9wZW5TdGFydCA/IDEgLyogT3Blbi5TdGFydCAqLyA6IDApIHwgKG9wZW5FbmQgPyAyIC8qIE9wZW4uRW5kICovIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHN0YXJ0IG9mIHRoZSBmcmFnbWVudCByZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhXG4gICAgcGFyc2UsIG9yIHRoZSBlbmQgb2YgYSBjaGFuZ2UuIChJbiB0aGUgc2Vjb25kIGNhc2UsIGl0IG1heSBub3RcbiAgICBiZSBzYWZlIHRvIHJldXNlIHNvbWUgbm9kZXMgYXQgdGhlIHN0YXJ0LCBkZXBlbmRpbmcgb24gdGhlXG4gICAgcGFyc2luZyBhbGdvcml0aG0uKVxuICAgICovXG4gICAgZ2V0IG9wZW5TdGFydCgpIHsgcmV0dXJuICh0aGlzLm9wZW4gJiAxIC8qIE9wZW4uU3RhcnQgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQgcmVwcmVzZW50cyB0aGUgZW5kIG9mIGFcbiAgICBmdWxsLWRvY3VtZW50IHBhcnNlLCBvciB0aGUgc3RhcnQgb2YgYSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgb3BlbkVuZCgpIHsgcmV0dXJuICh0aGlzLm9wZW4gJiAyIC8qIE9wZW4uRW5kICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgZnJhZ21lbnRzIGZyb20gYSBmcmVzaGx5IHBhcnNlZCB0cmVlLCBvciB1cGRhdGVcbiAgICBhbiBleGlzdGluZyBzZXQgb2YgZnJhZ21lbnRzIGJ5IHJlcGxhY2luZyB0aGUgb25lcyB0aGF0IG92ZXJsYXBcbiAgICB3aXRoIGEgdHJlZSB3aXRoIGNvbnRlbnQgZnJvbSB0aGUgbmV3IHRyZWUuIFdoZW4gYHBhcnRpYWxgIGlzXG4gICAgdHJ1ZSwgdGhlIHBhcnNlIGlzIHRyZWF0ZWQgYXMgaW5jb21wbGV0ZSwgYW5kIHRoZSByZXN1bHRpbmdcbiAgICBmcmFnbWVudCBoYXMgW2BvcGVuRW5kYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnQub3BlbkVuZCkgc2V0IHRvXG4gICAgdHJ1ZS5cbiAgICAqL1xuICAgIHN0YXRpYyBhZGRUcmVlKHRyZWUsIGZyYWdtZW50cyA9IFtdLCBwYXJ0aWFsID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtuZXcgVHJlZUZyYWdtZW50KDAsIHRyZWUubGVuZ3RoLCB0cmVlLCAwLCBmYWxzZSwgcGFydGlhbCldO1xuICAgICAgICBmb3IgKGxldCBmIG9mIGZyYWdtZW50cylcbiAgICAgICAgICAgIGlmIChmLnRvID4gdHJlZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGx5IGEgc2V0IG9mIGVkaXRzIHRvIGFuIGFycmF5IG9mIGZyYWdtZW50cywgcmVtb3Zpbmcgb3JcbiAgICBzcGxpdHRpbmcgZnJhZ21lbnRzIGFzIG5lY2Vzc2FyeSB0byByZW1vdmUgZWRpdGVkIHJhbmdlcywgYW5kXG4gICAgYWRqdXN0aW5nIG9mZnNldHMgZm9yIGZyYWdtZW50cyB0aGF0IG1vdmVkLlxuICAgICovXG4gICAgc3RhdGljIGFwcGx5Q2hhbmdlcyhmcmFnbWVudHMsIGNoYW5nZXMsIG1pbkdhcCA9IDEyOCkge1xuICAgICAgICBpZiAoIWNoYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50cztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZkkgPSAxLCBuZXh0RiA9IGZyYWdtZW50cy5sZW5ndGggPyBmcmFnbWVudHNbMF0gOiBudWxsO1xuICAgICAgICBmb3IgKGxldCBjSSA9IDAsIHBvcyA9IDAsIG9mZiA9IDA7OyBjSSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEMgPSBjSSA8IGNoYW5nZXMubGVuZ3RoID8gY2hhbmdlc1tjSV0gOiBudWxsO1xuICAgICAgICAgICAgbGV0IG5leHRQb3MgPSBuZXh0QyA/IG5leHRDLmZyb21BIDogMWU5O1xuICAgICAgICAgICAgaWYgKG5leHRQb3MgLSBwb3MgPj0gbWluR2FwKVxuICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0RiAmJiBuZXh0Ri5mcm9tIDwgbmV4dFBvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3V0ID0gbmV4dEY7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gY3V0LmZyb20gfHwgbmV4dFBvcyA8PSBjdXQudG8gfHwgb2ZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkZyb20gPSBNYXRoLm1heChjdXQuZnJvbSwgcG9zKSAtIG9mZiwgZlRvID0gTWF0aC5taW4oY3V0LnRvLCBuZXh0UG9zKSAtIG9mZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1dCA9IGZGcm9tID49IGZUbyA/IG51bGwgOiBuZXcgVHJlZUZyYWdtZW50KGZGcm9tLCBmVG8sIGN1dC50cmVlLCBjdXQub2Zmc2V0ICsgb2ZmLCBjSSA+IDAsICEhbmV4dEMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjdXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEYudG8gPiBuZXh0UG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIG5leHRGID0gZkkgPCBmcmFnbWVudHMubGVuZ3RoID8gZnJhZ21lbnRzW2ZJKytdIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRDKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcG9zID0gbmV4dEMudG9BO1xuICAgICAgICAgICAgb2ZmID0gbmV4dEMudG9BIC0gbmV4dEMudG9CO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG5BIHN1cGVyY2xhc3MgdGhhdCBwYXJzZXJzIHNob3VsZCBleHRlbmQuXG4qL1xuY2xhc3MgUGFyc2VyIHtcbiAgICAvKipcbiAgICBTdGFydCBhIHBhcnNlLCByZXR1cm5pbmcgYSBbcGFydGlhbCBwYXJzZV0oI2NvbW1vbi5QYXJ0aWFsUGFyc2UpXG4gICAgb2JqZWN0LiBbYGZyYWdtZW50c2BdKCNjb21tb24uVHJlZUZyYWdtZW50KSBjYW4gYmUgcGFzc2VkIGluIHRvXG4gICAgbWFrZSB0aGUgcGFyc2UgaW5jcmVtZW50YWwuXG4gICAgXG4gICAgQnkgZGVmYXVsdCwgdGhlIGVudGlyZSBpbnB1dCBpcyBwYXJzZWQuIFlvdSBjYW4gcGFzcyBgcmFuZ2VzYCxcbiAgICB3aGljaCBzaG91bGQgYmUgYSBzb3J0ZWQgYXJyYXkgb2Ygbm9uLWVtcHR5LCBub24tb3ZlcmxhcHBpbmdcbiAgICByYW5nZXMsIHRvIHBhcnNlIG9ubHkgdGhvc2UgcmFuZ2VzLiBUaGUgdHJlZSByZXR1cm5lZCBpbiB0aGF0XG4gICAgY2FzZSB3aWxsIHN0YXJ0IGF0IGByYW5nZXNbMF0uZnJvbWAuXG4gICAgKi9cbiAgICBzdGFydFBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICBpbnB1dCA9IG5ldyBTdHJpbmdJbnB1dChpbnB1dCk7XG4gICAgICAgIHJhbmdlcyA9ICFyYW5nZXMgPyBbbmV3IFJhbmdlKDAsIGlucHV0Lmxlbmd0aCldIDogcmFuZ2VzLmxlbmd0aCA/IHJhbmdlcy5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tLCByLnRvKSkgOiBbbmV3IFJhbmdlKDAsIDApXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cyB8fCBbXSwgcmFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUnVuIGEgZnVsbCBwYXJzZSwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAqL1xuICAgIHBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICBsZXQgcGFyc2UgPSB0aGlzLnN0YXJ0UGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGRvbmUgPSBwYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICBpZiAoZG9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFN0cmluZ0lucHV0IHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICBjaHVuayhmcm9tKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tKTsgfVxuICAgIGdldCBsaW5lQ2h1bmtzKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZWFkKGZyb20sIHRvKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tLCB0byk7IH1cbn1cblxuLyoqXG5DcmVhdGUgYSBwYXJzZSB3cmFwcGVyIHRoYXQsIGFmdGVyIHRoZSBpbm5lciBwYXJzZSBjb21wbGV0ZXMsXG5zY2FucyBpdHMgdHJlZSBmb3IgbWl4ZWQgbGFuZ3VhZ2UgcmVnaW9ucyB3aXRoIHRoZSBgbmVzdGBcbmZ1bmN0aW9uLCBydW5zIHRoZSByZXN1bHRpbmcgW2lubmVyIHBhcnNlc10oI2NvbW1vbi5OZXN0ZWRQYXJzZSksXG5hbmQgdGhlbiBbbW91bnRzXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIHRoZWlyIHJlc3VsdHMgb250byB0aGVcbnRyZWUuXG4qL1xuZnVuY3Rpb24gcGFyc2VNaXhlZChuZXN0KSB7XG4gICAgcmV0dXJuIChwYXJzZSwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSA9PiBuZXcgTWl4ZWRQYXJzZShwYXJzZSwgbmVzdCwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbn1cbmNsYXNzIElubmVyUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgcGFyc2UsIG92ZXJsYXksIHRhcmdldCwgZnJvbSkge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IHBhcnNlO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja1JhbmdlcyhyYW5nZXMpIHtcbiAgICBpZiAoIXJhbmdlcy5sZW5ndGggfHwgcmFuZ2VzLnNvbWUociA9PiByLmZyb20gPj0gci50bykpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbm5lciBwYXJzZSByYW5nZXMgZ2l2ZW46IFwiICsgSlNPTi5zdHJpbmdpZnkocmFuZ2VzKSk7XG59XG5jbGFzcyBBY3RpdmVPdmVybGF5IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIHByZWRpY2F0ZSwgbW91bnRzLCBpbmRleCwgc3RhcnQsIHRhcmdldCwgcHJldikge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMubW91bnRzID0gbW91bnRzO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMucHJldiA9IHByZXY7XG4gICAgICAgIHRoaXMuZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IFtdO1xuICAgIH1cbn1cbmNvbnN0IHN0b3BwZWRJbm5lciA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG5jbGFzcyBNaXhlZFBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihiYXNlLCBuZXN0LCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5uZXN0ID0gbmVzdDtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBbXTtcbiAgICAgICAgdGhpcy5pbm5lckRvbmUgPSAwO1xuICAgICAgICB0aGlzLmJhc2VUcmVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmJhc2VQYXJzZSA9IGJhc2U7XG4gICAgfVxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VQYXJzZSkge1xuICAgICAgICAgICAgbGV0IGRvbmUgPSB0aGlzLmJhc2VQYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICBpZiAoIWRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXJzZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmJhc2VUcmVlID0gZG9uZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRJbm5lcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5uZXIgb2YgdGhpcy5pbm5lcilcbiAgICAgICAgICAgICAgICAgICAgaW5uZXIucGFyc2Uuc3RvcEF0KHRoaXMuc3RvcHBlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbm5lckRvbmUgPT0gdGhpcy5pbm5lci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmJhc2VUcmVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRyZWUocmVzdWx0LnR5cGUsIHJlc3VsdC5jaGlsZHJlbiwgcmVzdWx0LnBvc2l0aW9ucywgcmVzdWx0Lmxlbmd0aCwgcmVzdWx0LnByb3BWYWx1ZXMuY29uY2F0KFtbc3RvcHBlZElubmVyLCB0aGlzLnN0b3BwZWRBdF1dKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMuaW5uZXJbdGhpcy5pbm5lckRvbmVdLCBkb25lID0gaW5uZXIucGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgdGhpcy5pbm5lckRvbmUrKztcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBkb2RneSBidXQgc3VwZXIgaGVscGZ1bCBoYWNrIHdoZXJlIHdlXG4gICAgICAgICAgICAvLyBwYXRjaCB1cCBub2RlcyBjcmVhdGVkIGJ5IHRoZSBpbm5lciBwYXJzZSAoYW5kIHRodXNcbiAgICAgICAgICAgIC8vIHByZXN1bWFibHkgbm90IGFsaWFzZWQgYW55d2hlcmUgZWxzZSkgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIC8vIGFib3V0IHRoZSBpbm5lciBwYXJzZS5cbiAgICAgICAgICAgIGxldCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgaW5uZXIudGFyZ2V0LnByb3BzKTtcbiAgICAgICAgICAgIHByb3BzW05vZGVQcm9wLm1vdW50ZWQuaWRdID0gbmV3IE1vdW50ZWRUcmVlKGRvbmUsIGlubmVyLm92ZXJsYXksIGlubmVyLnBhcnNlcik7XG4gICAgICAgICAgICBpbm5lci50YXJnZXQucHJvcHMgPSBwcm9wcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0IHBhcnNlZFBvcygpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVBhcnNlKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLmlucHV0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5uZXJEb25lOyBpIDwgdGhpcy5pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5uZXJbaV0uZnJvbSA8IHBvcylcbiAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihwb3MsIHRoaXMuaW5uZXJbaV0ucGFyc2UucGFyc2VkUG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICBzdG9wQXQocG9zKSB7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gcG9zO1xuICAgICAgICBpZiAodGhpcy5iYXNlUGFyc2UpXG4gICAgICAgICAgICB0aGlzLmJhc2VQYXJzZS5zdG9wQXQocG9zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5uZXJEb25lOyBpIDwgdGhpcy5pbm5lci5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLmlubmVyW2ldLnBhcnNlLnN0b3BBdChwb3MpO1xuICAgIH1cbiAgICBzdGFydElubmVyKCkge1xuICAgICAgICBsZXQgZnJhZ21lbnRDdXJzb3IgPSBuZXcgRnJhZ21lbnRDdXJzb3IodGhpcy5mcmFnbWVudHMpO1xuICAgICAgICBsZXQgb3ZlcmxheSA9IG51bGw7XG4gICAgICAgIGxldCBjb3ZlcmVkID0gbnVsbDtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBUcmVlQ3Vyc29yKG5ldyBUcmVlTm9kZSh0aGlzLmJhc2VUcmVlLCB0aGlzLnJhbmdlc1swXS5mcm9tLCAwLCBudWxsKSwgSXRlck1vZGUuSW5jbHVkZUFub255bW91cyB8IEl0ZXJNb2RlLklnbm9yZU1vdW50cyk7XG4gICAgICAgIHNjYW46IGZvciAobGV0IG5lc3QsIGlzQ292ZXJlZDs7KSB7XG4gICAgICAgICAgICBsZXQgZW50ZXIgPSB0cnVlLCByYW5nZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsICYmIGN1cnNvci5mcm9tID49IHRoaXMuc3RvcHBlZEF0KSB7XG4gICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyYWdtZW50Q3Vyc29yLmhhc05vZGUoY3Vyc29yKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IG92ZXJsYXkubW91bnRzLmZpbmQobSA9PiBtLmZyYWcuZnJvbSA8PSBjdXJzb3IuZnJvbSAmJiBtLmZyYWcudG8gPj0gY3Vyc29yLnRvICYmIG0ubW91bnQub3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgbWF0Y2gubW91bnQub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gci5mcm9tICsgbWF0Y2gucG9zLCB0byA9IHIudG8gKyBtYXRjaC5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gY3Vyc29yLmZyb20gJiYgdG8gPD0gY3Vyc29yLnRvICYmICFvdmVybGF5LnJhbmdlcy5zb21lKHIgPT4gci5mcm9tIDwgdG8gJiYgci50byA+IGZyb20pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlcy5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3ZlcmVkICYmIChpc0NvdmVyZWQgPSBjaGVja0NvdmVyKGNvdmVyZWQucmFuZ2VzLCBjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKSkpIHtcbiAgICAgICAgICAgICAgICBlbnRlciA9IGlzQ292ZXJlZCAhPSAyIC8qIENvdmVyLkZ1bGwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghY3Vyc29yLnR5cGUuaXNBbm9ueW1vdXMgJiYgKG5lc3QgPSB0aGlzLm5lc3QoY3Vyc29yLCB0aGlzLmlucHV0KSkgJiZcbiAgICAgICAgICAgICAgICAoY3Vyc29yLmZyb20gPCBjdXJzb3IudG8gfHwgIW5lc3Qub3ZlcmxheSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci50cmVlKVxuICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgIGxldCBvbGRNb3VudHMgPSBmcmFnbWVudEN1cnNvci5maW5kTW91bnRzKGN1cnNvci5mcm9tLCBuZXN0LnBhcnNlcik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXN0Lm92ZXJsYXkgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgPSBuZXcgQWN0aXZlT3ZlcmxheShuZXN0LnBhcnNlciwgbmVzdC5vdmVybGF5LCBvbGRNb3VudHMsIHRoaXMuaW5uZXIubGVuZ3RoLCBjdXJzb3IuZnJvbSwgY3Vyc29yLnRyZWUsIG92ZXJsYXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHB1bmNoUmFuZ2VzKHRoaXMucmFuZ2VzLCBuZXN0Lm92ZXJsYXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJzb3IuZnJvbSA8IGN1cnNvci50byA/IFtuZXcgUmFuZ2UoY3Vyc29yLmZyb20sIGN1cnNvci50byldIDogW10pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1JhbmdlcyhyYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCB8fCAhbmVzdC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lci5wdXNoKG5ldyBJbm5lclBhcnNlKG5lc3QucGFyc2VyLCByYW5nZXMubGVuZ3RoID8gbmVzdC5wYXJzZXIuc3RhcnRQYXJzZSh0aGlzLmlucHV0LCBlbnRlckZyYWdtZW50cyhvbGRNb3VudHMsIHJhbmdlcyksIHJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5lc3QucGFyc2VyLnN0YXJ0UGFyc2UoXCJcIiksIG5lc3Qub3ZlcmxheSA/IG5lc3Qub3ZlcmxheS5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tIC0gY3Vyc29yLmZyb20sIHIudG8gLSBjdXJzb3IuZnJvbSkpIDogbnVsbCwgY3Vyc29yLnRyZWUsIHJhbmdlcy5sZW5ndGggPyByYW5nZXNbMF0uZnJvbSA6IGN1cnNvci5mcm9tKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmVzdC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSB7IHJhbmdlcywgZGVwdGg6IDAsIHByZXY6IGNvdmVyZWQgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdmVybGF5ICYmIChyYW5nZSA9IG92ZXJsYXkucHJlZGljYXRlKGN1cnNvcikpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbSA8IHJhbmdlLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gb3ZlcmxheS5yYW5nZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPj0gMCAmJiBvdmVybGF5LnJhbmdlc1tsYXN0XS50byA9PSByYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5yYW5nZXNbbGFzdF0gPSB7IGZyb206IG92ZXJsYXkucmFuZ2VzW2xhc3RdLmZyb20sIHRvOiByYW5nZS50byB9O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlcy5wdXNoKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW50ZXIgJiYgY3Vyc29yLmZpcnN0Q2hpbGQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5LmRlcHRoKys7XG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyZWQuZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkgJiYgIS0tb3ZlcmxheS5kZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHB1bmNoUmFuZ2VzKHRoaXMucmFuZ2VzLCBvdmVybGF5LnJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmFuZ2VzKHJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lci5zcGxpY2Uob3ZlcmxheS5pbmRleCwgMCwgbmV3IElubmVyUGFyc2Uob3ZlcmxheS5wYXJzZXIsIG92ZXJsYXkucGFyc2VyLnN0YXJ0UGFyc2UodGhpcy5pbnB1dCwgZW50ZXJGcmFnbWVudHMob3ZlcmxheS5tb3VudHMsIHJhbmdlcyksIHJhbmdlcyksIG92ZXJsYXkucmFuZ2VzLm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20gLSBvdmVybGF5LnN0YXJ0LCByLnRvIC0gb3ZlcmxheS5zdGFydCkpLCBvdmVybGF5LnRhcmdldCwgcmFuZ2VzWzBdLmZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgPSBvdmVybGF5LnByZXY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdmVyZWQgJiYgIS0tY292ZXJlZC5kZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSBjb3ZlcmVkLnByZXY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tDb3Zlcihjb3ZlcmVkLCBmcm9tLCB0bykge1xuICAgIGZvciAobGV0IHJhbmdlIG9mIGNvdmVyZWQpIHtcbiAgICAgICAgaWYgKHJhbmdlLmZyb20gPj0gdG8pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHJhbmdlLnRvID4gZnJvbSlcbiAgICAgICAgICAgIHJldHVybiByYW5nZS5mcm9tIDw9IGZyb20gJiYgcmFuZ2UudG8gPj0gdG8gPyAyIC8qIENvdmVyLkZ1bGwgKi8gOiAxIC8qIENvdmVyLlBhcnRpYWwgKi87XG4gICAgfVxuICAgIHJldHVybiAwIC8qIENvdmVyLk5vbmUgKi87XG59XG4vLyBUYWtlIGEgcGllY2Ugb2YgYnVmZmVyIGFuZCBjb252ZXJ0IGl0IGludG8gYSBzdGFuZC1hbG9uZVxuLy8gVHJlZUJ1ZmZlci5cbmZ1bmN0aW9uIHNsaWNlQnVmKGJ1Ziwgc3RhcnRJLCBlbmRJLCBub2RlcywgcG9zaXRpb25zLCBvZmYpIHtcbiAgICBpZiAoc3RhcnRJIDwgZW5kSSkge1xuICAgICAgICBsZXQgZnJvbSA9IGJ1Zi5idWZmZXJbc3RhcnRJICsgMV07XG4gICAgICAgIG5vZGVzLnB1c2goYnVmLnNsaWNlKHN0YXJ0SSwgZW5kSSwgZnJvbSkpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gb2ZmKTtcbiAgICB9XG59XG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbm9kZSB0aGF0J3MgaW4gYSBidWZmZXIsIGFuZCBjb252ZXJ0cyBpdCwgYW5kXG4vLyBpdHMgcGFyZW50IGJ1ZmZlciBub2RlcywgaW50byBhIFRyZWUuIFRoaXMgaXMgYWdhaW4gYWN0aW5nIG9uIHRoZVxuLy8gYXNzdW1wdGlvbiB0aGF0IHRoZSB0cmVlcyBhbmQgYnVmZmVycyBoYXZlIGJlZW4gY29uc3RydWN0ZWQgYnkgdGhlXG4vLyBwYXJzZSB0aGF0IHdhcyByYW4gdmlhIHRoZSBtaXggcGFyc2VyLCBhbmQgdGh1cyBhcmVuJ3Qgc2hhcmVkIHdpdGhcbi8vIGFueSBvdGhlciBjb2RlLCBtYWtpbmcgdmlvbGF0aW9ucyBvZiB0aGUgaW1tdXRhYmlsaXR5IHNhZmUuXG5mdW5jdGlvbiBtYXRlcmlhbGl6ZShjdXJzb3IpIHtcbiAgICBsZXQgeyBub2RlIH0gPSBjdXJzb3IsIHN0YWNrID0gW107XG4gICAgbGV0IGJ1ZmZlciA9IG5vZGUuY29udGV4dC5idWZmZXI7XG4gICAgLy8gU2NhbiB1cCB0byB0aGUgbmVhcmVzdCB0cmVlXG4gICAgZG8ge1xuICAgICAgICBzdGFjay5wdXNoKGN1cnNvci5pbmRleCk7XG4gICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICB9IHdoaWxlICghY3Vyc29yLnRyZWUpO1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBidWZmZXIgaW4gdGhhdCB0cmVlXG4gICAgbGV0IGJhc2UgPSBjdXJzb3IudHJlZSwgaSA9IGJhc2UuY2hpbGRyZW4uaW5kZXhPZihidWZmZXIpO1xuICAgIGxldCBidWYgPSBiYXNlLmNoaWxkcmVuW2ldLCBiID0gYnVmLmJ1ZmZlciwgbmV3U3RhY2sgPSBbaV07XG4gICAgLy8gU3BsaXQgYSBsZXZlbCBpbiB0aGUgYnVmZmVyLCBwdXR0aW5nIHRoZSBub2RlcyBiZWZvcmUgYW5kIGFmdGVyXG4gICAgLy8gdGhlIGNoaWxkIHRoYXQgY29udGFpbnMgYG5vZGVgIGludG8gbmV3IGJ1ZmZlcnMuXG4gICAgZnVuY3Rpb24gc3BsaXQoc3RhcnRJLCBlbmRJLCB0eXBlLCBpbm5lck9mZnNldCwgbGVuZ3RoLCBzdGFja1Bvcykge1xuICAgICAgICBsZXQgdGFyZ2V0SSA9IHN0YWNrW3N0YWNrUG9zXTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBzbGljZUJ1ZihidWYsIHN0YXJ0SSwgdGFyZ2V0SSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5uZXJPZmZzZXQpO1xuICAgICAgICBsZXQgZnJvbSA9IGJbdGFyZ2V0SSArIDFdLCB0byA9IGJbdGFyZ2V0SSArIDJdO1xuICAgICAgICBuZXdTdGFjay5wdXNoKGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIGxldCBjaGlsZCA9IHN0YWNrUG9zXG4gICAgICAgICAgICA/IHNwbGl0KHRhcmdldEkgKyA0LCBiW3RhcmdldEkgKyAzXSwgYnVmLnNldC50eXBlc1tiW3RhcmdldEldXSwgZnJvbSwgdG8gLSBmcm9tLCBzdGFja1BvcyAtIDEpXG4gICAgICAgICAgICA6IG5vZGUudG9UcmVlKCk7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gaW5uZXJPZmZzZXQpO1xuICAgICAgICBzbGljZUJ1ZihidWYsIGJbdGFyZ2V0SSArIDNdLCBlbmRJLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBpbm5lck9mZnNldCk7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpO1xuICAgIH1cbiAgICBiYXNlLmNoaWxkcmVuW2ldID0gc3BsaXQoMCwgYi5sZW5ndGgsIE5vZGVUeXBlLm5vbmUsIDAsIGJ1Zi5sZW5ndGgsIHN0YWNrLmxlbmd0aCAtIDEpO1xuICAgIC8vIE1vdmUgdGhlIGN1cnNvciBiYWNrIHRvIHRoZSB0YXJnZXQgbm9kZVxuICAgIGZvciAobGV0IGluZGV4IG9mIG5ld1N0YWNrKSB7XG4gICAgICAgIGxldCB0cmVlID0gY3Vyc29yLnRyZWUuY2hpbGRyZW5baW5kZXhdLCBwb3MgPSBjdXJzb3IudHJlZS5wb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICBjdXJzb3IueWllbGQobmV3IFRyZWVOb2RlKHRyZWUsIHBvcyArIGN1cnNvci5mcm9tLCBpbmRleCwgY3Vyc29yLl90cmVlKSk7XG4gICAgfVxufVxuY2xhc3MgU3RydWN0dXJlQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcihyb290LCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnNvciA9IHJvb3QuY3Vyc29yKEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMgfCBJdGVyTW9kZS5JZ25vcmVNb3VudHMpO1xuICAgIH1cbiAgICAvLyBNb3ZlIHRvIHRoZSBmaXJzdCBub2RlIChpbiBwcmUtb3JkZXIpIHRoYXQgc3RhcnRzIGF0IG9yIGFmdGVyIGBwb3NgLlxuICAgIG1vdmVUbyhwb3MpIHtcbiAgICAgICAgbGV0IHsgY3Vyc29yIH0gPSB0aGlzLCBwID0gcG9zIC0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIHdoaWxlICghdGhpcy5kb25lICYmIGN1cnNvci5mcm9tIDwgcCkge1xuICAgICAgICAgICAgaWYgKGN1cnNvci50byA+PSBwb3MgJiYgY3Vyc29yLmVudGVyKHAsIDEsIEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzIHwgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpKSA7XG4gICAgICAgICAgICBlbHNlIGlmICghY3Vyc29yLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzTm9kZShjdXJzb3IpIHtcbiAgICAgICAgdGhpcy5tb3ZlVG8oY3Vyc29yLmZyb20pO1xuICAgICAgICBpZiAoIXRoaXMuZG9uZSAmJiB0aGlzLmN1cnNvci5mcm9tICsgdGhpcy5vZmZzZXQgPT0gY3Vyc29yLmZyb20gJiYgdGhpcy5jdXJzb3IudHJlZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgdHJlZSA9IHRoaXMuY3Vyc29yLnRyZWU7Oykge1xuICAgICAgICAgICAgICAgIGlmICh0cmVlID09IGN1cnNvci50cmVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHJlZS5jaGlsZHJlbi5sZW5ndGggJiYgdHJlZS5wb3NpdGlvbnNbMF0gPT0gMCAmJiB0cmVlLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgVHJlZSlcbiAgICAgICAgICAgICAgICAgICAgdHJlZSA9IHRyZWUuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuY2xhc3MgRnJhZ21lbnRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGZyYWdtZW50cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLmN1clRvID0gMDtcbiAgICAgICAgdGhpcy5mcmFnSSA9IDA7XG4gICAgICAgIGlmIChmcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0aGlzLmN1ckZyYWcgPSBmcmFnbWVudHNbMF07XG4gICAgICAgICAgICB0aGlzLmN1clRvID0gKF9hID0gZmlyc3QudHJlZS5wcm9wKHN0b3BwZWRJbm5lcikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZpcnN0LnRvO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBTdHJ1Y3R1cmVDdXJzb3IoZmlyc3QudHJlZSwgLWZpcnN0Lm9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1ckZyYWcgPSB0aGlzLmlubmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNOb2RlKG5vZGUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VyRnJhZyAmJiBub2RlLmZyb20gPj0gdGhpcy5jdXJUbylcbiAgICAgICAgICAgIHRoaXMubmV4dEZyYWcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyRnJhZyAmJiB0aGlzLmN1ckZyYWcuZnJvbSA8PSBub2RlLmZyb20gJiYgdGhpcy5jdXJUbyA+PSBub2RlLnRvICYmIHRoaXMuaW5uZXIuaGFzTm9kZShub2RlKTtcbiAgICB9XG4gICAgbmV4dEZyYWcoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5mcmFnSSsrO1xuICAgICAgICBpZiAodGhpcy5mcmFnSSA9PSB0aGlzLmZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyRnJhZyA9IHRoaXMuaW5uZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyYWcgPSB0aGlzLmN1ckZyYWcgPSB0aGlzLmZyYWdtZW50c1t0aGlzLmZyYWdJXTtcbiAgICAgICAgICAgIHRoaXMuY3VyVG8gPSAoX2EgPSBmcmFnLnRyZWUucHJvcChzdG9wcGVkSW5uZXIpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmcmFnLnRvO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBTdHJ1Y3R1cmVDdXJzb3IoZnJhZy50cmVlLCAtZnJhZy5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRNb3VudHMocG9zLCBwYXJzZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0aGlzLmlubmVyKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVyLmN1cnNvci5tb3ZlVG8ocG9zLCAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IHRoaXMuaW5uZXIuY3Vyc29yLm5vZGU7IHBvczsgcG9zID0gcG9zLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCBtb3VudCA9IChfYSA9IHBvcy50cmVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHJvcChOb2RlUHJvcC5tb3VudGVkKTtcbiAgICAgICAgICAgICAgICBpZiAobW91bnQgJiYgbW91bnQucGFyc2VyID09IHBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5mcmFnSTsgaSA8IHRoaXMuZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJhZyA9IHRoaXMuZnJhZ21lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWcuZnJvbSA+PSBwb3MudG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZy50cmVlID09IHRoaXMuY3VyRnJhZy50cmVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3MuZnJvbSAtIGZyYWcub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gcHVuY2hSYW5nZXMob3V0ZXIsIHJhbmdlcykge1xuICAgIGxldCBjb3B5ID0gbnVsbCwgY3VycmVudCA9IHJhbmdlcztcbiAgICBmb3IgKGxldCBpID0gMSwgaiA9IDA7IGkgPCBvdXRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZ2FwRnJvbSA9IG91dGVyW2kgLSAxXS50bywgZ2FwVG8gPSBvdXRlcltpXS5mcm9tO1xuICAgICAgICBmb3IgKDsgaiA8IGN1cnJlbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCByID0gY3VycmVudFtqXTtcbiAgICAgICAgICAgIGlmIChyLmZyb20gPj0gZ2FwVG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoci50byA8PSBnYXBGcm9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjb3B5ID0gcmFuZ2VzLnNsaWNlKCk7XG4gICAgICAgICAgICBpZiAoci5mcm9tIDwgZ2FwRnJvbSkge1xuICAgICAgICAgICAgICAgIGNvcHlbal0gPSBuZXcgUmFuZ2Uoci5mcm9tLCBnYXBGcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoci50byA+IGdhcFRvKVxuICAgICAgICAgICAgICAgICAgICBjb3B5LnNwbGljZShqICsgMSwgMCwgbmV3IFJhbmdlKGdhcFRvLCByLnRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyLnRvID4gZ2FwVG8pIHtcbiAgICAgICAgICAgICAgICBjb3B5W2otLV0gPSBuZXcgUmFuZ2UoZ2FwVG8sIHIudG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29weS5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmZ1bmN0aW9uIGZpbmRDb3ZlckNoYW5nZXMoYSwgYiwgZnJvbSwgdG8pIHtcbiAgICBsZXQgaUEgPSAwLCBpQiA9IDAsIGluQSA9IGZhbHNlLCBpbkIgPSBmYWxzZSwgcG9zID0gLTFlOTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgbmV4dEEgPSBpQSA9PSBhLmxlbmd0aCA/IDFlOSA6IGluQSA/IGFbaUFdLnRvIDogYVtpQV0uZnJvbTtcbiAgICAgICAgbGV0IG5leHRCID0gaUIgPT0gYi5sZW5ndGggPyAxZTkgOiBpbkIgPyBiW2lCXS50byA6IGJbaUJdLmZyb207XG4gICAgICAgIGlmIChpbkEgIT0gaW5CKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChwb3MsIGZyb20pLCBlbmQgPSBNYXRoLm1pbihuZXh0QSwgbmV4dEIsIHRvKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZClcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgUmFuZ2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IE1hdGgubWluKG5leHRBLCBuZXh0Qik7XG4gICAgICAgIGlmIChwb3MgPT0gMWU5KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChuZXh0QSA9PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICghaW5BKVxuICAgICAgICAgICAgICAgIGluQSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbkEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpQSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0QiA9PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICghaW5CKVxuICAgICAgICAgICAgICAgIGluQiA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbkIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpQisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBHaXZlbiBhIG51bWJlciBvZiBmcmFnbWVudHMgZm9yIHRoZSBvdXRlciB0cmVlLCBhbmQgYSBzZXQgb2YgcmFuZ2VzXG4vLyB0byBwYXJzZSwgZmluZCBmcmFnbWVudHMgZm9yIGlubmVyIHRyZWVzIG1vdW50ZWQgYXJvdW5kIHRob3NlXG4vLyByYW5nZXMsIGlmIGFueS5cbmZ1bmN0aW9uIGVudGVyRnJhZ21lbnRzKG1vdW50cywgcmFuZ2VzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IHsgcG9zLCBtb3VudCwgZnJhZyB9IG9mIG1vdW50cykge1xuICAgICAgICBsZXQgc3RhcnRQb3MgPSBwb3MgKyAobW91bnQub3ZlcmxheSA/IG1vdW50Lm92ZXJsYXlbMF0uZnJvbSA6IDApLCBlbmRQb3MgPSBzdGFydFBvcyArIG1vdW50LnRyZWUubGVuZ3RoO1xuICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWF4KGZyYWcuZnJvbSwgc3RhcnRQb3MpLCB0byA9IE1hdGgubWluKGZyYWcudG8sIGVuZFBvcyk7XG4gICAgICAgIGlmIChtb3VudC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgb3ZlcmxheSA9IG1vdW50Lm92ZXJsYXkubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSArIHBvcywgci50byArIHBvcykpO1xuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSBmaW5kQ292ZXJDaGFuZ2VzKHJhbmdlcywgb3ZlcmxheSwgZnJvbSwgdG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IGZyb207OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGkgPT0gY2hhbmdlcy5sZW5ndGgsIGVuZCA9IGxhc3QgPyB0byA6IGNoYW5nZXNbaV0uZnJvbTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVHJlZUZyYWdtZW50KHBvcywgZW5kLCBtb3VudC50cmVlLCAtc3RhcnRQb3MsIGZyYWcuZnJvbSA+PSBwb3MgfHwgZnJhZy5vcGVuU3RhcnQsIGZyYWcudG8gPD0gZW5kIHx8IGZyYWcub3BlbkVuZCkpO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwb3MgPSBjaGFuZ2VzW2ldLnRvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFRyZWVGcmFnbWVudChmcm9tLCB0bywgbW91bnQudHJlZSwgLXN0YXJ0UG9zLCBmcmFnLmZyb20gPj0gc3RhcnRQb3MgfHwgZnJhZy5vcGVuU3RhcnQsIGZyYWcudG8gPD0gZW5kUG9zIHx8IGZyYWcub3BlbkVuZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7IERlZmF1bHRCdWZmZXJMZW5ndGgsIEl0ZXJNb2RlLCBNb3VudGVkVHJlZSwgTm9kZVByb3AsIE5vZGVTZXQsIE5vZGVUeXBlLCBOb2RlV2Vha01hcCwgUGFyc2VyLCBUcmVlLCBUcmVlQnVmZmVyLCBUcmVlQ3Vyc29yLCBUcmVlRnJhZ21lbnQsIHBhcnNlTWl4ZWQgfTtcbiIsICIvKipcblRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgZG9jdW1lbnRzLiBAbm9uYWJzdHJhY3RcbiovXG5jbGFzcyBUZXh0IHtcbiAgICAvKipcbiAgICBHZXQgdGhlIGxpbmUgZGVzY3JpcHRpb24gYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGxpbmVBdChwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA8IDAgfHwgcG9zID4gdGhpcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwb3NpdGlvbiAke3Bvc30gaW4gZG9jdW1lbnQgb2YgbGVuZ3RoICR7dGhpcy5sZW5ndGh9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbm5lcihwb3MsIGZhbHNlLCAxLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGdpdmVuICgxLWJhc2VkKSBsaW5lIG51bWJlci5cbiAgICAqL1xuICAgIGxpbmUobikge1xuICAgICAgICBpZiAobiA8IDEgfHwgbiA+IHRoaXMubGluZXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBsaW5lIG51bWJlciAke259IGluICR7dGhpcy5saW5lc30tbGluZSBkb2N1bWVudGApO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5uZXIobiwgdHJ1ZSwgMSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSByYW5nZSBvZiB0aGUgdGV4dCB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICB0aGlzLmRlY29tcG9zZSgwLCBmcm9tLCBwYXJ0cywgMiAvKiBPcGVuLlRvICovKTtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoKVxuICAgICAgICAgICAgdGV4dC5kZWNvbXBvc2UoMCwgdGV4dC5sZW5ndGgsIHBhcnRzLCAxIC8qIE9wZW4uRnJvbSAqLyB8IDIgLyogT3Blbi5UbyAqLyk7XG4gICAgICAgIHRoaXMuZGVjb21wb3NlKHRvLCB0aGlzLmxlbmd0aCwgcGFydHMsIDEgLyogT3Blbi5Gcm9tICovKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20ocGFydHMsIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyB0ZXh0Lmxlbmd0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGVuZCBhbm90aGVyIGRvY3VtZW50IHRvIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UodGhpcy5sZW5ndGgsIHRoaXMubGVuZ3RoLCBvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIHRoZSB0ZXh0IGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cy5cbiAgICAqL1xuICAgIHNsaWNlKGZyb20sIHRvID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2UoZnJvbSwgdG8sIHBhcnRzLCAwKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20ocGFydHMsIHRvIC0gZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGlzIHRleHQgaXMgZXF1YWwgdG8gYW5vdGhlciBpbnN0YW5jZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciA9PSB0aGlzKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvdGhlci5sZW5ndGggIT0gdGhpcy5sZW5ndGggfHwgb3RoZXIubGluZXMgIT0gdGhpcy5saW5lcylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zY2FuSWRlbnRpY2FsKG90aGVyLCAxKSwgZW5kID0gdGhpcy5sZW5ndGggLSB0aGlzLnNjYW5JZGVudGljYWwob3RoZXIsIC0xKTtcbiAgICAgICAgbGV0IGEgPSBuZXcgUmF3VGV4dEN1cnNvcih0aGlzKSwgYiA9IG5ldyBSYXdUZXh0Q3Vyc29yKG90aGVyKTtcbiAgICAgICAgZm9yIChsZXQgc2tpcCA9IHN0YXJ0LCBwb3MgPSBzdGFydDs7KSB7XG4gICAgICAgICAgICBhLm5leHQoc2tpcCk7XG4gICAgICAgICAgICBiLm5leHQoc2tpcCk7XG4gICAgICAgICAgICBza2lwID0gMDtcbiAgICAgICAgICAgIGlmIChhLmxpbmVCcmVhayAhPSBiLmxpbmVCcmVhayB8fCBhLmRvbmUgIT0gYi5kb25lIHx8IGEudmFsdWUgIT0gYi52YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBwb3MgKz0gYS52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoYS5kb25lIHx8IHBvcyA+PSBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB0ZXh0LiBXaGVuIGBkaXJgIGlzIGAtMWAsIGl0ZXJhdGlvbiBoYXBwZW5zXG4gICAgZnJvbSBlbmQgdG8gc3RhcnQuIFRoaXMgd2lsbCByZXR1cm4gbGluZXMgYW5kIHRoZSBicmVha3MgYmV0d2VlblxuICAgIHRoZW0gYXMgc2VwYXJhdGUgc3RyaW5ncy5cbiAgICAqL1xuICAgIGl0ZXIoZGlyID0gMSkgeyByZXR1cm4gbmV3IFJhd1RleHRDdXJzb3IodGhpcywgZGlyKTsgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciBhIHJhbmdlIG9mIHRoZSB0ZXh0LiBXaGVuIGBmcm9tYCA+IGB0b2AsIHRoZVxuICAgIGl0ZXJhdG9yIHdpbGwgcnVuIGluIHJldmVyc2UuXG4gICAgKi9cbiAgICBpdGVyUmFuZ2UoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gbmV3IFBhcnRpYWxUZXh0Q3Vyc29yKHRoaXMsIGZyb20sIHRvKTsgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIGN1cnNvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGdpdmVuIHJhbmdlIG9mIGxpbmVzLFxuICAgIF93aXRob3V0XyByZXR1cm5pbmcgdGhlIGxpbmUgYnJlYWtzIGJldHdlZW4sIGFuZCB5aWVsZGluZyBlbXB0eVxuICAgIHN0cmluZ3MgZm9yIGVtcHR5IGxpbmVzLlxuICAgIFxuICAgIFdoZW4gYGZyb21gIGFuZCBgdG9gIGFyZSBnaXZlbiwgdGhleSBzaG91bGQgYmUgMS1iYXNlZCBsaW5lIG51bWJlcnMuXG4gICAgKi9cbiAgICBpdGVyTGluZXMoZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IGlubmVyO1xuICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpbm5lciA9IHRoaXMuaXRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICAgICAgdG8gPSB0aGlzLmxpbmVzICsgMTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMubGluZShmcm9tKS5mcm9tO1xuICAgICAgICAgICAgaW5uZXIgPSB0aGlzLml0ZXJSYW5nZShzdGFydCwgTWF0aC5tYXgoc3RhcnQsIHRvID09IHRoaXMubGluZXMgKyAxID8gdGhpcy5sZW5ndGggOiB0byA8PSAxID8gMCA6IHRoaXMubGluZSh0byAtIDEpLnRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQ3Vyc29yKGlubmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBkb2N1bWVudCBhcyBhIHN0cmluZywgdXNpbmcgbmV3bGluZSBjaGFyYWN0ZXJzIHRvXG4gICAgc2VwYXJhdGUgbGluZXMuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuc2xpY2VTdHJpbmcoMCk7IH1cbiAgICAvKipcbiAgICBDb252ZXJ0IHRoZSBkb2N1bWVudCB0byBhbiBhcnJheSBvZiBsaW5lcyAod2hpY2ggY2FuIGJlXG4gICAgZGVzZXJpYWxpemVkIGFnYWluIHZpYSBbYFRleHQub2ZgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHReb2YpKS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMuZmxhdHRlbihsaW5lcyk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGBUZXh0YCBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGxpbmVzLlxuICAgICovXG4gICAgc3RhdGljIG9mKHRleHQpIHtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkEgZG9jdW1lbnQgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBsaW5lXCIpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMSAmJiAhdGV4dFswXSlcbiAgICAgICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8gPyBuZXcgVGV4dExlYWYodGV4dCkgOiBUZXh0Tm9kZS5mcm9tKFRleHRMZWFmLnNwbGl0KHRleHQsIFtdKSk7XG4gICAgfVxufVxuLy8gTGVhdmVzIHN0b3JlIGFuIGFycmF5IG9mIGxpbmUgc3RyaW5ncy4gVGhlcmUgYXJlIGFsd2F5cyBsaW5lIGJyZWFrc1xuLy8gYmV0d2VlbiB0aGVzZSBzdHJpbmdzLiBMZWF2ZXMgYXJlIGxpbWl0ZWQgaW4gc2l6ZSBhbmQgaGF2ZSB0byBiZVxuLy8gY29udGFpbmVkIGluIFRleHROb2RlIGluc3RhbmNlcyBmb3IgYmlnZ2VyIGRvY3VtZW50cy5cbmNsYXNzIFRleHRMZWFmIGV4dGVuZHMgVGV4dCB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgbGVuZ3RoID0gdGV4dExlbmd0aCh0ZXh0KSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IGxpbmVzKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGdldCBjaGlsZHJlbigpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBsaW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0cmluZyA9IHRoaXMudGV4dFtpXSwgZW5kID0gb2Zmc2V0ICsgc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICgoaXNMaW5lID8gbGluZSA6IGVuZCkgPj0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShvZmZzZXQsIGVuZCwgbGluZSwgc3RyaW5nKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGVuZCArIDE7XG4gICAgICAgICAgICBsaW5lKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVjb21wb3NlKGZyb20sIHRvLCB0YXJnZXQsIG9wZW4pIHtcbiAgICAgICAgbGV0IHRleHQgPSBmcm9tIDw9IDAgJiYgdG8gPj0gdGhpcy5sZW5ndGggPyB0aGlzXG4gICAgICAgICAgICA6IG5ldyBUZXh0TGVhZihzbGljZVRleHQodGhpcy50ZXh0LCBmcm9tLCB0byksIE1hdGgubWluKHRvLCB0aGlzLmxlbmd0aCkgLSBNYXRoLm1heCgwLCBmcm9tKSk7XG4gICAgICAgIGlmIChvcGVuICYgMSAvKiBPcGVuLkZyb20gKi8pIHtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gdGFyZ2V0LnBvcCgpO1xuICAgICAgICAgICAgbGV0IGpvaW5lZCA9IGFwcGVuZFRleHQodGV4dC50ZXh0LCBwcmV2LnRleHQuc2xpY2UoKSwgMCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGpvaW5lZC5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYoam9pbmVkLCBwcmV2Lmxlbmd0aCArIHRleHQubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbWlkID0gam9pbmVkLmxlbmd0aCA+PiAxO1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihqb2luZWQuc2xpY2UoMCwgbWlkKSksIG5ldyBUZXh0TGVhZihqb2luZWQuc2xpY2UobWlkKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBpZiAoISh0ZXh0IGluc3RhbmNlb2YgVGV4dExlYWYpKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UoZnJvbSwgdG8sIHRleHQpO1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBsaW5lcyA9IGFwcGVuZFRleHQodGhpcy50ZXh0LCBhcHBlbmRUZXh0KHRleHQudGV4dCwgc2xpY2VUZXh0KHRoaXMudGV4dCwgMCwgZnJvbSkpLCB0byk7XG4gICAgICAgIGxldCBuZXdMZW4gPSB0aGlzLmxlbmd0aCArIHRleHQubGVuZ3RoIC0gKHRvIC0gZnJvbSk7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRMZWFmKGxpbmVzLCBuZXdMZW4pO1xuICAgICAgICByZXR1cm4gVGV4dE5vZGUuZnJvbShUZXh0TGVhZi5zcGxpdChsaW5lcywgW10pLCBuZXdMZW4pO1xuICAgIH1cbiAgICBzbGljZVN0cmluZyhmcm9tLCB0byA9IHRoaXMubGVuZ3RoLCBsaW5lU2VwID0gXCJcXG5cIikge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgcG9zIDw9IHRvICYmIGkgPCB0aGlzLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdGhpcy50ZXh0W2ldLCBlbmQgPSBwb3MgKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIGkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmVTZXA7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGVuZCAmJiB0byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZS5zbGljZShNYXRoLm1heCgwLCBmcm9tIC0gcG9zKSwgdG8gLSBwb3MpO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmbGF0dGVuKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudGV4dClcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKGxpbmUpO1xuICAgIH1cbiAgICBzY2FuSWRlbnRpY2FsKCkgeyByZXR1cm4gMDsgfVxuICAgIHN0YXRpYyBzcGxpdCh0ZXh0LCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IHBhcnQgPSBbXSwgbGVuID0gLTE7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dCkge1xuICAgICAgICAgICAgcGFydC5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgbGVuICs9IGxpbmUubGVuZ3RoICsgMTtcbiAgICAgICAgICAgIGlmIChwYXJ0Lmxlbmd0aCA9PSAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihwYXJ0LCBsZW4pKTtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gW107XG4gICAgICAgICAgICAgICAgbGVuID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbiA+IC0xKVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKHBhcnQsIGxlbikpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbn1cbi8vIE5vZGVzIHByb3ZpZGUgdGhlIHRyZWUgc3RydWN0dXJlIG9mIHRoZSBgVGV4dGAgdHlwZS4gVGhleSBzdG9yZSBhXG4vLyBudW1iZXIgb2Ygb3RoZXIgbm9kZXMgb3IgbGVhdmVzLCB0YWtpbmcgY2FyZSB0byBiYWxhbmNlIHRoZW1zZWx2ZXNcbi8vIG9uIGNoYW5nZXMuIFRoZXJlIGFyZSBpbXBsaWVkIGxpbmUgYnJlYWtzIF9iZXR3ZWVuXyB0aGUgY2hpbGRyZW4gb2Zcbi8vIGEgbm9kZSAoYnV0IG5vdCBiZWZvcmUgdGhlIGZpcnN0IG9yIGFmdGVyIHRoZSBsYXN0IGNoaWxkKS5cbmNsYXNzIFRleHROb2RlIGV4dGVuZHMgVGV4dCB7XG4gICAgY29uc3RydWN0b3IoY2hpbGRyZW4sIGxlbmd0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmxpbmVzID0gMDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICB0aGlzLmxpbmVzICs9IGNoaWxkLmxpbmVzO1xuICAgIH1cbiAgICBsaW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQubGVuZ3RoLCBlbmRMaW5lID0gbGluZSArIGNoaWxkLmxpbmVzIC0gMTtcbiAgICAgICAgICAgIGlmICgoaXNMaW5lID8gZW5kTGluZSA6IGVuZCkgPj0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5saW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQgKyAxO1xuICAgICAgICAgICAgbGluZSA9IGVuZExpbmUgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlY29tcG9zZShmcm9tLCB0bywgdGFyZ2V0LCBvcGVuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBwb3MgPD0gdG8gJiYgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChmcm9tIDw9IGVuZCAmJiB0byA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPcGVuID0gb3BlbiAmICgocG9zIDw9IGZyb20gPyAxIC8qIE9wZW4uRnJvbSAqLyA6IDApIHwgKGVuZCA+PSB0byA/IDIgLyogT3Blbi5UbyAqLyA6IDApKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zID49IGZyb20gJiYgZW5kIDw9IHRvICYmICFjaGlsZE9wZW4pXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmRlY29tcG9zZShmcm9tIC0gcG9zLCB0byAtIHBvcywgdGFyZ2V0LCBjaGlsZE9wZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgaWYgKHRleHQubGluZXMgPCB0aGlzLmxpbmVzKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogaWYgdGhlIGNoYW5nZSBvbmx5IGFmZmVjdHMgb25lIGNoaWxkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAvLyBjaGlsZCdzIHNpemUgcmVtYWlucyBpbiB0aGUgYWNjZXB0YWJsZSByYW5nZSwgb25seSB1cGRhdGVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gcG9zICYmIHRvIDw9IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGNoaWxkLnJlcGxhY2UoZnJvbSAtIHBvcywgdG8gLSBwb3MsIHRleHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxMaW5lcyA9IHRoaXMubGluZXMgLSBjaGlsZC5saW5lcyArIHVwZGF0ZWQubGluZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkLmxpbmVzIDwgKHRvdGFsTGluZXMgPj4gKDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyAtIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5saW5lcyA+ICh0b3RhbExpbmVzID4+ICg1IC8qIFRyZWUuQnJhbmNoU2hpZnQgKi8gKyAxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3B5ID0gdGhpcy5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29weVtpXSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKGNvcHksIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UocG9zLCBlbmQsIHVwZGF0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShmcm9tLCB0bywgdGV4dCk7XG4gICAgfVxuICAgIHNsaWNlU3RyaW5nKGZyb20sIHRvID0gdGhpcy5sZW5ndGgsIGxpbmVTZXAgPSBcIlxcblwiKSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggJiYgcG9zIDw9IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIGkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmVTZXA7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGVuZCAmJiB0byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hpbGQuc2xpY2VTdHJpbmcoZnJvbSAtIHBvcywgdG8gLSBwb3MsIGxpbmVTZXApO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmbGF0dGVuKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgY2hpbGQuZmxhdHRlbih0YXJnZXQpO1xuICAgIH1cbiAgICBzY2FuSWRlbnRpY2FsKG90aGVyLCBkaXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUZXh0Tm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgICAgIGxldCBbaUEsIGlCLCBlQSwgZUJdID0gZGlyID4gMCA/IFswLCAwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgb3RoZXIuY2hpbGRyZW4ubGVuZ3RoXVxuICAgICAgICAgICAgOiBbdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxLCBvdGhlci5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgLTFdO1xuICAgICAgICBmb3IgKDs7IGlBICs9IGRpciwgaUIgKz0gZGlyKSB7XG4gICAgICAgICAgICBpZiAoaUEgPT0gZUEgfHwgaUIgPT0gZUIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjaEEgPSB0aGlzLmNoaWxkcmVuW2lBXSwgY2hCID0gb3RoZXIuY2hpbGRyZW5baUJdO1xuICAgICAgICAgICAgaWYgKGNoQSAhPSBjaEIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCArIGNoQS5zY2FuSWRlbnRpY2FsKGNoQiwgZGlyKTtcbiAgICAgICAgICAgIGxlbmd0aCArPSBjaEEubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZnJvbShjaGlsZHJlbiwgbGVuZ3RoID0gY2hpbGRyZW4ucmVkdWNlKChsLCBjaCkgPT4gbCArIGNoLmxlbmd0aCArIDEsIC0xKSkge1xuICAgICAgICBsZXQgbGluZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIGxpbmVzICs9IGNoLmxpbmVzO1xuICAgICAgICBpZiAobGluZXMgPCAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgbGV0IGZsYXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNoIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoLmZsYXR0ZW4oZmxhdCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRMZWFmKGZsYXQsIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNodW5rID0gTWF0aC5tYXgoMzIgLyogVHJlZS5CcmFuY2ggKi8sIGxpbmVzID4+IDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyksIG1heENodW5rID0gY2h1bmsgPDwgMSwgbWluQ2h1bmsgPSBjaHVuayA+PiAxO1xuICAgICAgICBsZXQgY2h1bmtlZCA9IFtdLCBjdXJyZW50TGluZXMgPSAwLCBjdXJyZW50TGVuID0gLTEsIGN1cnJlbnRDaHVuayA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGQoY2hpbGQpIHtcbiAgICAgICAgICAgIGxldCBsYXN0O1xuICAgICAgICAgICAgaWYgKGNoaWxkLmxpbmVzID4gbWF4Q2h1bmsgJiYgY2hpbGQgaW5zdGFuY2VvZiBUZXh0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGUgb2YgY2hpbGQuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIGFkZChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmxpbmVzID4gbWluQ2h1bmsgJiYgKGN1cnJlbnRMaW5lcyA+IG1pbkNodW5rIHx8ICFjdXJyZW50TGluZXMpKSB7XG4gICAgICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgICAgICAgICBjaHVua2VkLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0TGVhZiAmJiBjdXJyZW50TGluZXMgJiZcbiAgICAgICAgICAgICAgICAobGFzdCA9IGN1cnJlbnRDaHVua1tjdXJyZW50Q2h1bmsubGVuZ3RoIC0gMV0pIGluc3RhbmNlb2YgVGV4dExlYWYgJiZcbiAgICAgICAgICAgICAgICBjaGlsZC5saW5lcyArIGxhc3QubGluZXMgPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZXMgKz0gY2hpbGQubGluZXM7XG4gICAgICAgICAgICAgICAgY3VycmVudExlbiArPSBjaGlsZC5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVua1tjdXJyZW50Q2h1bmsubGVuZ3RoIC0gMV0gPSBuZXcgVGV4dExlYWYobGFzdC50ZXh0LmNvbmNhdChjaGlsZC50ZXh0KSwgbGFzdC5sZW5ndGggKyAxICsgY2hpbGQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZXMgKyBjaGlsZC5saW5lcyA+IGNodW5rKVxuICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lcyArPSBjaGlsZC5saW5lcztcbiAgICAgICAgICAgICAgICBjdXJyZW50TGVuICs9IGNoaWxkLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgY3VycmVudENodW5rLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lcyA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNodW5rZWQucHVzaChjdXJyZW50Q2h1bmsubGVuZ3RoID09IDEgPyBjdXJyZW50Q2h1bmtbMF0gOiBUZXh0Tm9kZS5mcm9tKGN1cnJlbnRDaHVuaywgY3VycmVudExlbikpO1xuICAgICAgICAgICAgY3VycmVudExlbiA9IC0xO1xuICAgICAgICAgICAgY3VycmVudExpbmVzID0gY3VycmVudENodW5rLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBhZGQoY2hpbGQpO1xuICAgICAgICBmbHVzaCgpO1xuICAgICAgICByZXR1cm4gY2h1bmtlZC5sZW5ndGggPT0gMSA/IGNodW5rZWRbMF0gOiBuZXcgVGV4dE5vZGUoY2h1bmtlZCwgbGVuZ3RoKTtcbiAgICB9XG59XG5UZXh0LmVtcHR5ID0gLypAX19QVVJFX18qL25ldyBUZXh0TGVhZihbXCJcIl0sIDApO1xuZnVuY3Rpb24gdGV4dExlbmd0aCh0ZXh0KSB7XG4gICAgbGV0IGxlbmd0aCA9IC0xO1xuICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dClcbiAgICAgICAgbGVuZ3RoICs9IGxpbmUubGVuZ3RoICsgMTtcbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuZnVuY3Rpb24gYXBwZW5kVGV4dCh0ZXh0LCB0YXJnZXQsIGZyb20gPSAwLCB0byA9IDFlOSkge1xuICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwLCBmaXJzdCA9IHRydWU7IGkgPCB0ZXh0Lmxlbmd0aCAmJiBwb3MgPD0gdG87IGkrKykge1xuICAgICAgICBsZXQgbGluZSA9IHRleHRbaV0sIGVuZCA9IHBvcyArIGxpbmUubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID49IGZyb20pIHtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZSgwLCB0byAtIHBvcyk7XG4gICAgICAgICAgICBpZiAocG9zIDwgZnJvbSlcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZShmcm9tIC0gcG9zKTtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgIHRhcmdldFt0YXJnZXQubGVuZ3RoIC0gMV0gKz0gbGluZTtcbiAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBzbGljZVRleHQodGV4dCwgZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gYXBwZW5kVGV4dCh0ZXh0LCBbXCJcIl0sIGZyb20sIHRvKTtcbn1cbmNsYXNzIFJhd1RleHRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIGRpciA9IDEpIHtcbiAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxpbmVCcmVhayA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFt0ZXh0XTtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW2RpciA+IDAgPyAxIDogKHRleHQgaW5zdGFuY2VvZiBUZXh0TGVhZiA/IHRleHQudGV4dC5sZW5ndGggOiB0ZXh0LmNoaWxkcmVuLmxlbmd0aCkgPDwgMV07XG4gICAgfVxuICAgIG5leHRJbm5lcihza2lwLCBkaXIpIHtcbiAgICAgICAgdGhpcy5kb25lID0gdGhpcy5saW5lQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy5ub2Rlc1tsYXN0XSwgb2Zmc2V0VmFsdWUgPSB0aGlzLm9mZnNldHNbbGFzdF0sIG9mZnNldCA9IG9mZnNldFZhbHVlID4+IDE7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHRvcCBpbnN0YW5jZW9mIFRleHRMZWFmID8gdG9wLnRleHQubGVuZ3RoIDogdG9wLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gKGRpciA+IDAgPyBzaXplIDogMCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRpciA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0IC0gMV0rKztcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0cy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChvZmZzZXRWYWx1ZSAmIDEpID09IChkaXIgPiAwID8gMCA6IDEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3AgaW5zdGFuY2VvZiBUZXh0TGVhZikge1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgc3RyaW5nXG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0b3AudGV4dFtvZmZzZXQgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XSArPSBkaXI7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQubGVuZ3RoID4gTWF0aC5tYXgoMCwgc2tpcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHNraXAgPT0gMCA/IG5leHQgOiBkaXIgPiAwID8gbmV4dC5zbGljZShza2lwKSA6IG5leHQuc2xpY2UoMCwgbmV4dC5sZW5ndGggLSBza2lwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXAgLT0gbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRvcC5jaGlsZHJlbltvZmZzZXQgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgICAgIGlmIChza2lwID4gbmV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2tpcCAtPSBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdLS07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzLnB1c2goZGlyID4gMCA/IDEgOiAobmV4dCBpbnN0YW5jZW9mIFRleHRMZWFmID8gbmV4dC50ZXh0Lmxlbmd0aCA6IG5leHQuY2hpbGRyZW4ubGVuZ3RoKSA8PCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBpZiAoc2tpcCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubmV4dElubmVyKC1za2lwLCAoLXRoaXMuZGlyKSk7XG4gICAgICAgICAgICBza2lwID0gdGhpcy52YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dElubmVyKHNraXAsIHRoaXMuZGlyKTtcbiAgICB9XG59XG5jbGFzcyBQYXJ0aWFsVGV4dEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgc3RhcnQsIGVuZCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbmV3IFJhd1RleHRDdXJzb3IodGV4dCwgc3RhcnQgPiBlbmQgPyAtMSA6IDEpO1xuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0ID4gZW5kID8gdGV4dC5sZW5ndGggOiAwO1xuICAgICAgICB0aGlzLmZyb20gPSBNYXRoLm1pbihzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy50byA9IE1hdGgubWF4KHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICBuZXh0SW5uZXIoc2tpcCwgZGlyKSB7XG4gICAgICAgIGlmIChkaXIgPCAwID8gdGhpcy5wb3MgPD0gdGhpcy5mcm9tIDogdGhpcy5wb3MgPj0gdGhpcy50bykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgc2tpcCArPSBNYXRoLm1heCgwLCBkaXIgPCAwID8gdGhpcy5wb3MgLSB0aGlzLnRvIDogdGhpcy5mcm9tIC0gdGhpcy5wb3MpO1xuICAgICAgICBsZXQgbGltaXQgPSBkaXIgPCAwID8gdGhpcy5wb3MgLSB0aGlzLmZyb20gOiB0aGlzLnRvIC0gdGhpcy5wb3M7XG4gICAgICAgIGlmIChza2lwID4gbGltaXQpXG4gICAgICAgICAgICBza2lwID0gbGltaXQ7XG4gICAgICAgIGxpbWl0IC09IHNraXA7XG4gICAgICAgIGxldCB7IHZhbHVlIH0gPSB0aGlzLmN1cnNvci5uZXh0KHNraXApO1xuICAgICAgICB0aGlzLnBvcyArPSAodmFsdWUubGVuZ3RoICsgc2tpcCkgKiBkaXI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZS5sZW5ndGggPD0gbGltaXQgPyB2YWx1ZSA6IGRpciA8IDAgPyB2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSBsaW1pdCkgOiB2YWx1ZS5zbGljZSgwLCBsaW1pdCk7XG4gICAgICAgIHRoaXMuZG9uZSA9ICF0aGlzLnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBpZiAoc2tpcCA8IDApXG4gICAgICAgICAgICBza2lwID0gTWF0aC5tYXgoc2tpcCwgdGhpcy5mcm9tIC0gdGhpcy5wb3MpO1xuICAgICAgICBlbHNlIGlmIChza2lwID4gMClcbiAgICAgICAgICAgIHNraXAgPSBNYXRoLm1pbihza2lwLCB0aGlzLnRvIC0gdGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0SW5uZXIoc2tpcCwgdGhpcy5jdXJzb3IuZGlyKTtcbiAgICB9XG4gICAgZ2V0IGxpbmVCcmVhaygpIHsgcmV0dXJuIHRoaXMuY3Vyc29yLmxpbmVCcmVhayAmJiB0aGlzLnZhbHVlICE9IFwiXCI7IH1cbn1cbmNsYXNzIExpbmVDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGlubmVyKSB7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgIH1cbiAgICBuZXh0KHNraXAgPSAwKSB7XG4gICAgICAgIGxldCB7IGRvbmUsIGxpbmVCcmVhaywgdmFsdWUgfSA9IHRoaXMuaW5uZXIubmV4dChza2lwKTtcbiAgICAgICAgaWYgKGRvbmUgJiYgdGhpcy5hZnRlckJyZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsaW5lQnJlYWspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFmdGVyQnJlYWspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ2V0IGxpbmVCcmVhaygpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5pZiAodHlwZW9mIFN5bWJvbCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgVGV4dC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuaXRlcigpOyB9O1xuICAgIFJhd1RleHRDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBQYXJ0aWFsVGV4dEN1cnNvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9XG4gICAgICAgIExpbmVDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xufVxuLyoqXG5UaGlzIHR5cGUgZGVzY3JpYmVzIGEgbGluZSBpbiB0aGUgZG9jdW1lbnQuIEl0IGlzIGNyZWF0ZWRcbm9uLWRlbWFuZCB3aGVuIGxpbmVzIGFyZSBbcXVlcmllZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UZXh0LmxpbmVBdCkuXG4qL1xuY2xhc3MgTGluZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKF9iZWZvcmVfIHRoZSBsaW5lIGJyZWFrLFxuICAgIG9yIGF0IHRoZSBlbmQgb2YgZG9jdW1lbnQgZm9yIHRoZSBsYXN0IGxpbmUpLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoaXMgbGluZSdzIGxpbmUgbnVtYmVyICgxLWJhc2VkKS5cbiAgICAqL1xuICAgIG51bWJlciwgXG4gICAgLyoqXG4gICAgVGhlIGxpbmUncyBjb250ZW50LlxuICAgICovXG4gICAgdGV4dCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBsaW5lIChub3QgaW5jbHVkaW5nIGFueSBsaW5lIGJyZWFrIGFmdGVyIGl0KS5cbiAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRvIC0gdGhpcy5mcm9tOyB9XG59XG5mdW5jdGlvbiBjbGlwKHRleHQsIGZyb20sIHRvKSB7XG4gICAgZnJvbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRleHQubGVuZ3RoLCBmcm9tKSk7XG4gICAgcmV0dXJuIFtmcm9tLCBNYXRoLm1heChmcm9tLCBNYXRoLm1pbih0ZXh0Lmxlbmd0aCwgdG8pKV07XG59XG5cbi8vIENvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWs9RXh0ZW5kXG4vLyBpbmZvcm1hdGlvbiBmcm9tXG4vLyBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy8xMy4wLjAvdWNkL2F1eGlsaWFyeS9HcmFwaGVtZUJyZWFrUHJvcGVydHkudHh0LlxuLy8gRWFjaCBwYWlyIG9mIGVsZW1lbnRzIHJlcHJlc2VudHMgYSByYW5nZSwgYXMgYW4gb2ZmZXQgZnJvbSB0aGVcbi8vIHByZXZpb3VzIHJhbmdlIGFuZCBhIGxlbmd0aC4gTnVtYmVycyBhcmUgaW4gYmFzZS0zNiwgd2l0aCB0aGUgZW1wdHlcbi8vIHN0cmluZyBiZWluZyBhIHNob3J0aGFuZCBmb3IgMS5cbmxldCBleHRlbmQgPSAvKkBfX1BVUkVfXyovXCJsYywzNCw3biw3LDdiLDE5LCwsLDIsLDIsLCwyMCxiLDFjLGwsZywsMnQsNywyLDYsMiwyLCw0LHosLHUsciwyaixiLDFtLDksOSwsbyw0LCw5LCwzLCw1LDE3LDMsM2IsZiwsdywxaiwsLCw0LDgsNCwsMyw3LGEsMix0LCwxbSwsLCwyLDQsOCwsOSwsYSwyLHEsLDIsMiwxbCwsNCwyLDQsMiwyLDMsMywsdSwyLDMsLGIsMiwxbCwsNCw1LCwyLDQsLGssMixtLDYsLCwxbSwsLDIsLDQsOCwsNywzLGEsMix1LCwxbiwsLCxjLCw5LCwxNCwsMywsMWwsMyw1LDMsLDQsNywyLGIsMix0LCwxbSwsMiwsMiwsMywsNSwyLDcsMixiLDIscywyLDFsLDIsLCwyLDQsOCwsOSwsYSwyLHQsLDIwLCw0LCwyLDMsLCw4LCwyOSwsMiw3LGMsOCwycSwsMiw5LGIsNiwyMiwyLHIsLCwsLCwxaixlLCw1LCwyLDUsYiwsMTAsOSwsMnUsNCwsNiwsMiwyLDIscCwyLDQsMyxnLDQsZCwsMiwyLDYsLGYsLGpqLDMscWEsMyx0LDMsdCwyLHUsMiwxcywyLCw3LDgsLDIsYiw5LCwxOSwzLDNiLDIseSwsM2EsMyw0LDIsOSwsNiwzLDYzLDIsMiwsMW0sLCw3LCwsLCwyLDgsNixhLDIsLDFjLGgsMXIsNCwxYyw3LCwsNSwsMTQsOSxjLDIsdyw0LDIsMiwsMywxaywsLDIsMywsLDMsMW0sOCwyLDIsNDgsMywsZCwsNyw0LCw2LCwzLDIsNWksMW0sLDUsZWssLDVmLHgsMmRhLDMsM3gsLDJvLHcsZmUsNiwyeCwyLG45dyw0LCxhLHcsMiwyOCwyLDdrLCwzLCw0LCxwLDIsNSwsNDcsMixxLGksZCwsMTIsOCxwLGIsMWEsMywxYywsMiw0LDIsMiwxMywsMXYsNiwyLDIsMiwyLGMsLDgsLDFiLCwxZiwsLDMsMiwyLDUsMiwsLDE2LDIsOCwsNm0sLDIsLDQsLGZuNCwsa2gsZyxnLGcsYTYsMixndCwsNmEsLDQ1LDUsMWFlLDMsLDIsNSw0LDE0LDMsNCwsNGwsMixmeCw0LGFyLDIsNDksYiw0dywsMWksZiwxaywzLDFkLDQsMiwyLDF4LDMsMTAsNSwsOCwxcSwsYywyLDFnLDksYSw0LDIsLDJuLDMsMiwsLDIsNiwsNGcsLDMsOCxsLDIsMWwsMiwsLCwsbSwsZSw3LDMsNSw1Ziw4LDIsMywsLG4sLDI5LCwyLDYsLCwyLCwsMiwsMiw2aiwsMiw0LDYsMiwsMixyLDIsMmQsOCwyLCwsMiwyeSwsLCwyLDYsLCwydCwzLDIsNCwsNSw3Nyw5LCwyLDZ0LCxhLDIsLCw0LCw0MCw0LDIsMiw0LCx3LGEsMTQsNiwyLDQsOCwsOSw2LDIsMywxYSxkLCwyLGJhLDcsLDYsLCwyYSxtLDIsNywsMiwsMiwzZSw2LDMsLCwyLCw3LCwsMjAsMiwzLCwsLDluLDIsZjBiLDUsMW4sNyx0NCwsMXIsNCwyOSwsZjVrLDIsNDNxLCwsMyw0LDUsOCw4LDIsNyx1LDQsNDQsMywxaXosMWosNCwxZSw4LCxlLCxtLDUsLGYsMTFzLDcsLGgsMiw3LCwyLCw1LDc5LDcsYzUsNCwxNXMsNywzMSw3LDI0MCw1LGd4N2ssMm8sM2ssNm9cIi5zcGxpdChcIixcIikubWFwKHMgPT4gcyA/IHBhcnNlSW50KHMsIDM2KSA6IDEpO1xuLy8gQ29udmVydCBvZmZzZXRzIGludG8gYWJzb2x1dGUgdmFsdWVzXG5mb3IgKGxldCBpID0gMTsgaSA8IGV4dGVuZC5sZW5ndGg7IGkrKylcbiAgICBleHRlbmRbaV0gKz0gZXh0ZW5kW2kgLSAxXTtcbmZ1bmN0aW9uIGlzRXh0ZW5kaW5nQ2hhcihjb2RlKSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBleHRlbmQubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIGlmIChleHRlbmRbaV0gPiBjb2RlKVxuICAgICAgICAgICAgcmV0dXJuIGV4dGVuZFtpIC0gMV0gPD0gY29kZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1JlZ2lvbmFsSW5kaWNhdG9yKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA+PSAweDFGMUU2ICYmIGNvZGUgPD0gMHgxRjFGRjtcbn1cbmNvbnN0IFpXSiA9IDB4MjAwZDtcbi8qKlxuUmV0dXJucyBhIG5leHQgZ3JhcGhlbWUgY2x1c3RlciBicmVhayBfYWZ0ZXJfIChub3QgZXF1YWwgdG8pXG5gcG9zYCwgaWYgYGZvcndhcmRgIGlzIHRydWUsIG9yIGJlZm9yZSBvdGhlcndpc2UuIFJldHVybnMgYHBvc2Bcbml0c2VsZiBpZiBubyBmdXJ0aGVyIGNsdXN0ZXIgYnJlYWsgaXMgYXZhaWxhYmxlIGluIHRoZSBzdHJpbmcuXG5Nb3ZlcyBhY3Jvc3Mgc3Vycm9nYXRlIHBhaXJzLCBleHRlbmRpbmcgY2hhcmFjdGVycyAod2hlblxuYGluY2x1ZGVFeHRlbmRpbmdgIGlzIHRydWUpLCBjaGFyYWN0ZXJzIGpvaW5lZCB3aXRoIHplcm8td2lkdGhcbmpvaW5lcnMsIGFuZCBmbGFnIGVtb2ppLlxuKi9cbmZ1bmN0aW9uIGZpbmRDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGZvcndhcmQgPSB0cnVlLCBpbmNsdWRlRXh0ZW5kaW5nID0gdHJ1ZSkge1xuICAgIHJldHVybiAoZm9yd2FyZCA/IG5leHRDbHVzdGVyQnJlYWsgOiBwcmV2Q2x1c3RlckJyZWFrKShzdHIsIHBvcywgaW5jbHVkZUV4dGVuZGluZyk7XG59XG5mdW5jdGlvbiBuZXh0Q2x1c3RlckJyZWFrKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKSB7XG4gICAgaWYgKHBvcyA9PSBzdHIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIC8vIElmIHBvcyBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIsIG1vdmUgdG8gaXRzIHN0YXJ0XG4gICAgaWYgKHBvcyAmJiBzdXJyb2dhdGVMb3coc3RyLmNoYXJDb2RlQXQocG9zKSkgJiYgc3Vycm9nYXRlSGlnaChzdHIuY2hhckNvZGVBdChwb3MgLSAxKSkpXG4gICAgICAgIHBvcy0tO1xuICAgIGxldCBwcmV2ID0gY29kZVBvaW50QXQoc3RyLCBwb3MpO1xuICAgIHBvcyArPSBjb2RlUG9pbnRTaXplKHByZXYpO1xuICAgIHdoaWxlIChwb3MgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY29kZVBvaW50QXQoc3RyLCBwb3MpO1xuICAgICAgICBpZiAocHJldiA9PSBaV0ogfHwgbmV4dCA9PSBaV0ogfHwgaW5jbHVkZUV4dGVuZGluZyAmJiBpc0V4dGVuZGluZ0NoYXIobmV4dCkpIHtcbiAgICAgICAgICAgIHBvcyArPSBjb2RlUG9pbnRTaXplKG5leHQpO1xuICAgICAgICAgICAgcHJldiA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNSZWdpb25hbEluZGljYXRvcihuZXh0KSkge1xuICAgICAgICAgICAgbGV0IGNvdW50QmVmb3JlID0gMCwgaSA9IHBvcyAtIDI7XG4gICAgICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGlzUmVnaW9uYWxJbmRpY2F0b3IoY29kZVBvaW50QXQoc3RyLCBpKSkpIHtcbiAgICAgICAgICAgICAgICBjb3VudEJlZm9yZSsrO1xuICAgICAgICAgICAgICAgIGkgLT0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3VudEJlZm9yZSAlIDIgPT0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3M7XG59XG5mdW5jdGlvbiBwcmV2Q2x1c3RlckJyZWFrKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKSB7XG4gICAgd2hpbGUgKHBvcyA+IDApIHtcbiAgICAgICAgbGV0IGZvdW5kID0gbmV4dENsdXN0ZXJCcmVhayhzdHIsIHBvcyAtIDIsIGluY2x1ZGVFeHRlbmRpbmcpO1xuICAgICAgICBpZiAoZm91bmQgPCBwb3MpXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIHBvcy0tO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUxvdyhjaCkgeyByZXR1cm4gY2ggPj0gMHhEQzAwICYmIGNoIDwgMHhFMDAwOyB9XG5mdW5jdGlvbiBzdXJyb2dhdGVIaWdoKGNoKSB7IHJldHVybiBjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDA7IH1cbi8qKlxuRmluZCB0aGUgY29kZSBwb2ludCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gYSBzdHJpbmcgKGxpa2UgdGhlXG5bYGNvZGVQb2ludEF0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2NvZGVQb2ludEF0KVxuc3RyaW5nIG1ldGhvZCkuXG4qL1xuZnVuY3Rpb24gY29kZVBvaW50QXQoc3RyLCBwb3MpIHtcbiAgICBsZXQgY29kZTAgPSBzdHIuY2hhckNvZGVBdChwb3MpO1xuICAgIGlmICghc3Vycm9nYXRlSGlnaChjb2RlMCkgfHwgcG9zICsgMSA9PSBzdHIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gY29kZTA7XG4gICAgbGV0IGNvZGUxID0gc3RyLmNoYXJDb2RlQXQocG9zICsgMSk7XG4gICAgaWYgKCFzdXJyb2dhdGVMb3coY29kZTEpKVxuICAgICAgICByZXR1cm4gY29kZTA7XG4gICAgcmV0dXJuICgoY29kZTAgLSAweGQ4MDApIDw8IDEwKSArIChjb2RlMSAtIDB4ZGMwMCkgKyAweDEwMDAwO1xufVxuLyoqXG5HaXZlbiBhIFVuaWNvZGUgY29kZXBvaW50LCByZXR1cm4gdGhlIEphdmFTY3JpcHQgc3RyaW5nIHRoYXRcbnJlc3ByZXNlbnRzIGl0IChsaWtlXG5bYFN0cmluZy5mcm9tQ29kZVBvaW50YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2Zyb21Db2RlUG9pbnQpKS5cbiovXG5mdW5jdGlvbiBmcm9tQ29kZVBvaW50KGNvZGUpIHtcbiAgICBpZiAoY29kZSA8PSAweGZmZmYpXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgIGNvZGUgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZSA+PiAxMCkgKyAweGQ4MDAsIChjb2RlICYgMTAyMykgKyAweGRjMDApO1xufVxuLyoqXG5UaGUgYW1vdW50IG9mIHBvc2l0aW9ucyBhIGNoYXJhY3RlciB0YWtlcyB1cCBhIEphdmFTY3JpcHQgc3RyaW5nLlxuKi9cbmZ1bmN0aW9uIGNvZGVQb2ludFNpemUoY29kZSkgeyByZXR1cm4gY29kZSA8IDB4MTAwMDAgPyAxIDogMjsgfVxuXG5jb25zdCBEZWZhdWx0U3BsaXQgPSAvXFxyXFxuP3xcXG4vO1xuLyoqXG5EaXN0aW5ndWlzaGVzIGRpZmZlcmVudCB3YXlzIGluIHdoaWNoIHBvc2l0aW9ucyBjYW4gYmUgbWFwcGVkLlxuKi9cbnZhciBNYXBNb2RlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoTWFwTW9kZSkge1xuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRvIGEgdmFsaWQgbmV3IHBvc2l0aW9uLCBldmVuIHdoZW4gaXRzIGNvbnRleHRcbiAgICB3YXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlNpbXBsZVwiXSA9IDBdID0gXCJTaW1wbGVcIjtcbiAgICAvKipcbiAgICBSZXR1cm4gbnVsbCBpZiBkZWxldGlvbiBoYXBwZW5zIGFjcm9zcyB0aGUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBNYXBNb2RlW01hcE1vZGVbXCJUcmFja0RlbFwiXSA9IDFdID0gXCJUcmFja0RlbFwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIHRoZSBjaGFyYWN0ZXIgX2JlZm9yZV8gdGhlIHBvc2l0aW9uIGlzIGRlbGV0ZWQuXG4gICAgKi9cbiAgICBNYXBNb2RlW01hcE1vZGVbXCJUcmFja0JlZm9yZVwiXSA9IDJdID0gXCJUcmFja0JlZm9yZVwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIHRoZSBjaGFyYWN0ZXIgX2FmdGVyXyB0aGUgcG9zaXRpb24gaXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrQWZ0ZXJcIl0gPSAzXSA9IFwiVHJhY2tBZnRlclwiO1xucmV0dXJuIE1hcE1vZGV9KShNYXBNb2RlIHx8IChNYXBNb2RlID0ge30pKTtcbi8qKlxuQSBjaGFuZ2UgZGVzY3JpcHRpb24gaXMgYSB2YXJpYW50IG9mIFtjaGFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNldClcbnRoYXQgZG9lc24ndCBzdG9yZSB0aGUgaW5zZXJ0ZWQgdGV4dC4gQXMgc3VjaCwgaXQgY2FuJ3QgYmVcbmFwcGxpZWQsIGJ1dCBpcyBjaGVhcGVyIHRvIHN0b3JlIGFuZCBtYW5pcHVsYXRlLlxuKi9cbmNsYXNzIENoYW5nZURlc2Mge1xuICAgIC8vIFNlY3Rpb25zIGFyZSBlbmNvZGVkIGFzIHBhaXJzIG9mIGludGVnZXJzLiBUaGUgZmlyc3QgaXMgdGhlXG4gICAgLy8gbGVuZ3RoIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LCBhbmQgdGhlIHNlY29uZCBpcyAtMSBmb3JcbiAgICAvLyB1bmFmZmVjdGVkIHNlY3Rpb25zLCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgcmVwbGFjZW1lbnQgY29udGVudFxuICAgIC8vIG90aGVyd2lzZS4gU28gYW4gaW5zZXJ0aW9uIHdvdWxkIGJlICgwLCBuPjApLCBhIGRlbGV0aW9uIChuPjAsXG4gICAgLy8gMCksIGFuZCBhIHJlcGxhY2VtZW50IHR3byBwb3NpdGl2ZSBudW1iZXJzLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZWN0aW9ucykge1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnNlY3Rpb25zW2ldO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCBhZnRlciB0aGUgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IG5ld0xlbmd0aCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGlucyA9IHRoaXMuc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGlucyA8IDAgPyB0aGlzLnNlY3Rpb25zW2ldIDogaW5zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEZhbHNlIHdoZW4gdGhlcmUgYXJlIGFjdHVhbCBjaGFuZ2VzIGluIHRoaXMgc2V0LlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5zZWN0aW9ucy5sZW5ndGggPT0gMCB8fCB0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PSAyICYmIHRoaXMuc2VjdGlvbnNbMV0gPCAwOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB1bmNoYW5nZWQgcGFydHMgbGVmdCBieSB0aGVzZSBjaGFuZ2VzLiBgcG9zQWBcbiAgICBwcm92aWRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHJhbmdlIGluIHRoZSBvbGQgZG9jdW1lbnQsIGBwb3NCYFxuICAgIHRoZSBuZXcgcG9zaXRpb24gaW4gdGhlIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBpdGVyR2FwcyhmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3NBID0gMCwgcG9zQiA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2krK10sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgIGlmIChpbnMgPCAwKSB7XG4gICAgICAgICAgICAgICAgZihwb3NBLCBwb3NCLCBsZW4pO1xuICAgICAgICAgICAgICAgIHBvc0IgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBpbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NBICs9IGxlbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBjaGFuZ2VkIGJ5IHRoZXNlIGNoYW5nZXMuIChTZWVcbiAgICBbYENoYW5nZVNldC5pdGVyQ2hhbmdlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0Lml0ZXJDaGFuZ2VzKSBmb3IgYVxuICAgIHZhcmlhbnQgdGhhdCBhbHNvIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBpbnNlcnRlZCB0ZXh0LilcbiAgICBgZnJvbUFgL2B0b0FgIHByb3ZpZGVzIHRoZSBleHRlbnQgb2YgdGhlIGNoYW5nZSBpbiB0aGUgc3RhcnRpbmdcbiAgICBkb2N1bWVudCwgYGZyb21CYC9gdG9CYCB0aGUgZXh0ZW50IG9mIHRoZSByZXBsYWNlbWVudCBpbiB0aGVcbiAgICBjaGFuZ2VkIGRvY3VtZW50LlxuICAgIFxuICAgIFdoZW4gYGluZGl2aWR1YWxgIGlzIHRydWUsIGFkamFjZW50IGNoYW5nZXMgKHdoaWNoIGFyZSBrZXB0XG4gICAgc2VwYXJhdGUgZm9yIFtwb3NpdGlvbiBtYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MubWFwUG9zKSkgYXJlXG4gICAgcmVwb3J0ZWQgc2VwYXJhdGVseS5cbiAgICAqL1xuICAgIGl0ZXJDaGFuZ2VkUmFuZ2VzKGYsIGluZGl2aWR1YWwgPSBmYWxzZSkge1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCBmLCBpbmRpdmlkdWFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGludmVydGVkIGZvcm0gb2YgdGhlc2UgY2hhbmdlcy5cbiAgICAqL1xuICAgIGdldCBpbnZlcnRlZERlc2MoKSB7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApXG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChsZW4sIGlucyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChpbnMsIGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKHNlY3Rpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcHV0ZSB0aGUgY29tYmluZWQgZWZmZWN0IG9mIGFwcGx5aW5nIGFub3RoZXIgc2V0IG9mIGNoYW5nZXNcbiAgICBhZnRlciB0aGlzIG9uZS4gVGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgdGhpcyBzZXQgc2hvdWxkXG4gICAgbWF0Y2ggdGhlIGxlbmd0aCBiZWZvcmUgYG90aGVyYC5cbiAgICAqL1xuICAgIGNvbXBvc2VEZXNjKG90aGVyKSB7IHJldHVybiB0aGlzLmVtcHR5ID8gb3RoZXIgOiBvdGhlci5lbXB0eSA/IHRoaXMgOiBjb21wb3NlU2V0cyh0aGlzLCBvdGhlcik7IH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyBkZXNjcmlwdGlvbiwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHNhbWUgZG9jdW1lbnRcbiAgICBhcyBgb3RoZXJgLCBvdmVyIGFub3RoZXIgc2V0IG9mIGNoYW5nZXMsIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgYXBwbGllZCBhZnRlciBpdC4gV2hlbiBgYmVmb3JlYCBpcyB0cnVlLCBtYXAgYXMgaWYgdGhlIGNoYW5nZXNcbiAgICBpbiBgb3RoZXJgIGhhcHBlbmVkIGJlZm9yZSB0aGUgb25lcyBpbiBgdGhpc2AuXG4gICAgKi9cbiAgICBtYXBEZXNjKG90aGVyLCBiZWZvcmUgPSBmYWxzZSkgeyByZXR1cm4gb3RoZXIuZW1wdHkgPyB0aGlzIDogbWFwU2V0KHRoaXMsIG90aGVyLCBiZWZvcmUpOyB9XG4gICAgbWFwUG9zKHBvcywgYXNzb2MgPSAtMSwgbW9kZSA9IE1hcE1vZGUuU2ltcGxlKSB7XG4gICAgICAgIGxldCBwb3NBID0gMCwgcG9zQiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK10sIGVuZEEgPSBwb3NBICsgbGVuO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5kQSA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc0IgKyAocG9zIC0gcG9zQSk7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSAhPSBNYXBNb2RlLlNpbXBsZSAmJiBlbmRBID49IHBvcyAmJlxuICAgICAgICAgICAgICAgICAgICAobW9kZSA9PSBNYXBNb2RlLlRyYWNrRGVsICYmIHBvc0EgPCBwb3MgJiYgZW5kQSA+IHBvcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBNYXBNb2RlLlRyYWNrQmVmb3JlICYmIHBvc0EgPCBwb3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT0gTWFwTW9kZS5UcmFja0FmdGVyICYmIGVuZEEgPiBwb3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZW5kQSA+IHBvcyB8fCBlbmRBID09IHBvcyAmJiBhc3NvYyA8IDAgJiYgIWxlbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA9PSBwb3NBIHx8IGFzc29jIDwgMCA/IHBvc0IgOiBwb3NCICsgaW5zO1xuICAgICAgICAgICAgICAgIHBvc0IgKz0gaW5zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zQSA9IGVuZEE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+IHBvc0EpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUG9zaXRpb24gJHtwb3N9IGlzIG91dCBvZiByYW5nZSBmb3IgY2hhbmdlc2V0IG9mIGxlbmd0aCAke3Bvc0F9YCk7XG4gICAgICAgIHJldHVybiBwb3NCO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoZXNlIGNoYW5nZXMgdG91Y2ggYSBnaXZlbiByYW5nZS4gV2hlbiBvbmUgb2YgdGhlXG4gICAgY2hhbmdlcyBlbnRpcmVseSBjb3ZlcnMgdGhlIHJhbmdlLCB0aGUgc3RyaW5nIGBcImNvdmVyXCJgIGlzXG4gICAgcmV0dXJuZWQuXG4gICAgKi9cbiAgICB0b3VjaGVzUmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGggJiYgcG9zIDw9IHRvOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdLCBlbmQgPSBwb3MgKyBsZW47XG4gICAgICAgICAgICBpZiAoaW5zID49IDAgJiYgcG9zIDw9IHRvICYmIGVuZCA+PSBmcm9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3MgPCBmcm9tICYmIGVuZCA+IHRvID8gXCJjb3ZlclwiIDogdHJ1ZTtcbiAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IChyZXN1bHQgPyBcIiBcIiA6IFwiXCIpICsgbGVuICsgKGlucyA+PSAwID8gXCI6XCIgKyBpbnMgOiBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBjaGFuZ2UgZGVzYyB0byBhIEpTT04tcmVwcmVzZW50YWJsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHsgcmV0dXJuIHRoaXMuc2VjdGlvbnM7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2UgZGVzYyBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIChhcyBwcm9kdWNlZFxuICAgIGJ5IFtgdG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VEZXNjLnRvSlNPTikuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikgfHwganNvbi5sZW5ndGggJSAyIHx8IGpzb24uc29tZShhID0+IHR5cGVvZiBhICE9IFwibnVtYmVyXCIpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQ2hhbmdlRGVzY1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc2VjdGlvbnMpIHsgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKHNlY3Rpb25zKTsgfVxufVxuLyoqXG5BIGNoYW5nZSBzZXQgcmVwcmVzZW50cyBhIGdyb3VwIG9mIG1vZGlmaWNhdGlvbnMgdG8gYSBkb2N1bWVudC4gSXRcbnN0b3JlcyB0aGUgZG9jdW1lbnQgbGVuZ3RoLCBhbmQgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBkb2N1bWVudHNcbndpdGggZXhhY3RseSB0aGF0IGxlbmd0aC5cbiovXG5jbGFzcyBDaGFuZ2VTZXQgZXh0ZW5kcyBDaGFuZ2VEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9ucywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnNlcnRlZCkge1xuICAgICAgICBzdXBlcihzZWN0aW9ucyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0ZWQgPSBpbnNlcnRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwbHkgdGhlIGNoYW5nZXMgdG8gYSBkb2N1bWVudCwgcmV0dXJuaW5nIHRoZSBtb2RpZmllZFxuICAgIGRvY3VtZW50LlxuICAgICovXG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPSBkb2MubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBcHBseWluZyBjaGFuZ2Ugc2V0IHRvIGEgZG9jdW1lbnQgd2l0aCB0aGUgd3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCAoZnJvbUEsIHRvQSwgZnJvbUIsIF90b0IsIHRleHQpID0+IGRvYyA9IGRvYy5yZXBsYWNlKGZyb21CLCBmcm9tQiArICh0b0EgLSBmcm9tQSksIHRleHQpLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBkb2M7XG4gICAgfVxuICAgIG1hcERlc2Mob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBHaXZlbiB0aGUgZG9jdW1lbnQgYXMgaXQgZXhpc3RlZCBfYmVmb3JlXyB0aGUgY2hhbmdlcywgcmV0dXJuIGFcbiAgICBjaGFuZ2Ugc2V0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW52ZXJzZSBvZiB0aGlzIHNldCwgd2hpY2ggY291bGRcbiAgICBiZSB1c2VkIHRvIGdvIGZyb20gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgdGhlIGNoYW5nZXMgYmFjayB0b1xuICAgIHRoZSBkb2N1bWVudCBhcyBpdCBleGlzdGVkIGJlZm9yZSB0aGUgY2hhbmdlcy5cbiAgICAqL1xuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucy5zbGljZSgpLCBpbnNlcnRlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IHNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gc2VjdGlvbnNbaV0sIGlucyA9IHNlY3Rpb25zW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpbnMgPj0gMCkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zW2ldID0gaW5zO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zW2kgKyAxXSA9IGxlbjtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpID4+IDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydGVkLmxlbmd0aCA8IGluZGV4KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC5wdXNoKFRleHQuZW1wdHkpO1xuICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2gobGVuID8gZG9jLnNsaWNlKHBvcywgcG9zICsgbGVuKSA6IFRleHQuZW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21iaW5lIHR3byBzdWJzZXF1ZW50IGNoYW5nZSBzZXRzIGludG8gYSBzaW5nbGUgc2V0LiBgb3RoZXJgXG4gICAgbXVzdCBzdGFydCBpbiB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgYHRoaXNgLiBJZiBgdGhpc2AgZ29lc1xuICAgIGBkb2NBYCBcdTIxOTIgYGRvY0JgIGFuZCBgb3RoZXJgIHJlcHJlc2VudHMgYGRvY0JgIFx1MjE5MiBgZG9jQ2AsIHRoZVxuICAgIHJldHVybmVkIHZhbHVlIHdpbGwgcmVwcmVzZW50IHRoZSBjaGFuZ2UgYGRvY0FgIFx1MjE5MiBgZG9jQ2AuXG4gICAgKi9cbiAgICBjb21wb3NlKG90aGVyKSB7IHJldHVybiB0aGlzLmVtcHR5ID8gb3RoZXIgOiBvdGhlci5lbXB0eSA/IHRoaXMgOiBjb21wb3NlU2V0cyh0aGlzLCBvdGhlciwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBHaXZlbiBhbm90aGVyIGNoYW5nZSBzZXQgc3RhcnRpbmcgaW4gdGhlIHNhbWUgZG9jdW1lbnQsIG1hcHMgdGhpc1xuICAgIGNoYW5nZSBzZXQgb3ZlciB0aGUgb3RoZXIsIHByb2R1Y2luZyBhIG5ldyBjaGFuZ2Ugc2V0IHRoYXQgY2FuIGJlXG4gICAgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgYXBwbHlpbmcgYG90aGVyYC4gV2hlblxuICAgIGBiZWZvcmVgIGlzIGB0cnVlYCwgb3JkZXIgY2hhbmdlcyBhcyBpZiBgdGhpc2AgY29tZXMgYmVmb3JlXG4gICAgYG90aGVyYCwgb3RoZXJ3aXNlICh0aGUgZGVmYXVsdCkgdHJlYXQgYG90aGVyYCBhcyBjb21pbmcgZmlyc3QuXG4gICAgXG4gICAgR2l2ZW4gdHdvIGNoYW5nZXMgYEFgIGFuZCBgQmAsIGBBLmNvbXBvc2UoQi5tYXAoQSkpYCBhbmRcbiAgICBgQi5jb21wb3NlKEEubWFwKEIsIHRydWUpKWAgd2lsbCBwcm9kdWNlIHRoZSBzYW1lIGRvY3VtZW50LiBUaGlzXG4gICAgcHJvdmlkZXMgYSBiYXNpYyBmb3JtIG9mIFtvcGVyYXRpb25hbFxuICAgIHRyYW5zZm9ybWF0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVyYXRpb25hbF90cmFuc2Zvcm1hdGlvbiksXG4gICAgYW5kIGNhbiBiZSB1c2VkIGZvciBjb2xsYWJvcmF0aXZlIGVkaXRpbmcuXG4gICAgKi9cbiAgICBtYXAob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBvdGhlci5lbXB0eSA/IHRoaXMgOiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIGNoYW5nZWQgcmFuZ2VzIGluIHRoZSBkb2N1bWVudCwgY2FsbGluZyBgZmAgZm9yXG4gICAgZWFjaCwgd2l0aCB0aGUgcmFuZ2UgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50IChgZnJvbUFgLWB0b0FgKVxuICAgIGFuZCB0aGUgcmFuZ2UgdGhhdCByZXBsYWNlcyBpdCBpbiB0aGUgbmV3IGRvY3VtZW50XG4gICAgKGBmcm9tQmAtYHRvQmApLlxuICAgIFxuICAgIFdoZW4gYGluZGl2aWR1YWxgIGlzIHRydWUsIGFkamFjZW50IGNoYW5nZXMgYXJlIHJlcG9ydGVkXG4gICAgc2VwYXJhdGVseS5cbiAgICAqL1xuICAgIGl0ZXJDaGFuZ2VzKGYsIGluZGl2aWR1YWwgPSBmYWxzZSkge1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCBmLCBpbmRpdmlkdWFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW2NoYW5nZSBkZXNjcmlwdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VEZXNjKSBmb3IgdGhpcyBjaGFuZ2VcbiAgICBzZXQuXG4gICAgKi9cbiAgICBnZXQgZGVzYygpIHsgcmV0dXJuIENoYW5nZURlc2MuY3JlYXRlKHRoaXMuc2VjdGlvbnMpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaWx0ZXIocmFuZ2VzKSB7XG4gICAgICAgIGxldCByZXN1bHRTZWN0aW9ucyA9IFtdLCByZXN1bHRJbnNlcnRlZCA9IFtdLCBmaWx0ZXJlZFNlY3Rpb25zID0gW107XG4gICAgICAgIGxldCBpdGVyID0gbmV3IFNlY3Rpb25JdGVyKHRoaXMpO1xuICAgICAgICBkb25lOiBmb3IgKGxldCBpID0gMCwgcG9zID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGkgPT0gcmFuZ2VzLmxlbmd0aCA/IDFlOSA6IHJhbmdlc1tpKytdO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IG5leHQgfHwgcG9zID09IG5leHQgJiYgaXRlci5sZW4gPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyLmRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvbmU7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGl0ZXIubGVuLCBuZXh0IC0gcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKGZpbHRlcmVkU2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgICAgIGxldCBpbnMgPSBpdGVyLmlucyA9PSAtMSA/IC0xIDogaXRlci5vZmYgPT0gMCA/IGl0ZXIuaW5zIDogMDtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHJlc3VsdFNlY3Rpb25zLCBsZW4sIGlucyk7XG4gICAgICAgICAgICAgICAgaWYgKGlucyA+IDApXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChyZXN1bHRJbnNlcnRlZCwgcmVzdWx0U2VjdGlvbnMsIGl0ZXIudGV4dCk7XG4gICAgICAgICAgICAgICAgaXRlci5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbmQgPSByYW5nZXNbaSsrXTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlci5kb25lKVxuICAgICAgICAgICAgICAgICAgICBicmVhayBkb25lO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBNYXRoLm1pbihpdGVyLmxlbiwgZW5kIC0gcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHJlc3VsdFNlY3Rpb25zLCBsZW4sIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKGZpbHRlcmVkU2VjdGlvbnMsIGxlbiwgaXRlci5pbnMgPT0gLTEgPyAtMSA6IGl0ZXIub2ZmID09IDAgPyBpdGVyLmlucyA6IDApO1xuICAgICAgICAgICAgICAgIGl0ZXIuZm9yd2FyZChsZW4pO1xuICAgICAgICAgICAgICAgIHBvcyArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogbmV3IENoYW5nZVNldChyZXN1bHRTZWN0aW9ucywgcmVzdWx0SW5zZXJ0ZWQpLFxuICAgICAgICAgICAgZmlsdGVyZWQ6IENoYW5nZURlc2MuY3JlYXRlKGZpbHRlcmVkU2VjdGlvbnMpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIGNoYW5nZSBzZXQgdG8gYSBKU09OLXJlcHJlc2VudGFibGUgdmFsdWUuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2ldLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpbnMgPCAwKVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gobGVuKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlucyA9PSAwKVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goW2xlbl0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goW2xlbl0uY29uY2F0KHRoaXMuaW5zZXJ0ZWRbaSA+PiAxXS50b0pTT04oKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cztcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY2hhbmdlIHNldCBmb3IgdGhlIGdpdmVuIGNoYW5nZXMsIGZvciBhIGRvY3VtZW50IG9mIHRoZVxuICAgIGdpdmVuIGxlbmd0aCwgdXNpbmcgYGxpbmVTZXBgIGFzIGxpbmUgc2VwYXJhdG9yLlxuICAgICovXG4gICAgc3RhdGljIG9mKGNoYW5nZXMsIGxlbmd0aCwgbGluZVNlcCkge1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSBbXSwgaW5zZXJ0ZWQgPSBbXSwgcG9zID0gMDtcbiAgICAgICAgbGV0IHRvdGFsID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb24gZmx1c2goZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhc2VjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChwb3MgPCBsZW5ndGgpXG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuZ3RoIC0gcG9zLCAtMSk7XG4gICAgICAgICAgICBsZXQgc2V0ID0gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsLmNvbXBvc2Uoc2V0Lm1hcCh0b3RhbCkpIDogc2V0O1xuICAgICAgICAgICAgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGluc2VydGVkID0gW107XG4gICAgICAgICAgICBwb3MgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3Moc3BlYykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWIgb2Ygc3BlYylcbiAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhzdWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIENoYW5nZVNldCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGVjLmxlbmd0aCAhPSBsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3RoIChnb3QgJHtzcGVjLmxlbmd0aH0sIGV4cGVjdGVkICR7bGVuZ3RofSlgKTtcbiAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgPyB0b3RhbC5jb21wb3NlKHNwZWMubWFwKHRvdGFsKSkgOiBzcGVjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gPSBmcm9tLCBpbnNlcnQgfSA9IHNwZWM7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPiB0byB8fCBmcm9tIDwgMCB8fCB0byA+IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY2hhbmdlIHJhbmdlICR7ZnJvbX0gdG8gJHt0b30gKGluIGRvYyBvZiBsZW5ndGggJHtsZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIGxldCBpbnNUZXh0ID0gIWluc2VydCA/IFRleHQuZW1wdHkgOiB0eXBlb2YgaW5zZXJ0ID09IFwic3RyaW5nXCIgPyBUZXh0Lm9mKGluc2VydC5zcGxpdChsaW5lU2VwIHx8IERlZmF1bHRTcGxpdCkpIDogaW5zZXJ0O1xuICAgICAgICAgICAgICAgIGxldCBpbnNMZW4gPSBpbnNUZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA9PSB0byAmJiBpbnNMZW4gPT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgcG9zKVxuICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBmcm9tIC0gcG9zLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgdG8gLSBmcm9tLCBpbnNMZW4pO1xuICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnRlZCwgc2VjdGlvbnMsIGluc1RleHQpO1xuICAgICAgICAgICAgICAgIHBvcyA9IHRvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MoY2hhbmdlcyk7XG4gICAgICAgIGZsdXNoKCF0b3RhbCk7XG4gICAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGVtcHR5IGNoYW5nZXNldCBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLlxuICAgICovXG4gICAgc3RhdGljIGVtcHR5KGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChsZW5ndGggPyBbbGVuZ3RoLCAtMV0gOiBbXSwgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2VzZXQgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbiAoYXMgcHJvZHVjZWQgYnlcbiAgICBbYHRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0LnRvSlNPTikuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBDaGFuZ2VTZXRcIik7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnRlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYXJ0ID0ganNvbltpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFydCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChwYXJ0LCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwYXJ0KSB8fCB0eXBlb2YgcGFydFswXSAhPSBcIm51bWJlclwiIHx8IHBhcnQuc29tZSgoZSwgaSkgPT4gaSAmJiB0eXBlb2YgZSAhPSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIENoYW5nZVNldFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcnQubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHBhcnRbMF0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydGVkLmxlbmd0aCA8IGkpXG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWRbaV0gPSBUZXh0Lm9mKHBhcnQuc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2gocGFydFswXSwgaW5zZXJ0ZWRbaV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVTZXQoc2VjdGlvbnMsIGluc2VydGVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnMsIGZvcmNlSm9pbiA9IGZhbHNlKSB7XG4gICAgaWYgKGxlbiA9PSAwICYmIGlucyA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IGxhc3QgPSBzZWN0aW9ucy5sZW5ndGggLSAyO1xuICAgIGlmIChsYXN0ID49IDAgJiYgaW5zIDw9IDAgJiYgaW5zID09IHNlY3Rpb25zW2xhc3QgKyAxXSlcbiAgICAgICAgc2VjdGlvbnNbbGFzdF0gKz0gbGVuO1xuICAgIGVsc2UgaWYgKGxlbiA9PSAwICYmIHNlY3Rpb25zW2xhc3RdID09IDApXG4gICAgICAgIHNlY3Rpb25zW2xhc3QgKyAxXSArPSBpbnM7XG4gICAgZWxzZSBpZiAoZm9yY2VKb2luKSB7XG4gICAgICAgIHNlY3Rpb25zW2xhc3RdICs9IGxlbjtcbiAgICAgICAgc2VjdGlvbnNbbGFzdCArIDFdICs9IGlucztcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBzZWN0aW9ucy5wdXNoKGxlbiwgaW5zKTtcbn1cbmZ1bmN0aW9uIGFkZEluc2VydCh2YWx1ZXMsIHNlY3Rpb25zLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBpbmRleCA9IChzZWN0aW9ucy5sZW5ndGggLSAyKSA+PiAxO1xuICAgIGlmIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0uYXBwZW5kKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlICh2YWx1ZXMubGVuZ3RoIDwgaW5kZXgpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChUZXh0LmVtcHR5KTtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGl0ZXJDaGFuZ2VzKGRlc2MsIGYsIGluZGl2aWR1YWwpIHtcbiAgICBsZXQgaW5zZXJ0ZWQgPSBkZXNjLmluc2VydGVkO1xuICAgIGZvciAobGV0IHBvc0EgPSAwLCBwb3NCID0gMCwgaSA9IDA7IGkgPCBkZXNjLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGxlbiA9IGRlc2Muc2VjdGlvbnNbaSsrXSwgaW5zID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICBpZiAoaW5zIDwgMCkge1xuICAgICAgICAgICAgcG9zQSArPSBsZW47XG4gICAgICAgICAgICBwb3NCICs9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbmRBID0gcG9zQSwgZW5kQiA9IHBvc0IsIHRleHQgPSBUZXh0LmVtcHR5O1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGVuZEEgKz0gbGVuO1xuICAgICAgICAgICAgICAgIGVuZEIgKz0gaW5zO1xuICAgICAgICAgICAgICAgIGlmIChpbnMgJiYgaW5zZXJ0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LmFwcGVuZChpbnNlcnRlZFsoaSAtIDIpID4+IDFdKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kaXZpZHVhbCB8fCBpID09IGRlc2Muc2VjdGlvbnMubGVuZ3RoIHx8IGRlc2Muc2VjdGlvbnNbaSArIDFdIDwgMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbGVuID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgICAgIGlucyA9IGRlc2Muc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGYocG9zQSwgZW5kQSwgcG9zQiwgZW5kQiwgdGV4dCk7XG4gICAgICAgICAgICBwb3NBID0gZW5kQTtcbiAgICAgICAgICAgIHBvc0IgPSBlbmRCO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwU2V0KHNldEEsIHNldEIsIGJlZm9yZSwgbWtTZXQgPSBmYWxzZSkge1xuICAgIC8vIFByb2R1Y2UgYSBjb3B5IG9mIHNldEEgdGhhdCBhcHBsaWVzIHRvIHRoZSBkb2N1bWVudCBhZnRlciBzZXRCXG4gICAgLy8gaGFzIGJlZW4gYXBwbGllZCAoYXNzdW1pbmcgYm90aCBzdGFydCBhdCB0aGUgc2FtZSBkb2N1bWVudCkuXG4gICAgbGV0IHNlY3Rpb25zID0gW10sIGluc2VydCA9IG1rU2V0ID8gW10gOiBudWxsO1xuICAgIGxldCBhID0gbmV3IFNlY3Rpb25JdGVyKHNldEEpLCBiID0gbmV3IFNlY3Rpb25JdGVyKHNldEIpO1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBib3RoIHNldHMgaW4gcGFyYWxsZWwuIGluc2VydGVkIHRyYWNrcywgZm9yIGNoYW5nZXNcbiAgICAvLyBpbiBBIHRoYXQgaGF2ZSB0byBiZSBwcm9jZXNzZWQgcGllY2UtYnktcGllY2UsIHdoZXRoZXIgdGhlaXJcbiAgICAvLyBjb250ZW50IGhhcyBiZWVuIGluc2VydGVkIGFscmVhZHksIGFuZCByZWZlcnMgdG8gdGhlIHNlY3Rpb25cbiAgICAvLyBpbmRleC5cbiAgICBmb3IgKGxldCBpbnNlcnRlZCA9IC0xOzspIHtcbiAgICAgICAgaWYgKGEuaW5zID09IC0xICYmIGIuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIGFjcm9zcyByYW5nZXMgc2tpcHBlZCBieSBib3RoIHNldHMuXG4gICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oYS5sZW4sIGIubGVuKTtcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgYS5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICBiLmZvcndhcmQobGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiLmlucyA+PSAwICYmIChhLmlucyA8IDAgfHwgaW5zZXJ0ZWQgPT0gYS5pIHx8IGEub2ZmID09IDAgJiYgKGIubGVuIDwgYS5sZW4gfHwgYi5sZW4gPT0gYS5sZW4gJiYgIWJlZm9yZSkpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgY2hhbmdlIGluIEIgdGhhdCBjb21lcyBiZWZvcmUgdGhlIG5leHQgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyBBIChvcmRlcmVkIGJ5IHN0YXJ0IHBvcywgdGhlbiBsZW4sIHRoZW4gYmVmb3JlIGZsYWcpLCBza2lwXG4gICAgICAgICAgICAvLyB0aGF0IChhbmQgcHJvY2VzcyBhbnkgY2hhbmdlcyBpbiBBIGl0IGNvdmVycykuXG4gICAgICAgICAgICBsZXQgbGVuID0gYi5sZW47XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBiLmlucywgLTEpO1xuICAgICAgICAgICAgd2hpbGUgKGxlbikge1xuICAgICAgICAgICAgICAgIGxldCBwaWVjZSA9IE1hdGgubWluKGEubGVuLCBsZW4pO1xuICAgICAgICAgICAgICAgIGlmIChhLmlucyA+PSAwICYmIGluc2VydGVkIDwgYS5pICYmIGEubGVuIDw9IHBpZWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIDAsIGEuaW5zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBhLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCA9IGEuaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYS5mb3J3YXJkKHBpZWNlKTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gcGllY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA+PSAwKSB7XG4gICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBwYXJ0IG9mIGEgY2hhbmdlIGluIEEgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0XG4gICAgICAgICAgICAvLyBub24tZGVsZXRpb24gY2hhbmdlIGluIEIgKGlmIG92ZXJsYXBwaW5nKS5cbiAgICAgICAgICAgIGxldCBsZW4gPSAwLCBsZWZ0ID0gYS5sZW47XG4gICAgICAgICAgICB3aGlsZSAobGVmdCkge1xuICAgICAgICAgICAgICAgIGlmIChiLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGllY2UgPSBNYXRoLm1pbihsZWZ0LCBiLmxlbik7XG4gICAgICAgICAgICAgICAgICAgIGxlbiArPSBwaWVjZTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBwaWVjZTtcbiAgICAgICAgICAgICAgICAgICAgYi5mb3J3YXJkKHBpZWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYi5pbnMgPT0gMCAmJiBiLmxlbiA8IGxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBiLmxlbjtcbiAgICAgICAgICAgICAgICAgICAgYi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGluc2VydGVkIDwgYS5pID8gYS5pbnMgOiAwKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnQgJiYgaW5zZXJ0ZWQgPCBhLmkpXG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGEudGV4dCk7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IGEuaTtcbiAgICAgICAgICAgIGEuZm9yd2FyZChhLmxlbiAtIGxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuZG9uZSAmJiBiLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnQgPyBDaGFuZ2VTZXQuY3JlYXRlU2V0KHNlY3Rpb25zLCBpbnNlcnQpIDogQ2hhbmdlRGVzYy5jcmVhdGUoc2VjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzbWF0Y2hlZCBjaGFuZ2Ugc2V0IGxlbmd0aHNcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb21wb3NlU2V0cyhzZXRBLCBzZXRCLCBta1NldCA9IGZhbHNlKSB7XG4gICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgbGV0IGluc2VydCA9IG1rU2V0ID8gW10gOiBudWxsO1xuICAgIGxldCBhID0gbmV3IFNlY3Rpb25JdGVyKHNldEEpLCBiID0gbmV3IFNlY3Rpb25JdGVyKHNldEIpO1xuICAgIGZvciAobGV0IG9wZW4gPSBmYWxzZTs7KSB7XG4gICAgICAgIGlmIChhLmRvbmUgJiYgYi5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0ID8gQ2hhbmdlU2V0LmNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0KSA6IENoYW5nZURlc2MuY3JlYXRlKHNlY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA9PSAwKSB7IC8vIERlbGV0aW9uIGluIEFcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGEubGVuLCAwLCBvcGVuKTtcbiAgICAgICAgICAgIGEubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIubGVuID09IDAgJiYgIWIuZG9uZSkgeyAvLyBJbnNlcnRpb24gaW4gQlxuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgMCwgYi5pbnMsIG9wZW4pO1xuICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYi50ZXh0KTtcbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuZG9uZSB8fCBiLmRvbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGhzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGEubGVuMiwgYi5sZW4pLCBzZWN0aW9uTGVuID0gc2VjdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGEuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluc0IgPSBiLmlucyA9PSAtMSA/IC0xIDogYi5vZmYgPyAwIDogYi5pbnM7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnNCLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICYmIGluc0IpXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBiLnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYi5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBhLm9mZiA/IDAgOiBhLmxlbiwgbGVuLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYS50ZXh0Qml0KGxlbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYS5vZmYgPyAwIDogYS5sZW4sIGIub2ZmID8gMCA6IGIuaW5zLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICYmICFiLm9mZilcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGIudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcGVuID0gKGEuaW5zID4gbGVuIHx8IGIuaW5zID49IDAgJiYgYi5sZW4gPiBsZW4pICYmIChvcGVuIHx8IHNlY3Rpb25zLmxlbmd0aCA+IHNlY3Rpb25MZW4pO1xuICAgICAgICAgICAgYS5mb3J3YXJkMihsZW4pO1xuICAgICAgICAgICAgYi5mb3J3YXJkKGxlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTZWN0aW9uSXRlciB7XG4gICAgY29uc3RydWN0b3Ioc2V0KSB7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgbGV0IHsgc2VjdGlvbnMgfSA9IHRoaXMuc2V0O1xuICAgICAgICBpZiAodGhpcy5pIDwgc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxlbiA9IHNlY3Rpb25zW3RoaXMuaSsrXTtcbiAgICAgICAgICAgIHRoaXMuaW5zID0gc2VjdGlvbnNbdGhpcy5pKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sZW4gPSAwO1xuICAgICAgICAgICAgdGhpcy5pbnMgPSAtMjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9mZiA9IDA7XG4gICAgfVxuICAgIGdldCBkb25lKCkgeyByZXR1cm4gdGhpcy5pbnMgPT0gLTI7IH1cbiAgICBnZXQgbGVuMigpIHsgcmV0dXJuIHRoaXMuaW5zIDwgMCA/IHRoaXMubGVuIDogdGhpcy5pbnM7IH1cbiAgICBnZXQgdGV4dCgpIHtcbiAgICAgICAgbGV0IHsgaW5zZXJ0ZWQgfSA9IHRoaXMuc2V0LCBpbmRleCA9ICh0aGlzLmkgLSAyKSA+PiAxO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gaW5zZXJ0ZWQubGVuZ3RoID8gVGV4dC5lbXB0eSA6IGluc2VydGVkW2luZGV4XTtcbiAgICB9XG4gICAgdGV4dEJpdChsZW4pIHtcbiAgICAgICAgbGV0IHsgaW5zZXJ0ZWQgfSA9IHRoaXMuc2V0LCBpbmRleCA9ICh0aGlzLmkgLSAyKSA+PiAxO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gaW5zZXJ0ZWQubGVuZ3RoICYmICFsZW4gPyBUZXh0LmVtcHR5XG4gICAgICAgICAgICA6IGluc2VydGVkW2luZGV4XS5zbGljZSh0aGlzLm9mZiwgbGVuID09IG51bGwgPyB1bmRlZmluZWQgOiB0aGlzLm9mZiArIGxlbik7XG4gICAgfVxuICAgIGZvcndhcmQobGVuKSB7XG4gICAgICAgIGlmIChsZW4gPT0gdGhpcy5sZW4pXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxlbiAtPSBsZW47XG4gICAgICAgICAgICB0aGlzLm9mZiArPSBsZW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yd2FyZDIobGVuKSB7XG4gICAgICAgIGlmICh0aGlzLmlucyA9PSAtMSlcbiAgICAgICAgICAgIHRoaXMuZm9yd2FyZChsZW4pO1xuICAgICAgICBlbHNlIGlmIChsZW4gPT0gdGhpcy5pbnMpXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucyAtPSBsZW47XG4gICAgICAgICAgICB0aGlzLm9mZiArPSBsZW47XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuQSBzaW5nbGUgc2VsZWN0aW9uIHJhbmdlLiBXaGVuXG5bYGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5hbGxvd011bHRpcGxlU2VsZWN0aW9ucylcbmlzIGVuYWJsZWQsIGEgW3NlbGVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTZWxlY3Rpb24pIG1heSBob2xkXG5tdWx0aXBsZSByYW5nZXMuIEJ5IGRlZmF1bHQsIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IG9uZSByYW5nZS5cbiovXG5jbGFzcyBTZWxlY3Rpb25SYW5nZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBhbmNob3Igb2YgdGhlIHJhbmdlXHUyMDE0dGhlIHNpZGUgdGhhdCBkb2Vzbid0IG1vdmUgd2hlbiB5b3VcbiAgICBleHRlbmQgaXQuXG4gICAgKi9cbiAgICBnZXQgYW5jaG9yKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDMyIC8qIFJhbmdlRmxhZy5JbnZlcnRlZCAqLyA/IHRoaXMudG8gOiB0aGlzLmZyb207IH1cbiAgICAvKipcbiAgICBUaGUgaGVhZCBvZiB0aGUgcmFuZ2UsIHdoaWNoIGlzIG1vdmVkIHdoZW4gdGhlIHJhbmdlIGlzXG4gICAgW2V4dGVuZGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvblJhbmdlLmV4dGVuZCkuXG4gICAgKi9cbiAgICBnZXQgaGVhZCgpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiAzMiAvKiBSYW5nZUZsYWcuSW52ZXJ0ZWQgKi8gPyB0aGlzLmZyb20gOiB0aGlzLnRvOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIGBhbmNob3JgIGFuZCBgaGVhZGAgYXJlIGF0IHRoZSBzYW1lIHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5mcm9tID09IHRoaXMudG87IH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgY3Vyc29yIHRoYXQgaXMgZXhwbGljaXRseSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAgY2hhcmFjdGVyIG9uIG9uZSBvZiBpdHMgc2lkZXMsIHRoaXMgcmV0dXJucyB0aGUgc2lkZS4gLTEgbWVhbnNcbiAgICB0aGUgY2hhcmFjdGVyIGJlZm9yZSBpdHMgcG9zaXRpb24sIDEgdGhlIGNoYXJhY3RlciBhZnRlciwgYW5kIDBcbiAgICBtZWFucyBubyBhc3NvY2lhdGlvbi5cbiAgICAqL1xuICAgIGdldCBhc3NvYygpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA/IC0xIDogdGhpcy5mbGFncyAmIDE2IC8qIFJhbmdlRmxhZy5Bc3NvY0FmdGVyICovID8gMSA6IDA7IH1cbiAgICAvKipcbiAgICBUaGUgYmlkaXJlY3Rpb25hbCB0ZXh0IGxldmVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGN1cnNvciwgaWZcbiAgICBhbnkuXG4gICAgKi9cbiAgICBnZXQgYmlkaUxldmVsKCkge1xuICAgICAgICBsZXQgbGV2ZWwgPSB0aGlzLmZsYWdzICYgNyAvKiBSYW5nZUZsYWcuQmlkaUxldmVsTWFzayAqLztcbiAgICAgICAgcmV0dXJuIGxldmVsID09IDcgPyBudWxsIDogbGV2ZWw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBnb2FsIGNvbHVtbiAoc3RvcmVkIHZlcnRpY2FsIG9mZnNldCkgYXNzb2NpYXRlZCB3aXRoIGFcbiAgICBjdXJzb3IuIFRoaXMgaXMgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgdmVydGljYWwgcG9zaXRpb24gd2hlblxuICAgIFttb3ZpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVWZXJ0aWNhbGx5KSBhY3Jvc3NcbiAgICBsaW5lcyBvZiBkaWZmZXJlbnQgbGVuZ3RoLlxuICAgICovXG4gICAgZ2V0IGdvYWxDb2x1bW4oKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZmxhZ3MgPj4gNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLztcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IDE2Nzc3MjE1IC8qIFJhbmdlRmxhZy5Ob0dvYWxDb2x1bW4gKi8gPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoaXMgcmFuZ2UgdGhyb3VnaCBhIGNoYW5nZSwgcHJvZHVjaW5nIGEgdmFsaWQgcmFuZ2UgaW4gdGhlXG4gICAgdXBkYXRlZCBkb2N1bWVudC5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2UsIGFzc29jID0gLTEpIHtcbiAgICAgICAgbGV0IGZyb20sIHRvO1xuICAgICAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgZnJvbSA9IHRvID0gY2hhbmdlLm1hcFBvcyh0aGlzLmZyb20sIGFzc29jKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gPSBjaGFuZ2UubWFwUG9zKHRoaXMuZnJvbSwgMSk7XG4gICAgICAgICAgICB0byA9IGNoYW5nZS5tYXBQb3ModGhpcy50bywgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tID09IHRoaXMuZnJvbSAmJiB0byA9PSB0aGlzLnRvID8gdGhpcyA6IG5ldyBTZWxlY3Rpb25SYW5nZShmcm9tLCB0bywgdGhpcy5mbGFncyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dGVuZCB0aGlzIHJhbmdlIHRvIGNvdmVyIGF0IGxlYXN0IGBmcm9tYCB0byBgdG9gLlxuICAgICovXG4gICAgZXh0ZW5kKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSA8PSB0aGlzLmFuY2hvciAmJiB0byA+PSB0aGlzLmFuY2hvcilcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICBsZXQgaGVhZCA9IE1hdGguYWJzKGZyb20gLSB0aGlzLmFuY2hvcikgPiBNYXRoLmFicyh0byAtIHRoaXMuYW5jaG9yKSA/IGZyb20gOiB0bztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0aGlzLmFuY2hvciwgaGVhZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyByYW5nZSB0byBhbm90aGVyIHJhbmdlLlxuICAgICovXG4gICAgZXEob3RoZXIsIGluY2x1ZGVBc3NvYyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuY2hvciA9PSBvdGhlci5hbmNob3IgJiYgdGhpcy5oZWFkID09IG90aGVyLmhlYWQgJiZcbiAgICAgICAgICAgICghaW5jbHVkZUFzc29jIHx8ICF0aGlzLmVtcHR5IHx8IHRoaXMuYXNzb2MgPT0gb3RoZXIuYXNzb2MpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBKU09OLXNlcmlhbGl6YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHsgcmV0dXJuIHsgYW5jaG9yOiB0aGlzLmFuY2hvciwgaGVhZDogdGhpcy5oZWFkIH07IH1cbiAgICAvKipcbiAgICBDb252ZXJ0IGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIHJhbmdlIHRvIGEgYFNlbGVjdGlvblJhbmdlYFxuICAgIGluc3RhbmNlLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmhlYWQgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBTZWxlY3Rpb25SYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShqc29uLmFuY2hvciwganNvbi5oZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGZyb20sIHRvLCBmbGFncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvblJhbmdlKGZyb20sIHRvLCBmbGFncyk7XG4gICAgfVxufVxuLyoqXG5BbiBlZGl0b3Igc2VsZWN0aW9uIGhvbGRzIG9uZSBvciBtb3JlIHNlbGVjdGlvbiByYW5nZXMuXG4qL1xuY2xhc3MgRWRpdG9yU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcmFuZ2VzIGluIHRoZSBzZWxlY3Rpb24sIHNvcnRlZCBieSBwb3NpdGlvbi4gUmFuZ2VzIGNhbm5vdFxuICAgIG92ZXJsYXAgKGJ1dCB0aGV5IG1heSB0b3VjaCwgaWYgdGhleSBhcmVuJ3QgZW1wdHkpLlxuICAgICovXG4gICAgcmFuZ2VzLCBcbiAgICAvKipcbiAgICBUaGUgaW5kZXggb2YgdGhlIF9tYWluXyByYW5nZSBpbiB0aGUgc2VsZWN0aW9uICh3aGljaCBpc1xuICAgIHVzdWFsbHkgdGhlIHJhbmdlIHRoYXQgd2FzIGFkZGVkIGxhc3QpLlxuICAgICovXG4gICAgbWFpbkluZGV4KSB7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLm1haW5JbmRleCA9IG1haW5JbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGEgc2VsZWN0aW9uIHRocm91Z2ggYSBjaGFuZ2UuIFVzZWQgdG8gYWRqdXN0IHRoZSBzZWxlY3Rpb25cbiAgICBwb3NpdGlvbiBmb3IgY2hhbmdlcy5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2UsIGFzc29jID0gLTEpIHtcbiAgICAgICAgaWYgKGNoYW5nZS5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnJhbmdlcy5tYXAociA9PiByLm1hcChjaGFuZ2UsIGFzc29jKSksIHRoaXMubWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHNlbGVjdGlvbiB0byBhbm90aGVyIHNlbGVjdGlvbi4gQnkgZGVmYXVsdCwgcmFuZ2VzXG4gICAgYXJlIGNvbXBhcmVkIG9ubHkgYnkgcG9zaXRpb24uIFdoZW4gYGluY2x1ZGVBc3NvY2AgaXMgdHJ1ZSxcbiAgICBjdXJzb3IgcmFuZ2VzIG11c3QgYWxzbyBoYXZlIHRoZSBzYW1lXG4gICAgW2Bhc3NvY2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuYXNzb2MpIHZhbHVlLlxuICAgICovXG4gICAgZXEob3RoZXIsIGluY2x1ZGVBc3NvYyA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlcy5sZW5ndGggIT0gb3RoZXIucmFuZ2VzLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5tYWluSW5kZXggIT0gb3RoZXIubWFpbkluZGV4KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnJhbmdlc1tpXS5lcShvdGhlci5yYW5nZXNbaV0sIGluY2x1ZGVBc3NvYykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwcmltYXJ5IHNlbGVjdGlvbiByYW5nZS4gVXN1YWxseSwgeW91IHNob3VsZCBtYWtlIHN1cmVcbiAgICB5b3VyIGNvZGUgYXBwbGllcyB0byBfYWxsXyByYW5nZXMsIGJ5IHVzaW5nIG1ldGhvZHMgbGlrZVxuICAgIFtgY2hhbmdlQnlSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhbmdlQnlSYW5nZSkuXG4gICAgKi9cbiAgICBnZXQgbWFpbigpIHsgcmV0dXJuIHRoaXMucmFuZ2VzW3RoaXMubWFpbkluZGV4XTsgfVxuICAgIC8qKlxuICAgIE1ha2Ugc3VyZSB0aGUgc2VsZWN0aW9uIG9ubHkgaGFzIG9uZSByYW5nZS4gUmV0dXJucyBhIHNlbGVjdGlvblxuICAgIGhvbGRpbmcgb25seSB0aGUgbWFpbiByYW5nZSBmcm9tIHRoaXMgc2VsZWN0aW9uLlxuICAgICovXG4gICAgYXNTaW5nbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlcy5sZW5ndGggPT0gMSA/IHRoaXMgOiBuZXcgRWRpdG9yU2VsZWN0aW9uKFt0aGlzLm1haW5dLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0ZW5kIHRoaXMgc2VsZWN0aW9uIHdpdGggYW4gZXh0cmEgcmFuZ2UuXG4gICAgKi9cbiAgICBhZGRSYW5nZShyYW5nZSwgbWFpbiA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoW3JhbmdlXS5jb25jYXQodGhpcy5yYW5nZXMpLCBtYWluID8gMCA6IHRoaXMubWFpbkluZGV4ICsgMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSBnaXZlbiByYW5nZSB3aXRoIGFub3RoZXIgcmFuZ2UsIGFuZCB0aGVuIG5vcm1hbGl6ZSB0aGVcbiAgICBzZWxlY3Rpb24gdG8gbWVyZ2UgYW5kIHNvcnQgcmFuZ2VzIGlmIG5lY2Vzc2FyeS5cbiAgICAqL1xuICAgIHJlcGxhY2VSYW5nZShyYW5nZSwgd2hpY2ggPSB0aGlzLm1haW5JbmRleCkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gdGhpcy5yYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgcmFuZ2VzW3doaWNoXSA9IHJhbmdlO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMsIHRoaXMubWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIHNlbGVjdGlvbiB0byBhbiBvYmplY3QgdGhhdCBjYW4gYmUgc2VyaWFsaXplZCB0b1xuICAgIEpTT04uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlczogdGhpcy5yYW5nZXMubWFwKHIgPT4gci50b0pTT04oKSksIG1haW46IHRoaXMubWFpbkluZGV4IH07XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlbGVjdGlvbiBmcm9tIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbiB8fCAhQXJyYXkuaXNBcnJheShqc29uLnJhbmdlcykgfHwgdHlwZW9mIGpzb24ubWFpbiAhPSBcIm51bWJlclwiIHx8IGpzb24ubWFpbiA+PSBqc29uLnJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRWRpdG9yU2VsZWN0aW9uXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihqc29uLnJhbmdlcy5tYXAoKHIpID0+IFNlbGVjdGlvblJhbmdlLmZyb21KU09OKHIpKSwganNvbi5tYWluKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VsZWN0aW9uIGhvbGRpbmcgYSBzaW5nbGUgcmFuZ2UuXG4gICAgKi9cbiAgICBzdGF0aWMgc2luZ2xlKGFuY2hvciwgaGVhZCA9IGFuY2hvcikge1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihbRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGFuY2hvciwgaGVhZCldLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU29ydCBhbmQgbWVyZ2UgdGhlIGdpdmVuIHNldCBvZiByYW5nZXMsIGNyZWF0aW5nIGEgdmFsaWRcbiAgICBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHJhbmdlcywgbWFpbkluZGV4ID0gMCkge1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBIHNlbGVjdGlvbiBuZWVkcyBhdCBsZWFzdCBvbmUgcmFuZ2VcIik7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkgPyByYW5nZS5mcm9tIDw9IHBvcyA6IHJhbmdlLmZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5ub3JtYWxpemVkKHJhbmdlcy5zbGljZSgpLCBtYWluSW5kZXgpO1xuICAgICAgICAgICAgcG9zID0gcmFuZ2UudG87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24ocmFuZ2VzLCBtYWluSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjdXJzb3Igc2VsZWN0aW9uIHJhbmdlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gWW91IGNhblxuICAgIHNhZmVseSBpZ25vcmUgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBpbiBtb3N0IHNpdHVhdGlvbnMuXG4gICAgKi9cbiAgICBzdGF0aWMgY3Vyc29yKHBvcywgYXNzb2MgPSAwLCBiaWRpTGV2ZWwsIGdvYWxDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvblJhbmdlLmNyZWF0ZShwb3MsIHBvcywgKGFzc29jID09IDAgPyAwIDogYXNzb2MgPCAwID8gOCAvKiBSYW5nZUZsYWcuQXNzb2NCZWZvcmUgKi8gOiAxNiAvKiBSYW5nZUZsYWcuQXNzb2NBZnRlciAqLykgfFxuICAgICAgICAgICAgKGJpZGlMZXZlbCA9PSBudWxsID8gNyA6IE1hdGgubWluKDYsIGJpZGlMZXZlbCkpIHxcbiAgICAgICAgICAgICgoZ29hbENvbHVtbiAhPT0gbnVsbCAmJiBnb2FsQ29sdW1uICE9PSB2b2lkIDAgPyBnb2FsQ29sdW1uIDogMTY3NzcyMTUgLyogUmFuZ2VGbGFnLk5vR29hbENvbHVtbiAqLykgPDwgNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZWxlY3Rpb24gcmFuZ2UuXG4gICAgKi9cbiAgICBzdGF0aWMgcmFuZ2UoYW5jaG9yLCBoZWFkLCBnb2FsQ29sdW1uLCBiaWRpTGV2ZWwpIHtcbiAgICAgICAgbGV0IGZsYWdzID0gKChnb2FsQ29sdW1uICE9PSBudWxsICYmIGdvYWxDb2x1bW4gIT09IHZvaWQgMCA/IGdvYWxDb2x1bW4gOiAxNjc3NzIxNSAvKiBSYW5nZUZsYWcuTm9Hb2FsQ29sdW1uICovKSA8PCA2IC8qIFJhbmdlRmxhZy5Hb2FsQ29sdW1uT2Zmc2V0ICovKSB8XG4gICAgICAgICAgICAoYmlkaUxldmVsID09IG51bGwgPyA3IDogTWF0aC5taW4oNiwgYmlkaUxldmVsKSk7XG4gICAgICAgIHJldHVybiBoZWFkIDwgYW5jaG9yID8gU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKGhlYWQsIGFuY2hvciwgMzIgLyogUmFuZ2VGbGFnLkludmVydGVkICovIHwgMTYgLyogUmFuZ2VGbGFnLkFzc29jQWZ0ZXIgKi8gfCBmbGFncylcbiAgICAgICAgICAgIDogU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKGFuY2hvciwgaGVhZCwgKGhlYWQgPiBhbmNob3IgPyA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA6IDApIHwgZmxhZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBub3JtYWxpemVkKHJhbmdlcywgbWFpbkluZGV4ID0gMCkge1xuICAgICAgICBsZXQgbWFpbiA9IHJhbmdlc1ttYWluSW5kZXhdO1xuICAgICAgICByYW5nZXMuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKTtcbiAgICAgICAgbWFpbkluZGV4ID0gcmFuZ2VzLmluZGV4T2YobWFpbik7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbaV0sIHByZXYgPSByYW5nZXNbaSAtIDFdO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5ID8gcmFuZ2UuZnJvbSA8PSBwcmV2LnRvIDogcmFuZ2UuZnJvbSA8IHByZXYudG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHByZXYuZnJvbSwgdG8gPSBNYXRoLm1heChyYW5nZS50bywgcHJldi50byk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbWFpbkluZGV4KVxuICAgICAgICAgICAgICAgICAgICBtYWluSW5kZXgtLTtcbiAgICAgICAgICAgICAgICByYW5nZXMuc3BsaWNlKC0taSwgMiwgcmFuZ2UuYW5jaG9yID4gcmFuZ2UuaGVhZCA/IEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0bywgZnJvbSkgOiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihyYW5nZXMsIG1haW5JbmRleCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBkb2NMZW5ndGgpIHtcbiAgICBmb3IgKGxldCByYW5nZSBvZiBzZWxlY3Rpb24ucmFuZ2VzKVxuICAgICAgICBpZiAocmFuZ2UudG8gPiBkb2NMZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNlbGVjdGlvbiBwb2ludHMgb3V0c2lkZSBvZiBkb2N1bWVudFwiKTtcbn1cblxubGV0IG5leHRJRCA9IDA7XG4vKipcbkEgZmFjZXQgaXMgYSBsYWJlbGVkIHZhbHVlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVkaXRvclxuc3RhdGUuIEl0IHRha2VzIGlucHV0cyBmcm9tIGFueSBudW1iZXIgb2YgZXh0ZW5zaW9ucywgYW5kIGNvbWJpbmVzXG50aG9zZSBpbnRvIGEgc2luZ2xlIG91dHB1dCB2YWx1ZS5cblxuRXhhbXBsZXMgb2YgdXNlcyBvZiBmYWNldHMgYXJlIHRoZSBbdGFiXG5zaXplXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpLCBbZWRpdG9yXG5hdHRyaWJ1dGVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15lZGl0b3JBdHRyaWJ1dGVzKSwgYW5kIFt1cGRhdGVcbmxpc3RlbmVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedXBkYXRlTGlzdGVuZXIpLlxuXG5Ob3RlIHRoYXQgYEZhY2V0YCBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYW55d2hlcmUgd2hlcmVcbltgRmFjZXRSZWFkZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0UmVhZGVyKSBpcyBleHBlY3RlZC5cbiovXG5jbGFzcyBGYWNldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21iaW5lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmVJbnB1dCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlLCBpc1N0YXRpYywgZW5hYmxlcykge1xuICAgICAgICB0aGlzLmNvbWJpbmUgPSBjb21iaW5lO1xuICAgICAgICB0aGlzLmNvbXBhcmVJbnB1dCA9IGNvbXBhcmVJbnB1dDtcbiAgICAgICAgdGhpcy5jb21wYXJlID0gY29tcGFyZTtcbiAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBuZXh0SUQrKztcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gY29tYmluZShbXSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHR5cGVvZiBlbmFibGVzID09IFwiZnVuY3Rpb25cIiA/IGVuYWJsZXModGhpcykgOiBlbmFibGVzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgZmFjZXQgcmVhZGVyIGZvciB0aGlzIGZhY2V0LCB3aGljaCBjYW4gYmUgdXNlZCB0b1xuICAgIFtyZWFkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmZhY2V0KSBpdCBidXQgbm90IHRvIGRlZmluZSB2YWx1ZXMgZm9yIGl0LlxuICAgICovXG4gICAgZ2V0IHJlYWRlcigpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBuZXcgZmFjZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXQoY29uZmlnLmNvbWJpbmUgfHwgKChhKSA9PiBhKSwgY29uZmlnLmNvbXBhcmVJbnB1dCB8fCAoKGEsIGIpID0+IGEgPT09IGIpLCBjb25maWcuY29tcGFyZSB8fCAoIWNvbmZpZy5jb21iaW5lID8gc2FtZUFycmF5IDogKGEsIGIpID0+IGEgPT09IGIpLCAhIWNvbmZpZy5zdGF0aWMsIGNvbmZpZy5lbmFibGVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGlzIGZhY2V0LlxuICAgICovXG4gICAgb2YodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldFByb3ZpZGVyKFtdLCB0aGlzLCAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29tcHV0ZXMgYSB2YWx1ZSBmb3IgdGhlIGZhY2V0IGZyb20gYVxuICAgIHN0YXRlLiBZb3UgbXVzdCB0YWtlIGNhcmUgdG8gZGVjbGFyZSB0aGUgcGFydHMgb2YgdGhlIHN0YXRlIHRoYXRcbiAgICB0aGlzIHZhbHVlIGRlcGVuZHMgb24sIHNpbmNlIHlvdXIgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYWdhaW5cbiAgICBmb3IgYSBuZXcgc3RhdGUgd2hlbiBvbmUgb2YgdGhvc2UgcGFydHMgY2hhbmdlZC5cbiAgICBcbiAgICBJbiBjYXNlcyB3aGVyZSB5b3VyIHZhbHVlIGRlcGVuZHMgb25seSBvbiBhIHNpbmdsZSBmaWVsZCwgeW91J2xsXG4gICAgd2FudCB0byB1c2UgdGhlIFtgZnJvbWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXQuZnJvbSkgbWV0aG9kIGluc3RlYWQuXG4gICAgKi9cbiAgICBjb21wdXRlKGRlcHMsIGdldCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0YXRpYylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbXB1dGUgYSBzdGF0aWMgZmFjZXRcIik7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXRQcm92aWRlcihkZXBzLCB0aGlzLCAxIC8qIFByb3ZpZGVyLlNpbmdsZSAqLywgZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGNvbXB1dGVzIHplcm8gb3IgbW9yZSB2YWx1ZXMgZm9yIHRoaXNcbiAgICBmYWNldCBmcm9tIGEgc3RhdGUuXG4gICAgKi9cbiAgICBjb21wdXRlTihkZXBzLCBnZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjb21wdXRlIGEgc3RhdGljIGZhY2V0XCIpO1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0UHJvdmlkZXIoZGVwcywgdGhpcywgMiAvKiBQcm92aWRlci5NdWx0aSAqLywgZ2V0KTtcbiAgICB9XG4gICAgZnJvbShmaWVsZCwgZ2V0KSB7XG4gICAgICAgIGlmICghZ2V0KVxuICAgICAgICAgICAgZ2V0ID0geCA9PiB4O1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlKFtmaWVsZF0sIHN0YXRlID0+IGdldChzdGF0ZS5maWVsZChmaWVsZCkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lQXJyYXkoYSwgYikge1xuICAgIHJldHVybiBhID09IGIgfHwgYS5sZW5ndGggPT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoZSwgaSkgPT4gZSA9PT0gYltpXSk7XG59XG5jbGFzcyBGYWNldFByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZXBlbmRlbmNpZXMsIGZhY2V0LCB0eXBlLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgdGhpcy5mYWNldCA9IGZhY2V0O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaWQgPSBuZXh0SUQrKztcbiAgICB9XG4gICAgZHluYW1pY1Nsb3QoYWRkcmVzc2VzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGdldHRlciA9IHRoaXMudmFsdWU7XG4gICAgICAgIGxldCBjb21wYXJlID0gdGhpcy5mYWNldC5jb21wYXJlSW5wdXQ7XG4gICAgICAgIGxldCBpZCA9IHRoaXMuaWQsIGlkeCA9IGFkZHJlc3Nlc1tpZF0gPj4gMSwgbXVsdGkgPSB0aGlzLnR5cGUgPT0gMiAvKiBQcm92aWRlci5NdWx0aSAqLztcbiAgICAgICAgbGV0IGRlcERvYyA9IGZhbHNlLCBkZXBTZWwgPSBmYWxzZSwgZGVwQWRkcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZGVwIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBpZiAoZGVwID09IFwiZG9jXCIpXG4gICAgICAgICAgICAgICAgZGVwRG9jID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRlcCA9PSBcInNlbGVjdGlvblwiKVxuICAgICAgICAgICAgICAgIGRlcFNlbCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmICgoKChfYSA9IGFkZHJlc3Nlc1tkZXAuaWRdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAxKSAmIDEpID09IDApXG4gICAgICAgICAgICAgICAgZGVwQWRkcnMucHVzaChhZGRyZXNzZXNbZGVwLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlKHN0YXRlLCB0cikge1xuICAgICAgICAgICAgICAgIGlmICgoZGVwRG9jICYmIHRyLmRvY0NoYW5nZWQpIHx8IChkZXBTZWwgJiYgKHRyLmRvY0NoYW5nZWQgfHwgdHIuc2VsZWN0aW9uKSkgfHwgZW5zdXJlQWxsKHN0YXRlLCBkZXBBZGRycykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1ZhbCA9IGdldHRlcihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aSA/ICFjb21wYXJlQXJyYXkobmV3VmFsLCBzdGF0ZS52YWx1ZXNbaWR4XSwgY29tcGFyZSkgOiAhY29tcGFyZShuZXdWYWwsIHN0YXRlLnZhbHVlc1tpZHhdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjb25maWd1cmU6IChzdGF0ZSwgb2xkU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFsLCBvbGRBZGRyID0gb2xkU3RhdGUuY29uZmlnLmFkZHJlc3NbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChvbGRBZGRyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9sZFZhbCA9IGdldEFkZHIob2xkU3RhdGUsIG9sZEFkZHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMuZXZlcnkoZGVwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXAgaW5zdGFuY2VvZiBGYWNldCA/IG9sZFN0YXRlLmZhY2V0KGRlcCkgPT09IHN0YXRlLmZhY2V0KGRlcCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcCBpbnN0YW5jZW9mIFN0YXRlRmllbGQgPyBvbGRTdGF0ZS5maWVsZChkZXAsIGZhbHNlKSA9PSBzdGF0ZS5maWVsZChkZXAsIGZhbHNlKSA6IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pIHx8IChtdWx0aSA/IGNvbXBhcmVBcnJheShuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpLCBvbGRWYWwsIGNvbXBhcmUpIDogY29tcGFyZShuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpLCBvbGRWYWwpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmVBcnJheShhLCBiLCBjb21wYXJlKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWNvbXBhcmUoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBlbnN1cmVBbGwoc3RhdGUsIGFkZHJzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBhZGRyIG9mIGFkZHJzKVxuICAgICAgICBpZiAoZW5zdXJlQWRkcihzdGF0ZSwgYWRkcikgJiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLylcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gZHluYW1pY0ZhY2V0U2xvdChhZGRyZXNzZXMsIGZhY2V0LCBwcm92aWRlcnMpIHtcbiAgICBsZXQgcHJvdmlkZXJBZGRycyA9IHByb3ZpZGVycy5tYXAocCA9PiBhZGRyZXNzZXNbcC5pZF0pO1xuICAgIGxldCBwcm92aWRlclR5cGVzID0gcHJvdmlkZXJzLm1hcChwID0+IHAudHlwZSk7XG4gICAgbGV0IGR5bmFtaWMgPSBwcm92aWRlckFkZHJzLmZpbHRlcihwID0+ICEocCAmIDEpKTtcbiAgICBsZXQgaWR4ID0gYWRkcmVzc2VzW2ZhY2V0LmlkXSA+PiAxO1xuICAgIGZ1bmN0aW9uIGdldChzdGF0ZSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXJBZGRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0QWRkcihzdGF0ZSwgcHJvdmlkZXJBZGRyc1tpXSk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJUeXBlc1tpXSA9PSAyIC8qIFByb3ZpZGVyLk11bHRpICovKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhY2V0LmNvbWJpbmUodmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBhZGRyIG9mIHByb3ZpZGVyQWRkcnMpXG4gICAgICAgICAgICAgICAgZW5zdXJlQWRkcihzdGF0ZSwgYWRkcik7XG4gICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZShzdGF0ZSwgdHIpIHtcbiAgICAgICAgICAgIGlmICghZW5zdXJlQWxsKHN0YXRlLCBkeW5hbWljKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZmFjZXQuY29tcGFyZSh2YWx1ZSwgc3RhdGUudmFsdWVzW2lkeF0pKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb25maWd1cmUoc3RhdGUsIG9sZFN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgZGVwQ2hhbmdlZCA9IGVuc3VyZUFsbChzdGF0ZSwgcHJvdmlkZXJBZGRycyk7XG4gICAgICAgICAgICBsZXQgb2xkUHJvdmlkZXJzID0gb2xkU3RhdGUuY29uZmlnLmZhY2V0c1tmYWNldC5pZF0sIG9sZFZhbHVlID0gb2xkU3RhdGUuZmFjZXQoZmFjZXQpO1xuICAgICAgICAgICAgaWYgKG9sZFByb3ZpZGVycyAmJiAhZGVwQ2hhbmdlZCAmJiBzYW1lQXJyYXkocHJvdmlkZXJzLCBvbGRQcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZmFjZXQuY29tcGFyZSh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH1cbiAgICB9O1xufVxuY29uc3QgaW5pdEZpZWxkID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IHN0YXRpYzogdHJ1ZSB9KTtcbi8qKlxuRmllbGRzIGNhbiBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIGFuIGVkaXRvciBzdGF0ZSwgYW5kXG5rZWVwIGl0IGluIHN5bmMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3RhdGUuXG4qL1xuY2xhc3MgU3RhdGVGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpZCwgY3JlYXRlRiwgdXBkYXRlRiwgY29tcGFyZUYsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuY3JlYXRlRiA9IGNyZWF0ZUY7XG4gICAgICAgIHRoaXMudXBkYXRlRiA9IHVwZGF0ZUY7XG4gICAgICAgIHRoaXMuY29tcGFyZUYgPSBjb21wYXJlRjtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3ZpZGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBzdGF0ZSBmaWVsZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY29uZmlnKSB7XG4gICAgICAgIGxldCBmaWVsZCA9IG5ldyBTdGF0ZUZpZWxkKG5leHRJRCsrLCBjb25maWcuY3JlYXRlLCBjb25maWcudXBkYXRlLCBjb25maWcuY29tcGFyZSB8fCAoKGEsIGIpID0+IGEgPT09IGIpLCBjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGUpXG4gICAgICAgICAgICBmaWVsZC5wcm92aWRlcyA9IGNvbmZpZy5wcm92aWRlKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICBjcmVhdGUoc3RhdGUpIHtcbiAgICAgICAgbGV0IGluaXQgPSBzdGF0ZS5mYWNldChpbml0RmllbGQpLmZpbmQoaSA9PiBpLmZpZWxkID09IHRoaXMpO1xuICAgICAgICByZXR1cm4gKChpbml0ID09PSBudWxsIHx8IGluaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXQuY3JlYXRlKSB8fCB0aGlzLmNyZWF0ZUYpKHN0YXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzbG90KGFkZHJlc3Nlcykge1xuICAgICAgICBsZXQgaWR4ID0gYWRkcmVzc2VzW3RoaXMuaWRdID4+IDE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjcmVhdGU6IChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdGhpcy5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGU6IChzdGF0ZSwgdHIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgb2xkVmFsID0gc3RhdGUudmFsdWVzW2lkeF07XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy51cGRhdGVGKG9sZFZhbCwgdHIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmVGKG9sZFZhbCwgdmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWNvbmZpZ3VyZTogKHN0YXRlLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5jb25maWcuYWRkcmVzc1t0aGlzLmlkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkU3RhdGUuZmllbGQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHRoaXMuY3JlYXRlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyB0aGlzIGZpZWxkIGFuZCBvdmVycmlkZXMgdGhlXG4gICAgd2F5IGl0IGlzIGluaXRpYWxpemVkLiBDYW4gYmUgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gcHJvdmlkZSBhXG4gICAgbm9uLWRlZmF1bHQgc3RhcnRpbmcgdmFsdWUgZm9yIHRoZSBmaWVsZC5cbiAgICAqL1xuICAgIGluaXQoY3JlYXRlKSB7XG4gICAgICAgIHJldHVybiBbdGhpcywgaW5pdEZpZWxkLm9mKHsgZmllbGQ6IHRoaXMsIGNyZWF0ZSB9KV07XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXRlIGZpZWxkIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhc1xuICAgIFtgRXh0ZW5zaW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FeHRlbnNpb24pIHZhbHVlcyB0byBlbmFibGUgdGhlIGZpZWxkIGluIGFcbiAgICBnaXZlbiBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBleHRlbnNpb24oKSB7IHJldHVybiB0aGlzOyB9XG59XG5jb25zdCBQcmVjXyA9IHsgbG93ZXN0OiA0LCBsb3c6IDMsIGRlZmF1bHQ6IDIsIGhpZ2g6IDEsIGhpZ2hlc3Q6IDAgfTtcbmZ1bmN0aW9uIHByZWModmFsdWUpIHtcbiAgICByZXR1cm4gKGV4dCkgPT4gbmV3IFByZWNFeHRlbnNpb24oZXh0LCB2YWx1ZSk7XG59XG4vKipcbkJ5IGRlZmF1bHQgZXh0ZW5zaW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmRcbmluIHRoZSBmbGF0dGVuZWQgZm9ybSBvZiBuZXN0ZWQgYXJyYXkgdGhhdCB3YXMgcHJvdmlkZWQuXG5JbmRpdmlkdWFsIGV4dGVuc2lvbiB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIGEgcHJlY2VkZW5jZSB0b1xub3ZlcnJpZGUgdGhpcy4gRXh0ZW5zaW9ucyB0aGF0IGRvIG5vdCBoYXZlIGEgcHJlY2VkZW5jZSBzZXQgZ2V0XG50aGUgcHJlY2VkZW5jZSBvZiB0aGUgbmVhcmVzdCBwYXJlbnQgd2l0aCBhIHByZWNlZGVuY2UsIG9yXG5bYGRlZmF1bHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlByZWMuZGVmYXVsdCkgaWYgdGhlcmUgaXMgbm8gc3VjaCBwYXJlbnQuIFRoZVxuZmluYWwgb3JkZXJpbmcgb2YgZXh0ZW5zaW9ucyBpcyBkZXRlcm1pbmVkIGJ5IGZpcnN0IHNvcnRpbmcgYnlcbnByZWNlZGVuY2UgYW5kIHRoZW4gYnkgb3JkZXIgd2l0aGluIGVhY2ggcHJlY2VkZW5jZS5cbiovXG5jb25zdCBQcmVjID0ge1xuICAgIC8qKlxuICAgIFRoZSBoaWdoZXN0IHByZWNlZGVuY2UgbGV2ZWwsIGZvciBleHRlbnNpb25zIHRoYXQgc2hvdWxkIGVuZCB1cFxuICAgIG5lYXIgdGhlIHN0YXJ0IG9mIHRoZSBwcmVjZWRlbmNlIG9yZGVyaW5nLlxuICAgICovXG4gICAgaGlnaGVzdDogLypAX19QVVJFX18qL3ByZWMoUHJlY18uaGlnaGVzdCksXG4gICAgLyoqXG4gICAgQSBoaWdoZXItdGhhbi1kZWZhdWx0IHByZWNlZGVuY2UsIGZvciBleHRlbnNpb25zIHRoYXQgc2hvdWxkXG4gICAgY29tZSBiZWZvcmUgdGhvc2Ugd2l0aCBkZWZhdWx0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBoaWdoOiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5oaWdoKSxcbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCBwcmVjZWRlbmNlLCB3aGljaCBpcyBhbHNvIHVzZWQgZm9yIGV4dGVuc2lvbnNcbiAgICB3aXRob3V0IGFuIGV4cGxpY2l0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBkZWZhdWx0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5kZWZhdWx0KSxcbiAgICAvKipcbiAgICBBIGxvd2VyLXRoYW4tZGVmYXVsdCBwcmVjZWRlbmNlLlxuICAgICovXG4gICAgbG93OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5sb3cpLFxuICAgIC8qKlxuICAgIFRoZSBsb3dlc3QgcHJlY2VkZW5jZSBsZXZlbC4gTWVhbnQgZm9yIHRoaW5ncyB0aGF0IHNob3VsZCBlbmQgdXBcbiAgICBuZWFyIHRoZSBlbmQgb2YgdGhlIGV4dGVuc2lvbiBvcmRlci5cbiAgICAqL1xuICAgIGxvd2VzdDogLypAX19QVVJFX18qL3ByZWMoUHJlY18ubG93ZXN0KVxufTtcbmNsYXNzIFByZWNFeHRlbnNpb24ge1xuICAgIGNvbnN0cnVjdG9yKGlubmVyLCBwcmVjKSB7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5wcmVjID0gcHJlYztcbiAgICB9XG59XG4vKipcbkV4dGVuc2lvbiBjb21wYXJ0bWVudHMgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIGNvbmZpZ3VyYXRpb25cbmR5bmFtaWMuIEJ5IFt3cmFwcGluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Db21wYXJ0bWVudC5vZikgcGFydCBvZiB5b3VyXG5jb25maWd1cmF0aW9uIGluIGEgY29tcGFydG1lbnQsIHlvdSBjYW4gbGF0ZXJcbltyZXBsYWNlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50LnJlY29uZmlndXJlKSB0aGF0IHBhcnQgdGhyb3VnaCBhXG50cmFuc2FjdGlvbi5cbiovXG5jbGFzcyBDb21wYXJ0bWVudCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY29tcGFydG1lbnQgdG8gYWRkIHRvIHlvdXIgW3N0YXRlXG4gICAgY29uZmlndXJhdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZUNvbmZpZy5leHRlbnNpb25zKS5cbiAgICAqL1xuICAgIG9mKGV4dCkgeyByZXR1cm4gbmV3IENvbXBhcnRtZW50SW5zdGFuY2UodGhpcywgZXh0KTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBbZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5lZmZlY3RzKSB0aGF0XG4gICAgcmVjb25maWd1cmVzIHRoaXMgY29tcGFydG1lbnQuXG4gICAgKi9cbiAgICByZWNvbmZpZ3VyZShjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZS5vZih7IGNvbXBhcnRtZW50OiB0aGlzLCBleHRlbnNpb246IGNvbnRlbnQgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBjb21wYXJ0bWVudCBpbiB0aGUgc3RhdGUsIG9yXG4gICAgYHVuZGVmaW5lZGAgaWYgaXQgaXNuJ3QgcHJlc2VudC5cbiAgICAqL1xuICAgIGdldChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gc3RhdGUuY29uZmlnLmNvbXBhcnRtZW50cy5nZXQodGhpcyk7XG4gICAgfVxufVxuY2xhc3MgQ29tcGFydG1lbnRJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IoY29tcGFydG1lbnQsIGlubmVyKSB7XG4gICAgICAgIHRoaXMuY29tcGFydG1lbnQgPSBjb21wYXJ0bWVudDtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgIH1cbn1cbmNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIGNvbXBhcnRtZW50cywgZHluYW1pY1Nsb3RzLCBhZGRyZXNzLCBzdGF0aWNWYWx1ZXMsIGZhY2V0cykge1xuICAgICAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgICAgICB0aGlzLmNvbXBhcnRtZW50cyA9IGNvbXBhcnRtZW50cztcbiAgICAgICAgdGhpcy5keW5hbWljU2xvdHMgPSBkeW5hbWljU2xvdHM7XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIHRoaXMuc3RhdGljVmFsdWVzID0gc3RhdGljVmFsdWVzO1xuICAgICAgICB0aGlzLmZhY2V0cyA9IGZhY2V0cztcbiAgICAgICAgdGhpcy5zdGF0dXNUZW1wbGF0ZSA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXNUZW1wbGF0ZS5sZW5ndGggPCBkeW5hbWljU2xvdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZW1wbGF0ZS5wdXNoKDAgLyogU2xvdFN0YXR1cy5VbnJlc29sdmVkICovKTtcbiAgICB9XG4gICAgc3RhdGljRmFjZXQoZmFjZXQpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmFkZHJlc3NbZmFjZXQuaWRdO1xuICAgICAgICByZXR1cm4gYWRkciA9PSBudWxsID8gZmFjZXQuZGVmYXVsdCA6IHRoaXMuc3RhdGljVmFsdWVzW2FkZHIgPj4gMV07XG4gICAgfVxuICAgIHN0YXRpYyByZXNvbHZlKGJhc2UsIGNvbXBhcnRtZW50cywgb2xkU3RhdGUpIHtcbiAgICAgICAgbGV0IGZpZWxkcyA9IFtdO1xuICAgICAgICBsZXQgZmFjZXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IG5ld0NvbXBhcnRtZW50cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChsZXQgZXh0IG9mIGZsYXR0ZW4oYmFzZSwgY29tcGFydG1lbnRzLCBuZXdDb21wYXJ0bWVudHMpKSB7XG4gICAgICAgICAgICBpZiAoZXh0IGluc3RhbmNlb2YgU3RhdGVGaWVsZClcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChleHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIChmYWNldHNbZXh0LmZhY2V0LmlkXSB8fCAoZmFjZXRzW2V4dC5mYWNldC5pZF0gPSBbXSkpLnB1c2goZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWRkcmVzcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBzdGF0aWNWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IGR5bmFtaWNTbG90cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGFkZHJlc3NbZmllbGQuaWRdID0gZHluYW1pY1Nsb3RzLmxlbmd0aCA8PCAxO1xuICAgICAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goYSA9PiBmaWVsZC5zbG90KGEpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2xkRmFjZXRzID0gb2xkU3RhdGUgPT09IG51bGwgfHwgb2xkU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9sZFN0YXRlLmNvbmZpZy5mYWNldHM7XG4gICAgICAgIGZvciAobGV0IGlkIGluIGZhY2V0cykge1xuICAgICAgICAgICAgbGV0IHByb3ZpZGVycyA9IGZhY2V0c1tpZF0sIGZhY2V0ID0gcHJvdmlkZXJzWzBdLmZhY2V0O1xuICAgICAgICAgICAgbGV0IG9sZFByb3ZpZGVycyA9IG9sZEZhY2V0cyAmJiBvbGRGYWNldHNbaWRdIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVycy5ldmVyeShwID0+IHAudHlwZSA9PSAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLykpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzW2ZhY2V0LmlkXSA9IChzdGF0aWNWYWx1ZXMubGVuZ3RoIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICBpZiAoc2FtZUFycmF5KG9sZFByb3ZpZGVycywgcHJvdmlkZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChvbGRTdGF0ZS5mYWNldChmYWNldCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmFjZXQuY29tYmluZShwcm92aWRlcnMubWFwKHAgPT4gcC52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChvbGRTdGF0ZSAmJiBmYWNldC5jb21wYXJlKHZhbHVlLCBvbGRTdGF0ZS5mYWNldChmYWNldCkpID8gb2xkU3RhdGUuZmFjZXQoZmFjZXQpIDogdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgb2YgcHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwLnR5cGUgPT0gMCAvKiBQcm92aWRlci5TdGF0aWMgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbcC5pZF0gPSAoc3RhdGljVmFsdWVzLmxlbmd0aCA8PCAxKSB8IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChwLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbcC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU2xvdHMucHVzaChhID0+IHAuZHluYW1pY1Nsb3QoYSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZHJlc3NbZmFjZXQuaWRdID0gZHluYW1pY1Nsb3RzLmxlbmd0aCA8PCAxO1xuICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGEgPT4gZHluYW1pY0ZhY2V0U2xvdChhLCBmYWNldCwgcHJvdmlkZXJzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGR5bmFtaWMgPSBkeW5hbWljU2xvdHMubWFwKGYgPT4gZihhZGRyZXNzKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmlndXJhdGlvbihiYXNlLCBuZXdDb21wYXJ0bWVudHMsIGR5bmFtaWMsIGFkZHJlc3MsIHN0YXRpY1ZhbHVlcywgZmFjZXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmbGF0dGVuKGV4dGVuc2lvbiwgY29tcGFydG1lbnRzLCBuZXdDb21wYXJ0bWVudHMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW1tdLCBbXSwgW10sIFtdLCBbXV07XG4gICAgbGV0IHNlZW4gPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gaW5uZXIoZXh0LCBwcmVjKSB7XG4gICAgICAgIGxldCBrbm93biA9IHNlZW4uZ2V0KGV4dCk7XG4gICAgICAgIGlmIChrbm93biAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa25vd24gPD0gcHJlYylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgZm91bmQgPSByZXN1bHRba25vd25dLmluZGV4T2YoZXh0KTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrbm93bl0uc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEluc3RhbmNlKVxuICAgICAgICAgICAgICAgIG5ld0NvbXBhcnRtZW50cy5kZWxldGUoZXh0LmNvbXBhcnRtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuLnNldChleHQsIHByZWMpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHQpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBlIG9mIGV4dClcbiAgICAgICAgICAgICAgICBpbm5lcihlLCBwcmVjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEluc3RhbmNlKSB7XG4gICAgICAgICAgICBpZiAobmV3Q29tcGFydG1lbnRzLmhhcyhleHQuY29tcGFydG1lbnQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBEdXBsaWNhdGUgdXNlIG9mIGNvbXBhcnRtZW50IGluIGV4dGVuc2lvbnNgKTtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29tcGFydG1lbnRzLmdldChleHQuY29tcGFydG1lbnQpIHx8IGV4dC5pbm5lcjtcbiAgICAgICAgICAgIG5ld0NvbXBhcnRtZW50cy5zZXQoZXh0LmNvbXBhcnRtZW50LCBjb250ZW50KTtcbiAgICAgICAgICAgIGlubmVyKGNvbnRlbnQsIHByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIFByZWNFeHRlbnNpb24pIHtcbiAgICAgICAgICAgIGlubmVyKGV4dC5pbm5lciwgZXh0LnByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIFN0YXRlRmllbGQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcmVjXS5wdXNoKGV4dCk7XG4gICAgICAgICAgICBpZiAoZXh0LnByb3ZpZGVzKVxuICAgICAgICAgICAgICAgIGlubmVyKGV4dC5wcm92aWRlcywgcHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgRmFjZXRQcm92aWRlcikge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWNdLnB1c2goZXh0KTtcbiAgICAgICAgICAgIGlmIChleHQuZmFjZXQuZXh0ZW5zaW9ucylcbiAgICAgICAgICAgICAgICBpbm5lcihleHQuZmFjZXQuZXh0ZW5zaW9ucywgUHJlY18uZGVmYXVsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGV4dC5leHRlbnNpb247XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgZXh0ZW5zaW9uIHZhbHVlIGluIGV4dGVuc2lvbiBzZXQgKCR7ZXh0fSkuIFRoaXMgc29tZXRpbWVzIGhhcHBlbnMgYmVjYXVzZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgQGNvZGVtaXJyb3Ivc3RhdGUgYXJlIGxvYWRlZCwgYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MuYCk7XG4gICAgICAgICAgICBpbm5lcihjb250ZW50LCBwcmVjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbm5lcihleHRlbnNpb24sIFByZWNfLmRlZmF1bHQpO1xuICAgIHJldHVybiByZXN1bHQucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVBZGRyKHN0YXRlLCBhZGRyKSB7XG4gICAgaWYgKGFkZHIgJiAxKVxuICAgICAgICByZXR1cm4gMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovO1xuICAgIGxldCBpZHggPSBhZGRyID4+IDE7XG4gICAgbGV0IHN0YXR1cyA9IHN0YXRlLnN0YXR1c1tpZHhdO1xuICAgIGlmIChzdGF0dXMgPT0gNCAvKiBTbG90U3RhdHVzLkNvbXB1dGluZyAqLylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3ljbGljIGRlcGVuZGVuY3kgYmV0d2VlbiBmaWVsZHMgYW5kL29yIGZhY2V0c1wiKTtcbiAgICBpZiAoc3RhdHVzICYgMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovKVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIHN0YXRlLnN0YXR1c1tpZHhdID0gNCAvKiBTbG90U3RhdHVzLkNvbXB1dGluZyAqLztcbiAgICBsZXQgY2hhbmdlZCA9IHN0YXRlLmNvbXB1dGVTbG90KHN0YXRlLCBzdGF0ZS5jb25maWcuZHluYW1pY1Nsb3RzW2lkeF0pO1xuICAgIHJldHVybiBzdGF0ZS5zdGF0dXNbaWR4XSA9IDIgLyogU2xvdFN0YXR1cy5Db21wdXRlZCAqLyB8IGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBnZXRBZGRyKHN0YXRlLCBhZGRyKSB7XG4gICAgcmV0dXJuIGFkZHIgJiAxID8gc3RhdGUuY29uZmlnLnN0YXRpY1ZhbHVlc1thZGRyID4+IDFdIDogc3RhdGUudmFsdWVzW2FkZHIgPj4gMV07XG59XG5cbmNvbnN0IGxhbmd1YWdlRGF0YSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHYgPT4gdiksXG4gICAgc3RhdGljOiB0cnVlXG59KTtcbmNvbnN0IGxpbmVTZXBhcmF0b3IgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IHVuZGVmaW5lZCxcbiAgICBzdGF0aWM6IHRydWVcbn0pO1xuY29uc3QgY2hhbmdlRmlsdGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgdHJhbnNhY3Rpb25GaWx0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB0cmFuc2FjdGlvbkV4dGVuZGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgcmVhZE9ubHkgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IGZhbHNlXG59KTtcblxuLyoqXG5Bbm5vdGF0aW9ucyBhcmUgdGFnZ2VkIHZhbHVlcyB0aGF0IGFyZSB1c2VkIHRvIGFkZCBtZXRhZGF0YSB0b1xudHJhbnNhY3Rpb25zIGluIGFuIGV4dGVuc2libGUgd2F5LiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIG1vZGVsXG50aGluZ3MgdGhhdCBlZmZlY3QgdGhlIGVudGlyZSB0cmFuc2FjdGlvbiAoc3VjaCBhcyBpdHMgW3RpbWVcbnN0YW1wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnRpbWUpIG9yIGluZm9ybWF0aW9uIGFib3V0IGl0c1xuW29yaWdpbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbl51c2VyRXZlbnQpKS4gRm9yIGVmZmVjdHMgdGhhdCBoYXBwZW5cbl9hbG9uZ3NpZGVfIHRoZSBvdGhlciBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRyYW5zYWN0aW9uLCBbc3RhdGVcbmVmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3QpIGFyZSBtb3JlIGFwcHJvcHJpYXRlLlxuKi9cbmNsYXNzIEFubm90YXRpb24ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGFubm90YXRpb24gdHlwZS5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGFubm90YXRpb24uXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5ldyB0eXBlIG9mIGFubm90YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKCkgeyByZXR1cm4gbmV3IEFubm90YXRpb25UeXBlKCk7IH1cbn1cbi8qKlxuTWFya2VyIHRoYXQgaWRlbnRpZmllcyBhIHR5cGUgb2YgW2Fubm90YXRpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQW5ub3RhdGlvbikuXG4qL1xuY2xhc3MgQW5ub3RhdGlvblR5cGUge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGFubm90YXRpb24uXG4gICAgKi9cbiAgICBvZih2YWx1ZSkgeyByZXR1cm4gbmV3IEFubm90YXRpb24odGhpcywgdmFsdWUpOyB9XG59XG4vKipcblJlcHJlc2VudGF0aW9uIG9mIGEgdHlwZSBvZiBzdGF0ZSBlZmZlY3QuIERlZmluZWQgd2l0aFxuW2BTdGF0ZUVmZmVjdC5kZWZpbmVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0XmRlZmluZSkuXG4qL1xuY2xhc3MgU3RhdGVFZmZlY3RUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBgYW55YCB0eXBlcyBpbiB0aGVzZSBmdW5jdGlvbiB0eXBlcyBhcmUgdGhlcmUgdG8gd29ya1xuICAgIC8vIGFyb3VuZCBUeXBlU2NyaXB0IGlzc3VlICMzNzYzMSwgd2hlcmUgdGhlIHR5cGUgZ3VhcmQgb25cbiAgICAvLyBgU3RhdGVFZmZlY3QuaXNgIG15c3RlcmlvdXNseSBzdG9wcyB3b3JraW5nIHdoZW4gdGhlc2UgcHJvcGVybHlcbiAgICAvLyBoYXZlIHR5cGUgYFZhbHVlYC5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW3N0YXRlIGVmZmVjdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdCkgaW5zdGFuY2Ugb2YgdGhpc1xuICAgIHR5cGUuXG4gICAgKi9cbiAgICBvZih2YWx1ZSkgeyByZXR1cm4gbmV3IFN0YXRlRWZmZWN0KHRoaXMsIHZhbHVlKTsgfVxufVxuLyoqXG5TdGF0ZSBlZmZlY3RzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhZGRpdGlvbmFsIGVmZmVjdHNcbmFzc29jaWF0ZWQgd2l0aCBhIFt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5lZmZlY3RzKS4gVGhleVxuYXJlIG9mdGVuIHVzZWZ1bCB0byBtb2RlbCBjaGFuZ2VzIHRvIGN1c3RvbSBbc3RhdGVcbmZpZWxkc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkKSwgd2hlbiB0aG9zZSBjaGFuZ2VzIGFyZW4ndCBpbXBsaWNpdCBpblxuZG9jdW1lbnQgb3Igc2VsZWN0aW9uIGNoYW5nZXMuXG4qL1xuY2xhc3MgU3RhdGVFZmZlY3Qge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgb2YgdGhpcyBlZmZlY3QuXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIGVmZmVjdCB0aHJvdWdoIGEgcG9zaXRpb24gbWFwcGluZy4gV2lsbCByZXR1cm5cbiAgICBgdW5kZWZpbmVkYCB3aGVuIHRoYXQgZW5kcyB1cCBkZWxldGluZyB0aGUgZWZmZWN0LlxuICAgICovXG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMudHlwZS5tYXAodGhpcy52YWx1ZSwgbWFwcGluZyk7XG4gICAgICAgIHJldHVybiBtYXBwZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1hcHBlZCA9PSB0aGlzLnZhbHVlID8gdGhpcyA6IG5ldyBTdGF0ZUVmZmVjdCh0aGlzLnR5cGUsIG1hcHBlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoaXMgZWZmZWN0IG9iamVjdCBpcyBvZiBhIGdpdmVuXG4gICAgW3R5cGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3RUeXBlKS5cbiAgICAqL1xuICAgIGlzKHR5cGUpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlOyB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IGVmZmVjdCB0eXBlLiBUaGUgdHlwZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSB0eXBlXG4gICAgb2YgdmFsdWVzIHRoYXQgaGlzIGVmZmVjdCBob2xkcy4gSXQgc2hvdWxkIGJlIGEgdHlwZSB0aGF0XG4gICAgZG9lc24ndCBpbmNsdWRlIGB1bmRlZmluZWRgLCBzaW5jZSB0aGF0IGlzIHVzZWQgaW5cbiAgICBbbWFwcGluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdC5tYXApIHRvIGluZGljYXRlIHRoYXQgYW4gZWZmZWN0IGlzXG4gICAgcmVtb3ZlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdGVFZmZlY3RUeXBlKHNwZWMubWFwIHx8ICh2ID0+IHYpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGFuIGFycmF5IG9mIGVmZmVjdHMgdGhyb3VnaCBhIGNoYW5nZSBzZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgbWFwRWZmZWN0cyhlZmZlY3RzLCBtYXBwaW5nKSB7XG4gICAgICAgIGlmICghZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZWZmZWN0cztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgZWZmZWN0cykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGVmZmVjdC5tYXAobWFwcGluZyk7XG4gICAgICAgICAgICBpZiAobWFwcGVkKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1hcHBlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcblRoaXMgZWZmZWN0IGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHRoZSByb290IGV4dGVuc2lvbnMgb2ZcbnRoZSBlZGl0b3IuIERvaW5nIHRoaXMgd2lsbCBkaXNjYXJkIGFueSBleHRlbnNpb25zXG5bYXBwZW5kZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3ReYXBwZW5kQ29uZmlnKSwgYnV0IGRvZXMgbm90IHJlc2V0XG50aGUgY29udGVudCBvZiBbcmVjb25maWd1cmVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50LnJlY29uZmlndXJlKVxuY29tcGFydG1lbnRzLlxuKi9cblN0YXRlRWZmZWN0LnJlY29uZmlndXJlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5BcHBlbmQgZXh0ZW5zaW9ucyB0byB0aGUgdG9wLWxldmVsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGVkaXRvci5cbiovXG5TdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcbkNoYW5nZXMgdG8gdGhlIGVkaXRvciBzdGF0ZSBhcmUgZ3JvdXBlZCBpbnRvIHRyYW5zYWN0aW9ucy5cblR5cGljYWxseSwgYSB1c2VyIGFjdGlvbiBjcmVhdGVzIGEgc2luZ2xlIHRyYW5zYWN0aW9uLCB3aGljaCBtYXlcbmNvbnRhaW4gYW55IG51bWJlciBvZiBkb2N1bWVudCBjaGFuZ2VzLCBtYXkgY2hhbmdlIHRoZSBzZWxlY3Rpb24sXG5vciBoYXZlIG90aGVyIGVmZmVjdHMuIENyZWF0ZSBhIHRyYW5zYWN0aW9uIGJ5IGNhbGxpbmdcbltgRWRpdG9yU3RhdGUudXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpLCBvciBpbW1lZGlhdGVseVxuZGlzcGF0Y2ggb25lIGJ5IGNhbGxpbmdcbltgRWRpdG9yVmlldy5kaXNwYXRjaGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRpc3BhdGNoKS5cbiovXG5jbGFzcyBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXRlIGZyb20gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHN0YXJ0cy5cbiAgICAqL1xuICAgIHN0YXJ0U3RhdGUsIFxuICAgIC8qKlxuICAgIFRoZSBkb2N1bWVudCBjaGFuZ2VzIG1hZGUgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGNoYW5nZXMsIFxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24gc2V0IGJ5IHRoaXMgdHJhbnNhY3Rpb24sIG9yIHVuZGVmaW5lZCBpZiBpdFxuICAgIGRvZXNuJ3QgZXhwbGljaXRseSBzZXQgYSBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzZWxlY3Rpb24sIFxuICAgIC8qKlxuICAgIFRoZSBlZmZlY3RzIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGVmZmVjdHMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYW5ub3RhdGlvbnMsIFxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3IGFmdGVyIHRoaXNcbiAgICB0cmFuc2FjdGlvbiBpcyBkaXNwYXRjaGVkLlxuICAgICovXG4gICAgc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgdGhpcy5zdGFydFN0YXRlID0gc3RhcnRTdGF0ZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuZWZmZWN0cyA9IGVmZmVjdHM7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3O1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuX2RvYyA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fc3RhdGUgPSBudWxsO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKVxuICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBjaGFuZ2VzLm5ld0xlbmd0aCk7XG4gICAgICAgIGlmICghYW5ub3RhdGlvbnMuc29tZSgoYSkgPT4gYS50eXBlID09IFRyYW5zYWN0aW9uLnRpbWUpKVxuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChUcmFuc2FjdGlvbi50aW1lLm9mKERhdGUubm93KCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHN0YXJ0U3RhdGUsIGNoYW5nZXMsIHNlbGVjdGlvbiwgZWZmZWN0cywgYW5ub3RhdGlvbnMsIHNjcm9sbEludG9WaWV3KSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oc3RhcnRTdGF0ZSwgY2hhbmdlcywgc2VsZWN0aW9uLCBlZmZlY3RzLCBhbm5vdGF0aW9ucywgc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbmV3IGRvY3VtZW50IHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gQ29udHJhcnkgdG9cbiAgICBbYC5zdGF0ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc3RhdGUpYC5kb2NgLCBhY2Nlc3NpbmcgdGhpcyB3b24ndFxuICAgIGZvcmNlIHRoZSBlbnRpcmUgbmV3IHN0YXRlIHRvIGJlIGNvbXB1dGVkIHJpZ2h0IGF3YXksIHNvIGl0IGlzXG4gICAgcmVjb21tZW5kZWQgdGhhdCBbdHJhbnNhY3Rpb25cbiAgICBmaWx0ZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRyYW5zYWN0aW9uRmlsdGVyKSB1c2UgdGhpcyBnZXR0ZXJcbiAgICB3aGVuIHRoZXkgbmVlZCB0byBsb29rIGF0IHRoZSBuZXcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgbmV3RG9jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jIHx8ICh0aGlzLl9kb2MgPSB0aGlzLmNoYW5nZXMuYXBwbHkodGhpcy5zdGFydFN0YXRlLmRvYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbmV3IHNlbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUgdHJhbnNhY3Rpb24uIElmXG4gICAgW2B0aGlzLnNlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc2VsZWN0aW9uKSBpcyB1bmRlZmluZWQsXG4gICAgdGhpcyB3aWxsIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU2VsZWN0aW9uLm1hcCkgdGhlIHN0YXJ0IHN0YXRlJ3NcbiAgICBjdXJyZW50IHNlbGVjdGlvbiB0aHJvdWdoIHRoZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IG5ld1NlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFwKHRoaXMuY2hhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgc3RhdGUgY3JlYXRlZCBieSB0aGUgdHJhbnNhY3Rpb24uIENvbXB1dGVkIG9uIGRlbWFuZFxuICAgIChidXQgcmV0YWluZWQgZm9yIHN1YnNlcXVlbnQgYWNjZXNzKSwgc28gaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvXG4gICAgYWNjZXNzIGl0IGluIFt0cmFuc2FjdGlvblxuICAgIGZpbHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedHJhbnNhY3Rpb25GaWx0ZXIpIHdoZW4gcG9zc2libGUuXG4gICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdGUpXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U3RhdGUuYXBwbHlUcmFuc2FjdGlvbih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHR5cGUsIGlmIGFueS5cbiAgICAqL1xuICAgIGFubm90YXRpb24odHlwZSkge1xuICAgICAgICBmb3IgKGxldCBhbm4gb2YgdGhpcy5hbm5vdGF0aW9ucylcbiAgICAgICAgICAgIGlmIChhbm4udHlwZSA9PSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBhbm4udmFsdWU7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiBjaGFuZ2VkIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkgeyByZXR1cm4gIXRoaXMuY2hhbmdlcy5lbXB0eTsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNhY3Rpb24gcmVjb25maWd1cmVzIHRoZSBzdGF0ZVxuICAgICh0aHJvdWdoIGEgW2NvbmZpZ3VyYXRpb24gY29tcGFydG1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQpIG9yXG4gICAgd2l0aCBhIHRvcC1sZXZlbCBjb25maWd1cmF0aW9uXG4gICAgW2VmZmVjdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdF5yZWNvbmZpZ3VyZSkuXG4gICAgKi9cbiAgICBnZXQgcmVjb25maWd1cmVkKCkgeyByZXR1cm4gdGhpcy5zdGFydFN0YXRlLmNvbmZpZyAhPSB0aGlzLnN0YXRlLmNvbmZpZzsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGEgW3VzZXJcbiAgICBldmVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbl51c2VyRXZlbnQpIGFubm90YXRpb24gdGhhdCBpcyBlcXVhbCB0b1xuICAgIG9yIG1vcmUgc3BlY2lmaWMgdGhhbiBgZXZlbnRgLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRyYW5zYWN0aW9uXG4gICAgaGFzIGBcInNlbGVjdC5wb2ludGVyXCJgIGFzIHVzZXIgZXZlbnQsIGBcInNlbGVjdFwiYCBhbmRcbiAgICBgXCJzZWxlY3QucG9pbnRlclwiYCB3aWxsIG1hdGNoIGl0LlxuICAgICovXG4gICAgaXNVc2VyRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLmFubm90YXRpb24oVHJhbnNhY3Rpb24udXNlckV2ZW50KTtcbiAgICAgICAgcmV0dXJuICEhKGUgJiYgKGUgPT0gZXZlbnQgfHwgZS5sZW5ndGggPiBldmVudC5sZW5ndGggJiYgZS5zbGljZSgwLCBldmVudC5sZW5ndGgpID09IGV2ZW50ICYmIGVbZXZlbnQubGVuZ3RoXSA9PSBcIi5cIikpO1xuICAgIH1cbn1cbi8qKlxuQW5ub3RhdGlvbiB1c2VkIHRvIHN0b3JlIHRyYW5zYWN0aW9uIHRpbWVzdGFtcHMuIEF1dG9tYXRpY2FsbHlcbmFkZGVkIHRvIGV2ZXJ5IHRyYW5zYWN0aW9uLCBob2xkaW5nIGBEYXRlLm5vdygpYC5cbiovXG5UcmFuc2FjdGlvbi50aW1lID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG4vKipcbkFubm90YXRpb24gdXNlZCB0byBhc3NvY2lhdGUgYSB0cmFuc2FjdGlvbiB3aXRoIGEgdXNlciBpbnRlcmZhY2VcbmV2ZW50LiBIb2xkcyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgZXZlbnQsIHVzaW5nIGFcbmRvdC1zZXBhcmF0ZWQgZm9ybWF0IHRvIHN1cHBvcnQgYXR0YWNoaW5nIG1vcmUgc3BlY2lmaWNcbmluZm9ybWF0aW9uLiBUaGUgZXZlbnRzIHVzZWQgYnkgdGhlIGNvcmUgbGlicmFyaWVzIGFyZTpcblxuIC0gYFwiaW5wdXRcImAgd2hlbiBjb250ZW50IGlzIGVudGVyZWRcbiAgIC0gYFwiaW5wdXQudHlwZVwiYCBmb3IgdHlwZWQgaW5wdXRcbiAgICAgLSBgXCJpbnB1dC50eXBlLmNvbXBvc2VcImAgZm9yIGNvbXBvc2l0aW9uXG4gICAtIGBcImlucHV0LnBhc3RlXCJgIGZvciBwYXN0ZWQgaW5wdXRcbiAgIC0gYFwiaW5wdXQuZHJvcFwiYCB3aGVuIGFkZGluZyBjb250ZW50IHdpdGggZHJhZy1hbmQtZHJvcFxuICAgLSBgXCJpbnB1dC5jb21wbGV0ZVwiYCB3aGVuIGF1dG9jb21wbGV0aW5nXG4gLSBgXCJkZWxldGVcImAgd2hlbiB0aGUgdXNlciBkZWxldGVzIGNvbnRlbnRcbiAgIC0gYFwiZGVsZXRlLnNlbGVjdGlvblwiYCB3aGVuIGRlbGV0aW5nIHRoZSBzZWxlY3Rpb25cbiAgIC0gYFwiZGVsZXRlLmZvcndhcmRcImAgd2hlbiBkZWxldGluZyBmb3J3YXJkIGZyb20gdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuYmFja3dhcmRcImAgd2hlbiBkZWxldGluZyBiYWNrd2FyZCBmcm9tIHRoZSBzZWxlY3Rpb25cbiAgIC0gYFwiZGVsZXRlLmN1dFwiYCB3aGVuIGN1dHRpbmcgdG8gdGhlIGNsaXBib2FyZFxuIC0gYFwibW92ZVwiYCB3aGVuIGNvbnRlbnQgaXMgbW92ZWRcbiAgIC0gYFwibW92ZS5kcm9wXCJgIHdoZW4gY29udGVudCBpcyBtb3ZlZCB3aXRoaW4gdGhlIGVkaXRvciB0aHJvdWdoIGRyYWctYW5kLWRyb3BcbiAtIGBcInNlbGVjdFwiYCB3aGVuIGV4cGxpY2l0bHkgY2hhbmdpbmcgdGhlIHNlbGVjdGlvblxuICAgLSBgXCJzZWxlY3QucG9pbnRlclwiYCB3aGVuIHNlbGVjdGluZyB3aXRoIGEgbW91c2Ugb3Igb3RoZXIgcG9pbnRpbmcgZGV2aWNlXG4gLSBgXCJ1bmRvXCJgIGFuZCBgXCJyZWRvXCJgIGZvciBoaXN0b3J5IGFjdGlvbnNcblxuVXNlIFtgaXNVc2VyRXZlbnRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLmlzVXNlckV2ZW50KSB0byBjaGVja1xud2hldGhlciB0aGUgYW5ub3RhdGlvbiBtYXRjaGVzIGEgZ2l2ZW4gZXZlbnQuXG4qL1xuVHJhbnNhY3Rpb24udXNlckV2ZW50ID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG4vKipcbkFubm90YXRpb24gaW5kaWNhdGluZyB3aGV0aGVyIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvXG50aGUgdW5kbyBoaXN0b3J5IG9yIG5vdC5cbiovXG5UcmFuc2FjdGlvbi5hZGRUb0hpc3RvcnkgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiBpbmRpY2F0aW5nICh3aGVuIHByZXNlbnQgYW5kIHRydWUpIHRoYXQgYSB0cmFuc2FjdGlvblxucmVwcmVzZW50cyBhIGNoYW5nZSBtYWRlIGJ5IHNvbWUgb3RoZXIgYWN0b3IsIG5vdCB0aGUgdXNlci4gVGhpc1xuaXMgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHRhZyBvdGhlciBwZW9wbGUncyBjaGFuZ2VzIGluXG5jb2xsYWJvcmF0aXZlIGVkaXRpbmcuXG4qL1xuVHJhbnNhY3Rpb24ucmVtb3RlID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG5mdW5jdGlvbiBqb2luUmFuZ2VzKGEsIGIpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaUEgPSAwLCBpQiA9IDA7Oykge1xuICAgICAgICBsZXQgZnJvbSwgdG87XG4gICAgICAgIGlmIChpQSA8IGEubGVuZ3RoICYmIChpQiA9PSBiLmxlbmd0aCB8fCBiW2lCXSA+PSBhW2lBXSkpIHtcbiAgICAgICAgICAgIGZyb20gPSBhW2lBKytdO1xuICAgICAgICAgICAgdG8gPSBhW2lBKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlCIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZyb20gPSBiW2lCKytdO1xuICAgICAgICAgICAgdG8gPSBiW2lCKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCB8fCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdIDwgZnJvbSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyb20sIHRvKTtcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA8IHRvKVxuICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IHRvO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlVHJhbnNhY3Rpb24oYSwgYiwgc2VxdWVudGlhbCkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgbWFwRm9yQSwgbWFwRm9yQiwgY2hhbmdlcztcbiAgICBpZiAoc2VxdWVudGlhbCkge1xuICAgICAgICBtYXBGb3JBID0gYi5jaGFuZ2VzO1xuICAgICAgICBtYXBGb3JCID0gQ2hhbmdlU2V0LmVtcHR5KGIuY2hhbmdlcy5sZW5ndGgpO1xuICAgICAgICBjaGFuZ2VzID0gYS5jaGFuZ2VzLmNvbXBvc2UoYi5jaGFuZ2VzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1hcEZvckEgPSBiLmNoYW5nZXMubWFwKGEuY2hhbmdlcyk7XG4gICAgICAgIG1hcEZvckIgPSBhLmNoYW5nZXMubWFwRGVzYyhiLmNoYW5nZXMsIHRydWUpO1xuICAgICAgICBjaGFuZ2VzID0gYS5jaGFuZ2VzLmNvbXBvc2UobWFwRm9yQSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXMsXG4gICAgICAgIHNlbGVjdGlvbjogYi5zZWxlY3Rpb24gPyBiLnNlbGVjdGlvbi5tYXAobWFwRm9yQikgOiAoX2EgPSBhLnNlbGVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChtYXBGb3JBKSxcbiAgICAgICAgZWZmZWN0czogU3RhdGVFZmZlY3QubWFwRWZmZWN0cyhhLmVmZmVjdHMsIG1hcEZvckEpLmNvbmNhdChTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGIuZWZmZWN0cywgbWFwRm9yQikpLFxuICAgICAgICBhbm5vdGF0aW9uczogYS5hbm5vdGF0aW9ucy5sZW5ndGggPyBhLmFubm90YXRpb25zLmNvbmNhdChiLmFubm90YXRpb25zKSA6IGIuYW5ub3RhdGlvbnMsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiBhLnNjcm9sbEludG9WaWV3IHx8IGIuc2Nyb2xsSW50b1ZpZXdcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zYWN0aW9uSW5uZXIoc3RhdGUsIHNwZWMsIGRvY1NpemUpIHtcbiAgICBsZXQgc2VsID0gc3BlYy5zZWxlY3Rpb24sIGFubm90YXRpb25zID0gYXNBcnJheShzcGVjLmFubm90YXRpb25zKTtcbiAgICBpZiAoc3BlYy51c2VyRXZlbnQpXG4gICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KFRyYW5zYWN0aW9uLnVzZXJFdmVudC5vZihzcGVjLnVzZXJFdmVudCkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXM6IHNwZWMuY2hhbmdlcyBpbnN0YW5jZW9mIENoYW5nZVNldCA/IHNwZWMuY2hhbmdlc1xuICAgICAgICAgICAgOiBDaGFuZ2VTZXQub2Yoc3BlYy5jaGFuZ2VzIHx8IFtdLCBkb2NTaXplLCBzdGF0ZS5mYWNldChsaW5lU2VwYXJhdG9yKSksXG4gICAgICAgIHNlbGVjdGlvbjogc2VsICYmIChzZWwgaW5zdGFuY2VvZiBFZGl0b3JTZWxlY3Rpb24gPyBzZWwgOiBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKHNlbC5hbmNob3IsIHNlbC5oZWFkKSksXG4gICAgICAgIGVmZmVjdHM6IGFzQXJyYXkoc3BlYy5lZmZlY3RzKSxcbiAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiAhIXNwZWMuc2Nyb2xsSW50b1ZpZXdcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zYWN0aW9uKHN0YXRlLCBzcGVjcywgZmlsdGVyKSB7XG4gICAgbGV0IHMgPSByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgc3BlY3MubGVuZ3RoID8gc3BlY3NbMF0gOiB7fSwgc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgaWYgKHNwZWNzLmxlbmd0aCAmJiBzcGVjc1swXS5maWx0ZXIgPT09IGZhbHNlKVxuICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNwZWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzcGVjc1tpXS5maWx0ZXIgPT09IGZhbHNlKVxuICAgICAgICAgICAgZmlsdGVyID0gZmFsc2U7XG4gICAgICAgIGxldCBzZXEgPSAhIXNwZWNzW2ldLnNlcXVlbnRpYWw7XG4gICAgICAgIHMgPSBtZXJnZVRyYW5zYWN0aW9uKHMsIHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBzcGVjc1tpXSwgc2VxID8gcy5jaGFuZ2VzLm5ld0xlbmd0aCA6IHN0YXRlLmRvYy5sZW5ndGgpLCBzZXEpO1xuICAgIH1cbiAgICBsZXQgdHIgPSBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIHMuY2hhbmdlcywgcy5zZWxlY3Rpb24sIHMuZWZmZWN0cywgcy5hbm5vdGF0aW9ucywgcy5zY3JvbGxJbnRvVmlldyk7XG4gICAgcmV0dXJuIGV4dGVuZFRyYW5zYWN0aW9uKGZpbHRlciA/IGZpbHRlclRyYW5zYWN0aW9uKHRyKSA6IHRyKTtcbn1cbi8vIEZpbmlzaCBhIHRyYW5zYWN0aW9uIGJ5IGFwcGx5aW5nIGZpbHRlcnMgaWYgbmVjZXNzYXJ5LlxuZnVuY3Rpb24gZmlsdGVyVHJhbnNhY3Rpb24odHIpIHtcbiAgICBsZXQgc3RhdGUgPSB0ci5zdGFydFN0YXRlO1xuICAgIC8vIENoYW5nZSBmaWx0ZXJzXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZm9yIChsZXQgZmlsdGVyIG9mIHN0YXRlLmZhY2V0KGNoYW5nZUZpbHRlcikpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZmlsdGVyKHRyKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHRydWUgPyB2YWx1ZSA6IGpvaW5SYW5nZXMocmVzdWx0LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgbGV0IGNoYW5nZXMsIGJhY2s7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBiYWNrID0gdHIuY2hhbmdlcy5pbnZlcnRlZERlc2M7XG4gICAgICAgICAgICBjaGFuZ2VzID0gQ2hhbmdlU2V0LmVtcHR5KHN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZpbHRlcmVkID0gdHIuY2hhbmdlcy5maWx0ZXIocmVzdWx0KTtcbiAgICAgICAgICAgIGNoYW5nZXMgPSBmaWx0ZXJlZC5jaGFuZ2VzO1xuICAgICAgICAgICAgYmFjayA9IGZpbHRlcmVkLmZpbHRlcmVkLm1hcERlc2MoZmlsdGVyZWQuY2hhbmdlcykuaW52ZXJ0ZWREZXNjO1xuICAgICAgICB9XG4gICAgICAgIHRyID0gVHJhbnNhY3Rpb24uY3JlYXRlKHN0YXRlLCBjaGFuZ2VzLCB0ci5zZWxlY3Rpb24gJiYgdHIuc2VsZWN0aW9uLm1hcChiYWNrKSwgU3RhdGVFZmZlY3QubWFwRWZmZWN0cyh0ci5lZmZlY3RzLCBiYWNrKSwgdHIuYW5ub3RhdGlvbnMsIHRyLnNjcm9sbEludG9WaWV3KTtcbiAgICB9XG4gICAgLy8gVHJhbnNhY3Rpb24gZmlsdGVyc1xuICAgIGxldCBmaWx0ZXJzID0gc3RhdGUuZmFjZXQodHJhbnNhY3Rpb25GaWx0ZXIpO1xuICAgIGZvciAobGV0IGkgPSBmaWx0ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IGZpbHRlcnNbaV0odHIpO1xuICAgICAgICBpZiAoZmlsdGVyZWQgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIHRyID0gZmlsdGVyZWQ7XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyZWQpICYmIGZpbHRlcmVkLmxlbmd0aCA9PSAxICYmIGZpbHRlcmVkWzBdIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pXG4gICAgICAgICAgICB0ciA9IGZpbHRlcmVkWzBdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ciA9IHJlc29sdmVUcmFuc2FjdGlvbihzdGF0ZSwgYXNBcnJheShmaWx0ZXJlZCksIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyO1xufVxuZnVuY3Rpb24gZXh0ZW5kVHJhbnNhY3Rpb24odHIpIHtcbiAgICBsZXQgc3RhdGUgPSB0ci5zdGFydFN0YXRlLCBleHRlbmRlcnMgPSBzdGF0ZS5mYWNldCh0cmFuc2FjdGlvbkV4dGVuZGVyKSwgc3BlYyA9IHRyO1xuICAgIGZvciAobGV0IGkgPSBleHRlbmRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGV4dGVuc2lvbiA9IGV4dGVuZGVyc1tpXSh0cik7XG4gICAgICAgIGlmIChleHRlbnNpb24gJiYgT2JqZWN0LmtleXMoZXh0ZW5zaW9uKS5sZW5ndGgpXG4gICAgICAgICAgICBzcGVjID0gbWVyZ2VUcmFuc2FjdGlvbihzcGVjLCByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgZXh0ZW5zaW9uLCB0ci5jaGFuZ2VzLm5ld0xlbmd0aCksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gc3BlYyA9PSB0ciA/IHRyIDogVHJhbnNhY3Rpb24uY3JlYXRlKHN0YXRlLCB0ci5jaGFuZ2VzLCB0ci5zZWxlY3Rpb24sIHNwZWMuZWZmZWN0cywgc3BlYy5hbm5vdGF0aW9ucywgc3BlYy5zY3JvbGxJbnRvVmlldyk7XG59XG5jb25zdCBub25lID0gW107XG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBub25lIDogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbi8qKlxuVGhlIGNhdGVnb3JpZXMgcHJvZHVjZWQgYnkgYSBbY2hhcmFjdGVyXG5jYXRlZ29yaXplcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIpLiBUaGVzZSBhcmUgdXNlZFxuZG8gdGhpbmdzIGxpa2Ugc2VsZWN0aW5nIGJ5IHdvcmQuXG4qL1xudmFyIENoYXJDYXRlZ29yeSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENoYXJDYXRlZ29yeSkge1xuICAgIC8qKlxuICAgIFdvcmQgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIENoYXJDYXRlZ29yeVtDaGFyQ2F0ZWdvcnlbXCJXb3JkXCJdID0gMF0gPSBcIldvcmRcIjtcbiAgICAvKipcbiAgICBXaGl0ZXNwYWNlLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIlNwYWNlXCJdID0gMV0gPSBcIlNwYWNlXCI7XG4gICAgLyoqXG4gICAgQW55dGhpbmcgZWxzZS5cbiAgICAqL1xuICAgIENoYXJDYXRlZ29yeVtDaGFyQ2F0ZWdvcnlbXCJPdGhlclwiXSA9IDJdID0gXCJPdGhlclwiO1xucmV0dXJuIENoYXJDYXRlZ29yeX0pKENoYXJDYXRlZ29yeSB8fCAoQ2hhckNhdGVnb3J5ID0ge30pKTtcbmNvbnN0IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyID0gL1tcXHUwMGRmXFx1MDU4N1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTMwNDAtXFx1MzA5ZlxcdTMwYTAtXFx1MzBmZlxcdTM0MDAtXFx1NGRiNVxcdTRlMDAtXFx1OWZjY1xcdWFjMDAtXFx1ZDdhZl0vO1xubGV0IHdvcmRDaGFyO1xudHJ5IHtcbiAgICB3b3JkQ2hhciA9IC8qQF9fUFVSRV9fKi9uZXcgUmVnRXhwKFwiW1xcXFxwe0FscGhhYmV0aWN9XFxcXHB7TnVtYmVyfV9dXCIsIFwidVwiKTtcbn1cbmNhdGNoIChfKSB7IH1cbmZ1bmN0aW9uIGhhc1dvcmRDaGFyKHN0cikge1xuICAgIGlmICh3b3JkQ2hhcilcbiAgICAgICAgcmV0dXJuIHdvcmRDaGFyLnRlc3Qoc3RyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2ggPSBzdHJbaV07XG4gICAgICAgIGlmICgvXFx3Ly50ZXN0KGNoKSB8fCBjaCA+IFwiXFx4ODBcIiAmJiAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBtYWtlQ2F0ZWdvcml6ZXIod29yZENoYXJzKSB7XG4gICAgcmV0dXJuIChjaGFyKSA9PiB7XG4gICAgICAgIGlmICghL1xcUy8udGVzdChjaGFyKSlcbiAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuU3BhY2U7XG4gICAgICAgIGlmIChoYXNXb3JkQ2hhcihjaGFyKSlcbiAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuV29yZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JkQ2hhcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoY2hhci5pbmRleE9mKHdvcmRDaGFyc1tpXSkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hhckNhdGVnb3J5LldvcmQ7XG4gICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuT3RoZXI7XG4gICAgfTtcbn1cblxuLyoqXG5UaGUgZWRpdG9yIHN0YXRlIGNsYXNzIGlzIGEgcGVyc2lzdGVudCAoaW1tdXRhYmxlKSBkYXRhIHN0cnVjdHVyZS5cblRvIHVwZGF0ZSBhIHN0YXRlLCB5b3UgW2NyZWF0ZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpIGFcblt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbiksIHdoaWNoIHByb2R1Y2VzIGEgX25ld18gc3RhdGVcbmluc3RhbmNlLCB3aXRob3V0IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuXG5BcyBzdWNoLCBfbmV2ZXJfIG11dGF0ZSBwcm9wZXJ0aWVzIG9mIGEgc3RhdGUgZGlyZWN0bHkuIFRoYXQnbGxcbmp1c3QgYnJlYWsgdGhpbmdzLlxuKi9cbmNsYXNzIEVkaXRvclN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbmZpZywgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBkb2MsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHNlbGVjdGlvbiwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB2YWx1ZXMsIGNvbXB1dGVTbG90LCB0cikge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBjb25maWcuc3RhdHVzVGVtcGxhdGUuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5jb21wdXRlU2xvdCA9IGNvbXB1dGVTbG90O1xuICAgICAgICAvLyBGaWxsIGluIHRoZSBjb21wdXRlZCBzdGF0ZSBpbW1lZGlhdGVseSwgc28gdGhhdCBmdXJ0aGVyIHF1ZXJpZXNcbiAgICAgICAgLy8gZm9yIGl0IG1hZGUgZHVyaW5nIHRoZSB1cGRhdGUgcmV0dXJuIHRoaXMgc3RhdGVcbiAgICAgICAgaWYgKHRyKVxuICAgICAgICAgICAgdHIuX3N0YXRlID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmZpZy5keW5hbWljU2xvdHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGkgPDwgMSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVNsb3QgPSBudWxsO1xuICAgIH1cbiAgICBmaWVsZChmaWVsZCwgcmVxdWlyZSA9IHRydWUpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmNvbmZpZy5hZGRyZXNzW2ZpZWxkLmlkXTtcbiAgICAgICAgaWYgKGFkZHIgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJGaWVsZCBpcyBub3QgcHJlc2VudCBpbiB0aGlzIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGFkZHIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRkcih0aGlzLCBhZGRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSB0aGF0IHVwZGF0ZXMgdGhpc1xuICAgIHN0YXRlLiBBbnkgbnVtYmVyIG9mIFt0cmFuc2FjdGlvbiBzcGVjc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMpXG4gICAgY2FuIGJlIHBhc3NlZC4gVW5sZXNzXG4gICAgW2BzZXF1ZW50aWFsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuc2VxdWVudGlhbCkgaXMgc2V0LCB0aGVcbiAgICBbY2hhbmdlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuY2hhbmdlcykgKGlmIGFueSkgb2YgZWFjaCBzcGVjXG4gICAgYXJlIGFzc3VtZWQgdG8gc3RhcnQgaW4gdGhlIF9jdXJyZW50XyBkb2N1bWVudCAobm90IHRoZSBkb2N1bWVudFxuICAgIHByb2R1Y2VkIGJ5IHByZXZpb3VzIHNwZWNzKSwgYW5kIGl0c1xuICAgIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbikgYW5kXG4gICAgW2VmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIGFyZSBhc3N1bWVkIHRvIHJlZmVyXG4gICAgdG8gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgaXRzIF9vd25fIGNoYW5nZXMuIFRoZSByZXN1bHRpbmdcbiAgICB0cmFuc2FjdGlvbiBjb250YWlucyB0aGUgY29tYmluZWQgZWZmZWN0IG9mIGFsbCB0aGUgZGlmZmVyZW50XG4gICAgc3BlY3MuIEZvciBbc2VsZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZWxlY3Rpb24pLCBsYXRlclxuICAgIHNwZWNzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGVhcmxpZXIgb25lcy5cbiAgICAqL1xuICAgIHVwZGF0ZSguLi5zcGVjcykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zYWN0aW9uKHRoaXMsIHNwZWNzLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhcHBseVRyYW5zYWN0aW9uKHRyKSB7XG4gICAgICAgIGxldCBjb25mID0gdGhpcy5jb25maWcsIHsgYmFzZSwgY29tcGFydG1lbnRzIH0gPSBjb25mO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZikge1xuICAgICAgICAgICAgICAgICAgICBjb21wYXJ0bWVudHMgPSBuZXcgTWFwO1xuICAgICAgICAgICAgICAgICAgICBjb25mLmNvbXBhcnRtZW50cy5mb3JFYWNoKCh2YWwsIGtleSkgPT4gY29tcGFydG1lbnRzLnNldChrZXksIHZhbCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25mID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnRzLnNldChlZmZlY3QudmFsdWUuY29tcGFydG1lbnQsIGVmZmVjdC52YWx1ZS5leHRlbnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWZmZWN0LmlzKFN0YXRlRWZmZWN0LnJlY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJhc2UgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3QuaXMoU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJhc2UgPSBhc0FycmF5KGJhc2UpLmNvbmNhdChlZmZlY3QudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydFZhbHVlcztcbiAgICAgICAgaWYgKCFjb25mKSB7XG4gICAgICAgICAgICBjb25mID0gQ29uZmlndXJhdGlvbi5yZXNvbHZlKGJhc2UsIGNvbXBhcnRtZW50cywgdGhpcyk7XG4gICAgICAgICAgICBsZXQgaW50ZXJtZWRpYXRlU3RhdGUgPSBuZXcgRWRpdG9yU3RhdGUoY29uZiwgdGhpcy5kb2MsIHRoaXMuc2VsZWN0aW9uLCBjb25mLmR5bmFtaWNTbG90cy5tYXAoKCkgPT4gbnVsbCksIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC5yZWNvbmZpZ3VyZShzdGF0ZSwgdGhpcyksIG51bGwpO1xuICAgICAgICAgICAgc3RhcnRWYWx1ZXMgPSBpbnRlcm1lZGlhdGVTdGF0ZS52YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydFZhbHVlcyA9IHRyLnN0YXJ0U3RhdGUudmFsdWVzLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHRyLnN0YXJ0U3RhdGUuZmFjZXQoYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpID8gdHIubmV3U2VsZWN0aW9uIDogdHIubmV3U2VsZWN0aW9uLmFzU2luZ2xlKCk7XG4gICAgICAgIG5ldyBFZGl0b3JTdGF0ZShjb25mLCB0ci5uZXdEb2MsIHNlbGVjdGlvbiwgc3RhcnRWYWx1ZXMsIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC51cGRhdGUoc3RhdGUsIHRyKSwgdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbdHJhbnNhY3Rpb24gc3BlY10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMpIHRoYXRcbiAgICByZXBsYWNlcyBldmVyeSBzZWxlY3Rpb24gcmFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29udGVudC5cbiAgICAqL1xuICAgIHJlcGxhY2VTZWxlY3Rpb24odGV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLnRvVGV4dCh0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiAoeyBjaGFuZ2VzOiB7IGZyb206IHJhbmdlLmZyb20sIHRvOiByYW5nZS50bywgaW5zZXJ0OiB0ZXh0IH0sXG4gICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgdGV4dC5sZW5ndGgpIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIGNoYW5nZXMgYW5kIGEgbmV3IHNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBnaXZlblxuICAgIGZ1bmN0aW9uIGZvciBlYWNoIHJhbmdlIGluIHRoZSBhY3RpdmUgc2VsZWN0aW9uLiBUaGUgZnVuY3Rpb25cbiAgICBjYW4gcmV0dXJuIGFuIG9wdGlvbmFsIHNldCBvZiBjaGFuZ2VzIChpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZVxuICAgIG9mIHRoZSBzdGFydCBkb2N1bWVudCksIHBsdXMgYW4gdXBkYXRlZCByYW5nZSAoaW4gdGhlIGNvb3JkaW5hdGVcbiAgICBzcGFjZSBvZiB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgdGhlIGNhbGwncyBvd24gY2hhbmdlcykuIFRoaXNcbiAgICBtZXRob2Qgd2lsbCBtZXJnZSBhbGwgdGhlIGNoYW5nZXMgYW5kIHJhbmdlcyBpbnRvIGEgc2luZ2xlXG4gICAgY2hhbmdlc2V0IGFuZCBzZWxlY3Rpb24sIGFuZCByZXR1cm4gaXQgYXMgYSBbdHJhbnNhY3Rpb25cbiAgICBzcGVjXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYyksIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG9cbiAgICBbYHVwZGF0ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudXBkYXRlKS5cbiAgICAqL1xuICAgIGNoYW5nZUJ5UmFuZ2UoZikge1xuICAgICAgICBsZXQgc2VsID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIGxldCByZXN1bHQxID0gZihzZWwucmFuZ2VzWzBdKTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSB0aGlzLmNoYW5nZXMocmVzdWx0MS5jaGFuZ2VzKSwgcmFuZ2VzID0gW3Jlc3VsdDEucmFuZ2VdO1xuICAgICAgICBsZXQgZWZmZWN0cyA9IGFzQXJyYXkocmVzdWx0MS5lZmZlY3RzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZihzZWwucmFuZ2VzW2ldKTtcbiAgICAgICAgICAgIGxldCBuZXdDaGFuZ2VzID0gdGhpcy5jaGFuZ2VzKHJlc3VsdC5jaGFuZ2VzKSwgbmV3TWFwcGVkID0gbmV3Q2hhbmdlcy5tYXAoY2hhbmdlcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGk7IGorKylcbiAgICAgICAgICAgICAgICByYW5nZXNbal0gPSByYW5nZXNbal0ubWFwKG5ld01hcHBlZCk7XG4gICAgICAgICAgICBsZXQgbWFwQnkgPSBjaGFuZ2VzLm1hcERlc2MobmV3Q2hhbmdlcywgdHJ1ZSk7XG4gICAgICAgICAgICByYW5nZXMucHVzaChyZXN1bHQucmFuZ2UubWFwKG1hcEJ5KSk7XG4gICAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5jb21wb3NlKG5ld01hcHBlZCk7XG4gICAgICAgICAgICBlZmZlY3RzID0gU3RhdGVFZmZlY3QubWFwRWZmZWN0cyhlZmZlY3RzLCBuZXdNYXBwZWQpLmNvbmNhdChTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGFzQXJyYXkocmVzdWx0LmVmZmVjdHMpLCBtYXBCeSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgc2VsLm1haW5JbmRleCksXG4gICAgICAgICAgICBlZmZlY3RzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFtjaGFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNldCkgZnJvbSB0aGUgZ2l2ZW4gY2hhbmdlXG4gICAgZGVzY3JpcHRpb24sIHRha2luZyB0aGUgc3RhdGUncyBkb2N1bWVudCBsZW5ndGggYW5kIGxpbmVcbiAgICBzZXBhcmF0b3IgaW50byBhY2NvdW50LlxuICAgICovXG4gICAgY2hhbmdlcyhzcGVjID0gW10pIHtcbiAgICAgICAgaWYgKHNwZWMgaW5zdGFuY2VvZiBDaGFuZ2VTZXQpXG4gICAgICAgICAgICByZXR1cm4gc3BlYztcbiAgICAgICAgcmV0dXJuIENoYW5nZVNldC5vZihzcGVjLCB0aGlzLmRvYy5sZW5ndGgsIHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcikpO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2luZyB0aGUgc3RhdGUncyBbbGluZVxuICAgIHNlcGFyYXRvcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5saW5lU2VwYXJhdG9yKSwgY3JlYXRlIGFcbiAgICBbYFRleHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQpIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIHRvVGV4dChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFRleHQub2Yoc3RyaW5nLnNwbGl0KHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcikgfHwgRGVmYXVsdFNwbGl0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50IGFzIGEgc3RyaW5nLlxuICAgICovXG4gICAgc2xpY2VEb2MoZnJvbSA9IDAsIHRvID0gdGhpcy5kb2MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5zbGljZVN0cmluZyhmcm9tLCB0bywgdGhpcy5saW5lQnJlYWspO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIGEgc3RhdGUgW2ZhY2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0KS5cbiAgICAqL1xuICAgIGZhY2V0KGZhY2V0KSB7XG4gICAgICAgIGxldCBhZGRyID0gdGhpcy5jb25maWcuYWRkcmVzc1tmYWNldC5pZF07XG4gICAgICAgIGlmIChhZGRyID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXQuZGVmYXVsdDtcbiAgICAgICAgZW5zdXJlQWRkcih0aGlzLCBhZGRyKTtcbiAgICAgICAgcmV0dXJuIGdldEFkZHIodGhpcywgYWRkcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhpcyBzdGF0ZSB0byBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdC4gV2hlbiBjdXN0b21cbiAgICBmaWVsZHMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQsIHlvdSBjYW4gcGFzcyB0aGVtIGluIGFzIGFuIG9iamVjdFxuICAgIG1hcHBpbmcgcHJvcGVydHkgbmFtZXMgKGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LCB3aGljaCBzaG91bGRcbiAgICBub3QgdXNlIGBkb2NgIG9yIGBzZWxlY3Rpb25gKSB0byBmaWVsZHMuXG4gICAgKi9cbiAgICB0b0pTT04oZmllbGRzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBkb2M6IHRoaXMuc2xpY2VEb2MoKSxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24udG9KU09OKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZpZWxkcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmllbGRzW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0YXRlRmllbGQgJiYgdGhpcy5jb25maWcuYWRkcmVzc1t2YWx1ZS5pZF0gIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsdWUuc3BlYy50b0pTT04odGhpcy5maWVsZChmaWVsZHNbcHJvcF0pLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBzdGF0ZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBXaGVuIGN1c3RvbVxuICAgIGZpZWxkcyBzaG91bGQgYmUgZGVzZXJpYWxpemVkLCBwYXNzIHRoZSBzYW1lIG9iamVjdCB5b3UgcGFzc2VkXG4gICAgdG8gW2B0b0pTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnRvSlNPTikgd2hlbiBzZXJpYWxpemluZyBhc1xuICAgIHRoaXJkIGFyZ3VtZW50LlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbmZpZyA9IHt9LCBmaWVsZHMpIHtcbiAgICAgICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uLmRvYyAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVkaXRvclN0YXRlXCIpO1xuICAgICAgICBsZXQgZmllbGRJbml0ID0gW107XG4gICAgICAgIGlmIChmaWVsZHMpXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoanNvbiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW3Byb3BdLCB2YWx1ZSA9IGpzb25bcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSW5pdC5wdXNoKGZpZWxkLmluaXQoc3RhdGUgPT4gZmllbGQuc3BlYy5mcm9tSlNPTih2YWx1ZSwgc3RhdGUpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgICAgIGRvYzoganNvbi5kb2MsXG4gICAgICAgICAgICBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5mcm9tSlNPTihqc29uLnNlbGVjdGlvbiksXG4gICAgICAgICAgICBleHRlbnNpb25zOiBjb25maWcuZXh0ZW5zaW9ucyA/IGZpZWxkSW5pdC5jb25jYXQoW2NvbmZpZy5leHRlbnNpb25zXSkgOiBmaWVsZEluaXRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZS4gWW91J2xsIHVzdWFsbHkgb25seSBuZWVkIHRoaXMgd2hlblxuICAgIGluaXRpYWxpemluZyBhbiBlZGl0b3JcdTIwMTR1cGRhdGVkIHN0YXRlcyBhcmUgY3JlYXRlZCBieSBhcHBseWluZ1xuICAgIHRyYW5zYWN0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoY29uZmlnID0ge30pIHtcbiAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLnJlc29sdmUoY29uZmlnLmV4dGVuc2lvbnMgfHwgW10sIG5ldyBNYXApO1xuICAgICAgICBsZXQgZG9jID0gY29uZmlnLmRvYyBpbnN0YW5jZW9mIFRleHQgPyBjb25maWcuZG9jXG4gICAgICAgICAgICA6IFRleHQub2YoKGNvbmZpZy5kb2MgfHwgXCJcIikuc3BsaXQoY29uZmlndXJhdGlvbi5zdGF0aWNGYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBEZWZhdWx0U3BsaXQpKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9ICFjb25maWcuc2VsZWN0aW9uID8gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZSgwKVxuICAgICAgICAgICAgOiBjb25maWcuc2VsZWN0aW9uIGluc3RhbmNlb2YgRWRpdG9yU2VsZWN0aW9uID8gY29uZmlnLnNlbGVjdGlvblxuICAgICAgICAgICAgICAgIDogRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShjb25maWcuc2VsZWN0aW9uLmFuY2hvciwgY29uZmlnLnNlbGVjdGlvbi5oZWFkKTtcbiAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBkb2MubGVuZ3RoKTtcbiAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uLnN0YXRpY0ZhY2V0KGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKSlcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5hc1NpbmdsZSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclN0YXRlKGNvbmZpZ3VyYXRpb24sIGRvYywgc2VsZWN0aW9uLCBjb25maWd1cmF0aW9uLmR5bmFtaWNTbG90cy5tYXAoKCkgPT4gbnVsbCksIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC5jcmVhdGUoc3RhdGUpLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNpemUgKGluIGNvbHVtbnMpIG9mIGEgdGFiIGluIHRoZSBkb2N1bWVudCwgZGV0ZXJtaW5lZCBieVxuICAgIHRoZSBbYHRhYlNpemVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpIGZhY2V0LlxuICAgICovXG4gICAgZ2V0IHRhYlNpemUoKSB7IHJldHVybiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLnRhYlNpemUpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwcm9wZXIgW2xpbmUtYnJlYWtdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVebGluZVNlcGFyYXRvcilcbiAgICBzdHJpbmcgZm9yIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgbGluZUJyZWFrKCkgeyByZXR1cm4gdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBcIlxcblwiOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhlIGVkaXRvciBpc1xuICAgIFtjb25maWd1cmVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnJlYWRPbmx5KSB0byBiZSByZWFkLW9ubHkuXG4gICAgKi9cbiAgICBnZXQgcmVhZE9ubHkoKSB7IHJldHVybiB0aGlzLmZhY2V0KHJlYWRPbmx5KTsgfVxuICAgIC8qKlxuICAgIExvb2sgdXAgYSB0cmFuc2xhdGlvbiBmb3IgdGhlIGdpdmVuIHBocmFzZSAodmlhIHRoZVxuICAgIFtgcGhyYXNlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVecGhyYXNlcykgZmFjZXQpLCBvciByZXR1cm4gdGhlXG4gICAgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLlxuICAgIFxuICAgIElmIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwYXNzZWQsIHRoZXkgd2lsbCBiZSBpbnNlcnRlZCBpblxuICAgIHBsYWNlIG9mIG1hcmtlcnMgbGlrZSBgJDFgIChmb3IgdGhlIGZpcnN0IHZhbHVlKSBhbmQgYCQyYCwgZXRjLlxuICAgIEEgc2luZ2xlIGAkYCBpcyBlcXVpdmFsZW50IHRvIGAkMWAsIGFuZCBgJCRgIHdpbGwgcHJvZHVjZSBhXG4gICAgbGl0ZXJhbCBkb2xsYXIgc2lnbi5cbiAgICAqL1xuICAgIHBocmFzZShwaHJhc2UsIC4uLmluc2VydCkge1xuICAgICAgICBmb3IgKGxldCBtYXAgb2YgdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5waHJhc2VzKSlcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWFwLCBwaHJhc2UpKSB7XG4gICAgICAgICAgICAgICAgcGhyYXNlID0gbWFwW3BocmFzZV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChpbnNlcnQubGVuZ3RoKVxuICAgICAgICAgICAgcGhyYXNlID0gcGhyYXNlLnJlcGxhY2UoL1xcJChcXCR8XFxkKikvZywgKG0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBcIiRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJFwiO1xuICAgICAgICAgICAgICAgIGxldCBuID0gKyhpIHx8IDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhbiB8fCBuID4gaW5zZXJ0Lmxlbmd0aCA/IG0gOiBpbnNlcnRbbiAtIDFdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwaHJhc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIHZhbHVlcyBmb3IgYSBnaXZlbiBsYW5ndWFnZSBkYXRhIGZpZWxkLCBwcm92aWRlZCBieSB0aGVcbiAgICB0aGUgW2BsYW5ndWFnZURhdGFgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmxhbmd1YWdlRGF0YSkgZmFjZXQuXG4gICAgXG4gICAgRXhhbXBsZXMgb2YgbGFuZ3VhZ2UgZGF0YSBmaWVsZHMgYXJlLi4uXG4gICAgXG4gICAgLSBbYFwiY29tbWVudFRva2Vuc1wiYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNjb21tYW5kcy5Db21tZW50VG9rZW5zKSBmb3Igc3BlY2lmeWluZ1xuICAgICAgY29tbWVudCBzeW50YXguXG4gICAgLSBbYFwiYXV0b2NvbXBsZXRlXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2F1dG9jb21wbGV0ZS5hdXRvY29tcGxldGlvbl5jb25maWcub3ZlcnJpZGUpXG4gICAgICBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBsZXRpb24gc291cmNlcy5cbiAgICAtIFtgXCJ3b3JkQ2hhcnNcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhckNhdGVnb3JpemVyKSBmb3IgYWRkaW5nXG4gICAgICBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB3b3JkcyBpbiB0aGlzXG4gICAgICBsYW5ndWFnZS5cbiAgICAtIFtgXCJjbG9zZUJyYWNrZXRzXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2F1dG9jb21wbGV0ZS5DbG9zZUJyYWNrZXRDb25maWcpIGNvbnRyb2xzXG4gICAgICBicmFja2V0IGNsb3NpbmcgYmVoYXZpb3IuXG4gICAgKi9cbiAgICBsYW5ndWFnZURhdGFBdChuYW1lLCBwb3MsIHNpZGUgPSAtMSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHByb3ZpZGVyIG9mIHRoaXMuZmFjZXQobGFuZ3VhZ2VEYXRhKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcmVzdWx0IG9mIHByb3ZpZGVyKHRoaXMsIHBvcywgc2lkZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgbmFtZSkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHJlc3VsdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gY2F0ZWdvcml6ZSBzdHJpbmdzIChleHBlY3RlZCB0b1xuICAgIHJlcHJlc2VudCBhIHNpbmdsZSBbZ3JhcGhlbWUgY2x1c3Rlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5maW5kQ2x1c3RlckJyZWFrKSlcbiAgICBpbnRvIG9uZSBvZjpcbiAgICBcbiAgICAgLSBXb3JkIChjb250YWlucyBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIG9yIGEgY2hhcmFjdGVyXG4gICAgICAgZXhwbGljaXRseSBsaXN0ZWQgaW4gdGhlIGxvY2FsIGxhbmd1YWdlJ3MgYFwid29yZENoYXJzXCJgXG4gICAgICAgbGFuZ3VhZ2UgZGF0YSwgd2hpY2ggc2hvdWxkIGJlIGEgc3RyaW5nKVxuICAgICAtIFNwYWNlIChjb250YWlucyBvbmx5IHdoaXRlc3BhY2UpXG4gICAgIC0gT3RoZXIgKGFueXRoaW5nIGVsc2UpXG4gICAgKi9cbiAgICBjaGFyQ2F0ZWdvcml6ZXIoYXQpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VDYXRlZ29yaXplcih0aGlzLmxhbmd1YWdlRGF0YUF0KFwid29yZENoYXJzXCIsIGF0KS5qb2luKFwiXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgd29yZCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIG1lYW5pbmcgdGhlIHJhbmdlXG4gICAgY29udGFpbmluZyBhbGwgW3dvcmRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhckNhdGVnb3J5LldvcmQpIGNoYXJhY3RlcnNcbiAgICBhcm91bmQgaXQuIElmIG5vIHdvcmQgY2hhcmFjdGVycyBhcmUgYWRqYWNlbnQgdG8gdGhlIHBvc2l0aW9uLFxuICAgIHRoaXMgcmV0dXJucyBudWxsLlxuICAgICovXG4gICAgd29yZEF0KHBvcykge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tLCBsZW5ndGggfSA9IHRoaXMuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBsZXQgY2F0ID0gdGhpcy5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gcG9zIC0gZnJvbSwgZW5kID0gcG9zIC0gZnJvbTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgbGV0IHByZXYgPSBmaW5kQ2x1c3RlckJyZWFrKHRleHQsIHN0YXJ0LCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoY2F0KHRleHQuc2xpY2UocHJldiwgc3RhcnQpKSAhPSBDaGFyQ2F0ZWdvcnkuV29yZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0YXJ0ID0gcHJldjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZW5kIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGZpbmRDbHVzdGVyQnJlYWsodGV4dCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChjYXQodGV4dC5zbGljZShlbmQsIG5leHQpKSAhPSBDaGFyQ2F0ZWdvcnkuV29yZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGVuZCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0ID09IGVuZCA/IG51bGwgOiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2Uoc3RhcnQgKyBmcm9tLCBlbmQgKyBmcm9tKTtcbiAgICB9XG59XG4vKipcbkEgZmFjZXQgdGhhdCwgd2hlbiBlbmFibGVkLCBjYXVzZXMgdGhlIGVkaXRvciB0byBhbGxvdyBtdWx0aXBsZVxucmFuZ2VzIHRvIGJlIHNlbGVjdGVkLiBCZSBjYXJlZnVsIHRob3VnaCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZVxuZWRpdG9yIHJlbGllcyBvbiB0aGUgbmF0aXZlIERPTSBzZWxlY3Rpb24sIHdoaWNoIGNhbm5vdCBoYW5kbGVcbm11bHRpcGxlIHNlbGVjdGlvbnMuIEFuIGV4dGVuc2lvbiBsaWtlXG5bYGRyYXdTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuZHJhd1NlbGVjdGlvbikgY2FuIGJlIHVzZWQgdG8gbWFrZVxuc2Vjb25kYXJ5IHNlbGVjdGlvbnMgdmlzaWJsZSB0byB0aGUgdXNlci5cbiovXG5FZGl0b3JTdGF0ZS5hbGxvd011bHRpcGxlU2VsZWN0aW9ucyA9IGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zO1xuLyoqXG5Db25maWd1cmVzIHRoZSB0YWIgc2l6ZSB0byB1c2UgaW4gdGhpcyBzdGF0ZS4gVGhlIGZpcnN0XG4oaGlnaGVzdC1wcmVjZWRlbmNlKSB2YWx1ZSBvZiB0aGUgZmFjZXQgaXMgdXNlZC4gSWYgbm8gdmFsdWUgaXNcbmdpdmVuLCB0aGlzIGRlZmF1bHRzIHRvIDQuXG4qL1xuRWRpdG9yU3RhdGUudGFiU2l6ZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogNFxufSk7XG4vKipcblRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuIEJ5IGRlZmF1bHQsIGFueSBvZiBgXCJcXG5cImAsIGBcIlxcclxcblwiYFxuYW5kIGBcIlxcclwiYCBpcyB0cmVhdGVkIGFzIGEgc2VwYXJhdG9yIHdoZW4gc3BsaXR0aW5nIGxpbmVzLCBhbmRcbmxpbmVzIGFyZSBqb2luZWQgd2l0aCBgXCJcXG5cImAuXG5cbldoZW4geW91IGNvbmZpZ3VyZSBhIHZhbHVlIGhlcmUsIG9ubHkgdGhhdCBwcmVjaXNlIHNlcGFyYXRvclxud2lsbCBiZSB1c2VkLCBhbGxvd2luZyB5b3UgdG8gcm91bmQtdHJpcCBkb2N1bWVudHMgdGhyb3VnaCB0aGVcbmVkaXRvciB3aXRob3V0IG5vcm1hbGl6aW5nIGxpbmUgc2VwYXJhdG9ycy5cbiovXG5FZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yID0gbGluZVNlcGFyYXRvcjtcbi8qKlxuVGhpcyBmYWNldCBjb250cm9scyB0aGUgdmFsdWUgb2YgdGhlXG5bYHJlYWRPbmx5YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5yZWFkT25seSkgZ2V0dGVyLCB3aGljaCBpc1xuY29uc3VsdGVkIGJ5IGNvbW1hbmRzIGFuZCBleHRlbnNpb25zIHRoYXQgaW1wbGVtZW50IGVkaXRpbmdcbmZ1bmN0aW9uYWxpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhleSBzaG91bGQgYXBwbHkuIEl0XG5kZWZhdWx0cyB0byBmYWxzZSwgYnV0IHdoZW4gaXRzIGhpZ2hlc3QtcHJlY2VkZW5jZSB2YWx1ZSBpc1xuYHRydWVgLCBzdWNoIGZ1bmN0aW9uYWxpdHkgZGlzYWJsZXMgaXRzZWxmLlxuXG5Ob3QgdG8gYmUgY29uZnVzZWQgd2l0aFxuW2BFZGl0b3JWaWV3LmVkaXRhYmxlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZWRpdGFibGUpLCB3aGljaFxuY29udHJvbHMgd2hldGhlciB0aGUgZWRpdG9yJ3MgRE9NIGlzIHNldCB0byBiZSBlZGl0YWJsZSAoYW5kXG50aHVzIGZvY3VzYWJsZSkuXG4qL1xuRWRpdG9yU3RhdGUucmVhZE9ubHkgPSByZWFkT25seTtcbi8qKlxuUmVnaXN0ZXJzIHRyYW5zbGF0aW9uIHBocmFzZXMuIFRoZVxuW2BwaHJhc2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnBocmFzZSkgbWV0aG9kIHdpbGwgbG9vayB0aHJvdWdoXG5hbGwgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGggdGhpcyBmYWNldCB0byBmaW5kIHRyYW5zbGF0aW9ucyBmb3Jcbml0cyBhcmd1bWVudC5cbiovXG5FZGl0b3JTdGF0ZS5waHJhc2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tcGFyZShhLCBiKSB7XG4gICAgICAgIGxldCBrQSA9IE9iamVjdC5rZXlzKGEpLCBrQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga0EubGVuZ3RoID09IGtCLmxlbmd0aCAmJiBrQS5ldmVyeShrID0+IGFba10gPT0gYltrXSk7XG4gICAgfVxufSk7XG4vKipcbkEgZmFjZXQgdXNlZCB0byByZWdpc3RlciBbbGFuZ3VhZ2VcbmRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpIHByb3ZpZGVycy5cbiovXG5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGEgPSBsYW5ndWFnZURhdGE7XG4vKipcbkZhY2V0IHVzZWQgdG8gcmVnaXN0ZXIgY2hhbmdlIGZpbHRlcnMsIHdoaWNoIGFyZSBjYWxsZWQgZm9yIGVhY2hcbnRyYW5zYWN0aW9uICh1bmxlc3MgZXhwbGljaXRseVxuW2Rpc2FibGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpKSwgYW5kIGNhbiBzdXBwcmVzc1xucGFydCBvZiB0aGUgdHJhbnNhY3Rpb24ncyBjaGFuZ2VzLlxuXG5TdWNoIGEgZnVuY3Rpb24gY2FuIHJldHVybiBgdHJ1ZWAgdG8gaW5kaWNhdGUgdGhhdCBpdCBkb2Vzbid0XG53YW50IHRvIGRvIGFueXRoaW5nLCBgZmFsc2VgIHRvIGNvbXBsZXRlbHkgc3RvcCB0aGUgY2hhbmdlcyBpblxudGhlIHRyYW5zYWN0aW9uLCBvciBhIHNldCBvZiByYW5nZXMgaW4gd2hpY2ggY2hhbmdlcyBzaG91bGQgYmVcbnN1cHByZXNzZWQuIFN1Y2ggcmFuZ2VzIGFyZSByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBudW1iZXJzLFxud2l0aCBlYWNoIHBhaXIgb2YgdHdvIG51bWJlcnMgaW5kaWNhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhXG5yYW5nZS4gU28gZm9yIGV4YW1wbGUgYFsxMCwgMjAsIDEwMCwgMTEwXWAgc3VwcHJlc3NlcyBjaGFuZ2VzXG5iZXR3ZWVuIDEwIGFuZCAyMCwgYW5kIGJldHdlZW4gMTAwIGFuZCAxMTAuXG4qL1xuRWRpdG9yU3RhdGUuY2hhbmdlRmlsdGVyID0gY2hhbmdlRmlsdGVyO1xuLyoqXG5GYWNldCB1c2VkIHRvIHJlZ2lzdGVyIGEgaG9vayB0aGF0IGdldHMgYSBjaGFuY2UgdG8gdXBkYXRlIG9yXG5yZXBsYWNlIHRyYW5zYWN0aW9uIHNwZWNzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkLiBUaGlzIHdpbGxcbm9ubHkgYmUgYXBwbGllZCBmb3IgdHJhbnNhY3Rpb25zIHRoYXQgZG9uJ3QgaGF2ZVxuW2BmaWx0ZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpIHNldCB0byBgZmFsc2VgLiBZb3VcbmNhbiBlaXRoZXIgcmV0dXJuIGEgc2luZ2xlIHRyYW5zYWN0aW9uIHNwZWMgKHBvc3NpYmx5IHRoZSBpbnB1dFxudHJhbnNhY3Rpb24pLCBvciBhbiBhcnJheSBvZiBzcGVjcyAod2hpY2ggd2lsbCBiZSBjb21iaW5lZCBpblxudGhlIHNhbWUgd2F5IGFzIHRoZSBhcmd1bWVudHMgdG9cbltgRWRpdG9yU3RhdGUudXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpKS5cblxuV2hlbiBwb3NzaWJsZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gYXZvaWQgYWNjZXNzaW5nXG5bYFRyYW5zYWN0aW9uLnN0YXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zdGF0ZSkgaW4gYSBmaWx0ZXIsXG5zaW5jZSBpdCB3aWxsIGZvcmNlIGNyZWF0aW9uIG9mIGEgc3RhdGUgdGhhdCB3aWxsIHRoZW4gYmVcbmRpc2NhcmRlZCBhZ2FpbiwgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGFjdHVhbGx5IGZpbHRlcmVkLlxuXG4oVGhpcyBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4gSW5kaXNjcmltaW5hdGVseVxubW9kaWZ5aW5nIHRyYW5zYWN0aW9uIGlzIGxpa2VseSB0byBicmVhayBzb21ldGhpbmcgb3IgZGVncmFkZVxudGhlIHVzZXIgZXhwZXJpZW5jZS4pXG4qL1xuRWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIgPSB0cmFuc2FjdGlvbkZpbHRlcjtcbi8qKlxuVGhpcyBpcyBhIG1vcmUgbGltaXRlZCBmb3JtIG9mXG5bYHRyYW5zYWN0aW9uRmlsdGVyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50cmFuc2FjdGlvbkZpbHRlciksXG53aGljaCBjYW4gb25seSBhZGRcblthbm5vdGF0aW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuYW5ub3RhdGlvbnMpIGFuZFxuW2VmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpLiBfQnV0XywgdGhpcyB0eXBlXG5vZiBmaWx0ZXIgcnVucyBldmVuIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgZGlzYWJsZWQgcmVndWxhclxuW2ZpbHRlcmluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZmlsdGVyKSwgbWFraW5nIGl0IHN1aXRhYmxlXG5mb3IgZWZmZWN0cyB0aGF0IGRvbid0IG5lZWQgdG8gdG91Y2ggdGhlIGNoYW5nZXMgb3Igc2VsZWN0aW9uLFxuYnV0IGRvIHdhbnQgdG8gcHJvY2VzcyBldmVyeSB0cmFuc2FjdGlvbi5cblxuRXh0ZW5kZXJzIHJ1biBfYWZ0ZXJfIGZpbHRlcnMsIHdoZW4gYm90aCBhcmUgcHJlc2VudC5cbiovXG5FZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkV4dGVuZGVyID0gdHJhbnNhY3Rpb25FeHRlbmRlcjtcbkNvbXBhcnRtZW50LnJlY29uZmlndXJlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuXG4vKipcblV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbWJpbmluZyBiZWhhdmlvcnMgdG8gZmlsbCBpbiBhIGNvbmZpZ1xub2JqZWN0IGZyb20gYW4gYXJyYXkgb2YgcHJvdmlkZWQgY29uZmlncy4gYGRlZmF1bHRzYCBzaG91bGQgaG9sZFxuZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMgaW4gYENvbmZpZ2AuXG5cblRoZSBmdW5jdGlvbiB3aWxsLCBieSBkZWZhdWx0LCBlcnJvclxud2hlbiBhIGZpZWxkIGdldHMgdHdvIHZhbHVlcyB0aGF0IGFyZW4ndCBgPT09YC1lcXVhbCwgYnV0IHlvdSBjYW5cbnByb3ZpZGUgY29tYmluZSBmdW5jdGlvbnMgcGVyIGZpZWxkIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuKi9cbmZ1bmN0aW9uIGNvbWJpbmVDb25maWcoY29uZmlncywgZGVmYXVsdHMsIC8vIFNob3VsZCBob2xkIG9ubHkgdGhlIG9wdGlvbmFsIHByb3BlcnRpZXMgb2YgQ29uZmlnLCBidXQgSSBoYXZlbid0IG1hbmFnZWQgdG8gZXhwcmVzcyB0aGF0XG5jb21iaW5lID0ge30pIHtcbiAgICBsZXQgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgY29uZmlnIG9mIGNvbmZpZ3MpXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBjb25maWdba2V5XSwgY3VycmVudCA9IHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudCA9PT0gdmFsdWUgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgOyAvLyBObyBjb25mbGljdFxuICAgICAgICAgICAgZWxzZSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoY29tYmluZSwga2V5KSlcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGNvbWJpbmVba2V5XShjdXJyZW50LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlnIG1lcmdlIGNvbmZsaWN0IGZvciBmaWVsZCBcIiArIGtleSk7XG4gICAgICAgIH1cbiAgICBmb3IgKGxldCBrZXkgaW4gZGVmYXVsdHMpXG4gICAgICAgIGlmIChyZXN1bHRba2V5XSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkZWZhdWx0c1trZXldO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuRWFjaCByYW5nZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2YWx1ZSwgd2hpY2ggbXVzdCBpbmhlcml0IGZyb21cbnRoaXMgY2xhc3MuXG4qL1xuY2xhc3MgUmFuZ2VWYWx1ZSB7XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHZhbHVlIHdpdGggYW5vdGhlciB2YWx1ZS4gVXNlZCB3aGVuIGNvbXBhcmluZ1xuICAgIHJhbmdlc2V0cy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY29tcGFyZXMgYnkgaWRlbnRpdHkuXG4gICAgVW5sZXNzIHlvdSBhcmUgb25seSBjcmVhdGluZyBhIGZpeGVkIG51bWJlciBvZiB1bmlxdWUgaW5zdGFuY2VzXG4gICAgb2YgeW91ciB2YWx1ZSB0eXBlLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBpbXBsZW1lbnQgdGhpc1xuICAgIHByb3Blcmx5LlxuICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMgPT0gb3RoZXI7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbcmFuZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIHdpdGggdGhpcyB2YWx1ZS5cbiAgICAqL1xuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkgeyByZXR1cm4gUmFuZ2UuY3JlYXRlKGZyb20sIHRvLCB0aGlzKTsgfVxufVxuUmFuZ2VWYWx1ZS5wcm90b3R5cGUuc3RhcnRTaWRlID0gUmFuZ2VWYWx1ZS5wcm90b3R5cGUuZW5kU2lkZSA9IDA7XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5wb2ludCA9IGZhbHNlO1xuUmFuZ2VWYWx1ZS5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tEZWw7XG4vKipcbkEgcmFuZ2UgYXNzb2NpYXRlcyBhIHZhbHVlIHdpdGggYSByYW5nZSBvZiBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgSXRzIGVuZCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmFuZ2UuXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKGZyb20sIHRvLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY21wUmFuZ2UoYSwgYikge1xuICAgIHJldHVybiBhLmZyb20gLSBiLmZyb20gfHwgYS52YWx1ZS5zdGFydFNpZGUgLSBiLnZhbHVlLnN0YXJ0U2lkZTtcbn1cbmNsYXNzIENodW5rIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgdmFsdWUsIFxuICAgIC8vIENodW5rcyBhcmUgbWFya2VkIHdpdGggdGhlIGxhcmdlc3QgcG9pbnQgdGhhdCBvY2N1cnNcbiAgICAvLyBpbiB0aGVtIChvciAtMSBmb3Igbm8gcG9pbnRzKSwgc28gdGhhdCBzY2FucyB0aGF0IGFyZVxuICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBwb2ludHMgKHN1Y2ggYXMgdGhlXG4gICAgLy8gaGVpZ2h0bWFwLXJlbGF0ZWQgbG9naWMpIGNhbiBza2lwIHJhbmdlLW9ubHkgY2h1bmtzLlxuICAgIG1heFBvaW50KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gbWF4UG9pbnQ7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRvW3RoaXMudG8ubGVuZ3RoIC0gMV07IH1cbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNpZGUuIFVzZSB0aGUgcmFuZ2VzJ1xuICAgIC8vIGBmcm9tYCBwb3Mgd2hlbiBgZW5kID09IGZhbHNlYCwgYHRvYCB3aGVuIGBlbmQgPT0gdHJ1ZWAuXG4gICAgZmluZEluZGV4KHBvcywgc2lkZSwgZW5kLCBzdGFydEF0ID0gMCkge1xuICAgICAgICBsZXQgYXJyID0gZW5kID8gdGhpcy50byA6IHRoaXMuZnJvbTtcbiAgICAgICAgZm9yIChsZXQgbG8gPSBzdGFydEF0LCBoaSA9IGFyci5sZW5ndGg7Oykge1xuICAgICAgICAgICAgaWYgKGxvID09IGhpKVxuICAgICAgICAgICAgICAgIHJldHVybiBsbztcbiAgICAgICAgICAgIGxldCBtaWQgPSAobG8gKyBoaSkgPj4gMTtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYXJyW21pZF0gLSBwb3MgfHwgKGVuZCA/IHRoaXMudmFsdWVbbWlkXS5lbmRTaWRlIDogdGhpcy52YWx1ZVttaWRdLnN0YXJ0U2lkZSkgLSBzaWRlO1xuICAgICAgICAgICAgaWYgKG1pZCA9PSBsbylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlmZiA+PSAwID8gbG8gOiBoaTtcbiAgICAgICAgICAgIGlmIChkaWZmID49IDApXG4gICAgICAgICAgICAgICAgaGkgPSBtaWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbG8gPSBtaWQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJldHdlZW4ob2Zmc2V0LCBmcm9tLCB0bywgZikge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5maW5kSW5kZXgoZnJvbSwgLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8sIHRydWUpLCBlID0gdGhpcy5maW5kSW5kZXgodG8sIDEwMDAwMDAwMDAgLyogQy5GYXIgKi8sIGZhbHNlLCBpKTsgaSA8IGU7IGkrKylcbiAgICAgICAgICAgIGlmIChmKHRoaXMuZnJvbVtpXSArIG9mZnNldCwgdGhpcy50b1tpXSArIG9mZnNldCwgdGhpcy52YWx1ZVtpXSkgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbWFwKG9mZnNldCwgY2hhbmdlcykge1xuICAgICAgICBsZXQgdmFsdWUgPSBbXSwgZnJvbSA9IFtdLCB0byA9IFtdLCBuZXdQb3MgPSAtMSwgbWF4UG9pbnQgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmFsID0gdGhpcy52YWx1ZVtpXSwgY3VyRnJvbSA9IHRoaXMuZnJvbVtpXSArIG9mZnNldCwgY3VyVG8gPSB0aGlzLnRvW2ldICsgb2Zmc2V0LCBuZXdGcm9tLCBuZXdUbztcbiAgICAgICAgICAgIGlmIChjdXJGcm9tID09IGN1clRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5zdGFydFNpZGUsIHZhbC5tYXBNb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5ld0Zyb20gPSBuZXdUbyA9IG1hcHBlZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsLnN0YXJ0U2lkZSAhPSB2YWwuZW5kU2lkZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdUbyA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1RvIDwgbmV3RnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld0Zyb20gPSBjaGFuZ2VzLm1hcFBvcyhjdXJGcm9tLCB2YWwuc3RhcnRTaWRlKTtcbiAgICAgICAgICAgICAgICBuZXdUbyA9IGNoYW5nZXMubWFwUG9zKGN1clRvLCB2YWwuZW5kU2lkZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Zyb20gPiBuZXdUbyB8fCBuZXdGcm9tID09IG5ld1RvICYmIHZhbC5zdGFydFNpZGUgPiAwICYmIHZhbC5lbmRTaWRlIDw9IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChuZXdUbyAtIG5ld0Zyb20gfHwgdmFsLmVuZFNpZGUgLSB2YWwuc3RhcnRTaWRlKSA8IDApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAobmV3UG9zIDwgMClcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSBuZXdGcm9tO1xuICAgICAgICAgICAgaWYgKHZhbC5wb2ludClcbiAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBuZXdUbyAtIG5ld0Zyb20pO1xuICAgICAgICAgICAgdmFsdWUucHVzaCh2YWwpO1xuICAgICAgICAgICAgZnJvbS5wdXNoKG5ld0Zyb20gLSBuZXdQb3MpO1xuICAgICAgICAgICAgdG8ucHVzaChuZXdUbyAtIG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFwcGVkOiB2YWx1ZS5sZW5ndGggPyBuZXcgQ2h1bmsoZnJvbSwgdG8sIHZhbHVlLCBtYXhQb2ludCkgOiBudWxsLCBwb3M6IG5ld1BvcyB9O1xuICAgIH1cbn1cbi8qKlxuQSByYW5nZSBzZXQgc3RvcmVzIGEgY29sbGVjdGlvbiBvZiBbcmFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlKSBpbiBhXG53YXkgdGhhdCBtYWtlcyB0aGVtIGVmZmljaWVudCB0byBbbWFwXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0Lm1hcCkgYW5kXG5bdXBkYXRlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0LnVwZGF0ZSkuIFRoaXMgaXMgYW4gaW1tdXRhYmxlIGRhdGFcbnN0cnVjdHVyZS5cbiovXG5jbGFzcyBSYW5nZVNldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVua1BvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVuaywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBuZXh0TGF5ZXIsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF4UG9pbnQpIHtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IGNodW5rUG9zO1xuICAgICAgICB0aGlzLmNodW5rID0gY2h1bms7XG4gICAgICAgIHRoaXMubmV4dExheWVyID0gbmV4dExheWVyO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gbWF4UG9pbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjaHVua1BvcywgY2h1bmssIG5leHRMYXllciwgbWF4UG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVNldChjaHVua1BvcywgY2h1bmssIG5leHRMYXllciwgbWF4UG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5jaHVuay5sZW5ndGggLSAxO1xuICAgICAgICByZXR1cm4gbGFzdCA8IDAgPyAwIDogTWF0aC5tYXgodGhpcy5jaHVua0VuZChsYXN0KSwgdGhpcy5uZXh0TGF5ZXIubGVuZ3RoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiByYW5nZXMgaW4gdGhlIHNldC5cbiAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBzaXplID0gdGhpcy5uZXh0TGF5ZXIuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgY2h1bmsgb2YgdGhpcy5jaHVuaylcbiAgICAgICAgICAgIHNpemUgKz0gY2h1bmsudmFsdWUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVua0VuZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaHVua1Bvc1tpbmRleF0gKyB0aGlzLmNodW5rW2luZGV4XS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgcmFuZ2Ugc2V0LCBvcHRpb25hbGx5IGFkZGluZyBuZXcgcmFuZ2VzIG9yIGZpbHRlcmluZ1xuICAgIG91dCBleGlzdGluZyBvbmVzLlxuICAgIFxuICAgIChOb3RlOiBUaGUgdHlwZSBwYXJhbWV0ZXIgaXMganVzdCB0aGVyZSBhcyBhIGtsdWRnZSB0byB3b3JrXG4gICAgYXJvdW5kIFR5cGVTY3JpcHQgdmFyaWFuY2UgaXNzdWVzIHRoYXQgcHJldmVudGVkIGBSYW5nZVNldDxYPmBcbiAgICBmcm9tIGJlaW5nIGEgc3VidHlwZSBvZiBgUmFuZ2VTZXQ8WT5gIHdoZW4gYFhgIGlzIGEgc3VidHlwZSBvZlxuICAgIGBZYC4pXG4gICAgKi9cbiAgICB1cGRhdGUodXBkYXRlU3BlYykge1xuICAgICAgICBsZXQgeyBhZGQgPSBbXSwgc29ydCA9IGZhbHNlLCBmaWx0ZXJGcm9tID0gMCwgZmlsdGVyVG8gPSB0aGlzLmxlbmd0aCB9ID0gdXBkYXRlU3BlYztcbiAgICAgICAgbGV0IGZpbHRlciA9IHVwZGF0ZVNwZWMuZmlsdGVyO1xuICAgICAgICBpZiAoYWRkLmxlbmd0aCA9PSAwICYmICFmaWx0ZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHNvcnQpXG4gICAgICAgICAgICBhZGQgPSBhZGQuc2xpY2UoKS5zb3J0KGNtcFJhbmdlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBhZGQubGVuZ3RoID8gUmFuZ2VTZXQub2YoYWRkKSA6IHRoaXM7XG4gICAgICAgIGxldCBjdXIgPSBuZXcgTGF5ZXJDdXJzb3IodGhpcywgbnVsbCwgLTEpLmdvdG8oMCksIGkgPSAwLCBzcGlsbCA9IFtdO1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgd2hpbGUgKGN1ci52YWx1ZSB8fCBpIDwgYWRkLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGkgPCBhZGQubGVuZ3RoICYmIChjdXIuZnJvbSAtIGFkZFtpXS5mcm9tIHx8IGN1ci5zdGFydFNpZGUgLSBhZGRbaV0udmFsdWUuc3RhcnRTaWRlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gYWRkW2krK107XG4gICAgICAgICAgICAgICAgaWYgKCFidWlsZGVyLmFkZElubmVyKHJhbmdlLmZyb20sIHJhbmdlLnRvLCByYW5nZS52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHNwaWxsLnB1c2gocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyLnJhbmdlSW5kZXggPT0gMSAmJiBjdXIuY2h1bmtJbmRleCA8IHRoaXMuY2h1bmsubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKGkgPT0gYWRkLmxlbmd0aCB8fCB0aGlzLmNodW5rRW5kKGN1ci5jaHVua0luZGV4KSA8IGFkZFtpXS5mcm9tKSAmJlxuICAgICAgICAgICAgICAgICghZmlsdGVyIHx8IGZpbHRlckZyb20gPiB0aGlzLmNodW5rRW5kKGN1ci5jaHVua0luZGV4KSB8fCBmaWx0ZXJUbyA8IHRoaXMuY2h1bmtQb3NbY3VyLmNodW5rSW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ2h1bmsodGhpcy5jaHVua1Bvc1tjdXIuY2h1bmtJbmRleF0sIHRoaXMuY2h1bmtbY3VyLmNodW5rSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGN1ci5uZXh0Q2h1bmsoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlckZyb20gPiBjdXIudG8gfHwgZmlsdGVyVG8gPCBjdXIuZnJvbSB8fCBmaWx0ZXIoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuYWRkSW5uZXIoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwaWxsLnB1c2goUmFuZ2UuY3JlYXRlKGN1ci5mcm9tLCBjdXIudG8sIGN1ci52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXIubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmZpbmlzaElubmVyKHRoaXMubmV4dExheWVyLmlzRW1wdHkgJiYgIXNwaWxsLmxlbmd0aCA/IFJhbmdlU2V0LmVtcHR5XG4gICAgICAgICAgICA6IHRoaXMubmV4dExheWVyLnVwZGF0ZSh7IGFkZDogc3BpbGwsIGZpbHRlciwgZmlsdGVyRnJvbSwgZmlsdGVyVG8gfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyByYW5nZSBzZXQgdGhyb3VnaCBhIHNldCBvZiBjaGFuZ2VzLCByZXR1cm4gdGhlIG5ldyBzZXQuXG4gICAgKi9cbiAgICBtYXAoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5lbXB0eSB8fCB0aGlzLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IGNodW5rcyA9IFtdLCBjaHVua1BvcyA9IFtdLCBtYXhQb2ludCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuY2h1bmtQb3NbaV0sIGNodW5rID0gdGhpcy5jaHVua1tpXTtcbiAgICAgICAgICAgIGxldCB0b3VjaCA9IGNoYW5nZXMudG91Y2hlc1JhbmdlKHN0YXJ0LCBzdGFydCArIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAodG91Y2ggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbWF4UG9pbnQgPSBNYXRoLm1heChtYXhQb2ludCwgY2h1bmsubWF4UG9pbnQpO1xuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICBjaHVua1Bvcy5wdXNoKGNoYW5nZXMubWFwUG9zKHN0YXJ0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3VjaCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCB7IG1hcHBlZCwgcG9zIH0gPSBjaHVuay5tYXAoc3RhcnQsIGNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnQgPSBNYXRoLm1heChtYXhQb2ludCwgbWFwcGVkLm1heFBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2gobWFwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtQb3MucHVzaChwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dCA9IHRoaXMubmV4dExheWVyLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgcmV0dXJuIGNodW5rcy5sZW5ndGggPT0gMCA/IG5leHQgOiBuZXcgUmFuZ2VTZXQoY2h1bmtQb3MsIGNodW5rcywgbmV4dCB8fCBSYW5nZVNldC5lbXB0eSwgbWF4UG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyB0aGF0IHRvdWNoIHRoZSByZWdpb24gYGZyb21gIHRvIGB0b2AsXG4gICAgY2FsbGluZyBgZmAgZm9yIGVhY2guIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSByYW5nZXMgd2lsbFxuICAgIGJlIHJlcG9ydGVkIGluIGFueSBzcGVjaWZpYyBvcmRlci4gV2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJuc1xuICAgIGBmYWxzZWAsIGl0ZXJhdGlvbiBzdG9wcy5cbiAgICAqL1xuICAgIGJldHdlZW4oZnJvbSwgdG8sIGYpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmNodW5rUG9zW2ldLCBjaHVuayA9IHRoaXMuY2h1bmtbaV07XG4gICAgICAgICAgICBpZiAodG8gPj0gc3RhcnQgJiYgZnJvbSA8PSBzdGFydCArIGNodW5rLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIGNodW5rLmJldHdlZW4oc3RhcnQsIGZyb20gLSBzdGFydCwgdG8gLSBzdGFydCwgZikgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHRMYXllci5iZXR3ZWVuKGZyb20sIHRvLCBmKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSByYW5nZXMgaW4gdGhpcyBzZXQsIGluIG9yZGVyLCBpbmNsdWRpbmcgYWxsXG4gICAgcmFuZ2VzIHRoYXQgZW5kIGF0IG9yIGFmdGVyIGBmcm9tYC5cbiAgICAqL1xuICAgIGl0ZXIoZnJvbSA9IDApIHtcbiAgICAgICAgcmV0dXJuIEhlYXBDdXJzb3IuZnJvbShbdGhpc10pLmdvdG8oZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlzRW1wdHkoKSB7IHJldHVybiB0aGlzLm5leHRMYXllciA9PSB0aGlzOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSByYW5nZXMgaW4gYSBjb2xsZWN0aW9uIG9mIHNldHMsIGluIG9yZGVyLFxuICAgIHN0YXJ0aW5nIGZyb20gYGZyb21gLlxuICAgICovXG4gICAgc3RhdGljIGl0ZXIoc2V0cywgZnJvbSA9IDApIHtcbiAgICAgICAgcmV0dXJuIEhlYXBDdXJzb3IuZnJvbShzZXRzKS5nb3RvKGZyb20pO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdHdvIGdyb3VwcyBvZiBzZXRzLCBjYWxsaW5nIG1ldGhvZHMgb24gYGNvbXBhcmF0b3JgXG4gICAgdG8gbm90aWZ5IGl0IG9mIHBvc3NpYmxlIGRpZmZlcmVuY2VzLlxuICAgICovXG4gICAgc3RhdGljIGNvbXBhcmUob2xkU2V0cywgbmV3U2V0cywgXG4gICAgLyoqXG4gICAgVGhpcyBpbmRpY2F0ZXMgaG93IHRoZSB1bmRlcmx5aW5nIGRhdGEgY2hhbmdlZCBiZXR3ZWVuIHRoZXNlXG4gICAgcmFuZ2VzLCBhbmQgaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIHRoZSBpdGVyYXRpb24uXG4gICAgKi9cbiAgICB0ZXh0RGlmZiwgY29tcGFyYXRvciwgXG4gICAgLyoqXG4gICAgQ2FuIGJlIHVzZWQgdG8gaWdub3JlIGFsbCBub24tcG9pbnQgcmFuZ2VzLCBhbmQgcG9pbnRzIGJlbG93XG4gICAgdGhlIGdpdmVuIHNpemUuIFdoZW4gLTEsIGFsbCByYW5nZXMgYXJlIGNvbXBhcmVkLlxuICAgICovXG4gICAgbWluUG9pbnRTaXplID0gLTEpIHtcbiAgICAgICAgbGV0IGEgPSBvbGRTZXRzLmZpbHRlcihzZXQgPT4gc2V0Lm1heFBvaW50ID4gMCB8fCAhc2V0LmlzRW1wdHkgJiYgc2V0Lm1heFBvaW50ID49IG1pblBvaW50U2l6ZSk7XG4gICAgICAgIGxldCBiID0gbmV3U2V0cy5maWx0ZXIoc2V0ID0+IHNldC5tYXhQb2ludCA+IDAgfHwgIXNldC5pc0VtcHR5ICYmIHNldC5tYXhQb2ludCA+PSBtaW5Qb2ludFNpemUpO1xuICAgICAgICBsZXQgc2hhcmVkQ2h1bmtzID0gZmluZFNoYXJlZENodW5rcyhhLCBiLCB0ZXh0RGlmZik7XG4gICAgICAgIGxldCBzaWRlQSA9IG5ldyBTcGFuQ3Vyc29yKGEsIHNoYXJlZENodW5rcywgbWluUG9pbnRTaXplKTtcbiAgICAgICAgbGV0IHNpZGVCID0gbmV3IFNwYW5DdXJzb3IoYiwgc2hhcmVkQ2h1bmtzLCBtaW5Qb2ludFNpemUpO1xuICAgICAgICB0ZXh0RGlmZi5pdGVyR2FwcygoZnJvbUEsIGZyb21CLCBsZW5ndGgpID0+IGNvbXBhcmUoc2lkZUEsIGZyb21BLCBzaWRlQiwgZnJvbUIsIGxlbmd0aCwgY29tcGFyYXRvcikpO1xuICAgICAgICBpZiAodGV4dERpZmYuZW1wdHkgJiYgdGV4dERpZmYubGVuZ3RoID09IDApXG4gICAgICAgICAgICBjb21wYXJlKHNpZGVBLCAwLCBzaWRlQiwgMCwgMCwgY29tcGFyYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHR3byBncm91cHMgb2YgcmFuZ2Ugc2V0cywgcmV0dXJuaW5nIHRydWVcbiAgICBpZiB0aGV5IGFyZSBlcXVpdmFsZW50IGluIHRoZSBnaXZlbiByYW5nZS5cbiAgICAqL1xuICAgIHN0YXRpYyBlcShvbGRTZXRzLCBuZXdTZXRzLCBmcm9tID0gMCwgdG8pIHtcbiAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICB0byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi8gLSAxO1xuICAgICAgICBsZXQgYSA9IG9sZFNldHMuZmlsdGVyKHNldCA9PiAhc2V0LmlzRW1wdHkgJiYgbmV3U2V0cy5pbmRleE9mKHNldCkgPCAwKTtcbiAgICAgICAgbGV0IGIgPSBuZXdTZXRzLmZpbHRlcihzZXQgPT4gIXNldC5pc0VtcHR5ICYmIG9sZFNldHMuaW5kZXhPZihzZXQpIDwgMCk7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgc2hhcmVkQ2h1bmtzID0gZmluZFNoYXJlZENodW5rcyhhLCBiKTtcbiAgICAgICAgbGV0IHNpZGVBID0gbmV3IFNwYW5DdXJzb3IoYSwgc2hhcmVkQ2h1bmtzLCAwKS5nb3RvKGZyb20pLCBzaWRlQiA9IG5ldyBTcGFuQ3Vyc29yKGIsIHNoYXJlZENodW5rcywgMCkuZ290byhmcm9tKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHNpZGVBLnRvICE9IHNpZGVCLnRvIHx8XG4gICAgICAgICAgICAgICAgIXNhbWVWYWx1ZXMoc2lkZUEuYWN0aXZlLCBzaWRlQi5hY3RpdmUpIHx8XG4gICAgICAgICAgICAgICAgc2lkZUEucG9pbnQgJiYgKCFzaWRlQi5wb2ludCB8fCAhc2lkZUEucG9pbnQuZXEoc2lkZUIucG9pbnQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2lkZUEudG8gPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHNpZGVBLm5leHQoKTtcbiAgICAgICAgICAgIHNpZGVCLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgYSBncm91cCBvZiByYW5nZSBzZXRzIGF0IHRoZSBzYW1lIHRpbWUsIG5vdGlmeWluZ1xuICAgIHRoZSBpdGVyYXRvciBhYm91dCB0aGUgcmFuZ2VzIGNvdmVyaW5nIGV2ZXJ5IGdpdmVuIHBpZWNlIG9mXG4gICAgY29udGVudC4gUmV0dXJucyB0aGUgb3BlbiBjb3VudCAoc2VlXG4gICAgW2BTcGFuSXRlcmF0b3Iuc3BhbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3Bhbkl0ZXJhdG9yLnNwYW4pKSBhdCB0aGUgZW5kXG4gICAgb2YgdGhlIGl0ZXJhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBzcGFucyhzZXRzLCBmcm9tLCB0bywgaXRlcmF0b3IsIFxuICAgIC8qKlxuICAgIFdoZW4gZ2l2ZW4gYW5kIGdyZWF0ZXIgdGhhbiAtMSwgb25seSBwb2ludHMgb2YgYXQgbGVhc3QgdGhpc1xuICAgIHNpemUgYXJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAqL1xuICAgIG1pblBvaW50U2l6ZSA9IC0xKSB7XG4gICAgICAgIGxldCBjdXJzb3IgPSBuZXcgU3BhbkN1cnNvcihzZXRzLCBudWxsLCBtaW5Qb2ludFNpemUpLmdvdG8oZnJvbSksIHBvcyA9IGZyb207XG4gICAgICAgIGxldCBvcGVuUmFuZ2VzID0gY3Vyc29yLm9wZW5TdGFydDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGN1clRvID0gTWF0aC5taW4oY3Vyc29yLnRvLCB0byk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yLnBvaW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGl2ZSA9IGN1cnNvci5hY3RpdmVGb3JQb2ludChjdXJzb3IudG8pO1xuICAgICAgICAgICAgICAgIGxldCBvcGVuQ291bnQgPSBjdXJzb3IucG9pbnRGcm9tIDwgZnJvbSA/IGFjdGl2ZS5sZW5ndGggKyAxIDogTWF0aC5taW4oYWN0aXZlLmxlbmd0aCwgb3BlblJhbmdlcyk7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IucG9pbnQocG9zLCBjdXJUbywgY3Vyc29yLnBvaW50LCBhY3RpdmUsIG9wZW5Db3VudCwgY3Vyc29yLnBvaW50UmFuayk7XG4gICAgICAgICAgICAgICAgb3BlblJhbmdlcyA9IE1hdGgubWluKGN1cnNvci5vcGVuRW5kKGN1clRvKSwgYWN0aXZlLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJUbyA+IHBvcykge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNwYW4ocG9zLCBjdXJUbywgY3Vyc29yLmFjdGl2ZSwgb3BlblJhbmdlcyk7XG4gICAgICAgICAgICAgICAgb3BlblJhbmdlcyA9IGN1cnNvci5vcGVuRW5kKGN1clRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlblJhbmdlcyArIChjdXJzb3IucG9pbnQgJiYgY3Vyc29yLnRvID4gdG8gPyAxIDogMCk7XG4gICAgICAgICAgICBwb3MgPSBjdXJzb3IudG87XG4gICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJhbmdlIHNldCBmb3IgdGhlIGdpdmVuIHJhbmdlIG9yIGFycmF5IG9mIHJhbmdlcy4gQnlcbiAgICBkZWZhdWx0LCB0aGlzIGV4cGVjdHMgdGhlIHJhbmdlcyB0byBiZSBfc29ydGVkXyAoYnkgc3RhcnRcbiAgICBwb3NpdGlvbiBhbmQsIGlmIHR3byBzdGFydCBhdCB0aGUgc2FtZSBwb3NpdGlvbixcbiAgICBgdmFsdWUuc3RhcnRTaWRlYCkuIFlvdSBjYW4gcGFzcyBgdHJ1ZWAgYXMgc2Vjb25kIGFyZ3VtZW50IHRvXG4gICAgY2F1c2UgdGhlIG1ldGhvZCB0byBzb3J0IHRoZW0uXG4gICAgKi9cbiAgICBzdGF0aWMgb2YocmFuZ2VzLCBzb3J0ID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IGJ1aWxkID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICBmb3IgKGxldCByYW5nZSBvZiByYW5nZXMgaW5zdGFuY2VvZiBSYW5nZSA/IFtyYW5nZXNdIDogc29ydCA/IGxhenlTb3J0KHJhbmdlcykgOiByYW5nZXMpXG4gICAgICAgICAgICBidWlsZC5hZGQocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBKb2luIGFuIGFycmF5IG9mIHJhbmdlIHNldHMgaW50byBhIHNpbmdsZSBzZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgam9pbihzZXRzKSB7XG4gICAgICAgIGlmICghc2V0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gUmFuZ2VTZXQuZW1wdHk7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXRzW3NldHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGZvciAobGV0IGkgPSBzZXRzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciA9IHNldHNbaV07IGxheWVyICE9IFJhbmdlU2V0LmVtcHR5OyBsYXllciA9IGxheWVyLm5leHRMYXllcilcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUmFuZ2VTZXQobGF5ZXIuY2h1bmtQb3MsIGxheWVyLmNodW5rLCByZXN1bHQsIE1hdGgubWF4KGxheWVyLm1heFBvaW50LCByZXN1bHQubWF4UG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiByYW5nZXMuXG4qL1xuUmFuZ2VTZXQuZW1wdHkgPSAvKkBfX1BVUkVfXyovbmV3IFJhbmdlU2V0KFtdLCBbXSwgbnVsbCwgLTEpO1xuZnVuY3Rpb24gbGF6eVNvcnQocmFuZ2VzKSB7XG4gICAgaWYgKHJhbmdlcy5sZW5ndGggPiAxKVxuICAgICAgICBmb3IgKGxldCBwcmV2ID0gcmFuZ2VzWzBdLCBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgIGlmIChjbXBSYW5nZShwcmV2LCBjdXIpID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VzLnNsaWNlKCkuc29ydChjbXBSYW5nZSk7XG4gICAgICAgICAgICBwcmV2ID0gY3VyO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblJhbmdlU2V0LmVtcHR5Lm5leHRMYXllciA9IFJhbmdlU2V0LmVtcHR5O1xuLyoqXG5BIHJhbmdlIHNldCBidWlsZGVyIGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyBidWlsZCB1cCBhXG5bcmFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0KSBkaXJlY3RseSwgd2l0aG91dCBmaXJzdCBhbGxvY2F0aW5nXG5hbiBhcnJheSBvZiBbYFJhbmdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSkgb2JqZWN0cy5cbiovXG5jbGFzcyBSYW5nZVNldEJ1aWxkZXIge1xuICAgIGZpbmlzaENodW5rKG5ld0FycmF5cykge1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBDaHVuayh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMudmFsdWUsIHRoaXMubWF4UG9pbnQpKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKHRoaXMuY2h1bmtTdGFydCk7XG4gICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5zZXRNYXhQb2ludCwgdGhpcy5tYXhQb2ludCk7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSAtMTtcbiAgICAgICAgaWYgKG5ld0FycmF5cykge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gW107XG4gICAgICAgICAgICB0aGlzLnRvID0gW107XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGVtcHR5IGJ1aWxkZXIuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0RnJvbSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmZyb20gPSBbXTtcbiAgICAgICAgdGhpcy50byA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSAtMTtcbiAgICAgICAgdGhpcy5zZXRNYXhQb2ludCA9IC0xO1xuICAgICAgICB0aGlzLm5leHRMYXllciA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIHJhbmdlLiBSYW5nZXMgc2hvdWxkIGJlIGFkZGVkIGluIHNvcnRlZCAoYnkgYGZyb21gIGFuZFxuICAgIGB2YWx1ZS5zdGFydFNpZGVgKSBvcmRlci5cbiAgICAqL1xuICAgIGFkZChmcm9tLCB0bywgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFkZElubmVyKGZyb20sIHRvLCB2YWx1ZSkpXG4gICAgICAgICAgICAodGhpcy5uZXh0TGF5ZXIgfHwgKHRoaXMubmV4dExheWVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcikpLmFkZChmcm9tLCB0bywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZElubmVyKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICBsZXQgZGlmZiA9IGZyb20gLSB0aGlzLmxhc3RUbyB8fCB2YWx1ZS5zdGFydFNpZGUgLSB0aGlzLmxhc3QuZW5kU2lkZTtcbiAgICAgICAgaWYgKGRpZmYgPD0gMCAmJiAoZnJvbSAtIHRoaXMubGFzdEZyb20gfHwgdmFsdWUuc3RhcnRTaWRlIC0gdGhpcy5sYXN0LnN0YXJ0U2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2VzIG11c3QgYmUgYWRkZWQgc29ydGVkIGJ5IGBmcm9tYCBwb3NpdGlvbiBhbmQgYHN0YXJ0U2lkZWBcIik7XG4gICAgICAgIGlmIChkaWZmIDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGggPT0gMjUwIC8qIEMuQ2h1bmtTaXplICovKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuayh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSBmcm9tO1xuICAgICAgICB0aGlzLmZyb20ucHVzaChmcm9tIC0gdGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy50by5wdXNoKHRvIC0gdGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy5sYXN0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGFzdEZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IHRvO1xuICAgICAgICB0aGlzLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICBpZiAodmFsdWUucG9pbnQpXG4gICAgICAgICAgICB0aGlzLm1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5tYXhQb2ludCwgdG8gLSBmcm9tKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYWRkQ2h1bmsoZnJvbSwgY2h1bmspIHtcbiAgICAgICAgaWYgKChmcm9tIC0gdGhpcy5sYXN0VG8gfHwgY2h1bmsudmFsdWVbMF0uc3RhcnRTaWRlIC0gdGhpcy5sYXN0LmVuZFNpZGUpIDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKHRydWUpO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5zZXRNYXhQb2ludCwgY2h1bmsubWF4UG9pbnQpO1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKGZyb20pO1xuICAgICAgICBsZXQgbGFzdCA9IGNodW5rLnZhbHVlLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMubGFzdCA9IGNodW5rLnZhbHVlW2xhc3RdO1xuICAgICAgICB0aGlzLmxhc3RGcm9tID0gY2h1bmsuZnJvbVtsYXN0XSArIGZyb207XG4gICAgICAgIHRoaXMubGFzdFRvID0gY2h1bmsudG9bbGFzdF0gKyBmcm9tO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluaXNoIHRoZSByYW5nZSBzZXQuIFJldHVybnMgdGhlIG5ldyBzZXQuIFRoZSBidWlsZGVyIGNhbid0IGJlXG4gICAgdXNlZCBhbnltb3JlIGFmdGVyIHRoaXMgaGFzIGJlZW4gY2FsbGVkLlxuICAgICovXG4gICAgZmluaXNoKCkgeyByZXR1cm4gdGhpcy5maW5pc2hJbm5lcihSYW5nZVNldC5lbXB0eSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmlzaElubmVyKG5leHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBSYW5nZVNldC5jcmVhdGUodGhpcy5jaHVua1BvcywgdGhpcy5jaHVua3MsIHRoaXMubmV4dExheWVyID8gdGhpcy5uZXh0TGF5ZXIuZmluaXNoSW5uZXIobmV4dCkgOiBuZXh0LCB0aGlzLnNldE1heFBvaW50KTtcbiAgICAgICAgdGhpcy5mcm9tID0gbnVsbDsgLy8gTWFrZSBzdXJlIGZ1cnRoZXIgYGFkZGAgY2FsbHMgcHJvZHVjZSBlcnJvcnNcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIsIHRleHREaWZmKSB7XG4gICAgbGV0IGluQSA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGxldCBzZXQgb2YgYSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2h1bmsubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoc2V0LmNodW5rW2ldLm1heFBvaW50IDw9IDApXG4gICAgICAgICAgICAgICAgaW5BLnNldChzZXQuY2h1bmtbaV0sIHNldC5jaHVua1Bvc1tpXSk7XG4gICAgbGV0IHNoYXJlZCA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBzZXQgb2YgYilcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBrbm93biA9IGluQS5nZXQoc2V0LmNodW5rW2ldKTtcbiAgICAgICAgICAgIGlmIChrbm93biAhPSBudWxsICYmICh0ZXh0RGlmZiA/IHRleHREaWZmLm1hcFBvcyhrbm93bikgOiBrbm93bikgPT0gc2V0LmNodW5rUG9zW2ldICYmXG4gICAgICAgICAgICAgICAgISh0ZXh0RGlmZiA9PT0gbnVsbCB8fCB0ZXh0RGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dERpZmYudG91Y2hlc1JhbmdlKGtub3duLCBrbm93biArIHNldC5jaHVua1tpXS5sZW5ndGgpKSlcbiAgICAgICAgICAgICAgICBzaGFyZWQuYWRkKHNldC5jaHVua1tpXSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gc2hhcmVkO1xufVxuY2xhc3MgTGF5ZXJDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGxheWVyLCBza2lwLCBtaW5Qb2ludCwgcmFuayA9IDApIHtcbiAgICAgICAgdGhpcy5sYXllciA9IGxheWVyO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLm1pblBvaW50ID0gbWluUG9pbnQ7XG4gICAgICAgIHRoaXMucmFuayA9IHJhbms7XG4gICAgfVxuICAgIGdldCBzdGFydFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5zdGFydFNpZGUgOiAwOyB9XG4gICAgZ2V0IGVuZFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5lbmRTaWRlIDogMDsgfVxuICAgIGdvdG8ocG9zLCBzaWRlID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8pIHtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4ID0gdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5nb3RvSW5uZXIocG9zLCBzaWRlLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnb3RvSW5uZXIocG9zLCBzaWRlLCBmb3J3YXJkKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF07XG4gICAgICAgICAgICBpZiAoISh0aGlzLnNraXAgJiYgdGhpcy5za2lwLmhhcyhuZXh0KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubGF5ZXIuY2h1bmtFbmQodGhpcy5jaHVua0luZGV4KSA8IHBvcyB8fFxuICAgICAgICAgICAgICAgIG5leHQubWF4UG9pbnQgPCB0aGlzLm1pblBvaW50KSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgZm9yd2FyZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJhbmdlSW5kZXggPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF0uZmluZEluZGV4KHBvcyAtIHRoaXMubGF5ZXIuY2h1bmtQb3NbdGhpcy5jaHVua0luZGV4XSwgc2lkZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWZvcndhcmQgfHwgdGhpcy5yYW5nZUluZGV4IDwgcmFuZ2VJbmRleClcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlSW5kZXgocmFuZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIGZvcndhcmQocG9zLCBzaWRlKSB7XG4gICAgICAgIGlmICgodGhpcy50byAtIHBvcyB8fCB0aGlzLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLmdvdG9Jbm5lcihwb3MsIHNpZGUsIHRydWUpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaHVua0luZGV4ID09IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY2h1bmtQb3MgPSB0aGlzLmxheWVyLmNodW5rUG9zW3RoaXMuY2h1bmtJbmRleF0sIGNodW5rID0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gY2h1bmtQb3MgKyBjaHVuay5mcm9tW3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gY2h1bmtQb3MgKyBjaHVuay50b1t0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjaHVuay52YWx1ZVt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VJbmRleCh0aGlzLnJhbmdlSW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5Qb2ludCA8IDAgfHwgdGhpcy52YWx1ZS5wb2ludCAmJiB0aGlzLnRvIC0gdGhpcy5mcm9tID49IHRoaXMubWluUG9pbnQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldFJhbmdlSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2tpcCkge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCAmJiB0aGlzLnNraXAuaGFzKHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIG5leHRDaHVuaygpIHtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20gLSBvdGhlci5mcm9tIHx8IHRoaXMuc3RhcnRTaWRlIC0gb3RoZXIuc3RhcnRTaWRlIHx8IHRoaXMucmFuayAtIG90aGVyLnJhbmsgfHxcbiAgICAgICAgICAgIHRoaXMudG8gLSBvdGhlci50byB8fCB0aGlzLmVuZFNpZGUgLSBvdGhlci5lbmRTaWRlO1xuICAgIH1cbn1cbmNsYXNzIEhlYXBDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGhlYXApIHtcbiAgICAgICAgdGhpcy5oZWFwID0gaGVhcDtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2V0cywgc2tpcCA9IG51bGwsIG1pblBvaW50ID0gLTEpIHtcbiAgICAgICAgbGV0IGhlYXAgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjdXIgPSBzZXRzW2ldOyAhY3VyLmlzRW1wdHk7IGN1ciA9IGN1ci5uZXh0TGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VyLm1heFBvaW50ID49IG1pblBvaW50KVxuICAgICAgICAgICAgICAgICAgICBoZWFwLnB1c2gobmV3IExheWVyQ3Vyc29yKGN1ciwgc2tpcCwgbWluUG9pbnQsIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhcC5sZW5ndGggPT0gMSA/IGhlYXBbMF0gOiBuZXcgSGVhcEN1cnNvcihoZWFwKTtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0U2lkZSgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLnN0YXJ0U2lkZSA6IDA7IH1cbiAgICBnb3RvKHBvcywgc2lkZSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovKSB7XG4gICAgICAgIGZvciAobGV0IGN1ciBvZiB0aGlzLmhlYXApXG4gICAgICAgICAgICBjdXIuZ290byhwb3MsIHNpZGUpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5oZWFwLmxlbmd0aCA+PiAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCBpKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmb3J3YXJkKHBvcywgc2lkZSkge1xuICAgICAgICBmb3IgKGxldCBjdXIgb2YgdGhpcy5oZWFwKVxuICAgICAgICAgICAgY3VyLmZvcndhcmQocG9zLCBzaWRlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaGVhcC5sZW5ndGggPj4gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBoZWFwQnViYmxlKHRoaXMuaGVhcCwgaSk7XG4gICAgICAgIGlmICgodGhpcy50byAtIHBvcyB8fCB0aGlzLnZhbHVlLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVhcC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucmFuayA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuaGVhcFswXTtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRvcC5mcm9tO1xuICAgICAgICAgICAgdGhpcy50byA9IHRvcC50bztcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0b3AudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJhbmsgPSB0b3AucmFuaztcbiAgICAgICAgICAgIGlmICh0b3AudmFsdWUpXG4gICAgICAgICAgICAgICAgdG9wLm5leHQoKTtcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGhlYXBCdWJibGUoaGVhcCwgaW5kZXgpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBoZWFwW2luZGV4XTs7KSB7XG4gICAgICAgIGxldCBjaGlsZEluZGV4ID0gKGluZGV4IDw8IDEpICsgMTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggPj0gaGVhcC5sZW5ndGgpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGNoaWxkID0gaGVhcFtjaGlsZEluZGV4XTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggKyAxIDwgaGVhcC5sZW5ndGggJiYgY2hpbGQuY29tcGFyZShoZWFwW2NoaWxkSW5kZXggKyAxXSkgPj0gMCkge1xuICAgICAgICAgICAgY2hpbGQgPSBoZWFwW2NoaWxkSW5kZXggKyAxXTtcbiAgICAgICAgICAgIGNoaWxkSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyLmNvbXBhcmUoY2hpbGQpIDwgMClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBoZWFwW2NoaWxkSW5kZXhdID0gY3VyO1xuICAgICAgICBoZWFwW2luZGV4XSA9IGNoaWxkO1xuICAgICAgICBpbmRleCA9IGNoaWxkSW5kZXg7XG4gICAgfVxufVxuY2xhc3MgU3BhbkN1cnNvciB7XG4gICAgY29uc3RydWN0b3Ioc2V0cywgc2tpcCwgbWluUG9pbnQpIHtcbiAgICAgICAgdGhpcy5taW5Qb2ludCA9IG1pblBvaW50O1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZVRvID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlUmFuayA9IFtdO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IC0xO1xuICAgICAgICAvLyBBIGN1cnJlbnRseSBhY3RpdmUgcG9pbnQgcmFuZ2UsIGlmIGFueVxuICAgICAgICB0aGlzLnBvaW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2ludEZyb20gPSAwO1xuICAgICAgICB0aGlzLnBvaW50UmFuayA9IDA7XG4gICAgICAgIHRoaXMudG8gPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgdGhpcy5lbmRTaWRlID0gMDtcbiAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBvcGVuIGFjdGl2ZSByYW5nZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgLy8gTm90IGluY2x1ZGluZyBwb2ludHMuXG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gSGVhcEN1cnNvci5mcm9tKHNldHMsIHNraXAsIG1pblBvaW50KTtcbiAgICB9XG4gICAgZ290byhwb3MsIHNpZGUgPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLykge1xuICAgICAgICB0aGlzLmN1cnNvci5nb3RvKHBvcywgc2lkZSk7XG4gICAgICAgIHRoaXMuYWN0aXZlLmxlbmd0aCA9IHRoaXMuYWN0aXZlVG8ubGVuZ3RoID0gdGhpcy5hY3RpdmVSYW5rLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gLTE7XG4gICAgICAgIHRoaXMudG8gPSBwb3M7XG4gICAgICAgIHRoaXMuZW5kU2lkZSA9IHNpZGU7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZm9yd2FyZChwb3MsIHNpZGUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMubWluQWN0aXZlID4gLTEgJiYgKHRoaXMuYWN0aXZlVG9bdGhpcy5taW5BY3RpdmVdIC0gcG9zIHx8IHRoaXMuYWN0aXZlW3RoaXMubWluQWN0aXZlXS5lbmRTaWRlIC0gc2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVBY3RpdmUodGhpcy5taW5BY3RpdmUpO1xuICAgICAgICB0aGlzLmN1cnNvci5mb3J3YXJkKHBvcywgc2lkZSk7XG4gICAgfVxuICAgIHJlbW92ZUFjdGl2ZShpbmRleCkge1xuICAgICAgICByZW1vdmUodGhpcy5hY3RpdmUsIGluZGV4KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlVG8sIGluZGV4KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlUmFuaywgaW5kZXgpO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IGZpbmRNaW5JbmRleCh0aGlzLmFjdGl2ZSwgdGhpcy5hY3RpdmVUbyk7XG4gICAgfVxuICAgIGFkZEFjdGl2ZSh0cmFja09wZW4pIHtcbiAgICAgICAgbGV0IGkgPSAwLCB7IHZhbHVlLCB0bywgcmFuayB9ID0gdGhpcy5jdXJzb3I7XG4gICAgICAgIC8vIE9yZ2FuaXplIGFjdGl2ZSBtYXJrcyBieSByYW5rIGZpcnN0LCB0aGVuIGJ5IHNpemVcbiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLmFjdGl2ZVJhbmsubGVuZ3RoICYmIChyYW5rIC0gdGhpcy5hY3RpdmVSYW5rW2ldIHx8IHRvIC0gdGhpcy5hY3RpdmVUb1tpXSkgPiAwKVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICBpbnNlcnQodGhpcy5hY3RpdmUsIGksIHZhbHVlKTtcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlVG8sIGksIHRvKTtcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlUmFuaywgaSwgcmFuayk7XG4gICAgICAgIGlmICh0cmFja09wZW4pXG4gICAgICAgICAgICBpbnNlcnQodHJhY2tPcGVuLCBpLCB0aGlzLmN1cnNvci5mcm9tKTtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSBmaW5kTWluSW5kZXgodGhpcy5hY3RpdmUsIHRoaXMuYWN0aXZlVG8pO1xuICAgIH1cbiAgICAvLyBBZnRlciBjYWxsaW5nIHRoaXMsIGlmIGB0aGlzLnBvaW50YCAhPSBudWxsLCB0aGUgbmV4dCByYW5nZSBpcyBhXG4gICAgLy8gcG9pbnQuIE90aGVyd2lzZSwgaXQncyBhIHJlZ3VsYXIgcmFuZ2UsIGNvdmVyZWQgYnkgYHRoaXMuYWN0aXZlYC5cbiAgICBuZXh0KCkge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMudG8sIHdhc1BvaW50ID0gdGhpcy5wb2ludDtcbiAgICAgICAgdGhpcy5wb2ludCA9IG51bGw7XG4gICAgICAgIGxldCB0cmFja09wZW4gPSB0aGlzLm9wZW5TdGFydCA8IDAgPyBbXSA6IG51bGw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhID0gdGhpcy5taW5BY3RpdmU7XG4gICAgICAgICAgICBpZiAoYSA+IC0xICYmICh0aGlzLmFjdGl2ZVRvW2FdIC0gdGhpcy5jdXJzb3IuZnJvbSB8fCB0aGlzLmFjdGl2ZVthXS5lbmRTaWRlIC0gdGhpcy5jdXJzb3Iuc3RhcnRTaWRlKSA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVUb1thXSA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuYWN0aXZlVG9bYV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kU2lkZSA9IHRoaXMuYWN0aXZlW2FdLmVuZFNpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZShhKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tPcGVuKVxuICAgICAgICAgICAgICAgICAgICByZW1vdmUodHJhY2tPcGVuLCBhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmN1cnNvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmVuZFNpZGUgPSAxMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jdXJzb3IuZnJvbSA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5jdXJzb3IuZnJvbTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSB0aGlzLmN1cnNvci5zdGFydFNpZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFZhbCA9IHRoaXMuY3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghbmV4dFZhbC5wb2ludCkgeyAvLyBPcGVuaW5nIGEgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBY3RpdmUodHJhY2tPcGVuKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh3YXNQb2ludCAmJiB0aGlzLmN1cnNvci50byA9PSB0aGlzLnRvICYmIHRoaXMuY3Vyc29yLmZyb20gPCB0aGlzLmN1cnNvci50bykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYW55IG5vbi1lbXB0eSBwb2ludHMgdGhhdCBlbmQgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHByZXYgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gTmV3IHBvaW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnQgPSBuZXh0VmFsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50RnJvbSA9IHRoaXMuY3Vyc29yLmZyb207XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRSYW5rID0gdGhpcy5jdXJzb3IucmFuaztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuY3Vyc29yLnRvO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSBuZXh0VmFsLmVuZFNpZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3J3YXJkKHRoaXMudG8sIHRoaXMuZW5kU2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2tPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdHJhY2tPcGVuLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiB0cmFja09wZW5baV0gPCBmcm9tOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuU3RhcnQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhY3RpdmVGb3JQb2ludCh0bykge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgICAgICAgbGV0IGFjdGl2ZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJhbmtbaV0gPCB0aGlzLnBvaW50UmFuaylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRvW2ldID4gdG8gfHwgdGhpcy5hY3RpdmVUb1tpXSA9PSB0byAmJiB0aGlzLmFjdGl2ZVtpXS5lbmRTaWRlID49IHRoaXMucG9pbnQuZW5kU2lkZSlcbiAgICAgICAgICAgICAgICBhY3RpdmUucHVzaCh0aGlzLmFjdGl2ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5yZXZlcnNlKCk7XG4gICAgfVxuICAgIG9wZW5FbmQodG8pIHtcbiAgICAgICAgbGV0IG9wZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVUby5sZW5ndGggLSAxOyBpID49IDAgJiYgdGhpcy5hY3RpdmVUb1tpXSA+IHRvOyBpLS0pXG4gICAgICAgICAgICBvcGVuKys7XG4gICAgICAgIHJldHVybiBvcGVuO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgc3RhcnRBLCBiLCBzdGFydEIsIGxlbmd0aCwgY29tcGFyYXRvcikge1xuICAgIGEuZ290byhzdGFydEEpO1xuICAgIGIuZ290byhzdGFydEIpO1xuICAgIGxldCBlbmRCID0gc3RhcnRCICsgbGVuZ3RoO1xuICAgIGxldCBwb3MgPSBzdGFydEIsIGRQb3MgPSBzdGFydEIgLSBzdGFydEE7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgZGlmZiA9IChhLnRvICsgZFBvcykgLSBiLnRvIHx8IGEuZW5kU2lkZSAtIGIuZW5kU2lkZTtcbiAgICAgICAgbGV0IGVuZCA9IGRpZmYgPCAwID8gYS50byArIGRQb3MgOiBiLnRvLCBjbGlwRW5kID0gTWF0aC5taW4oZW5kLCBlbmRCKTtcbiAgICAgICAgaWYgKGEucG9pbnQgfHwgYi5wb2ludCkge1xuICAgICAgICAgICAgaWYgKCEoYS5wb2ludCAmJiBiLnBvaW50ICYmIChhLnBvaW50ID09IGIucG9pbnQgfHwgYS5wb2ludC5lcShiLnBvaW50KSkgJiZcbiAgICAgICAgICAgICAgICBzYW1lVmFsdWVzKGEuYWN0aXZlRm9yUG9pbnQoYS50byksIGIuYWN0aXZlRm9yUG9pbnQoYi50bykpKSlcbiAgICAgICAgICAgICAgICBjb21wYXJhdG9yLmNvbXBhcmVQb2ludChwb3MsIGNsaXBFbmQsIGEucG9pbnQsIGIucG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNsaXBFbmQgPiBwb3MgJiYgIXNhbWVWYWx1ZXMoYS5hY3RpdmUsIGIuYWN0aXZlKSlcbiAgICAgICAgICAgICAgICBjb21wYXJhdG9yLmNvbXBhcmVSYW5nZShwb3MsIGNsaXBFbmQsIGEuYWN0aXZlLCBiLmFjdGl2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA+IGVuZEIpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICBpZiAoZGlmZiA8PSAwKVxuICAgICAgICAgICAgYS5uZXh0KCk7XG4gICAgICAgIGlmIChkaWZmID49IDApXG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lVmFsdWVzKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChhW2ldICE9IGJbaV0gJiYgIWFbaV0uZXEoYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZW1vdmUoYXJyYXksIGluZGV4KSB7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4LCBlID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA8IGU7IGkrKylcbiAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtpICsgMV07XG4gICAgYXJyYXkucG9wKCk7XG59XG5mdW5jdGlvbiBpbnNlcnQoYXJyYXksIGluZGV4LCB2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IGluZGV4OyBpLS0pXG4gICAgICAgIGFycmF5W2kgKyAxXSA9IGFycmF5W2ldO1xuICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gZmluZE1pbkluZGV4KHZhbHVlLCBhcnJheSkge1xuICAgIGxldCBmb3VuZCA9IC0xLCBmb3VuZFBvcyA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKChhcnJheVtpXSAtIGZvdW5kUG9zIHx8IHZhbHVlW2ldLmVuZFNpZGUgLSB2YWx1ZVtmb3VuZF0uZW5kU2lkZSkgPCAwKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICBmb3VuZFBvcyA9IGFycmF5W2ldO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG4vKipcbkNvdW50IHRoZSBjb2x1bW4gcG9zaXRpb24gYXQgdGhlIGdpdmVuIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcsXG50YWtpbmcgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgYW5kIHRhYiBzaXplIGludG8gYWNjb3VudC5cbiovXG5mdW5jdGlvbiBjb3VudENvbHVtbihzdHJpbmcsIHRhYlNpemUsIHRvID0gc3RyaW5nLmxlbmd0aCkge1xuICAgIGxldCBuID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvOykge1xuICAgICAgICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSkge1xuICAgICAgICAgICAgbiArPSB0YWJTaXplIC0gKG4gJSB0YWJTaXplKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG4rKztcbiAgICAgICAgICAgIGkgPSBmaW5kQ2x1c3RlckJyZWFrKHN0cmluZywgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG4vKipcbkZpbmQgdGhlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBjb2x1bW4gcG9zaXRpb24gaW4gYVxuc3RyaW5nLCB0YWtpbmcgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgYW5kIHRhYiBzaXplIGludG8gYWNjb3VudC4gQnlcbmRlZmF1bHQsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIHJldHVybmVkIHdoZW4gaXQgaXMgdG9vIHNob3J0IHRvXG5yZWFjaCB0aGUgY29sdW1uLiBQYXNzIGBzdHJpY3RgIHRydWUgdG8gbWFrZSBpdCByZXR1cm4gLTEgaW4gdGhhdFxuc2l0dWF0aW9uLlxuKi9cbmZ1bmN0aW9uIGZpbmRDb2x1bW4oc3RyaW5nLCBjb2wsIHRhYlNpemUsIHN0cmljdCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gMDs7KSB7XG4gICAgICAgIGlmIChuID49IGNvbClcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICBpZiAoaSA9PSBzdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIG4gKz0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSA/IHRhYlNpemUgLSAobiAlIHRhYlNpemUpIDogMTtcbiAgICAgICAgaSA9IGZpbmRDbHVzdGVyQnJlYWsoc3RyaW5nLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmljdCA9PT0gdHJ1ZSA/IC0xIDogc3RyaW5nLmxlbmd0aDtcbn1cblxuZXhwb3J0IHsgQW5ub3RhdGlvbiwgQW5ub3RhdGlvblR5cGUsIENoYW5nZURlc2MsIENoYW5nZVNldCwgQ2hhckNhdGVnb3J5LCBDb21wYXJ0bWVudCwgRWRpdG9yU2VsZWN0aW9uLCBFZGl0b3JTdGF0ZSwgRmFjZXQsIExpbmUsIE1hcE1vZGUsIFByZWMsIFJhbmdlLCBSYW5nZVNldCwgUmFuZ2VTZXRCdWlsZGVyLCBSYW5nZVZhbHVlLCBTZWxlY3Rpb25SYW5nZSwgU3RhdGVFZmZlY3QsIFN0YXRlRWZmZWN0VHlwZSwgU3RhdGVGaWVsZCwgVGV4dCwgVHJhbnNhY3Rpb24sIGNvZGVQb2ludEF0LCBjb2RlUG9pbnRTaXplLCBjb21iaW5lQ29uZmlnLCBjb3VudENvbHVtbiwgZmluZENsdXN0ZXJCcmVhaywgZmluZENvbHVtbiwgZnJvbUNvZGVQb2ludCB9O1xuIiwgImNvbnN0IEMgPSBcIlxcdTAzN2NcIlxuY29uc3QgQ09VTlQgPSB0eXBlb2YgU3ltYm9sID09IFwidW5kZWZpbmVkXCIgPyBcIl9fXCIgKyBDIDogU3ltYm9sLmZvcihDKVxuY29uc3QgU0VUID0gdHlwZW9mIFN5bWJvbCA9PSBcInVuZGVmaW5lZFwiID8gXCJfX3N0eWxlU2V0XCIgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTgpIDogU3ltYm9sKFwic3R5bGVTZXRcIilcbmNvbnN0IHRvcCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge31cblxuLy8gOjogLSBTdHlsZSBtb2R1bGVzIGVuY2Fwc3VsYXRlIGEgc2V0IG9mIENTUyBydWxlcyBkZWZpbmVkIGZyb21cbi8vIEphdmFTY3JpcHQuIFRoZWlyIGRlZmluaXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBhIGdpdmVuIERPTVxuLy8gcm9vdCBhZnRlciBpdCBoYXMgYmVlbiBfbW91bnRlZF8gdGhlcmUgd2l0aCBgU3R5bGVNb2R1bGUubW91bnRgLlxuLy9cbi8vIFN0eWxlIG1vZHVsZXMgc2hvdWxkIGJlIGNyZWF0ZWQgb25jZSBhbmQgc3RvcmVkIHNvbWV3aGVyZSwgYXNcbi8vIG9wcG9zZWQgdG8gcmUtY3JlYXRpbmcgdGhlbSBldmVyeSB0aW1lIHlvdSBuZWVkIHRoZW0uIFRoZSBhbW91bnQgb2Zcbi8vIENTUyBydWxlcyBnZW5lcmF0ZWQgZm9yIGEgZ2l2ZW4gRE9NIHJvb3QgaXMgYm91bmRlZCBieSB0aGUgYW1vdW50XG4vLyBvZiBzdHlsZSBtb2R1bGVzIHRoYXQgd2VyZSB1c2VkLiBTbyB0byBhdm9pZCBsZWFraW5nIHJ1bGVzLCBkb24ndFxuLy8gY3JlYXRlIHRoZXNlIGR5bmFtaWNhbGx5LCBidXQgdHJlYXQgdGhlbSBhcyBvbmUtdGltZSBhbGxvY2F0aW9ucy5cbmV4cG9ydCBjbGFzcyBTdHlsZU1vZHVsZSB7XG4gIC8vIDo6IChPYmplY3Q8U3R5bGU+LCA/e2ZpbmlzaDogPyhzdHJpbmcpIFx1MjE5MiBzdHJpbmd9KVxuICAvLyBDcmVhdGUgYSBzdHlsZSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4gc3BlYy5cbiAgLy9cbiAgLy8gV2hlbiBgZmluaXNoYCBpcyBnaXZlbiwgaXQgaXMgY2FsbGVkIG9uIHJlZ3VsYXIgKG5vbi1gQGApXG4gIC8vIHNlbGVjdG9ycyAoYWZ0ZXIgYCZgIGV4cGFuc2lvbikgdG8gY29tcHV0ZSB0aGUgZmluYWwgc2VsZWN0b3IuXG4gIGNvbnN0cnVjdG9yKHNwZWMsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnJ1bGVzID0gW11cbiAgICBsZXQge2ZpbmlzaH0gPSBvcHRpb25zIHx8IHt9XG5cbiAgICBmdW5jdGlvbiBzcGxpdFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gL15ALy50ZXN0KHNlbGVjdG9yKSA/IFtzZWxlY3Rvcl0gOiBzZWxlY3Rvci5zcGxpdCgvLFxccyovKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbmRlcihzZWxlY3RvcnMsIHNwZWMsIHRhcmdldCwgaXNLZXlmcmFtZXMpIHtcbiAgICAgIGxldCBsb2NhbCA9IFtdLCBpc0F0ID0gL15AKFxcdyspXFxiLy5leGVjKHNlbGVjdG9yc1swXSksIGtleWZyYW1lcyA9IGlzQXQgJiYgaXNBdFsxXSA9PSBcImtleWZyYW1lc1wiXG4gICAgICBpZiAoaXNBdCAmJiBzcGVjID09IG51bGwpIHJldHVybiB0YXJnZXQucHVzaChzZWxlY3RvcnNbMF0gKyBcIjtcIilcbiAgICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgICAgICBsZXQgdmFsdWUgPSBzcGVjW3Byb3BdXG4gICAgICAgIGlmICgvJi8udGVzdChwcm9wKSkge1xuICAgICAgICAgIHJlbmRlcihwcm9wLnNwbGl0KC8sXFxzKi8pLm1hcChwYXJ0ID0+IHNlbGVjdG9ycy5tYXAoc2VsID0+IHBhcnQucmVwbGFjZSgvJi8sIHNlbCkpKS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKSxcbiAgICAgICAgICAgICAgICAgdmFsdWUsIHRhcmdldClcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmICghaXNBdCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSAoXCIgKyBwcm9wICsgXCIpIHNob3VsZCBiZSBhIHByaW1pdGl2ZSB2YWx1ZS5cIilcbiAgICAgICAgICByZW5kZXIoc3BsaXRTZWxlY3Rvcihwcm9wKSwgdmFsdWUsIGxvY2FsLCBrZXlmcmFtZXMpXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsLnB1c2gocHJvcC5yZXBsYWNlKC9fLiovLCBcIlwiKS5yZXBsYWNlKC9bQS1aXS9nLCBsID0+IFwiLVwiICsgbC50b0xvd2VyQ2FzZSgpKSArIFwiOiBcIiArIHZhbHVlICsgXCI7XCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb2NhbC5sZW5ndGggfHwga2V5ZnJhbWVzKSB7XG4gICAgICAgIHRhcmdldC5wdXNoKChmaW5pc2ggJiYgIWlzQXQgJiYgIWlzS2V5ZnJhbWVzID8gc2VsZWN0b3JzLm1hcChmaW5pc2gpIDogc2VsZWN0b3JzKS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgICAgICAgICBcIiB7XCIgKyBsb2NhbC5qb2luKFwiIFwiKSArIFwifVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykgcmVuZGVyKHNwbGl0U2VsZWN0b3IocHJvcCksIHNwZWNbcHJvcF0sIHRoaXMucnVsZXMpXG4gIH1cblxuICAvLyA6OiAoKSBcdTIxOTIgc3RyaW5nXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbW9kdWxlJ3MgQ1NTIHJ1bGVzLlxuICBnZXRSdWxlcygpIHsgcmV0dXJuIHRoaXMucnVsZXMuam9pbihcIlxcblwiKSB9XG5cbiAgLy8gOjogKCkgXHUyMTkyIHN0cmluZ1xuICAvLyBHZW5lcmF0ZSBhIG5ldyB1bmlxdWUgQ1NTIGNsYXNzIG5hbWUuXG4gIHN0YXRpYyBuZXdOYW1lKCkge1xuICAgIGxldCBpZCA9IHRvcFtDT1VOVF0gfHwgMVxuICAgIHRvcFtDT1VOVF0gPSBpZCArIDFcbiAgICByZXR1cm4gQyArIGlkLnRvU3RyaW5nKDM2KVxuICB9XG5cbiAgLy8gOjogKHVuaW9uPERvY3VtZW50LCBTaGFkb3dSb290PiwgdW5pb248W1N0eWxlTW9kdWxlXSwgU3R5bGVNb2R1bGU+LCA/e25vbmNlOiA/c3RyaW5nfSlcbiAgLy9cbiAgLy8gTW91bnQgdGhlIGdpdmVuIHNldCBvZiBtb2R1bGVzIGluIHRoZSBnaXZlbiBET00gcm9vdCwgd2hpY2ggZW5zdXJlc1xuICAvLyB0aGF0IHRoZSBDU1MgcnVsZXMgZGVmaW5lZCBieSB0aGUgbW9kdWxlIGFyZSBhdmFpbGFibGUgaW4gdGhhdFxuICAvLyBjb250ZXh0LlxuICAvL1xuICAvLyBSdWxlcyBhcmUgb25seSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgb25jZSBwZXIgcm9vdC5cbiAgLy9cbiAgLy8gUnVsZSBvcmRlciB3aWxsIGZvbGxvdyB0aGUgb3JkZXIgb2YgdGhlIG1vZHVsZXMsIHNvIHRoYXQgcnVsZXMgZnJvbVxuICAvLyBtb2R1bGVzIGxhdGVyIGluIHRoZSBhcnJheSB0YWtlIHByZWNlZGVuY2Ugb2YgdGhvc2UgZnJvbSBlYXJsaWVyXG4gIC8vIG1vZHVsZXMuIElmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIHJvb3RcbiAgLy8gaW4gYSB3YXkgdGhhdCBjaGFuZ2VzIHRoZSBvcmRlciBvZiBhbHJlYWR5IG1vdW50ZWQgbW9kdWxlcywgdGhlIG9sZFxuICAvLyBvcmRlciB3aWxsIGJlIGNoYW5nZWQuXG4gIC8vXG4gIC8vIElmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgbm9uY2UgaXMgcHJvdmlkZWQsIGl0IGlzIGFkZGVkIHRvXG4gIC8vIHRoZSBgPHN0eWxlPmAgdGFnIGdlbmVyYXRlZCBieSB0aGUgbGlicmFyeS5cbiAgc3RhdGljIG1vdW50KHJvb3QsIG1vZHVsZXMsIG9wdGlvbnMpIHtcbiAgICBsZXQgc2V0ID0gcm9vdFtTRVRdLCBub25jZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5ub25jZVxuICAgIGlmICghc2V0KSBzZXQgPSBuZXcgU3R5bGVTZXQocm9vdCwgbm9uY2UpXG4gICAgZWxzZSBpZiAobm9uY2UpIHNldC5zZXROb25jZShub25jZSlcbiAgICBzZXQubW91bnQoQXJyYXkuaXNBcnJheShtb2R1bGVzKSA/IG1vZHVsZXMgOiBbbW9kdWxlc10pXG4gIH1cbn1cblxubGV0IGFkb3B0ZWRTZXQgPSBuZXcgTWFwIC8vPERvY3VtZW50LCBTdHlsZVNldD5cblxuY2xhc3MgU3R5bGVTZXQge1xuICBjb25zdHJ1Y3Rvcihyb290LCBub25jZSkge1xuICAgIGxldCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnQgfHwgcm9vdCwgd2luID0gZG9jLmRlZmF1bHRWaWV3XG4gICAgaWYgKCFyb290LmhlYWQgJiYgcm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgJiYgd2luLkNTU1N0eWxlU2hlZXQpIHtcbiAgICAgIGxldCBhZG9wdGVkID0gYWRvcHRlZFNldC5nZXQoZG9jKVxuICAgICAgaWYgKGFkb3B0ZWQpIHtcbiAgICAgICAgcm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgPSBbYWRvcHRlZC5zaGVldCwgLi4ucm9vdC5hZG9wdGVkU3R5bGVTaGVldHNdXG4gICAgICAgIHJldHVybiByb290W1NFVF0gPSBhZG9wdGVkXG4gICAgICB9XG4gICAgICB0aGlzLnNoZWV0ID0gbmV3IHdpbi5DU1NTdHlsZVNoZWV0XG4gICAgICByb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFt0aGlzLnNoZWV0LCAuLi5yb290LmFkb3B0ZWRTdHlsZVNoZWV0c11cbiAgICAgIGFkb3B0ZWRTZXQuc2V0KGRvYywgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdHlsZVRhZyA9IGRvYy5jcmVhdGVFbGVtZW50KFwic3R5bGVcIilcbiAgICAgIGlmIChub25jZSkgdGhpcy5zdHlsZVRhZy5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSlcbiAgICAgIGxldCB0YXJnZXQgPSByb290LmhlYWQgfHwgcm9vdFxuICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZSh0aGlzLnN0eWxlVGFnLCB0YXJnZXQuZmlyc3RDaGlsZClcbiAgICB9XG4gICAgdGhpcy5tb2R1bGVzID0gW11cbiAgICByb290W1NFVF0gPSB0aGlzXG4gIH1cblxuICBtb3VudChtb2R1bGVzKSB7XG4gICAgbGV0IHNoZWV0ID0gdGhpcy5zaGVldFxuICAgIGxldCBwb3MgPSAwIC8qIEN1cnJlbnQgcnVsZSBvZmZzZXQgKi8sIGogPSAwIC8qIEluZGV4IGludG8gdGhpcy5tb2R1bGVzICovXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbW9kID0gbW9kdWxlc1tpXSwgaW5kZXggPSB0aGlzLm1vZHVsZXMuaW5kZXhPZihtb2QpXG4gICAgICBpZiAoaW5kZXggPCBqICYmIGluZGV4ID4gLTEpIHsgLy8gT3JkZXJpbmcgY29uZmxpY3RcbiAgICAgICAgdGhpcy5tb2R1bGVzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgai0tXG4gICAgICAgIGluZGV4ID0gLTFcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA9PSAtMSkge1xuICAgICAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKGorKywgMCwgbW9kKVxuICAgICAgICBpZiAoc2hlZXQpIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kLnJ1bGVzLmxlbmd0aDsgaysrKVxuICAgICAgICAgIHNoZWV0Lmluc2VydFJ1bGUobW9kLnJ1bGVzW2tdLCBwb3MrKylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChqIDwgaW5kZXgpIHBvcyArPSB0aGlzLm1vZHVsZXNbaisrXS5ydWxlcy5sZW5ndGhcbiAgICAgICAgcG9zICs9IG1vZC5ydWxlcy5sZW5ndGhcbiAgICAgICAgaisrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzaGVldCkge1xuICAgICAgbGV0IHRleHQgPSBcIlwiXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubW9kdWxlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGV4dCArPSB0aGlzLm1vZHVsZXNbaV0uZ2V0UnVsZXMoKSArIFwiXFxuXCJcbiAgICAgIHRoaXMuc3R5bGVUYWcudGV4dENvbnRlbnQgPSB0ZXh0XG4gICAgfVxuICB9XG5cbiAgc2V0Tm9uY2Uobm9uY2UpIHtcbiAgICBpZiAodGhpcy5zdHlsZVRhZyAmJiB0aGlzLnN0eWxlVGFnLmdldEF0dHJpYnV0ZShcIm5vbmNlXCIpICE9IG5vbmNlKVxuICAgICAgdGhpcy5zdHlsZVRhZy5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSlcbiAgfVxufVxuXG4vLyBTdHlsZTo6T2JqZWN0PHVuaW9uPFN0eWxlLHN0cmluZz4+XG4vL1xuLy8gQSBzdHlsZSBpcyBhbiBvYmplY3QgdGhhdCwgaW4gdGhlIHNpbXBsZSBjYXNlLCBtYXBzIENTUyBwcm9wZXJ0eVxuLy8gbmFtZXMgdG8gc3RyaW5ncyBob2xkaW5nIHRoZWlyIHZhbHVlcywgYXMgaW4gYHtjb2xvcjogXCJyZWRcIixcbi8vIGZvbnRXZWlnaHQ6IFwiYm9sZFwifWAuIFRoZSBwcm9wZXJ0eSBuYW1lcyBjYW4gYmUgZ2l2ZW4gaW5cbi8vIGNhbWVsLWNhc2VcdTIwMTR0aGUgbGlicmFyeSB3aWxsIGluc2VydCBhIGRhc2ggYmVmb3JlIGNhcGl0YWwgbGV0dGVyc1xuLy8gd2hlbiBjb252ZXJ0aW5nIHRoZW0gdG8gQ1NTLlxuLy9cbi8vIElmIHlvdSBpbmNsdWRlIGFuIHVuZGVyc2NvcmUgaW4gYSBwcm9wZXJ0eSBuYW1lLCBpdCBhbmQgZXZlcnl0aGluZ1xuLy8gYWZ0ZXIgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG91dHB1dCwgd2hpY2ggY2FuIGJlIHVzZWZ1bCB3aGVuXG4vLyBwcm92aWRpbmcgYSBwcm9wZXJ0eSBtdWx0aXBsZSB0aW1lcywgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuLy8gcmVhc29ucy5cbi8vXG4vLyBBIHByb3BlcnR5IGluIGEgc3R5bGUgb2JqZWN0IGNhbiBhbHNvIGJlIGEgc3ViLXNlbGVjdG9yLCB3aGljaFxuLy8gZXh0ZW5kcyB0aGUgY3VycmVudCBjb250ZXh0IHRvIGFkZCBhIHBzZXVkby1zZWxlY3RvciBvciBhIGNoaWxkXG4vLyBzZWxlY3Rvci4gU3VjaCBhIHByb3BlcnR5IHNob3VsZCBjb250YWluIGEgYCZgIGNoYXJhY3Rlciwgd2hpY2hcbi8vIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgc2VsZWN0b3IuIEZvciBleGFtcGxlIGB7XCImOmJlZm9yZVwiOlxuLy8ge2NvbnRlbnQ6ICdcImhpXCInfX1gLiBTdWItc2VsZWN0b3JzIGFuZCByZWd1bGFyIHByb3BlcnRpZXMgY2FuXG4vLyBmcmVlbHkgYmUgbWl4ZWQgaW4gYSBnaXZlbiBvYmplY3QuIEFueSBwcm9wZXJ0eSBjb250YWluaW5nIGEgYCZgIGlzXG4vLyBhc3N1bWVkIHRvIGJlIGEgc3ViLXNlbGVjdG9yLlxuLy9cbi8vIEZpbmFsbHksIGEgcHJvcGVydHkgY2FuIHNwZWNpZnkgYW4gQC1ibG9jayB0byBiZSB3cmFwcGVkIGFyb3VuZCB0aGVcbi8vIHN0eWxlcyBkZWZpbmVkIGluc2lkZSB0aGUgb2JqZWN0IHRoYXQncyB0aGUgcHJvcGVydHkncyB2YWx1ZS4gRm9yXG4vLyBleGFtcGxlIHRvIGNyZWF0ZSBhIG1lZGlhIHF1ZXJ5IHlvdSBjYW4gZG8gYHtcIkBtZWRpYSBzY3JlZW4gYW5kXG4vLyAobWluLXdpZHRoOiA0MDBweClcIjogey4uLn19YC5cbiIsICJleHBvcnQgdmFyIGJhc2UgPSB7XG4gIDg6IFwiQmFja3NwYWNlXCIsXG4gIDk6IFwiVGFiXCIsXG4gIDEwOiBcIkVudGVyXCIsXG4gIDEyOiBcIk51bUxvY2tcIixcbiAgMTM6IFwiRW50ZXJcIixcbiAgMTY6IFwiU2hpZnRcIixcbiAgMTc6IFwiQ29udHJvbFwiLFxuICAxODogXCJBbHRcIixcbiAgMjA6IFwiQ2Fwc0xvY2tcIixcbiAgMjc6IFwiRXNjYXBlXCIsXG4gIDMyOiBcIiBcIixcbiAgMzM6IFwiUGFnZVVwXCIsXG4gIDM0OiBcIlBhZ2VEb3duXCIsXG4gIDM1OiBcIkVuZFwiLFxuICAzNjogXCJIb21lXCIsXG4gIDM3OiBcIkFycm93TGVmdFwiLFxuICAzODogXCJBcnJvd1VwXCIsXG4gIDM5OiBcIkFycm93UmlnaHRcIixcbiAgNDA6IFwiQXJyb3dEb3duXCIsXG4gIDQ0OiBcIlByaW50U2NyZWVuXCIsXG4gIDQ1OiBcIkluc2VydFwiLFxuICA0NjogXCJEZWxldGVcIixcbiAgNTk6IFwiO1wiLFxuICA2MTogXCI9XCIsXG4gIDkxOiBcIk1ldGFcIixcbiAgOTI6IFwiTWV0YVwiLFxuICAxMDY6IFwiKlwiLFxuICAxMDc6IFwiK1wiLFxuICAxMDg6IFwiLFwiLFxuICAxMDk6IFwiLVwiLFxuICAxMTA6IFwiLlwiLFxuICAxMTE6IFwiL1wiLFxuICAxNDQ6IFwiTnVtTG9ja1wiLFxuICAxNDU6IFwiU2Nyb2xsTG9ja1wiLFxuICAxNjA6IFwiU2hpZnRcIixcbiAgMTYxOiBcIlNoaWZ0XCIsXG4gIDE2MjogXCJDb250cm9sXCIsXG4gIDE2MzogXCJDb250cm9sXCIsXG4gIDE2NDogXCJBbHRcIixcbiAgMTY1OiBcIkFsdFwiLFxuICAxNzM6IFwiLVwiLFxuICAxODY6IFwiO1wiLFxuICAxODc6IFwiPVwiLFxuICAxODg6IFwiLFwiLFxuICAxODk6IFwiLVwiLFxuICAxOTA6IFwiLlwiLFxuICAxOTE6IFwiL1wiLFxuICAxOTI6IFwiYFwiLFxuICAyMTk6IFwiW1wiLFxuICAyMjA6IFwiXFxcXFwiLFxuICAyMjE6IFwiXVwiLFxuICAyMjI6IFwiJ1wiXG59XG5cbmV4cG9ydCB2YXIgc2hpZnQgPSB7XG4gIDQ4OiBcIilcIixcbiAgNDk6IFwiIVwiLFxuICA1MDogXCJAXCIsXG4gIDUxOiBcIiNcIixcbiAgNTI6IFwiJFwiLFxuICA1MzogXCIlXCIsXG4gIDU0OiBcIl5cIixcbiAgNTU6IFwiJlwiLFxuICA1NjogXCIqXCIsXG4gIDU3OiBcIihcIixcbiAgNTk6IFwiOlwiLFxuICA2MTogXCIrXCIsXG4gIDE3MzogXCJfXCIsXG4gIDE4NjogXCI6XCIsXG4gIDE4NzogXCIrXCIsXG4gIDE4ODogXCI8XCIsXG4gIDE4OTogXCJfXCIsXG4gIDE5MDogXCI+XCIsXG4gIDE5MTogXCI/XCIsXG4gIDE5MjogXCJ+XCIsXG4gIDIxOTogXCJ7XCIsXG4gIDIyMDogXCJ8XCIsXG4gIDIyMTogXCJ9XCIsXG4gIDIyMjogXCJcXFwiXCJcbn1cblxudmFyIG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSlcbnZhciBpZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTVNJRSBcXGR8VHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudClcblxuLy8gRmlsbCBpbiB0aGUgZGlnaXQga2V5c1xuZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSBiYXNlWzQ4ICsgaV0gPSBiYXNlWzk2ICsgaV0gPSBTdHJpbmcoaSlcblxuLy8gVGhlIGZ1bmN0aW9uIGtleXNcbmZvciAodmFyIGkgPSAxOyBpIDw9IDI0OyBpKyspIGJhc2VbaSArIDExMV0gPSBcIkZcIiArIGlcblxuLy8gQW5kIHRoZSBhbHBoYWJldGljIGtleXNcbmZvciAodmFyIGkgPSA2NTsgaSA8PSA5MDsgaSsrKSB7XG4gIGJhc2VbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgKyAzMilcbiAgc2hpZnRbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXG59XG5cbi8vIEZvciBlYWNoIGNvZGUgdGhhdCBkb2Vzbid0IGhhdmUgYSBzaGlmdC1lcXVpdmFsZW50LCBjb3B5IHRoZSBiYXNlIG5hbWVcbmZvciAodmFyIGNvZGUgaW4gYmFzZSkgaWYgKCFzaGlmdC5oYXNPd25Qcm9wZXJ0eShjb2RlKSkgc2hpZnRbY29kZV0gPSBiYXNlW2NvZGVdXG5cbmV4cG9ydCBmdW5jdGlvbiBrZXlOYW1lKGV2ZW50KSB7XG4gIC8vIE9uIG1hY09TLCBrZXlzIGhlbGQgd2l0aCBTaGlmdCBhbmQgQ21kIGRvbid0IHJlZmxlY3QgdGhlIGVmZmVjdCBvZiBTaGlmdCBpbiBgLmtleWAuXG4gIC8vIE9uIElFLCBzaGlmdCBlZmZlY3QgaXMgbmV2ZXIgaW5jbHVkZWQgaW4gYC5rZXlgLlxuICB2YXIgaWdub3JlS2V5ID0gbWFjICYmIGV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSB8fFxuICAgICAgaWUgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5ICYmIGV2ZW50LmtleS5sZW5ndGggPT0gMSB8fFxuICAgICAgZXZlbnQua2V5ID09IFwiVW5pZGVudGlmaWVkXCJcbiAgdmFyIG5hbWUgPSAoIWlnbm9yZUtleSAmJiBldmVudC5rZXkpIHx8XG4gICAgKGV2ZW50LnNoaWZ0S2V5ID8gc2hpZnQgOiBiYXNlKVtldmVudC5rZXlDb2RlXSB8fFxuICAgIGV2ZW50LmtleSB8fCBcIlVuaWRlbnRpZmllZFwiXG4gIC8vIEVkZ2Ugc29tZXRpbWVzIHByb2R1Y2VzIHdyb25nIG5hbWVzIChJc3N1ZSAjMylcbiAgaWYgKG5hbWUgPT0gXCJFc2NcIikgbmFtZSA9IFwiRXNjYXBlXCJcbiAgaWYgKG5hbWUgPT0gXCJEZWxcIikgbmFtZSA9IFwiRGVsZXRlXCJcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvODg2MDU3MS9cbiAgaWYgKG5hbWUgPT0gXCJMZWZ0XCIpIG5hbWUgPSBcIkFycm93TGVmdFwiXG4gIGlmIChuYW1lID09IFwiVXBcIikgbmFtZSA9IFwiQXJyb3dVcFwiXG4gIGlmIChuYW1lID09IFwiUmlnaHRcIikgbmFtZSA9IFwiQXJyb3dSaWdodFwiXG4gIGlmIChuYW1lID09IFwiRG93blwiKSBuYW1lID0gXCJBcnJvd0Rvd25cIlxuICByZXR1cm4gbmFtZVxufVxuIiwgImltcG9ydCB7IFRleHQsIFJhbmdlU2V0LCBNYXBNb2RlLCBSYW5nZVZhbHVlLCBmaW5kQ2x1c3RlckJyZWFrLCBFZGl0b3JTZWxlY3Rpb24sIEZhY2V0LCBTdGF0ZUVmZmVjdCwgQ2hhbmdlU2V0LCBmaW5kQ29sdW1uLCBDaGFyQ2F0ZWdvcnksIEFubm90YXRpb24sIEVkaXRvclN0YXRlLCBUcmFuc2FjdGlvbiwgUHJlYywgY29kZVBvaW50QXQsIGNvZGVQb2ludFNpemUsIGNvbWJpbmVDb25maWcsIFN0YXRlRmllbGQsIFJhbmdlU2V0QnVpbGRlciwgY291bnRDb2x1bW4gfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBTdHlsZU1vZHVsZSB9IGZyb20gJ3N0eWxlLW1vZCc7XG5pbXBvcnQgeyBrZXlOYW1lLCBiYXNlLCBzaGlmdCB9IGZyb20gJ3czYy1rZXluYW1lJztcblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKHJvb3QpIHtcbiAgICBsZXQgdGFyZ2V0O1xuICAgIC8vIEJyb3dzZXJzIGRpZmZlciBvbiB3aGV0aGVyIHNoYWRvdyByb290cyBoYXZlIGEgZ2V0U2VsZWN0aW9uXG4gICAgLy8gbWV0aG9kLiBJZiBpdCBleGlzdHMsIHVzZSB0aGF0LCBvdGhlcndpc2UsIGNhbGwgaXQgb24gdGhlXG4gICAgLy8gZG9jdW1lbnQuXG4gICAgaWYgKHJvb3Qubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgdGFyZ2V0ID0gcm9vdC5nZXRTZWxlY3Rpb24gPyByb290IDogcm9vdC5vd25lckRvY3VtZW50O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gcm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldC5nZXRTZWxlY3Rpb24oKTtcbn1cbmZ1bmN0aW9uIGNvbnRhaW5zKGRvbSwgbm9kZSkge1xuICAgIHJldHVybiBub2RlID8gZG9tID09IG5vZGUgfHwgZG9tLmNvbnRhaW5zKG5vZGUubm9kZVR5cGUgIT0gMSA/IG5vZGUucGFyZW50Tm9kZSA6IG5vZGUpIDogZmFsc2U7XG59XG5mdW5jdGlvbiBkZWVwQWN0aXZlRWxlbWVudChkb2MpIHtcbiAgICBsZXQgZWx0ID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgd2hpbGUgKGVsdCAmJiBlbHQuc2hhZG93Um9vdClcbiAgICAgICAgZWx0ID0gZWx0LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gZWx0O1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uKGRvbSwgc2VsZWN0aW9uKSB7XG4gICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZpcmVmb3ggd2lsbCByYWlzZSAncGVybWlzc2lvbiBkZW5pZWQnIGVycm9ycyB3aGVuIGFjY2Vzc2luZ1xuICAgICAgICAvLyBwcm9wZXJ0aWVzIG9mIGBzZWwuYW5jaG9yTm9kZWAgd2hlbiBpdCdzIGluIGEgZ2VuZXJhdGVkIENTU1xuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICByZXR1cm4gY29udGFpbnMoZG9tLCBzZWxlY3Rpb24uYW5jaG9yTm9kZSk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGllbnRSZWN0c0Zvcihkb20pIHtcbiAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgIHJldHVybiB0ZXh0UmFuZ2UoZG9tLCAwLCBkb20ubm9kZVZhbHVlLmxlbmd0aCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgcmV0dXJuIGRvbS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIFtdO1xufVxuLy8gU2NhbnMgZm9yd2FyZCBhbmQgYmFja3dhcmQgdGhyb3VnaCBET00gcG9zaXRpb25zIGVxdWl2YWxlbnQgdG8gdGhlXG4vLyBnaXZlbiBvbmUgdG8gc2VlIGlmIHRoZSB0d28gYXJlIGluIHRoZSBzYW1lIHBsYWNlIChpLmUuIGFmdGVyIGFcbi8vIHRleHQgbm9kZSB2cyBhdCB0aGUgZW5kIG9mIHRoYXQgdGV4dCBub2RlKVxuZnVuY3Rpb24gaXNFcXVpdmFsZW50UG9zaXRpb24obm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYpIHtcbiAgICByZXR1cm4gdGFyZ2V0Tm9kZSA/IChzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAtMSkgfHxcbiAgICAgICAgc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgMSkpIDogZmFsc2U7XG59XG5mdW5jdGlvbiBkb21JbmRleChub2RlKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOzsgaW5kZXgrKykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59XG5mdW5jdGlvbiBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCBkaXIpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IHRhcmdldE5vZGUgJiYgb2ZmID09IHRhcmdldE9mZilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob2ZmID09IChkaXIgPCAwID8gMCA6IG1heE9mZnNldChub2RlKSkpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IFwiRElWXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG9mZiA9IGRvbUluZGV4KG5vZGUpICsgKGRpciA8IDAgPyAwIDogMSk7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmYgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZGlyIDwgMCA/IG1heE9mZnNldChub2RlKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBtYXhPZmZzZXQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09IDMgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xufVxuZnVuY3Rpb24gZmxhdHRlblJlY3QocmVjdCwgbGVmdCkge1xuICAgIGxldCB4ID0gbGVmdCA/IHJlY3QubGVmdCA6IHJlY3QucmlnaHQ7XG4gICAgcmV0dXJuIHsgbGVmdDogeCwgcmlnaHQ6IHgsIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC5ib3R0b20gfTtcbn1cbmZ1bmN0aW9uIHdpbmRvd1JlY3Qod2luKSB7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IHdpbi5pbm5lcldpZHRoLFxuICAgICAgICB0b3A6IDAsIGJvdHRvbTogd2luLmlubmVySGVpZ2h0IH07XG59XG5mdW5jdGlvbiBnZXRTY2FsZShlbHQsIHJlY3QpIHtcbiAgICBsZXQgc2NhbGVYID0gcmVjdC53aWR0aCAvIGVsdC5vZmZzZXRXaWR0aDtcbiAgICBsZXQgc2NhbGVZID0gcmVjdC5oZWlnaHQgLyBlbHQub2Zmc2V0SGVpZ2h0O1xuICAgIGlmIChzY2FsZVggPiAwLjk5NSAmJiBzY2FsZVggPCAxLjAwNSB8fCAhaXNGaW5pdGUoc2NhbGVYKSB8fCBNYXRoLmFicyhyZWN0LndpZHRoIC0gZWx0Lm9mZnNldFdpZHRoKSA8IDEpXG4gICAgICAgIHNjYWxlWCA9IDE7XG4gICAgaWYgKHNjYWxlWSA+IDAuOTk1ICYmIHNjYWxlWSA8IDEuMDA1IHx8ICFpc0Zpbml0ZShzY2FsZVkpIHx8IE1hdGguYWJzKHJlY3QuaGVpZ2h0IC0gZWx0Lm9mZnNldEhlaWdodCkgPCAxKVxuICAgICAgICBzY2FsZVkgPSAxO1xuICAgIHJldHVybiB7IHNjYWxlWCwgc2NhbGVZIH07XG59XG5mdW5jdGlvbiBzY3JvbGxSZWN0SW50b1ZpZXcoZG9tLCByZWN0LCBzaWRlLCB4LCB5LCB4TWFyZ2luLCB5TWFyZ2luLCBsdHIpIHtcbiAgICBsZXQgZG9jID0gZG9tLm93bmVyRG9jdW1lbnQsIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgZm9yIChsZXQgY3VyID0gZG9tLCBzdG9wID0gZmFsc2U7IGN1ciAmJiAhc3RvcDspIHtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PSAxKSB7IC8vIEVsZW1lbnRcbiAgICAgICAgICAgIGxldCBib3VuZGluZywgdG9wID0gY3VyID09IGRvYy5ib2R5O1xuICAgICAgICAgICAgbGV0IHNjYWxlWCA9IDEsIHNjYWxlWSA9IDE7XG4gICAgICAgICAgICBpZiAodG9wKSB7XG4gICAgICAgICAgICAgICAgYm91bmRpbmcgPSB3aW5kb3dSZWN0KHdpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoL14oZml4ZWR8c3RpY2t5KSQvLnRlc3QoZ2V0Q29tcHV0ZWRTdHlsZShjdXIpLnBvc2l0aW9uKSlcbiAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGN1ci5zY3JvbGxIZWlnaHQgPD0gY3VyLmNsaWVudEhlaWdodCAmJiBjdXIuc2Nyb2xsV2lkdGggPD0gY3VyLmNsaWVudFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5hc3NpZ25lZFNsb3QgfHwgY3VyLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IGN1ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAoeyBzY2FsZVgsIHNjYWxlWSB9ID0gZ2V0U2NhbGUoY3VyLCByZWN0KSk7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHNjcm9sbGJhciB3aWR0aCBpc24ndCBpbmNsdWRlZCBpbiB0aGUgcmVjdGFuZ2xlXG4gICAgICAgICAgICAgICAgYm91bmRpbmcgPSB7IGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QubGVmdCArIGN1ci5jbGllbnRXaWR0aCAqIHNjYWxlWCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LnRvcCArIGN1ci5jbGllbnRIZWlnaHQgKiBzY2FsZVkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb3ZlWCA9IDAsIG1vdmVZID0gMDtcbiAgICAgICAgICAgIGlmICh5ID09IFwibmVhcmVzdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3QudG9wIDwgYm91bmRpbmcudG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVZID0gLShib3VuZGluZy50b3AgLSByZWN0LnRvcCArIHlNYXJnaW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA+IDAgJiYgcmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20gKyBtb3ZlWSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSBib3VuZGluZy5ib3R0b20gKyBtb3ZlWSArIHlNYXJnaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QuYm90dG9tID4gYm91bmRpbmcuYm90dG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSBib3VuZGluZy5ib3R0b20gKyB5TWFyZ2luO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA8IDAgJiYgKHJlY3QudG9wIC0gbW92ZVkpIDwgYm91bmRpbmcudG9wKVxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSAtKGJvdW5kaW5nLnRvcCArIG1vdmVZIC0gcmVjdC50b3AgKyB5TWFyZ2luKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVjdEhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3AsIGJvdW5kaW5nSGVpZ2h0ID0gYm91bmRpbmcuYm90dG9tIC0gYm91bmRpbmcudG9wO1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRUb3AgPSB5ID09IFwiY2VudGVyXCIgJiYgcmVjdEhlaWdodCA8PSBib3VuZGluZ0hlaWdodCA/IHJlY3QudG9wICsgcmVjdEhlaWdodCAvIDIgLSBib3VuZGluZ0hlaWdodCAvIDIgOlxuICAgICAgICAgICAgICAgICAgICB5ID09IFwic3RhcnRcIiB8fCB5ID09IFwiY2VudGVyXCIgJiYgc2lkZSA8IDAgPyByZWN0LnRvcCAtIHlNYXJnaW4gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gLSBib3VuZGluZ0hlaWdodCArIHlNYXJnaW47XG4gICAgICAgICAgICAgICAgbW92ZVkgPSB0YXJnZXRUb3AgLSBib3VuZGluZy50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeCA9PSBcIm5lYXJlc3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVYID0gLShib3VuZGluZy5sZWZ0IC0gcmVjdC5sZWZ0ICsgeE1hcmdpbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlID4gMCAmJiByZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQgKyBtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgbW92ZVggKyB4TWFyZ2luO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVggPSByZWN0LnJpZ2h0IC0gYm91bmRpbmcucmlnaHQgKyB4TWFyZ2luO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA8IDAgJiYgcmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCArIG1vdmVYKVxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVggPSAtKGJvdW5kaW5nLmxlZnQgKyBtb3ZlWCAtIHJlY3QubGVmdCArIHhNYXJnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRMZWZ0ID0geCA9PSBcImNlbnRlclwiID8gcmVjdC5sZWZ0ICsgKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpIC8gMiAtIChib3VuZGluZy5yaWdodCAtIGJvdW5kaW5nLmxlZnQpIC8gMiA6XG4gICAgICAgICAgICAgICAgICAgICh4ID09IFwic3RhcnRcIikgPT0gbHRyID8gcmVjdC5sZWZ0IC0geE1hcmdpbiA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0IC0gKGJvdW5kaW5nLnJpZ2h0IC0gYm91bmRpbmcubGVmdCkgKyB4TWFyZ2luO1xuICAgICAgICAgICAgICAgIG1vdmVYID0gdGFyZ2V0TGVmdCAtIGJvdW5kaW5nLmxlZnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW92ZVggfHwgbW92ZVkpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbi5zY3JvbGxCeShtb3ZlWCwgbW92ZVkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vdmVkWCA9IDAsIG1vdmVkWSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY3VyLnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5zY3JvbGxUb3AgKz0gbW92ZVkgLyBzY2FsZVk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlZFkgPSAoY3VyLnNjcm9sbFRvcCAtIHN0YXJ0KSAqIHNjYWxlWTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZVgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IGN1ci5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnNjcm9sbExlZnQgKz0gbW92ZVggLyBzY2FsZVg7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlZFggPSAoY3VyLnNjcm9sbExlZnQgLSBzdGFydCkgKiBzY2FsZVg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVjdCA9IHsgbGVmdDogcmVjdC5sZWZ0IC0gbW92ZWRYLCB0b3A6IHJlY3QudG9wIC0gbW92ZWRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJlY3QucmlnaHQgLSBtb3ZlZFgsIGJvdHRvbTogcmVjdC5ib3R0b20gLSBtb3ZlZFkgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkWCAmJiBNYXRoLmFicyhtb3ZlZFggLSBtb3ZlWCkgPCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFwibmVhcmVzdFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRZICYmIE1hdGguYWJzKG1vdmVkWSAtIG1vdmVZKSA8IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJuZWFyZXN0XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRvcClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGN1ciA9IGN1ci5hc3NpZ25lZFNsb3QgfHwgY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VyLm5vZGVUeXBlID09IDExKSB7IC8vIEEgc2hhZG93IHJvb3RcbiAgICAgICAgICAgIGN1ciA9IGN1ci5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzY3JvbGxhYmxlUGFyZW50KGRvbSkge1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBjdXIgPSBkb20ucGFyZW50Tm9kZTsgY3VyOykge1xuICAgICAgICBpZiAoY3VyID09IGRvYy5ib2R5KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgaWYgKGN1ci5zY3JvbGxIZWlnaHQgPiBjdXIuY2xpZW50SGVpZ2h0IHx8IGN1ci5zY3JvbGxXaWR0aCA+IGN1ci5jbGllbnRXaWR0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMTEpIHtcbiAgICAgICAgICAgIGN1ciA9IGN1ci5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5jbGFzcyBET01TZWxlY3Rpb25TdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZvY3VzT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZXEoZG9tU2VsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuY2hvck5vZGUgPT0gZG9tU2VsLmFuY2hvck5vZGUgJiYgdGhpcy5hbmNob3JPZmZzZXQgPT0gZG9tU2VsLmFuY2hvck9mZnNldCAmJlxuICAgICAgICAgICAgdGhpcy5mb2N1c05vZGUgPT0gZG9tU2VsLmZvY3VzTm9kZSAmJiB0aGlzLmZvY3VzT2Zmc2V0ID09IGRvbVNlbC5mb2N1c09mZnNldDtcbiAgICB9XG4gICAgc2V0UmFuZ2UocmFuZ2UpIHtcbiAgICAgICAgbGV0IHsgYW5jaG9yTm9kZSwgZm9jdXNOb2RlIH0gPSByYW5nZTtcbiAgICAgICAgLy8gQ2xpcCBvZmZzZXRzIHRvIG5vZGUgc2l6ZSB0byBhdm9pZCBjcmFzaGVzIHdoZW4gU2FmYXJpIHJlcG9ydHMgYm9ndXMgb2Zmc2V0cyAoIzExNTIpXG4gICAgICAgIHRoaXMuc2V0KGFuY2hvck5vZGUsIE1hdGgubWluKHJhbmdlLmFuY2hvck9mZnNldCwgYW5jaG9yTm9kZSA/IG1heE9mZnNldChhbmNob3JOb2RlKSA6IDApLCBmb2N1c05vZGUsIE1hdGgubWluKHJhbmdlLmZvY3VzT2Zmc2V0LCBmb2N1c05vZGUgPyBtYXhPZmZzZXQoZm9jdXNOb2RlKSA6IDApKTtcbiAgICB9XG4gICAgc2V0KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSBhbmNob3JOb2RlO1xuICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IGFuY2hvck9mZnNldDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBmb2N1c05vZGU7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSBmb2N1c09mZnNldDtcbiAgICB9XG59XG5sZXQgcHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IG51bGw7XG4vLyBGZWF0dXJlLWRldGVjdHMgc3VwcG9ydCBmb3IgLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiB0cnVlfSksIGFuZCB1c2VzXG4vLyBhIGZhbGxiYWNrIGtsdWRnZSB3aGVuIG5vdCBzdXBwb3J0ZWQuXG5mdW5jdGlvbiBmb2N1c1ByZXZlbnRTY3JvbGwoZG9tKSB7XG4gICAgaWYgKGRvbS5zZXRBY3RpdmUpXG4gICAgICAgIHJldHVybiBkb20uc2V0QWN0aXZlKCk7IC8vIGluIElFXG4gICAgaWYgKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQpXG4gICAgICAgIHJldHVybiBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCk7XG4gICAgbGV0IHN0YWNrID0gW107XG4gICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgIHN0YWNrLnB1c2goY3VyLCBjdXIuc2Nyb2xsVG9wLCBjdXIuc2Nyb2xsTGVmdCk7XG4gICAgICAgIGlmIChjdXIgPT0gY3VyLm93bmVyRG9jdW1lbnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZG9tLmZvY3VzKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPT0gbnVsbCA/IHtcbiAgICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQpO1xuICAgIGlmICghcHJldmVudFNjcm9sbFN1cHBvcnRlZCkge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGVsdCA9IHN0YWNrW2krK10sIHRvcCA9IHN0YWNrW2krK10sIGxlZnQgPSBzdGFja1tpKytdO1xuICAgICAgICAgICAgaWYgKGVsdC5zY3JvbGxUb3AgIT0gdG9wKVxuICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgICAgICBpZiAoZWx0LnNjcm9sbExlZnQgIT0gbGVmdClcbiAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5sZXQgc2NyYXRjaFJhbmdlO1xuZnVuY3Rpb24gdGV4dFJhbmdlKG5vZGUsIGZyb20sIHRvID0gZnJvbSkge1xuICAgIGxldCByYW5nZSA9IHNjcmF0Y2hSYW5nZSB8fCAoc2NyYXRjaFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSk7XG4gICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIHRvKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBmcm9tKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5mdW5jdGlvbiBkaXNwYXRjaEtleShlbHQsIG5hbWUsIGNvZGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHsga2V5OiBuYW1lLCBjb2RlOiBuYW1lLCBrZXlDb2RlOiBjb2RlLCB3aGljaDogY29kZSwgY2FuY2VsYWJsZTogdHJ1ZSB9O1xuICAgIGxldCBkb3duID0gbmV3IEtleWJvYXJkRXZlbnQoXCJrZXlkb3duXCIsIG9wdGlvbnMpO1xuICAgIGRvd24uc3ludGhldGljID0gdHJ1ZTtcbiAgICBlbHQuZGlzcGF0Y2hFdmVudChkb3duKTtcbiAgICBsZXQgdXAgPSBuZXcgS2V5Ym9hcmRFdmVudChcImtleXVwXCIsIG9wdGlvbnMpO1xuICAgIHVwLnN5bnRoZXRpYyA9IHRydWU7XG4gICAgZWx0LmRpc3BhdGNoRXZlbnQodXApO1xuICAgIHJldHVybiBkb3duLmRlZmF1bHRQcmV2ZW50ZWQgfHwgdXAuZGVmYXVsdFByZXZlbnRlZDtcbn1cbmZ1bmN0aW9uIGdldFJvb3Qobm9kZSkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlICYmIChub2RlLm5vZGVUeXBlID09IDkgfHwgbm9kZS5ub2RlVHlwZSA9PSAxMSAmJiBub2RlLmhvc3QpKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmFzc2lnbmVkU2xvdCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY2xlYXJBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICB3aGlsZSAobm9kZS5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGVOb2RlKG5vZGUuYXR0cmlidXRlc1swXSk7XG59XG5mdW5jdGlvbiBhdEVsZW1lbnRTdGFydChkb2MsIHNlbGVjdGlvbikge1xuICAgIGxldCBub2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuICAgIGlmICghbm9kZSB8fCBzZWxlY3Rpb24uYW5jaG9yTm9kZSAhPSBub2RlIHx8IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgIT0gb2Zmc2V0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gU2FmYXJpIGNhbiByZXBvcnQgYm9ndXMgb2Zmc2V0cyAoIzExNTIpXG4gICAgb2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCBtYXhPZmZzZXQobm9kZSkpO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG9mZnNldCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIGlmIChwcmV2LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcHJldjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBtYXhPZmZzZXQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZSA9PSBkb2MpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTY3JvbGxlZFRvQm90dG9tKGVsdCkge1xuICAgIHJldHVybiBlbHQuc2Nyb2xsVG9wID4gTWF0aC5tYXgoMSwgZWx0LnNjcm9sbEhlaWdodCAtIGVsdC5jbGllbnRIZWlnaHQgLSA0KTtcbn1cblxuY2xhc3MgRE9NUG9zIHtcbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBvZmZzZXQsIHByZWNpc2UgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLnByZWNpc2UgPSBwcmVjaXNlO1xuICAgIH1cbiAgICBzdGF0aWMgYmVmb3JlKGRvbSwgcHJlY2lzZSkgeyByZXR1cm4gbmV3IERPTVBvcyhkb20ucGFyZW50Tm9kZSwgZG9tSW5kZXgoZG9tKSwgcHJlY2lzZSk7IH1cbiAgICBzdGF0aWMgYWZ0ZXIoZG9tLCBwcmVjaXNlKSB7IHJldHVybiBuZXcgRE9NUG9zKGRvbS5wYXJlbnROb2RlLCBkb21JbmRleChkb20pICsgMSwgcHJlY2lzZSk7IH1cbn1cbmNvbnN0IG5vQ2hpbGRyZW4gPSBbXTtcbmNsYXNzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlRE9NVGV4dCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBnZXQgcG9zQXRTdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucG9zQmVmb3JlKHRoaXMpIDogMDtcbiAgICB9XG4gICAgZ2V0IHBvc0F0RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIHBvc0JlZm9yZSh2aWV3KSB7XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZCA9PSB2aWV3KVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICBwb3MgKz0gY2hpbGQubGVuZ3RoICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgY2hpbGQgaW4gcG9zQmVmb3JlXCIpO1xuICAgIH1cbiAgICBwb3NBZnRlcih2aWV3KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0JlZm9yZSh2aWV3KSArIHZpZXcubGVuZ3RoO1xuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdzICYgMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi8pIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmRvbTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbnVsbCwgbmV4dDtcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuZG9tICYmIChuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50VmlldyA9IENvbnRlbnRWaWV3LmdldChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudFZpZXcgfHwgIWNvbnRlbnRWaWV3LnBhcmVudCAmJiBjb250ZW50Vmlldy5jYW5SZXVzZURPTShjaGlsZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmV1c2VET00obmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2sgJiYgIXRyYWNrLndyaXR0ZW4gJiYgdHJhY2subm9kZSA9PSBwYXJlbnQgJiYgbmV4dCAhPSBjaGlsZC5kb20pXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrLndyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgJiYgbmV4dCAhPSBjaGlsZC5kb20pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcm0kMShuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQuZG9tLCBuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldiA9IGNoaWxkLmRvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgPSBwcmV2ID8gcHJldi5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKG5leHQgJiYgdHJhY2sgJiYgdHJhY2subm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICAgICAgdHJhY2sud3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICB3aGlsZSAobmV4dClcbiAgICAgICAgICAgICAgICBuZXh0ID0gcm0kMShuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXVzZURPTShfZG9tKSB7IH1cbiAgICBsb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBhZnRlcjtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgIGFmdGVyID0gdGhpcy5kb20uY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJpYXMgPSBtYXhPZmZzZXQobm9kZSkgPT0gMCA/IDAgOiBvZmZzZXQgPT0gMCA/IC0xIDogMTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChiaWFzID09IDAgJiYgcGFyZW50LmZpcnN0Q2hpbGQgIT0gcGFyZW50Lmxhc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYmlhcyA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmlhcyA8IDApXG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBub2RlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFmdGVyID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWZ0ZXIgPT0gdGhpcy5kb20uZmlyc3RDaGlsZClcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB3aGlsZSAoYWZ0ZXIgJiYgIUNvbnRlbnRWaWV3LmdldChhZnRlcikpXG4gICAgICAgICAgICBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICBpZiAoIWFmdGVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5kb20gPT0gYWZ0ZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZC5sZW5ndGggKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZChmcm9tLCB0bywgb2Zmc2V0ID0gMCkge1xuICAgICAgICBsZXQgZnJvbUkgPSAtMSwgZnJvbVN0YXJ0ID0gLTEsIHRvSSA9IC0xLCB0b0VuZCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gb2Zmc2V0LCBwcmV2RW5kID0gb2Zmc2V0OyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20gJiYgZW5kID4gdG8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmRvbUJvdW5kc0Fyb3VuZChmcm9tLCB0bywgcG9zKTtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gZnJvbSAmJiBmcm9tSSA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGZyb21JID0gaTtcbiAgICAgICAgICAgICAgICBmcm9tU3RhcnQgPSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID4gdG8gJiYgY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0b0kgPSBpO1xuICAgICAgICAgICAgICAgIHRvRW5kID0gcHJldkVuZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZFbmQgPSBlbmQ7XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZyb206IGZyb21TdGFydCwgdG86IHRvRW5kIDwgMCA/IG9mZnNldCArIHRoaXMubGVuZ3RoIDogdG9FbmQsXG4gICAgICAgICAgICBzdGFydERPTTogKGZyb21JID8gdGhpcy5jaGlsZHJlbltmcm9tSSAtIDFdLmRvbS5uZXh0U2libGluZyA6IG51bGwpIHx8IHRoaXMuZG9tLmZpcnN0Q2hpbGQsXG4gICAgICAgICAgICBlbmRET006IHRvSSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHRvSSA+PSAwID8gdGhpcy5jaGlsZHJlblt0b0ldLmRvbSA6IG51bGwgfTtcbiAgICB9XG4gICAgbWFya0RpcnR5KGFuZFBhcmVudCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgfD0gMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgICAgIHRoaXMubWFya1BhcmVudHNEaXJ0eShhbmRQYXJlbnQpO1xuICAgIH1cbiAgICBtYXJrUGFyZW50c0RpcnR5KGNoaWxkTGlzdCkge1xuICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudDsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRMaXN0KVxuICAgICAgICAgICAgICAgIHBhcmVudC5mbGFncyB8PSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgICAgIGlmIChwYXJlbnQuZmxhZ3MgJiAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcGFyZW50LmZsYWdzIHw9IDEgLyogVmlld0ZsYWcuQ2hpbGREaXJ0eSAqLztcbiAgICAgICAgICAgIGNoaWxkTGlzdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICE9IHBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICBpZiAodGhpcy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrUGFyZW50c0RpcnR5KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldERPTShkb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZG9tID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy5kb20uY21WaWV3ID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBkb207XG4gICAgICAgIGRvbS5jbVZpZXcgPSB0aGlzO1xuICAgIH1cbiAgICBnZXQgcm9vdFZpZXcoKSB7XG4gICAgICAgIGZvciAobGV0IHYgPSB0aGlzOzspIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB2LnBhcmVudDtcbiAgICAgICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgdiA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlQ2hpbGRyZW4oZnJvbSwgdG8sIGNoaWxkcmVuID0gbm9DaGlsZHJlbikge1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ID09IHRoaXMgJiYgY2hpbGRyZW4uaW5kZXhPZihjaGlsZCkgPCAwKVxuICAgICAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShmcm9tLCB0byAtIGZyb20sIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldLnNldFBhcmVudCh0aGlzKTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oX3JlYykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZ25vcmVFdmVudChfZXZlbnQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY2hpbGRDdXJzb3IocG9zID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGlsZEN1cnNvcih0aGlzLmNoaWxkcmVuLCBwb3MsIHRoaXMuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgY2hpbGRQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZEN1cnNvcigpLmZpbmRQb3MocG9zLCBiaWFzKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLnJlcGxhY2UoXCJWaWV3XCIsIFwiXCIpO1xuICAgICAgICByZXR1cm4gbmFtZSArICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA/IFwiKFwiICsgdGhpcy5jaGlsZHJlbi5qb2luKCkgKyBcIilcIiA6XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA/IFwiW1wiICsgKG5hbWUgPT0gXCJUZXh0XCIgPyB0aGlzLnRleHQgOiB0aGlzLmxlbmd0aCkgKyBcIl1cIiA6IFwiXCIpICtcbiAgICAgICAgICAgICh0aGlzLmJyZWFrQWZ0ZXIgPyBcIiNcIiA6IFwiXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0KG5vZGUpIHsgcmV0dXJuIG5vZGUuY21WaWV3OyB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGlzV2lkZ2V0KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBiZWNvbWUob3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY2FuUmV1c2VET00ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLmNvbnN0cnVjdG9yID09IHRoaXMuY29uc3RydWN0b3IgJiYgISgodGhpcy5mbGFncyB8IG90aGVyLmZsYWdzKSAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoaXMgaXMgYSB6ZXJvLWxlbmd0aCB2aWV3IHdpdGggYSBzaWRlLCB0aGlzIHNob3VsZCByZXR1cm4gYVxuICAgIC8vIG51bWJlciA8PSAwIHRvIGluZGljYXRlIGl0IGlzIGJlZm9yZSBpdHMgcG9zaXRpb24sIG9yIGFcbiAgICAvLyBudW1iZXIgPiAwIHdoZW4gYWZ0ZXIgaXRzIHBvc2l0aW9uLlxuICAgIGdldFNpZGUoKSB7IHJldHVybiAwOyB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIGlmIChjaGlsZC5wYXJlbnQgPT0gdGhpcylcbiAgICAgICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB9XG59XG5Db250ZW50Vmlldy5wcm90b3R5cGUuYnJlYWtBZnRlciA9IDA7XG4vLyBSZW1vdmUgYSBET00gbm9kZSBhbmQgcmV0dXJuIGl0cyBuZXh0IHNpYmxpbmcuXG5mdW5jdGlvbiBybSQxKGRvbSkge1xuICAgIGxldCBuZXh0ID0gZG9tLm5leHRTaWJsaW5nO1xuICAgIGRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5jbGFzcyBDaGlsZEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoY2hpbGRyZW4sIHBvcywgaSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmkgPSBpO1xuICAgICAgICB0aGlzLm9mZiA9IDA7XG4gICAgfVxuICAgIGZpbmRQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAocG9zID4gdGhpcy5wb3MgfHwgcG9zID09IHRoaXMucG9zICYmXG4gICAgICAgICAgICAgICAgKGJpYXMgPiAwIHx8IHRoaXMuaSA9PSAwIHx8IHRoaXMuY2hpbGRyZW5bdGhpcy5pIC0gMV0uYnJlYWtBZnRlcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZiA9IHBvcyAtIHRoaXMucG9zO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmNoaWxkcmVuWy0tdGhpcy5pXTtcbiAgICAgICAgICAgIHRoaXMucG9zIC09IG5leHQubGVuZ3RoICsgbmV4dC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcmVwbGFjZVJhbmdlKHBhcmVudCwgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGluc2VydCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICBsZXQgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuICAgIGxldCBiZWZvcmUgPSBjaGlsZHJlbi5sZW5ndGggPyBjaGlsZHJlbltmcm9tSV0gOiBudWxsO1xuICAgIGxldCBsYXN0ID0gaW5zZXJ0Lmxlbmd0aCA/IGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIGxldCBicmVha0F0RW5kID0gbGFzdCA/IGxhc3QuYnJlYWtBZnRlciA6IGJyZWFrQXRTdGFydDtcbiAgICAvLyBDaGFuZ2Ugd2l0aGluIGEgc2luZ2xlIGNoaWxkXG4gICAgaWYgKGZyb21JID09IHRvSSAmJiBiZWZvcmUgJiYgIWJyZWFrQXRTdGFydCAmJiAhYnJlYWtBdEVuZCAmJiBpbnNlcnQubGVuZ3RoIDwgMiAmJlxuICAgICAgICBiZWZvcmUubWVyZ2UoZnJvbU9mZiwgdG9PZmYsIGluc2VydC5sZW5ndGggPyBsYXN0IDogbnVsbCwgZnJvbU9mZiA9PSAwLCBvcGVuU3RhcnQsIG9wZW5FbmQpKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHRvSSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSBjaGlsZHJlblt0b0ldO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGVuZCBvZiB0aGUgY2hpbGQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyBwcmVzZXJ2ZWQgaW4gYGFmdGVyYFxuICAgICAgICBpZiAoYWZ0ZXIgJiYgKHRvT2ZmIDwgYWZ0ZXIubGVuZ3RoIHx8IGFmdGVyLmJyZWFrQWZ0ZXIgJiYgKGxhc3QgPT09IG51bGwgfHwgbGFzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGFzdC5icmVha0FmdGVyKSkpIHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHNwbGl0dGluZyBhIGNoaWxkLCBzZXBhcmF0ZSBwYXJ0IG9mIGl0IHRvIGF2b2lkIHRoYXRcbiAgICAgICAgICAgIC8vIGJlaW5nIG1hbmdsZWQgd2hlbiB1cGRhdGluZyB0aGUgY2hpbGQgYmVmb3JlIHRoZSB1cGRhdGUuXG4gICAgICAgICAgICBpZiAoZnJvbUkgPT0gdG9JKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5zcGxpdCh0b09mZik7XG4gICAgICAgICAgICAgICAgdG9PZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIHJlcGxhY2VtZW50IHNob3VsZCBiZSBtZXJnZWQgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgcmVwbGFjaW5nIGVsZW1lbnQsIHVwZGF0ZSBgY29udGVudGBcbiAgICAgICAgICAgIGlmICghYnJlYWtBdEVuZCAmJiBsYXN0ICYmIGFmdGVyLm1lcmdlKDAsIHRvT2ZmLCBsYXN0LCB0cnVlLCAwLCBvcGVuRW5kKSkge1xuICAgICAgICAgICAgICAgIGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0gPSBhZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3RhcnQgb2YgdGhlIGFmdGVyIGVsZW1lbnQsIGlmIG5lY2Vzc2FyeSwgYW5kXG4gICAgICAgICAgICAgICAgLy8gYWRkIGl0IHRvIGBjb250ZW50YC5cbiAgICAgICAgICAgICAgICBpZiAodG9PZmYgfHwgYWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoICYmICFhZnRlci5jaGlsZHJlblswXS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyLm1lcmdlKDAsIHRvT2ZmLCBudWxsLCBmYWxzZSwgMCwgb3BlbkVuZCk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0LnB1c2goYWZ0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFmdGVyID09PSBudWxsIHx8IGFmdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZnRlci5icmVha0FmdGVyKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBhdCBgdG9JYCBpcyBlbnRpcmVseSBjb3ZlcmVkIGJ5IHRoaXMgcmFuZ2UuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBpdHMgbGluZSBicmVhaywgaWYgYW55LlxuICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgbGFzdC5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBicmVha0F0U3RhcnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIHdlJ3ZlIGhhbmRsZWQgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBjdXJyZW50IGVsZW1lbnRzXG4gICAgICAgIC8vIG5vdywgbWFrZSBzdXJlIGB0b0lgIHBvaW50cyBhZnRlciB0aGF0LlxuICAgICAgICB0b0krKztcbiAgICB9XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBiZWZvcmUuYnJlYWtBZnRlciA9IGJyZWFrQXRTdGFydDtcbiAgICAgICAgaWYgKGZyb21PZmYgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWJyZWFrQXRTdGFydCAmJiBpbnNlcnQubGVuZ3RoICYmIGJlZm9yZS5tZXJnZShmcm9tT2ZmLCBiZWZvcmUubGVuZ3RoLCBpbnNlcnRbMF0sIGZhbHNlLCBvcGVuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLmJyZWFrQWZ0ZXIgPSBpbnNlcnQuc2hpZnQoKS5icmVha0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZnJvbU9mZiA8IGJlZm9yZS5sZW5ndGggfHwgYmVmb3JlLmNoaWxkcmVuLmxlbmd0aCAmJiBiZWZvcmUuY2hpbGRyZW5bYmVmb3JlLmNoaWxkcmVuLmxlbmd0aCAtIDFdLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLm1lcmdlKGZyb21PZmYsIGJlZm9yZS5sZW5ndGgsIG51bGwsIGZhbHNlLCBvcGVuU3RhcnQsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJvbUkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gbWVyZ2Ugd2lkZ2V0cyBvbiB0aGUgYm91bmRhcmllcyBvZiB0aGUgcmVwbGFjZW1lbnRcbiAgICB3aGlsZSAoZnJvbUkgPCB0b0kgJiYgaW5zZXJ0Lmxlbmd0aCkge1xuICAgICAgICBpZiAoY2hpbGRyZW5bdG9JIC0gMV0uYmVjb21lKGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICB0b0ktLTtcbiAgICAgICAgICAgIGluc2VydC5wb3AoKTtcbiAgICAgICAgICAgIG9wZW5FbmQgPSBpbnNlcnQubGVuZ3RoID8gMCA6IG9wZW5TdGFydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGlsZHJlbltmcm9tSV0uYmVjb21lKGluc2VydFswXSkpIHtcbiAgICAgICAgICAgIGZyb21JKys7XG4gICAgICAgICAgICBpbnNlcnQuc2hpZnQoKTtcbiAgICAgICAgICAgIG9wZW5TdGFydCA9IGluc2VydC5sZW5ndGggPyAwIDogb3BlbkVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaW5zZXJ0Lmxlbmd0aCAmJiBmcm9tSSAmJiB0b0kgPCBjaGlsZHJlbi5sZW5ndGggJiYgIWNoaWxkcmVuW2Zyb21JIC0gMV0uYnJlYWtBZnRlciAmJlxuICAgICAgICBjaGlsZHJlblt0b0ldLm1lcmdlKDAsIDAsIGNoaWxkcmVuW2Zyb21JIC0gMV0sIGZhbHNlLCBvcGVuU3RhcnQsIG9wZW5FbmQpKVxuICAgICAgICBmcm9tSS0tO1xuICAgIGlmIChmcm9tSSA8IHRvSSB8fCBpbnNlcnQubGVuZ3RoKVxuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkcmVuKGZyb21JLCB0b0ksIGluc2VydCk7XG59XG5mdW5jdGlvbiBtZXJnZUNoaWxkcmVuSW50byhwYXJlbnQsIGZyb20sIHRvLCBpbnNlcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGxldCBjdXIgPSBwYXJlbnQuY2hpbGRDdXJzb3IoKTtcbiAgICBsZXQgeyBpOiB0b0ksIG9mZjogdG9PZmYgfSA9IGN1ci5maW5kUG9zKHRvLCAxKTtcbiAgICBsZXQgeyBpOiBmcm9tSSwgb2ZmOiBmcm9tT2ZmIH0gPSBjdXIuZmluZFBvcyhmcm9tLCAtMSk7XG4gICAgbGV0IGRMZW4gPSBmcm9tIC0gdG87XG4gICAgZm9yIChsZXQgdmlldyBvZiBpbnNlcnQpXG4gICAgICAgIGRMZW4gKz0gdmlldy5sZW5ndGg7XG4gICAgcGFyZW50Lmxlbmd0aCArPSBkTGVuO1xuICAgIHJlcGxhY2VSYW5nZShwYXJlbnQsIGZyb21JLCBmcm9tT2ZmLCB0b0ksIHRvT2ZmLCBpbnNlcnQsIDAsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG59XG5cbmxldCBuYXYgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IgOiB7IHVzZXJBZ2VudDogXCJcIiwgdmVuZG9yOiBcIlwiLCBwbGF0Zm9ybTogXCJcIiB9O1xubGV0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiB7IGRvY3VtZW50RWxlbWVudDogeyBzdHlsZToge30gfSB9O1xuY29uc3QgaWVfZWRnZSA9IC8qQF9fUFVSRV9fKi8vRWRnZVxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IGllX3VwdG8xMCA9IC8qQF9fUFVSRV9fKi8vTVNJRSBcXGQvLnRlc3QobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBpZV8xMXVwID0gLypAX19QVVJFX18qLy9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IGllID0gISEoaWVfdXB0bzEwIHx8IGllXzExdXAgfHwgaWVfZWRnZSk7XG5jb25zdCBnZWNrbyA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL2dlY2tvXFwvKFxcZCspL2kudGVzdChuYXYudXNlckFnZW50KTtcbmNvbnN0IGNocm9tZSA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL0Nocm9tZVxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IHdlYmtpdCA9IFwid2Via2l0Rm9udFNtb290aGluZ1wiIGluIGRvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5jb25zdCBzYWZhcmkgPSAhaWUgJiYgLypAX19QVVJFX18qLy9BcHBsZSBDb21wdXRlci8udGVzdChuYXYudmVuZG9yKTtcbmNvbnN0IGlvcyA9IHNhZmFyaSAmJiAoLypAX19QVVJFX18qLy9Nb2JpbGVcXC9cXHcrLy50ZXN0KG5hdi51c2VyQWdlbnQpIHx8IG5hdi5tYXhUb3VjaFBvaW50cyA+IDIpO1xudmFyIGJyb3dzZXIgPSB7XG4gICAgbWFjOiBpb3MgfHwgLypAX19QVVJFX18qLy9NYWMvLnRlc3QobmF2LnBsYXRmb3JtKSxcbiAgICB3aW5kb3dzOiAvKkBfX1BVUkVfXyovL1dpbi8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIGxpbnV4OiAvKkBfX1BVUkVfXyovL0xpbnV4fFgxMS8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIGllLFxuICAgIGllX3ZlcnNpb246IGllX3VwdG8xMCA/IGRvYy5kb2N1bWVudE1vZGUgfHwgNiA6IGllXzExdXAgPyAraWVfMTF1cFsxXSA6IGllX2VkZ2UgPyAraWVfZWRnZVsxXSA6IDAsXG4gICAgZ2Vja28sXG4gICAgZ2Vja29fdmVyc2lvbjogZ2Vja28gPyArKC8qQF9fUFVSRV9fKi8vRmlyZWZveFxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMCxcbiAgICBjaHJvbWU6ICEhY2hyb21lLFxuICAgIGNocm9tZV92ZXJzaW9uOiBjaHJvbWUgPyArY2hyb21lWzFdIDogMCxcbiAgICBpb3MsXG4gICAgYW5kcm9pZDogLypAX19QVVJFX18qLy9BbmRyb2lkXFxiLy50ZXN0KG5hdi51c2VyQWdlbnQpLFxuICAgIHdlYmtpdCxcbiAgICBzYWZhcmksXG4gICAgd2Via2l0X3ZlcnNpb246IHdlYmtpdCA/ICsoLypAX19QVVJFX18qLy9cXGJBcHBsZVdlYktpdFxcLyhcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMCxcbiAgICB0YWJTaXplOiBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnRhYlNpemUgIT0gbnVsbCA/IFwidGFiLXNpemVcIiA6IFwiLW1vei10YWItc2l6ZVwiXG59O1xuXG5jb25zdCBNYXhKb2luTGVuID0gMjU2O1xuY2xhc3MgVGV4dFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IodGV4dCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGNyZWF0ZURPTSh0ZXh0RE9NKSB7XG4gICAgICAgIHRoaXMuc2V0RE9NKHRleHRET00gfHwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy50ZXh0KSk7XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRE9NKCk7XG4gICAgICAgIGlmICh0aGlzLmRvbS5ub2RlVmFsdWUgIT0gdGhpcy50ZXh0KSB7XG4gICAgICAgICAgICBpZiAodHJhY2sgJiYgdHJhY2subm9kZSA9PSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICB0cmFjay53cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLm5vZGVWYWx1ZSA9IHRoaXMudGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXVzZURPTShkb20pIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET00oZG9tKTtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSkge1xuICAgICAgICBpZiAoKHRoaXMuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKSB8fFxuICAgICAgICAgICAgc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIFRleHRWaWV3KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyBzb3VyY2UubGVuZ3RoID4gTWF4Sm9pbkxlbiB8fFxuICAgICAgICAgICAgICAgIChzb3VyY2UuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zbGljZSgwLCBmcm9tKSArIChzb3VyY2UgPyBzb3VyY2UudGV4dCA6IFwiXCIpICsgdGhpcy50ZXh0LnNsaWNlKHRvKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUZXh0Vmlldyh0aGlzLnRleHQuc2xpY2UoZnJvbSkpO1xuICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQuc2xpY2UoMCwgZnJvbSk7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIHJlc3VsdC5mbGFncyB8PSB0aGlzLmZsYWdzICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLztcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbm9kZSA9PSB0aGlzLmRvbSA/IG9mZnNldCA6IG9mZnNldCA/IHRoaXMudGV4dC5sZW5ndGggOiAwO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHsgcmV0dXJuIG5ldyBET01Qb3ModGhpcy5kb20sIHBvcyk7IH1cbiAgICBkb21Cb3VuZHNBcm91bmQoX2Zyb20sIF90bywgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IG9mZnNldCwgdG86IG9mZnNldCArIHRoaXMubGVuZ3RoLCBzdGFydERPTTogdGhpcy5kb20sIGVuZERPTTogdGhpcy5kb20ubmV4dFNpYmxpbmcgfTtcbiAgICB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiB0ZXh0Q29vcmRzKHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgIH1cbn1cbmNsYXNzIE1hcmtWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKG1hcmssIGNoaWxkcmVuID0gW10sIGxlbmd0aCA9IDApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgY2ggb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBjaC5zZXRQYXJlbnQodGhpcyk7XG4gICAgfVxuICAgIHNldEF0dHJzKGRvbSkge1xuICAgICAgICBjbGVhckF0dHJpYnV0ZXMoZG9tKTtcbiAgICAgICAgaWYgKHRoaXMubWFyay5jbGFzcylcbiAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSB0aGlzLm1hcmsuY2xhc3M7XG4gICAgICAgIGlmICh0aGlzLm1hcmsuYXR0cnMpXG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMubWFyay5hdHRycylcbiAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIHRoaXMubWFyay5hdHRyc1tuYW1lXSk7XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIGNhblJldXNlRE9NKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jYW5SZXVzZURPTShvdGhlcikgJiYgISgodGhpcy5mbGFncyB8IG90aGVyLmZsYWdzKSAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgIH1cbiAgICByZXVzZURPTShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IHRoaXMubWFyay50YWdOYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8gfCAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLnNldEF0dHJzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5tYXJrLnRhZ05hbWUpKSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZmxhZ3MgJiA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8pXG4gICAgICAgICAgICB0aGlzLnNldEF0dHJzKHRoaXMuZG9tKTtcbiAgICAgICAgc3VwZXIuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIF9oYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgKCEoc291cmNlIGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgc291cmNlLm1hcmsuZXEodGhpcy5tYXJrKSkgfHxcbiAgICAgICAgICAgIChmcm9tICYmIG9wZW5TdGFydCA8PSAwKSB8fCAodG8gPCB0aGlzLmxlbmd0aCAmJiBvcGVuRW5kIDw9IDApKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbWVyZ2VDaGlsZHJlbkludG8odGhpcywgZnJvbSwgdG8sIHNvdXJjZSA/IHNvdXJjZS5jaGlsZHJlbi5zbGljZSgpIDogW10sIG9wZW5TdGFydCAtIDEsIG9wZW5FbmQgLSAxKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBvZmYgPSAwLCBkZXRhY2hGcm9tID0gLTEsIGkgPSAwO1xuICAgICAgICBmb3IgKGxldCBlbHQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgbGV0IGVuZCA9IG9mZiArIGVsdC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gZnJvbSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvZmYgPCBmcm9tID8gZWx0LnNwbGl0KGZyb20gLSBvZmYpIDogZWx0KTtcbiAgICAgICAgICAgIGlmIChkZXRhY2hGcm9tIDwgMCAmJiBvZmYgPj0gZnJvbSlcbiAgICAgICAgICAgICAgICBkZXRhY2hGcm9tID0gaTtcbiAgICAgICAgICAgIG9mZiA9IGVuZDtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGVuZ3RoID0gdGhpcy5sZW5ndGggLSBmcm9tO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZyb207XG4gICAgICAgIGlmIChkZXRhY2hGcm9tID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gZGV0YWNoRnJvbTtcbiAgICAgICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrVmlldyh0aGlzLm1hcmssIHJlc3VsdCwgbGVuZ3RoKTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVET01BdFBvcyh0aGlzLCBwb3MpO1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvb3Jkc0luQ2hpbGRyZW4odGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Q29vcmRzKHRleHQsIHBvcywgc2lkZSkge1xuICAgIGxldCBsZW5ndGggPSB0ZXh0Lm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgaWYgKHBvcyA+IGxlbmd0aClcbiAgICAgICAgcG9zID0gbGVuZ3RoO1xuICAgIGxldCBmcm9tID0gcG9zLCB0byA9IHBvcywgZmxhdHRlbiA9IDA7XG4gICAgaWYgKHBvcyA9PSAwICYmIHNpZGUgPCAwIHx8IHBvcyA9PSBsZW5ndGggJiYgc2lkZSA+PSAwKSB7XG4gICAgICAgIGlmICghKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuZ2Vja28pKSB7IC8vIFRoZXNlIGJyb3dzZXJzIHJlbGlhYmx5IHJldHVybiB2YWxpZCByZWN0YW5nbGVzIGZvciBlbXB0eSByYW5nZXNcbiAgICAgICAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgICAgICAgICBmcm9tLS07XG4gICAgICAgICAgICAgICAgZmxhdHRlbiA9IDE7XG4gICAgICAgICAgICB9IC8vIEZJWE1FIHRoaXMgaXMgd3JvbmcgaW4gUlRMIHRleHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHRvIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG8rKztcbiAgICAgICAgICAgICAgICBmbGF0dGVuID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChzaWRlIDwgMClcbiAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgZWxzZSBpZiAodG8gPCBsZW5ndGgpXG4gICAgICAgICAgICB0bysrO1xuICAgIH1cbiAgICBsZXQgcmVjdHMgPSB0ZXh0UmFuZ2UodGV4dCwgZnJvbSwgdG8pLmdldENsaWVudFJlY3RzKCk7XG4gICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCByZWN0ID0gcmVjdHNbKGZsYXR0ZW4gPyBmbGF0dGVuIDwgMCA6IHNpZGUgPj0gMCkgPyAwIDogcmVjdHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmICFmbGF0dGVuICYmIHJlY3Qud2lkdGggPT0gMClcbiAgICAgICAgcmVjdCA9IEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocmVjdHMsIHIgPT4gci53aWR0aCkgfHwgcmVjdDtcbiAgICByZXR1cm4gZmxhdHRlbiA/IGZsYXR0ZW5SZWN0KHJlY3QsIGZsYXR0ZW4gPCAwKSA6IHJlY3QgfHwgbnVsbDtcbn1cbi8vIEFsc28gdXNlZCBmb3IgY29sbGFwc2VkIHJhbmdlcyB0aGF0IGRvbid0IGhhdmUgYSBwbGFjZWhvbGRlciB3aWRnZXQhXG5jbGFzcyBXaWRnZXRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIHN0YXRpYyBjcmVhdGUod2lkZ2V0LCBsZW5ndGgsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRWaWV3KHdpZGdldCwgbGVuZ3RoLCBzaWRlKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iod2lkZ2V0LCBsZW5ndGgsIHNpZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgIH1cbiAgICBzcGxpdChmcm9tKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBXaWRnZXRWaWV3LmNyZWF0ZSh0aGlzLndpZGdldCwgdGhpcy5sZW5ndGggLSBmcm9tLCB0aGlzLnNpZGUpO1xuICAgICAgICB0aGlzLmxlbmd0aCAtPSBmcm9tO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzeW5jKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSB8fCAhdGhpcy53aWRnZXQudXBkYXRlRE9NKHRoaXMuZG9tLCB2aWV3KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9tICYmIHRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZXRET00odGhpcy53aWRnZXQudG9ET00odmlldykpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpZGdldC5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U2lkZSgpIHsgcmV0dXJuIHRoaXMuc2lkZTsgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBXaWRnZXRWaWV3KSB8fCAhdGhpcy53aWRnZXQuY29tcGFyZShzb3VyY2Uud2lkZ2V0KSB8fFxuICAgICAgICAgICAgZnJvbSA+IDAgJiYgb3BlblN0YXJ0IDw9IDAgfHwgdG8gPCB0aGlzLmxlbmd0aCAmJiBvcGVuRW5kIDw9IDApKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZyb20gKyAoc291cmNlID8gc291cmNlLmxlbmd0aCA6IDApICsgKHRoaXMubGVuZ3RoIC0gdG8pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFdpZGdldFZpZXcgJiYgb3RoZXIuc2lkZSA9PSB0aGlzLnNpZGUgJiZcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmNvbnN0cnVjdG9yID09IG90aGVyLndpZGdldC5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpZGdldC5jb21wYXJlKG90aGVyLndpZGdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgIXRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSB0aGlzLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0ID0gb3RoZXIud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvdGhlci5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlnbm9yZUV2ZW50KGV2ZW50KSB7IHJldHVybiB0aGlzLndpZGdldC5pZ25vcmVFdmVudChldmVudCk7IH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgICAgICBsZXQgdG9wID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHRvcC5wYXJlbnQpXG4gICAgICAgICAgICB0b3AgPSB0b3AucGFyZW50O1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0b3AsIHRleHQgPSB2aWV3ICYmIHZpZXcuc3RhdGUuZG9jLCBzdGFydCA9IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgcmV0dXJuIHRleHQgPyB0ZXh0LnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMubGVuZ3RoKSA6IFRleHQuZW1wdHk7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoID8gcG9zID09IDAgOiB0aGlzLnNpZGUgPiAwKVxuICAgICAgICAgICAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKVxuICAgICAgICAgICAgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20sIHBvcyA9PSB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHRoaXMud2lkZ2V0LmNvb3Jkc0F0KHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgbGV0IHJlY3RzID0gdGhpcy5kb20uZ2V0Q2xpZW50UmVjdHMoKSwgcmVjdCA9IG51bGw7XG4gICAgICAgIGlmICghcmVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBmcm9tQmFjayA9IHRoaXMuc2lkZSA/IHRoaXMuc2lkZSA8IDAgOiBwb3MgPiAwO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbUJhY2sgPyByZWN0cy5sZW5ndGggLSAxIDogMDs7IGkgKz0gKGZyb21CYWNrID8gLTEgOiAxKSkge1xuICAgICAgICAgICAgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKHBvcyA+IDAgPyBpID09IDAgOiBpID09IHJlY3RzLmxlbmd0aCAtIDEgfHwgcmVjdC50b3AgPCByZWN0LmJvdHRvbSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHRlblJlY3QocmVjdCwgIWZyb21CYWNrKTtcbiAgICB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiB0aGlzLndpZGdldC5pc0hpZGRlbjsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgfVxufVxuLy8gVGhlc2UgYXJlIGRyYXduIGFyb3VuZCB1bmVkaXRhYmxlIHdpZGdldHMgdG8gYXZvaWQgYSBudW1iZXIgb2Zcbi8vIGJyb3dzZXIgYnVncyB0aGF0IHNob3cgdXAgd2hlbiB0aGUgY3Vyc29yIGlzIGRpcmVjdGx5IG5leHQgdG9cbi8vIHVuZWRpdGFibGUgaW5saW5lIGNvbnRlbnQuXG5jbGFzcyBXaWRnZXRCdWZmZXJWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHNpZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zaWRlID0gc2lkZTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIDA7IH1cbiAgICBtZXJnZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFdpZGdldEJ1ZmZlclZpZXcgJiYgb3RoZXIuc2lkZSA9PSB0aGlzLnNpZGU7XG4gICAgfVxuICAgIHNwbGl0KCkgeyByZXR1cm4gbmV3IFdpZGdldEJ1ZmZlclZpZXcodGhpcy5zaWRlKTsgfVxuICAgIHN5bmMoKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IFwiY20td2lkZ2V0QnVmZmVyXCI7XG4gICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgdGhpcy5zZXRET00oZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTaWRlKCkgeyByZXR1cm4gdGhpcy5zaWRlOyB9XG4gICAgZG9tQXRQb3MocG9zKSB7IHJldHVybiB0aGlzLnNpZGUgPiAwID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSkgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20pOyB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKCkgeyByZXR1cm4gMDsgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb29yZHNBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICByZXR1cm4gVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuVGV4dFZpZXcucHJvdG90eXBlLmNoaWxkcmVuID0gV2lkZ2V0Vmlldy5wcm90b3R5cGUuY2hpbGRyZW4gPSBXaWRnZXRCdWZmZXJWaWV3LnByb3RvdHlwZS5jaGlsZHJlbiA9IG5vQ2hpbGRyZW47XG5mdW5jdGlvbiBpbmxpbmVET01BdFBvcyhwYXJlbnQsIHBvcykge1xuICAgIGxldCBkb20gPSBwYXJlbnQuZG9tLCB7IGNoaWxkcmVuIH0gPSBwYXJlbnQsIGkgPSAwO1xuICAgIGZvciAobGV0IG9mZiA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBjaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID09IG9mZiAmJiBjaGlsZC5nZXRTaWRlKCkgPD0gMClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAocG9zID4gb2ZmICYmIHBvcyA8IGVuZCAmJiBjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm4gY2hpbGQuZG9tQXRQb3MocG9zIC0gb2ZmKTtcbiAgICAgICAgaWYgKHBvcyA8PSBvZmYpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgb2ZmID0gZW5kO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaTsgaiA+IDA7IGotLSkge1xuICAgICAgICBsZXQgcHJldiA9IGNoaWxkcmVuW2ogLSAxXTtcbiAgICAgICAgaWYgKHByZXYuZG9tLnBhcmVudE5vZGUgPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIHByZXYuZG9tQXRQb3MocHJldi5sZW5ndGgpO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY2hpbGRyZW5bal07XG4gICAgICAgIGlmIChuZXh0LmRvbS5wYXJlbnROb2RlID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmRvbUF0UG9zKDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERPTVBvcyhkb20sIDApO1xufVxuLy8gQXNzdW1lcyBgdmlld2AsIGlmIGEgbWFyayB2aWV3LCBoYXMgcHJlY2lzZWx5IDEgY2hpbGQuXG5mdW5jdGlvbiBqb2luSW5saW5lSW50byhwYXJlbnQsIHZpZXcsIG9wZW4pIHtcbiAgICBsZXQgbGFzdCwgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuICAgIGlmIChvcGVuID4gMCAmJiB2aWV3IGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIChsYXN0ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0pIGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgbGFzdC5tYXJrLmVxKHZpZXcubWFyaykpIHtcbiAgICAgICAgam9pbklubGluZUludG8obGFzdCwgdmlldy5jaGlsZHJlblswXSwgb3BlbiAtIDEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh2aWV3KTtcbiAgICAgICAgdmlldy5zZXRQYXJlbnQocGFyZW50KTtcbiAgICB9XG4gICAgcGFyZW50Lmxlbmd0aCArPSB2aWV3Lmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGNvb3Jkc0luQ2hpbGRyZW4odmlldywgcG9zLCBzaWRlKSB7XG4gICAgbGV0IGJlZm9yZSA9IG51bGwsIGJlZm9yZVBvcyA9IC0xLCBhZnRlciA9IG51bGwsIGFmdGVyUG9zID0gLTE7XG4gICAgZnVuY3Rpb24gc2Nhbih2aWV3LCBwb3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCB2aWV3LmNoaWxkcmVuLmxlbmd0aCAmJiBvZmYgPD0gcG9zOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHZpZXcuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzY2FuKGNoaWxkLCBwb3MgLSBvZmYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgoIWFmdGVyIHx8IGFmdGVyLmlzSGlkZGVuICYmIHNpZGUgPiAwKSAmJlxuICAgICAgICAgICAgICAgICAgICAoZW5kID4gcG9zIHx8IG9mZiA9PSBlbmQgJiYgY2hpbGQuZ2V0U2lkZSgpID4gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQb3MgPSBwb3MgLSBvZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9mZiA8IHBvcyB8fCAob2ZmID09IGVuZCAmJiBjaGlsZC5nZXRTaWRlKCkgPCAwKSAmJiAhY2hpbGQuaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZVBvcyA9IHBvcyAtIG9mZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2Nhbih2aWV3LCBwb3MpO1xuICAgIGxldCB0YXJnZXQgPSAoc2lkZSA8IDAgPyBiZWZvcmUgOiBhZnRlcikgfHwgYmVmb3JlIHx8IGFmdGVyO1xuICAgIGlmICh0YXJnZXQpXG4gICAgICAgIHJldHVybiB0YXJnZXQuY29vcmRzQXQoTWF0aC5tYXgoMCwgdGFyZ2V0ID09IGJlZm9yZSA/IGJlZm9yZVBvcyA6IGFmdGVyUG9zKSwgc2lkZSk7XG4gICAgcmV0dXJuIGZhbGxiYWNrUmVjdCh2aWV3KTtcbn1cbmZ1bmN0aW9uIGZhbGxiYWNrUmVjdCh2aWV3KSB7XG4gICAgbGV0IGxhc3QgPSB2aWV3LmRvbS5sYXN0Q2hpbGQ7XG4gICAgaWYgKCFsYXN0KVxuICAgICAgICByZXR1cm4gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHJlY3RzID0gY2xpZW50UmVjdHNGb3IobGFzdCk7XG4gICAgcmV0dXJuIHJlY3RzW3JlY3RzLmxlbmd0aCAtIDFdIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVBdHRycyhzb3VyY2UsIHRhcmdldCkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChuYW1lID09IFwiY2xhc3NcIiAmJiB0YXJnZXQuY2xhc3MpXG4gICAgICAgICAgICB0YXJnZXQuY2xhc3MgKz0gXCIgXCIgKyBzb3VyY2UuY2xhc3M7XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJzdHlsZVwiICYmIHRhcmdldC5zdHlsZSlcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZSArPSBcIjtcIiArIHNvdXJjZS5zdHlsZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFyZ2V0W25hbWVdID0gc291cmNlW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuY29uc3Qgbm9BdHRycyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gYXR0cnNFcShhLCBiLCBpZ25vcmUpIHtcbiAgICBpZiAoYSA9PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWEpXG4gICAgICAgIGEgPSBub0F0dHJzO1xuICAgIGlmICghYilcbiAgICAgICAgYiA9IG5vQXR0cnM7XG4gICAgbGV0IGtleXNBID0gT2JqZWN0LmtleXMoYSksIGtleXNCID0gT2JqZWN0LmtleXMoYik7XG4gICAgaWYgKGtleXNBLmxlbmd0aCAtIChpZ25vcmUgJiYga2V5c0EuaW5kZXhPZihpZ25vcmUpID4gLTEgPyAxIDogMCkgIT1cbiAgICAgICAga2V5c0IubGVuZ3RoIC0gKGlnbm9yZSAmJiBrZXlzQi5pbmRleE9mKGlnbm9yZSkgPiAtMSA/IDEgOiAwKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGtleSBvZiBrZXlzQSkge1xuICAgICAgICBpZiAoa2V5ICE9IGlnbm9yZSAmJiAoa2V5c0IuaW5kZXhPZihrZXkpID09IC0xIHx8IGFba2V5XSAhPT0gYltrZXldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB1cGRhdGVBdHRycyhkb20sIHByZXYsIGF0dHJzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAocHJldilcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBwcmV2KVxuICAgICAgICAgICAgaWYgKCEoYXR0cnMgJiYgbmFtZSBpbiBhdHRycykpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgaWYgKGF0dHJzKVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgaWYgKCEocHJldiAmJiBwcmV2W25hbWVdID09IGF0dHJzW25hbWVdKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBhdHRyc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gZ2V0QXR0cnMoZG9tKSB7XG4gICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBhdHRyID0gZG9tLmF0dHJpYnV0ZXNbaV07XG4gICAgICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXR0cnM7XG59XG5cbmNsYXNzIExpbmVWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBudWxsO1xuICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSAwO1xuICAgIH1cbiAgICAvLyBDb25zdW1lcyBzb3VyY2VcbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBoYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIExpbmVWaWV3KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHNvdXJjZS50cmFuc2ZlckRPTSh0aGlzKTsgLy8gUmV1c2Ugc291cmNlLmRvbSB3aGVuIGFwcHJvcHJpYXRlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1N0YXJ0KVxuICAgICAgICAgICAgdGhpcy5zZXREZWNvKHNvdXJjZSA/IHNvdXJjZS5hdHRycyA6IG51bGwpO1xuICAgICAgICBtZXJnZUNoaWxkcmVuSW50byh0aGlzLCBmcm9tLCB0bywgc291cmNlID8gc291cmNlLmNoaWxkcmVuLnNsaWNlKCkgOiBbXSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGF0KSB7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgTGluZVZpZXc7XG4gICAgICAgIGVuZC5icmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyO1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBlbmQ7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZFBvcyhhdCk7XG4gICAgICAgIGlmIChvZmYpIHtcbiAgICAgICAgICAgIGVuZC5hcHBlbmQodGhpcy5jaGlsZHJlbltpXS5zcGxpdChvZmYpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ubWVyZ2Uob2ZmLCB0aGlzLmNoaWxkcmVuW2ldLmxlbmd0aCwgbnVsbCwgZmFsc2UsIDAsIDApO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGorKylcbiAgICAgICAgICAgIGVuZC5hcHBlbmQodGhpcy5jaGlsZHJlbltqXSwgMCk7XG4gICAgICAgIHdoaWxlIChpID4gMCAmJiB0aGlzLmNoaWxkcmVuW2kgLSAxXS5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5bLS1pXS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gaTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBhdDtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9XG4gICAgdHJhbnNmZXJET00ob3RoZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgb3RoZXIuc2V0RE9NKHRoaXMuZG9tKTtcbiAgICAgICAgb3RoZXIucHJldkF0dHJzID0gdGhpcy5wcmV2QXR0cnMgPT09IHVuZGVmaW5lZCA/IHRoaXMuYXR0cnMgOiB0aGlzLnByZXZBdHRycztcbiAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZG9tID0gbnVsbDtcbiAgICB9XG4gICAgc2V0RGVjbyhhdHRycykge1xuICAgICAgICBpZiAoIWF0dHJzRXEodGhpcy5hdHRycywgYXR0cnMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBlbmQoY2hpbGQsIG9wZW5TdGFydCkge1xuICAgICAgICBqb2luSW5saW5lSW50byh0aGlzLCBjaGlsZCwgb3BlblN0YXJ0KTtcbiAgICB9XG4gICAgLy8gT25seSBjYWxsZWQgd2hlbiBidWlsZGluZyBhIGxpbmUgdmlldyBpbiBDb250ZW50QnVpbGRlclxuICAgIGFkZExpbmVEZWNvKGRlY28pIHtcbiAgICAgICAgbGV0IGF0dHJzID0gZGVjby5zcGVjLmF0dHJpYnV0ZXMsIGNscyA9IGRlY28uc3BlYy5jbGFzcztcbiAgICAgICAgaWYgKGF0dHJzKVxuICAgICAgICAgICAgdGhpcy5hdHRycyA9IGNvbWJpbmVBdHRycyhhdHRycywgdGhpcy5hdHRycyB8fCB7fSk7XG4gICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICB0aGlzLmF0dHJzID0gY29tYmluZUF0dHJzKHsgY2xhc3M6IGNscyB9LCB0aGlzLmF0dHJzIHx8IHt9KTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVET01BdFBvcyh0aGlzLCBwb3MpO1xuICAgIH1cbiAgICByZXVzZURPTShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IFwiRElWXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8gfCAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSkge1xuICAgICAgICAgICAgdGhpcy5zZXRET00oZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWxpbmVcIjtcbiAgICAgICAgICAgIHRoaXMucHJldkF0dHJzID0gdGhpcy5hdHRycyA/IG51bGwgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGFncyAmIDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLykge1xuICAgICAgICAgICAgY2xlYXJBdHRyaWJ1dGVzKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB0aGlzLmF0dHJzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcmV2QXR0cnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXBkYXRlQXR0cnModGhpcy5kb20sIHRoaXMucHJldkF0dHJzLCB0aGlzLmF0dHJzKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1saW5lXCIpO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5kb20ubGFzdENoaWxkO1xuICAgICAgICB3aGlsZSAobGFzdCAmJiBDb250ZW50Vmlldy5nZXQobGFzdCkgaW5zdGFuY2VvZiBNYXJrVmlldylcbiAgICAgICAgICAgIGxhc3QgPSBsYXN0Lmxhc3RDaGlsZDtcbiAgICAgICAgaWYgKCFsYXN0IHx8ICF0aGlzLmxlbmd0aCB8fFxuICAgICAgICAgICAgbGFzdC5ub2RlTmFtZSAhPSBcIkJSXCIgJiYgKChfYSA9IENvbnRlbnRWaWV3LmdldChsYXN0KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRWRpdGFibGUpID09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKCFicm93c2VyLmlvcyB8fCAhdGhpcy5jaGlsZHJlbi5zb21lKGNoID0+IGNoIGluc3RhbmNlb2YgVGV4dFZpZXcpKSkge1xuICAgICAgICAgICAgbGV0IGhhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiQlJcIik7XG4gICAgICAgICAgICBoYWNrLmNtSWdub3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGhhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmVUZXh0U2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDAgfHwgdGhpcy5sZW5ndGggPiAyMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDAsIHRleHRIZWlnaHQ7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGV4dFZpZXcpIHx8IC9bXiAtfl0vLnRlc3QoY2hpbGQudGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihjaGlsZC5kb20pO1xuICAgICAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSByZWN0c1swXS53aWR0aDtcbiAgICAgICAgICAgIHRleHRIZWlnaHQgPSByZWN0c1swXS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0b3RhbFdpZHRoID8gbnVsbCA6IHtcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCxcbiAgICAgICAgICAgIGNoYXJXaWR0aDogdG90YWxXaWR0aCAvIHRoaXMubGVuZ3RoLFxuICAgICAgICAgICAgdGV4dEhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBjb29yZHNJbkNoaWxkcmVuKHRoaXMsIHBvcywgc2lkZSk7XG4gICAgICAgIC8vIENvcnJlY3QgcmVjdGFuZ2xlIGhlaWdodCBmb3IgZW1wdHkgbGluZXMgd2hlbiB0aGUgcmV0dXJuZWRcbiAgICAgICAgLy8gaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSB0ZXh0IGhlaWdodC5cbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiByZWN0ICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWlnaHRPcmFjbGUgfSA9IHRoaXMucGFyZW50LnZpZXcudmlld1N0YXRlLCBoZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGhlaWdodCAtIGhlaWdodE9yYWNsZS5saW5lSGVpZ2h0KSA8IDIgJiYgaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQgPCBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzdCA9IChoZWlnaHQgLSBoZWlnaHRPcmFjbGUudGV4dEhlaWdodCkgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AgKyBkaXN0LCBib3R0b206IHJlY3QuYm90dG9tIC0gZGlzdCwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5sZWZ0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIGJlY29tZShfb3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY292ZXJzKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIHN0YXRpYyBmaW5kKGRvY1ZpZXcsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IGRvY1ZpZXcuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBibG9jayA9IGRvY1ZpZXcuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGJsb2NrLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrIGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGVuZCArIGJsb2NrLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuY2xhc3MgQmxvY2tXaWRnZXRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHdpZGdldCwgbGVuZ3RoLCBkZWNvKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5kZWNvID0gZGVjbztcbiAgICAgICAgdGhpcy5icmVha0FmdGVyID0gMDtcbiAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgX3Rha2VEZWNvLCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcpIHx8ICF0aGlzLndpZGdldC5jb21wYXJlKHNvdXJjZS53aWRnZXQpIHx8XG4gICAgICAgICAgICBmcm9tID4gMCAmJiBvcGVuU3RhcnQgPD0gMCB8fCB0byA8IHRoaXMubGVuZ3RoICYmIG9wZW5FbmQgPD0gMCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZnJvbSArIChzb3VyY2UgPyBzb3VyY2UubGVuZ3RoIDogMCkgKyAodGhpcy5sZW5ndGggLSB0byk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHBvcyA9PSAwID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSkgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20sIHBvcyA9PSB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIHNwbGl0KGF0KSB7XG4gICAgICAgIGxldCBsZW4gPSB0aGlzLmxlbmd0aCAtIGF0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGF0O1xuICAgICAgICBsZXQgZW5kID0gbmV3IEJsb2NrV2lkZ2V0Vmlldyh0aGlzLndpZGdldCwgbGVuLCB0aGlzLmRlY28pO1xuICAgICAgICBlbmQuYnJlYWtBZnRlciA9IHRoaXMuYnJlYWtBZnRlcjtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9XG4gICAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gbm9DaGlsZHJlbjsgfVxuICAgIHN5bmModmlldykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tIHx8ICF0aGlzLndpZGdldC51cGRhdGVET00odGhpcy5kb20sIHZpZXcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLndpZGdldC50b0RPTSh2aWV3KSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lkZ2V0LmVkaXRhYmxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC52aWV3LnN0YXRlLmRvYy5zbGljZSh0aGlzLnBvc0F0U3RhcnQsIHRoaXMucG9zQXRFbmQpIDogVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZG9tQm91bmRzQXJvdW5kKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcgJiZcbiAgICAgICAgICAgIG90aGVyLndpZGdldC5jb25zdHJ1Y3RvciA9PSB0aGlzLndpZGdldC5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYgKCFvdGhlci53aWRnZXQuY29tcGFyZSh0aGlzLndpZGdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgIXRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSB0aGlzLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0ID0gb3RoZXIud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvdGhlci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmRlY28gPSBvdGhlci5kZWNvO1xuICAgICAgICAgICAgdGhpcy5icmVha0FmdGVyID0gb3RoZXIuYnJlYWtBZnRlcjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWdub3JlRXZlbnQoZXZlbnQpIHsgcmV0dXJuIHRoaXMud2lkZ2V0Lmlnbm9yZUV2ZW50KGV2ZW50KTsgfVxuICAgIGdldCBpc0VkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNXaWRnZXQoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpZGdldC5jb29yZHNBdCh0aGlzLmRvbSwgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICB9XG4gICAgY292ZXJzKHNpZGUpIHtcbiAgICAgICAgbGV0IHsgc3RhcnRTaWRlLCBlbmRTaWRlIH0gPSB0aGlzLmRlY287XG4gICAgICAgIHJldHVybiBzdGFydFNpZGUgPT0gZW5kU2lkZSA/IGZhbHNlIDogc2lkZSA8IDAgPyBzdGFydFNpZGUgPCAwIDogZW5kU2lkZSA+IDA7XG4gICAgfVxufVxuXG4vKipcbldpZGdldHMgYWRkZWQgdG8gdGhlIGNvbnRlbnQgYXJlIGRlc2NyaWJlZCBieSBzdWJjbGFzc2VzIG9mIHRoaXNcbmNsYXNzLiBVc2luZyBhIGRlc2NyaXB0aW9uIG9iamVjdCBsaWtlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG9cbmRlbGF5IGNyZWF0aW5nIG9mIHRoZSBET00gc3RydWN0dXJlIGZvciBhIHdpZGdldCB1bnRpbCBpdCBpc1xubmVlZGVkLCBhbmQgdG8gYXZvaWQgcmVkcmF3aW5nIHdpZGdldHMgZXZlbiBpZiB0aGUgZGVjb3JhdGlvbnNcbnRoYXQgZGVmaW5lIHRoZW0gYXJlIHJlY3JlYXRlZC5cbiovXG5jbGFzcyBXaWRnZXRUeXBlIHtcbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgaW5zdGFuY2UgdG8gYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSB0eXBlLlxuICAgIChUeXBlU2NyaXB0IGNhbid0IGV4cHJlc3MgdGhpcywgYnV0IG9ubHkgaW5zdGFuY2VzIG9mIHRoZSBzYW1lXG4gICAgc3BlY2lmaWMgY2xhc3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBtZXRob2QuKSBUaGlzIGlzIHVzZWQgdG9cbiAgICBhdm9pZCByZWRyYXdpbmcgd2lkZ2V0cyB3aGVuIHRoZXkgYXJlIHJlcGxhY2VkIGJ5IGEgbmV3XG4gICAgZGVjb3JhdGlvbiBvZiB0aGUgc2FtZSB0eXBlLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0XG4gICAgcmV0dXJucyBgZmFsc2VgLCB3aGljaCB3aWxsIGNhdXNlIG5ldyBpbnN0YW5jZXMgb2YgdGhlIHdpZGdldCB0b1xuICAgIGFsd2F5cyBiZSByZWRyYXduLlxuICAgICovXG4gICAgZXEod2lkZ2V0KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSBhIERPTSBlbGVtZW50IGNyZWF0ZWQgYnkgYSB3aWRnZXQgb2YgdGhlIHNhbWUgdHlwZSAoYnV0XG4gICAgZGlmZmVyZW50LCBub24tYGVxYCBjb250ZW50KSB0byByZWZsZWN0IHRoaXMgd2lkZ2V0LiBNYXkgcmV0dXJuXG4gICAgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGNvdWxkIHVwZGF0ZSwgZmFsc2UgdG8gaW5kaWNhdGUgaXRcbiAgICBjb3VsZG4ndCAoaW4gd2hpY2ggY2FzZSB0aGUgd2lkZ2V0IHdpbGwgYmUgcmVkcmF3bikuIFRoZSBkZWZhdWx0XG4gICAgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGZhbHNlLlxuICAgICovXG4gICAgdXBkYXRlRE9NKGRvbSwgdmlldykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgdGhpcy5jb25zdHJ1Y3RvciA9PSBvdGhlci5jb25zdHJ1Y3RvciAmJiB0aGlzLmVxKG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGVzdGltYXRlZCBoZWlnaHQgdGhpcyB3aWRnZXQgd2lsbCBoYXZlLCB0byBiZSB1c2VkIHdoZW5cbiAgICBlc3RpbWF0aW5nIHRoZSBoZWlnaHQgb2YgY29udGVudCB0aGF0IGhhc24ndCBiZWVuIGRyYXduLiBNYXlcbiAgICByZXR1cm4gLTEgdG8gaW5kaWNhdGUgeW91IGRvbid0IGtub3cuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uXG4gICAgcmV0dXJucyAtMS5cbiAgICAqL1xuICAgIGdldCBlc3RpbWF0ZWRIZWlnaHQoKSB7IHJldHVybiAtMTsgfVxuICAgIC8qKlxuICAgIEZvciBpbmxpbmUgd2lkZ2V0cyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW5saW5lIChhcyBvcHBvc2VkIHRvXG4gICAgYGlubGluZS1ibG9ja2ApIGFuZCBpbnRyb2R1Y2UgbGluZSBicmVha3MgKHRocm91Z2ggYDxicj5gIHRhZ3NcbiAgICBvciB0ZXh0dWFsIG5ld2xpbmVzKSwgdGhpcyBtdXN0IGluZGljYXRlIHRoZSBhbW91bnQgb2YgbGluZVxuICAgIGJyZWFrcyB0aGV5IGludHJvZHVjZS4gRGVmYXVsdHMgdG8gMC5cbiAgICAqL1xuICAgIGdldCBsaW5lQnJlYWtzKCkgeyByZXR1cm4gMDsgfVxuICAgIC8qKlxuICAgIENhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB3aGljaCBraW5kcyBvZiBldmVudHMgaW5zaWRlIHRoZSB3aWRnZXRcbiAgICBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgZWRpdG9yLiBUaGUgZGVmYXVsdCBpcyB0byBpZ25vcmUgYWxsXG4gICAgZXZlbnRzLlxuICAgICovXG4gICAgaWdub3JlRXZlbnQoZXZlbnQpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAvKipcbiAgICBPdmVycmlkZSB0aGUgd2F5IHNjcmVlbiBjb29yZGluYXRlcyBmb3IgcG9zaXRpb25zIGF0L2luIHRoZVxuICAgIHdpZGdldCBhcmUgZm91bmQuIGBwb3NgIHdpbGwgYmUgdGhlIG9mZnNldCBpbnRvIHRoZSB3aWRnZXQsIGFuZFxuICAgIGBzaWRlYCB0aGUgc2lkZSBvZiB0aGUgcG9zaXRpb24gdGhhdCBpcyBiZWluZyBxdWVyaWVkXHUyMDE0bGVzcyB0aGFuXG4gICAgemVybyBmb3IgYmVmb3JlLCBncmVhdGVyIHRoYW4gemVybyBmb3IgYWZ0ZXIsIGFuZCB6ZXJvIGZvclxuICAgIGRpcmVjdGx5IGF0IHRoYXQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBjb29yZHNBdChkb20sIHBvcywgc2lkZSkgeyByZXR1cm4gbnVsbDsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBlZGl0YWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHdpZGdldCBpcyByZW1vdmVkXG4gICAgZnJvbSB0aGUgZWRpdG9yIHZpZXcuXG4gICAgKi9cbiAgICBkZXN0cm95KGRvbSkgeyB9XG59XG4vKipcblRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYmxvY2tzIHRoYXQgY2FuIG9jY3VyIGluIGFuIGVkaXRvciB2aWV3LlxuKi9cbnZhciBCbG9ja1R5cGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChCbG9ja1R5cGUpIHtcbiAgICAvKipcbiAgICBBIGxpbmUgb2YgdGV4dC5cbiAgICAqL1xuICAgIEJsb2NrVHlwZVtCbG9ja1R5cGVbXCJUZXh0XCJdID0gMF0gPSBcIlRleHRcIjtcbiAgICAvKipcbiAgICBBIGJsb2NrIHdpZGdldCBhc3NvY2lhdGVkIHdpdGggdGhlIHBvc2l0aW9uIGFmdGVyIGl0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldEJlZm9yZVwiXSA9IDFdID0gXCJXaWRnZXRCZWZvcmVcIjtcbiAgICAvKipcbiAgICBBIGJsb2NrIHdpZGdldCBhc3NvY2lhdGVkIHdpdGggdGhlIHBvc2l0aW9uIGJlZm9yZSBpdC5cbiAgICAqL1xuICAgIEJsb2NrVHlwZVtCbG9ja1R5cGVbXCJXaWRnZXRBZnRlclwiXSA9IDJdID0gXCJXaWRnZXRBZnRlclwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IFtyZXBsYWNpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uXnJlcGxhY2UpIGEgcmFuZ2Ugb2YgY29udGVudC5cbiAgICAqL1xuICAgIEJsb2NrVHlwZVtCbG9ja1R5cGVbXCJXaWRnZXRSYW5nZVwiXSA9IDNdID0gXCJXaWRnZXRSYW5nZVwiO1xucmV0dXJuIEJsb2NrVHlwZX0pKEJsb2NrVHlwZSB8fCAoQmxvY2tUeXBlID0ge30pKTtcbi8qKlxuQSBkZWNvcmF0aW9uIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkcmF3IG9yIHN0eWxlIGEgcGllY2Vcbm9mIGNvbnRlbnQuIFlvdSdsbCB1c3VhbGx5IHVzZSBpdCB3cmFwcGVkIGluIGFcbltgUmFuZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlKSwgd2hpY2ggYWRkcyBhIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24uXG5Abm9uYWJzdHJhY3RcbiovXG5jbGFzcyBEZWNvcmF0aW9uIGV4dGVuZHMgUmFuZ2VWYWx1ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGFydFNpZGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZW5kU2lkZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB3aWRnZXQsIFxuICAgIC8qKlxuICAgIFRoZSBjb25maWcgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoaXMgZGVjb3JhdGlvbi4gWW91IGNhblxuICAgIGluY2x1ZGUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGluIHRoZXJlIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0XG4gICAgeW91ciBkZWNvcmF0aW9uLlxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0YXJ0U2lkZSA9IHN0YXJ0U2lkZTtcbiAgICAgICAgdGhpcy5lbmRTaWRlID0gZW5kU2lkZTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGhlaWdodFJlbGV2YW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrIGRlY29yYXRpb24sIHdoaWNoIGluZmx1ZW5jZXMgdGhlIHN0eWxpbmcgb2YgdGhlXG4gICAgY29udGVudCBpbiBpdHMgcmFuZ2UuIE5lc3RlZCBtYXJrIGRlY29yYXRpb25zIHdpbGwgY2F1c2UgbmVzdGVkXG4gICAgRE9NIGVsZW1lbnRzIHRvIGJlIGNyZWF0ZWQuIE5lc3Rpbmcgb3JkZXIgaXMgZGV0ZXJtaW5lZCBieVxuICAgIHByZWNlZGVuY2Ugb2YgdGhlIFtmYWNldF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZGVjb3JhdGlvbnMpLCB3aXRoXG4gICAgdGhlIGhpZ2hlci1wcmVjZWRlbmNlIGRlY29yYXRpb25zIGNyZWF0aW5nIHRoZSBpbm5lciBET00gbm9kZXMuXG4gICAgU3VjaCBlbGVtZW50cyBhcmUgc3BsaXQgb24gbGluZSBib3VuZGFyaWVzIGFuZCBvbiB0aGUgYm91bmRhcmllc1xuICAgIG9mIGxvd2VyLXByZWNlZGVuY2UgZGVjb3JhdGlvbnMuXG4gICAgKi9cbiAgICBzdGF0aWMgbWFyayhzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFya0RlY29yYXRpb24oc3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHdpZGdldCBkZWNvcmF0aW9uLCB3aGljaCBkaXNwbGF5cyBhIERPTSBlbGVtZW50IGF0IHRoZVxuICAgIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgc3RhdGljIHdpZGdldChzcGVjKSB7XG4gICAgICAgIGxldCBzaWRlID0gTWF0aC5tYXgoLTEwMDAwLCBNYXRoLm1pbigxMDAwMCwgc3BlYy5zaWRlIHx8IDApKSwgYmxvY2sgPSAhIXNwZWMuYmxvY2s7XG4gICAgICAgIHNpZGUgKz0gKGJsb2NrICYmICFzcGVjLmlubGluZU9yZGVyKVxuICAgICAgICAgICAgPyAoc2lkZSA+IDAgPyAzMDAwMDAwMDAgLyogU2lkZS5CbG9ja0FmdGVyICovIDogLTQwMDAwMDAwMCAvKiBTaWRlLkJsb2NrQmVmb3JlICovKVxuICAgICAgICAgICAgOiAoc2lkZSA+IDAgPyAxMDAwMDAwMDAgLyogU2lkZS5JbmxpbmVBZnRlciAqLyA6IC0xMDAwMDAwMDAgLyogU2lkZS5JbmxpbmVCZWZvcmUgKi8pO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50RGVjb3JhdGlvbihzcGVjLCBzaWRlLCBzaWRlLCBibG9jaywgc3BlYy53aWRnZXQgfHwgbnVsbCwgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSByZXBsYWNlIGRlY29yYXRpb24gd2hpY2ggcmVwbGFjZXMgdGhlIGdpdmVuIHJhbmdlIHdpdGhcbiAgICBhIHdpZGdldCwgb3Igc2ltcGx5IGhpZGVzIGl0LlxuICAgICovXG4gICAgc3RhdGljIHJlcGxhY2Uoc3BlYykge1xuICAgICAgICBsZXQgYmxvY2sgPSAhIXNwZWMuYmxvY2ssIHN0YXJ0U2lkZSwgZW5kU2lkZTtcbiAgICAgICAgaWYgKHNwZWMuaXNCbG9ja0dhcCkge1xuICAgICAgICAgICAgc3RhcnRTaWRlID0gLTUwMDAwMDAwMCAvKiBTaWRlLkdhcFN0YXJ0ICovO1xuICAgICAgICAgICAgZW5kU2lkZSA9IDQwMDAwMDAwMCAvKiBTaWRlLkdhcEVuZCAqLztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCB7IHN0YXJ0LCBlbmQgfSA9IGdldEluY2x1c2l2ZShzcGVjLCBibG9jayk7XG4gICAgICAgICAgICBzdGFydFNpZGUgPSAoc3RhcnQgPyAoYmxvY2sgPyAtMzAwMDAwMDAwIC8qIFNpZGUuQmxvY2tJbmNTdGFydCAqLyA6IC0xIC8qIFNpZGUuSW5saW5lSW5jU3RhcnQgKi8pIDogNTAwMDAwMDAwIC8qIFNpZGUuTm9uSW5jU3RhcnQgKi8pIC0gMTtcbiAgICAgICAgICAgIGVuZFNpZGUgPSAoZW5kID8gKGJsb2NrID8gMjAwMDAwMDAwIC8qIFNpZGUuQmxvY2tJbmNFbmQgKi8gOiAxIC8qIFNpZGUuSW5saW5lSW5jRW5kICovKSA6IC02MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNFbmQgKi8pICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFBvaW50RGVjb3JhdGlvbihzcGVjLCBzdGFydFNpZGUsIGVuZFNpZGUsIGJsb2NrLCBzcGVjLndpZGdldCB8fCBudWxsLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbGluZSBkZWNvcmF0aW9uLCB3aGljaCBjYW4gYWRkIERPTSBhdHRyaWJ1dGVzIHRvIHRoZVxuICAgIGxpbmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGxpbmUoc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IExpbmVEZWNvcmF0aW9uKHNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIFtgRGVjb3JhdGlvblNldGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uU2V0KSBmcm9tIHRoZSBnaXZlblxuICAgIGRlY29yYXRlZCByYW5nZSBvciByYW5nZXMuIElmIHRoZSByYW5nZXMgYXJlbid0IGFscmVhZHkgc29ydGVkLFxuICAgIHBhc3MgYHRydWVgIGZvciBgc29ydGAgdG8gbWFrZSB0aGUgbGlicmFyeSBzb3J0IHRoZW0gZm9yIHlvdS5cbiAgICAqL1xuICAgIHN0YXRpYyBzZXQob2YsIHNvcnQgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gUmFuZ2VTZXQub2Yob2YsIHNvcnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGhhc0hlaWdodCgpIHsgcmV0dXJuIHRoaXMud2lkZ2V0ID8gdGhpcy53aWRnZXQuZXN0aW1hdGVkSGVpZ2h0ID4gLTEgOiBmYWxzZTsgfVxufVxuLyoqXG5UaGUgZW1wdHkgc2V0IG9mIGRlY29yYXRpb25zLlxuKi9cbkRlY29yYXRpb24ubm9uZSA9IFJhbmdlU2V0LmVtcHR5O1xuY2xhc3MgTWFya0RlY29yYXRpb24gZXh0ZW5kcyBEZWNvcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBlbmQgfSA9IGdldEluY2x1c2l2ZShzcGVjKTtcbiAgICAgICAgc3VwZXIoc3RhcnQgPyAtMSAvKiBTaWRlLklubGluZUluY1N0YXJ0ICovIDogNTAwMDAwMDAwIC8qIFNpZGUuTm9uSW5jU3RhcnQgKi8sIGVuZCA/IDEgLyogU2lkZS5JbmxpbmVJbmNFbmQgKi8gOiAtNjAwMDAwMDAwIC8qIFNpZGUuTm9uSW5jRW5kICovLCBudWxsLCBzcGVjKTtcbiAgICAgICAgdGhpcy50YWdOYW1lID0gc3BlYy50YWdOYW1lIHx8IFwic3BhblwiO1xuICAgICAgICB0aGlzLmNsYXNzID0gc3BlYy5jbGFzcyB8fCBcIlwiO1xuICAgICAgICB0aGlzLmF0dHJzID0gc3BlYy5hdHRyaWJ1dGVzIHx8IG51bGw7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICBvdGhlciBpbnN0YW5jZW9mIE1hcmtEZWNvcmF0aW9uICYmXG4gICAgICAgICAgICAgICAgdGhpcy50YWdOYW1lID09IG90aGVyLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5jbGFzcyB8fCAoKF9hID0gdGhpcy5hdHRycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsYXNzKSkgPT0gKG90aGVyLmNsYXNzIHx8ICgoX2IgPSBvdGhlci5hdHRycykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsYXNzKSkgJiZcbiAgICAgICAgICAgICAgICBhdHRyc0VxKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzLCBcImNsYXNzXCIpO1xuICAgIH1cbiAgICByYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgaWYgKGZyb20gPj0gdG8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk1hcmsgZGVjb3JhdGlvbnMgbWF5IG5vdCBiZSBlbXB0eVwiKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5NYXJrRGVjb3JhdGlvbi5wcm90b3R5cGUucG9pbnQgPSBmYWxzZTtcbmNsYXNzIExpbmVEZWNvcmF0aW9uIGV4dGVuZHMgRGVjb3JhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICBzdXBlcigtMjAwMDAwMDAwIC8qIFNpZGUuTGluZSAqLywgLTIwMDAwMDAwMCAvKiBTaWRlLkxpbmUgKi8sIG51bGwsIHNwZWMpO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBMaW5lRGVjb3JhdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy5zcGVjLmNsYXNzID09IG90aGVyLnNwZWMuY2xhc3MgJiZcbiAgICAgICAgICAgIGF0dHJzRXEodGhpcy5zcGVjLmF0dHJpYnV0ZXMsIG90aGVyLnNwZWMuYXR0cmlidXRlcyk7XG4gICAgfVxuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAodG8gIT0gZnJvbSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTGluZSBkZWNvcmF0aW9uIHJhbmdlcyBtdXN0IGJlIHplcm8tbGVuZ3RoXCIpO1xuICAgICAgICByZXR1cm4gc3VwZXIucmFuZ2UoZnJvbSwgdG8pO1xuICAgIH1cbn1cbkxpbmVEZWNvcmF0aW9uLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0JlZm9yZTtcbkxpbmVEZWNvcmF0aW9uLnByb3RvdHlwZS5wb2ludCA9IHRydWU7XG5jbGFzcyBQb2ludERlY29yYXRpb24gZXh0ZW5kcyBEZWNvcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjLCBzdGFydFNpZGUsIGVuZFNpZGUsIGJsb2NrLCB3aWRnZXQsIGlzUmVwbGFjZSkge1xuICAgICAgICBzdXBlcihzdGFydFNpZGUsIGVuZFNpZGUsIHdpZGdldCwgc3BlYyk7XG4gICAgICAgIHRoaXMuYmxvY2sgPSBibG9jaztcbiAgICAgICAgdGhpcy5pc1JlcGxhY2UgPSBpc1JlcGxhY2U7XG4gICAgICAgIHRoaXMubWFwTW9kZSA9ICFibG9jayA/IE1hcE1vZGUuVHJhY2tEZWwgOiBzdGFydFNpZGUgPD0gMCA/IE1hcE1vZGUuVHJhY2tCZWZvcmUgOiBNYXBNb2RlLlRyYWNrQWZ0ZXI7XG4gICAgfVxuICAgIC8vIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGlzLmJsb2NrID09IHRydWVcbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRTaWRlICE9IHRoaXMuZW5kU2lkZSA/IEJsb2NrVHlwZS5XaWRnZXRSYW5nZVxuICAgICAgICAgICAgOiB0aGlzLnN0YXJ0U2lkZSA8PSAwID8gQmxvY2tUeXBlLldpZGdldEJlZm9yZSA6IEJsb2NrVHlwZS5XaWRnZXRBZnRlcjtcbiAgICB9XG4gICAgZ2V0IGhlaWdodFJlbGV2YW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ibG9jayB8fCAhIXRoaXMud2lkZ2V0ICYmICh0aGlzLndpZGdldC5lc3RpbWF0ZWRIZWlnaHQgPj0gNSB8fCB0aGlzLndpZGdldC5saW5lQnJlYWtzID4gMCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbiAmJlxuICAgICAgICAgICAgd2lkZ2V0c0VxKHRoaXMud2lkZ2V0LCBvdGhlci53aWRnZXQpICYmXG4gICAgICAgICAgICB0aGlzLmJsb2NrID09IG90aGVyLmJsb2NrICYmXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2lkZSA9PSBvdGhlci5zdGFydFNpZGUgJiYgdGhpcy5lbmRTaWRlID09IG90aGVyLmVuZFNpZGU7XG4gICAgfVxuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAodGhpcy5pc1JlcGxhY2UgJiYgKGZyb20gPiB0byB8fCAoZnJvbSA9PSB0byAmJiB0aGlzLnN0YXJ0U2lkZSA+IDAgJiYgdGhpcy5lbmRTaWRlIDw9IDApKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCByYW5nZSBmb3IgcmVwbGFjZW1lbnQgZGVjb3JhdGlvblwiKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzUmVwbGFjZSAmJiB0byAhPSBmcm9tKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJXaWRnZXQgZGVjb3JhdGlvbnMgY2FuIG9ubHkgaGF2ZSB6ZXJvLWxlbmd0aCByYW5nZXNcIik7XG4gICAgICAgIHJldHVybiBzdXBlci5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxuUG9pbnREZWNvcmF0aW9uLnByb3RvdHlwZS5wb2ludCA9IHRydWU7XG5mdW5jdGlvbiBnZXRJbmNsdXNpdmUoc3BlYywgYmxvY2sgPSBmYWxzZSkge1xuICAgIGxldCB7IGluY2x1c2l2ZVN0YXJ0OiBzdGFydCwgaW5jbHVzaXZlRW5kOiBlbmQgfSA9IHNwZWM7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpXG4gICAgICAgIHN0YXJ0ID0gc3BlYy5pbmNsdXNpdmU7XG4gICAgaWYgKGVuZCA9PSBudWxsKVxuICAgICAgICBlbmQgPSBzcGVjLmluY2x1c2l2ZTtcbiAgICByZXR1cm4geyBzdGFydDogc3RhcnQgIT09IG51bGwgJiYgc3RhcnQgIT09IHZvaWQgMCA/IHN0YXJ0IDogYmxvY2ssIGVuZDogZW5kICE9PSBudWxsICYmIGVuZCAhPT0gdm9pZCAwID8gZW5kIDogYmxvY2sgfTtcbn1cbmZ1bmN0aW9uIHdpZGdldHNFcShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT0gYiB8fCAhIShhICYmIGIgJiYgYS5jb21wYXJlKGIpKTtcbn1cbmZ1bmN0aW9uIGFkZFJhbmdlKGZyb20sIHRvLCByYW5nZXMsIG1hcmdpbiA9IDApIHtcbiAgICBsZXQgbGFzdCA9IHJhbmdlcy5sZW5ndGggLSAxO1xuICAgIGlmIChsYXN0ID49IDAgJiYgcmFuZ2VzW2xhc3RdICsgbWFyZ2luID49IGZyb20pXG4gICAgICAgIHJhbmdlc1tsYXN0XSA9IE1hdGgubWF4KHJhbmdlc1tsYXN0XSwgdG8pO1xuICAgIGVsc2VcbiAgICAgICAgcmFuZ2VzLnB1c2goZnJvbSwgdG8pO1xufVxuXG5jbGFzcyBDb250ZW50QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoZG9jLCBwb3MsIGVuZCwgZGlzYWxsb3dCbG9ja0VmZmVjdHNGb3IpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICAgICAgdGhpcy5kaXNhbGxvd0Jsb2NrRWZmZWN0c0ZvciA9IGRpc2FsbG93QmxvY2tFZmZlY3RzRm9yO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJMaW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5icmVha0F0U3RhcnQgPSAwO1xuICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgdGhpcy5idWZmZXJNYXJrcyA9IFtdO1xuICAgICAgICAvLyBTZXQgdG8gZmFsc2UgZGlyZWN0bHkgYWZ0ZXIgYSB3aWRnZXQgdGhhdCBjb3ZlcnMgdGhlIHBvc2l0aW9uIGFmdGVyIGl0XG4gICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLm9wZW5FbmQgPSAtMTtcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBkb2MuaXRlcigpO1xuICAgICAgICB0aGlzLnNraXAgPSBwb3M7XG4gICAgfVxuICAgIHBvc0NvdmVyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuYnJlYWtBdFN0YXJ0ICYmIHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykuZnJvbSAhPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gIShsYXN0LmJyZWFrQWZ0ZXIgfHwgbGFzdCBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJiBsYXN0LmRlY28uZW5kU2lkZSA8IDApO1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VyTGluZSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50LnB1c2godGhpcy5jdXJMaW5lID0gbmV3IExpbmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmN1ckxpbmU7XG4gICAgfVxuICAgIGZsdXNoQnVmZmVyKGFjdGl2ZSA9IHRoaXMuYnVmZmVyTWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5jdXJMaW5lLmFwcGVuZCh3cmFwTWFya3MobmV3IFdpZGdldEJ1ZmZlclZpZXcoLTEpLCBhY3RpdmUpLCBhY3RpdmUubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEJsb2NrV2lkZ2V0KHZpZXcpIHtcbiAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRlbnQucHVzaCh2aWV3KTtcbiAgICB9XG4gICAgZmluaXNoKG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlciAmJiBvcGVuRW5kIDw9IHRoaXMuYnVmZmVyTWFya3MubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgaWYgKCF0aGlzLnBvc0NvdmVyZWQoKSAmJlxuICAgICAgICAgICAgIShvcGVuRW5kICYmIHRoaXMuY29udGVudC5sZW5ndGggJiYgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldykpXG4gICAgICAgICAgICB0aGlzLmdldExpbmUoKTtcbiAgICB9XG4gICAgYnVpbGRUZXh0KGxlbmd0aCwgYWN0aXZlLCBvcGVuU3RhcnQpIHtcbiAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRleHRPZmYgPT0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCB7IHZhbHVlLCBsaW5lQnJlYWssIGRvbmUgfSA9IHRoaXMuY3Vyc29yLm5leHQodGhpcy5za2lwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXAgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYW4gb3V0IG9mIHRleHQgY29udGVudCB3aGVuIGRyYXdpbmcgaW5saW5lIHZpZXdzXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lQnJlYWspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBvc0NvdmVyZWQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0uYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtBdFN0YXJ0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0Q3Vyc29yUG9zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRha2UgPSBNYXRoLm1pbih0aGlzLnRleHQubGVuZ3RoIC0gdGhpcy50ZXh0T2ZmLCBsZW5ndGgsIDUxMiAvKiBULkNodW5rICovKTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hCdWZmZXIoYWN0aXZlLnNsaWNlKGFjdGl2ZS5sZW5ndGggLSBvcGVuU3RhcnQpKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpLmFwcGVuZCh3cmFwTWFya3MobmV3IFRleHRWaWV3KHRoaXMudGV4dC5zbGljZSh0aGlzLnRleHRPZmYsIHRoaXMudGV4dE9mZiArIHRha2UpKSwgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50ZXh0T2ZmICs9IHRha2U7XG4gICAgICAgICAgICBsZW5ndGggLT0gdGFrZTtcbiAgICAgICAgICAgIG9wZW5TdGFydCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3Bhbihmcm9tLCB0bywgYWN0aXZlLCBvcGVuU3RhcnQpIHtcbiAgICAgICAgdGhpcy5idWlsZFRleHQodG8gLSBmcm9tLCBhY3RpdmUsIG9wZW5TdGFydCk7XG4gICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICB9XG4gICAgcG9pbnQoZnJvbSwgdG8sIGRlY28sIGFjdGl2ZSwgb3BlblN0YXJ0LCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhbGxvd0Jsb2NrRWZmZWN0c0ZvcltpbmRleF0gJiYgZGVjbyBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCbG9jayBkZWNvcmF0aW9ucyBtYXkgbm90IGJlIHNwZWNpZmllZCB2aWEgcGx1Z2luc1wiKTtcbiAgICAgICAgICAgIGlmICh0byA+IHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykudG8pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEZWNvcmF0aW9ucyB0aGF0IHJlcGxhY2UgbGluZSBicmVha3MgbWF5IG5vdCBiZSBzcGVjaWZpZWQgdmlhIHBsdWdpbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxlbiA9IHRvIC0gZnJvbTtcbiAgICAgICAgaWYgKGRlY28gaW5zdGFuY2VvZiBQb2ludERlY29yYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChkZWNvLmJsb2NrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlY28uc3RhcnRTaWRlID4gMCAmJiAhdGhpcy5wb3NDb3ZlcmVkKCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2tXaWRnZXQobmV3IEJsb2NrV2lkZ2V0VmlldyhkZWNvLndpZGdldCB8fCBuZXcgTnVsbFdpZGdldChcImRpdlwiKSwgbGVuLCBkZWNvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdmlldyA9IFdpZGdldFZpZXcuY3JlYXRlKGRlY28ud2lkZ2V0IHx8IG5ldyBOdWxsV2lkZ2V0KFwic3BhblwiKSwgbGVuLCBsZW4gPyAwIDogZGVjby5zdGFydFNpZGUpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3JCZWZvcmUgPSB0aGlzLmF0Q3Vyc29yUG9zICYmICF2aWV3LmlzRWRpdGFibGUgJiYgb3BlblN0YXJ0IDw9IGFjdGl2ZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKGZyb20gPCB0byB8fCBkZWNvLnN0YXJ0U2lkZSA+IDApO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3JBZnRlciA9ICF2aWV3LmlzRWRpdGFibGUgJiYgKGZyb20gPCB0byB8fCBvcGVuU3RhcnQgPiBhY3RpdmUubGVuZ3RoIHx8IGRlY28uc3RhcnRTaWRlIDw9IDApO1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlciA9PSAyIC8qIEJ1Zi5JZkN1cnNvciAqLyAmJiAhY3Vyc29yQmVmb3JlICYmICF2aWV3LmlzRWRpdGFibGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hCdWZmZXIoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yQmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHdyYXBNYXJrcyhuZXcgV2lkZ2V0QnVmZmVyVmlldygxKSwgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgb3BlblN0YXJ0ID0gYWN0aXZlLmxlbmd0aCArIE1hdGgubWF4KDAsIG9wZW5TdGFydCAtIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh3cmFwTWFya3ModmlldywgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0Q3Vyc29yUG9zID0gY3Vyc29yQWZ0ZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gIWN1cnNvckFmdGVyID8gMCAvKiBCdWYuTm8gKi8gOiBmcm9tIDwgdG8gfHwgb3BlblN0YXJ0ID4gYWN0aXZlLmxlbmd0aCA/IDEgLyogQnVmLlllcyAqLyA6IDIgLyogQnVmLklmQ3Vyc29yICovO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdCdWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyTWFya3MgPSBhY3RpdmUuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmRvYy5saW5lQXQodGhpcy5wb3MpLmZyb20gPT0gdGhpcy5wb3MpIHsgLy8gTGluZSBkZWNvcmF0aW9uXG4gICAgICAgICAgICB0aGlzLmdldExpbmUoKS5hZGRMaW5lRGVjbyhkZWNvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBpdGVyYXRvciBwYXN0IHRoZSByZXBsYWNlZCBjb250ZW50XG4gICAgICAgICAgICBpZiAodGhpcy50ZXh0T2ZmICsgbGVuIDw9IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPZmYgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwICs9IGxlbiAtICh0aGlzLnRleHQubGVuZ3RoIC0gdGhpcy50ZXh0T2ZmKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHRvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICB9XG4gICAgc3RhdGljIGJ1aWxkKHRleHQsIGZyb20sIHRvLCBkZWNvcmF0aW9ucywgZHluYW1pY0RlY29yYXRpb25NYXApIHtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgQ29udGVudEJ1aWxkZXIodGV4dCwgZnJvbSwgdG8sIGR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgYnVpbGRlci5vcGVuRW5kID0gUmFuZ2VTZXQuc3BhbnMoZGVjb3JhdGlvbnMsIGZyb20sIHRvLCBidWlsZGVyKTtcbiAgICAgICAgaWYgKGJ1aWxkZXIub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIGJ1aWxkZXIub3BlblN0YXJ0ID0gYnVpbGRlci5vcGVuRW5kO1xuICAgICAgICBidWlsZGVyLmZpbmlzaChidWlsZGVyLm9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG59XG5mdW5jdGlvbiB3cmFwTWFya3ModmlldywgYWN0aXZlKSB7XG4gICAgZm9yIChsZXQgbWFyayBvZiBhY3RpdmUpXG4gICAgICAgIHZpZXcgPSBuZXcgTWFya1ZpZXcobWFyaywgW3ZpZXddLCB2aWV3Lmxlbmd0aCk7XG4gICAgcmV0dXJuIHZpZXc7XG59XG5jbGFzcyBOdWxsV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IodGFnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIudGFnID09IHRoaXMudGFnOyB9XG4gICAgdG9ET00oKSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMudGFnKTsgfVxuICAgIHVwZGF0ZURPTShlbHQpIHsgcmV0dXJuIGVsdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IHRoaXMudGFnOyB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuXG4vKipcblVzZWQgdG8gaW5kaWNhdGUgW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy50ZXh0RGlyZWN0aW9uKS5cbiovXG52YXIgRGlyZWN0aW9uID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoRGlyZWN0aW9uKSB7XG4gICAgLy8gKFRoZXNlIGFyZSBjaG9zZW4gdG8gbWF0Y2ggdGhlIGJhc2UgbGV2ZWxzLCBpbiBiaWRpIGFsZ29yaXRobVxuICAgIC8vIHRlcm1zLCBvZiBzcGFucyBpbiB0aGF0IGRpcmVjdGlvbi4pXG4gICAgLyoqXG4gICAgTGVmdC10by1yaWdodC5cbiAgICAqL1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJMVFJcIl0gPSAwXSA9IFwiTFRSXCI7XG4gICAgLyoqXG4gICAgUmlnaHQtdG8tbGVmdC5cbiAgICAqL1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJSVExcIl0gPSAxXSA9IFwiUlRMXCI7XG5yZXR1cm4gRGlyZWN0aW9ufSkoRGlyZWN0aW9uIHx8IChEaXJlY3Rpb24gPSB7fSkpO1xuY29uc3QgTFRSID0gRGlyZWN0aW9uLkxUUiwgUlRMID0gRGlyZWN0aW9uLlJUTDtcbi8vIERlY29kZSBhIHN0cmluZyB3aXRoIGVhY2ggdHlwZSBlbmNvZGVkIGFzIGxvZzIodHlwZSlcbmZ1bmN0aW9uIGRlYyhzdHIpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdC5wdXNoKDEgPDwgK3N0cltpXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIENoYXJhY3RlciB0eXBlcyBmb3IgY29kZXBvaW50cyAwIHRvIDB4ZjhcbmNvbnN0IExvd1R5cGVzID0gLypAX19QVVJFX18qL2RlYyhcIjg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4NjY2ODg4ODg4Nzg3ODMzMzMzMzMzMzM3ODg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ODg4ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg3ODY2NjY4ODg4MDg4ODg4NjYzMzgwODg4MzA4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4XCIpO1xuLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDB4NjAwIHRvIDB4NmY5XG5jb25zdCBBcmFiaWNUeXBlcyA9IC8qQF9fUFVSRV9fKi9kZWMoXCI0NDQ0NDQ4ODI2NjI3Mjg4OTk5OTk5OTk5OTkyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI5OTk5OTk5OTk5OTk5OTk5OTk5OTk0NDQ0NDQ0NDQ0NjQ0MjIyODIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyOTk5OTk5OTQ5OTk5OTk5MjI5OTg5OTk5MjIzMzMzMzMzMzMzXCIpO1xuY29uc3QgQnJhY2tldHMgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKSwgQnJhY2tldFN0YWNrID0gW107XG4vLyBUaGVyZSdzIGEgbG90IG1vcmUgaW5cbi8vIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9VQ0QvbGF0ZXN0L3VjZC9CaWRpQnJhY2tldHMudHh0LFxuLy8gd2hpY2ggYXJlIGxlZnQgb3V0IHRvIGtlZXAgY29kZSBzaXplIGRvd24uXG5mb3IgKGxldCBwIG9mIFtcIigpXCIsIFwiW11cIiwgXCJ7fVwiXSkge1xuICAgIGxldCBsID0gLypAX19QVVJFX18qL3AuY2hhckNvZGVBdCgwKSwgciA9IC8qQF9fUFVSRV9fKi9wLmNoYXJDb2RlQXQoMSk7XG4gICAgQnJhY2tldHNbbF0gPSByO1xuICAgIEJyYWNrZXRzW3JdID0gLWw7XG59XG5mdW5jdGlvbiBjaGFyVHlwZShjaCkge1xuICAgIHJldHVybiBjaCA8PSAweGY3ID8gTG93VHlwZXNbY2hdIDpcbiAgICAgICAgMHg1OTAgPD0gY2ggJiYgY2ggPD0gMHg1ZjQgPyAyIC8qIFQuUiAqLyA6XG4gICAgICAgICAgICAweDYwMCA8PSBjaCAmJiBjaCA8PSAweDZmOSA/IEFyYWJpY1R5cGVzW2NoIC0gMHg2MDBdIDpcbiAgICAgICAgICAgICAgICAweDZlZSA8PSBjaCAmJiBjaCA8PSAweDhhYyA/IDQgLyogVC5BTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgIDB4MjAwMCA8PSBjaCAmJiBjaCA8PSAweDIwMGMgPyAyNTYgLyogVC5OSSAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAweGZiNTAgPD0gY2ggJiYgY2ggPD0gMHhmZGZmID8gNCAvKiBULkFMICovIDogMSAvKiBULkwgKi87XG59XG5jb25zdCBCaWRpUkUgPSAvW1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTA3MDAtXFx1MDhhY1xcdWZiNTAtXFx1ZmRmZl0vO1xuLyoqXG5SZXByZXNlbnRzIGEgY29udGlndW91cyByYW5nZSBvZiB0ZXh0IHRoYXQgaGFzIGEgc2luZ2xlIGRpcmVjdGlvblxuKGFzIGluIGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkuXG4qL1xuY2xhc3MgQmlkaVNwYW4ge1xuICAgIC8qKlxuICAgIFRoZSBkaXJlY3Rpb24gb2YgdGhpcyBzcGFuLlxuICAgICovXG4gICAgZ2V0IGRpcigpIHsgcmV0dXJuIHRoaXMubGV2ZWwgJSAyID8gUlRMIDogTFRSOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIHNwYW4gKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSkuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBzcGFuLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBbXCJiaWRpXG4gICAgbGV2ZWxcIl0oaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS8jQmFzaWNfRGlzcGxheV9BbGdvcml0aG0pXG4gICAgb2YgdGhlIHNwYW4gKGluIHRoaXMgY29udGV4dCwgMCBtZWFuc1xuICAgIGxlZnQtdG8tcmlnaHQsIDEgbWVhbnMgcmlnaHQtdG8tbGVmdCwgMiBtZWFucyBsZWZ0LXRvLXJpZ2h0XG4gICAgbnVtYmVyIGluc2lkZSByaWdodC10by1sZWZ0IHRleHQpLlxuICAgICovXG4gICAgbGV2ZWwpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2lkZShlbmQsIGRpcikgeyByZXR1cm4gKHRoaXMuZGlyID09IGRpcikgPT0gZW5kID8gdGhpcy50byA6IHRoaXMuZnJvbTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZm9yd2FyZChmb3J3YXJkLCBkaXIpIHsgcmV0dXJuIGZvcndhcmQgPT0gKHRoaXMuZGlyID09IGRpcik7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmaW5kKG9yZGVyLCBpbmRleCwgbGV2ZWwsIGFzc29jKSB7XG4gICAgICAgIGxldCBtYXliZSA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3BhbiA9IG9yZGVyW2ldO1xuICAgICAgICAgICAgaWYgKHNwYW4uZnJvbSA8PSBpbmRleCAmJiBzcGFuLnRvID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwYW4ubGV2ZWwgPT0gbGV2ZWwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gbXVsdGlwbGUgc3BhbnMgbWF0Y2gsIGlmIGFzc29jICE9IDAsIHRha2UgdGhlIG9uZSB0aGF0XG4gICAgICAgICAgICAgICAgLy8gY292ZXJzIHRoYXQgc2lkZSwgb3RoZXJ3aXNlIHRha2UgdGhlIG9uZSB3aXRoIHRoZSBtaW5pbXVtXG4gICAgICAgICAgICAgICAgLy8gbGV2ZWwuXG4gICAgICAgICAgICAgICAgaWYgKG1heWJlIDwgMCB8fCAoYXNzb2MgIT0gMCA/IChhc3NvYyA8IDAgPyBzcGFuLmZyb20gPCBpbmRleCA6IHNwYW4udG8gPiBpbmRleCkgOiBvcmRlclttYXliZV0ubGV2ZWwgPiBzcGFuLmxldmVsKSlcbiAgICAgICAgICAgICAgICAgICAgbWF5YmUgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZSA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIG1heWJlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzb2xhdGVzRXEoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgaUEgPSBhW2ldLCBpQiA9IGJbaV07XG4gICAgICAgIGlmIChpQS5mcm9tICE9IGlCLmZyb20gfHwgaUEudG8gIT0gaUIudG8gfHwgaUEuZGlyZWN0aW9uICE9IGlCLmRpcmVjdGlvbiB8fCAhaXNvbGF0ZXNFcShpQS5pbm5lciwgaUIuaW5uZXIpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFJldXNlZCBhcnJheSBvZiBjaGFyYWN0ZXIgdHlwZXNcbmNvbnN0IHR5cGVzID0gW107XG4vLyBGaWxsIGluIHRoZSBjaGFyYWN0ZXIgdHlwZXMgKGluIGB0eXBlc2ApIGZyb20gYGZyb21gIHRvIGB0b2AgYW5kXG4vLyBhcHBseSBXIG5vcm1hbGl6YXRpb24gcnVsZXMuXG5mdW5jdGlvbiBjb21wdXRlQ2hhclR5cGVzKGxpbmUsIHJGcm9tLCByVG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpIHtcbiAgICBmb3IgKGxldCBpSSA9IDA7IGlJIDw9IGlzb2xhdGVzLmxlbmd0aDsgaUkrKykge1xuICAgICAgICBsZXQgZnJvbSA9IGlJID8gaXNvbGF0ZXNbaUkgLSAxXS50byA6IHJGcm9tLCB0byA9IGlJIDwgaXNvbGF0ZXMubGVuZ3RoID8gaXNvbGF0ZXNbaUldLmZyb20gOiByVG87XG4gICAgICAgIGxldCBwcmV2VHlwZSA9IGlJID8gMjU2IC8qIFQuTkkgKi8gOiBvdXRlclR5cGU7XG4gICAgICAgIC8vIFcxLiBFeGFtaW5lIGVhY2ggbm9uLXNwYWNpbmcgbWFyayAoTlNNKSBpbiB0aGUgbGV2ZWwgcnVuLCBhbmRcbiAgICAgICAgLy8gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBOU00gdG8gdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzXG4gICAgICAgIC8vIGNoYXJhY3Rlci4gSWYgdGhlIE5TTSBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxldmVsIHJ1biwgaXQgd2lsbFxuICAgICAgICAvLyBnZXQgdGhlIHR5cGUgb2Ygc29yLlxuICAgICAgICAvLyBXMi4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXJcbiAgICAgICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBBTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW5cbiAgICAgICAgLy8gQUwgaXMgZm91bmQsIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEFyYWJpY1xuICAgICAgICAvLyBudW1iZXIuXG4gICAgICAgIC8vIFczLiBDaGFuZ2UgYWxsIEFMcyB0byBSLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTiwgQU4sIEVULCBDUywgTkkpXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBwcmV2ID0gcHJldlR5cGUsIHByZXZTdHJvbmcgPSBwcmV2VHlwZTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gY2hhclR5cGUobGluZS5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IDUxMiAvKiBULk5TTSAqLylcbiAgICAgICAgICAgICAgICB0eXBlID0gcHJldjtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gOCAvKiBULkVOICovICYmIHByZXZTdHJvbmcgPT0gNCAvKiBULkFMICovKVxuICAgICAgICAgICAgICAgIHR5cGUgPSAxNiAvKiBULkFOICovO1xuICAgICAgICAgICAgdHlwZXNbaV0gPSB0eXBlID09IDQgLyogVC5BTCAqLyA/IDIgLyogVC5SICovIDogdHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlICYgNyAvKiBULlN0cm9uZyAqLylcbiAgICAgICAgICAgICAgICBwcmV2U3Ryb25nID0gdHlwZTtcbiAgICAgICAgICAgIHByZXYgPSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFc1LiBBIHNlcXVlbmNlIG9mIEV1cm9wZWFuIHRlcm1pbmF0b3JzIGFkamFjZW50IHRvIEV1cm9wZWFuXG4gICAgICAgIC8vIG51bWJlcnMgY2hhbmdlcyB0byBhbGwgRXVyb3BlYW4gbnVtYmVycy5cbiAgICAgICAgLy8gVzYuIE90aGVyd2lzZSwgc2VwYXJhdG9ycyBhbmQgdGVybWluYXRvcnMgY2hhbmdlIHRvIE90aGVyXG4gICAgICAgIC8vIE5ldXRyYWwuXG4gICAgICAgIC8vIFc3LiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuIEwgaXNcbiAgICAgICAgLy8gZm91bmQsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gTC5cbiAgICAgICAgLy8gKExlZnQgYWZ0ZXIgdGhpczogTCwgUiwgRU4rQU4sIE5JKVxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbSwgcHJldiA9IHByZXZUeXBlLCBwcmV2U3Ryb25nID0gcHJldlR5cGU7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gMTI4IC8qIFQuQ1MgKi8pIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHRvIC0gMSAmJiBwcmV2ID09IHR5cGVzW2kgKyAxXSAmJiAocHJldiAmIDI0IC8qIFQuTnVtICovKSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGVzW2ldID0gcHJldjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gMjU2IC8qIFQuTkkgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDY0IC8qIFQuRVQgKi8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gaSArIDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGVuZCA8IHRvICYmIHR5cGVzW2VuZF0gPT0gNjQgLyogVC5FVCAqLylcbiAgICAgICAgICAgICAgICAgICAgZW5kKys7XG4gICAgICAgICAgICAgICAgbGV0IHJlcGxhY2UgPSAoaSAmJiBwcmV2ID09IDggLyogVC5FTiAqLykgfHwgKGVuZCA8IHJUbyAmJiB0eXBlc1tlbmRdID09IDggLyogVC5FTiAqLykgPyAocHJldlN0cm9uZyA9PSAxIC8qIFQuTCAqLyA/IDEgLyogVC5MICovIDogOCAvKiBULkVOICovKSA6IDI1NiAvKiBULk5JICovO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgZW5kOyBqKyspXG4gICAgICAgICAgICAgICAgICAgIHR5cGVzW2pdID0gcmVwbGFjZTtcbiAgICAgICAgICAgICAgICBpID0gZW5kIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gOCAvKiBULkVOICovICYmIHByZXZTdHJvbmcgPT0gMSAvKiBULkwgKi8pIHtcbiAgICAgICAgICAgICAgICB0eXBlc1tpXSA9IDEgLyogVC5MICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZSAmIDcgLyogVC5TdHJvbmcgKi8pXG4gICAgICAgICAgICAgICAgcHJldlN0cm9uZyA9IHR5cGU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBQcm9jZXNzIGJyYWNrZXRzIHRocm91Z2hvdXQgYSBydW4gc2VxdWVuY2UuXG5mdW5jdGlvbiBwcm9jZXNzQnJhY2tldFBhaXJzKGxpbmUsIHJGcm9tLCByVG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpIHtcbiAgICBsZXQgb3Bwb3NpdGVUeXBlID0gb3V0ZXJUeXBlID09IDEgLyogVC5MICovID8gMiAvKiBULlIgKi8gOiAxIC8qIFQuTCAqLztcbiAgICBmb3IgKGxldCBpSSA9IDAsIHNJID0gMCwgY29udGV4dCA9IDA7IGlJIDw9IGlzb2xhdGVzLmxlbmd0aDsgaUkrKykge1xuICAgICAgICBsZXQgZnJvbSA9IGlJID8gaXNvbGF0ZXNbaUkgLSAxXS50byA6IHJGcm9tLCB0byA9IGlJIDwgaXNvbGF0ZXMubGVuZ3RoID8gaXNvbGF0ZXNbaUldLmZyb20gOiByVG87XG4gICAgICAgIC8vIE4wLiBQcm9jZXNzIGJyYWNrZXQgcGFpcnMgaW4gYW4gaXNvbGF0aW5nIHJ1biBzZXF1ZW5jZVxuICAgICAgICAvLyBzZXF1ZW50aWFsbHkgaW4gdGhlIGxvZ2ljYWwgb3JkZXIgb2YgdGhlIHRleHQgcG9zaXRpb25zIG9mIHRoZVxuICAgICAgICAvLyBvcGVuaW5nIHBhaXJlZCBicmFja2V0cyB1c2luZyB0aGUgbG9naWMgZ2l2ZW4gYmVsb3cuIFdpdGhpbiB0aGlzXG4gICAgICAgIC8vIHNjb3BlLCBiaWRpcmVjdGlvbmFsIHR5cGVzIEVOIGFuZCBBTiBhcmUgdHJlYXRlZCBhcyBSLlxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbSwgY2gsIGJyLCB0eXBlOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgLy8gS2VlcHMgW3N0YXJ0SW5kZXgsIHR5cGUsIHN0cm9uZ1NlZW5dIHRyaXBsZXMgZm9yIGVhY2ggb3BlblxuICAgICAgICAgICAgLy8gYnJhY2tldCBvbiBCcmFja2V0U3RhY2suXG4gICAgICAgICAgICBpZiAoYnIgPSBCcmFja2V0c1tjaCA9IGxpbmUuY2hhckNvZGVBdChpKV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoYnIgPCAwKSB7IC8vIENsb3NpbmcgYnJhY2tldFxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzSiA9IHNJIC0gMzsgc0ogPj0gMDsgc0ogLT0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJyYWNrZXRTdGFja1tzSiArIDFdID09IC1icikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbGFncyA9IEJyYWNrZXRTdGFja1tzSiArIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gKGZsYWdzICYgMiAvKiBCcmFja2V0ZWQuRW1iZWRJbnNpZGUgKi8pID8gb3V0ZXJUeXBlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShmbGFncyAmIDQgLyogQnJhY2tldGVkLk9wcG9zaXRlSW5zaWRlICovKSA/IDAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgMSAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVCZWZvcmUgKi8pID8gb3Bwb3NpdGVUeXBlIDogb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlc1tpXSA9IHR5cGVzW0JyYWNrZXRTdGFja1tzSl1dID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzSSA9IHNKO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEJyYWNrZXRTdGFjay5sZW5ndGggPT0gMTg5IC8qIEJyYWNrZXRlZC5NYXhEZXB0aCAqLykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSSsrXSA9IGk7XG4gICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSSsrXSA9IGNoO1xuICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0krK10gPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCh0eXBlID0gdHlwZXNbaV0pID09IDIgLyogVC5SICovIHx8IHR5cGUgPT0gMSAvKiBULkwgKi8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZW1iZWQgPSB0eXBlID09IG91dGVyVHlwZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0ID0gZW1iZWQgPyAwIDogMSAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVCZWZvcmUgKi87XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc0ogPSBzSSAtIDM7IHNKID49IDA7IHNKIC09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1ciA9IEJyYWNrZXRTdGFja1tzSiArIDJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyICYgMiAvKiBCcmFja2V0ZWQuRW1iZWRJbnNpZGUgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0ogKyAyXSB8PSAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiA0IC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUluc2lkZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSiArIDJdIHw9IDQgLyogQnJhY2tldGVkLk9wcG9zaXRlSW5zaWRlICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcHJvY2Vzc05ldXRyYWxzKHJGcm9tLCByVG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpIHtcbiAgICBmb3IgKGxldCBpSSA9IDAsIHByZXYgPSBvdXRlclR5cGU7IGlJIDw9IGlzb2xhdGVzLmxlbmd0aDsgaUkrKykge1xuICAgICAgICBsZXQgZnJvbSA9IGlJID8gaXNvbGF0ZXNbaUkgLSAxXS50byA6IHJGcm9tLCB0byA9IGlJIDwgaXNvbGF0ZXMubGVuZ3RoID8gaXNvbGF0ZXNbaUldLmZyb20gOiByVG87XG4gICAgICAgIC8vIE4xLiBBIHNlcXVlbmNlIG9mIG5ldXRyYWxzIHRha2VzIHRoZSBkaXJlY3Rpb24gb2YgdGhlXG4gICAgICAgIC8vIHN1cnJvdW5kaW5nIHN0cm9uZyB0ZXh0IGlmIHRoZSB0ZXh0IG9uIGJvdGggc2lkZXMgaGFzIHRoZSBzYW1lXG4gICAgICAgIC8vIGRpcmVjdGlvbi4gRXVyb3BlYW4gYW5kIEFyYWJpYyBudW1iZXJzIGFjdCBhcyBpZiB0aGV5IHdlcmUgUiBpblxuICAgICAgICAvLyB0ZXJtcyBvZiB0aGVpciBpbmZsdWVuY2Ugb24gbmV1dHJhbHMuIFN0YXJ0LW9mLWxldmVsLXJ1biAoc29yKVxuICAgICAgICAvLyBhbmQgZW5kLW9mLWxldmVsLXJ1biAoZW9yKSBhcmUgdXNlZCBhdCBsZXZlbCBydW4gYm91bmRhcmllcy5cbiAgICAgICAgLy8gTjIuIEFueSByZW1haW5pbmcgbmV1dHJhbHMgdGFrZSB0aGUgZW1iZWRkaW5nIGRpcmVjdGlvbi5cbiAgICAgICAgLy8gKExlZnQgYWZ0ZXIgdGhpczogTCwgUiwgRU4rQU4pXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87KSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gMjU2IC8qIFQuTkkgKi8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gaSArIDE7XG4gICAgICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kID09IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUkgPT0gaXNvbGF0ZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaXNvbGF0ZXNbaUkrK10udG87XG4gICAgICAgICAgICAgICAgICAgICAgICB0byA9IGlJIDwgaXNvbGF0ZXMubGVuZ3RoID8gaXNvbGF0ZXNbaUldLmZyb20gOiByVG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZXNbZW5kXSA9PSAyNTYgLyogVC5OSSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgYmVmb3JlTCA9IHByZXYgPT0gMSAvKiBULkwgKi87XG4gICAgICAgICAgICAgICAgbGV0IGFmdGVyTCA9IChlbmQgPCByVG8gPyB0eXBlc1tlbmRdIDogb3V0ZXJUeXBlKSA9PSAxIC8qIFQuTCAqLztcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZSA9IGJlZm9yZUwgPT0gYWZ0ZXJMID8gKGJlZm9yZUwgPyAxIC8qIFQuTCAqLyA6IDIgLyogVC5SICovKSA6IG91dGVyVHlwZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gZW5kLCBqSSA9IGlJLCBmcm9tSiA9IGpJID8gaXNvbGF0ZXNbakkgLSAxXS50byA6IHJGcm9tOyBqID4gaTspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gZnJvbUopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpc29sYXRlc1stLWpJXS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUogPSBqSSA/IGlzb2xhdGVzW2pJIC0gMV0udG8gOiByRnJvbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0eXBlc1stLWpdID0gcmVwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSA9IGVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYgPSB0eXBlO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIEZpbmQgdGhlIGNvbnRpZ3VvdXMgcmFuZ2VzIG9mIGNoYXJhY3RlciB0eXBlcyBpbiBhIGdpdmVuIHJhbmdlLCBhbmRcbi8vIGVtaXQgc3BhbnMgZm9yIHRoZW0uIEZsaXAgdGhlIG9yZGVyIG9mIHRoZSBzcGFucyBhcyBhcHByb3ByaWF0ZVxuLy8gYmFzZWQgb24gdGhlIGxldmVsLCBhbmQgY2FsbCB0aHJvdWdoIHRvIGNvbXB1dGUgdGhlIHNwYW5zIGZvclxuLy8gaXNvbGF0ZXMgYXQgdGhlIHByb3BlciBwb2ludC5cbmZ1bmN0aW9uIGVtaXRTcGFucyhsaW5lLCBmcm9tLCB0bywgbGV2ZWwsIGJhc2VMZXZlbCwgaXNvbGF0ZXMsIG9yZGVyKSB7XG4gICAgbGV0IG91clR5cGUgPSBsZXZlbCAlIDIgPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovO1xuICAgIGlmICgobGV2ZWwgJSAyKSA9PSAoYmFzZUxldmVsICUgMikpIHsgLy8gU2FtZSBkaXIgYXMgYmFzZSBkaXJlY3Rpb24sIGRvbid0IGZsaXBcbiAgICAgICAgZm9yIChsZXQgaUNoID0gZnJvbSwgaUkgPSAwOyBpQ2ggPCB0bzspIHtcbiAgICAgICAgICAgIC8vIFNjYW4gYSBzZWN0aW9uIG9mIGNoYXJhY3RlcnMgaW4gZGlyZWN0aW9uIG91clR5cGUsIHVubGVzc1xuICAgICAgICAgICAgLy8gdGhlcmUncyBhbm90aGVyIHR5cGUgb2YgY2hhciByaWdodCBhZnRlciBpQ2gsIGluIHdoaWNoIGNhc2VcbiAgICAgICAgICAgIC8vIHdlIHNjYW4gYSBzZWN0aW9uIG9mIG90aGVyIGNoYXJhY3RlcnMgKHdoaWNoLCBpZiBvdXJUeXBlID09XG4gICAgICAgICAgICAvLyBULkwsIG1heSBjb250YWluIGJvdGggVC5SIGFuZCBULkFOIGNoYXJzKS5cbiAgICAgICAgICAgIGxldCBzYW1lRGlyID0gdHJ1ZSwgaXNOdW0gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpSSA9PSBpc29sYXRlcy5sZW5ndGggfHwgaUNoIDwgaXNvbGF0ZXNbaUldLmZyb20pIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHR5cGVzW2lDaF07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gb3VyVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBzYW1lRGlyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlzTnVtID0gbmV4dCA9PSAxNiAvKiBULkFOICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhvbGRzIGFuIGFycmF5IG9mIGlzb2xhdGVzIHRvIHBhc3MgdG8gYSByZWN1cnNpdmUgY2FsbCBpZiB3ZVxuICAgICAgICAgICAgLy8gbXVzdCByZWN1cnNlICh0byBkaXN0aW5ndWlzaCBULkFOIGluc2lkZSBhbiBSVEwgc2VjdGlvbiBpblxuICAgICAgICAgICAgLy8gTFRSIHRleHQpLCBudWxsIGlmIHdlIGNhbiBlbWl0IGRpcmVjdGx5XG4gICAgICAgICAgICBsZXQgcmVjdXJzZSA9ICFzYW1lRGlyICYmIG91clR5cGUgPT0gMSAvKiBULkwgKi8gPyBbXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgbG9jYWxMZXZlbCA9IHNhbWVEaXIgPyBsZXZlbCA6IGxldmVsICsgMTtcbiAgICAgICAgICAgIGxldCBpU2NhbiA9IGlDaDtcbiAgICAgICAgICAgIHJ1bjogZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChpSSA8IGlzb2xhdGVzLmxlbmd0aCAmJiBpU2NhbiA9PSBpc29sYXRlc1tpSV0uZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc28gPSBpc29sYXRlc1tpSV07XG4gICAgICAgICAgICAgICAgICAgIC8vIFNjYW4gYWhlYWQgdG8gdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYW5vdGhlciBjaGFyIGluIHRoaXMgZGlyIGFmdGVyIHRoZSBpc29sYXRlKHMpXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2FtZURpcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHVwdG8gPSBpc28udG8sIGpJID0gaUkgKyAxOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXB0byA9PSB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqSSA8IGlzb2xhdGVzLmxlbmd0aCAmJiBpc29sYXRlc1tqSV0uZnJvbSA9PSB1cHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRvID0gaXNvbGF0ZXNbakkrK10udG87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZXNbdXB0b10gPT0gb3VyVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlJKys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN1cnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLnB1c2goaXNvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc28uZnJvbSA+IGlDaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbihpQ2gsIGlzby5mcm9tLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlyU3dhcCA9IChpc28uZGlyZWN0aW9uID09IExUUikgIT0gIShsb2NhbExldmVsICUgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGRpclN3YXAgPyBsZXZlbCArIDEgOiBsZXZlbCwgYmFzZUxldmVsLCBpc28uaW5uZXIsIGlzby5mcm9tLCBpc28udG8sIG9yZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlDaCA9IGlzby50bztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpU2NhbiA9IGlzby50bztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaVNjYW4gPT0gdG8gfHwgKHNhbWVEaXIgPyB0eXBlc1tpU2Nhbl0gIT0gb3VyVHlwZSA6IHR5cGVzW2lTY2FuXSA9PSBvdXJUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlY3Vyc2UpXG4gICAgICAgICAgICAgICAgZW1pdFNwYW5zKGxpbmUsIGlDaCwgaVNjYW4sIGxldmVsICsgMSwgYmFzZUxldmVsLCByZWN1cnNlLCBvcmRlcik7XG4gICAgICAgICAgICBlbHNlIGlmIChpQ2ggPCBpU2NhbilcbiAgICAgICAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbihpQ2gsIGlTY2FuLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICBpQ2ggPSBpU2NhbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSXRlcmF0ZSBpbiByZXZlcnNlIHRvIGZsaXAgdGhlIHNwYW4gb3JkZXIuIFNhbWUgY29kZSBhZ2FpbiwgYnV0XG4gICAgICAgIC8vIGdvaW5nIGZyb20gdGhlIGJhY2sgb2YgdGhlIHNlY3Rpb24gdG8gdGhlIGZyb250XG4gICAgICAgIGZvciAobGV0IGlDaCA9IHRvLCBpSSA9IGlzb2xhdGVzLmxlbmd0aDsgaUNoID4gZnJvbTspIHtcbiAgICAgICAgICAgIGxldCBzYW1lRGlyID0gdHJ1ZSwgaXNOdW0gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghaUkgfHwgaUNoID4gaXNvbGF0ZXNbaUkgLSAxXS50bykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdHlwZXNbaUNoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gb3VyVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBzYW1lRGlyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlzTnVtID0gbmV4dCA9PSAxNiAvKiBULkFOICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZWN1cnNlID0gIXNhbWVEaXIgJiYgb3VyVHlwZSA9PSAxIC8qIFQuTCAqLyA/IFtdIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBsb2NhbExldmVsID0gc2FtZURpciA/IGxldmVsIDogbGV2ZWwgKyAxO1xuICAgICAgICAgICAgbGV0IGlTY2FuID0gaUNoO1xuICAgICAgICAgICAgcnVuOiBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlJICYmIGlTY2FuID09IGlzb2xhdGVzW2lJIC0gMV0udG8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNvID0gaXNvbGF0ZXNbLS1pSV07XG4gICAgICAgICAgICAgICAgICAgIC8vIFNjYW4gYWhlYWQgdG8gdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYW5vdGhlciBjaGFyIGluIHRoaXMgZGlyIGFmdGVyIHRoZSBpc29sYXRlKHMpXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2FtZURpcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHVwdG8gPSBpc28uZnJvbSwgakkgPSBpSTs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwdG8gPT0gZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqSSAmJiBpc29sYXRlc1tqSSAtIDFdLnRvID09IHVwdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdG8gPSBpc29sYXRlc1stLWpJXS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVzW3VwdG8gLSAxXSA9PSBvdXJUeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UucHVzaChpc28pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzby50byA8IGlDaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3Bhbihpc28udG8sIGlDaCwgbG9jYWxMZXZlbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpclN3YXAgPSAoaXNvLmRpcmVjdGlvbiA9PSBMVFIpICE9ICEobG9jYWxMZXZlbCAlIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBkaXJTd2FwID8gbGV2ZWwgKyAxIDogbGV2ZWwsIGJhc2VMZXZlbCwgaXNvLmlubmVyLCBpc28uZnJvbSwgaXNvLnRvLCBvcmRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpQ2ggPSBpc28uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpU2NhbiA9IGlzby5mcm9tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpU2NhbiA9PSBmcm9tIHx8IChzYW1lRGlyID8gdHlwZXNbaVNjYW4gLSAxXSAhPSBvdXJUeXBlIDogdHlwZXNbaVNjYW4gLSAxXSA9PSBvdXJUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlY3Vyc2UpXG4gICAgICAgICAgICAgICAgZW1pdFNwYW5zKGxpbmUsIGlTY2FuLCBpQ2gsIGxldmVsICsgMSwgYmFzZUxldmVsLCByZWN1cnNlLCBvcmRlcik7XG4gICAgICAgICAgICBlbHNlIGlmIChpU2NhbiA8IGlDaClcbiAgICAgICAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbihpU2NhbiwgaUNoLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICBpQ2ggPSBpU2NhbjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgbGV2ZWwsIGJhc2VMZXZlbCwgaXNvbGF0ZXMsIGZyb20sIHRvLCBvcmRlcikge1xuICAgIGxldCBvdXRlclR5cGUgPSAobGV2ZWwgJSAyID8gMiAvKiBULlIgKi8gOiAxIC8qIFQuTCAqLyk7XG4gICAgY29tcHV0ZUNoYXJUeXBlcyhsaW5lLCBmcm9tLCB0bywgaXNvbGF0ZXMsIG91dGVyVHlwZSk7XG4gICAgcHJvY2Vzc0JyYWNrZXRQYWlycyhsaW5lLCBmcm9tLCB0bywgaXNvbGF0ZXMsIG91dGVyVHlwZSk7XG4gICAgcHJvY2Vzc05ldXRyYWxzKGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBlbWl0U3BhbnMobGluZSwgZnJvbSwgdG8sIGxldmVsLCBiYXNlTGV2ZWwsIGlzb2xhdGVzLCBvcmRlcik7XG59XG5mdW5jdGlvbiBjb21wdXRlT3JkZXIobGluZSwgZGlyZWN0aW9uLCBpc29sYXRlcykge1xuICAgIGlmICghbGluZSlcbiAgICAgICAgcmV0dXJuIFtuZXcgQmlkaVNwYW4oMCwgMCwgZGlyZWN0aW9uID09IFJUTCA/IDEgOiAwKV07XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBMVFIgJiYgIWlzb2xhdGVzLmxlbmd0aCAmJiAhQmlkaVJFLnRlc3QobGluZSkpXG4gICAgICAgIHJldHVybiB0cml2aWFsT3JkZXIobGluZS5sZW5ndGgpO1xuICAgIGlmIChpc29sYXRlcy5sZW5ndGgpXG4gICAgICAgIHdoaWxlIChsaW5lLmxlbmd0aCA+IHR5cGVzLmxlbmd0aClcbiAgICAgICAgICAgIHR5cGVzW3R5cGVzLmxlbmd0aF0gPSAyNTYgLyogVC5OSSAqLzsgLy8gTWFrZSBzdXJlIHR5cGVzIGFycmF5IGhhcyBubyBnYXBzXG4gICAgbGV0IG9yZGVyID0gW10sIGxldmVsID0gZGlyZWN0aW9uID09IExUUiA/IDAgOiAxO1xuICAgIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgbGV2ZWwsIGxldmVsLCBpc29sYXRlcywgMCwgbGluZS5sZW5ndGgsIG9yZGVyKTtcbiAgICByZXR1cm4gb3JkZXI7XG59XG5mdW5jdGlvbiB0cml2aWFsT3JkZXIobGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtuZXcgQmlkaVNwYW4oMCwgbGVuZ3RoLCAwKV07XG59XG5sZXQgbW92ZWRPdmVyID0gXCJcIjtcbi8vIFRoaXMgaW1wbGVtZW50YXRpb24gbW92ZXMgc3RyaWN0bHkgdmlzdWFsbHksIHdpdGhvdXQgY29uY2VybiBmb3IgYVxuLy8gdHJhdmVyc2FsIHZpc2l0aW5nIGV2ZXJ5IGxvZ2ljYWwgcG9zaXRpb24gaW4gdGhlIHN0cmluZy4gSXQgd2lsbFxuLy8gc3RpbGwgZG8gc28gZm9yIHNpbXBsZSBpbnB1dCwgYnV0IHNpdHVhdGlvbnMgbGlrZSBtdWx0aXBsZSBpc29sYXRlc1xuLy8gd2l0aCB0aGUgc2FtZSBsZXZlbCBuZXh0IHRvIGVhY2ggb3RoZXIsIG9yIHRleHQgZ29pbmcgYWdhaW5zdCB0aGVcbi8vIG1haW4gZGlyIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIHdpbGwgbWFrZSBzb21lIHBvc2l0aW9uc1xuLy8gdW5yZWFjaGFibGUgd2l0aCB0aGlzIG1vdGlvbi4gRWFjaCB2aXNpYmxlIGN1cnNvciBwb3NpdGlvbiB3aWxsXG4vLyBjb3JyZXNwb25kIHRvIHRoZSBsb3dlci1sZXZlbCBiaWRpIHNwYW4gdGhhdCB0b3VjaGVzIGl0LlxuLy9cbi8vIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBzb2x2ZSBhbiBvcmRlciBnbG9iYWxseSBmb3IgYSBnaXZlblxuLy8gbGluZSwgbWFraW5nIHN1cmUgdGhhdCBpdCBpbmNsdWRlcyBldmVyeSBwb3NpdGlvbiwgYnV0IHRoYXQgd291bGRcbi8vIHJlcXVpcmUgYXNzb2NpYXRpbmcgbm9uLWNhbm9uaWNhbCAoaGlnaGVyIGJpZGkgc3BhbiBsZXZlbClcbi8vIHBvc2l0aW9ucyB3aXRoIGEgZ2l2ZW4gdmlzdWFsIHBvc2l0aW9uLCB3aGljaCBpcyBsaWtlbHkgdG8gY29uZnVzZVxuLy8gcGVvcGxlLiAoQW5kIHdvdWxkIGdlbmVyYWxseSBiZSBhIGxvdCBtb3JlIGNvbXBsaWNhdGVkLilcbmZ1bmN0aW9uIG1vdmVWaXN1YWxseShsaW5lLCBvcmRlciwgZGlyLCBzdGFydCwgZm9yd2FyZCkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgc3RhcnRJbmRleCA9IHN0YXJ0LmhlYWQgLSBsaW5lLmZyb207XG4gICAgbGV0IHNwYW5JID0gQmlkaVNwYW4uZmluZChvcmRlciwgc3RhcnRJbmRleCwgKF9hID0gc3RhcnQuYmlkaUxldmVsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAtMSwgc3RhcnQuYXNzb2MpO1xuICAgIGxldCBzcGFuID0gb3JkZXJbc3BhbkldLCBzcGFuRW5kID0gc3Bhbi5zaWRlKGZvcndhcmQsIGRpcik7XG4gICAgLy8gRW5kIG9mIHNwYW5cbiAgICBpZiAoc3RhcnRJbmRleCA9PSBzcGFuRW5kKSB7XG4gICAgICAgIGxldCBuZXh0SSA9IHNwYW5JICs9IGZvcndhcmQgPyAxIDogLTE7XG4gICAgICAgIGlmIChuZXh0SSA8IDAgfHwgbmV4dEkgPj0gb3JkZXIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHNwYW4gPSBvcmRlcltzcGFuSSA9IG5leHRJXTtcbiAgICAgICAgc3RhcnRJbmRleCA9IHNwYW4uc2lkZSghZm9yd2FyZCwgZGlyKTtcbiAgICAgICAgc3BhbkVuZCA9IHNwYW4uc2lkZShmb3J3YXJkLCBkaXIpO1xuICAgIH1cbiAgICBsZXQgbmV4dEluZGV4ID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIHN0YXJ0SW5kZXgsIHNwYW4uZm9yd2FyZChmb3J3YXJkLCBkaXIpKTtcbiAgICBpZiAobmV4dEluZGV4IDwgc3Bhbi5mcm9tIHx8IG5leHRJbmRleCA+IHNwYW4udG8pXG4gICAgICAgIG5leHRJbmRleCA9IHNwYW5FbmQ7XG4gICAgbW92ZWRPdmVyID0gbGluZS50ZXh0LnNsaWNlKE1hdGgubWluKHN0YXJ0SW5kZXgsIG5leHRJbmRleCksIE1hdGgubWF4KHN0YXJ0SW5kZXgsIG5leHRJbmRleCkpO1xuICAgIGxldCBuZXh0U3BhbiA9IHNwYW5JID09IChmb3J3YXJkID8gb3JkZXIubGVuZ3RoIC0gMSA6IDApID8gbnVsbCA6IG9yZGVyW3NwYW5JICsgKGZvcndhcmQgPyAxIDogLTEpXTtcbiAgICBpZiAobmV4dFNwYW4gJiYgbmV4dEluZGV4ID09IHNwYW5FbmQgJiYgbmV4dFNwYW4ubGV2ZWwgKyAoZm9yd2FyZCA/IDAgOiAxKSA8IHNwYW4ubGV2ZWwpXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG5leHRTcGFuLnNpZGUoIWZvcndhcmQsIGRpcikgKyBsaW5lLmZyb20sIG5leHRTcGFuLmZvcndhcmQoZm9yd2FyZCwgZGlyKSA/IDEgOiAtMSwgbmV4dFNwYW4ubGV2ZWwpO1xuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG5leHRJbmRleCArIGxpbmUuZnJvbSwgc3Bhbi5mb3J3YXJkKGZvcndhcmQsIGRpcikgPyAtMSA6IDEsIHNwYW4ubGV2ZWwpO1xufVxuZnVuY3Rpb24gYXV0b0RpcmVjdGlvbih0ZXh0LCBmcm9tLCB0bykge1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKykge1xuICAgICAgICBsZXQgdHlwZSA9IGNoYXJUeXBlKHRleHQuY2hhckNvZGVBdChpKSk7XG4gICAgICAgIGlmICh0eXBlID09IDEgLyogVC5MICovKVxuICAgICAgICAgICAgcmV0dXJuIExUUjtcbiAgICAgICAgaWYgKHR5cGUgPT0gMiAvKiBULlIgKi8gfHwgdHlwZSA9PSA0IC8qIFQuQUwgKi8pXG4gICAgICAgICAgICByZXR1cm4gUlRMO1xuICAgIH1cbiAgICByZXR1cm4gTFRSO1xufVxuXG5jb25zdCBjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGRyYWdNb3Zlc1NlbGVjdGlvbiQxID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgbW91c2VTZWxlY3Rpb25TdHlsZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGV4Y2VwdGlvblNpbmsgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB1cGRhdGVMaXN0ZW5lciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGlucHV0SGFuZGxlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGZvY3VzQ2hhbmdlRWZmZWN0ID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgcGVyTGluZVRleHREaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG5jb25zdCBuYXRpdmVTZWxlY3Rpb25IaWRkZW4gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG5jbGFzcyBTY3JvbGxUYXJnZXQge1xuICAgIGNvbnN0cnVjdG9yKHJhbmdlLCB5ID0gXCJuZWFyZXN0XCIsIHggPSBcIm5lYXJlc3RcIiwgeU1hcmdpbiA9IDUsIHhNYXJnaW4gPSA1LCBcbiAgICAvLyBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIGFidXNlZCB0byBhbHNvIHN0b3JlIHByZWNpc2Ugc2Nyb2xsXG4gICAgLy8gc25hcHNob3RzLCBpbnN0ZWFkIG9mIGEgYHNjcm9sbEludG9WaWV3YCByZXF1ZXN0LiBXaGVuIHRoaXNcbiAgICAvLyBmbGFnIGlzIGB0cnVlYCwgYHJhbmdlYCBwb2ludHMgYXQgYSBwb3NpdGlvbiBpbiB0aGUgcmVmZXJlbmNlXG4gICAgLy8gbGluZSwgYHlNYXJnaW5gIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRvcCBvZiB0aGF0XG4gICAgLy8gbGluZSBhbmQgdGhlIHRvcCBvZiB0aGUgZWRpdG9yLCBhbmQgYHhNYXJnaW5gIGhvbGRzIHRoZVxuICAgIC8vIGVkaXRvcidzIGBzY3JvbGxMZWZ0YC5cbiAgICBpc1NuYXBzaG90ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnlNYXJnaW4gPSB5TWFyZ2luO1xuICAgICAgICB0aGlzLnhNYXJnaW4gPSB4TWFyZ2luO1xuICAgICAgICB0aGlzLmlzU25hcHNob3QgPSBpc1NuYXBzaG90O1xuICAgIH1cbiAgICBtYXAoY2hhbmdlcykge1xuICAgICAgICByZXR1cm4gY2hhbmdlcy5lbXB0eSA/IHRoaXMgOlxuICAgICAgICAgICAgbmV3IFNjcm9sbFRhcmdldCh0aGlzLnJhbmdlLm1hcChjaGFuZ2VzKSwgdGhpcy55LCB0aGlzLngsIHRoaXMueU1hcmdpbiwgdGhpcy54TWFyZ2luLCB0aGlzLmlzU25hcHNob3QpO1xuICAgIH1cbiAgICBjbGlwKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlLnRvIDw9IHN0YXRlLmRvYy5sZW5ndGggPyB0aGlzIDpcbiAgICAgICAgICAgIG5ldyBTY3JvbGxUYXJnZXQoRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihzdGF0ZS5kb2MubGVuZ3RoKSwgdGhpcy55LCB0aGlzLngsIHRoaXMueU1hcmdpbiwgdGhpcy54TWFyZ2luLCB0aGlzLmlzU25hcHNob3QpO1xuICAgIH1cbn1cbmNvbnN0IHNjcm9sbEludG9WaWV3ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7IG1hcDogKHQsIGNoKSA9PiB0Lm1hcChjaCkgfSk7XG4vKipcbkxvZyBvciByZXBvcnQgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBjbGllbnQgY29kZS4gU2hvdWxkXG5wcm9iYWJseSBvbmx5IGJlIHVzZWQgYnkgZXh0ZW5zaW9uIGNvZGUgdGhhdCBhbGxvd3MgY2xpZW50IGNvZGUgdG9cbnByb3ZpZGUgZnVuY3Rpb25zLCBhbmQgY2FsbHMgdGhvc2UgZnVuY3Rpb25zIGluIGEgY29udGV4dCB3aGVyZSBhblxuZXhjZXB0aW9uIGNhbid0IGJlIHByb3BhZ2F0ZWQgdG8gY2FsbGluZyBjb2RlIGluIGEgcmVhc29uYWJsZSB3YXlcbihmb3IgZXhhbXBsZSB3aGVuIGluIGFuIGV2ZW50IGhhbmRsZXIpLlxuXG5FaXRoZXIgY2FsbHMgYSBoYW5kbGVyIHJlZ2lzdGVyZWQgd2l0aFxuW2BFZGl0b3JWaWV3LmV4Y2VwdGlvblNpbmtgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15leGNlcHRpb25TaW5rKSxcbmB3aW5kb3cub25lcnJvcmAsIGlmIGRlZmluZWQsIG9yIGBjb25zb2xlLmVycm9yYCAoaW4gd2hpY2ggY2FzZVxuaXQnbGwgcGFzcyBgY29udGV4dGAsIHdoZW4gZ2l2ZW4sIGFzIGZpcnN0IGFyZ3VtZW50KS5cbiovXG5mdW5jdGlvbiBsb2dFeGNlcHRpb24oc3RhdGUsIGV4Y2VwdGlvbiwgY29udGV4dCkge1xuICAgIGxldCBoYW5kbGVyID0gc3RhdGUuZmFjZXQoZXhjZXB0aW9uU2luayk7XG4gICAgaWYgKGhhbmRsZXIubGVuZ3RoKVxuICAgICAgICBoYW5kbGVyWzBdKGV4Y2VwdGlvbik7XG4gICAgZWxzZSBpZiAod2luZG93Lm9uZXJyb3IpXG4gICAgICAgIHdpbmRvdy5vbmVycm9yKFN0cmluZyhleGNlcHRpb24pLCBjb250ZXh0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZXhjZXB0aW9uKTtcbiAgICBlbHNlIGlmIChjb250ZXh0KVxuICAgICAgICBjb25zb2xlLmVycm9yKGNvbnRleHQgKyBcIjpcIiwgZXhjZXB0aW9uKTtcbiAgICBlbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXhjZXB0aW9uKTtcbn1cbmNvbnN0IGVkaXRhYmxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogdHJ1ZSB9KTtcbmxldCBuZXh0UGx1Z2luSUQgPSAwO1xuY29uc3Qgdmlld1BsdWdpbiA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuVmlldyBwbHVnaW5zIGFzc29jaWF0ZSBzdGF0ZWZ1bCB2YWx1ZXMgd2l0aCBhIHZpZXcuIFRoZXkgY2FuXG5pbmZsdWVuY2UgdGhlIHdheSB0aGUgY29udGVudCBpcyBkcmF3biwgYW5kIGFyZSBub3RpZmllZCBvZiB0aGluZ3NcbnRoYXQgaGFwcGVuIGluIHRoZSB2aWV3LlxuKi9cbmNsYXNzIFZpZXdQbHVnaW4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaWQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY3JlYXRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGRvbUV2ZW50SGFuZGxlcnMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tRXZlbnRPYnNlcnZlcnMsIGJ1aWxkRXh0ZW5zaW9ucykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuY3JlYXRlID0gY3JlYXRlO1xuICAgICAgICB0aGlzLmRvbUV2ZW50SGFuZGxlcnMgPSBkb21FdmVudEhhbmRsZXJzO1xuICAgICAgICB0aGlzLmRvbUV2ZW50T2JzZXJ2ZXJzID0gZG9tRXZlbnRPYnNlcnZlcnM7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gYnVpbGRFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBwbHVnaW4gZnJvbSBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyB0aGVcbiAgICBwbHVnaW4ncyB2YWx1ZSwgZ2l2ZW4gYW4gZWRpdG9yIHZpZXcuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKGNyZWF0ZSwgc3BlYykge1xuICAgICAgICBjb25zdCB7IGV2ZW50SGFuZGxlcnMsIGV2ZW50T2JzZXJ2ZXJzLCBwcm92aWRlLCBkZWNvcmF0aW9uczogZGVjbyB9ID0gc3BlYyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3UGx1Z2luKG5leHRQbHVnaW5JRCsrLCBjcmVhdGUsIGV2ZW50SGFuZGxlcnMsIGV2ZW50T2JzZXJ2ZXJzLCBwbHVnaW4gPT4ge1xuICAgICAgICAgICAgbGV0IGV4dCA9IFt2aWV3UGx1Z2luLm9mKHBsdWdpbildO1xuICAgICAgICAgICAgaWYgKGRlY28pXG4gICAgICAgICAgICAgICAgZXh0LnB1c2goZGVjb3JhdGlvbnMub2YodmlldyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwbHVnaW5JbnN0ID0gdmlldy5wbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsdWdpbkluc3QgPyBkZWNvKHBsdWdpbkluc3QpIDogRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlKVxuICAgICAgICAgICAgICAgIGV4dC5wdXNoKHByb3ZpZGUocGx1Z2luKSk7XG4gICAgICAgICAgICByZXR1cm4gZXh0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGx1Z2luIGZvciBhIGNsYXNzIHdob3NlIGNvbnN0cnVjdG9yIHRha2VzIGEgc2luZ2xlXG4gICAgZWRpdG9yIHZpZXcgYXMgYXJndW1lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUNsYXNzKGNscywgc3BlYykge1xuICAgICAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUodmlldyA9PiBuZXcgY2xzKHZpZXcpLCBzcGVjKTtcbiAgICB9XG59XG5jbGFzcyBQbHVnaW5JbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICAvLyBXaGVuIHN0YXJ0aW5nIGFuIHVwZGF0ZSwgYWxsIHBsdWdpbnMgaGF2ZSB0aGlzIGZpZWxkIHNldCB0byB0aGVcbiAgICAgICAgLy8gdXBkYXRlIG9iamVjdCwgaW5kaWNhdGluZyB0aGV5IG5lZWQgdG8gYmUgdXBkYXRlZC4gV2hlbiBmaW5pc2hlZFxuICAgICAgICAvLyB1cGRhdGluZywgaXQgaXMgc2V0IHRvIGBmYWxzZWAuIFJldHJpZXZpbmcgYSBwbHVnaW4gdGhhdCBuZWVkcyB0b1xuICAgICAgICAvLyBiZSB1cGRhdGVkIHdpdGggYHZpZXcucGx1Z2luYCBmb3JjZXMgYW4gZWFnZXIgdXBkYXRlLlxuICAgICAgICB0aGlzLm11c3RVcGRhdGUgPSBudWxsO1xuICAgICAgICAvLyBUaGlzIGlzIG51bGwgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxseSBjcmVhdGVkLCBidXRcbiAgICAgICAgLy8gaW5pdGlhbGl6ZWQgb24gdGhlIGZpcnN0IHVwZGF0ZS5cbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHVwZGF0ZSh2aWV3KSB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3BlYykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnNwZWMuY3JlYXRlKHZpZXcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odmlldy5zdGF0ZSwgZSwgXCJDb2RlTWlycm9yIHBsdWdpbiBjcmFzaGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5tdXN0VXBkYXRlKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlID0gdGhpcy5tdXN0VXBkYXRlO1xuICAgICAgICAgICAgdGhpcy5tdXN0VXBkYXRlID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLnVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih1cGRhdGUuc3RhdGUsIGUsIFwiQ29kZU1pcnJvciBwbHVnaW4gY3Jhc2hlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUuZGVzdHJveSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVzdHJveSh2aWV3KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKChfYSA9IHRoaXMudmFsdWUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZXN0cm95KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odmlldy5zdGF0ZSwgZSwgXCJDb2RlTWlycm9yIHBsdWdpbiBjcmFzaGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlYWN0aXZhdGUoKSB7XG4gICAgICAgIHRoaXMuc3BlYyA9IHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbn1cbmNvbnN0IGVkaXRvckF0dHJpYnV0ZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBjb250ZW50QXR0cmlidXRlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8vIFByb3ZpZGUgZGVjb3JhdGlvbnNcbmNvbnN0IGRlY29yYXRpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3Qgb3V0ZXJEZWNvcmF0aW9ucyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGF0b21pY1JhbmdlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGJpZGlJc29sYXRlZFJhbmdlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmZ1bmN0aW9uIGdldElzb2xhdGVkUmFuZ2VzKHZpZXcsIGxpbmUpIHtcbiAgICBsZXQgaXNvbGF0ZXMgPSB2aWV3LnN0YXRlLmZhY2V0KGJpZGlJc29sYXRlZFJhbmdlcyk7XG4gICAgaWYgKCFpc29sYXRlcy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBpc29sYXRlcztcbiAgICBsZXQgc2V0cyA9IGlzb2xhdGVzLm1hcChpID0+IGkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGkodmlldykgOiBpKTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgUmFuZ2VTZXQuc3BhbnMoc2V0cywgbGluZS5mcm9tLCBsaW5lLnRvLCB7XG4gICAgICAgIHBvaW50KCkgeyB9LFxuICAgICAgICBzcGFuKGZyb21Eb2MsIHRvRG9jLCBhY3RpdmUsIG9wZW4pIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gZnJvbURvYyAtIGxpbmUuZnJvbSwgdG8gPSB0b0RvYyAtIGxpbmUuZnJvbTtcbiAgICAgICAgICAgIGxldCBsZXZlbCA9IHJlc3VsdDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBhY3RpdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0sIG9wZW4tLSkge1xuICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPSBhY3RpdmVbaV0uc3BlYy5iaWRpSXNvbGF0ZSwgdXBkYXRlO1xuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gYXV0b0RpcmVjdGlvbihsaW5lLnRleHQsIGZyb20sIHRvKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbiA+IDAgJiYgbGV2ZWwubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICh1cGRhdGUgPSBsZXZlbFtsZXZlbC5sZW5ndGggLSAxXSkudG8gPT0gZnJvbSAmJiB1cGRhdGUuZGlyZWN0aW9uID09IGRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGUudG8gPSB0bztcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSB1cGRhdGUuaW5uZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkID0geyBmcm9tLCB0bywgZGlyZWN0aW9uLCBpbm5lcjogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwucHVzaChhZGQpO1xuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGFkZC5pbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3Qgc2Nyb2xsTWFyZ2lucyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmZ1bmN0aW9uIGdldFNjcm9sbE1hcmdpbnModmlldykge1xuICAgIGxldCBsZWZ0ID0gMCwgcmlnaHQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwO1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiB2aWV3LnN0YXRlLmZhY2V0KHNjcm9sbE1hcmdpbnMpKSB7XG4gICAgICAgIGxldCBtID0gc291cmNlKHZpZXcpO1xuICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgaWYgKG0ubGVmdCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCBtLmxlZnQpO1xuICAgICAgICAgICAgaWYgKG0ucmlnaHQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICByaWdodCA9IE1hdGgubWF4KHJpZ2h0LCBtLnJpZ2h0KTtcbiAgICAgICAgICAgIGlmIChtLnRvcCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgbS50b3ApO1xuICAgICAgICAgICAgaWYgKG0uYm90dG9tICE9IG51bGwpXG4gICAgICAgICAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoYm90dG9tLCBtLmJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIH07XG59XG5jb25zdCBzdHlsZU1vZHVsZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNsYXNzIENoYW5nZWRSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikge1xuICAgICAgICB0aGlzLmZyb21BID0gZnJvbUE7XG4gICAgICAgIHRoaXMudG9BID0gdG9BO1xuICAgICAgICB0aGlzLmZyb21CID0gZnJvbUI7XG4gICAgICAgIHRoaXMudG9CID0gdG9CO1xuICAgIH1cbiAgICBqb2luKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlZFJhbmdlKE1hdGgubWluKHRoaXMuZnJvbUEsIG90aGVyLmZyb21BKSwgTWF0aC5tYXgodGhpcy50b0EsIG90aGVyLnRvQSksIE1hdGgubWluKHRoaXMuZnJvbUIsIG90aGVyLmZyb21CKSwgTWF0aC5tYXgodGhpcy50b0IsIG90aGVyLnRvQikpO1xuICAgIH1cbiAgICBhZGRUb1NldChzZXQpIHtcbiAgICAgICAgbGV0IGkgPSBzZXQubGVuZ3RoLCBtZSA9IHRoaXM7XG4gICAgICAgIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSBzZXRbaSAtIDFdO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmZyb21BID4gbWUudG9BKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJhbmdlLnRvQSA8IG1lLmZyb21BKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbWUgPSBtZS5qb2luKHJhbmdlKTtcbiAgICAgICAgICAgIHNldC5zcGxpY2UoaSAtIDEsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHNldC5zcGxpY2UoaSwgMCwgbWUpO1xuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgZXh0ZW5kV2l0aFJhbmdlcyhkaWZmLCByYW5nZXMpIHtcbiAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGRJID0gMCwgckkgPSAwLCBwb3NBID0gMCwgcG9zQiA9IDA7OyBkSSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGRJID09IGRpZmYubGVuZ3RoID8gbnVsbCA6IGRpZmZbZEldLCBvZmYgPSBwb3NBIC0gcG9zQjtcbiAgICAgICAgICAgIGxldCBlbmQgPSBuZXh0ID8gbmV4dC5mcm9tQiA6IDFlOTtcbiAgICAgICAgICAgIHdoaWxlIChySSA8IHJhbmdlcy5sZW5ndGggJiYgcmFuZ2VzW3JJXSA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gcmFuZ2VzW3JJXSwgdG8gPSByYW5nZXNbckkgKyAxXTtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbUIgPSBNYXRoLm1heChwb3NCLCBmcm9tKSwgdG9CID0gTWF0aC5taW4oZW5kLCB0byk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21CIDw9IHRvQilcbiAgICAgICAgICAgICAgICAgICAgbmV3IENoYW5nZWRSYW5nZShmcm9tQiArIG9mZiwgdG9CICsgb2ZmLCBmcm9tQiwgdG9CKS5hZGRUb1NldChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmICh0byA+IGVuZClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBySSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFuZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBuZXcgQ2hhbmdlZFJhbmdlKG5leHQuZnJvbUEsIG5leHQudG9BLCBuZXh0LmZyb21CLCBuZXh0LnRvQikuYWRkVG9TZXQocmVzdWx0KTtcbiAgICAgICAgICAgIHBvc0EgPSBuZXh0LnRvQTtcbiAgICAgICAgICAgIHBvc0IgPSBuZXh0LnRvQjtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuVmlldyBbcGx1Z2luc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LlZpZXdQbHVnaW4pIGFyZSBnaXZlbiBpbnN0YW5jZXMgb2YgdGhpc1xuY2xhc3MsIHdoaWNoIGRlc2NyaWJlIHdoYXQgaGFwcGVuZWQsIHdoZW5ldmVyIHRoZSB2aWV3IGlzIHVwZGF0ZWQuXG4qL1xuY2xhc3MgVmlld1VwZGF0ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGVkaXRvciB2aWV3IHRoYXQgdGhlIHVwZGF0ZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgKi9cbiAgICB2aWV3LCBcbiAgICAvKipcbiAgICBUaGUgbmV3IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvKipcbiAgICBUaGUgdHJhbnNhY3Rpb25zIGludm9sdmVkIGluIHRoZSB1cGRhdGUuIE1heSBiZSBlbXB0eS5cbiAgICAqL1xuICAgIHRyYW5zYWN0aW9ucykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0gdHJhbnNhY3Rpb25zO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZmxhZ3MgPSAwO1xuICAgICAgICB0aGlzLnN0YXJ0U3RhdGUgPSB2aWV3LnN0YXRlO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBDaGFuZ2VTZXQuZW1wdHkodGhpcy5zdGFydFN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpXG4gICAgICAgICAgICB0aGlzLmNoYW5nZXMgPSB0aGlzLmNoYW5nZXMuY29tcG9zZSh0ci5jaGFuZ2VzKTtcbiAgICAgICAgbGV0IGNoYW5nZWRSYW5nZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLml0ZXJDaGFuZ2VkUmFuZ2VzKChmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSA9PiBjaGFuZ2VkUmFuZ2VzLnB1c2gobmV3IENoYW5nZWRSYW5nZShmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSkpO1xuICAgICAgICB0aGlzLmNoYW5nZWRSYW5nZXMgPSBjaGFuZ2VkUmFuZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUodmlldywgc3RhdGUsIHRyYW5zYWN0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdVcGRhdGUodmlldywgc3RhdGUsIHRyYW5zYWN0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSBbdmlld3BvcnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnZpZXdwb3J0KSBvclxuICAgIFt2aXNpYmxlIHJhbmdlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudmlzaWJsZVJhbmdlcykgY2hhbmdlZCBpbiB0aGlzXG4gICAgdXBkYXRlLlxuICAgICovXG4gICAgZ2V0IHZpZXdwb3J0Q2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgNCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0ICovKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBoZWlnaHQgb2YgYSBibG9jayBlbGVtZW50IGluIHRoZSBlZGl0b3JcbiAgICBjaGFuZ2VkIGluIHRoaXMgdXBkYXRlLlxuICAgICovXG4gICAgZ2V0IGhlaWdodENoYW5nZWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5mbGFncyAmIDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhlIGRvY3VtZW50IHdhcyBtb2RpZmllZCBvciB0aGUgc2l6ZSBvZiB0aGVcbiAgICBlZGl0b3IsIG9yIGVsZW1lbnRzIHdpdGhpbiB0aGUgZWRpdG9yLCBjaGFuZ2VkLlxuICAgICovXG4gICAgZ2V0IGdlb21ldHJ5Q2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jQ2hhbmdlZCB8fCAodGhpcy5mbGFncyAmICg4IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi8gfCAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSkgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyB1cGRhdGUgaW5kaWNhdGVzIGEgZm9jdXMgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IGZvY3VzQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIGRvY3VtZW50IGNoYW5nZWQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgZG9jQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNoYW5nZXMuZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiB3YXMgZXhwbGljaXRseSBzZXQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgc2VsZWN0aW9uU2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5zZWxlY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBlbXB0eSgpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgPT0gMCAmJiB0aGlzLnRyYW5zYWN0aW9ucy5sZW5ndGggPT0gMDsgfVxufVxuXG5jbGFzcyBEb2NWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aDsgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwID0gW107XG4gICAgICAgIHRoaXMuZG9tQ2hhbmdlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFzQ29tcG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uID0gbmV3IFNldDtcbiAgICAgICAgLy8gVHJhY2sgYSBtaW5pbXVtIHdpZHRoIGZvciB0aGUgZWRpdG9yLiBXaGVuIG1lYXN1cmluZyBzaXplcyBpblxuICAgICAgICAvLyBtZWFzdXJlVmlzaWJsZUxpbmVIZWlnaHRzLCB0aGlzIGlzIHVwZGF0ZWQgdG8gcG9pbnQgYXQgdGhlIHdpZHRoXG4gICAgICAgIC8vIG9mIGEgZ2l2ZW4gZWxlbWVudCBhbmQgaXRzIGV4dGVudCBpbiB0aGUgZG9jdW1lbnQuIFdoZW4gYSBjaGFuZ2VcbiAgICAgICAgLy8gaGFwcGVucyBpbiB0aGF0IHJhbmdlLCB0aGVzZSBhcmUgcmVzZXQuIFRoYXQgd2F5LCBvbmNlIHdlJ3ZlIHNlZW5cbiAgICAgICAgLy8gYSBsaW5lL2VsZW1lbnQgb2YgYSBnaXZlbiBsZW5ndGgsIHdlIGtlZXAgdGhlIGVkaXRvciB3aWRlIGVub3VnaFxuICAgICAgICAvLyB0byBmaXQgYXQgbGVhc3QgdGhhdCBlbGVtZW50LCB1bnRpbCBpdCBpcyBjaGFuZ2VkLCBhdCB3aGljaCBwb2ludFxuICAgICAgICAvLyB3ZSBmb3JnZXQgaXQgYWdhaW4uXG4gICAgICAgIHRoaXMubWluV2lkdGggPSAwO1xuICAgICAgICB0aGlzLm1pbldpZHRoRnJvbSA9IDA7XG4gICAgICAgIHRoaXMubWluV2lkdGhUbyA9IDA7XG4gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIERPTSBzZWxlY3Rpb24gd2FzIHNldCBpbiBhIGxvc3N5IHdheSwgc28gdGhhdFxuICAgICAgICAvLyB3ZSBkb24ndCBtZXNzIGl0IHVwIHdoZW4gcmVhZGluZyBpdCBiYWNrIGl0XG4gICAgICAgIHRoaXMuaW1wcmVjaXNlQW5jaG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbXByZWNpc2VIZWFkID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAvLyBVc2VkIGJ5IHRoZSByZXNpemUgb2JzZXJ2ZXIgdG8gaWdub3JlIHJlc2l6ZXMgdGhhdCB3ZSBjYXVzZWRcbiAgICAgICAgLy8gb3Vyc2VsdmVzXG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuc2V0RE9NKHZpZXcuY29udGVudERPTSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbbmV3IExpbmVWaWV3XTtcbiAgICAgICAgdGhpcy5jaGlsZHJlblswXS5zZXRQYXJlbnQodGhpcyk7XG4gICAgICAgIHRoaXMudXBkYXRlRGVjbygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUlubmVyKFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCldLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLy8gVXBkYXRlIHRoZSBkb2N1bWVudCB2aWV3IHRvIGEgZ2l2ZW4gc3RhdGUuXG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjaGFuZ2VkUmFuZ2VzID0gdXBkYXRlLmNoYW5nZWRSYW5nZXM7XG4gICAgICAgIGlmICh0aGlzLm1pbldpZHRoID4gMCAmJiBjaGFuZ2VkUmFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2VkUmFuZ2VzLmV2ZXJ5KCh7IGZyb21BLCB0b0EgfSkgPT4gdG9BIDwgdGhpcy5taW5XaWR0aEZyb20gfHwgZnJvbUEgPiB0aGlzLm1pbldpZHRoVG8pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aCA9IHRoaXMubWluV2lkdGhGcm9tID0gdGhpcy5taW5XaWR0aFRvID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGhGcm9tID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRoaXMubWluV2lkdGhGcm9tLCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoVG8gPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModGhpcy5taW5XaWR0aFRvLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVhZENvbXBvc2l0aW9uQXQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMudmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoKF9hID0gdGhpcy5kb21DaGFuZ2VkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmV3U2VsKVxuICAgICAgICAgICAgICAgIHJlYWRDb21wb3NpdGlvbkF0ID0gdGhpcy5kb21DaGFuZ2VkLm5ld1NlbC5oZWFkO1xuICAgICAgICAgICAgZWxzZSBpZiAoIXRvdWNoZXNDb21wb3NpdGlvbih1cGRhdGUuY2hhbmdlcywgdGhpcy5oYXNDb21wb3NpdGlvbikgJiYgIXVwZGF0ZS5zZWxlY3Rpb25TZXQpXG4gICAgICAgICAgICAgICAgcmVhZENvbXBvc2l0aW9uQXQgPSB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSByZWFkQ29tcG9zaXRpb25BdCA+IC0xID8gZmluZENvbXBvc2l0aW9uUmFuZ2UodGhpcy52aWV3LCB1cGRhdGUuY2hhbmdlcywgcmVhZENvbXBvc2l0aW9uQXQpIDogbnVsbDtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLmhhc0NvbXBvc2l0aW9uO1xuICAgICAgICAgICAgY2hhbmdlZFJhbmdlcyA9IG5ldyBDaGFuZ2VkUmFuZ2UoZnJvbSwgdG8sIHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyhmcm9tLCAtMSksIHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0bywgMSkpXG4gICAgICAgICAgICAgICAgLmFkZFRvU2V0KGNoYW5nZWRSYW5nZXMuc2xpY2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNDb21wb3NpdGlvbiA9IGNvbXBvc2l0aW9uID8geyBmcm9tOiBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgdG86IGNvbXBvc2l0aW9uLnJhbmdlLnRvQiB9IDogbnVsbDtcbiAgICAgICAgLy8gV2hlbiB0aGUgRE9NIG5vZGVzIGFyb3VuZCB0aGUgc2VsZWN0aW9uIGFyZSBtb3ZlZCB0byBhbm90aGVyXG4gICAgICAgIC8vIHBhcmVudCwgQ2hyb21lIHNvbWV0aW1lcyByZXBvcnRzIGEgZGlmZmVyZW50IHNlbGVjdGlvbiB0aHJvdWdoXG4gICAgICAgIC8vIGdldFNlbGVjdGlvbiB0aGFuIHRoZSBvbmUgdGhhdCBpdCBhY3R1YWxseSBzaG93cyB0byB0aGUgdXNlci5cbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBzZWxlY3Rpb24gdXBkYXRlIHdoZW4gbGluZXMgYXJlIGpvaW5lZCB0byB3b3JrXG4gICAgICAgIC8vIGFyb3VuZCB0aGF0LiBJc3N1ZSAjNTRcbiAgICAgICAgaWYgKChicm93c2VyLmllIHx8IGJyb3dzZXIuY2hyb21lKSAmJiAhY29tcG9zaXRpb24gJiYgdXBkYXRlICYmXG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuZG9jLmxpbmVzICE9IHVwZGF0ZS5zdGFydFN0YXRlLmRvYy5saW5lcylcbiAgICAgICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBsZXQgcHJldkRlY28gPSB0aGlzLmRlY29yYXRpb25zLCBkZWNvID0gdGhpcy51cGRhdGVEZWNvKCk7XG4gICAgICAgIGxldCBkZWNvRGlmZiA9IGZpbmRDaGFuZ2VkRGVjbyhwcmV2RGVjbywgZGVjbywgdXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBjaGFuZ2VkUmFuZ2VzID0gQ2hhbmdlZFJhbmdlLmV4dGVuZFdpdGhSYW5nZXMoY2hhbmdlZFJhbmdlcywgZGVjb0RpZmYpO1xuICAgICAgICBpZiAoISh0aGlzLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykgJiYgY2hhbmdlZFJhbmdlcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lcihjaGFuZ2VkUmFuZ2VzLCB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MubGVuZ3RoLCBjb21wb3NpdGlvbik7XG4gICAgICAgICAgICBpZiAodXBkYXRlLnRyYW5zYWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFVzZWQgYnkgdXBkYXRlIGFuZCB0aGUgY29uc3RydWN0b3IgZG8gcGVyZm9ybSB0aGUgYWN0dWFsIERPTVxuICAgIC8vIHVwZGF0ZVxuICAgIHVwZGF0ZUlubmVyKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5tdXN0TWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pO1xuICAgICAgICBsZXQgeyBvYnNlcnZlciB9ID0gdGhpcy52aWV3O1xuICAgICAgICBvYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTG9jayB0aGUgaGVpZ2h0IGR1cmluZyByZWRyYXdpbmcsIHNpbmNlIENocm9tZSBzb21ldGltZXNcbiAgICAgICAgICAgIC8vIG1lc3NlcyB3aXRoIHRoZSBzY3JvbGwgcG9zaXRpb24gZHVyaW5nIERPTSBtdXRhdGlvbiAodGhvdWdoXG4gICAgICAgICAgICAvLyBubyByZWxheW91dCBpcyB0cmlnZ2VyZWQgYW5kIEkgY2Fubm90IGltYWdpbmUgaG93IGl0IGNhblxuICAgICAgICAgICAgLy8gcmVjb21wdXRlIHRoZSBzY3JvbGwgcG9zaXRpb24gd2l0aG91dCBhIGxheW91dClcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IHRoaXMudmlldy52aWV3U3RhdGUuY29udGVudEhlaWdodCAvIHRoaXMudmlldy5zY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5mbGV4QmFzaXMgPSB0aGlzLm1pbldpZHRoID8gdGhpcy5taW5XaWR0aCArIFwicHhcIiA6IFwiXCI7XG4gICAgICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMsIHdoZW4gRE9NIG11dGF0aW9ucyBvY2N1ciBkaXJlY3RseVxuICAgICAgICAgICAgLy8gYXJvdW5kIHRoZSBzZWxlY3Rpb24sIGdldCBjb25mdXNlZCBhbmQgcmVwb3J0IGEgZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gZnJvbSB0aGUgb25lIGl0IGRpc3BsYXlzIChpc3N1ZSAjMjE4KS4gVGhpcyB0cmllc1xuICAgICAgICAgICAgLy8gdG8gZGV0ZWN0IHRoYXQgc2l0dWF0aW9uLlxuICAgICAgICAgICAgbGV0IHRyYWNrID0gYnJvd3Nlci5jaHJvbWUgfHwgYnJvd3Nlci5pb3MgPyB7IG5vZGU6IG9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSwgd3JpdHRlbjogZmFsc2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLnZpZXcsIHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MgJj0gfjcgLyogVmlld0ZsYWcuRGlydHkgKi87XG4gICAgICAgICAgICBpZiAodHJhY2sgJiYgKHRyYWNrLndyaXR0ZW4gfHwgb2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UuZm9jdXNOb2RlICE9IHRyYWNrLm5vZGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uZm9yRWFjaChjVmlldyA9PiBjVmlldy5mbGFncyAmPSB+OCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyk7XG4gICAgICAgIGxldCBnYXBzID0gW107XG4gICAgICAgIGlmICh0aGlzLnZpZXcudmlld3BvcnQuZnJvbSB8fCB0aGlzLnZpZXcudmlld3BvcnQudG8gPCB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aClcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3ICYmIGNoaWxkLndpZGdldCBpbnN0YW5jZW9mIEJsb2NrR2FwV2lkZ2V0KVxuICAgICAgICAgICAgICAgICAgICBnYXBzLnB1c2goY2hpbGQuZG9tKTtcbiAgICAgICAgb2JzZXJ2ZXIudXBkYXRlR2FwcyhnYXBzKTtcbiAgICB9XG4gICAgdXBkYXRlQ2hpbGRyZW4oY2hhbmdlcywgb2xkTGVuZ3RoLCBjb21wb3NpdGlvbikge1xuICAgICAgICBsZXQgcmFuZ2VzID0gY29tcG9zaXRpb24gPyBjb21wb3NpdGlvbi5yYW5nZS5hZGRUb1NldChjaGFuZ2VzLnNsaWNlKCkpIDogY2hhbmdlcztcbiAgICAgICAgbGV0IGN1cnNvciA9IHRoaXMuY2hpbGRDdXJzb3Iob2xkTGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHJhbmdlcy5sZW5ndGggLSAxOzsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGkgPj0gMCA/IHJhbmdlc1tpXSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgeyBmcm9tQSwgdG9BLCBmcm9tQiwgdG9CIH0gPSBuZXh0LCBjb250ZW50LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZDtcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiA8IHRvQiAmJiBjb21wb3NpdGlvbi5yYW5nZS50b0IgPiBmcm9tQikge1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBDb250ZW50QnVpbGRlci5idWlsZCh0aGlzLnZpZXcuc3RhdGUuZG9jLCBmcm9tQiwgY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApO1xuICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGNvbXBvc2l0aW9uLnJhbmdlLnRvQiwgdG9CLCB0aGlzLmRlY29yYXRpb25zLCB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgICAgICAgICBicmVha0F0U3RhcnQgPSBiZWZvcmUuYnJlYWtBdFN0YXJ0O1xuICAgICAgICAgICAgICAgIG9wZW5TdGFydCA9IGJlZm9yZS5vcGVuU3RhcnQ7XG4gICAgICAgICAgICAgICAgb3BlbkVuZCA9IGFmdGVyLm9wZW5FbmQ7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBMaW5lID0gdGhpcy5jb21wb3NpdGlvblZpZXcoY29tcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChhZnRlci5icmVha0F0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUuYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyLmNvbnRlbnQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLm1lcmdlKGNvbXBMaW5lLmxlbmd0aCwgY29tcExpbmUubGVuZ3RoLCBhZnRlci5jb250ZW50WzBdLCBmYWxzZSwgYWZ0ZXIub3BlblN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5icmVha0FmdGVyID0gYWZ0ZXIuY29udGVudFswXS5icmVha0FmdGVyO1xuICAgICAgICAgICAgICAgICAgICBhZnRlci5jb250ZW50LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUuY29udGVudC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUubWVyZ2UoMCwgMCwgYmVmb3JlLmNvbnRlbnRbYmVmb3JlLmNvbnRlbnQubGVuZ3RoIC0gMV0sIHRydWUsIDAsIGJlZm9yZS5vcGVuRW5kKSkge1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmUuY29udGVudC5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGJlZm9yZS5jb250ZW50LmNvbmNhdChjb21wTGluZSkuY29uY2F0KGFmdGVyLmNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgKHsgY29udGVudCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9XG4gICAgICAgICAgICAgICAgICAgIENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGZyb21CLCB0b0IsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB7IGk6IHRvSSwgb2ZmOiB0b09mZiB9ID0gY3Vyc29yLmZpbmRQb3ModG9BLCAxKTtcbiAgICAgICAgICAgIGxldCB7IGk6IGZyb21JLCBvZmY6IGZyb21PZmYgfSA9IGN1cnNvci5maW5kUG9zKGZyb21BLCAtMSk7XG4gICAgICAgICAgICByZXBsYWNlUmFuZ2UodGhpcywgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGNvbnRlbnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9zaXRpb24pXG4gICAgICAgICAgICB0aGlzLmZpeENvbXBvc2l0aW9uRE9NKGNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgY29tcG9zaXRpb25WaWV3KGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBjdXIgPSBuZXcgVGV4dFZpZXcoY29tcG9zaXRpb24udGV4dC5ub2RlVmFsdWUpO1xuICAgICAgICBjdXIuZmxhZ3MgfD0gOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLztcbiAgICAgICAgZm9yIChsZXQgeyBkZWNvIH0gb2YgY29tcG9zaXRpb24ubWFya3MpXG4gICAgICAgICAgICBjdXIgPSBuZXcgTWFya1ZpZXcoZGVjbywgW2N1cl0sIGN1ci5sZW5ndGgpO1xuICAgICAgICBsZXQgbGluZSA9IG5ldyBMaW5lVmlldztcbiAgICAgICAgbGluZS5hcHBlbmQoY3VyLCAwKTtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICAgIGZpeENvbXBvc2l0aW9uRE9NKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBmaXggPSAoZG9tLCBjVmlldykgPT4ge1xuICAgICAgICAgICAgY1ZpZXcuZmxhZ3MgfD0gOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyB8IChjVmlldy5jaGlsZHJlbi5zb21lKGMgPT4gYy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pID8gMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovIDogMCk7XG4gICAgICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uLmFkZChjVmlldyk7XG4gICAgICAgICAgICBsZXQgcHJldiA9IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldiAhPSBjVmlldylcbiAgICAgICAgICAgICAgICBwcmV2LmRvbSA9IG51bGw7XG4gICAgICAgICAgICBjVmlldy5zZXRET00oZG9tKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuY2hpbGRQb3MoY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIDEpO1xuICAgICAgICBsZXQgY1ZpZXcgPSB0aGlzLmNoaWxkcmVuW3Bvcy5pXTtcbiAgICAgICAgZml4KGNvbXBvc2l0aW9uLmxpbmUsIGNWaWV3KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbXBvc2l0aW9uLm1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gLTE7IGktLSkge1xuICAgICAgICAgICAgcG9zID0gY1ZpZXcuY2hpbGRQb3MocG9zLm9mZiwgMSk7XG4gICAgICAgICAgICBjVmlldyA9IGNWaWV3LmNoaWxkcmVuW3Bvcy5pXTtcbiAgICAgICAgICAgIGZpeChpID49IDAgPyBjb21wb3NpdGlvbi5tYXJrc1tpXS5ub2RlIDogY29tcG9zaXRpb24udGV4dCwgY1ZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFN5bmMgdGhlIERPTSBzZWxlY3Rpb24gdG8gdGhpcy5zdGF0ZS5zZWxlY3Rpb25cbiAgICB1cGRhdGVTZWxlY3Rpb24obXVzdFJlYWQgPSBmYWxzZSwgZnJvbVBvaW50ZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAobXVzdFJlYWQgfHwgIXRoaXMudmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZS5mb2N1c05vZGUpXG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBhY3RpdmVFbHQgPSB0aGlzLnZpZXcucm9vdC5hY3RpdmVFbGVtZW50LCBmb2N1c2VkID0gYWN0aXZlRWx0ID09IHRoaXMuZG9tO1xuICAgICAgICBsZXQgc2VsZWN0aW9uTm90Rm9jdXMgPSAhZm9jdXNlZCAmJlxuICAgICAgICAgICAgaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCB0aGlzLnZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UpICYmICEoYWN0aXZlRWx0ICYmIHRoaXMuZG9tLmNvbnRhaW5zKGFjdGl2ZUVsdCkpO1xuICAgICAgICBpZiAoIShmb2N1c2VkIHx8IGZyb21Qb2ludGVyIHx8IHNlbGVjdGlvbk5vdEZvY3VzKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGZvcmNlID0gdGhpcy5mb3JjZVNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICBsZXQgbWFpbiA9IHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgbGV0IGFuY2hvciA9IHRoaXMubW92ZVRvTGluZSh0aGlzLmRvbUF0UG9zKG1haW4uYW5jaG9yKSk7XG4gICAgICAgIGxldCBoZWFkID0gbWFpbi5lbXB0eSA/IGFuY2hvciA6IHRoaXMubW92ZVRvTGluZSh0aGlzLmRvbUF0UG9zKG1haW4uaGVhZCkpO1xuICAgICAgICAvLyBBbHdheXMgcmVzZXQgb24gRmlyZWZveCB3aGVuIG5leHQgdG8gYW4gdW5lZGl0YWJsZSBub2RlIHRvXG4gICAgICAgIC8vIGF2b2lkIGludmlzaWJsZSBjdXJzb3IgYnVncyAoIzExMSlcbiAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28gJiYgbWFpbi5lbXB0eSAmJiAhdGhpcy5oYXNDb21wb3NpdGlvbiAmJiBiZXR3ZWVuVW5lZGl0YWJsZShhbmNob3IpKSB7XG4gICAgICAgICAgICBsZXQgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4gYW5jaG9yLm5vZGUuaW5zZXJ0QmVmb3JlKGR1bW15LCBhbmNob3Iubm9kZS5jaGlsZE5vZGVzW2FuY2hvci5vZmZzZXRdIHx8IG51bGwpKTtcbiAgICAgICAgICAgIGFuY2hvciA9IGhlYWQgPSBuZXcgRE9NUG9zKGR1bW15LCAwKTtcbiAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZG9tU2VsID0gdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGFscmVhZHkgaGVyZSwgb3IgaW4gYW4gZXF1aXZhbGVudCBwb3NpdGlvbiwgZG9uJ3QgdG91Y2ggaXRcbiAgICAgICAgaWYgKGZvcmNlIHx8ICFkb21TZWwuZm9jdXNOb2RlIHx8ICghaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KSB8fFxuICAgICAgICAgICAgIWlzRXF1aXZhbGVudFBvc2l0aW9uKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQsIGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCkpICYmICF0aGlzLnN1cHByZXNzV2lkZ2V0Q3Vyc29yQ2hhbmdlKGRvbVNlbCwgbWFpbikpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENocm9tZSBBbmRyb2lkIHdpbGwgaGlkZSB0aGUgdmlydHVhbCBrZXlib2FyZCB3aGVuIHRhcHBpbmdcbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYW4gdW5lZGl0YWJsZSBub2RlLCBhbmQgbm90IGJyaW5nIGl0IGJhY2sgd2hlbiB3ZVxuICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIGN1cnNvciB0byBpdHMgcHJvcGVyIHBvc2l0aW9uLiBUaGlzIHRyaWVzIHRvXG4gICAgICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUga2V5Ym9hcmQgYnkgY3ljbGluZyBmb2N1cy5cbiAgICAgICAgICAgICAgICBpZiAoYnJvd3Nlci5hbmRyb2lkICYmIGJyb3dzZXIuY2hyb21lICYmIHRoaXMuZG9tLmNvbnRhaW5zKGRvbVNlbC5mb2N1c05vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgIGluVW5lZGl0YWJsZShkb21TZWwuZm9jdXNOb2RlLCB0aGlzLmRvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByYXdTZWwgPSBnZXRTZWxlY3Rpb24odGhpcy52aWV3LnJvb3QpO1xuICAgICAgICAgICAgICAgIGlmICghcmF3U2VsKSA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWFpbi5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjEyMDc2XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFRvID0gbmV4dFRvVW5lZGl0YWJsZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRvICYmIG5leHRUbyAhPSAoMSAvKiBOZXh0VG8uQmVmb3JlICovIHwgMiAvKiBOZXh0VG8uQWZ0ZXIgKi8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSBuZWFyYnlUZXh0Tm9kZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCwgbmV4dFRvID09IDEgLyogTmV4dFRvLkJlZm9yZSAqLyA/IDEgOiAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IG5ldyBET01Qb3ModGV4dC5ub2RlLCB0ZXh0Lm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmNvbGxhcHNlKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1haW4uYmlkaUxldmVsICE9IG51bGwgJiYgcmF3U2VsLmNhcmV0QmlkaUxldmVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdTZWwuY2FyZXRCaWRpTGV2ZWwgPSBtYWluLmJpZGlMZXZlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmF3U2VsLmV4dGVuZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3Rpb24uZXh0ZW5kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiAnaW52ZXJ0ZWQnIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAvLyAob25lIHdoZXJlIHRoZSBmb2N1cyBpcyBiZWZvcmUgdGhlIGFuY2hvciksIGJ1dCBub3QgYWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIGJyb3dzZXJzIHN1cHBvcnQgaXQgeWV0LlxuICAgICAgICAgICAgICAgICAgICByYXdTZWwuY29sbGFwc2UoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTYWZhcmkgd2lsbCBpZ25vcmUgdGhlIGNhbGwgYWJvdmUgd2hlbiB0aGUgZWRpdG9yIGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIGhpZGRlbiwgYW5kIHRoZW4gcmFpc2UgYW4gZXJyb3Igb24gdGhlIGNhbGwgdG8gZXh0ZW5kXG4gICAgICAgICAgICAgICAgICAgIC8vICgjOTQwKS5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1NlbC5leHRlbmQoaGVhZC5ub2RlLCBoZWFkLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWl0aXZlIChJRSkgd2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYWluLmFuY2hvciA+IG1haW4uaGVhZClcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbmNob3IsIGhlYWRdID0gW2hlYWQsIGFuY2hvcl07XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICByYXdTZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25Ob3RGb2N1cyAmJiB0aGlzLnZpZXcucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUVsdClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUVsdC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLnNldFNlbGVjdGlvblJhbmdlKGFuY2hvciwgaGVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbXByZWNpc2VBbmNob3IgPSBhbmNob3IucHJlY2lzZSA/IG51bGwgOiBuZXcgRE9NUG9zKGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5pbXByZWNpc2VIZWFkID0gaGVhZC5wcmVjaXNlID8gbnVsbCA6IG5ldyBET01Qb3MoZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gSWYgYSB6ZXJvLWxlbmd0aCB3aWRnZXQgaXMgaW5zZXJ0ZWQgbmV4dCB0byB0aGUgY3Vyc29yIGR1cmluZ1xuICAgIC8vIGNvbXBvc2l0aW9uLCBhdm9pZCBtb3ZpbmcgaXQgYWNyb3NzIGl0IGFuZCBkaXNydXB0aW5nIHRoZVxuICAgIC8vIGNvbXBvc2l0aW9uLlxuICAgIHN1cHByZXNzV2lkZ2V0Q3Vyc29yQ2hhbmdlKHNlbCwgY3Vyc29yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NvbXBvc2l0aW9uICYmIGN1cnNvci5lbXB0eSAmJlxuICAgICAgICAgICAgaXNFcXVpdmFsZW50UG9zaXRpb24oc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0LCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCkgJiZcbiAgICAgICAgICAgIHRoaXMucG9zRnJvbURPTShzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQpID09IGN1cnNvci5oZWFkO1xuICAgIH1cbiAgICBlbmZvcmNlQ3Vyc29yQXNzb2MoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbXBvc2l0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzLCBjdXJzb3IgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgICAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgICAgIGxldCB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCB9ID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKCFzZWwgfHwgIWN1cnNvci5lbXB0eSB8fCAhY3Vyc29yLmFzc29jIHx8ICFzZWwubW9kaWZ5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbGluZSA9IExpbmVWaWV3LmZpbmQodGhpcywgY3Vyc29yLmhlYWQpO1xuICAgICAgICBpZiAoIWxpbmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBsaW5lU3RhcnQgPSBsaW5lLnBvc0F0U3RhcnQ7XG4gICAgICAgIGlmIChjdXJzb3IuaGVhZCA9PSBsaW5lU3RhcnQgfHwgY3Vyc29yLmhlYWQgPT0gbGluZVN0YXJ0ICsgbGluZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBiZWZvcmUgPSB0aGlzLmNvb3Jkc0F0KGN1cnNvci5oZWFkLCAtMSksIGFmdGVyID0gdGhpcy5jb29yZHNBdChjdXJzb3IuaGVhZCwgMSk7XG4gICAgICAgIGlmICghYmVmb3JlIHx8ICFhZnRlciB8fCBiZWZvcmUuYm90dG9tID4gYWZ0ZXIudG9wKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZG9tID0gdGhpcy5kb21BdFBvcyhjdXJzb3IuaGVhZCArIGN1cnNvci5hc3NvYyk7XG4gICAgICAgIHNlbC5jb2xsYXBzZShkb20ubm9kZSwgZG9tLm9mZnNldCk7XG4gICAgICAgIHNlbC5tb2RpZnkoXCJtb3ZlXCIsIGN1cnNvci5hc3NvYyA8IDAgPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIiwgXCJsaW5lYm91bmRhcnlcIik7XG4gICAgICAgIC8vIFRoaXMgY2FuIGdvIHdyb25nIGluIGNvcm5lciBjYXNlcyBsaWtlIHNpbmdsZS1jaGFyYWN0ZXIgbGluZXMsXG4gICAgICAgIC8vIHNvIGNoZWNrIGFuZCByZXNldCBpZiBuZWNlc3NhcnkuXG4gICAgICAgIHZpZXcub2JzZXJ2ZXIucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBuZXdSYW5nZSA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIGlmICh2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShuZXdSYW5nZS5hbmNob3JOb2RlLCBuZXdSYW5nZS5hbmNob3JPZmZzZXQpICE9IGN1cnNvci5mcm9tKVxuICAgICAgICAgICAgc2VsLmNvbGxhcHNlKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCk7XG4gICAgfVxuICAgIC8vIElmIGEgcG9zaXRpb24gaXMgaW4vbmVhciBhIGJsb2NrIHdpZGdldCwgbW92ZSBpdCB0byBhIG5lYXJieSB0ZXh0XG4gICAgLy8gbGluZSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0aGUgY3Vyc29yIGluc2lkZSBhIGJsb2NrIHdpZGdldC5cbiAgICBtb3ZlVG9MaW5lKHBvcykge1xuICAgICAgICAvLyBCbG9jayB3aWRnZXRzIHdpbGwgcmV0dXJuIHBvc2l0aW9ucyBiZWZvcmUvYWZ0ZXIgdGhlbSwgd2hpY2hcbiAgICAgICAgLy8gYXJlIHRodXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50IERPTSBlbGVtZW50LlxuICAgICAgICBsZXQgZG9tID0gdGhpcy5kb20sIG5ld1BvcztcbiAgICAgICAgaWYgKHBvcy5ub2RlICE9IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIGZvciAobGV0IGkgPSBwb3Mub2Zmc2V0OyAhbmV3UG9zICYmIGkgPCBkb20uY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZpZXcgPSBDb250ZW50Vmlldy5nZXQoZG9tLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSB2aWV3LmRvbUF0UG9zKDApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBwb3Mub2Zmc2V0IC0gMTsgIW5ld1BvcyAmJiBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHZpZXcgPSBDb250ZW50Vmlldy5nZXQoZG9tLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSB2aWV3LmRvbUF0UG9zKHZpZXcubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3UG9zID8gbmV3IERPTVBvcyhuZXdQb3Mubm9kZSwgbmV3UG9zLm9mZnNldCwgdHJ1ZSkgOiBwb3M7XG4gICAgfVxuICAgIG5lYXJlc3QoZG9tKSB7XG4gICAgICAgIGZvciAobGV0IGN1ciA9IGRvbTsgY3VyOykge1xuICAgICAgICAgICAgbGV0IGRvbVZpZXcgPSBDb250ZW50Vmlldy5nZXQoY3VyKTtcbiAgICAgICAgICAgIGlmIChkb21WaWV3ICYmIGRvbVZpZXcucm9vdFZpZXcgPT0gdGhpcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tVmlldztcbiAgICAgICAgICAgIGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkge1xuICAgICAgICBsZXQgdmlldyA9IHRoaXMubmVhcmVzdChub2RlKTtcbiAgICAgICAgaWYgKCF2aWV3KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gZmluZCBwb3NpdGlvbiBmb3IgYSBET00gcG9zaXRpb24gb3V0c2lkZSBvZiB0aGUgZG9jdW1lbnRcIik7XG4gICAgICAgIHJldHVybiB2aWV3LmxvY2FsUG9zRnJvbURPTShub2RlLCBvZmZzZXQpICsgdmlldy5wb3NBdFN0YXJ0O1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgbGV0IHsgaSwgb2ZmIH0gPSB0aGlzLmNoaWxkQ3Vyc29yKCkuZmluZFBvcyhwb3MsIC0xKTtcbiAgICAgICAgZm9yICg7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKG9mZiA8IGNoaWxkLmxlbmd0aCB8fCBjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgb2ZmID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltpXS5kb21BdFBvcyhvZmYpO1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IGJlc3QgPSBudWxsLCBiZXN0UG9zID0gMDtcbiAgICAgICAgZm9yIChsZXQgb2ZmID0gdGhpcy5sZW5ndGgsIGkgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmYgLSBjaGlsZC5icmVha0FmdGVyLCBzdGFydCA9IGVuZCAtIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPCBwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPD0gcG9zICYmIChzdGFydCA8IHBvcyB8fCBjaGlsZC5jb3ZlcnMoLTEpKSAmJiAoZW5kID4gcG9zIHx8IGNoaWxkLmNvdmVycygxKSkgJiZcbiAgICAgICAgICAgICAgICAoIWJlc3QgfHwgY2hpbGQgaW5zdGFuY2VvZiBMaW5lVmlldyAmJiAhKGJlc3QgaW5zdGFuY2VvZiBMaW5lVmlldyAmJiBzaWRlID49IDApKSkge1xuICAgICAgICAgICAgICAgIGJlc3QgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICBiZXN0UG9zID0gc3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgPSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdCA/IGJlc3QuY29vcmRzQXQocG9zIC0gYmVzdFBvcywgc2lkZSkgOiBudWxsO1xuICAgIH1cbiAgICBjb29yZHNGb3JDaGFyKHBvcykge1xuICAgICAgICBsZXQgeyBpLCBvZmYgfSA9IHRoaXMuY2hpbGRQb3MocG9zLCAxKSwgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAoY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyBpLCBvZmY6IGNoaWxkT2ZmIH0gPSBjaGlsZC5jaGlsZFBvcyhvZmYsIDEpO1xuICAgICAgICAgICAgZm9yICg7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBjaGlsZC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICgoY2hpbGQgPSBjaGlsZC5jaGlsZHJlbltpXSkubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGNoaWxkT2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGV4dFZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBlbmQgPSBmaW5kQ2x1c3RlckJyZWFrKGNoaWxkLnRleHQsIG9mZik7XG4gICAgICAgIGlmIChlbmQgPT0gb2ZmKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZWN0cyA9IHRleHRSYW5nZShjaGlsZC5kb20sIG9mZiwgZW5kKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKGkgPT0gcmVjdHMubGVuZ3RoIC0gMSB8fCByZWN0LnRvcCA8IHJlY3QuYm90dG9tICYmIHJlY3QubGVmdCA8IHJlY3QucmlnaHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIG1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModmlld3BvcnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCB7IGZyb20sIHRvIH0gPSB2aWV3cG9ydDtcbiAgICAgICAgbGV0IGNvbnRlbnRXaWR0aCA9IHRoaXMudmlldy5jb250ZW50RE9NLmNsaWVudFdpZHRoO1xuICAgICAgICBsZXQgaXNXaWRlciA9IGNvbnRlbnRXaWR0aCA+IE1hdGgubWF4KHRoaXMudmlldy5zY3JvbGxET00uY2xpZW50V2lkdGgsIHRoaXMubWluV2lkdGgpICsgMTtcbiAgICAgICAgbGV0IHdpZGVzdCA9IC0xLCBsdHIgPSB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChwb3MgPj0gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZFJlY3QgPSBjaGlsZC5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGRSZWN0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzV2lkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBjaGlsZC5kb20ubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdHMgPSBsYXN0ID8gY2xpZW50UmVjdHNGb3IobGFzdCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tyZWN0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGx0ciA/IHJlY3QucmlnaHQgLSBjaGlsZFJlY3QubGVmdCA6IGNoaWxkUmVjdC5yaWdodCAtIHJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IHdpZGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGVzdCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGggPSBjb250ZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSBwb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0ZXh0RGlyZWN0aW9uQXQocG9zKSB7XG4gICAgICAgIGxldCB7IGkgfSA9IHRoaXMuY2hpbGRQb3MocG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGlsZHJlbltpXS5kb20pLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gRGlyZWN0aW9uLlJUTCA6IERpcmVjdGlvbi5MVFI7XG4gICAgfVxuICAgIG1lYXN1cmVUZXh0U2l6ZSgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZSA9IGNoaWxkLm1lYXN1cmVUZXh0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyB3b3JrYWJsZSBsaW5lIGV4aXN0cywgZm9yY2UgYSBsYXlvdXQgb2YgYSBtZWFzdXJhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0O1xuICAgICAgICBkdW1teS5jbGFzc05hbWUgPSBcImNtLWxpbmVcIjtcbiAgICAgICAgZHVtbXkuc3R5bGUud2lkdGggPSBcIjk5OTk5cHhcIjtcbiAgICAgICAgZHVtbXkuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGR1bW15LnRleHRDb250ZW50ID0gXCJhYmMgZGVmIGdoaSBqa2wgbW5vIHBxciBzdHVcIjtcbiAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChkdW1teSk7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IGNsaWVudFJlY3RzRm9yKGR1bW15LmZpcnN0Q2hpbGQpWzBdO1xuICAgICAgICAgICAgbGluZUhlaWdodCA9IGR1bW15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNoYXJXaWR0aCA9IHJlY3QgPyByZWN0LndpZHRoIC8gMjcgOiA3O1xuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHJlY3QgPyByZWN0LmhlaWdodCA6IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBkdW1teS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCB9O1xuICAgIH1cbiAgICBjaGlsZEN1cnNvcihwb3MgPSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAvLyBNb3ZlIGJhY2sgdG8gc3RhcnQgb2YgbGFzdCBlbGVtZW50IHdoZW4gcG9zc2libGUsIHNvIHRoYXRcbiAgICAgICAgLy8gYENoaWxkQ3Vyc29yLmZpbmRQb3NgIGRvZXNuJ3QgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGVkZ2UgY2FzZVxuICAgICAgICAvLyBvZiBiZWluZyBhZnRlciB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgICBsZXQgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgIHBvcyAtPSB0aGlzLmNoaWxkcmVuWy0taV0ubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbmV3IENoaWxkQ3Vyc29yKHRoaXMuY2hpbGRyZW4sIHBvcywgaSk7XG4gICAgfVxuICAgIGNvbXB1dGVCbG9ja0dhcERlY28oKSB7XG4gICAgICAgIGxldCBkZWNvID0gW10sIHZzID0gdGhpcy52aWV3LnZpZXdTdGF0ZTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA9PSB2cy52aWV3cG9ydHMubGVuZ3RoID8gbnVsbCA6IHZzLnZpZXdwb3J0c1tpXTtcbiAgICAgICAgICAgIGxldCBlbmQgPSBuZXh0ID8gbmV4dC5mcm9tIC0gMSA6IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSAodnMubGluZUJsb2NrQXQoZW5kKS5ib3R0b20gLSB2cy5saW5lQmxvY2tBdChwb3MpLnRvcCkgLyB0aGlzLnZpZXcuc2NhbGVZO1xuICAgICAgICAgICAgICAgIGRlY28ucHVzaChEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBCbG9ja0dhcFdpZGdldChoZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpc0Jsb2NrR2FwOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pLnJhbmdlKHBvcywgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBuZXh0LnRvICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjbyk7XG4gICAgfVxuICAgIHVwZGF0ZURlY28oKSB7XG4gICAgICAgIGxldCBhbGxEZWNvID0gdGhpcy52aWV3LnN0YXRlLmZhY2V0KGRlY29yYXRpb25zKS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBkeW5hbWljID0gdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFtpXSA9IHR5cGVvZiBkID09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgICAgIHJldHVybiBkeW5hbWljID8gZCh0aGlzLnZpZXcpIDogZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBkeW5hbWljT3V0ZXIgPSBmYWxzZSwgb3V0ZXJEZWNvID0gdGhpcy52aWV3LnN0YXRlLmZhY2V0KG91dGVyRGVjb3JhdGlvbnMpLm1hcCgoZCwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSB0eXBlb2YgZCA9PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgICAgICBpZiAoZHluYW1pYylcbiAgICAgICAgICAgICAgICBkeW5hbWljT3V0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWMgPyBkKHRoaXMudmlldykgOiBkO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG91dGVyRGVjby5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXBbYWxsRGVjby5sZW5ndGhdID0gZHluYW1pY091dGVyO1xuICAgICAgICAgICAgYWxsRGVjby5wdXNoKFJhbmdlU2V0LmpvaW4ob3V0ZXJEZWNvKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IGFsbERlY28ubGVuZ3RoOyBpIDwgYWxsRGVjby5sZW5ndGggKyAzOyBpKyspXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2ldID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY29yYXRpb25zID0gW1xuICAgICAgICAgICAgLi4uYWxsRGVjbyxcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZUJsb2NrR2FwRGVjbygpLFxuICAgICAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5saW5lR2FwRGVjb1xuICAgICAgICBdO1xuICAgIH1cbiAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldC5pc1NuYXBzaG90KSB7XG4gICAgICAgICAgICBsZXQgcmVmID0gdGhpcy52aWV3LnZpZXdTdGF0ZS5saW5lQmxvY2tBdCh0YXJnZXQucmFuZ2UuaGVhZCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCA9IHJlZi50b3AgLSB0YXJnZXQueU1hcmdpbjtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCA9IHRhcmdldC54TWFyZ2luO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHJhbmdlIH0gPSB0YXJnZXQ7XG4gICAgICAgIGxldCByZWN0ID0gdGhpcy5jb29yZHNBdChyYW5nZS5oZWFkLCByYW5nZS5lbXB0eSA/IHJhbmdlLmFzc29jIDogcmFuZ2UuaGVhZCA+IHJhbmdlLmFuY2hvciA/IC0xIDogMSksIG90aGVyO1xuICAgICAgICBpZiAoIXJlY3QpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghcmFuZ2UuZW1wdHkgJiYgKG90aGVyID0gdGhpcy5jb29yZHNBdChyYW5nZS5hbmNob3IsIHJhbmdlLmFuY2hvciA+IHJhbmdlLmhlYWQgPyAtMSA6IDEpKSlcbiAgICAgICAgICAgIHJlY3QgPSB7IGxlZnQ6IE1hdGgubWluKHJlY3QubGVmdCwgb3RoZXIubGVmdCksIHRvcDogTWF0aC5taW4ocmVjdC50b3AsIG90aGVyLnRvcCksXG4gICAgICAgICAgICAgICAgcmlnaHQ6IE1hdGgubWF4KHJlY3QucmlnaHQsIG90aGVyLnJpZ2h0KSwgYm90dG9tOiBNYXRoLm1heChyZWN0LmJvdHRvbSwgb3RoZXIuYm90dG9tKSB9O1xuICAgICAgICBsZXQgbWFyZ2lucyA9IGdldFNjcm9sbE1hcmdpbnModGhpcy52aWV3KTtcbiAgICAgICAgbGV0IHRhcmdldFJlY3QgPSB7XG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBtYXJnaW5zLmxlZnQsIHRvcDogcmVjdC50b3AgLSBtYXJnaW5zLnRvcCxcbiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgbWFyZ2lucy5yaWdodCwgYm90dG9tOiByZWN0LmJvdHRvbSArIG1hcmdpbnMuYm90dG9tXG4gICAgICAgIH07XG4gICAgICAgIGxldCB7IG9mZnNldFdpZHRoLCBvZmZzZXRIZWlnaHQgfSA9IHRoaXMudmlldy5zY3JvbGxET007XG4gICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLnZpZXcuc2Nyb2xsRE9NLCB0YXJnZXRSZWN0LCByYW5nZS5oZWFkIDwgcmFuZ2UuYW5jaG9yID8gLTEgOiAxLCB0YXJnZXQueCwgdGFyZ2V0LnksIE1hdGgubWF4KE1hdGgubWluKHRhcmdldC54TWFyZ2luLCBvZmZzZXRXaWR0aCksIC1vZmZzZXRXaWR0aCksIE1hdGgubWF4KE1hdGgubWluKHRhcmdldC55TWFyZ2luLCBvZmZzZXRIZWlnaHQpLCAtb2Zmc2V0SGVpZ2h0KSwgdGhpcy52aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUik7XG4gICAgfVxufVxuZnVuY3Rpb24gYmV0d2VlblVuZWRpdGFibGUocG9zKSB7XG4gICAgcmV0dXJuIHBvcy5ub2RlLm5vZGVUeXBlID09IDEgJiYgcG9zLm5vZGUuZmlyc3RDaGlsZCAmJlxuICAgICAgICAocG9zLm9mZnNldCA9PSAwIHx8IHBvcy5ub2RlLmNoaWxkTm9kZXNbcG9zLm9mZnNldCAtIDFdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpICYmXG4gICAgICAgIChwb3Mub2Zmc2V0ID09IHBvcy5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoIHx8IHBvcy5ub2RlLmNoaWxkTm9kZXNbcG9zLm9mZnNldF0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIik7XG59XG5jbGFzcyBCbG9ja0dhcFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGhlaWdodCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbHQuY2xhc3NOYW1lID0gXCJjbS1nYXBcIjtcbiAgICAgICAgdGhpcy51cGRhdGVET00oZWx0KTtcbiAgICAgICAgcmV0dXJuIGVsdDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLmhlaWdodCA9PSB0aGlzLmhlaWdodDsgfVxuICAgIHVwZGF0ZURPTShlbHQpIHtcbiAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGVkaXRhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBlc3RpbWF0ZWRIZWlnaHQoKSB7IHJldHVybiB0aGlzLmhlaWdodDsgfVxufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3LCBoZWFkUG9zKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgbGV0IHRleHROb2RlID0gc2VsLmZvY3VzTm9kZSAmJiBuZWFyYnlUZXh0Tm9kZShzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIDApO1xuICAgIGlmICghdGV4dE5vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmcm9tID0gaGVhZFBvcyAtIHRleHROb2RlLm9mZnNldDtcbiAgICByZXR1cm4geyBmcm9tLCB0bzogZnJvbSArIHRleHROb2RlLm5vZGUubm9kZVZhbHVlLmxlbmd0aCwgbm9kZTogdGV4dE5vZGUubm9kZSB9O1xufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uUmFuZ2UodmlldywgY2hhbmdlcywgaGVhZFBvcykge1xuICAgIGxldCBmb3VuZCA9IGZpbmRDb21wb3NpdGlvbk5vZGUodmlldywgaGVhZFBvcyk7XG4gICAgaWYgKCFmb3VuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHsgbm9kZTogdGV4dE5vZGUsIGZyb20sIHRvIH0gPSBmb3VuZCwgdGV4dCA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAvLyBEb24ndCB0cnkgdG8gcHJlc2VydmUgbXVsdGktbGluZSBjb21wb3NpdGlvbnNcbiAgICBpZiAoL1tcXG5cXHJdLy50ZXN0KHRleHQpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoZm91bmQuZnJvbSwgZm91bmQudG8pICE9IHRleHQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBpbnYgPSBjaGFuZ2VzLmludmVydGVkRGVzYztcbiAgICBsZXQgcmFuZ2UgPSBuZXcgQ2hhbmdlZFJhbmdlKGludi5tYXBQb3MoZnJvbSksIGludi5tYXBQb3ModG8pLCBmcm9tLCB0byk7XG4gICAgbGV0IG1hcmtzID0gW107XG4gICAgZm9yIChsZXQgcGFyZW50ID0gdGV4dE5vZGUucGFyZW50Tm9kZTs7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGxldCBwYXJlbnRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KHBhcmVudCk7XG4gICAgICAgIGlmIChwYXJlbnRWaWV3IGluc3RhbmNlb2YgTWFya1ZpZXcpXG4gICAgICAgICAgICBtYXJrcy5wdXNoKHsgbm9kZTogcGFyZW50LCBkZWNvOiBwYXJlbnRWaWV3Lm1hcmsgfSk7XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudFZpZXcgaW5zdGFuY2VvZiBMaW5lVmlldyB8fCBwYXJlbnQubm9kZU5hbWUgPT0gXCJESVZcIiAmJiBwYXJlbnQucGFyZW50Tm9kZSA9PSB2aWV3LmNvbnRlbnRET00pXG4gICAgICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dDogdGV4dE5vZGUsIG1hcmtzLCBsaW5lOiBwYXJlbnQgfTtcbiAgICAgICAgZWxzZSBpZiAocGFyZW50ICE9IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgICAgIG1hcmtzLnB1c2goeyBub2RlOiBwYXJlbnQsIGRlY286IG5ldyBNYXJrRGVjb3JhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogZ2V0QXR0cnMocGFyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZTogcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIH0pIH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiBuZWFyYnlUZXh0Tm9kZShzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0LCBzaWRlKSB7XG4gICAgaWYgKHNpZGUgPD0gMClcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHN0YXJ0Tm9kZSwgb2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Oykge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBtYXhPZmZzZXQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIGlmIChzaWRlID49IDApXG4gICAgICAgIGZvciAobGV0IG5vZGUgPSBzdGFydE5vZGUsIG9mZnNldCA9IHN0YXJ0T2Zmc2V0OzspIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogbm9kZSwgb2Zmc2V0OiBvZmZzZXQgfTtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAmJiBzaWRlID49IDApIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBuZXh0VG9VbmVkaXRhYmxlKG5vZGUsIG9mZnNldCkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpXG4gICAgICAgIHJldHVybiAwO1xuICAgIHJldHVybiAob2Zmc2V0ICYmIG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiID8gMSAvKiBOZXh0VG8uQmVmb3JlICovIDogMCkgfFxuICAgICAgICAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAmJiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiID8gMiAvKiBOZXh0VG8uQWZ0ZXIgKi8gOiAwKTtcbn1cbmxldCBEZWNvcmF0aW9uQ29tcGFyYXRvciQxID0gY2xhc3MgRGVjb3JhdGlvbkNvbXBhcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBbXTtcbiAgICB9XG4gICAgY29tcGFyZVJhbmdlKGZyb20sIHRvKSB7IGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMpOyB9XG4gICAgY29tcGFyZVBvaW50KGZyb20sIHRvKSB7IGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMpOyB9XG59O1xuZnVuY3Rpb24gZmluZENoYW5nZWREZWNvKGEsIGIsIGRpZmYpIHtcbiAgICBsZXQgY29tcCA9IG5ldyBEZWNvcmF0aW9uQ29tcGFyYXRvciQxO1xuICAgIFJhbmdlU2V0LmNvbXBhcmUoYSwgYiwgZGlmZiwgY29tcCk7XG4gICAgcmV0dXJuIGNvbXAuY2hhbmdlcztcbn1cbmZ1bmN0aW9uIGluVW5lZGl0YWJsZShub2RlLCBpbnNpZGUpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOyBjdXIgJiYgY3VyICE9IGluc2lkZTsgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZSkge1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDEgJiYgY3VyLmNvbnRlbnRFZGl0YWJsZSA9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0b3VjaGVzQ29tcG9zaXRpb24oY2hhbmdlcywgY29tcG9zaXRpb24pIHtcbiAgICBsZXQgdG91Y2hlZCA9IGZhbHNlO1xuICAgIGlmIChjb21wb3NpdGlvbilcbiAgICAgICAgY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgY29tcG9zaXRpb24udG8gJiYgdG8gPiBjb21wb3NpdGlvbi5mcm9tKVxuICAgICAgICAgICAgICAgIHRvdWNoZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hlZDtcbn1cblxuZnVuY3Rpb24gZ3JvdXBBdChzdGF0ZSwgcG9zLCBiaWFzID0gMSkge1xuICAgIGxldCBjYXRlZ29yaXplID0gc3RhdGUuY2hhckNhdGVnb3JpemVyKHBvcyk7XG4gICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcyksIGxpbmVQb3MgPSBwb3MgLSBsaW5lLmZyb207XG4gICAgaWYgKGxpbmUubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcyk7XG4gICAgaWYgKGxpbmVQb3MgPT0gMClcbiAgICAgICAgYmlhcyA9IDE7XG4gICAgZWxzZSBpZiAobGluZVBvcyA9PSBsaW5lLmxlbmd0aClcbiAgICAgICAgYmlhcyA9IC0xO1xuICAgIGxldCBmcm9tID0gbGluZVBvcywgdG8gPSBsaW5lUG9zO1xuICAgIGlmIChiaWFzIDwgMClcbiAgICAgICAgZnJvbSA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBsaW5lUG9zLCBmYWxzZSk7XG4gICAgZWxzZVxuICAgICAgICB0byA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBsaW5lUG9zKTtcbiAgICBsZXQgY2F0ID0gY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB3aGlsZSAoZnJvbSA+IDApIHtcbiAgICAgICAgbGV0IHByZXYgPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgZnJvbSwgZmFsc2UpO1xuICAgICAgICBpZiAoY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UocHJldiwgZnJvbSkpICE9IGNhdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBmcm9tID0gcHJldjtcbiAgICB9XG4gICAgd2hpbGUgKHRvIDwgbGluZS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgdG8pO1xuICAgICAgICBpZiAoY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UodG8sIG5leHQpKSAhPSBjYXQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgdG8gPSBuZXh0O1xuICAgIH1cbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20gKyBsaW5lLmZyb20sIHRvICsgbGluZS5mcm9tKTtcbn1cbi8vIFNlYXJjaCB0aGUgRE9NIGZvciB0aGUge25vZGUsIG9mZnNldH0gcG9zaXRpb24gY2xvc2VzdCB0byB0aGUgZ2l2ZW5cbi8vIGNvb3JkaW5hdGVzLiBWZXJ5IGluZWZmaWNpZW50IGFuZCBjcnVkZSwgYnV0IGNhbiB1c3VhbGx5IGJlIGF2b2lkZWRcbi8vIGJ5IGNhbGxpbmcgY2FyZXQoUG9zaXRpb258UmFuZ2UpRnJvbVBvaW50IGluc3RlYWQuXG5mdW5jdGlvbiBnZXRkeCh4LCByZWN0KSB7XG4gICAgcmV0dXJuIHJlY3QubGVmdCA+IHggPyByZWN0LmxlZnQgLSB4IDogTWF0aC5tYXgoMCwgeCAtIHJlY3QucmlnaHQpO1xufVxuZnVuY3Rpb24gZ2V0ZHkoeSwgcmVjdCkge1xuICAgIHJldHVybiByZWN0LnRvcCA+IHkgPyByZWN0LnRvcCAtIHkgOiBNYXRoLm1heCgwLCB5IC0gcmVjdC5ib3R0b20pO1xufVxuZnVuY3Rpb24geU92ZXJsYXAoYSwgYikge1xuICAgIHJldHVybiBhLnRvcCA8IGIuYm90dG9tIC0gMSAmJiBhLmJvdHRvbSA+IGIudG9wICsgMTtcbn1cbmZ1bmN0aW9uIHVwVG9wKHJlY3QsIHRvcCkge1xuICAgIHJldHVybiB0b3AgPCByZWN0LnRvcCA/IHsgdG9wLCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0LCBib3R0b206IHJlY3QuYm90dG9tIH0gOiByZWN0O1xufVxuZnVuY3Rpb24gdXBCb3QocmVjdCwgYm90dG9tKSB7XG4gICAgcmV0dXJuIGJvdHRvbSA+IHJlY3QuYm90dG9tID8geyB0b3A6IHJlY3QudG9wLCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0LCBib3R0b20gfSA6IHJlY3Q7XG59XG5mdW5jdGlvbiBkb21Qb3NBdENvb3JkcyhwYXJlbnQsIHgsIHkpIHtcbiAgICBsZXQgY2xvc2VzdCwgY2xvc2VzdFJlY3QsIGNsb3Nlc3RYLCBjbG9zZXN0WSwgY2xvc2VzdE92ZXJsYXAgPSBmYWxzZTtcbiAgICBsZXQgYWJvdmUsIGJlbG93LCBhYm92ZVJlY3QsIGJlbG93UmVjdDtcbiAgICBmb3IgKGxldCBjaGlsZCA9IHBhcmVudC5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihjaGlsZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAoY2xvc2VzdFJlY3QgJiYgeU92ZXJsYXAoY2xvc2VzdFJlY3QsIHJlY3QpKVxuICAgICAgICAgICAgICAgIHJlY3QgPSB1cFRvcCh1cEJvdChyZWN0LCBjbG9zZXN0UmVjdC5ib3R0b20pLCBjbG9zZXN0UmVjdC50b3ApO1xuICAgICAgICAgICAgbGV0IGR4ID0gZ2V0ZHgoeCwgcmVjdCksIGR5ID0gZ2V0ZHkoeSwgcmVjdCk7XG4gICAgICAgICAgICBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5ub2RlVHlwZSA9PSAzID8gZG9tUG9zSW5UZXh0KGNoaWxkLCB4LCB5KSA6IGRvbVBvc0F0Q29vcmRzKGNoaWxkLCB4LCB5KTtcbiAgICAgICAgICAgIGlmICghY2xvc2VzdCB8fCBjbG9zZXN0WSA+IGR5IHx8IGNsb3Nlc3RZID09IGR5ICYmIGNsb3Nlc3RYID4gZHgpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFJlY3QgPSByZWN0O1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RYID0gZHg7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFkgPSBkeTtcbiAgICAgICAgICAgICAgICBsZXQgc2lkZSA9IGR5ID8gKHkgPCByZWN0LnRvcCA/IC0xIDogMSkgOiBkeCA/ICh4IDwgcmVjdC5sZWZ0ID8gLTEgOiAxKSA6IDA7XG4gICAgICAgICAgICAgICAgY2xvc2VzdE92ZXJsYXAgPSAhc2lkZSB8fCAoc2lkZSA+IDAgPyBpIDwgcmVjdHMubGVuZ3RoIC0gMSA6IGkgPiAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkeCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHkgPiByZWN0LmJvdHRvbSAmJiAoIWFib3ZlUmVjdCB8fCBhYm92ZVJlY3QuYm90dG9tIDwgcmVjdC5ib3R0b20pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3ZlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGFib3ZlUmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHkgPCByZWN0LnRvcCAmJiAoIWJlbG93UmVjdCB8fCBiZWxvd1JlY3QudG9wID4gcmVjdC50b3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93UmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWJvdmVSZWN0ICYmIHlPdmVybGFwKGFib3ZlUmVjdCwgcmVjdCkpIHtcbiAgICAgICAgICAgICAgICBhYm92ZVJlY3QgPSB1cEJvdChhYm92ZVJlY3QsIHJlY3QuYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJlbG93UmVjdCAmJiB5T3ZlcmxhcChiZWxvd1JlY3QsIHJlY3QpKSB7XG4gICAgICAgICAgICAgICAgYmVsb3dSZWN0ID0gdXBUb3AoYmVsb3dSZWN0LCByZWN0LnRvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFib3ZlUmVjdCAmJiBhYm92ZVJlY3QuYm90dG9tID49IHkpIHtcbiAgICAgICAgY2xvc2VzdCA9IGFib3ZlO1xuICAgICAgICBjbG9zZXN0UmVjdCA9IGFib3ZlUmVjdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYmVsb3dSZWN0ICYmIGJlbG93UmVjdC50b3AgPD0geSkge1xuICAgICAgICBjbG9zZXN0ID0gYmVsb3c7XG4gICAgICAgIGNsb3Nlc3RSZWN0ID0gYmVsb3dSZWN0O1xuICAgIH1cbiAgICBpZiAoIWNsb3Nlc3QpXG4gICAgICAgIHJldHVybiB7IG5vZGU6IHBhcmVudCwgb2Zmc2V0OiAwIH07XG4gICAgbGV0IGNsaXBYID0gTWF0aC5tYXgoY2xvc2VzdFJlY3QubGVmdCwgTWF0aC5taW4oY2xvc2VzdFJlY3QucmlnaHQsIHgpKTtcbiAgICBpZiAoY2xvc2VzdC5ub2RlVHlwZSA9PSAzKVxuICAgICAgICByZXR1cm4gZG9tUG9zSW5UZXh0KGNsb3Nlc3QsIGNsaXBYLCB5KTtcbiAgICBpZiAoY2xvc2VzdE92ZXJsYXAgJiYgY2xvc2VzdC5jb250ZW50RWRpdGFibGUgIT0gXCJmYWxzZVwiKVxuICAgICAgICByZXR1cm4gZG9tUG9zQXRDb29yZHMoY2xvc2VzdCwgY2xpcFgsIHkpO1xuICAgIGxldCBvZmZzZXQgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHBhcmVudC5jaGlsZE5vZGVzLCBjbG9zZXN0KSArXG4gICAgICAgICh4ID49IChjbG9zZXN0UmVjdC5sZWZ0ICsgY2xvc2VzdFJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKTtcbiAgICByZXR1cm4geyBub2RlOiBwYXJlbnQsIG9mZnNldCB9O1xufVxuZnVuY3Rpb24gZG9tUG9zSW5UZXh0KG5vZGUsIHgsIHkpIHtcbiAgICBsZXQgbGVuID0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgIGxldCBjbG9zZXN0T2Zmc2V0ID0gLTEsIGNsb3Nlc3REWSA9IDFlOSwgZ2VuZXJhbFNpZGUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKG5vZGUsIGksIGkgKyAxKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgaWYgKHJlY3QudG9wID09IHJlY3QuYm90dG9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFnZW5lcmFsU2lkZSlcbiAgICAgICAgICAgICAgICBnZW5lcmFsU2lkZSA9IHggLSByZWN0LmxlZnQ7XG4gICAgICAgICAgICBsZXQgZHkgPSAocmVjdC50b3AgPiB5ID8gcmVjdC50b3AgLSB5IDogeSAtIHJlY3QuYm90dG9tKSAtIDE7XG4gICAgICAgICAgICBpZiAocmVjdC5sZWZ0IC0gMSA8PSB4ICYmIHJlY3QucmlnaHQgKyAxID49IHggJiYgZHkgPCBjbG9zZXN0RFkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmlnaHQgPSB4ID49IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIsIGFmdGVyID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuZ2Vja28pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFJUTCBvbiBicm93c2VycyB0aGF0IHN1cHBvcnQgZ2V0dGluZyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjdHMgZm9yIGVtcHR5IHJhbmdlcy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3RCZWZvcmUgPSB0ZXh0UmFuZ2Uobm9kZSwgaSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0QmVmb3JlLmxlZnQgPT0gcmVjdC5yaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gIXJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZHkgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBpICsgKGFmdGVyID8gMSA6IDApIH07XG4gICAgICAgICAgICAgICAgY2xvc2VzdE9mZnNldCA9IGkgKyAoYWZ0ZXIgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgY2xvc2VzdERZID0gZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBjbG9zZXN0T2Zmc2V0ID4gLTEgPyBjbG9zZXN0T2Zmc2V0IDogZ2VuZXJhbFNpZGUgPiAwID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogMCB9O1xufVxuZnVuY3Rpb24gcG9zQXRDb29yZHModmlldywgY29vcmRzLCBwcmVjaXNlLCBiaWFzID0gLTEpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBjb250ZW50ID0gdmlldy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkb2NUb3AgPSBjb250ZW50LnRvcCArIHZpZXcudmlld1N0YXRlLnBhZGRpbmdUb3A7XG4gICAgbGV0IGJsb2NrLCB7IGRvY0hlaWdodCB9ID0gdmlldy52aWV3U3RhdGU7XG4gICAgbGV0IHsgeCwgeSB9ID0gY29vcmRzLCB5T2Zmc2V0ID0geSAtIGRvY1RvcDtcbiAgICBpZiAoeU9mZnNldCA8IDApXG4gICAgICAgIHJldHVybiAwO1xuICAgIGlmICh5T2Zmc2V0ID4gZG9jSGVpZ2h0KVxuICAgICAgICByZXR1cm4gdmlldy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgIC8vIFNjYW4gZm9yIGEgdGV4dCBibG9jayBuZWFyIHRoZSBxdWVyaWVkIHkgcG9zaXRpb25cbiAgICBmb3IgKGxldCBoYWxmTGluZSA9IHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0IC8gMiwgYm91bmNlZCA9IGZhbHNlOzspIHtcbiAgICAgICAgYmxvY2sgPSB2aWV3LmVsZW1lbnRBdEhlaWdodCh5T2Zmc2V0KTtcbiAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgLy8gTW92ZSB0aGUgeSBwb3NpdGlvbiBvdXQgb2YgdGhpcyBibG9ja1xuICAgICAgICAgICAgeU9mZnNldCA9IGJpYXMgPiAwID8gYmxvY2suYm90dG9tICsgaGFsZkxpbmUgOiBibG9jay50b3AgLSBoYWxmTGluZTtcbiAgICAgICAgICAgIGlmICh5T2Zmc2V0ID49IDAgJiYgeU9mZnNldCA8PSBkb2NIZWlnaHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZG9jdW1lbnQgY29uc2lzdHMgZW50aXJlbHkgb2YgcmVwbGFjZWQgd2lkZ2V0cywgd2VcbiAgICAgICAgICAgIC8vIHdvbid0IGZpbmQgYSB0ZXh0IGJsb2NrLCBzbyByZXR1cm4gMFxuICAgICAgICAgICAgaWYgKGJvdW5jZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWNpc2UgPyBudWxsIDogMDtcbiAgICAgICAgICAgIGJvdW5jZWQgPSB0cnVlO1xuICAgICAgICAgICAgYmlhcyA9IC1iaWFzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHkgPSBkb2NUb3AgKyB5T2Zmc2V0O1xuICAgIGxldCBsaW5lU3RhcnQgPSBibG9jay5mcm9tO1xuICAgIC8vIElmIHRoaXMgaXMgb3V0c2lkZSBvZiB0aGUgcmVuZGVyZWQgdmlld3BvcnQsIHdlIGNhbid0IGRldGVybWluZSBhIHBvc2l0aW9uXG4gICAgaWYgKGxpbmVTdGFydCA8IHZpZXcudmlld3BvcnQuZnJvbSlcbiAgICAgICAgcmV0dXJuIHZpZXcudmlld3BvcnQuZnJvbSA9PSAwID8gMCA6IHByZWNpc2UgPyBudWxsIDogcG9zQXRDb29yZHNJbXByZWNpc2UodmlldywgY29udGVudCwgYmxvY2ssIHgsIHkpO1xuICAgIGlmIChsaW5lU3RhcnQgPiB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gdmlldy52aWV3cG9ydC50byA9PSB2aWV3LnN0YXRlLmRvYy5sZW5ndGggPyB2aWV3LnN0YXRlLmRvYy5sZW5ndGggOlxuICAgICAgICAgICAgcHJlY2lzZSA/IG51bGwgOiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50LCBibG9jaywgeCwgeSk7XG4gICAgLy8gUHJlZmVyIFNoYWRvd1Jvb3RPckRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQgaWYgcHJlc2VudCwgZmFsbCBiYWNrIHRvIGRvY3VtZW50IGlmIG5vdFxuICAgIGxldCBkb2MgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50O1xuICAgIGxldCByb290ID0gdmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQgPyB2aWV3LnJvb3QgOiBkb2M7XG4gICAgbGV0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgaWYgKGVsZW1lbnQgJiYgIXZpZXcuY29udGVudERPTS5jb250YWlucyhlbGVtZW50KSlcbiAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgdW5leHBlY3RlZCwgY2xpcCB4IGF0IHRoZSBzaWRlcyBvZiB0aGUgY29udGVudCBhcmVhIGFuZCB0cnkgYWdhaW5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgeCA9IE1hdGgubWF4KGNvbnRlbnQubGVmdCArIDEsIE1hdGgubWluKGNvbnRlbnQucmlnaHQgLSAxLCB4KSk7XG4gICAgICAgIGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIGlmIChlbGVtZW50ICYmICF2aWV3LmNvbnRlbnRET00uY29udGFpbnMoZWxlbWVudCkpXG4gICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlcmUncyB2aXNpYmxlIGVkaXRvciBjb250ZW50IHVuZGVyIHRoZSBwb2ludCwgc28gd2UgY2FuIHRyeVxuICAgIC8vIHVzaW5nIGNhcmV0KFBvc2l0aW9ufFJhbmdlKUZyb21Qb2ludCBhcyBhIHNob3J0Y3V0XG4gICAgbGV0IG5vZGUsIG9mZnNldCA9IC0xO1xuICAgIGlmIChlbGVtZW50ICYmICgoX2EgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChlbGVtZW50KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRWRpdGFibGUpICE9IGZhbHNlKSB7XG4gICAgICAgIGlmIChkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCkge1xuICAgICAgICAgICAgbGV0IHBvcyA9IGRvYy5jYXJldFBvc2l0aW9uRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICAgICAgaWYgKHBvcylcbiAgICAgICAgICAgICAgICAoeyBvZmZzZXROb2RlOiBub2RlLCBvZmZzZXQgfSA9IHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgKHsgc3RhcnRDb250YWluZXI6IG5vZGUsIHN0YXJ0T2Zmc2V0OiBvZmZzZXQgfSA9IHJhbmdlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZpZXcuY29udGVudERPTS5jb250YWlucyhub2RlKSB8fFxuICAgICAgICAgICAgICAgICAgICBicm93c2VyLnNhZmFyaSAmJiBpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHx8XG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuY2hyb21lICYmIGlzU3VzcGljaW91c0Nocm9tZUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTm8gbHVjaywgZG8gb3VyIG93biAocG90ZW50aWFsbHkgZXhwZW5zaXZlKSBzZWFyY2hcbiAgICBpZiAoIW5vZGUgfHwgIXZpZXcuZG9jVmlldy5kb20uY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgbGluZVN0YXJ0KTtcbiAgICAgICAgaWYgKCFsaW5lKVxuICAgICAgICAgICAgcmV0dXJuIHlPZmZzZXQgPiBibG9jay50b3AgKyBibG9jay5oZWlnaHQgLyAyID8gYmxvY2sudG8gOiBibG9jay5mcm9tO1xuICAgICAgICAoeyBub2RlLCBvZmZzZXQgfSA9IGRvbVBvc0F0Q29vcmRzKGxpbmUuZG9tLCB4LCB5KSk7XG4gICAgfVxuICAgIGxldCBuZWFyZXN0ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3Qobm9kZSk7XG4gICAgaWYgKCFuZWFyZXN0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAobmVhcmVzdC5pc1dpZGdldCAmJiAoKF9iID0gbmVhcmVzdC5kb20pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5ub2RlVHlwZSkgPT0gMSkge1xuICAgICAgICBsZXQgcmVjdCA9IG5lYXJlc3QuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4gY29vcmRzLnkgPCByZWN0LnRvcCB8fCBjb29yZHMueSA8PSByZWN0LmJvdHRvbSAmJiBjb29yZHMueCA8PSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyXG4gICAgICAgICAgICA/IG5lYXJlc3QucG9zQXRTdGFydCA6IG5lYXJlc3QucG9zQXRFbmQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmVhcmVzdC5sb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSArIG5lYXJlc3QucG9zQXRTdGFydDtcbiAgICB9XG59XG5mdW5jdGlvbiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50UmVjdCwgYmxvY2ssIHgsIHkpIHtcbiAgICBsZXQgaW50byA9IE1hdGgucm91bmQoKHggLSBjb250ZW50UmVjdC5sZWZ0KSAqIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoKTtcbiAgICBpZiAodmlldy5saW5lV3JhcHBpbmcgJiYgYmxvY2suaGVpZ2h0ID4gdmlldy5kZWZhdWx0TGluZUhlaWdodCAqIDEuNSkge1xuICAgICAgICBsZXQgdGV4dEhlaWdodCA9IHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0O1xuICAgICAgICBsZXQgbGluZSA9IE1hdGguZmxvb3IoKHkgLSBibG9jay50b3AgLSAodmlldy5kZWZhdWx0TGluZUhlaWdodCAtIHRleHRIZWlnaHQpICogMC41KSAvIHRleHRIZWlnaHQpO1xuICAgICAgICBpbnRvICs9IGxpbmUgKiB2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUubGluZUxlbmd0aDtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnQgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKGJsb2NrLmZyb20sIGJsb2NrLnRvKTtcbiAgICByZXR1cm4gYmxvY2suZnJvbSArIGZpbmRDb2x1bW4oY29udGVudCwgaW50bywgdmlldy5zdGF0ZS50YWJTaXplKTtcbn1cbi8vIEluIGNhc2Ugb2YgYSBoaWdoIGxpbmUgaGVpZ2h0LCBTYWZhcmkncyBjYXJldFJhbmdlRnJvbVBvaW50IHRyZWF0c1xuLy8gdGhlIHNwYWNlIGJldHdlZW4gbGluZXMgYXMgYmVsb25naW5nIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGVcbi8vIGxpbmUgYmVmb3JlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZWN0IHN1Y2ggYSByZXN1bHQgc28gdGhhdCBpdCBjYW4gYmVcbi8vIGlnbm9yZWQgKGlzc3VlICM0MDEpLlxuZnVuY3Rpb24gaXNTdXNwaWNpb3VzU2FmYXJpQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSB7XG4gICAgbGV0IGxlbjtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAzIHx8IG9mZnNldCAhPSAobGVuID0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5leHQgPSBub2RlLm5leHRTaWJsaW5nOyBuZXh0OyBuZXh0ID0gbmV4dC5uZXh0U2libGluZylcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgIT0gMSB8fCBuZXh0Lm5vZGVOYW1lICE9IFwiQlJcIilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGV4dFJhbmdlKG5vZGUsIGxlbiAtIDEsIGxlbikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA+IHg7XG59XG4vLyBDaHJvbWUgd2lsbCBtb3ZlIHBvc2l0aW9ucyBiZXR3ZWVuIGxpbmVzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lXG5mdW5jdGlvbiBpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHtcbiAgICBpZiAob2Zmc2V0ICE9IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOzspIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgIT0gMSB8fCBwYXJlbnQuZmlyc3RDaGlsZCAhPSBjdXIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY20tbGluZVwiKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjdXIgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGxldCByZWN0ID0gbm9kZS5ub2RlVHlwZSA9PSAxID8gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IHRleHRSYW5nZShub2RlLCAwLCBNYXRoLm1heChub2RlLm5vZGVWYWx1ZS5sZW5ndGgsIDEpKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4geCAtIHJlY3QubGVmdCA+IDU7XG59XG5mdW5jdGlvbiBibG9ja0F0KHZpZXcsIHBvcykge1xuICAgIGxldCBsaW5lID0gdmlldy5saW5lQmxvY2tBdChwb3MpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmUudHlwZSkpXG4gICAgICAgIGZvciAobGV0IGwgb2YgbGluZS50eXBlKSB7XG4gICAgICAgICAgICBpZiAobC50byA+IHBvcyB8fCBsLnRvID09IHBvcyAmJiAobC50byA9PSBsaW5lLnRvIHx8IGwudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGw7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbGluZTtcbn1cbmZ1bmN0aW9uIG1vdmVUb0xpbmVCb3VuZGFyeSh2aWV3LCBzdGFydCwgZm9yd2FyZCwgaW5jbHVkZVdyYXApIHtcbiAgICBsZXQgbGluZSA9IGJsb2NrQXQodmlldywgc3RhcnQuaGVhZCk7XG4gICAgbGV0IGNvb3JkcyA9ICFpbmNsdWRlV3JhcCB8fCBsaW5lLnR5cGUgIT0gQmxvY2tUeXBlLlRleHQgfHwgISh2aWV3LmxpbmVXcmFwcGluZyB8fCBsaW5lLndpZGdldExpbmVCcmVha3MpID8gbnVsbFxuICAgICAgICA6IHZpZXcuY29vcmRzQXRQb3Moc3RhcnQuYXNzb2MgPCAwICYmIHN0YXJ0LmhlYWQgPiBsaW5lLmZyb20gPyBzdGFydC5oZWFkIC0gMSA6IHN0YXJ0LmhlYWQpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgICAgbGV0IGVkaXRvclJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IGRpcmVjdGlvbiA9IHZpZXcudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeDogZm9yd2FyZCA9PSAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIpID8gZWRpdG9yUmVjdC5yaWdodCAtIDEgOiBlZGl0b3JSZWN0LmxlZnQgKyAxLFxuICAgICAgICAgICAgeTogKGNvb3Jkcy50b3AgKyBjb29yZHMuYm90dG9tKSAvIDIgfSk7XG4gICAgICAgIGlmIChwb3MgIT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgZm9yd2FyZCA/IC0xIDogMSk7XG4gICAgfVxuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKGZvcndhcmQgPyBsaW5lLnRvIDogbGluZS5mcm9tLCBmb3J3YXJkID8gLTEgOiAxKTtcbn1cbmZ1bmN0aW9uIG1vdmVCeUNoYXIodmlldywgc3RhcnQsIGZvcndhcmQsIGJ5KSB7XG4gICAgbGV0IGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoc3RhcnQuaGVhZCksIHNwYW5zID0gdmlldy5iaWRpU3BhbnMobGluZSk7XG4gICAgbGV0IGRpcmVjdGlvbiA9IHZpZXcudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgZm9yIChsZXQgY3VyID0gc3RhcnQsIGNoZWNrID0gbnVsbDs7KSB7XG4gICAgICAgIGxldCBuZXh0ID0gbW92ZVZpc3VhbGx5KGxpbmUsIHNwYW5zLCBkaXJlY3Rpb24sIGN1ciwgZm9yd2FyZCksIGNoYXIgPSBtb3ZlZE92ZXI7XG4gICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgaWYgKGxpbmUubnVtYmVyID09IChmb3J3YXJkID8gdmlldy5zdGF0ZS5kb2MubGluZXMgOiAxKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICAgICAgY2hhciA9IFwiXFxuXCI7XG4gICAgICAgICAgICBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZShsaW5lLm51bWJlciArIChmb3J3YXJkID8gMSA6IC0xKSk7XG4gICAgICAgICAgICBzcGFucyA9IHZpZXcuYmlkaVNwYW5zKGxpbmUpO1xuICAgICAgICAgICAgbmV4dCA9IHZpZXcudmlzdWFsTGluZVNpZGUobGluZSwgIWZvcndhcmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2spIHtcbiAgICAgICAgICAgIGlmICghYnkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICBjaGVjayA9IGJ5KGNoYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjaGVjayhjaGFyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cjtcbiAgICAgICAgfVxuICAgICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJ5R3JvdXAodmlldywgcG9zLCBzdGFydCkge1xuICAgIGxldCBjYXRlZ29yaXplID0gdmlldy5zdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICBsZXQgY2F0ID0gY2F0ZWdvcml6ZShzdGFydCk7XG4gICAgcmV0dXJuIChuZXh0KSA9PiB7XG4gICAgICAgIGxldCBuZXh0Q2F0ID0gY2F0ZWdvcml6ZShuZXh0KTtcbiAgICAgICAgaWYgKGNhdCA9PSBDaGFyQ2F0ZWdvcnkuU3BhY2UpXG4gICAgICAgICAgICBjYXQgPSBuZXh0Q2F0O1xuICAgICAgICByZXR1cm4gY2F0ID09IG5leHRDYXQ7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1vdmVWZXJ0aWNhbGx5KHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkge1xuICAgIGxldCBzdGFydFBvcyA9IHN0YXJ0LmhlYWQsIGRpciA9IGZvcndhcmQgPyAxIDogLTE7XG4gICAgaWYgKHN0YXJ0UG9zID09IChmb3J3YXJkID8gdmlldy5zdGF0ZS5kb2MubGVuZ3RoIDogMCkpXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHN0YXJ0UG9zLCBzdGFydC5hc3NvYyk7XG4gICAgbGV0IGdvYWwgPSBzdGFydC5nb2FsQ29sdW1uLCBzdGFydFk7XG4gICAgbGV0IHJlY3QgPSB2aWV3LmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHN0YXJ0Q29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhzdGFydFBvcywgc3RhcnQuYXNzb2MgfHwgLTEpLCBkb2NUb3AgPSB2aWV3LmRvY3VtZW50VG9wO1xuICAgIGlmIChzdGFydENvb3Jkcykge1xuICAgICAgICBpZiAoZ29hbCA9PSBudWxsKVxuICAgICAgICAgICAgZ29hbCA9IHN0YXJ0Q29vcmRzLmxlZnQgLSByZWN0LmxlZnQ7XG4gICAgICAgIHN0YXJ0WSA9IGRpciA8IDAgPyBzdGFydENvb3Jkcy50b3AgOiBzdGFydENvb3Jkcy5ib3R0b207XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcudmlld1N0YXRlLmxpbmVCbG9ja0F0KHN0YXJ0UG9zKTtcbiAgICAgICAgaWYgKGdvYWwgPT0gbnVsbClcbiAgICAgICAgICAgIGdvYWwgPSBNYXRoLm1pbihyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCAqIChzdGFydFBvcyAtIGxpbmUuZnJvbSkpO1xuICAgICAgICBzdGFydFkgPSAoZGlyIDwgMCA/IGxpbmUudG9wIDogbGluZS5ib3R0b20pICsgZG9jVG9wO1xuICAgIH1cbiAgICBsZXQgcmVzb2x2ZWRHb2FsID0gcmVjdC5sZWZ0ICsgZ29hbDtcbiAgICBsZXQgZGlzdCA9IGRpc3RhbmNlICE9PSBudWxsICYmIGRpc3RhbmNlICE9PSB2b2lkIDAgPyBkaXN0YW5jZSA6ICh2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUudGV4dEhlaWdodCA+PiAxKTtcbiAgICBmb3IgKGxldCBleHRyYSA9IDA7OyBleHRyYSArPSAxMCkge1xuICAgICAgICBsZXQgY3VyWSA9IHN0YXJ0WSArIChkaXN0ICsgZXh0cmEpICogZGlyO1xuICAgICAgICBsZXQgcG9zID0gcG9zQXRDb29yZHModmlldywgeyB4OiByZXNvbHZlZEdvYWwsIHk6IGN1clkgfSwgZmFsc2UsIGRpcik7XG4gICAgICAgIGlmIChjdXJZIDwgcmVjdC50b3AgfHwgY3VyWSA+IHJlY3QuYm90dG9tIHx8IChkaXIgPCAwID8gcG9zIDwgc3RhcnRQb3MgOiBwb3MgPiBzdGFydFBvcykpIHtcbiAgICAgICAgICAgIGxldCBjaGFyUmVjdCA9IHZpZXcuZG9jVmlldy5jb29yZHNGb3JDaGFyKHBvcyk7XG4gICAgICAgICAgICBsZXQgYXNzb2MgPSAhY2hhclJlY3QgfHwgY3VyWSA8IGNoYXJSZWN0LnRvcCA/IC0xIDogMTtcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgYXNzb2MsIHVuZGVmaW5lZCwgZ29hbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBza2lwQXRvbWljUmFuZ2VzKGF0b21zLCBwb3MsIGJpYXMpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBtb3ZlZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHNldCBvZiBhdG9tcykge1xuICAgICAgICAgICAgc2V0LmJldHdlZW4ocG9zIC0gMSwgcG9zICsgMSwgKGZyb20sIHRvLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIHBvcyA8IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWRlID0gbW92ZWQgfHwgYmlhcyB8fCAocG9zIC0gZnJvbSA8IHRvIC0gcG9zID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gc2lkZSA8IDAgPyBmcm9tIDogdG87XG4gICAgICAgICAgICAgICAgICAgIG1vdmVkID0gc2lkZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vdmVkKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG59XG5mdW5jdGlvbiBza2lwQXRvbXModmlldywgb2xkUG9zLCBwb3MpIHtcbiAgICBsZXQgbmV3UG9zID0gc2tpcEF0b21pY1Jhbmdlcyh2aWV3LnN0YXRlLmZhY2V0KGF0b21pY1JhbmdlcykubWFwKGYgPT4gZih2aWV3KSksIHBvcy5mcm9tLCBvbGRQb3MuaGVhZCA+IHBvcy5mcm9tID8gLTEgOiAxKTtcbiAgICByZXR1cm4gbmV3UG9zID09IHBvcy5mcm9tID8gcG9zIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihuZXdQb3MsIG5ld1BvcyA8IHBvcy5mcm9tID8gMSA6IC0xKTtcbn1cblxuLy8gVGhpcyB3aWxsIGFsc28gYmUgd2hlcmUgZHJhZ2dpbmcgaW5mbyBhbmQgc3VjaCBnb2VzXG5jbGFzcyBJbnB1dFN0YXRlIHtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4ob3JpZ2luKSB7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEtleVRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RUb3VjaFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxUb3AgPSAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgLy8gT24gaU9TLCBzb21lIGtleXMgbmVlZCB0byBoYXZlIHRoZWlyIGRlZmF1bHQgYmVoYXZpb3IgaGFwcGVuXG4gICAgICAgIC8vIChhZnRlciB3aGljaCB3ZSByZXRyb2FjdGl2ZWx5IGhhbmRsZSB0aGVtIGFuZCByZXNldCB0aGUgRE9NKSB0b1xuICAgICAgICAvLyBhdm9pZCBtZXNzaW5nIHVwIHRoZSB2aXJ0dWFsIGtleWJvYXJkIHN0YXRlLlxuICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RFc2NQcmVzcyA9IDA7XG4gICAgICAgIHRoaXMubGFzdENvbnRleHRNZW51ID0gMDtcbiAgICAgICAgdGhpcy5zY3JvbGxIYW5kbGVycyA9IFtdO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gLTEgbWVhbnMgbm90IGluIGEgY29tcG9zaXRpb24uIE90aGVyd2lzZSwgdGhpcyBjb3VudHMgdGhlIG51bWJlclxuICAgICAgICAvLyBvZiBjaGFuZ2VzIG1hZGUgZHVyaW5nIHRoZSBjb21wb3NpdGlvbi4gVGhlIGNvdW50IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gYXZvaWQgdHJlYXRpbmcgdGhlIHN0YXJ0IHN0YXRlIG9mIHRoZSBjb21wb3NpdGlvbiwgYmVmb3JlIGFueVxuICAgICAgICAvLyBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLCBhcyBwYXJ0IG9mIHRoZSBjb21wb3NpdGlvbi5cbiAgICAgICAgdGhpcy5jb21wb3NpbmcgPSAtMTtcbiAgICAgICAgLy8gVHJhY2tzIHdoZXRoZXIgdGhlIG5leHQgY2hhbmdlIHNob3VsZCBiZSBtYXJrZWQgYXMgc3RhcnRpbmcgdGhlXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uIChudWxsIG1lYW5zIG5vIGNvbXBvc2l0aW9uLCB0cnVlIG1lYW5zIG5leHQgaXMgdGhlXG4gICAgICAgIC8vIGZpcnN0LCBmYWxzZSBtZWFucyBmaXJzdCBoYXMgYWxyZWFkeSBiZWVuIG1hcmtlZCBmb3IgdGhpc1xuICAgICAgICAvLyBjb21wb3NpdGlvbilcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbkZpcnN0Q2hhbmdlID0gbnVsbDtcbiAgICAgICAgLy8gRW5kIHRpbWUgb2YgdGhlIHByZXZpb3VzIGNvbXBvc2l0aW9uXG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25FbmRlZEF0ID0gMDtcbiAgICAgICAgLy8gVXNlZCBpbiBhIGtsdWRnZSB0byBkZXRlY3Qgd2hlbiBhbiBFbnRlciBrZXlwcmVzcyBzaG91bGQgYmVcbiAgICAgICAgLy8gY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjb21wb3NpdGlvbiBvbiBTYWZhcmksIHdoaWNoIGZpcmVzIGV2ZW50c1xuICAgICAgICAvLyBpbiB0aGUgd3Jvbmcgb3JkZXJcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdLZXkgPSBmYWxzZTtcbiAgICAgICAgLy8gVXNlZCB0byBjYXRlZ29yaXplIGNoYW5nZXMgYXMgcGFydCBvZiBhIGNvbXBvc2l0aW9uLCBldmVuIHdoZW5cbiAgICAgICAgLy8gdGhlIG11dGF0aW9uIGV2ZW50cyBmaXJlIHNob3J0bHkgYWZ0ZXIgdGhlIGNvbXBvc2l0aW9uZW5kIGV2ZW50XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICAvLyBXaGVuIGEgZHJhZyBmcm9tIHRoZSBlZGl0b3IgaXMgYWN0aXZlLCB0aGlzIHBvaW50cyBhdCB0aGUgcmFuZ2VcbiAgICAgICAgLy8gYmVpbmcgZHJhZ2dlZC5cbiAgICAgICAgdGhpcy5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubm90aWZpZWRGb2N1c2VkID0gdmlldy5oYXNGb2N1cztcbiAgICAgICAgLy8gT24gU2FmYXJpIGFkZGluZyBhbiBpbnB1dCBldmVudCBoYW5kbGVyIHNvbWVob3cgcHJldmVudHMgYW5cbiAgICAgICAgLy8gaXNzdWUgd2hlcmUgdGhlIGNvbXBvc2l0aW9uIHZhbmlzaGVzIHdoZW4geW91IHByZXNzIGVudGVyLlxuICAgICAgICBpZiAoYnJvd3Nlci5zYWZhcmkpXG4gICAgICAgICAgICB2aWV3LmNvbnRlbnRET00uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICgpID0+IG51bGwpO1xuICAgICAgICBpZiAoYnJvd3Nlci5nZWNrbylcbiAgICAgICAgICAgIGZpcmVmb3hDb3B5Q3V0SGFjayh2aWV3LmNvbnRlbnRET00ub3duZXJEb2N1bWVudCk7XG4gICAgfVxuICAgIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnRCZWxvbmdzVG9FZGl0b3IodGhpcy52aWV3LCBldmVudCkgfHwgdGhpcy5pZ25vcmVEdXJpbmdDb21wb3NpdGlvbihldmVudCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChldmVudC50eXBlID09IFwia2V5ZG93blwiICYmIHRoaXMua2V5ZG93bihldmVudCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucnVuSGFuZGxlcnMoZXZlbnQudHlwZSwgZXZlbnQpO1xuICAgIH1cbiAgICBydW5IYW5kbGVycyh0eXBlLCBldmVudCkge1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW3R5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG9ic2VydmVyIG9mIGhhbmRsZXJzLm9ic2VydmVycylcbiAgICAgICAgICAgICAgICBvYnNlcnZlcih0aGlzLnZpZXcsIGV2ZW50KTtcbiAgICAgICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgaGFuZGxlcnMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIodGhpcy52aWV3LCBldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVuc3VyZUhhbmRsZXJzKHBsdWdpbnMpIHtcbiAgICAgICAgbGV0IGhhbmRsZXJzID0gY29tcHV0ZUhhbmRsZXJzKHBsdWdpbnMpLCBwcmV2ID0gdGhpcy5oYW5kbGVycywgZG9tID0gdGhpcy52aWV3LmNvbnRlbnRET007XG4gICAgICAgIGZvciAobGV0IHR5cGUgaW4gaGFuZGxlcnMpXG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInNjcm9sbFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhc3NpdmUgPSAhaGFuZGxlcnNbdHlwZV0uaGFuZGxlcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCBleGlzdHMgPSBwcmV2W3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHMgJiYgcGFzc2l2ZSAhPSAhZXhpc3RzLmhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLmhhbmRsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpXG4gICAgICAgICAgICAgICAgICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMuaGFuZGxlRXZlbnQsIHsgcGFzc2l2ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBwcmV2KVxuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJzY3JvbGxcIiAmJiAhaGFuZGxlcnNbdHlwZV0pXG4gICAgICAgICAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVycztcbiAgICB9XG4gICAga2V5ZG93bihldmVudCkge1xuICAgICAgICAvLyBNdXN0IGFsd2F5cyBydW4sIGV2ZW4gaWYgYSBjdXN0b20gaGFuZGxlciBoYW5kbGVkIHRoZSBldmVudFxuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICAgICAgdGhpcy5sYXN0S2V5VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDkgJiYgRGF0ZS5ub3coKSA8IHRoaXMubGFzdEVzY1ByZXNzICsgMjAwMClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyNyAmJiBtb2RpZmllckNvZGVzLmluZGV4T2YoZXZlbnQua2V5Q29kZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEVzY1ByZXNzID0gMDtcbiAgICAgICAgLy8gQ2hyb21lIGZvciBBbmRyb2lkIHVzdWFsbHkgZG9lc24ndCBmaXJlIHByb3BlciBrZXkgZXZlbnRzLCBidXRcbiAgICAgICAgLy8gb2NjYXNpb25hbGx5IGRvZXMsIHVzdWFsbHkgc3Vycm91bmRlZCBieSBhIGJ1bmNoIG9mIGNvbXBsaWNhdGVkXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uIGNoYW5nZXMuIFdoZW4gYW4gZW50ZXIgb3IgYmFja3NwYWNlIGtleSBldmVudCBpc1xuICAgICAgICAvLyBzZWVuLCBob2xkIG9mZiBvbiBoYW5kbGluZyBET00gZXZlbnRzIGZvciBhIGJpdCwgYW5kIHRoZW5cbiAgICAgICAgLy8gZGlzcGF0Y2ggaXQuXG4gICAgICAgIGlmIChicm93c2VyLmFuZHJvaWQgJiYgYnJvd3Nlci5jaHJvbWUgJiYgIWV2ZW50LnN5bnRoZXRpYyAmJlxuICAgICAgICAgICAgKGV2ZW50LmtleUNvZGUgPT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PSA4KSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmRlbGF5QW5kcm9pZEtleShldmVudC5rZXksIGV2ZW50LmtleUNvZGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudGluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBFbnRlciBvbiBpT1MgbWFrZXMgdGhlXG4gICAgICAgIC8vIHZpcnR1YWwga2V5Ym9hcmQgZ2V0IHN0dWNrIGluIHRoZSB3cm9uZyAobG93ZXJjYXNlKVxuICAgICAgICAvLyBzdGF0ZS4gU28gd2UgbGV0IGl0IGdvIHRocm91Z2gsIGFuZCB0aGVuLCBpblxuICAgICAgICAvLyBhcHBseURPTUNoYW5nZSwgbm90aWZ5IGtleSBoYW5kbGVycyBvZiBpdCBhbmQgcmVzZXQgdG9cbiAgICAgICAgLy8gdGhlIHN0YXRlIHRoZXkgcHJvZHVjZS5cbiAgICAgICAgbGV0IHBlbmRpbmc7XG4gICAgICAgIGlmIChicm93c2VyLmlvcyAmJiAhZXZlbnQuc3ludGhldGljICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiZcbiAgICAgICAgICAgICgocGVuZGluZyA9IFBlbmRpbmdLZXlzLmZpbmQoa2V5ID0+IGtleS5rZXlDb2RlID09IGV2ZW50LmtleUNvZGUpKSAmJiAhZXZlbnQuY3RybEtleSB8fFxuICAgICAgICAgICAgICAgIEVtYWNzeVBlbmRpbmdLZXlzLmluZGV4T2YoZXZlbnQua2V5KSA+IC0xICYmIGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5KSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nSU9TS2V5ID0gcGVuZGluZyB8fCBldmVudDtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mbHVzaElPU0tleSgpLCAyNTApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgIT0gMjI5KVxuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmZvcmNlRmx1c2goKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmbHVzaElPU0tleSgpIHtcbiAgICAgICAgbGV0IGtleSA9IHRoaXMucGVuZGluZ0lPU0tleTtcbiAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucGVuZGluZ0lPU0tleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoS2V5KHRoaXMudmlldy5jb250ZW50RE9NLCBrZXkua2V5LCBrZXkua2V5Q29kZSk7XG4gICAgfVxuICAgIGlnbm9yZUR1cmluZ0NvbXBvc2l0aW9uKGV2ZW50KSB7XG4gICAgICAgIGlmICghL15rZXkvLnRlc3QoZXZlbnQudHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvc2luZyA+IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnN0dW0uZGUvMjAxNi8wNi8yNC9oYW5kbGluZy1pbWUtZXZlbnRzLWluLWphdmFzY3JpcHQvLlxuICAgICAgICAvLyBPbiBzb21lIGlucHV0IG1ldGhvZCBlZGl0b3JzIChJTUVzKSwgdGhlIEVudGVyIGtleSBpcyB1c2VkIHRvXG4gICAgICAgIC8vIGNvbmZpcm0gY2hhcmFjdGVyIHNlbGVjdGlvbi4gT24gU2FmYXJpLCB3aGVuIEVudGVyIGlzIHByZXNzZWQsXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uZW5kIGFuZCBrZXlkb3duIGV2ZW50cyBhcmUgc29tZXRpbWVzIGVtaXR0ZWQgaW4gdGhlXG4gICAgICAgIC8vIHdyb25nIG9yZGVyLiBUaGUga2V5IGV2ZW50IHNob3VsZCBzdGlsbCBiZSBpZ25vcmVkLCBldmVuIHdoZW5cbiAgICAgICAgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgY29tcG9zaXRpb25lbmQgZXZlbnQuXG4gICAgICAgIGlmIChicm93c2VyLnNhZmFyaSAmJiAhYnJvd3Nlci5pb3MgJiYgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdLZXkgJiYgRGF0ZS5ub3coKSAtIHRoaXMuY29tcG9zaXRpb25FbmRlZEF0IDwgMTAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGFydE1vdXNlU2VsZWN0aW9uKG1vdXNlU2VsZWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24gPSBtb3VzZVNlbGVjdGlvbjtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24udXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnZWRDb250ZW50ICYmIHVwZGF0ZS5kb2NDaGFuZ2VkKVxuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkQ29udGVudCA9IHRoaXMuZHJhZ2dlZENvbnRlbnQubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJpbmRIYW5kbGVyKHBsdWdpbiwgaGFuZGxlcikge1xuICAgIHJldHVybiAodmlldywgZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmNhbGwocGx1Z2luLCBldmVudCwgdmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlSGFuZGxlcnMocGx1Z2lucykge1xuICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZ1bmN0aW9uIHJlY29yZCh0eXBlKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRbdHlwZV0gfHwgKHJlc3VsdFt0eXBlXSA9IHsgb2JzZXJ2ZXJzOiBbXSwgaGFuZGxlcnM6IFtdIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICBsZXQgc3BlYyA9IHBsdWdpbi5zcGVjO1xuICAgICAgICBpZiAoc3BlYyAmJiBzcGVjLmRvbUV2ZW50SGFuZGxlcnMpXG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHNwZWMuZG9tRXZlbnRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGxldCBmID0gc3BlYy5kb21FdmVudEhhbmRsZXJzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgICAgICByZWNvcmQodHlwZSkuaGFuZGxlcnMucHVzaChiaW5kSGFuZGxlcihwbHVnaW4udmFsdWUsIGYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWMgJiYgc3BlYy5kb21FdmVudE9ic2VydmVycylcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gc3BlYy5kb21FdmVudE9ic2VydmVycykge1xuICAgICAgICAgICAgICAgIGxldCBmID0gc3BlYy5kb21FdmVudE9ic2VydmVyc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZilcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkKHR5cGUpLm9ic2VydmVycy5wdXNoKGJpbmRIYW5kbGVyKHBsdWdpbi52YWx1ZSwgZikpO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCB0eXBlIGluIGhhbmRsZXJzKVxuICAgICAgICByZWNvcmQodHlwZSkuaGFuZGxlcnMucHVzaChoYW5kbGVyc1t0eXBlXSk7XG4gICAgZm9yIChsZXQgdHlwZSBpbiBvYnNlcnZlcnMpXG4gICAgICAgIHJlY29yZCh0eXBlKS5vYnNlcnZlcnMucHVzaChvYnNlcnZlcnNbdHlwZV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBQZW5kaW5nS2V5cyA9IFtcbiAgICB7IGtleTogXCJCYWNrc3BhY2VcIiwga2V5Q29kZTogOCwgaW5wdXRUeXBlOiBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiIH0sXG4gICAgeyBrZXk6IFwiRW50ZXJcIiwga2V5Q29kZTogMTMsIGlucHV0VHlwZTogXCJpbnNlcnRQYXJhZ3JhcGhcIiB9LFxuICAgIHsga2V5OiBcIkVudGVyXCIsIGtleUNvZGU6IDEzLCBpbnB1dFR5cGU6IFwiaW5zZXJ0TGluZUJyZWFrXCIgfSxcbiAgICB7IGtleTogXCJEZWxldGVcIiwga2V5Q29kZTogNDYsIGlucHV0VHlwZTogXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiIH1cbl07XG5jb25zdCBFbWFjc3lQZW5kaW5nS2V5cyA9IFwiZHRoa29cIjtcbi8vIEtleSBjb2RlcyBmb3IgbW9kaWZpZXIga2V5c1xuY29uc3QgbW9kaWZpZXJDb2RlcyA9IFsxNiwgMTcsIDE4LCAyMCwgOTEsIDkyLCAyMjQsIDIyNV07XG5jb25zdCBkcmFnU2Nyb2xsTWFyZ2luID0gNjtcbmZ1bmN0aW9uIGRyYWdTY3JvbGxTcGVlZChkaXN0KSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIGRpc3QpICogMC43ICsgODtcbn1cbmZ1bmN0aW9uIGRpc3QoYSwgYikge1xuICAgIHJldHVybiBNYXRoLm1heChNYXRoLmFicyhhLmNsaWVudFggLSBiLmNsaWVudFgpLCBNYXRoLmFicyhhLmNsaWVudFkgLSBiLmNsaWVudFkpKTtcbn1cbmNsYXNzIE1vdXNlU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzdGFydEV2ZW50LCBzdHlsZSwgbXVzdFNlbGVjdCkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnN0YXJ0RXZlbnQgPSBzdGFydEV2ZW50O1xuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIHRoaXMubXVzdFNlbGVjdCA9IG11c3RTZWxlY3Q7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0RXZlbnQgPSBzdGFydEV2ZW50O1xuICAgICAgICB0aGlzLnNjcm9sbFBhcmVudCA9IHNjcm9sbGFibGVQYXJlbnQodmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5hdG9tcyA9IHZpZXcuc3RhdGUuZmFjZXQoYXRvbWljUmFuZ2VzKS5tYXAoZiA9PiBmKHZpZXcpKTtcbiAgICAgICAgbGV0IGRvYyA9IHZpZXcuY29udGVudERPTS5vd25lckRvY3VtZW50O1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdmUgPSB0aGlzLm1vdmUuYmluZCh0aGlzKSk7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwID0gdGhpcy51cC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5leHRlbmQgPSBzdGFydEV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICB0aGlzLm11bHRpcGxlID0gdmlldy5zdGF0ZS5mYWNldChFZGl0b3JTdGF0ZS5hbGxvd011bHRpcGxlU2VsZWN0aW9ucykgJiYgYWRkc1NlbGVjdGlvblJhbmdlKHZpZXcsIHN0YXJ0RXZlbnQpO1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gaXNJblByaW1hcnlTZWxlY3Rpb24odmlldywgc3RhcnRFdmVudCkgJiYgZ2V0Q2xpY2tUeXBlKHN0YXJ0RXZlbnQpID09IDEgPyBudWxsIDogZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgc2VsZWN0aW9uLCBpbW1lZGlhdGVseSBhcHBseSB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIHN0YXJ0aW5nIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QoZXZlbnQpO1xuICAgIH1cbiAgICBtb3ZlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgfHwgdGhpcy5kcmFnZ2luZyA9PSBudWxsICYmIGRpc3QodGhpcy5zdGFydEV2ZW50LCBldmVudCkgPCAxMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQgPSBldmVudCk7XG4gICAgICAgIGxldCBzeCA9IDAsIHN5ID0gMDtcbiAgICAgICAgbGV0IHJlY3QgPSAoKF9hID0gdGhpcy5zY3JvbGxQYXJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgIHx8IHsgbGVmdDogMCwgdG9wOiAwLCByaWdodDogdGhpcy52aWV3Lndpbi5pbm5lcldpZHRoLCBib3R0b206IHRoaXMudmlldy53aW4uaW5uZXJIZWlnaHQgfTtcbiAgICAgICAgbGV0IG1hcmdpbnMgPSBnZXRTY3JvbGxNYXJnaW5zKHRoaXMudmlldyk7XG4gICAgICAgIGlmIChldmVudC5jbGllbnRYIC0gbWFyZ2lucy5sZWZ0IDw9IHJlY3QubGVmdCArIGRyYWdTY3JvbGxNYXJnaW4pXG4gICAgICAgICAgICBzeCA9IC1kcmFnU2Nyb2xsU3BlZWQocmVjdC5sZWZ0IC0gZXZlbnQuY2xpZW50WCk7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmNsaWVudFggKyBtYXJnaW5zLnJpZ2h0ID49IHJlY3QucmlnaHQgLSBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3ggPSBkcmFnU2Nyb2xsU3BlZWQoZXZlbnQuY2xpZW50WCAtIHJlY3QucmlnaHQpO1xuICAgICAgICBpZiAoZXZlbnQuY2xpZW50WSAtIG1hcmdpbnMudG9wIDw9IHJlY3QudG9wICsgZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN5ID0gLWRyYWdTY3JvbGxTcGVlZChyZWN0LnRvcCAtIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBlbHNlIGlmIChldmVudC5jbGllbnRZICsgbWFyZ2lucy5ib3R0b20gPj0gcmVjdC5ib3R0b20gLSBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3kgPSBkcmFnU2Nyb2xsU3BlZWQoZXZlbnQuY2xpZW50WSAtIHJlY3QuYm90dG9tKTtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGxTcGVlZChzeCwgc3kpO1xuICAgIH1cbiAgICB1cChldmVudCkge1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQpO1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGxTcGVlZCgwLCAwKTtcbiAgICAgICAgbGV0IGRvYyA9IHRoaXMudmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwKTtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24gPSB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG4gICAgfVxuICAgIHNldFNjcm9sbFNwZWVkKHN4LCBzeSkge1xuICAgICAgICB0aGlzLnNjcm9sbFNwZWVkID0geyB4OiBzeCwgeTogc3kgfTtcbiAgICAgICAgaWYgKHN4IHx8IHN5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxpbmcgPCAwKVxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsaW5nID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5zY3JvbGwoKSwgNTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2Nyb2xsaW5nID4gLTEpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxpbmcpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSAtMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCArPSB0aGlzLnNjcm9sbFNwZWVkLng7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AgKz0gdGhpcy5zY3JvbGxTcGVlZC55O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3Lndpbi5zY3JvbGxCeSh0aGlzLnNjcm9sbFNwZWVkLngsIHRoaXMuc2Nyb2xsU3BlZWQueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQpO1xuICAgIH1cbiAgICBza2lwQXRvbXMoc2VsKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNlbC5yYW5nZXNbaV0sIHVwZGF0ZWQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvcyA9IHNraXBBdG9taWNSYW5nZXModGhpcy5hdG9tcywgcmFuZ2UuZnJvbSwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyAhPSByYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS5mcm9tLCAtMSk7XG4gICAgICAgICAgICAgICAgbGV0IHRvID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS50bywgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gIT0gcmFuZ2UuZnJvbSB8fCB0byAhPSByYW5nZS50bylcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IEVkaXRvclNlbGVjdGlvbi5yYW5nZShyYW5nZS5mcm9tID09IHJhbmdlLmFuY2hvciA/IGZyb20gOiB0bywgcmFuZ2UuZnJvbSA9PSByYW5nZS5oZWFkID8gZnJvbSA6IHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IHNlbC5yYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICByYW5nZXNbaV0gPSB1cGRhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYW5nZXMgPyBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgc2VsLm1haW5JbmRleCkgOiBzZWw7XG4gICAgfVxuICAgIHNlbGVjdChldmVudCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzLCBzZWxlY3Rpb24gPSB0aGlzLnNraXBBdG9tcyh0aGlzLnN0eWxlLmdldChldmVudCwgdGhpcy5leHRlbmQsIHRoaXMubXVsdGlwbGUpKTtcbiAgICAgICAgaWYgKHRoaXMubXVzdFNlbGVjdCB8fCAhc2VsZWN0aW9uLmVxKHZpZXcuc3RhdGUuc2VsZWN0aW9uLCB0aGlzLmRyYWdnaW5nID09PSBmYWxzZSkpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICB1c2VyRXZlbnQ6IFwic2VsZWN0LnBvaW50ZXJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubXVzdFNlbGVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlLnVwZGF0ZSh1cGRhdGUpKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCksIDIwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRzU2VsZWN0aW9uUmFuZ2UodmlldywgZXZlbnQpIHtcbiAgICBsZXQgZmFjZXQgPSB2aWV3LnN0YXRlLmZhY2V0KGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlKTtcbiAgICByZXR1cm4gZmFjZXQubGVuZ3RoID8gZmFjZXRbMF0oZXZlbnQpIDogYnJvd3Nlci5tYWMgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGRyYWdNb3Zlc1NlbGVjdGlvbih2aWV3LCBldmVudCkge1xuICAgIGxldCBmYWNldCA9IHZpZXcuc3RhdGUuZmFjZXQoZHJhZ01vdmVzU2VsZWN0aW9uJDEpO1xuICAgIHJldHVybiBmYWNldC5sZW5ndGggPyBmYWNldFswXShldmVudCkgOiBicm93c2VyLm1hYyA/ICFldmVudC5hbHRLZXkgOiAhZXZlbnQuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGlzSW5QcmltYXJ5U2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHsgbWFpbiB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKG1haW4uZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBPbiBib3VuZGFyeSBjbGlja3MsIGNoZWNrIHdoZXRoZXIgdGhlIGNvb3JkaW5hdGVzIGFyZSBpbnNpZGUgdGhlXG4gICAgLy8gc2VsZWN0aW9uJ3MgY2xpZW50IHJlY3RhbmdsZXNcbiAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgaWYgKCFzZWwgfHwgc2VsLnJhbmdlQ291bnQgPT0gMClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHJlY3RzID0gc2VsLmdldFJhbmdlQXQoMCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgIGlmIChyZWN0LmxlZnQgPD0gZXZlbnQuY2xpZW50WCAmJiByZWN0LnJpZ2h0ID49IGV2ZW50LmNsaWVudFggJiZcbiAgICAgICAgICAgIHJlY3QudG9wIDw9IGV2ZW50LmNsaWVudFkgJiYgcmVjdC5ib3R0b20gPj0gZXZlbnQuY2xpZW50WSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBldmVudEJlbG9uZ3NUb0VkaXRvcih2aWV3LCBldmVudCkge1xuICAgIGlmICghZXZlbnQuYnViYmxlcylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBub2RlID0gZXZlbnQudGFyZ2V0LCBjVmlldzsgbm9kZSAhPSB2aWV3LmNvbnRlbnRET007IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlID09IDExIHx8ICgoY1ZpZXcgPSBDb250ZW50Vmlldy5nZXQobm9kZSkpICYmIGNWaWV3Lmlnbm9yZUV2ZW50KGV2ZW50KSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jb25zdCBoYW5kbGVycyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3Qgb2JzZXJ2ZXJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG4vLyBUaGlzIGlzIHZlcnkgY3J1ZGUsIGJ1dCB1bmZvcnR1bmF0ZWx5IGJvdGggdGhlc2UgYnJvd3NlcnMgX3ByZXRlbmRfXG4vLyB0aGF0IHRoZXkgaGF2ZSBhIGNsaXBib2FyZCBBUElcdTIwMTRhbGwgdGhlIG9iamVjdHMgYW5kIG1ldGhvZHMgYXJlXG4vLyB0aGVyZSwgdGhleSBqdXN0IGRvbid0IHdvcmssIGFuZCB0aGV5IGFyZSBoYXJkIHRvIHRlc3QuXG5jb25zdCBicm9rZW5DbGlwYm9hcmRBUEkgPSAoYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPCAxNSkgfHxcbiAgICAoYnJvd3Nlci5pb3MgJiYgYnJvd3Nlci53ZWJraXRfdmVyc2lvbiA8IDYwNCk7XG5mdW5jdGlvbiBjYXB0dXJlUGFzdGUodmlldykge1xuICAgIGxldCBwYXJlbnQgPSB2aWV3LmRvbS5wYXJlbnROb2RlO1xuICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIikpO1xuICAgIHRhcmdldC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlKCk7XG4gICAgICAgIGRvUGFzdGUodmlldywgdGFyZ2V0LnZhbHVlKTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiBkb1Bhc3RlKHZpZXcsIGlucHV0KSB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNoYW5nZXMsIGkgPSAxLCB0ZXh0ID0gc3RhdGUudG9UZXh0KGlucHV0KTtcbiAgICBsZXQgYnlMaW5lID0gdGV4dC5saW5lcyA9PSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aDtcbiAgICBsZXQgbGluZXdpc2UgPSBsYXN0TGluZXdpc2VDb3B5ICE9IG51bGwgJiYgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5ldmVyeShyID0+IHIuZW1wdHkpICYmIGxhc3RMaW5ld2lzZUNvcHkgPT0gdGV4dC50b1N0cmluZygpO1xuICAgIGlmIChsaW5ld2lzZSkge1xuICAgICAgICBsZXQgbGFzdExpbmUgPSAtMTtcbiAgICAgICAgY2hhbmdlcyA9IHN0YXRlLmNoYW5nZUJ5UmFuZ2UocmFuZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHJhbmdlLmZyb20pO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA9PSBsYXN0TGluZSlcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZSB9O1xuICAgICAgICAgICAgbGFzdExpbmUgPSBsaW5lLmZyb207XG4gICAgICAgICAgICBsZXQgaW5zZXJ0ID0gc3RhdGUudG9UZXh0KChieUxpbmUgPyB0ZXh0LmxpbmUoaSsrKS50ZXh0IDogaW5wdXQpICsgc3RhdGUubGluZUJyZWFrKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXM6IHsgZnJvbTogbGluZS5mcm9tLCBpbnNlcnQgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgaW5zZXJ0Lmxlbmd0aCkgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJ5TGluZSkge1xuICAgICAgICBjaGFuZ2VzID0gc3RhdGUuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHRleHQubGluZShpKyspO1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogeyBmcm9tOiByYW5nZS5mcm9tLCB0bzogcmFuZ2UudG8sIGluc2VydDogbGluZS50ZXh0IH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmFuZ2UuZnJvbSArIGxpbmUubGVuZ3RoKSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNoYW5nZXMgPSBzdGF0ZS5yZXBsYWNlU2VsZWN0aW9uKHRleHQpO1xuICAgIH1cbiAgICB2aWV3LmRpc3BhdGNoKGNoYW5nZXMsIHtcbiAgICAgICAgdXNlckV2ZW50OiBcImlucHV0LnBhc3RlXCIsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiB0cnVlXG4gICAgfSk7XG59XG5vYnNlcnZlcnMuc2Nyb2xsID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3AgPSB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3A7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxMZWZ0ID0gdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdDtcbn07XG5oYW5kbGVycy5rZXlkb3duID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLnNldFNlbGVjdGlvbk9yaWdpbihcInNlbGVjdFwiKTtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAyNylcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmxhc3RFc2NQcmVzcyA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbm9ic2VydmVycy50b3VjaHN0YXJ0ID0gKHZpZXcsIGUpID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA9IERhdGUubm93KCk7XG4gICAgdmlldy5pbnB1dFN0YXRlLnNldFNlbGVjdGlvbk9yaWdpbihcInNlbGVjdC5wb2ludGVyXCIpO1xufTtcbm9ic2VydmVycy50b3VjaG1vdmUgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0LnBvaW50ZXJcIik7XG59O1xuaGFuZGxlcnMubW91c2Vkb3duID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmlldy5vYnNlcnZlci5mbHVzaCgpO1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA+IERhdGUubm93KCkgLSAyMDAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIElnbm9yZSB0b3VjaCBpbnRlcmFjdGlvblxuICAgIGxldCBzdHlsZSA9IG51bGw7XG4gICAgZm9yIChsZXQgbWFrZVN0eWxlIG9mIHZpZXcuc3RhdGUuZmFjZXQobW91c2VTZWxlY3Rpb25TdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBtYWtlU3R5bGUodmlldywgZXZlbnQpO1xuICAgICAgICBpZiAoc3R5bGUpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCFzdHlsZSAmJiBldmVudC5idXR0b24gPT0gMClcbiAgICAgICAgc3R5bGUgPSBiYXNpY01vdXNlU2VsZWN0aW9uKHZpZXcsIGV2ZW50KTtcbiAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgbGV0IG11c3RGb2N1cyA9ICF2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICB2aWV3LmlucHV0U3RhdGUuc3RhcnRNb3VzZVNlbGVjdGlvbihuZXcgTW91c2VTZWxlY3Rpb24odmlldywgZXZlbnQsIHN0eWxlLCBtdXN0Rm9jdXMpKTtcbiAgICAgICAgaWYgKG11c3RGb2N1cylcbiAgICAgICAgICAgIHZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IGZvY3VzUHJldmVudFNjcm9sbCh2aWV3LmNvbnRlbnRET00pKTtcbiAgICAgICAgbGV0IG1vdXNlU2VsID0gdmlldy5pbnB1dFN0YXRlLm1vdXNlU2VsZWN0aW9uO1xuICAgICAgICBpZiAobW91c2VTZWwpIHtcbiAgICAgICAgICAgIG1vdXNlU2VsLnN0YXJ0KGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybiBtb3VzZVNlbC5kcmFnZ2luZyA9PT0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJhbmdlRm9yQ2xpY2sodmlldywgcG9zLCBiaWFzLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gMSkgeyAvLyBTaW5nbGUgY2xpY2tcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zLCBiaWFzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PSAyKSB7IC8vIERvdWJsZSBjbGlja1xuICAgICAgICByZXR1cm4gZ3JvdXBBdCh2aWV3LnN0YXRlLCBwb3MsIGJpYXMpO1xuICAgIH1cbiAgICBlbHNlIHsgLy8gVHJpcGxlIGNsaWNrXG4gICAgICAgIGxldCB2aXN1YWwgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgcG9zKSwgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdCh2aXN1YWwgPyB2aXN1YWwucG9zQXRFbmQgOiBwb3MpO1xuICAgICAgICBsZXQgZnJvbSA9IHZpc3VhbCA/IHZpc3VhbC5wb3NBdFN0YXJ0IDogbGluZS5mcm9tLCB0byA9IHZpc3VhbCA/IHZpc3VhbC5wb3NBdEVuZCA6IGxpbmUudG87XG4gICAgICAgIGlmICh0byA8IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCAmJiB0byA9PSBsaW5lLnRvKVxuICAgICAgICAgICAgdG8rKztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxubGV0IGluc2lkZVkgPSAoeSwgcmVjdCkgPT4geSA+PSByZWN0LnRvcCAmJiB5IDw9IHJlY3QuYm90dG9tO1xubGV0IGluc2lkZSA9ICh4LCB5LCByZWN0KSA9PiBpbnNpZGVZKHksIHJlY3QpICYmIHggPj0gcmVjdC5sZWZ0ICYmIHggPD0gcmVjdC5yaWdodDtcbi8vIFRyeSB0byBkZXRlcm1pbmUsIGZvciB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbi8vIGdpdmVuIHBvc2l0aW9uLCB3aGV0aGVyIHRoZXkgYXJlIHJlbGF0ZWQgdG8gdGhlIGVsZW1lbnQgYmVmb3JlIG9yXG4vLyB0aGUgZWxlbWVudCBhZnRlciB0aGUgcG9zaXRpb24uXG5mdW5jdGlvbiBmaW5kUG9zaXRpb25TaWRlKHZpZXcsIHBvcywgeCwgeSkge1xuICAgIGxldCBsaW5lID0gTGluZVZpZXcuZmluZCh2aWV3LmRvY1ZpZXcsIHBvcyk7XG4gICAgaWYgKCFsaW5lKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBsZXQgb2ZmID0gcG9zIC0gbGluZS5wb3NBdFN0YXJ0O1xuICAgIC8vIExpbmUgYm91bmRhcmllcyBwb2ludCBpbnRvIHRoZSBsaW5lXG4gICAgaWYgKG9mZiA9PSAwKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBpZiAob2ZmID09IGxpbmUubGVuZ3RoKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgLy8gUG9zaXRpb25zIG9uIHRvcCBvZiBhbiBlbGVtZW50IHBvaW50IGF0IHRoYXQgZWxlbWVudFxuICAgIGxldCBiZWZvcmUgPSBsaW5lLmNvb3Jkc0F0KG9mZiwgLTEpO1xuICAgIGlmIChiZWZvcmUgJiYgaW5zaWRlKHgsIHksIGJlZm9yZSkpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICBsZXQgYWZ0ZXIgPSBsaW5lLmNvb3Jkc0F0KG9mZiwgMSk7XG4gICAgaWYgKGFmdGVyICYmIGluc2lkZSh4LCB5LCBhZnRlcikpXG4gICAgICAgIHJldHVybiAxO1xuICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBsaW5lIHdyYXAgcG9pbnQuIFBpY2sgYmVmb3JlIGlmIHRoZSBwb2ludCBpc1xuICAgIC8vIGJlc2lkZSBpdC5cbiAgICByZXR1cm4gYmVmb3JlICYmIGluc2lkZVkoeSwgYmVmb3JlKSA/IC0xIDogMTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICByZXR1cm4geyBwb3MsIGJpYXM6IGZpbmRQb3NpdGlvblNpZGUodmlldywgcG9zLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSB9O1xufVxuY29uc3QgQmFkTW91c2VEZXRhaWwgPSBicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMTtcbmxldCBsYXN0TW91c2VEb3duID0gbnVsbCwgbGFzdE1vdXNlRG93bkNvdW50ID0gMCwgbGFzdE1vdXNlRG93blRpbWUgPSAwO1xuZnVuY3Rpb24gZ2V0Q2xpY2tUeXBlKGV2ZW50KSB7XG4gICAgaWYgKCFCYWRNb3VzZURldGFpbClcbiAgICAgICAgcmV0dXJuIGV2ZW50LmRldGFpbDtcbiAgICBsZXQgbGFzdCA9IGxhc3RNb3VzZURvd24sIGxhc3RUaW1lID0gbGFzdE1vdXNlRG93blRpbWU7XG4gICAgbGFzdE1vdXNlRG93biA9IGV2ZW50O1xuICAgIGxhc3RNb3VzZURvd25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbGFzdE1vdXNlRG93bkNvdW50ID0gIWxhc3QgfHwgKGxhc3RUaW1lID4gRGF0ZS5ub3coKSAtIDQwMCAmJiBNYXRoLmFicyhsYXN0LmNsaWVudFggLSBldmVudC5jbGllbnRYKSA8IDIgJiZcbiAgICAgICAgTWF0aC5hYnMobGFzdC5jbGllbnRZIC0gZXZlbnQuY2xpZW50WSkgPCAyKSA/IChsYXN0TW91c2VEb3duQ291bnQgKyAxKSAlIDMgOiAxO1xufVxuZnVuY3Rpb24gYmFzaWNNb3VzZVNlbGVjdGlvbih2aWV3LCBldmVudCkge1xuICAgIGxldCBzdGFydCA9IHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSwgdHlwZSA9IGdldENsaWNrVHlwZShldmVudCk7XG4gICAgbGV0IHN0YXJ0U2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQucG9zID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHN0YXJ0LnBvcyk7XG4gICAgICAgICAgICAgICAgc3RhcnRTZWwgPSBzdGFydFNlbC5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQoZXZlbnQsIGV4dGVuZCwgbXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSBxdWVyeVBvcyh2aWV3LCBldmVudCksIHJlbW92ZWQ7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZUZvckNsaWNrKHZpZXcsIGN1ci5wb3MsIGN1ci5iaWFzLCB0eXBlKTtcbiAgICAgICAgICAgIGlmIChzdGFydC5wb3MgIT0gY3VyLnBvcyAmJiAhZXh0ZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0UmFuZ2UgPSByYW5nZUZvckNsaWNrKHZpZXcsIHN0YXJ0LnBvcywgc3RhcnQuYmlhcywgdHlwZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1pbihzdGFydFJhbmdlLmZyb20sIHJhbmdlLmZyb20pLCB0byA9IE1hdGgubWF4KHN0YXJ0UmFuZ2UudG8sIHJhbmdlLnRvKTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGZyb20gPCByYW5nZS5mcm9tID8gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKSA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0bywgZnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0ZW5kKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbC5yZXBsYWNlUmFuZ2Uoc3RhcnRTZWwubWFpbi5leHRlbmQocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG11bHRpcGxlICYmIHR5cGUgPT0gMSAmJiBzdGFydFNlbC5yYW5nZXMubGVuZ3RoID4gMSAmJiAocmVtb3ZlZCA9IHJlbW92ZVJhbmdlQXJvdW5kKHN0YXJ0U2VsLCBjdXIucG9zKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgICAgICAgICBlbHNlIGlmIChtdWx0aXBsZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKFtyYW5nZV0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVJhbmdlQXJvdW5kKHNlbCwgcG9zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSBzZWwucmFuZ2VzW2ldO1xuICAgICAgICBpZiAoZnJvbSA8PSBwb3MgJiYgdG8gPj0gcG9zKVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoc2VsLnJhbmdlcy5zbGljZSgwLCBpKS5jb25jYXQoc2VsLnJhbmdlcy5zbGljZShpICsgMSkpLCBzZWwubWFpbkluZGV4ID09IGkgPyAwIDogc2VsLm1haW5JbmRleCAtIChzZWwubWFpbkluZGV4ID4gaSA/IDEgOiAwKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuaGFuZGxlcnMuZHJhZ3N0YXJ0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uOiB7IG1haW46IHJhbmdlIH0gfSA9IHZpZXcuc3RhdGU7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5kcmFnZ2FibGUpIHtcbiAgICAgICAgbGV0IGNWaWV3ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3QoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKGNWaWV3ICYmIGNWaWV3LmlzV2lkZ2V0KSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGNWaWV3LnBvc0F0U3RhcnQsIHRvID0gZnJvbSArIGNWaWV3Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChmcm9tID49IHJhbmdlLnRvIHx8IHRvIDw9IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB7IGlucHV0U3RhdGUgfSA9IHZpZXc7XG4gICAgaWYgKGlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24pXG4gICAgICAgIGlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24uZHJhZ2dpbmcgPSB0cnVlO1xuICAgIGlucHV0U3RhdGUuZHJhZ2dlZENvbnRlbnQgPSByYW5nZTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwiVGV4dFwiLCB2aWV3LnN0YXRlLnNsaWNlRG9jKHJhbmdlLmZyb20sIHJhbmdlLnRvKSk7XG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJjb3B5TW92ZVwiO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuaGFuZGxlcnMuZHJhZ2VuZCA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmZ1bmN0aW9uIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LCBkaXJlY3QpIHtcbiAgICBpZiAoIXRleHQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgZHJvcFBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICBsZXQgeyBkcmFnZ2VkQ29udGVudCB9ID0gdmlldy5pbnB1dFN0YXRlO1xuICAgIGxldCBkZWwgPSBkaXJlY3QgJiYgZHJhZ2dlZENvbnRlbnQgJiYgZHJhZ01vdmVzU2VsZWN0aW9uKHZpZXcsIGV2ZW50KVxuICAgICAgICA/IHsgZnJvbTogZHJhZ2dlZENvbnRlbnQuZnJvbSwgdG86IGRyYWdnZWRDb250ZW50LnRvIH0gOiBudWxsO1xuICAgIGxldCBpbnMgPSB7IGZyb206IGRyb3BQb3MsIGluc2VydDogdGV4dCB9O1xuICAgIGxldCBjaGFuZ2VzID0gdmlldy5zdGF0ZS5jaGFuZ2VzKGRlbCA/IFtkZWwsIGluc10gOiBpbnMpO1xuICAgIHZpZXcuZm9jdXMoKTtcbiAgICB2aWV3LmRpc3BhdGNoKHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgc2VsZWN0aW9uOiB7IGFuY2hvcjogY2hhbmdlcy5tYXBQb3MoZHJvcFBvcywgLTEpLCBoZWFkOiBjaGFuZ2VzLm1hcFBvcyhkcm9wUG9zLCAxKSB9LFxuICAgICAgICB1c2VyRXZlbnQ6IGRlbCA/IFwibW92ZS5kcm9wXCIgOiBcImlucHV0LmRyb3BcIlxuICAgIH0pO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG59XG5oYW5kbGVycy5kcm9wID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHsgLy8gRm9yIGEgZmlsZSBkcm9wLCByZWFkIHRoZSBmaWxlJ3MgdGV4dC5cbiAgICAgICAgbGV0IHRleHQgPSBBcnJheShmaWxlcy5sZW5ndGgpLCByZWFkID0gMDtcbiAgICAgICAgbGV0IGZpbmlzaEZpbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoKytyZWFkID09IGZpbGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dC5maWx0ZXIocyA9PiBzICE9IG51bGwpLmpvaW4odmlldy5zdGF0ZS5saW5lQnJlYWspLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcjtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZmluaXNoRmlsZTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEvW1xceDAwLVxceDA4XFx4MGUtXFx4MWZdezJ9Ly50ZXN0KHJlYWRlci5yZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0W2ldID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBmaW5pc2hGaWxlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHRleHQgPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuaGFuZGxlcnMucGFzdGUgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgdmlldy5vYnNlcnZlci5mbHVzaCgpO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZG9QYXN0ZSh2aWV3LCBkYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IGRhdGEuZ2V0RGF0YShcInRleHQvdXJpLXRleHRcIikpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNhcHR1cmVQYXN0ZSh2aWV3KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjYXB0dXJlQ29weSh2aWV3LCB0ZXh0KSB7XG4gICAgLy8gVGhlIGV4dHJhIHdyYXBwZXIgaXMgc29tZWhvdyBuZWNlc3Nhcnkgb24gSUUvRWRnZSB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGNvbnRlbnQgZnJvbSBiZWluZyBtYW5nbGVkIHdoZW4gaXQgaXMgcHV0IG9udG8gdGhlIGNsaXBib2FyZFxuICAgIGxldCBwYXJlbnQgPSB2aWV3LmRvbS5wYXJlbnROb2RlO1xuICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIikpO1xuICAgIHRhcmdldC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICB0YXJnZXQudmFsdWUgPSB0ZXh0O1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHRhcmdldC5zZWxlY3Rpb25FbmQgPSB0ZXh0Lmxlbmd0aDtcbiAgICB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlKCk7XG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiBjb3BpZWRSYW5nZShzdGF0ZSkge1xuICAgIGxldCBjb250ZW50ID0gW10sIHJhbmdlcyA9IFtdLCBsaW5ld2lzZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpXG4gICAgICAgIGlmICghcmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHVzaChzdGF0ZS5zbGljZURvYyhyYW5nZS5mcm9tLCByYW5nZS50bykpO1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpO1xuICAgICAgICB9XG4gICAgaWYgKCFjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAvLyBOb3RoaW5nIHNlbGVjdGVkLCBkbyBhIGxpbmUtd2lzZSBjb3B5XG4gICAgICAgIGxldCB1cHRvID0gLTE7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSB9IG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChmcm9tKTtcbiAgICAgICAgICAgIGlmIChsaW5lLm51bWJlciA+IHVwdG8pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2gobGluZS50ZXh0KTtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IE1hdGgubWluKHN0YXRlLmRvYy5sZW5ndGgsIGxpbmUudG8gKyAxKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwdG8gPSBsaW5lLm51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBsaW5ld2lzZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB7IHRleHQ6IGNvbnRlbnQuam9pbihzdGF0ZS5saW5lQnJlYWspLCByYW5nZXMsIGxpbmV3aXNlIH07XG59XG5sZXQgbGFzdExpbmV3aXNlQ29weSA9IG51bGw7XG5oYW5kbGVycy5jb3B5ID0gaGFuZGxlcnMuY3V0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgbGV0IHsgdGV4dCwgcmFuZ2VzLCBsaW5ld2lzZSB9ID0gY29waWVkUmFuZ2Uodmlldy5zdGF0ZSk7XG4gICAgaWYgKCF0ZXh0ICYmICFsaW5ld2lzZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxhc3RMaW5ld2lzZUNvcHkgPSBsaW5ld2lzZSA/IHRleHQgOiBudWxsO1xuICAgIGlmIChldmVudC50eXBlID09IFwiY3V0XCIgJiYgIXZpZXcuc3RhdGUucmVhZE9ubHkpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczogcmFuZ2VzLFxuICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IHRydWUsXG4gICAgICAgICAgICB1c2VyRXZlbnQ6IFwiZGVsZXRlLmN1dFwiXG4gICAgICAgIH0pO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgZGF0YS5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjYXB0dXJlQ29weSh2aWV3LCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5jb25zdCBpc0ZvY3VzQ2hhbmdlID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG5mdW5jdGlvbiBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHN0YXRlLCBmb2N1cykge1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgZ2V0RWZmZWN0IG9mIHN0YXRlLmZhY2V0KGZvY3VzQ2hhbmdlRWZmZWN0KSkge1xuICAgICAgICBsZXQgZWZmZWN0ID0gZ2V0RWZmZWN0KHN0YXRlLCBmb2N1cyk7XG4gICAgICAgIGlmIChlZmZlY3QpXG4gICAgICAgICAgICBlZmZlY3RzLnB1c2goZWZmZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIGVmZmVjdHMgPyBzdGF0ZS51cGRhdGUoeyBlZmZlY3RzLCBhbm5vdGF0aW9uczogaXNGb2N1c0NoYW5nZS5vZih0cnVlKSB9KSA6IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGb3JGb2N1c0NoYW5nZSh2aWV3KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxldCBmb2N1cyA9IHZpZXcuaGFzRm9jdXM7XG4gICAgICAgIGlmIChmb2N1cyAhPSB2aWV3LmlucHV0U3RhdGUubm90aWZpZWRGb2N1c2VkKSB7XG4gICAgICAgICAgICBsZXQgdHIgPSBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHZpZXcuc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgICAgIGlmICh0cilcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIH1cbiAgICB9LCAxMCk7XG59XG5vYnNlcnZlcnMuZm9jdXMgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA9IERhdGUubm93KCk7XG4gICAgLy8gV2hlbiBmb2N1c2luZyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCBtb3ZlIGl0IGJhY2sgdG8gd2hlcmUgaXQgd2FzXG4gICAgaWYgKCF2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgJiYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsVG9wIHx8IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsTGVmdCkpIHtcbiAgICAgICAgdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3A7XG4gICAgICAgIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgPSB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHVwZGF0ZUZvckZvY3VzQ2hhbmdlKHZpZXcpO1xufTtcbm9ic2VydmVycy5ibHVyID0gdmlldyA9PiB7XG4gICAgdmlldy5vYnNlcnZlci5jbGVhclNlbGVjdGlvblJhbmdlKCk7XG4gICAgdXBkYXRlRm9yRm9jdXNDaGFuZ2Uodmlldyk7XG59O1xub2JzZXJ2ZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSBvYnNlcnZlcnMuY29tcG9zaXRpb251cGRhdGUgPSB2aWV3ID0+IHtcbiAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPT0gbnVsbClcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSB0cnVlO1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCkge1xuICAgICAgICAvLyBGSVhNRSBwb3NzaWJseSBzZXQgYSB0aW1lb3V0IHRvIGNsZWFyIGl0IGFnYWluIG9uIEFuZHJvaWRcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IDA7XG4gICAgfVxufTtcbm9ic2VydmVycy5jb21wb3NpdGlvbmVuZCA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPSAtMTtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25FbmRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nS2V5ID0gdHJ1ZTtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlID0gdmlldy5vYnNlcnZlci5wZW5kaW5nUmVjb3JkcygpLmxlbmd0aCA+IDA7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBudWxsO1xuICAgIGlmIChicm93c2VyLmNocm9tZSAmJiBicm93c2VyLmFuZHJvaWQpIHtcbiAgICAgICAgLy8gRGVsYXkgZmx1c2hpbmcgZm9yIGEgYml0IG9uIEFuZHJvaWQgYmVjYXVzZSBpdCdsbCBvZnRlbiBmaXJlIGFcbiAgICAgICAgLy8gYnVuY2ggb2YgY29udHJhZGljdG9yeSBjaGFuZ2VzIGluIGEgcm93IGF0IGVuZCBvZiBjb21wb3NpdG9uXG4gICAgICAgIHZpZXcub2JzZXJ2ZXIuZmx1c2hTb29uKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UpIHtcbiAgICAgICAgLy8gSWYgd2UgZm91bmQgcGVuZGluZyByZWNvcmRzLCBzY2hlZHVsZSBhIGZsdXNoLlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHZpZXcub2JzZXJ2ZXIuZmx1c2goKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UsIG1ha2Ugc3VyZSB0aGF0LCBpZiBubyBjaGFuZ2VzIGNvbWUgaW4gc29vbiwgdGhlXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uIHZpZXcgaXMgY2xlYXJlZC5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA8IDAgJiYgdmlldy5kb2NWaWV3Lmhhc0NvbXBvc2l0aW9uKVxuICAgICAgICAgICAgICAgIHZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgfSwgNTApO1xuICAgIH1cbn07XG5vYnNlcnZlcnMuY29udGV4dG1lbnUgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdENvbnRleHRNZW51ID0gRGF0ZS5ub3coKTtcbn07XG5oYW5kbGVycy5iZWZvcmVpbnB1dCA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICAvLyBCZWNhdXNlIENocm9tZSBBbmRyb2lkIGRvZXNuJ3QgZmlyZSB1c2VmdWwga2V5IGV2ZW50cywgdXNlXG4gICAgLy8gYmVmb3JlaW5wdXQgdG8gZGV0ZWN0IGJhY2tzcGFjZSAoYW5kIHBvc3NpYmx5IGVudGVyIGFuZCBkZWxldGUsXG4gICAgLy8gYnV0IHRob3NlIHVzdWFsbHkgZG9uJ3QgZXZlbiBzZWVtIHRvIGZpcmUgYmVmb3JlaW5wdXQgZXZlbnRzIGF0XG4gICAgLy8gdGhlIG1vbWVudCkgYW5kIGZha2UgYSBrZXkgZXZlbnQgZm9yIGl0LlxuICAgIC8vXG4gICAgLy8gKHByZXZlbnREZWZhdWx0IG9uIGJlZm9yZWlucHV0LCB0aG91Z2ggc3VwcG9ydGVkIGluIHRoZSBzcGVjLFxuICAgIC8vIHNlZW1zIHRvIGRvIG5vdGhpbmcgYXQgYWxsIG9uIENocm9tZSkuXG4gICAgbGV0IHBlbmRpbmc7XG4gICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuYW5kcm9pZCAmJiAocGVuZGluZyA9IFBlbmRpbmdLZXlzLmZpbmQoa2V5ID0+IGtleS5pbnB1dFR5cGUgPT0gZXZlbnQuaW5wdXRUeXBlKSkpIHtcbiAgICAgICAgdmlldy5vYnNlcnZlci5kZWxheUFuZHJvaWRLZXkocGVuZGluZy5rZXksIHBlbmRpbmcua2V5Q29kZSk7XG4gICAgICAgIGlmIChwZW5kaW5nLmtleSA9PSBcIkJhY2tzcGFjZVwiIHx8IHBlbmRpbmcua2V5ID09IFwiRGVsZXRlXCIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFZpZXdIZWlnaHQgPSAoKF9hID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGVpZ2h0KSB8fCAwO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIC8vIEJhY2tzcGFjaW5nIG5lYXIgdW5lZGl0YWJsZSBub2RlcyBvbiBDaHJvbWUgQW5kcm9pZCBzb21ldGltZXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zZXMgdGhlIHZpcnR1YWwga2V5Ym9hcmQuIFRoaXMgdHJpZXMgdG8gY3J1ZGVseSBkZXRlY3RcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGFuZCByZWZvY3VzIHRvIGdldCBpdCBiYWNrLlxuICAgICAgICAgICAgICAgIGlmICgoKChfYSA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhlaWdodCkgfHwgMCkgPiBzdGFydFZpZXdIZWlnaHQgKyAxMCAmJiB2aWV3Lmhhc0ZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5jb25zdCBhcHBsaWVkRmlyZWZveEhhY2sgPSAvKkBfX1BVUkVfXyovbmV3IFNldDtcbi8vIEluIEZpcmVmb3gsIHdoZW4gY3V0L2NvcHkgaGFuZGxlcnMgYXJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCwgdGhhdFxuLy8gc29tZWhvdyBhdm9pZHMgYSBidWcgd2hlcmUgdGhvc2UgZXZlbnRzIGFyZW4ndCBmaXJlZCB3aGVuIHRoZVxuLy8gc2VsZWN0aW9uIGlzIGVtcHR5LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy8xMDgyXG4vLyBhbmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTk1OTYxXG5mdW5jdGlvbiBmaXJlZm94Q29weUN1dEhhY2soZG9jKSB7XG4gICAgaWYgKCFhcHBsaWVkRmlyZWZveEhhY2suaGFzKGRvYykpIHtcbiAgICAgICAgYXBwbGllZEZpcmVmb3hIYWNrLmFkZChkb2MpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgKCkgPT4geyB9KTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgKCkgPT4geyB9KTtcbiAgICB9XG59XG5cbmNvbnN0IHdyYXBwaW5nV2hpdGVTcGFjZSA9IFtcInByZS13cmFwXCIsIFwibm9ybWFsXCIsIFwicHJlLWxpbmVcIiwgXCJicmVhay1zcGFjZXNcIl07XG5jbGFzcyBIZWlnaHRPcmFjbGUge1xuICAgIGNvbnN0cnVjdG9yKGxpbmVXcmFwcGluZykge1xuICAgICAgICB0aGlzLmxpbmVXcmFwcGluZyA9IGxpbmVXcmFwcGluZztcbiAgICAgICAgdGhpcy5kb2MgPSBUZXh0LmVtcHR5O1xuICAgICAgICB0aGlzLmhlaWdodFNhbXBsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gMTQ7IC8vIFRoZSBoZWlnaHQgb2YgYW4gZW50aXJlIGxpbmUgKGxpbmUtaGVpZ2h0KVxuICAgICAgICB0aGlzLmNoYXJXaWR0aCA9IDc7XG4gICAgICAgIHRoaXMudGV4dEhlaWdodCA9IDE0OyAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBhY3R1YWwgZm9udCAoZm9udC1zaXplKVxuICAgICAgICB0aGlzLmxpbmVMZW5ndGggPSAzMDtcbiAgICAgICAgLy8gVXNlZCB0byB0cmFjaywgZHVyaW5nIHVwZGF0ZUhlaWdodCwgaWYgYW55IGFjdHVhbCBoZWlnaHRzIGNoYW5nZWRcbiAgICAgICAgdGhpcy5oZWlnaHRDaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIGhlaWdodEZvckdhcChmcm9tLCB0bykge1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmRvYy5saW5lQXQodG8pLm51bWJlciAtIHRoaXMuZG9jLmxpbmVBdChmcm9tKS5udW1iZXIgKyAxO1xuICAgICAgICBpZiAodGhpcy5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICBsaW5lcyArPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKCh0byAtIGZyb20pIC0gKGxpbmVzICogdGhpcy5saW5lTGVuZ3RoICogMC41KSkgLyB0aGlzLmxpbmVMZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUhlaWdodCAqIGxpbmVzO1xuICAgIH1cbiAgICBoZWlnaHRGb3JMaW5lKGxlbmd0aCkge1xuICAgICAgICBpZiAoIXRoaXMubGluZVdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGluZUhlaWdodDtcbiAgICAgICAgbGV0IGxpbmVzID0gMSArIE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVuZ3RoIC0gdGhpcy5saW5lTGVuZ3RoKSAvICh0aGlzLmxpbmVMZW5ndGggLSA1KSkpO1xuICAgICAgICByZXR1cm4gbGluZXMgKiB0aGlzLmxpbmVIZWlnaHQ7XG4gICAgfVxuICAgIHNldERvYyhkb2MpIHsgdGhpcy5kb2MgPSBkb2M7IHJldHVybiB0aGlzOyB9XG4gICAgbXVzdFJlZnJlc2hGb3JXcmFwcGluZyh3aGl0ZVNwYWNlKSB7XG4gICAgICAgIHJldHVybiAod3JhcHBpbmdXaGl0ZVNwYWNlLmluZGV4T2Yod2hpdGVTcGFjZSkgPiAtMSkgIT0gdGhpcy5saW5lV3JhcHBpbmc7XG4gICAgfVxuICAgIG11c3RSZWZyZXNoRm9ySGVpZ2h0cyhsaW5lSGVpZ2h0cykge1xuICAgICAgICBsZXQgbmV3SGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZUhlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBoID0gbGluZUhlaWdodHNbaV07XG4gICAgICAgICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5oZWlnaHRTYW1wbGVzW01hdGguZmxvb3IoaCAqIDEwKV0pIHsgLy8gUm91bmQgdG8gLjEgcGl4ZWxzXG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodFNhbXBsZXNbTWF0aC5mbG9vcihoICogMTApXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0hlaWdodDtcbiAgICB9XG4gICAgcmVmcmVzaCh3aGl0ZVNwYWNlLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQsIGxpbmVMZW5ndGgsIGtub3duSGVpZ2h0cykge1xuICAgICAgICBsZXQgbGluZVdyYXBwaW5nID0gd3JhcHBpbmdXaGl0ZVNwYWNlLmluZGV4T2Yod2hpdGVTcGFjZSkgPiAtMTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSBNYXRoLnJvdW5kKGxpbmVIZWlnaHQpICE9IE1hdGgucm91bmQodGhpcy5saW5lSGVpZ2h0KSB8fCB0aGlzLmxpbmVXcmFwcGluZyAhPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMubGluZVdyYXBwaW5nID0gbGluZVdyYXBwaW5nO1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0O1xuICAgICAgICB0aGlzLmNoYXJXaWR0aCA9IGNoYXJXaWR0aDtcbiAgICAgICAgdGhpcy50ZXh0SGVpZ2h0ID0gdGV4dEhlaWdodDtcbiAgICAgICAgdGhpcy5saW5lTGVuZ3RoID0gbGluZUxlbmd0aDtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm93bkhlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaCA9IGtub3duSGVpZ2h0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaCA8IDApXG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlc1tNYXRoLmZsb29yKGggKiAxMCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG59XG4vLyBUaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGB1cGRhdGVIZWlnaHRgIHRvIG1ha2UgRE9NIG1lYXN1cmVtZW50c1xuLy8gYXJyaXZlIGF0IHRoZSByaWdodCBuaWRlcy4gVGhlIGBoZWlnaHRzYCBhcnJheSBpcyBhIHNlcXVlbmNlIG9mXG4vLyBibG9jayBoZWlnaHRzLCBzdGFydGluZyBmcm9tIHBvc2l0aW9uIGBmcm9tYC5cbmNsYXNzIE1lYXN1cmVkSGVpZ2h0cyB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgaGVpZ2h0cykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmhlaWdodHMgPSBoZWlnaHRzO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgZ2V0IG1vcmUoKSB7IHJldHVybiB0aGlzLmluZGV4IDwgdGhpcy5oZWlnaHRzLmxlbmd0aDsgfVxufVxuLyoqXG5SZWNvcmQgdXNlZCB0byByZXByZXNlbnQgaW5mb3JtYXRpb24gYWJvdXQgYSBibG9jay1sZXZlbCBlbGVtZW50XG5pbiB0aGUgZWRpdG9yIHZpZXcuXG4qL1xuY2xhc3MgQmxvY2tJbmZvIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBlbGVtZW50LlxuICAgICovXG4gICAgbGVuZ3RoLCBcbiAgICAvKipcbiAgICBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IChyZWxhdGl2ZSB0byB0aGUgdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50KS5cbiAgICAqL1xuICAgIHRvcCwgXG4gICAgLyoqXG4gICAgSXRzIGhlaWdodC5cbiAgICAqL1xuICAgIGhlaWdodCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsIFdlaXJkIHBhY2tlZCBmaWVsZCB0aGF0IGhvbGRzIGFuIGFycmF5IG9mIGNoaWxkcmVuXG4gICAgZm9yIGNvbXBvc2l0ZSBibG9ja3MsIGEgZGVjb3JhdGlvbiBmb3IgYmxvY2sgd2lkZ2V0cywgYW5kIGFcbiAgICBudW1iZXIgaW5kaWNhdGluZyB0aGUgYW1vdW50IG9mIHdpZGdldC1jcmVhdGUgbGluZSBicmVha3MgZm9yXG4gICAgdGV4dCBibG9ja3MuXG4gICAgKi9cbiAgICBfY29udGVudCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gX2NvbnRlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBpcy4gV2hlbiBxdWVyeWluZyBsaW5lcywgdGhpcyBtYXkgYmVcbiAgICBhbiBhcnJheSBvZiBhbGwgdGhlIGJsb2NrcyB0aGF0IG1ha2UgdXAgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb250ZW50ID09IFwibnVtYmVyXCIgPyBCbG9ja1R5cGUuVGV4dCA6XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuX2NvbnRlbnQpID8gdGhpcy5fY29udGVudCA6IHRoaXMuX2NvbnRlbnQudHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgZWxlbWVudCBhcyBhIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5mcm9tICsgdGhpcy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBUaGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LlxuICAgICovXG4gICAgZ2V0IGJvdHRvbSgpIHsgcmV0dXJuIHRoaXMudG9wICsgdGhpcy5oZWlnaHQ7IH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgd2lkZ2V0IGJsb2NrLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3aWRnZXRcbiAgICBhc3NvY2lhdGVkIHdpdGggaXQuXG4gICAgKi9cbiAgICBnZXQgd2lkZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudCBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbiA/IHRoaXMuX2NvbnRlbnQud2lkZ2V0IDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBhIHRleHRibG9jaywgdGhpcyBob2xkcyB0aGUgbnVtYmVyIG9mIGxpbmUgYnJlYWtzXG4gICAgdGhhdCBhcHBlYXIgaW4gd2lkZ2V0cyBpbnNpZGUgdGhlIGJsb2NrLlxuICAgICovXG4gICAgZ2V0IHdpZGdldExpbmVCcmVha3MoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fY29udGVudCA9PSBcIm51bWJlclwiID8gdGhpcy5fY29udGVudCA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgam9pbihvdGhlcikge1xuICAgICAgICBsZXQgY29udGVudCA9IChBcnJheS5pc0FycmF5KHRoaXMuX2NvbnRlbnQpID8gdGhpcy5fY29udGVudCA6IFt0aGlzXSlcbiAgICAgICAgICAgIC5jb25jYXQoQXJyYXkuaXNBcnJheShvdGhlci5fY29udGVudCkgPyBvdGhlci5fY29udGVudCA6IFtvdGhlcl0pO1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyh0aGlzLmZyb20sIHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoLCB0aGlzLnRvcCwgdGhpcy5oZWlnaHQgKyBvdGhlci5oZWlnaHQsIGNvbnRlbnQpO1xuICAgIH1cbn1cbnZhciBRdWVyeVR5cGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChRdWVyeVR5cGUpIHtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlQb3NcIl0gPSAwXSA9IFwiQnlQb3NcIjtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlIZWlnaHRcIl0gPSAxXSA9IFwiQnlIZWlnaHRcIjtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlQb3NOb0hlaWdodFwiXSA9IDJdID0gXCJCeVBvc05vSGVpZ2h0XCI7XG5yZXR1cm4gUXVlcnlUeXBlfSkoUXVlcnlUeXBlIHx8IChRdWVyeVR5cGUgPSB7fSkpO1xuY29uc3QgRXBzaWxvbiA9IDFlLTM7XG5jbGFzcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgLy8gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvdmVyZWRcbiAgICBoZWlnaHQsIC8vIEhlaWdodCBvZiB0aGlzIHBhcnQgb2YgdGhlIGRvY3VtZW50XG4gICAgZmxhZ3MgPSAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIGdldCBvdXRkYXRlZCgpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBGbGFnLk91dGRhdGVkICovKSA+IDA7IH1cbiAgICBzZXQgb3V0ZGF0ZWQodmFsdWUpIHsgdGhpcy5mbGFncyA9ICh2YWx1ZSA/IDIgLyogRmxhZy5PdXRkYXRlZCAqLyA6IDApIHwgKHRoaXMuZmxhZ3MgJiB+MiAvKiBGbGFnLk91dGRhdGVkICovKTsgfVxuICAgIHNldEhlaWdodChvcmFjbGUsIGhlaWdodCkge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5oZWlnaHQgLSBoZWlnaHQpID4gRXBzaWxvbilcbiAgICAgICAgICAgICAgICBvcmFjbGUuaGVpZ2h0Q2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIGNhc2UgaXMgdG8gcmVwbGFjZSBhIGxlYWYgbm9kZSwgd2hpY2ggc2ltcGx5IGJ1aWxkcyBhIHRyZWVcbiAgICAvLyBmcm9tIHRoZSBuZXcgbm9kZXMgYW5kIHJldHVybnMgdGhhdCAoSGVpZ2h0TWFwQnJhbmNoIGFuZFxuICAgIC8vIEhlaWdodE1hcEdhcCBvdmVycmlkZSB0aGlzIHRvIGFjdHVhbGx5IHVzZSBmcm9tL3RvKVxuICAgIHJlcGxhY2UoX2Zyb20sIF90bywgbm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgfVxuICAgIC8vIEFnYWluLCB0aGVzZSBhcmUgYmFzZSBjYXNlcywgYW5kIGFyZSBvdmVycmlkZGVuIGZvciBicmFuY2ggYW5kIGdhcCBub2Rlcy5cbiAgICBkZWNvbXBvc2VMZWZ0KF90bywgcmVzdWx0KSB7IHJlc3VsdC5wdXNoKHRoaXMpOyB9XG4gICAgZGVjb21wb3NlUmlnaHQoX2Zyb20sIHJlc3VsdCkgeyByZXN1bHQucHVzaCh0aGlzKTsgfVxuICAgIGFwcGx5Q2hhbmdlcyhkZWNvcmF0aW9ucywgb2xkRG9jLCBvcmFjbGUsIGNoYW5nZXMpIHtcbiAgICAgICAgbGV0IG1lID0gdGhpcywgZG9jID0gb3JhY2xlLmRvYztcbiAgICAgICAgZm9yIChsZXQgaSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB7IGZyb21BLCB0b0EsIGZyb21CLCB0b0IgfSA9IGNoYW5nZXNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBtZS5saW5lQXQoZnJvbUEsIFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0LCBvcmFjbGUuc2V0RG9jKG9sZERvYyksIDAsIDApO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0LnRvID49IHRvQSA/IHN0YXJ0IDogbWUubGluZUF0KHRvQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZSwgMCwgMCk7XG4gICAgICAgICAgICB0b0IgKz0gZW5kLnRvIC0gdG9BO1xuICAgICAgICAgICAgdG9BID0gZW5kLnRvO1xuICAgICAgICAgICAgd2hpbGUgKGkgPiAwICYmIHN0YXJ0LmZyb20gPD0gY2hhbmdlc1tpIC0gMV0udG9BKSB7XG4gICAgICAgICAgICAgICAgZnJvbUEgPSBjaGFuZ2VzW2kgLSAxXS5mcm9tQTtcbiAgICAgICAgICAgICAgICBmcm9tQiA9IGNoYW5nZXNbaSAtIDFdLmZyb21CO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUEgPCBzdGFydC5mcm9tKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG1lLmxpbmVBdChmcm9tQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZSwgMCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tQiArPSBzdGFydC5mcm9tIC0gZnJvbUE7XG4gICAgICAgICAgICBmcm9tQSA9IHN0YXJ0LmZyb207XG4gICAgICAgICAgICBsZXQgbm9kZXMgPSBOb2RlQnVpbGRlci5idWlsZChvcmFjbGUuc2V0RG9jKGRvYyksIGRlY29yYXRpb25zLCBmcm9tQiwgdG9CKTtcbiAgICAgICAgICAgIG1lID0gbWUucmVwbGFjZShmcm9tQSwgdG9BLCBub2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lLnVwZGF0ZUhlaWdodChvcmFjbGUsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHkoKSB7IHJldHVybiBuZXcgSGVpZ2h0TWFwVGV4dCgwLCAwKTsgfVxuICAgIC8vIG5vZGVzIHVzZXMgbnVsbCB2YWx1ZXMgdG8gaW5kaWNhdGUgdGhlIHBvc2l0aW9uIG9mIGxpbmUgYnJlYWtzLlxuICAgIC8vIFRoZXJlIGFyZSBuZXZlciBsaW5lIGJyZWFrcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBhcnJheSwgb3JcbiAgICAvLyB0d28gbGluZSBicmVha3MgbmV4dCB0byBlYWNoIG90aGVyLCBhbmQgdGhlIGFycmF5IGlzbid0IGFsbG93ZWRcbiAgICAvLyB0byBiZSBlbXB0eSAoc2FtZSByZXN0cmljdGlvbnMgYXMgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGJ1aWxkZXIpLlxuICAgIHN0YXRpYyBvZihub2Rlcykge1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDEpXG4gICAgICAgICAgICByZXR1cm4gbm9kZXNbMF07XG4gICAgICAgIGxldCBpID0gMCwgaiA9IG5vZGVzLmxlbmd0aCwgYmVmb3JlID0gMCwgYWZ0ZXIgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSA+IGFmdGVyICogMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXQgPSBub2Rlc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5icmVhaylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZSgtLWksIDEsIHNwbGl0LmxlZnQsIG51bGwsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKC0taSwgMSwgc3BsaXQubGVmdCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBqICs9IDEgKyBzcGxpdC5icmVhaztcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIC09IHNwbGl0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyID4gYmVmb3JlICogMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXQgPSBub2Rlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0LmJyZWFrKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEsIHNwbGl0LmxlZnQsIG51bGwsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEsIHNwbGl0LmxlZnQsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgaiArPSAyICsgc3BsaXQuYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyIC09IHNwbGl0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZWZvcmUgPCBhZnRlcikge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZXNbaSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dClcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlICs9IG5leHQuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZXNbLS1qXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dClcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgKz0gbmV4dC5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBicmsgPSAwO1xuICAgICAgICBpZiAobm9kZXNbaSAtIDFdID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyayA9IDE7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgYnJrID0gMTtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhlaWdodE1hcEJyYW5jaChIZWlnaHRNYXAub2Yobm9kZXMuc2xpY2UoMCwgaSkpLCBicmssIEhlaWdodE1hcC5vZihub2Rlcy5zbGljZShqKSkpO1xuICAgIH1cbn1cbkhlaWdodE1hcC5wcm90b3R5cGUuc2l6ZSA9IDE7XG5jbGFzcyBIZWlnaHRNYXBCbG9jayBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBoZWlnaHQsIGRlY28pIHtcbiAgICAgICAgc3VwZXIobGVuZ3RoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmRlY28gPSBkZWNvO1xuICAgIH1cbiAgICBibG9ja0F0KF9oZWlnaHQsIF9vcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKG9mZnNldCwgdGhpcy5sZW5ndGgsIHRvcCwgdGhpcy5oZWlnaHQsIHRoaXMuZGVjbyB8fCAwKTtcbiAgICB9XG4gICAgbGluZUF0KF92YWx1ZSwgX3R5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tBdCgwLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgaWYgKGZyb20gPD0gb2Zmc2V0ICsgdGhpcy5sZW5ndGggJiYgdG8gPj0gb2Zmc2V0KVxuICAgICAgICAgICAgZih0aGlzLmJsb2NrQXQoMCwgb3JhY2xlLCB0b3AsIG9mZnNldCkpO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBfZm9yY2UgPSBmYWxzZSwgbWVhc3VyZWQpIHtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChvcmFjbGUsIG1lYXN1cmVkLmhlaWdodHNbbWVhc3VyZWQuaW5kZXgrK10pO1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBibG9jaygke3RoaXMubGVuZ3RofSlgOyB9XG59XG5jbGFzcyBIZWlnaHRNYXBUZXh0IGV4dGVuZHMgSGVpZ2h0TWFwQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHN1cGVyKGxlbmd0aCwgaGVpZ2h0LCBudWxsKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSAwOyAvLyBBbW91bnQgb2YgY29sbGFwc2VkIGNvbnRlbnQgaW4gdGhlIGxpbmVcbiAgICAgICAgdGhpcy53aWRnZXRIZWlnaHQgPSAwOyAvLyBNYXhpbXVtIGlubGluZSB3aWRnZXQgaGVpZ2h0XG4gICAgICAgIHRoaXMuYnJlYWtzID0gMDsgLy8gTnVtYmVyIG9mIHdpZGdldC1pbnRyb2R1Y2VkIGxpbmUgYnJlYWtzIG9uIHRoZSBsaW5lXG4gICAgfVxuICAgIGJsb2NrQXQoX2hlaWdodCwgX29yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8ob2Zmc2V0LCB0aGlzLmxlbmd0aCwgdG9wLCB0aGlzLmhlaWdodCwgdGhpcy5icmVha3MpO1xuICAgIH1cbiAgICByZXBsYWNlKF9mcm9tLCBfdG8sIG5vZGVzKSB7XG4gICAgICAgIGxldCBub2RlID0gbm9kZXNbMF07XG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMSAmJiAobm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQgfHwgbm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcCAmJiAobm9kZS5mbGFncyAmIDQgLyogRmxhZy5TaW5nbGVMaW5lICovKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKHRoaXMubGVuZ3RoIC0gbm9kZS5sZW5ndGgpIDwgMTApIHtcbiAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwKVxuICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgSGVpZ2h0TWFwVGV4dChub2RlLmxlbmd0aCwgdGhpcy5oZWlnaHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vZGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3V0ZGF0ZWQpXG4gICAgICAgICAgICAgICAgbm9kZS5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgJiYgbWVhc3VyZWQubW9yZSlcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KG9yYWNsZSwgbWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXSk7XG4gICAgICAgIGVsc2UgaWYgKGZvcmNlIHx8IHRoaXMub3V0ZGF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChvcmFjbGUsIE1hdGgubWF4KHRoaXMud2lkZ2V0SGVpZ2h0LCBvcmFjbGUuaGVpZ2h0Rm9yTGluZSh0aGlzLmxlbmd0aCAtIHRoaXMuY29sbGFwc2VkKSkgK1xuICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtzICogb3JhY2xlLmxpbmVIZWlnaHQpO1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBsaW5lKCR7dGhpcy5sZW5ndGh9JHt0aGlzLmNvbGxhcHNlZCA/IC10aGlzLmNvbGxhcHNlZCA6IFwiXCJ9JHt0aGlzLndpZGdldEhlaWdodCA/IFwiOlwiICsgdGhpcy53aWRnZXRIZWlnaHQgOiBcIlwifSlgO1xuICAgIH1cbn1cbmNsYXNzIEhlaWdodE1hcEdhcCBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoKSB7IHN1cGVyKGxlbmd0aCwgMCk7IH1cbiAgICBoZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBmaXJzdExpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChvZmZzZXQpLm51bWJlciwgbGFzdExpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChvZmZzZXQgKyB0aGlzLmxlbmd0aCkubnVtYmVyO1xuICAgICAgICBsZXQgbGluZXMgPSBsYXN0TGluZSAtIGZpcnN0TGluZSArIDE7XG4gICAgICAgIGxldCBwZXJMaW5lLCBwZXJDaGFyID0gMDtcbiAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbFBlckxpbmUgPSBNYXRoLm1pbih0aGlzLmhlaWdodCwgb3JhY2xlLmxpbmVIZWlnaHQgKiBsaW5lcyk7XG4gICAgICAgICAgICBwZXJMaW5lID0gdG90YWxQZXJMaW5lIC8gbGluZXM7XG4gICAgICAgICAgICBpZiAodGhpcy5sZW5ndGggPiBsaW5lcyArIDEpXG4gICAgICAgICAgICAgICAgcGVyQ2hhciA9ICh0aGlzLmhlaWdodCAtIHRvdGFsUGVyTGluZSkgLyAodGhpcy5sZW5ndGggLSBsaW5lcyAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVyTGluZSA9IHRoaXMuaGVpZ2h0IC8gbGluZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlyc3RMaW5lLCBsYXN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9O1xuICAgIH1cbiAgICBibG9ja0F0KGhlaWdodCwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIGxhc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH0gPSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpO1xuICAgICAgICBpZiAob3JhY2xlLmxpbmVXcmFwcGluZykge1xuICAgICAgICAgICAgbGV0IGd1ZXNzID0gb2Zmc2V0ICsgTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoaGVpZ2h0IC0gdG9wKSAvIHRoaXMuaGVpZ2h0KSkgKiB0aGlzLmxlbmd0aCk7XG4gICAgICAgICAgICBsZXQgbGluZSA9IG9yYWNsZS5kb2MubGluZUF0KGd1ZXNzKSwgbGluZUhlaWdodCA9IHBlckxpbmUgKyBsaW5lLmxlbmd0aCAqIHBlckNoYXI7XG4gICAgICAgICAgICBsZXQgbGluZVRvcCA9IE1hdGgubWF4KHRvcCwgaGVpZ2h0IC0gbGluZUhlaWdodCAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8obGluZS5mcm9tLCBsaW5lLmxlbmd0aCwgbGluZVRvcCwgbGluZUhlaWdodCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxhc3RMaW5lIC0gZmlyc3RMaW5lLCBNYXRoLmZsb29yKChoZWlnaHQgLSB0b3ApIC8gcGVyTGluZSkpKTtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIGxlbmd0aCB9ID0gb3JhY2xlLmRvYy5saW5lKGZpcnN0TGluZSArIGxpbmUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8oZnJvbSwgbGVuZ3RoLCB0b3AgKyBwZXJMaW5lICogbGluZSwgcGVyTGluZSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0eXBlID09IFF1ZXJ5VHlwZS5CeUhlaWdodClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJsb2NrQXQodmFsdWUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpO1xuICAgICAgICBpZiAodHlwZSA9PSBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCkge1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IG9yYWNsZS5kb2MubGluZUF0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGZyb20sIHRvIC0gZnJvbSwgMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgZmlyc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH0gPSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpO1xuICAgICAgICBsZXQgbGluZSA9IG9yYWNsZS5kb2MubGluZUF0KHZhbHVlKSwgbGluZUhlaWdodCA9IHBlckxpbmUgKyBsaW5lLmxlbmd0aCAqIHBlckNoYXI7XG4gICAgICAgIGxldCBsaW5lc0Fib3ZlID0gbGluZS5udW1iZXIgLSBmaXJzdExpbmU7XG4gICAgICAgIGxldCBsaW5lVG9wID0gdG9wICsgcGVyTGluZSAqIGxpbmVzQWJvdmUgKyBwZXJDaGFyICogKGxpbmUuZnJvbSAtIG9mZnNldCAtIGxpbmVzQWJvdmUpO1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhsaW5lLmZyb20sIGxpbmUubGVuZ3RoLCBNYXRoLm1heCh0b3AsIE1hdGgubWluKGxpbmVUb3AsIHRvcCArIHRoaXMuaGVpZ2h0IC0gbGluZUhlaWdodCkpLCBsaW5lSGVpZ2h0LCAwKTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgZnJvbSA9IE1hdGgubWF4KGZyb20sIG9mZnNldCk7XG4gICAgICAgIHRvID0gTWF0aC5taW4odG8sIG9mZnNldCArIHRoaXMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHsgZmlyc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH0gPSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSBmcm9tLCBsaW5lVG9wID0gdG9wOyBwb3MgPD0gdG87KSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IG9yYWNsZS5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgICAgICBpZiAocG9zID09IGZyb20pIHtcbiAgICAgICAgICAgICAgICBsZXQgbGluZXNBYm92ZSA9IGxpbmUubnVtYmVyIC0gZmlyc3RMaW5lO1xuICAgICAgICAgICAgICAgIGxpbmVUb3AgKz0gcGVyTGluZSAqIGxpbmVzQWJvdmUgKyBwZXJDaGFyICogKGZyb20gLSBvZmZzZXQgLSBsaW5lc0Fib3ZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIHBlckNoYXIgKiBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGYobmV3IEJsb2NrSW5mbyhsaW5lLmZyb20sIGxpbmUubGVuZ3RoLCBsaW5lVG9wLCBsaW5lSGVpZ2h0LCAwKSk7XG4gICAgICAgICAgICBsaW5lVG9wICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBwb3MgPSBsaW5lLnRvICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCBub2Rlcykge1xuICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmxlbmd0aCAtIHRvO1xuICAgICAgICBpZiAoYWZ0ZXIgPiAwKSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0gPSBuZXcgSGVpZ2h0TWFwR2FwKGxhc3QubGVuZ3RoICsgYWZ0ZXIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobnVsbCwgbmV3IEhlaWdodE1hcEdhcChhZnRlciAtIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnJvbSA+IDApIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IG5vZGVzWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwKVxuICAgICAgICAgICAgICAgIG5vZGVzWzBdID0gbmV3IEhlaWdodE1hcEdhcChmcm9tICsgZmlyc3QubGVuZ3RoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBub2Rlcy51bnNoaWZ0KG5ldyBIZWlnaHRNYXBHYXAoZnJvbSAtIDEpLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICB9XG4gICAgZGVjb21wb3NlTGVmdCh0bywgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBIZWlnaHRNYXBHYXAodG8gLSAxKSwgbnVsbCk7XG4gICAgfVxuICAgIGRlY29tcG9zZVJpZ2h0KGZyb20sIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQucHVzaChudWxsLCBuZXcgSGVpZ2h0TWFwR2FwKHRoaXMubGVuZ3RoIC0gZnJvbSAtIDEpKTtcbiAgICB9XG4gICAgdXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0ID0gMCwgZm9yY2UgPSBmYWxzZSwgbWVhc3VyZWQpIHtcbiAgICAgICAgbGV0IGVuZCA9IG9mZnNldCArIHRoaXMubGVuZ3RoO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgKyB0aGlzLmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHBhcnQgb2YgdGhpcyBnYXAgd2l0aCBtZWFzdXJlZCBsaW5lcy4gV2Uga25vdyB0aGVyZVxuICAgICAgICAgICAgLy8gY2FuJ3QgYmUgd2lkZ2V0cyBvciBjb2xsYXBzZWQgcmFuZ2VzIGluIHRob3NlIGxpbmVzLCBiZWNhdXNlXG4gICAgICAgICAgICAvLyB0aGV5IHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBoZWlnaHRtYXAgKGdhcHNcbiAgICAgICAgICAgIC8vIG9ubHkgY29udGFpbiBwbGFpbiB0ZXh0KS5cbiAgICAgICAgICAgIGxldCBub2RlcyA9IFtdLCBwb3MgPSBNYXRoLm1heChvZmZzZXQsIG1lYXN1cmVkLmZyb20pLCBzaW5nbGVIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgIGlmIChtZWFzdXJlZC5mcm9tID4gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobmV3IEhlaWdodE1hcEdhcChtZWFzdXJlZC5mcm9tIC0gb2Zmc2V0IC0gMSkudXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB3aGlsZSAocG9zIDw9IGVuZCAmJiBtZWFzdXJlZC5tb3JlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IG9yYWNsZS5kb2MubGluZUF0KHBvcykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChub2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IG1lYXN1cmVkLmhlaWdodHNbbWVhc3VyZWQuaW5kZXgrK107XG4gICAgICAgICAgICAgICAgaWYgKHNpbmdsZUhlaWdodCA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlSGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKE1hdGguYWJzKGhlaWdodCAtIHNpbmdsZUhlaWdodCkgPj0gRXBzaWxvbilcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlSGVpZ2h0ID0gLTI7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBuZXcgSGVpZ2h0TWFwVGV4dChsZW4sIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgbGluZS5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zIDw9IGVuZClcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG51bGwsIG5ldyBIZWlnaHRNYXBHYXAoZW5kIC0gcG9zKS51cGRhdGVIZWlnaHQob3JhY2xlLCBwb3MpKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgICAgICAgICAgaWYgKHNpbmdsZUhlaWdodCA8IDAgfHwgTWF0aC5hYnMocmVzdWx0LmhlaWdodCAtIHRoaXMuaGVpZ2h0KSA+PSBFcHNpbG9uIHx8XG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoc2luZ2xlSGVpZ2h0IC0gdGhpcy5oZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KS5wZXJMaW5lKSA+PSBFcHNpbG9uKVxuICAgICAgICAgICAgICAgIG9yYWNsZS5oZWlnaHRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgdGhpcy5vdXRkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQob3JhY2xlLCBvcmFjbGUuaGVpZ2h0Rm9yR2FwKG9mZnNldCwgb2Zmc2V0ICsgdGhpcy5sZW5ndGgpKTtcbiAgICAgICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgZ2FwKCR7dGhpcy5sZW5ndGh9KWA7IH1cbn1cbmNsYXNzIEhlaWdodE1hcEJyYW5jaCBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVmdCwgYnJrLCByaWdodCkge1xuICAgICAgICBzdXBlcihsZWZ0Lmxlbmd0aCArIGJyayArIHJpZ2h0Lmxlbmd0aCwgbGVmdC5oZWlnaHQgKyByaWdodC5oZWlnaHQsIGJyayB8IChsZWZ0Lm91dGRhdGVkIHx8IHJpZ2h0Lm91dGRhdGVkID8gMiAvKiBGbGFnLk91dGRhdGVkICovIDogMCkpO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGxlZnQuc2l6ZSArIHJpZ2h0LnNpemU7XG4gICAgfVxuICAgIGdldCBicmVhaygpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiAxIC8qIEZsYWcuQnJlYWsgKi87IH1cbiAgICBibG9ja0F0KGhlaWdodCwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBsZXQgbWlkID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodDtcbiAgICAgICAgcmV0dXJuIGhlaWdodCA8IG1pZCA/IHRoaXMubGVmdC5ibG9ja0F0KGhlaWdodCwgb3JhY2xlLCB0b3AsIG9mZnNldClcbiAgICAgICAgICAgIDogdGhpcy5yaWdodC5ibG9ja0F0KGhlaWdodCwgb3JhY2xlLCBtaWQsIG9mZnNldCArIHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrKTtcbiAgICB9XG4gICAgbGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCByaWdodFRvcCA9IHRvcCArIHRoaXMubGVmdC5oZWlnaHQsIHJpZ2h0T2Zmc2V0ID0gb2Zmc2V0ICsgdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWs7XG4gICAgICAgIGxldCBsZWZ0ID0gdHlwZSA9PSBRdWVyeVR5cGUuQnlIZWlnaHQgPyB2YWx1ZSA8IHJpZ2h0VG9wIDogdmFsdWUgPCByaWdodE9mZnNldDtcbiAgICAgICAgbGV0IGJhc2UgPSBsZWZ0ID8gdGhpcy5sZWZ0LmxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCB0b3AsIG9mZnNldClcbiAgICAgICAgICAgIDogdGhpcy5yaWdodC5saW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0KTtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWsgfHwgKGxlZnQgPyBiYXNlLnRvIDwgcmlnaHRPZmZzZXQgOiBiYXNlLmZyb20gPiByaWdodE9mZnNldCkpXG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgbGV0IHN1YlF1ZXJ5ID0gdHlwZSA9PSBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCA/IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0IDogUXVlcnlUeXBlLkJ5UG9zO1xuICAgICAgICBpZiAobGVmdClcbiAgICAgICAgICAgIHJldHVybiBiYXNlLmpvaW4odGhpcy5yaWdodC5saW5lQXQocmlnaHRPZmZzZXQsIHN1YlF1ZXJ5LCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0LmxpbmVBdChyaWdodE9mZnNldCwgc3ViUXVlcnksIG9yYWNsZSwgdG9wLCBvZmZzZXQpLmpvaW4oYmFzZSk7XG4gICAgfVxuICAgIGZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKSB7XG4gICAgICAgIGxldCByaWdodFRvcCA9IHRvcCArIHRoaXMubGVmdC5oZWlnaHQsIHJpZ2h0T2Zmc2V0ID0gb2Zmc2V0ICsgdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWs7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrKSB7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IHJpZ2h0T2Zmc2V0KVxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5mb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZik7XG4gICAgICAgICAgICBpZiAodG8gPj0gcmlnaHRPZmZzZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5mb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQsIGYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1pZCA9IHRoaXMubGluZUF0KHJpZ2h0T2Zmc2V0LCBRdWVyeVR5cGUuQnlQb3MsIG9yYWNsZSwgdG9wLCBvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKGZyb20gPCBtaWQuZnJvbSlcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaExpbmUoZnJvbSwgbWlkLmZyb20gLSAxLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKTtcbiAgICAgICAgICAgIGlmIChtaWQudG8gPj0gZnJvbSAmJiBtaWQuZnJvbSA8PSB0bylcbiAgICAgICAgICAgICAgICBmKG1pZCk7XG4gICAgICAgICAgICBpZiAodG8gPiBtaWQudG8pXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5mb3JFYWNoTGluZShtaWQudG8gKyAxLCB0bywgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQsIGYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIG5vZGVzKSB7XG4gICAgICAgIGxldCByaWdodFN0YXJ0ID0gdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWs7XG4gICAgICAgIGlmICh0byA8IHJpZ2h0U3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZCh0aGlzLmxlZnQucmVwbGFjZShmcm9tLCB0bywgbm9kZXMpLCB0aGlzLnJpZ2h0KTtcbiAgICAgICAgaWYgKGZyb20gPiB0aGlzLmxlZnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFsYW5jZWQodGhpcy5sZWZ0LCB0aGlzLnJpZ2h0LnJlcGxhY2UoZnJvbSAtIHJpZ2h0U3RhcnQsIHRvIC0gcmlnaHRTdGFydCwgbm9kZXMpKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAoZnJvbSA+IDApXG4gICAgICAgICAgICB0aGlzLmRlY29tcG9zZUxlZnQoZnJvbSwgcmVzdWx0KTtcbiAgICAgICAgbGV0IGxlZnQgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBub2RlIG9mIG5vZGVzKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChmcm9tID4gMClcbiAgICAgICAgICAgIG1lcmdlR2FwcyhyZXN1bHQsIGxlZnQgLSAxKTtcbiAgICAgICAgaWYgKHRvIDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByaWdodCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmRlY29tcG9zZVJpZ2h0KHRvLCByZXN1bHQpO1xuICAgICAgICAgICAgbWVyZ2VHYXBzKHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIZWlnaHRNYXAub2YocmVzdWx0KTtcbiAgICB9XG4gICAgZGVjb21wb3NlTGVmdCh0bywgcmVzdWx0KSB7XG4gICAgICAgIGxldCBsZWZ0ID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRvIDw9IGxlZnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0LmRlY29tcG9zZUxlZnQodG8sIHJlc3VsdCk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubGVmdCk7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrKSB7XG4gICAgICAgICAgICBsZWZ0Kys7XG4gICAgICAgICAgICBpZiAodG8gPj0gbGVmdClcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG8gPiBsZWZ0KVxuICAgICAgICAgICAgdGhpcy5yaWdodC5kZWNvbXBvc2VMZWZ0KHRvIC0gbGVmdCwgcmVzdWx0KTtcbiAgICB9XG4gICAgZGVjb21wb3NlUmlnaHQoZnJvbSwgcmVzdWx0KSB7XG4gICAgICAgIGxldCBsZWZ0ID0gdGhpcy5sZWZ0Lmxlbmd0aCwgcmlnaHQgPSBsZWZ0ICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKGZyb20gPj0gcmlnaHQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5kZWNvbXBvc2VSaWdodChmcm9tIC0gcmlnaHQsIHJlc3VsdCk7XG4gICAgICAgIGlmIChmcm9tIDwgbGVmdClcbiAgICAgICAgICAgIHRoaXMubGVmdC5kZWNvbXBvc2VSaWdodChmcm9tLCByZXN1bHQpO1xuICAgICAgICBpZiAodGhpcy5icmVhayAmJiBmcm9tIDwgcmlnaHQpXG4gICAgICAgICAgICByZXN1bHQucHVzaChudWxsKTtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5yaWdodCk7XG4gICAgfVxuICAgIGJhbGFuY2VkKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGlmIChsZWZ0LnNpemUgPiAyICogcmlnaHQuc2l6ZSB8fCByaWdodC5zaXplID4gMiAqIGxlZnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBIZWlnaHRNYXAub2YodGhpcy5icmVhayA/IFtsZWZ0LCBudWxsLCByaWdodF0gOiBbbGVmdCwgcmlnaHRdKTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgICAgICB0aGlzLmhlaWdodCA9IGxlZnQuaGVpZ2h0ICsgcmlnaHQuaGVpZ2h0O1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gbGVmdC5vdXRkYXRlZCB8fCByaWdodC5vdXRkYXRlZDtcbiAgICAgICAgdGhpcy5zaXplID0gbGVmdC5zaXplICsgcmlnaHQuc2l6ZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWsgKyByaWdodC5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBsZXQgeyBsZWZ0LCByaWdodCB9ID0gdGhpcywgcmlnaHRTdGFydCA9IG9mZnNldCArIGxlZnQubGVuZ3RoICsgdGhpcy5icmVhaywgcmViYWxhbmNlID0gbnVsbDtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICsgbGVmdC5sZW5ndGggJiYgbWVhc3VyZWQubW9yZSlcbiAgICAgICAgICAgIHJlYmFsYW5jZSA9IGxlZnQgPSBsZWZ0LnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCwgZm9yY2UsIG1lYXN1cmVkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGVmdC51cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQsIGZvcmNlKTtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gcmlnaHRTdGFydCArIHJpZ2h0Lmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgcmViYWxhbmNlID0gcmlnaHQgPSByaWdodC51cGRhdGVIZWlnaHQob3JhY2xlLCByaWdodFN0YXJ0LCBmb3JjZSwgbWVhc3VyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByaWdodC51cGRhdGVIZWlnaHQob3JhY2xlLCByaWdodFN0YXJ0LCBmb3JjZSk7XG4gICAgICAgIGlmIChyZWJhbGFuY2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZChsZWZ0LCByaWdodCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5sZWZ0LmhlaWdodCArIHRoaXMucmlnaHQuaGVpZ2h0O1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMubGVmdCArICh0aGlzLmJyZWFrID8gXCIgXCIgOiBcIi1cIikgKyB0aGlzLnJpZ2h0OyB9XG59XG5mdW5jdGlvbiBtZXJnZUdhcHMobm9kZXMsIGFyb3VuZCkge1xuICAgIGxldCBiZWZvcmUsIGFmdGVyO1xuICAgIGlmIChub2Rlc1thcm91bmRdID09IG51bGwgJiZcbiAgICAgICAgKGJlZm9yZSA9IG5vZGVzW2Fyb3VuZCAtIDFdKSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcCAmJlxuICAgICAgICAoYWZ0ZXIgPSBub2Rlc1thcm91bmQgKyAxXSkgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgIG5vZGVzLnNwbGljZShhcm91bmQgLSAxLCAzLCBuZXcgSGVpZ2h0TWFwR2FwKGJlZm9yZS5sZW5ndGggKyAxICsgYWZ0ZXIubGVuZ3RoKSk7XG59XG5jb25zdCByZWxldmFudFdpZGdldEhlaWdodCA9IDU7XG5jbGFzcyBOb2RlQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBvcmFjbGUpIHtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMub3JhY2xlID0gb3JhY2xlO1xuICAgICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubGluZUVuZCA9IC0xO1xuICAgICAgICB0aGlzLmNvdmVyaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSBwb3M7XG4gICAgfVxuICAgIGdldCBpc0NvdmVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvdmVyaW5nICYmIHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA9PSB0aGlzLmNvdmVyaW5nO1xuICAgIH1cbiAgICBzcGFuKF9mcm9tLCB0bykge1xuICAgICAgICBpZiAodGhpcy5saW5lU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHRvLCB0aGlzLmxpbmVFbmQpLCBsYXN0ID0gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgICAgIGxhc3QubGVuZ3RoICs9IGVuZCAtIHRoaXMucG9zO1xuICAgICAgICAgICAgZWxzZSBpZiAoZW5kID4gdGhpcy5wb3MgfHwgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dChlbmQgLSB0aGlzLnBvcywgLTEpKTtcbiAgICAgICAgICAgIHRoaXMud3JpdHRlblRvID0gZW5kO1xuICAgICAgICAgICAgaWYgKHRvID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdHRlblRvKys7XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyA9IHRvO1xuICAgIH1cbiAgICBwb2ludChmcm9tLCB0bywgZGVjbykge1xuICAgICAgICBpZiAoZnJvbSA8IHRvIHx8IGRlY28uaGVpZ2h0UmVsZXZhbnQpIHtcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBkZWNvLndpZGdldCA/IGRlY28ud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA6IDA7XG4gICAgICAgICAgICBsZXQgYnJlYWtzID0gZGVjby53aWRnZXQgPyBkZWNvLndpZGdldC5saW5lQnJlYWtzIDogMDtcbiAgICAgICAgICAgIGlmIChoZWlnaHQgPCAwKVxuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMub3JhY2xlLmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBsZXQgbGVuID0gdG8gLSBmcm9tO1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEJsb2NrKG5ldyBIZWlnaHRNYXBCbG9jayhsZW4sIGhlaWdodCwgZGVjbykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGVuIHx8IGJyZWFrcyB8fCBoZWlnaHQgPj0gcmVsZXZhbnRXaWRnZXRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmVEZWNvKGhlaWdodCwgYnJlYWtzLCBsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvID4gZnJvbSkge1xuICAgICAgICAgICAgdGhpcy5zcGFuKGZyb20sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saW5lRW5kID4gLTEgJiYgdGhpcy5saW5lRW5kIDwgdGhpcy5wb3MpXG4gICAgICAgICAgICB0aGlzLmxpbmVFbmQgPSB0aGlzLm9yYWNsZS5kb2MubGluZUF0KHRoaXMucG9zKS50bztcbiAgICB9XG4gICAgZW50ZXJMaW5lKCkge1xuICAgICAgICBpZiAodGhpcy5saW5lU3RhcnQgPiAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMub3JhY2xlLmRvYy5saW5lQXQodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmxpbmVTdGFydCA9IGZyb207XG4gICAgICAgIHRoaXMubGluZUVuZCA9IHRvO1xuICAgICAgICBpZiAodGhpcy53cml0dGVuVG8gPCBmcm9tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy53cml0dGVuVG8gPCBmcm9tIC0gMSB8fCB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV0gPT0gbnVsbClcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2godGhpcy5ibGFua0NvbnRlbnQodGhpcy53cml0dGVuVG8sIGZyb20gLSAxKSk7XG4gICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9zID4gZnJvbSlcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dCh0aGlzLnBvcyAtIGZyb20sIC0xKSk7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3M7XG4gICAgfVxuICAgIGJsYW5rQ29udGVudChmcm9tLCB0bykge1xuICAgICAgICBsZXQgZ2FwID0gbmV3IEhlaWdodE1hcEdhcCh0byAtIGZyb20pO1xuICAgICAgICBpZiAodGhpcy5vcmFjbGUuZG9jLmxpbmVBdChmcm9tKS50byA9PSB0bylcbiAgICAgICAgICAgIGdhcC5mbGFncyB8PSA0IC8qIEZsYWcuU2luZ2xlTGluZSAqLztcbiAgICAgICAgcmV0dXJuIGdhcDtcbiAgICB9XG4gICAgZW5zdXJlTGluZSgpIHtcbiAgICAgICAgdGhpcy5lbnRlckxpbmUoKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCA/IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dClcbiAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICBsZXQgbGluZSA9IG5ldyBIZWlnaHRNYXBUZXh0KDAsIC0xKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGxpbmUpO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgYWRkQmxvY2soYmxvY2spIHtcbiAgICAgICAgdGhpcy5lbnRlckxpbmUoKTtcbiAgICAgICAgbGV0IGRlY28gPSBibG9jay5kZWNvO1xuICAgICAgICBpZiAoZGVjbyAmJiBkZWNvLnN0YXJ0U2lkZSA+IDAgJiYgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgdGhpcy5lbnN1cmVMaW5lKCk7XG4gICAgICAgIHRoaXMubm9kZXMucHVzaChibG9jayk7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3MgPSB0aGlzLnBvcyArIGJsb2NrLmxlbmd0aDtcbiAgICAgICAgaWYgKGRlY28gJiYgZGVjby5lbmRTaWRlID4gMClcbiAgICAgICAgICAgIHRoaXMuY292ZXJpbmcgPSBibG9jaztcbiAgICB9XG4gICAgYWRkTGluZURlY28oaGVpZ2h0LCBicmVha3MsIGxlbmd0aCkge1xuICAgICAgICBsZXQgbGluZSA9IHRoaXMuZW5zdXJlTGluZSgpO1xuICAgICAgICBsaW5lLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgICAgIGxpbmUuY29sbGFwc2VkICs9IGxlbmd0aDtcbiAgICAgICAgbGluZS53aWRnZXRIZWlnaHQgPSBNYXRoLm1heChsaW5lLndpZGdldEhlaWdodCwgaGVpZ2h0KTtcbiAgICAgICAgbGluZS5icmVha3MgKz0gYnJlYWtzO1xuICAgICAgICB0aGlzLndyaXR0ZW5UbyA9IHRoaXMucG9zID0gdGhpcy5wb3MgKyBsZW5ndGg7XG4gICAgfVxuICAgIGZpbmlzaChmcm9tKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5ub2Rlcy5sZW5ndGggPT0gMCA/IG51bGwgOiB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xICYmICEobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpICYmICF0aGlzLmlzQ292ZXJlZClcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dCgwLCAtMSkpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLndyaXR0ZW5UbyA8IHRoaXMucG9zIHx8IGxhc3QgPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaCh0aGlzLmJsYW5rQ29udGVudCh0aGlzLndyaXR0ZW5UbywgdGhpcy5wb3MpKTtcbiAgICAgICAgbGV0IHBvcyA9IGZyb207XG4gICAgICAgIGZvciAobGV0IG5vZGUgb2YgdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgICAgIG5vZGUudXBkYXRlSGVpZ2h0KHRoaXMub3JhY2xlLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IG5vZGUgPyBub2RlLmxlbmd0aCA6IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gICAgfVxuICAgIC8vIEFsd2F5cyBjYWxsZWQgd2l0aCBhIHJlZ2lvbiB0aGF0IG9uIGJvdGggc2lkZXMgZWl0aGVyIHN0cmV0Y2hlc1xuICAgIC8vIHRvIGEgbGluZSBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICAvLyBUaGUgcmV0dXJuZWQgYXJyYXkgdXNlcyBudWxsIHRvIGluZGljYXRlIGxpbmUgYnJlYWtzLCBidXQgbmV2ZXJcbiAgICAvLyBzdGFydHMgb3IgZW5kcyBpbiBhIGxpbmUgYnJlYWssIG9yIGhhcyBtdWx0aXBsZSBsaW5lIGJyZWFrcyBuZXh0XG4gICAgLy8gdG8gZWFjaCBvdGhlci5cbiAgICBzdGF0aWMgYnVpbGQob3JhY2xlLCBkZWNvcmF0aW9ucywgZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgTm9kZUJ1aWxkZXIoZnJvbSwgb3JhY2xlKTtcbiAgICAgICAgUmFuZ2VTZXQuc3BhbnMoZGVjb3JhdGlvbnMsIGZyb20sIHRvLCBidWlsZGVyLCAwKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKGZyb20pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMoYSwgYiwgZGlmZikge1xuICAgIGxldCBjb21wID0gbmV3IERlY29yYXRpb25Db21wYXJhdG9yO1xuICAgIFJhbmdlU2V0LmNvbXBhcmUoYSwgYiwgZGlmZiwgY29tcCwgMCk7XG4gICAgcmV0dXJuIGNvbXAuY2hhbmdlcztcbn1cbmNsYXNzIERlY29yYXRpb25Db21wYXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gW107XG4gICAgfVxuICAgIGNvbXBhcmVSYW5nZSgpIHsgfVxuICAgIGNvbXBhcmVQb2ludChmcm9tLCB0bywgYSwgYikge1xuICAgICAgICBpZiAoZnJvbSA8IHRvIHx8IGEgJiYgYS5oZWlnaHRSZWxldmFudCB8fCBiICYmIGIuaGVpZ2h0UmVsZXZhbnQpXG4gICAgICAgICAgICBhZGRSYW5nZShmcm9tLCB0bywgdGhpcy5jaGFuZ2VzLCA1KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZpc2libGVQaXhlbFJhbmdlKGRvbSwgcGFkZGluZ1RvcCkge1xuICAgIGxldCByZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICBsZXQgbGVmdCA9IE1hdGgubWF4KDAsIHJlY3QubGVmdCksIHJpZ2h0ID0gTWF0aC5taW4od2luLmlubmVyV2lkdGgsIHJlY3QucmlnaHQpO1xuICAgIGxldCB0b3AgPSBNYXRoLm1heCgwLCByZWN0LnRvcCksIGJvdHRvbSA9IE1hdGgubWluKHdpbi5pbm5lckhlaWdodCwgcmVjdC5ib3R0b20pO1xuICAgIGZvciAobGV0IHBhcmVudCA9IGRvbS5wYXJlbnROb2RlOyBwYXJlbnQgJiYgcGFyZW50ICE9IGRvYy5ib2R5Oykge1xuICAgICAgICBpZiAocGFyZW50Lm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIGxldCBlbHQgPSBwYXJlbnQ7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbHQpO1xuICAgICAgICAgICAgaWYgKChlbHQuc2Nyb2xsSGVpZ2h0ID4gZWx0LmNsaWVudEhlaWdodCB8fCBlbHQuc2Nyb2xsV2lkdGggPiBlbHQuY2xpZW50V2lkdGgpICYmXG4gICAgICAgICAgICAgICAgc3R5bGUub3ZlcmZsb3cgIT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50UmVjdCA9IGVsdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgcGFyZW50UmVjdC5sZWZ0KTtcbiAgICAgICAgICAgICAgICByaWdodCA9IE1hdGgubWluKHJpZ2h0LCBwYXJlbnRSZWN0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICB0b3AgPSBNYXRoLm1heCh0b3AsIHBhcmVudFJlY3QudG9wKTtcbiAgICAgICAgICAgICAgICBib3R0b20gPSBwYXJlbnQgPT0gZG9tLnBhcmVudE5vZGUgPyBwYXJlbnRSZWN0LmJvdHRvbSA6IE1hdGgubWluKGJvdHRvbSwgcGFyZW50UmVjdC5ib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gc3R5bGUucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiIHx8IHN0eWxlLnBvc2l0aW9uID09IFwiZml4ZWRcIiA/IGVsdC5vZmZzZXRQYXJlbnQgOiBlbHQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJlbnQubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdDogbGVmdCAtIHJlY3QubGVmdCwgcmlnaHQ6IE1hdGgubWF4KGxlZnQsIHJpZ2h0KSAtIHJlY3QubGVmdCxcbiAgICAgICAgdG9wOiB0b3AgLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSwgYm90dG9tOiBNYXRoLm1heCh0b3AsIGJvdHRvbSkgLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSB9O1xufVxuZnVuY3Rpb24gZnVsbFBpeGVsUmFuZ2UoZG9tLCBwYWRkaW5nVG9wKSB7XG4gICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgICAgIHRvcDogcGFkZGluZ1RvcCwgYm90dG9tOiByZWN0LmJvdHRvbSAtIChyZWN0LnRvcCArIHBhZGRpbmdUb3ApIH07XG59XG4vLyBMaW5lIGdhcHMgYXJlIHBsYWNlaG9sZGVyIHdpZGdldHMgdXNlZCB0byBoaWRlIHBpZWNlcyBvZiBvdmVybG9uZ1xuLy8gbGluZXMgd2l0aGluIHRoZSB2aWV3cG9ydCwgYXMgYSBrbHVkZ2UgdG8ga2VlcCB0aGUgZWRpdG9yXG4vLyByZXNwb25zaXZlIHdoZW4gYSByaWRpY3Vsb3VzbHkgbG9uZyBsaW5lIGlzIGxvYWRlZCBpbnRvIGl0LlxuY2xhc3MgTGluZUdhcCB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8sIHNpemUpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgIH1cbiAgICBzdGF0aWMgc2FtZShhLCBiKSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZ0EgPSBhW2ldLCBnQiA9IGJbaV07XG4gICAgICAgICAgICBpZiAoZ0EuZnJvbSAhPSBnQi5mcm9tIHx8IGdBLnRvICE9IGdCLnRvIHx8IGdBLnNpemUgIT0gZ0Iuc2l6ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRyYXcodmlld1N0YXRlLCB3cmFwcGluZykge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmVHYXBXaWRnZXQodGhpcy5zaXplICogKHdyYXBwaW5nID8gdmlld1N0YXRlLnNjYWxlWSA6IHZpZXdTdGF0ZS5zY2FsZVgpLCB3cmFwcGluZylcbiAgICAgICAgfSkucmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcbiAgICB9XG59XG5jbGFzcyBMaW5lR2FwV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3Ioc2l6ZSwgdmVydGljYWwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbCA9IHZlcnRpY2FsO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIuc2l6ZSA9PSB0aGlzLnNpemUgJiYgb3RoZXIudmVydGljYWwgPT0gdGhpcy52ZXJ0aWNhbDsgfVxuICAgIHRvRE9NKCkge1xuICAgICAgICBsZXQgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgaWYgKHRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIGVsdC5zdHlsZS5oZWlnaHQgPSB0aGlzLnNpemUgKyBcInB4XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbHQuc3R5bGUud2lkdGggPSB0aGlzLnNpemUgKyBcInB4XCI7XG4gICAgICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gXCIycHhcIjtcbiAgICAgICAgICAgIGVsdC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWx0O1xuICAgIH1cbiAgICBnZXQgZXN0aW1hdGVkSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy52ZXJ0aWNhbCA/IHRoaXMuc2l6ZSA6IC0xOyB9XG59XG5jbGFzcyBWaWV3U3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKHN0YXRlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgLy8gVGhlc2UgYXJlIGNvbnRlbnRET00tbG9jYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgdGhpcy5waXhlbFZpZXdwb3J0ID0geyBsZWZ0OiAwLCByaWdodDogd2luZG93LmlubmVyV2lkdGgsIHRvcDogMCwgYm90dG9tOiAwIH07XG4gICAgICAgIHRoaXMuaW5WaWV3ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWRkaW5nVG9wID0gMDsgLy8gUGFkZGluZyBhYm92ZSB0aGUgZG9jdW1lbnQsIHNjYWxlZFxuICAgICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSAwOyAvLyBQYWRkaW5nIGJlbG93IHRoZSBkb2N1bWVudCwgc2NhbGVkXG4gICAgICAgIHRoaXMuY29udGVudERPTVdpZHRoID0gMDsgLy8gY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICAgICAgICB0aGlzLmNvbnRlbnRET01IZWlnaHQgPSAwOyAvLyBjb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICB0aGlzLmVkaXRvckhlaWdodCA9IDA7IC8vIHNjcm9sbERPTS5jbGllbnRIZWlnaHQsIHVuc2NhbGVkXG4gICAgICAgIHRoaXMuZWRpdG9yV2lkdGggPSAwOyAvLyBzY3JvbGxET00uY2xpZW50V2lkdGgsIHVuc2NhbGVkXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gMDsgLy8gTGFzdCBzZWVuIHNjcm9sbERPTS5zY3JvbGxUb3AsIHNjYWxlZFxuICAgICAgICB0aGlzLnNjcm9sbGVkVG9Cb3R0b20gPSB0cnVlO1xuICAgICAgICAvLyBUaGUgQ1NTLXRyYW5zZm9ybWF0aW9uIHNjYWxlIG9mIHRoZSBlZGl0b3IgKHRyYW5zZm9ybWVkIHNpemUgL1xuICAgICAgICAvLyBjb25jcmV0ZSBzaXplKVxuICAgICAgICB0aGlzLnNjYWxlWCA9IDE7XG4gICAgICAgIHRoaXMuc2NhbGVZID0gMTtcbiAgICAgICAgLy8gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIChkb2N1bWVudC1yZWxhdGl2ZSkgdG8gd2hpY2ggdG8gYW5jaG9yIHRoZVxuICAgICAgICAvLyBzY3JvbGwgcG9zaXRpb24uIC0xIG1lYW5zIGFuY2hvciB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSAwO1xuICAgICAgICAvLyBUaGUgaGVpZ2h0IGF0IHRoZSBhbmNob3IgcG9zaXRpb24uIFNldCBieSB0aGUgRE9NIHVwZGF0ZSBwaGFzZS5cbiAgICAgICAgLy8gLTEgbWVhbnMgbm8gaGVpZ2h0IGF2YWlsYWJsZS5cbiAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgLy8gU2VlIFZQLk1heERPTUhlaWdodFxuICAgICAgICB0aGlzLnNjYWxlciA9IElkU2NhbGVyO1xuICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IG51bGw7XG4gICAgICAgIC8vIEJyaWVmbHkgc2V0IHRvIHRydWUgd2hlbiBwcmludGluZywgdG8gZGlzYWJsZSB2aWV3cG9ydCBsaW1pdGluZ1xuICAgICAgICB0aGlzLnByaW50aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIEZsYWcgc2V0IHdoZW4gZWRpdG9yIGNvbnRlbnQgd2FzIHJlZHJhd24sIHNvIHRoYXQgdGhlIG5leHRcbiAgICAgICAgLy8gbWVhc3VyZSBzdGFnZSBrbm93cyBpdCBtdXN0IHJlYWQgRE9NIGxheW91dFxuICAgICAgICB0aGlzLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRleHREaXJlY3Rpb24gPSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMgPSBbXTtcbiAgICAgICAgLy8gQ3Vyc29yICdhc3NvYycgaXMgb25seSBzaWduaWZpY2FudCB3aGVuIHRoZSBjdXJzb3IgaXMgb24gYSBsaW5lXG4gICAgICAgIC8vIHdyYXAgcG9pbnQsIHdoZXJlIGl0IG11c3Qgc3RpY2sgdG8gdGhlIGNoYXJhY3RlciB0aGF0IGl0IGlzXG4gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aC4gU2luY2UgYnJvd3NlcnMgZG9uJ3QgcHJvdmlkZSBhIHJlYXNvbmFibGVcbiAgICAgICAgLy8gaW50ZXJmYWNlIHRvIHNldCBvciBxdWVyeSB0aGlzLCB3aGVuIGEgc2VsZWN0aW9uIGlzIHNldCB0aGF0XG4gICAgICAgIC8vIG1pZ2h0IGNhdXNlIHRoaXMgdG8gYmUgc2lnbmlmaWNhbnQsIHRoaXMgZmxhZyBpcyBzZXQuIFRoZSBuZXh0XG4gICAgICAgIC8vIG1lYXN1cmUgcGhhc2Ugd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBjdXJzb3IgaXMgb24gYSBsaW5lLXdyYXBwaW5nXG4gICAgICAgIC8vIGJvdW5kYXJ5IGFuZCwgaWYgc28sIHJlc2V0IGl0IHRvIG1ha2Ugc3VyZSBpdCBpcyBwb3NpdGlvbmVkIGluXG4gICAgICAgIC8vIHRoZSByaWdodCBwbGFjZS5cbiAgICAgICAgdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jID0gZmFsc2U7XG4gICAgICAgIGxldCBndWVzc1dyYXBwaW5nID0gc3RhdGUuZmFjZXQoY29udGVudEF0dHJpYnV0ZXMpLnNvbWUodiA9PiB0eXBlb2YgdiAhPSBcImZ1bmN0aW9uXCIgJiYgdi5jbGFzcyA9PSBcImNtLWxpbmVXcmFwcGluZ1wiKTtcbiAgICAgICAgdGhpcy5oZWlnaHRPcmFjbGUgPSBuZXcgSGVpZ2h0T3JhY2xlKGd1ZXNzV3JhcHBpbmcpO1xuICAgICAgICB0aGlzLnN0YXRlRGVjbyA9IHN0YXRlLmZhY2V0KGRlY29yYXRpb25zKS5maWx0ZXIoZCA9PiB0eXBlb2YgZCAhPSBcImZ1bmN0aW9uXCIpO1xuICAgICAgICB0aGlzLmhlaWdodE1hcCA9IEhlaWdodE1hcC5lbXB0eSgpLmFwcGx5Q2hhbmdlcyh0aGlzLnN0YXRlRGVjbywgVGV4dC5lbXB0eSwgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHN0YXRlLmRvYyksIFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHN0YXRlLmRvYy5sZW5ndGgpXSk7XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KDAsIG51bGwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpO1xuICAgICAgICB0aGlzLmxpbmVHYXBzID0gdGhpcy5lbnN1cmVMaW5lR2FwcyhbXSk7XG4gICAgICAgIHRoaXMubGluZUdhcERlY28gPSBEZWNvcmF0aW9uLnNldCh0aGlzLmxpbmVHYXBzLm1hcChnYXAgPT4gZ2FwLmRyYXcodGhpcywgZmFsc2UpKSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXMoKTtcbiAgICB9XG4gICAgdXBkYXRlRm9yVmlld3BvcnQoKSB7XG4gICAgICAgIGxldCB2aWV3cG9ydHMgPSBbdGhpcy52aWV3cG9ydF0sIHsgbWFpbiB9ID0gdGhpcy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDE7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBvcyA9IGkgPyBtYWluLmhlYWQgOiBtYWluLmFuY2hvcjtcbiAgICAgICAgICAgIGlmICghdmlld3BvcnRzLnNvbWUoKHsgZnJvbSwgdG8gfSkgPT4gcG9zID49IGZyb20gJiYgcG9zIDw9IHRvKSkge1xuICAgICAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgICAgICAgICAgICAgdmlld3BvcnRzLnB1c2gobmV3IFZpZXdwb3J0KGZyb20sIHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3cG9ydHMgPSB2aWV3cG9ydHMuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKTtcbiAgICAgICAgdGhpcy5zY2FsZXIgPSB0aGlzLmhlaWdodE1hcC5oZWlnaHQgPD0gNzAwMDAwMCAvKiBWUC5NYXhET01IZWlnaHQgKi8gPyBJZFNjYWxlciA6XG4gICAgICAgICAgICBuZXcgQmlnU2NhbGVyKHRoaXMuaGVpZ2h0T3JhY2xlLCB0aGlzLmhlaWdodE1hcCwgdGhpcy52aWV3cG9ydHMpO1xuICAgIH1cbiAgICB1cGRhdGVWaWV3cG9ydExpbmVzKCkge1xuICAgICAgICB0aGlzLnZpZXdwb3J0TGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHRNYXAuZm9yRWFjaExpbmUodGhpcy52aWV3cG9ydC5mcm9tLCB0aGlzLnZpZXdwb3J0LnRvLCB0aGlzLmhlaWdodE9yYWNsZS5zZXREb2ModGhpcy5zdGF0ZS5kb2MpLCAwLCAwLCBibG9jayA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0TGluZXMucHVzaCh0aGlzLnNjYWxlci5zY2FsZSA9PSAxID8gYmxvY2sgOiBzY2FsZUJsb2NrKGJsb2NrLCB0aGlzLnNjYWxlcikpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSwgc2Nyb2xsVGFyZ2V0ID0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gdXBkYXRlLnN0YXRlO1xuICAgICAgICBsZXQgcHJldkRlY28gPSB0aGlzLnN0YXRlRGVjbztcbiAgICAgICAgdGhpcy5zdGF0ZURlY28gPSB0aGlzLnN0YXRlLmZhY2V0KGRlY29yYXRpb25zKS5maWx0ZXIoZCA9PiB0eXBlb2YgZCAhPSBcImZ1bmN0aW9uXCIpO1xuICAgICAgICBsZXQgY29udGVudENoYW5nZXMgPSB1cGRhdGUuY2hhbmdlZFJhbmdlcztcbiAgICAgICAgbGV0IGhlaWdodENoYW5nZXMgPSBDaGFuZ2VkUmFuZ2UuZXh0ZW5kV2l0aFJhbmdlcyhjb250ZW50Q2hhbmdlcywgaGVpZ2h0UmVsZXZhbnREZWNvQ2hhbmdlcyhwcmV2RGVjbywgdGhpcy5zdGF0ZURlY28sIHVwZGF0ZSA/IHVwZGF0ZS5jaGFuZ2VzIDogQ2hhbmdlU2V0LmVtcHR5KHRoaXMuc3RhdGUuZG9jLmxlbmd0aCkpKTtcbiAgICAgICAgbGV0IHByZXZIZWlnaHQgPSB0aGlzLmhlaWdodE1hcC5oZWlnaHQ7XG4gICAgICAgIGxldCBzY3JvbGxBbmNob3IgPSB0aGlzLnNjcm9sbGVkVG9Cb3R0b20gPyBudWxsIDogdGhpcy5zY3JvbGxBbmNob3JBdCh0aGlzLnNjcm9sbFRvcCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gdGhpcy5oZWlnaHRNYXAuYXBwbHlDaGFuZ2VzKHRoaXMuc3RhdGVEZWNvLCB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MsIHRoaXMuaGVpZ2h0T3JhY2xlLnNldERvYyh0aGlzLnN0YXRlLmRvYyksIGhlaWdodENoYW5nZXMpO1xuICAgICAgICBpZiAodGhpcy5oZWlnaHRNYXAuaGVpZ2h0ICE9IHByZXZIZWlnaHQpXG4gICAgICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgaWYgKHNjcm9sbEFuY2hvcikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3Moc2Nyb2xsQW5jaG9yLmZyb20sIC0xKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gc2Nyb2xsQW5jaG9yLnRvcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9yUG9zID0gLTE7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld3BvcnQgPSBoZWlnaHRDaGFuZ2VzLmxlbmd0aCA/IHRoaXMubWFwVmlld3BvcnQodGhpcy52aWV3cG9ydCwgdXBkYXRlLmNoYW5nZXMpIDogdGhpcy52aWV3cG9ydDtcbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldCAmJiAoc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPCB2aWV3cG9ydC5mcm9tIHx8IHNjcm9sbFRhcmdldC5yYW5nZS5oZWFkID4gdmlld3BvcnQudG8pIHx8XG4gICAgICAgICAgICAhdGhpcy52aWV3cG9ydElzQXBwcm9wcmlhdGUodmlld3BvcnQpKVxuICAgICAgICAgICAgdmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KDAsIHNjcm9sbFRhcmdldCk7XG4gICAgICAgIGxldCB1cGRhdGVMaW5lcyA9ICF1cGRhdGUuY2hhbmdlcy5lbXB0eSB8fCAodXBkYXRlLmZsYWdzICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgfHxcbiAgICAgICAgICAgIHZpZXdwb3J0LmZyb20gIT0gdGhpcy52aWV3cG9ydC5mcm9tIHx8IHZpZXdwb3J0LnRvICE9IHRoaXMudmlld3BvcnQudG87XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpO1xuICAgICAgICBpZiAodXBkYXRlTGluZXMpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoIHx8IHRoaXMudmlld3BvcnQudG8gLSB0aGlzLnZpZXdwb3J0LmZyb20gPiAoMjAwMCAvKiBMRy5NYXJnaW4gKi8gPDwgMSkpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmVHYXBzKHRoaXMuZW5zdXJlTGluZUdhcHModGhpcy5tYXBMaW5lR2Fwcyh0aGlzLmxpbmVHYXBzLCB1cGRhdGUuY2hhbmdlcykpKTtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXMoKTtcbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldClcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gc2Nyb2xsVGFyZ2V0O1xuICAgICAgICBpZiAoIXRoaXMubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyAmJiB1cGRhdGUuc2VsZWN0aW9uU2V0ICYmIHVwZGF0ZS52aWV3LmxpbmVXcmFwcGluZyAmJlxuICAgICAgICAgICAgdXBkYXRlLnN0YXRlLnNlbGVjdGlvbi5tYWluLmVtcHR5ICYmIHVwZGF0ZS5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hc3NvYyAmJlxuICAgICAgICAgICAgIXVwZGF0ZS5zdGF0ZS5mYWNldChuYXRpdmVTZWxlY3Rpb25IaWRkZW4pKVxuICAgICAgICAgICAgdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jID0gdHJ1ZTtcbiAgICB9XG4gICAgbWVhc3VyZSh2aWV3KSB7XG4gICAgICAgIGxldCBkb20gPSB2aWV3LmNvbnRlbnRET00sIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tKTtcbiAgICAgICAgbGV0IG9yYWNsZSA9IHRoaXMuaGVpZ2h0T3JhY2xlO1xuICAgICAgICBsZXQgd2hpdGVTcGFjZSA9IHN0eWxlLndoaXRlU3BhY2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRleHREaXJlY3Rpb24gPSBzdHlsZS5kaXJlY3Rpb24gPT0gXCJydGxcIiA/IERpcmVjdGlvbi5SVEwgOiBEaXJlY3Rpb24uTFRSO1xuICAgICAgICBsZXQgcmVmcmVzaCA9IHRoaXMuaGVpZ2h0T3JhY2xlLm11c3RSZWZyZXNoRm9yV3JhcHBpbmcod2hpdGVTcGFjZSk7XG4gICAgICAgIGxldCBkb21SZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgbWVhc3VyZUNvbnRlbnQgPSByZWZyZXNoIHx8IHRoaXMubXVzdE1lYXN1cmVDb250ZW50IHx8IHRoaXMuY29udGVudERPTUhlaWdodCAhPSBkb21SZWN0LmhlaWdodDtcbiAgICAgICAgdGhpcy5jb250ZW50RE9NSGVpZ2h0ID0gZG9tUmVjdC5oZWlnaHQ7XG4gICAgICAgIHRoaXMubXVzdE1lYXN1cmVDb250ZW50ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXN1bHQgPSAwLCBiaWFzID0gMDtcbiAgICAgICAgaWYgKGRvbVJlY3Qud2lkdGggJiYgZG9tUmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSBnZXRTY2FsZShkb20sIGRvbVJlY3QpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2NhbGVYICE9IHNjYWxlWCB8fCB0aGlzLnNjYWxlWSAhPSBzY2FsZVkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHNjYWxlWDtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWSA9IHNjYWxlWTtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gOCAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICAgICAgICAgIHJlZnJlc2ggPSBtZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmVydGljYWwgcGFkZGluZ1xuICAgICAgICBsZXQgcGFkZGluZ1RvcCA9IChwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wKSB8fCAwKSAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBsZXQgcGFkZGluZ0JvdHRvbSA9IChwYXJzZUludChzdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwKSAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBpZiAodGhpcy5wYWRkaW5nVG9wICE9IHBhZGRpbmdUb3AgfHwgdGhpcy5wYWRkaW5nQm90dG9tICE9IHBhZGRpbmdCb3R0b20pIHtcbiAgICAgICAgICAgIHRoaXMucGFkZGluZ1RvcCA9IHBhZGRpbmdUb3A7XG4gICAgICAgICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSBwYWRkaW5nQm90dG9tO1xuICAgICAgICAgICAgcmVzdWx0IHw9IDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLyB8IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yV2lkdGggIT0gdmlldy5zY3JvbGxET00uY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChvcmFjbGUubGluZVdyYXBwaW5nKVxuICAgICAgICAgICAgICAgIG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yV2lkdGggPSB2aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgIHJlc3VsdCB8PSA4IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjcm9sbFRvcCA9IHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUb3AgIT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxlZFRvQm90dG9tID0gaXNTY3JvbGxlZFRvQm90dG9tKHZpZXcuc2Nyb2xsRE9NKTtcbiAgICAgICAgLy8gUGl4ZWwgdmlld3BvcnRcbiAgICAgICAgbGV0IHBpeGVsVmlld3BvcnQgPSAodGhpcy5wcmludGluZyA/IGZ1bGxQaXhlbFJhbmdlIDogdmlzaWJsZVBpeGVsUmFuZ2UpKGRvbSwgdGhpcy5wYWRkaW5nVG9wKTtcbiAgICAgICAgbGV0IGRUb3AgPSBwaXhlbFZpZXdwb3J0LnRvcCAtIHRoaXMucGl4ZWxWaWV3cG9ydC50b3AsIGRCb3R0b20gPSBwaXhlbFZpZXdwb3J0LmJvdHRvbSAtIHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b207XG4gICAgICAgIHRoaXMucGl4ZWxWaWV3cG9ydCA9IHBpeGVsVmlld3BvcnQ7XG4gICAgICAgIGxldCBpblZpZXcgPSB0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tID4gdGhpcy5waXhlbFZpZXdwb3J0LnRvcCAmJiB0aGlzLnBpeGVsVmlld3BvcnQucmlnaHQgPiB0aGlzLnBpeGVsVmlld3BvcnQubGVmdDtcbiAgICAgICAgaWYgKGluVmlldyAhPSB0aGlzLmluVmlldykge1xuICAgICAgICAgICAgdGhpcy5pblZpZXcgPSBpblZpZXc7XG4gICAgICAgICAgICBpZiAoaW5WaWV3KVxuICAgICAgICAgICAgICAgIG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaW5WaWV3ICYmICF0aGlzLnNjcm9sbFRhcmdldClcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBsZXQgY29udGVudFdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTVdpZHRoICE9IGNvbnRlbnRXaWR0aCB8fCB0aGlzLmVkaXRvckhlaWdodCAhPSB2aWV3LnNjcm9sbERPTS5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudERPTVdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9ySGVpZ2h0ID0gdmlldy5zY3JvbGxET00uY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgcmVzdWx0IHw9IDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVhc3VyZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lSGVpZ2h0cyA9IHZpZXcuZG9jVmlldy5tZWFzdXJlVmlzaWJsZUxpbmVIZWlnaHRzKHRoaXMudmlld3BvcnQpO1xuICAgICAgICAgICAgaWYgKG9yYWNsZS5tdXN0UmVmcmVzaEZvckhlaWdodHMobGluZUhlaWdodHMpKVxuICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJlZnJlc2ggfHwgb3JhY2xlLmxpbmVXcmFwcGluZyAmJiBNYXRoLmFicyhjb250ZW50V2lkdGggLSB0aGlzLmNvbnRlbnRET01XaWR0aCkgPiBvcmFjbGUuY2hhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0IH0gPSB2aWV3LmRvY1ZpZXcubWVhc3VyZVRleHRTaXplKCk7XG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IGxpbmVIZWlnaHQgPiAwICYmIG9yYWNsZS5yZWZyZXNoKHdoaXRlU3BhY2UsIGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCwgY29udGVudFdpZHRoIC8gY2hhcldpZHRoLCBsaW5lSGVpZ2h0cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kb2NWaWV3Lm1pbldpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZFRvcCA+IDAgJiYgZEJvdHRvbSA+IDApXG4gICAgICAgICAgICAgICAgYmlhcyA9IE1hdGgubWF4KGRUb3AsIGRCb3R0b20pO1xuICAgICAgICAgICAgZWxzZSBpZiAoZFRvcCA8IDAgJiYgZEJvdHRvbSA8IDApXG4gICAgICAgICAgICAgICAgYmlhcyA9IE1hdGgubWluKGRUb3AsIGRCb3R0b20pO1xuICAgICAgICAgICAgb3JhY2xlLmhlaWdodENoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IHZwIG9mIHRoaXMudmlld3BvcnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodHMgPSB2cC5mcm9tID09IHRoaXMudmlld3BvcnQuZnJvbSA/IGxpbmVIZWlnaHRzIDogdmlldy5kb2NWaWV3Lm1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModnApO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gKHJlZnJlc2ggPyBIZWlnaHRNYXAuZW1wdHkoKS5hcHBseUNoYW5nZXModGhpcy5zdGF0ZURlY28sIFRleHQuZW1wdHksIHRoaXMuaGVpZ2h0T3JhY2xlLCBbbmV3IENoYW5nZWRSYW5nZSgwLCAwLCAwLCB2aWV3LnN0YXRlLmRvYy5sZW5ndGgpXSkgOiB0aGlzLmhlaWdodE1hcCkudXBkYXRlSGVpZ2h0KG9yYWNsZSwgMCwgcmVmcmVzaCwgbmV3IE1lYXN1cmVkSGVpZ2h0cyh2cC5mcm9tLCBoZWlnaHRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3JhY2xlLmhlaWdodENoYW5nZWQpXG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZpZXdwb3J0Q2hhbmdlID0gIXRoaXMudmlld3BvcnRJc0FwcHJvcHJpYXRlKHRoaXMudmlld3BvcnQsIGJpYXMpIHx8XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCAmJiAodGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA8IHRoaXMudmlld3BvcnQuZnJvbSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPiB0aGlzLnZpZXdwb3J0LnRvKTtcbiAgICAgICAgaWYgKHZpZXdwb3J0Q2hhbmdlKVxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoYmlhcywgdGhpcy5zY3JvbGxUYXJnZXQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvclZpZXdwb3J0KCk7XG4gICAgICAgIGlmICgocmVzdWx0ICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgfHwgdmlld3BvcnRDaGFuZ2UpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoIHx8IHRoaXMudmlld3BvcnQudG8gLSB0aGlzLnZpZXdwb3J0LmZyb20gPiAoMjAwMCAvKiBMRy5NYXJnaW4gKi8gPDwgMSkpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmVHYXBzKHRoaXMuZW5zdXJlTGluZUdhcHMocmVmcmVzaCA/IFtdIDogdGhpcy5saW5lR2FwcywgdmlldykpO1xuICAgICAgICByZXN1bHQgfD0gdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jKSB7XG4gICAgICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBpbiB0aGUgcmVhZCBzdGFnZSwgYmVjYXVzZSBtb3ZpbmcgdGhlIHNlbGVjdGlvblxuICAgICAgICAgICAgLy8gdG8gYSBsaW5lIGVuZCBpcyBnb2luZyB0byB0cmlnZ2VyIGEgbGF5b3V0IGFueXdheSwgc28gaXRcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGEgcHVyZSB3cml0ZS4gSXQgc2hvdWxkIGJlIHJhcmUgdGhhdCBpdCBkb2VzIGFueVxuICAgICAgICAgICAgLy8gd3JpdGluZy5cbiAgICAgICAgICAgIHZpZXcuZG9jVmlldy5lbmZvcmNlQ3Vyc29yQXNzb2MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXQgdmlzaWJsZVRvcCgpIHsgcmV0dXJuIHRoaXMuc2NhbGVyLmZyb21ET00odGhpcy5waXhlbFZpZXdwb3J0LnRvcCk7IH1cbiAgICBnZXQgdmlzaWJsZUJvdHRvbSgpIHsgcmV0dXJuIHRoaXMuc2NhbGVyLmZyb21ET00odGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbSk7IH1cbiAgICBnZXRWaWV3cG9ydChiaWFzLCBzY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGRpdmlkZSBWUC5NYXJnaW4gYmV0d2VlbiB0aGUgdG9wIGFuZCB0aGVcbiAgICAgICAgLy8gYm90dG9tLCBkZXBlbmRpbmcgb24gdGhlIGJpYXMgKHRoZSBjaGFuZ2UgaW4gdmlld3BvcnQgcG9zaXRpb25cbiAgICAgICAgLy8gc2luY2UgdGhlIGxhc3QgdXBkYXRlKS4gSXQnbGwgaG9sZCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDFcbiAgICAgICAgbGV0IG1hcmdpblRvcCA9IDAuNSAtIE1hdGgubWF4KC0wLjUsIE1hdGgubWluKDAuNSwgYmlhcyAvIDEwMDAgLyogVlAuTWFyZ2luICovIC8gMikpO1xuICAgICAgICBsZXQgbWFwID0gdGhpcy5oZWlnaHRNYXAsIG9yYWNsZSA9IHRoaXMuaGVpZ2h0T3JhY2xlO1xuICAgICAgICBsZXQgeyB2aXNpYmxlVG9wLCB2aXNpYmxlQm90dG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQobWFwLmxpbmVBdCh2aXNpYmxlVG9wIC0gbWFyZ2luVG9wICogMTAwMCAvKiBWUC5NYXJnaW4gKi8sIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS5mcm9tLCBtYXAubGluZUF0KHZpc2libGVCb3R0b20gKyAoMSAtIG1hcmdpblRvcCkgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLywgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLnRvKTtcbiAgICAgICAgLy8gSWYgc2Nyb2xsVGFyZ2V0IGlzIGdpdmVuLCBtYWtlIHN1cmUgdGhlIHZpZXdwb3J0IGluY2x1ZGVzIHRoYXQgcG9zaXRpb25cbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldCkge1xuICAgICAgICAgICAgbGV0IHsgaGVhZCB9ID0gc2Nyb2xsVGFyZ2V0LnJhbmdlO1xuICAgICAgICAgICAgaWYgKGhlYWQgPCB2aWV3cG9ydC5mcm9tIHx8IGhlYWQgPiB2aWV3cG9ydC50bykge1xuICAgICAgICAgICAgICAgIGxldCB2aWV3SGVpZ2h0ID0gTWF0aC5taW4odGhpcy5lZGl0b3JIZWlnaHQsIHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b20gLSB0aGlzLnBpeGVsVmlld3BvcnQudG9wKTtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSBtYXAubGluZUF0KGhlYWQsIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKSwgdG9wUG9zO1xuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxUYXJnZXQueSA9PSBcImNlbnRlclwiKVxuICAgICAgICAgICAgICAgICAgICB0b3BQb3MgPSAoYmxvY2sudG9wICsgYmxvY2suYm90dG9tKSAvIDIgLSB2aWV3SGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY3JvbGxUYXJnZXQueSA9PSBcInN0YXJ0XCIgfHwgc2Nyb2xsVGFyZ2V0LnkgPT0gXCJuZWFyZXN0XCIgJiYgaGVhZCA8IHZpZXdwb3J0LmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IGJsb2NrLnRvcDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IGJsb2NrLmJvdHRvbSAtIHZpZXdIZWlnaHQ7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQobWFwLmxpbmVBdCh0b3BQb3MgLSAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIsIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS5mcm9tLCBtYXAubGluZUF0KHRvcFBvcyArIHZpZXdIZWlnaHQgKyAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIsIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS50byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdwb3J0O1xuICAgIH1cbiAgICBtYXBWaWV3cG9ydCh2aWV3cG9ydCwgY2hhbmdlcykge1xuICAgICAgICBsZXQgZnJvbSA9IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LmZyb20sIC0xKSwgdG8gPSBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC50bywgMSk7XG4gICAgICAgIHJldHVybiBuZXcgVmlld3BvcnQodGhpcy5oZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLmZyb20sIHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCkudG8pO1xuICAgIH1cbiAgICAvLyBDaGVja3MgaWYgYSBnaXZlbiB2aWV3cG9ydCBjb3ZlcnMgdGhlIHZpc2libGUgcGFydCBvZiB0aGVcbiAgICAvLyBkb2N1bWVudCBhbmQgbm90IHRvbyBtdWNoIGJleW9uZCB0aGF0LlxuICAgIHZpZXdwb3J0SXNBcHByb3ByaWF0ZSh7IGZyb20sIHRvIH0sIGJpYXMgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5pblZpZXcpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHsgdG9wIH0gPSB0aGlzLmhlaWdodE1hcC5saW5lQXQoZnJvbSwgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCk7XG4gICAgICAgIGxldCB7IGJvdHRvbSB9ID0gdGhpcy5oZWlnaHRNYXAubGluZUF0KHRvLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKTtcbiAgICAgICAgbGV0IHsgdmlzaWJsZVRvcCwgdmlzaWJsZUJvdHRvbSB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChmcm9tID09IDAgfHwgdG9wIDw9IHZpc2libGVUb3AgLSBNYXRoLm1heCgxMCAvKiBWUC5NaW5Db3Zlck1hcmdpbiAqLywgTWF0aC5taW4oLWJpYXMsIDI1MCAvKiBWUC5NYXhDb3Zlck1hcmdpbiAqLykpKSAmJlxuICAgICAgICAgICAgKHRvID09IHRoaXMuc3RhdGUuZG9jLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIGJvdHRvbSA+PSB2aXNpYmxlQm90dG9tICsgTWF0aC5tYXgoMTAgLyogVlAuTWluQ292ZXJNYXJnaW4gKi8sIE1hdGgubWluKGJpYXMsIDI1MCAvKiBWUC5NYXhDb3Zlck1hcmdpbiAqLykpKSAmJlxuICAgICAgICAgICAgKHRvcCA+IHZpc2libGVUb3AgLSAyICogMTAwMCAvKiBWUC5NYXJnaW4gKi8gJiYgYm90dG9tIDwgdmlzaWJsZUJvdHRvbSArIDIgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLyk7XG4gICAgfVxuICAgIG1hcExpbmVHYXBzKGdhcHMsIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKCFnYXBzLmxlbmd0aCB8fCBjaGFuZ2VzLmVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIGdhcHM7XG4gICAgICAgIGxldCBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZ2FwIG9mIGdhcHMpXG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMudG91Y2hlc1JhbmdlKGdhcC5mcm9tLCBnYXAudG8pKVxuICAgICAgICAgICAgICAgIG1hcHBlZC5wdXNoKG5ldyBMaW5lR2FwKGNoYW5nZXMubWFwUG9zKGdhcC5mcm9tKSwgY2hhbmdlcy5tYXBQb3MoZ2FwLnRvKSwgZ2FwLnNpemUpKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gICAgLy8gQ29tcHV0ZXMgcG9zaXRpb25zIGluIHRoZSB2aWV3cG9ydCB3aGVyZSB0aGUgc3RhcnQgb3IgZW5kIG9mIGFcbiAgICAvLyBsaW5lIHNob3VsZCBiZSBoaWRkZW4sIHRyeWluZyB0byByZXVzZSBleGlzdGluZyBsaW5lIGdhcHMgd2hlblxuICAgIC8vIGFwcHJvcHJpYXRlIHRvIGF2b2lkIHVubmVjY2VzYXJ5IHJlZHJhd3MuXG4gICAgLy8gVXNlcyBjcnVkZSBjaGFyYWN0ZXItY291bnRpbmcgZm9yIHRoZSBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLFxuICAgIC8vIHNpbmNlIGFjdHVhbCBET00gY29vcmRpbmF0ZXMgYXJlbid0IGFsd2F5cyBhdmFpbGFibGUgYW5kXG4gICAgLy8gcHJlZGljdGFibGUuIFJlbGllcyBvbiBnZW5lcm91cyBtYXJnaW5zIChzZWUgTEcuTWFyZ2luKSB0byBoaWRlXG4gICAgLy8gdGhlIGFydGlmYWN0cyB0aGlzIG1pZ2h0IHByb2R1Y2UgZnJvbSB0aGUgdXNlci5cbiAgICBlbnN1cmVMaW5lR2FwcyhjdXJyZW50LCBtYXlNZWFzdXJlKSB7XG4gICAgICAgIGxldCB3cmFwcGluZyA9IHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVXcmFwcGluZztcbiAgICAgICAgbGV0IG1hcmdpbiA9IHdyYXBwaW5nID8gMTAwMDAgLyogTEcuTWFyZ2luV3JhcCAqLyA6IDIwMDAgLyogTEcuTWFyZ2luICovLCBoYWxmTWFyZ2luID0gbWFyZ2luID4+IDEsIGRvdWJsZU1hcmdpbiA9IG1hcmdpbiA8PCAxO1xuICAgICAgICAvLyBUaGUgbm9uLXdyYXBwaW5nIGxvZ2ljIHdvbid0IHdvcmsgYXQgYWxsIGluIHByZWRvbWluYW50bHkgcmlnaHQtdG8tbGVmdCB0ZXh0LlxuICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTFRSICYmICF3cmFwcGluZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IGdhcHMgPSBbXTtcbiAgICAgICAgbGV0IGFkZEdhcCA9IChmcm9tLCB0bywgbGluZSwgc3RydWN0dXJlKSA9PiB7XG4gICAgICAgICAgICBpZiAodG8gLSBmcm9tIDwgaGFsZk1hcmdpbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgc2VsID0gdGhpcy5zdGF0ZS5zZWxlY3Rpb24ubWFpbiwgYXZvaWQgPSBbc2VsLmZyb21dO1xuICAgICAgICAgICAgaWYgKCFzZWwuZW1wdHkpXG4gICAgICAgICAgICAgICAgYXZvaWQucHVzaChzZWwudG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgcG9zIG9mIGF2b2lkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgcG9zIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2FwKGZyb20sIHBvcyAtIDEwIC8qIExHLlNlbGVjdGlvbk1hcmdpbiAqLywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2FwKHBvcyArIDEwIC8qIExHLlNlbGVjdGlvbk1hcmdpbiAqLywgdG8sIGxpbmUsIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZ2FwID0gZmluZChjdXJyZW50LCBnYXAgPT4gZ2FwLmZyb20gPj0gbGluZS5mcm9tICYmIGdhcC50byA8PSBsaW5lLnRvICYmXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoZ2FwLmZyb20gLSBmcm9tKSA8IGhhbGZNYXJnaW4gJiYgTWF0aC5hYnMoZ2FwLnRvIC0gdG8pIDwgaGFsZk1hcmdpbiAmJlxuICAgICAgICAgICAgICAgICFhdm9pZC5zb21lKHBvcyA9PiBnYXAuZnJvbSA8IHBvcyAmJiBnYXAudG8gPiBwb3MpKTtcbiAgICAgICAgICAgIGlmICghZ2FwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBzY3JvbGxpbmcgZG93biwgc25hcCBnYXAgZW5kcyB0byBsaW5lIHN0YXJ0cyB0byBhdm9pZCBzaGlmdHMgaW4gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICBpZiAodG8gPCBsaW5lLnRvICYmIG1heU1lYXN1cmUgJiYgd3JhcHBpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgbWF5TWVhc3VyZS52aXNpYmxlUmFuZ2VzLnNvbWUociA9PiByLmZyb20gPD0gdG8gJiYgci50byA+PSB0bykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVTdGFydCA9IG1heU1lYXN1cmUubW92ZVRvTGluZUJvdW5kYXJ5KEVkaXRvclNlbGVjdGlvbi5jdXJzb3IodG8pLCBmYWxzZSwgdHJ1ZSkuaGVhZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVTdGFydCA+IGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICB0byA9IGxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2FwID0gbmV3IExpbmVHYXAoZnJvbSwgdG8sIHRoaXMuZ2FwU2l6ZShsaW5lLCBmcm9tLCB0bywgc3RydWN0dXJlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnYXBzLnB1c2goZ2FwKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0aGlzLnZpZXdwb3J0TGluZXMpIHtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA8IGRvdWJsZU1hcmdpbilcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzdHJ1Y3R1cmUgPSBsaW5lU3RydWN0dXJlKGxpbmUuZnJvbSwgbGluZS50bywgdGhpcy5zdGF0ZURlY28pO1xuICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS50b3RhbCA8IGRvdWJsZU1hcmdpbilcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLnNjcm9sbFRhcmdldCA/IHRoaXMuc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgOiBudWxsO1xuICAgICAgICAgICAgbGV0IHZpZXdGcm9tLCB2aWV3VG87XG4gICAgICAgICAgICBpZiAod3JhcHBpbmcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFyZ2luSGVpZ2h0ID0gKG1hcmdpbiAvIHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVMZW5ndGgpICogdGhpcy5oZWlnaHRPcmFjbGUubGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICBsZXQgdG9wLCBib3Q7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRGcmFjID0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlRnJhYyA9ICgodGhpcy52aXNpYmxlQm90dG9tIC0gdGhpcy52aXNpYmxlVG9wKSAvIDIgKyBtYXJnaW5IZWlnaHQpIC8gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IHRhcmdldEZyYWMgLSBzcGFjZUZyYWM7XG4gICAgICAgICAgICAgICAgICAgIGJvdCA9IHRhcmdldEZyYWMgKyBzcGFjZUZyYWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSAodGhpcy52aXNpYmxlVG9wIC0gbGluZS50b3AgLSBtYXJnaW5IZWlnaHQpIC8gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJvdCA9ICh0aGlzLnZpc2libGVCb3R0b20gLSBsaW5lLnRvcCArIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmlld0Zyb20gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCB0b3ApO1xuICAgICAgICAgICAgICAgIHZpZXdUbyA9IGZpbmRQb3NpdGlvbihzdHJ1Y3R1cmUsIGJvdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdG90YWxXaWR0aCA9IHN0cnVjdHVyZS50b3RhbCAqIHRoaXMuaGVpZ2h0T3JhY2xlLmNoYXJXaWR0aDtcbiAgICAgICAgICAgICAgICBsZXQgbWFyZ2luV2lkdGggPSBtYXJnaW4gKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGg7XG4gICAgICAgICAgICAgICAgbGV0IGxlZnQsIHJpZ2h0O1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0RnJhYyA9IGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZUZyYWMgPSAoKHRoaXMucGl4ZWxWaWV3cG9ydC5yaWdodCAtIHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0KSAvIDIgKyBtYXJnaW5XaWR0aCkgLyB0b3RhbFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gdGFyZ2V0RnJhYyAtIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0YXJnZXRGcmFjICsgc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9ICh0aGlzLnBpeGVsVmlld3BvcnQubGVmdCAtIG1hcmdpbldpZHRoKSAvIHRvdGFsV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gKHRoaXMucGl4ZWxWaWV3cG9ydC5yaWdodCArIG1hcmdpbldpZHRoKSAvIHRvdGFsV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpZXdGcm9tID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgbGVmdCk7XG4gICAgICAgICAgICAgICAgdmlld1RvID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgcmlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpZXdGcm9tID4gbGluZS5mcm9tKVxuICAgICAgICAgICAgICAgIGFkZEdhcChsaW5lLmZyb20sIHZpZXdGcm9tLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgaWYgKHZpZXdUbyA8IGxpbmUudG8pXG4gICAgICAgICAgICAgICAgYWRkR2FwKHZpZXdUbywgbGluZS50bywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2FwcztcbiAgICB9XG4gICAgZ2FwU2l6ZShsaW5lLCBmcm9tLCB0bywgc3RydWN0dXJlKSB7XG4gICAgICAgIGxldCBmcmFjdGlvbiA9IGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHRvKSAtIGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIGZyb20pO1xuICAgICAgICBpZiAodGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS5oZWlnaHQgKiBmcmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3R1cmUudG90YWwgKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGggKiBmcmFjdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVMaW5lR2FwcyhnYXBzKSB7XG4gICAgICAgIGlmICghTGluZUdhcC5zYW1lKGdhcHMsIHRoaXMubGluZUdhcHMpKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVHYXBzID0gZ2FwcztcbiAgICAgICAgICAgIHRoaXMubGluZUdhcERlY28gPSBEZWNvcmF0aW9uLnNldChnYXBzLm1hcChnYXAgPT4gZ2FwLmRyYXcodGhpcywgdGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXB1dGVWaXNpYmxlUmFuZ2VzKCkge1xuICAgICAgICBsZXQgZGVjbyA9IHRoaXMuc3RhdGVEZWNvO1xuICAgICAgICBpZiAodGhpcy5saW5lR2Fwcy5sZW5ndGgpXG4gICAgICAgICAgICBkZWNvID0gZGVjby5jb25jYXQodGhpcy5saW5lR2FwRGVjbyk7XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgUmFuZ2VTZXQuc3BhbnMoZGVjbywgdGhpcy52aWV3cG9ydC5mcm9tLCB0aGlzLnZpZXdwb3J0LnRvLCB7XG4gICAgICAgICAgICBzcGFuKGZyb20sIHRvKSB7IHJhbmdlcy5wdXNoKHsgZnJvbSwgdG8gfSk7IH0sXG4gICAgICAgICAgICBwb2ludCgpIHsgfVxuICAgICAgICB9LCAyMCk7XG4gICAgICAgIGxldCBjaGFuZ2VkID0gcmFuZ2VzLmxlbmd0aCAhPSB0aGlzLnZpc2libGVSYW5nZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMuc29tZSgociwgaSkgPT4gci5mcm9tICE9IHJhbmdlc1tpXS5mcm9tIHx8IHIudG8gIT0gcmFuZ2VzW2ldLnRvKTtcbiAgICAgICAgdGhpcy52aXNpYmxlUmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICByZXR1cm4gY2hhbmdlZCA/IDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLyA6IDA7XG4gICAgfVxuICAgIGxpbmVCbG9ja0F0KHBvcykge1xuICAgICAgICByZXR1cm4gKHBvcyA+PSB0aGlzLnZpZXdwb3J0LmZyb20gJiYgcG9zIDw9IHRoaXMudmlld3BvcnQudG8gJiYgdGhpcy52aWV3cG9ydExpbmVzLmZpbmQoYiA9PiBiLmZyb20gPD0gcG9zICYmIGIudG8gPj0gcG9zKSkgfHxcbiAgICAgICAgICAgIHNjYWxlQmxvY2sodGhpcy5oZWlnaHRNYXAubGluZUF0KHBvcywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgbGluZUJsb2NrQXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBzY2FsZUJsb2NrKHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0aGlzLnNjYWxlci5mcm9tRE9NKGhlaWdodCksIFF1ZXJ5VHlwZS5CeUhlaWdodCwgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLCB0aGlzLnNjYWxlcik7XG4gICAgfVxuICAgIHNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCkge1xuICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLmxpbmVCbG9ja0F0SGVpZ2h0KHNjcm9sbFRvcCArIDgpO1xuICAgICAgICByZXR1cm4gYmxvY2suZnJvbSA+PSB0aGlzLnZpZXdwb3J0LmZyb20gfHwgdGhpcy52aWV3cG9ydExpbmVzWzBdLnRvcCAtIHNjcm9sbFRvcCA+IDIwMCA/IGJsb2NrIDogdGhpcy52aWV3cG9ydExpbmVzWzBdO1xuICAgIH1cbiAgICBlbGVtZW50QXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBzY2FsZUJsb2NrKHRoaXMuaGVpZ2h0TWFwLmJsb2NrQXQodGhpcy5zY2FsZXIuZnJvbURPTShoZWlnaHQpLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgZ2V0IGRvY0hlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGVyLnRvRE9NKHRoaXMuaGVpZ2h0TWFwLmhlaWdodCk7XG4gICAgfVxuICAgIGdldCBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NIZWlnaHQgKyB0aGlzLnBhZGRpbmdUb3AgKyB0aGlzLnBhZGRpbmdCb3R0b207XG4gICAgfVxufVxuY2xhc3MgVmlld3BvcnQge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICB9XG59XG5mdW5jdGlvbiBsaW5lU3RydWN0dXJlKGZyb20sIHRvLCBzdGF0ZURlY28pIHtcbiAgICBsZXQgcmFuZ2VzID0gW10sIHBvcyA9IGZyb20sIHRvdGFsID0gMDtcbiAgICBSYW5nZVNldC5zcGFucyhzdGF0ZURlY28sIGZyb20sIHRvLCB7XG4gICAgICAgIHNwYW4oKSB7IH0sXG4gICAgICAgIHBvaW50KGZyb20sIHRvKSB7XG4gICAgICAgICAgICBpZiAoZnJvbSA+IHBvcykge1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogcG9zLCB0bzogZnJvbSB9KTtcbiAgICAgICAgICAgICAgICB0b3RhbCArPSBmcm9tIC0gcG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gdG87XG4gICAgICAgIH1cbiAgICB9LCAyMCk7IC8vIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb2xsYXBzZWQgcmFuZ2VzIG9mIGEgc2lnbmlmaWNhbnQgc2l6ZVxuICAgIGlmIChwb3MgPCB0bykge1xuICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IHBvcywgdG8gfSk7XG4gICAgICAgIHRvdGFsICs9IHRvIC0gcG9zO1xuICAgIH1cbiAgICByZXR1cm4geyB0b3RhbCwgcmFuZ2VzIH07XG59XG5mdW5jdGlvbiBmaW5kUG9zaXRpb24oeyB0b3RhbCwgcmFuZ2VzIH0sIHJhdGlvKSB7XG4gICAgaWYgKHJhdGlvIDw9IDApXG4gICAgICAgIHJldHVybiByYW5nZXNbMF0uZnJvbTtcbiAgICBpZiAocmF0aW8gPj0gMSlcbiAgICAgICAgcmV0dXJuIHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0udG87XG4gICAgbGV0IGRpc3QgPSBNYXRoLmZsb29yKHRvdGFsICogcmF0aW8pO1xuICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSByYW5nZXNbaV0sIHNpemUgPSB0byAtIGZyb207XG4gICAgICAgIGlmIChkaXN0IDw9IHNpemUpXG4gICAgICAgICAgICByZXR1cm4gZnJvbSArIGRpc3Q7XG4gICAgICAgIGRpc3QgLT0gc2l6ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCBwb3MpIHtcbiAgICBsZXQgY291bnRlZCA9IDA7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHN0cnVjdHVyZS5yYW5nZXMpIHtcbiAgICAgICAgaWYgKHBvcyA8PSB0bykge1xuICAgICAgICAgICAgY291bnRlZCArPSBwb3MgLSBmcm9tO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY291bnRlZCArPSB0byAtIGZyb207XG4gICAgfVxuICAgIHJldHVybiBjb3VudGVkIC8gc3RydWN0dXJlLnRvdGFsO1xufVxuZnVuY3Rpb24gZmluZChhcnJheSwgZikge1xuICAgIGZvciAobGV0IHZhbCBvZiBhcnJheSlcbiAgICAgICAgaWYgKGYodmFsKSlcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8vIERvbid0IHNjYWxlIHdoZW4gdGhlIGRvY3VtZW50IGhlaWdodCBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHdoYXRcbi8vIHRoZSBET00gY2FuIGhhbmRsZS5cbmNvbnN0IElkU2NhbGVyID0ge1xuICAgIHRvRE9NKG4pIHsgcmV0dXJuIG47IH0sXG4gICAgZnJvbURPTShuKSB7IHJldHVybiBuOyB9LFxuICAgIHNjYWxlOiAxXG59O1xuLy8gV2hlbiB0aGUgaGVpZ2h0IGlzIHRvbyBiaWcgKD4gVlAuTWF4RE9NSGVpZ2h0KSwgc2NhbGUgZG93biB0aGVcbi8vIHJlZ2lvbnMgb3V0c2lkZSB0aGUgdmlld3BvcnRzIHNvIHRoYXQgdGhlIHRvdGFsIGhlaWdodCBpc1xuLy8gVlAuTWF4RE9NSGVpZ2h0LlxuY2xhc3MgQmlnU2NhbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcmFjbGUsIGhlaWdodE1hcCwgdmlld3BvcnRzKSB7XG4gICAgICAgIGxldCB2cEhlaWdodCA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDtcbiAgICAgICAgdGhpcy52aWV3cG9ydHMgPSB2aWV3cG9ydHMubWFwKCh7IGZyb20sIHRvIH0pID0+IHtcbiAgICAgICAgICAgIGxldCB0b3AgPSBoZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKS50b3A7XG4gICAgICAgICAgICBsZXQgYm90dG9tID0gaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIDAsIDApLmJvdHRvbTtcbiAgICAgICAgICAgIHZwSGVpZ2h0ICs9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb20sIHRvLCB0b3AsIGJvdHRvbSwgZG9tVG9wOiAwLCBkb21Cb3R0b206IDAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAoNzAwMDAwMCAvKiBWUC5NYXhET01IZWlnaHQgKi8gLSB2cEhlaWdodCkgLyAoaGVpZ2h0TWFwLmhlaWdodCAtIHZwSGVpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgb2JqIG9mIHRoaXMudmlld3BvcnRzKSB7XG4gICAgICAgICAgICBvYmouZG9tVG9wID0gZG9tQmFzZSArIChvYmoudG9wIC0gYmFzZSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgZG9tQmFzZSA9IG9iai5kb21Cb3R0b20gPSBvYmouZG9tVG9wICsgKG9iai5ib3R0b20gLSBvYmoudG9wKTtcbiAgICAgICAgICAgIGJhc2UgPSBvYmouYm90dG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvRE9NKG4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZwID0gaSA8IHRoaXMudmlld3BvcnRzLmxlbmd0aCA/IHRoaXMudmlld3BvcnRzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdnAgfHwgbiA8IHZwLnRvcClcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQmFzZSArIChuIC0gYmFzZSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgaWYgKG4gPD0gdnAuYm90dG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB2cC5kb21Ub3AgKyAobiAtIHZwLnRvcCk7XG4gICAgICAgICAgICBiYXNlID0gdnAuYm90dG9tO1xuICAgICAgICAgICAgZG9tQmFzZSA9IHZwLmRvbUJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmcm9tRE9NKG4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZwID0gaSA8IHRoaXMudmlld3BvcnRzLmxlbmd0aCA/IHRoaXMudmlld3BvcnRzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdnAgfHwgbiA8IHZwLmRvbVRvcClcbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZSArIChuIC0gZG9tQmFzZSkgLyB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgaWYgKG4gPD0gdnAuZG9tQm90dG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB2cC50b3AgKyAobiAtIHZwLmRvbVRvcCk7XG4gICAgICAgICAgICBiYXNlID0gdnAuYm90dG9tO1xuICAgICAgICAgICAgZG9tQmFzZSA9IHZwLmRvbUJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNjYWxlQmxvY2soYmxvY2ssIHNjYWxlcikge1xuICAgIGlmIChzY2FsZXIuc2NhbGUgPT0gMSlcbiAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgIGxldCBiVG9wID0gc2NhbGVyLnRvRE9NKGJsb2NrLnRvcCksIGJCb3R0b20gPSBzY2FsZXIudG9ET00oYmxvY2suYm90dG9tKTtcbiAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhibG9jay5mcm9tLCBibG9jay5sZW5ndGgsIGJUb3AsIGJCb3R0b20gLSBiVG9wLCBBcnJheS5pc0FycmF5KGJsb2NrLl9jb250ZW50KSA/IGJsb2NrLl9jb250ZW50Lm1hcChiID0+IHNjYWxlQmxvY2soYiwgc2NhbGVyKSkgOiBibG9jay5fY29udGVudCk7XG59XG5cbmNvbnN0IHRoZW1lID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHN0cnMgPT4gc3Rycy5qb2luKFwiIFwiKSB9KTtcbmNvbnN0IGRhcmtUaGVtZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmluZGV4T2YodHJ1ZSkgPiAtMSB9KTtcbmNvbnN0IGJhc2VUaGVtZUlEID0gLypAX19QVVJFX18qL1N0eWxlTW9kdWxlLm5ld05hbWUoKSwgYmFzZUxpZ2h0SUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpLCBiYXNlRGFya0lEID0gLypAX19QVVJFX18qL1N0eWxlTW9kdWxlLm5ld05hbWUoKTtcbmNvbnN0IGxpZ2h0RGFya0lEcyA9IHsgXCImbGlnaHRcIjogXCIuXCIgKyBiYXNlTGlnaHRJRCwgXCImZGFya1wiOiBcIi5cIiArIGJhc2VEYXJrSUQgfTtcbmZ1bmN0aW9uIGJ1aWxkVGhlbWUobWFpbiwgc3BlYywgc2NvcGVzKSB7XG4gICAgcmV0dXJuIG5ldyBTdHlsZU1vZHVsZShzcGVjLCB7XG4gICAgICAgIGZpbmlzaChzZWwpIHtcbiAgICAgICAgICAgIHJldHVybiAvJi8udGVzdChzZWwpID8gc2VsLnJlcGxhY2UoLyZcXHcqLywgbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG0gPT0gXCImXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWluO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGVzIHx8ICFzY29wZXNbbV0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbnN1cHBvcnRlZCBzZWxlY3RvcjogJHttfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBzY29wZXNbbV07XG4gICAgICAgICAgICB9KSA6IG1haW4gKyBcIiBcIiArIHNlbDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuY29uc3QgYmFzZVRoZW1lJDEgPSAvKkBfX1BVUkVfXyovYnVpbGRUaGVtZShcIi5cIiArIGJhc2VUaGVtZUlELCB7XG4gICAgXCImXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmUgIWltcG9ydGFudFwiLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBcIiYuY20tZm9jdXNlZFwiOiB7XG4gICAgICAgICAgICAvLyBQcm92aWRlIGEgc2ltcGxlIGRlZmF1bHQgb3V0bGluZSB0byBtYWtlIHN1cmUgYSBmb2N1c2VkXG4gICAgICAgICAgICAvLyBlZGl0b3IgaXMgdmlzdWFsbHkgZGlzdGluY3QuIENhbid0IGxlYXZlIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd2lsbCBhcHBseSB0byB0aGUgY29udGVudCBlbGVtZW50LCB3aGljaCBpc1xuICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lciBhbmQgZG9lc24ndCBpbmNsdWRlIHRoZVxuICAgICAgICAgICAgLy8gZ3V0dGVycy4gV2UgYWxzbyBjYW4ndCB1c2UgYW4gJ2F1dG8nIG91dGxpbmUsIHNpbmNlIHRob3NlXG4gICAgICAgICAgICAvLyBhcmUsIGZvciBzb21lIHJlYXNvbiwgZHJhd24gYmVoaW5kIHRoZSBlbGVtZW50IGNvbnRlbnQsIHdoaWNoXG4gICAgICAgICAgICAvLyB3aWxsIGNhdXNlIHRoaW5ncyBsaWtlIHRoZSBhY3RpdmUgbGluZSBiYWNrZ3JvdW5kIHRvIGNvdmVyXG4gICAgICAgICAgICAvLyB0aGUgb3V0bGluZSAoIzI5NykuXG4gICAgICAgICAgICBvdXRsaW5lOiBcIjFweCBkb3R0ZWQgIzIxMjEyMVwiXG4gICAgICAgIH0sXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleCAhaW1wb3J0YW50XCIsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCJcbiAgICB9LFxuICAgIFwiLmNtLXNjcm9sbGVyXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJmbGV4ICFpbXBvcnRhbnRcIixcbiAgICAgICAgYWxpZ25JdGVtczogXCJmbGV4LXN0YXJ0ICFpbXBvcnRhbnRcIixcbiAgICAgICAgZm9udEZhbWlseTogXCJtb25vc3BhY2VcIixcbiAgICAgICAgbGluZUhlaWdodDogMS40LFxuICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBvdmVyZmxvd1g6IFwiYXV0b1wiLFxuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICB6SW5kZXg6IDBcbiAgICB9LFxuICAgIFwiLmNtLWNvbnRlbnRcIjoge1xuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIGZsZXhHcm93OiAyLFxuICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwicHJlXCIsXG4gICAgICAgIHdvcmRXcmFwOiBcIm5vcm1hbFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9kZXYvaXNzdWVzLzQ1NlxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBtaW5IZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBwYWRkaW5nOiBcIjRweCAwXCIsXG4gICAgICAgIG91dGxpbmU6IFwibm9uZVwiLFxuICAgICAgICBcIiZbY29udGVudGVkaXRhYmxlPXRydWVdXCI6IHtcbiAgICAgICAgICAgIFdlYmtpdFVzZXJNb2RpZnk6IFwicmVhZC13cml0ZS1wbGFpbnRleHQtb25seVwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIi5jbS1saW5lV3JhcHBpbmdcIjoge1xuICAgICAgICB3aGl0ZVNwYWNlX2ZhbGxiYWNrOiBcInByZS13cmFwXCIsIC8vIEZvciBJRVxuICAgICAgICB3aGl0ZVNwYWNlOiBcImJyZWFrLXNwYWNlc1wiLFxuICAgICAgICB3b3JkQnJlYWs6IFwiYnJlYWstd29yZFwiLCAvLyBGb3IgU2FmYXJpLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmVcbiAgICAgICAgb3ZlcmZsb3dXcmFwOiBcImFueXdoZXJlXCIsXG4gICAgICAgIGZsZXhTaHJpbms6IDFcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1jb250ZW50XCI6IHsgY2FyZXRDb2xvcjogXCJibGFja1wiIH0sXG4gICAgXCImZGFyayAuY20tY29udGVudFwiOiB7IGNhcmV0Q29sb3I6IFwid2hpdGVcIiB9LFxuICAgIFwiLmNtLWxpbmVcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiMCAycHggMCA2cHhcIlxuICAgIH0sXG4gICAgXCIuY20tbGF5ZXJcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGNvbnRhaW46IFwic2l6ZSBzdHlsZVwiLFxuICAgICAgICBcIiYgPiAqXCI6IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiNkOWQ5ZDlcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiIzIyMlwiXG4gICAgfSxcbiAgICBcIiZsaWdodC5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLXNlbGVjdGlvbkxheWVyIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjZDdkNGYwXCJcbiAgICB9LFxuICAgIFwiJmRhcmsuY20tZm9jdXNlZCA+IC5jbS1zY3JvbGxlciA+IC5jbS1zZWxlY3Rpb25MYXllciAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiIzIzM1wiXG4gICAgfSxcbiAgICBcIi5jbS1jdXJzb3JMYXllclwiOiB7XG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiXG4gICAgfSxcbiAgICBcIiYuY20tZm9jdXNlZCA+IC5jbS1zY3JvbGxlciA+IC5jbS1jdXJzb3JMYXllclwiOiB7XG4gICAgICAgIGFuaW1hdGlvbjogXCJzdGVwcygxKSBjbS1ibGluayAxLjJzIGluZmluaXRlXCJcbiAgICB9LFxuICAgIC8vIFR3byBhbmltYXRpb25zIGRlZmluZWQgc28gdGhhdCB3ZSBjYW4gc3dpdGNoIGJldHdlZW4gdGhlbSB0b1xuICAgIC8vIHJlc3RhcnQgdGhlIGFuaW1hdGlvbiB3aXRob3V0IGZvcmNpbmcgYW5vdGhlciBzdHlsZVxuICAgIC8vIHJlY29tcHV0YXRpb24uXG4gICAgXCJAa2V5ZnJhbWVzIGNtLWJsaW5rXCI6IHsgXCIwJVwiOiB7fSwgXCI1MCVcIjogeyBvcGFjaXR5OiAwIH0sIFwiMTAwJVwiOiB7fSB9LFxuICAgIFwiQGtleWZyYW1lcyBjbS1ibGluazJcIjogeyBcIjAlXCI6IHt9LCBcIjUwJVwiOiB7IG9wYWNpdHk6IDAgfSwgXCIxMDAlXCI6IHt9IH0sXG4gICAgXCIuY20tY3Vyc29yLCAuY20tZHJvcEN1cnNvclwiOiB7XG4gICAgICAgIGJvcmRlckxlZnQ6IFwiMS4ycHggc29saWQgYmxhY2tcIixcbiAgICAgICAgbWFyZ2luTGVmdDogXCItMC42cHhcIixcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi5jbS1jdXJzb3JcIjoge1xuICAgICAgICBkaXNwbGF5OiBcIm5vbmVcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tY3Vyc29yXCI6IHtcbiAgICAgICAgYm9yZGVyTGVmdENvbG9yOiBcIiM0NDRcIlxuICAgIH0sXG4gICAgXCIuY20tZHJvcEN1cnNvclwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCJcbiAgICB9LFxuICAgIFwiJi5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLWN1cnNvckxheWVyIC5jbS1jdXJzb3JcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICB9LFxuICAgIFwiLmNtLWlzb1wiOiB7XG4gICAgICAgIHVuaWNvZGVCaWRpOiBcImlzb2xhdGVcIlxuICAgIH0sXG4gICAgXCIuY20tYW5ub3VuY2VkXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgdG9wOiBcIi0xMDAwMHB4XCJcbiAgICB9LFxuICAgIFwiQG1lZGlhIHByaW50XCI6IHtcbiAgICAgICAgXCIuY20tYW5ub3VuY2VkXCI6IHsgZGlzcGxheTogXCJub25lXCIgfVxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWFjdGl2ZUxpbmVcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiI2NjZWVmZjQ0XCIgfSxcbiAgICBcIiZkYXJrIC5jbS1hY3RpdmVMaW5lXCI6IHsgYmFja2dyb3VuZENvbG9yOiBcIiM5OWVlZmYzM1wiIH0sXG4gICAgXCImbGlnaHQgLmNtLXNwZWNpYWxDaGFyXCI6IHsgY29sb3I6IFwicmVkXCIgfSxcbiAgICBcIiZkYXJrIC5jbS1zcGVjaWFsQ2hhclwiOiB7IGNvbG9yOiBcIiNmNzhcIiB9LFxuICAgIFwiLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgICAgekluZGV4OiAyMDBcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1ndXR0ZXJzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgY29sb3I6IFwiIzZjNmM2Y1wiLFxuICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1ndXR0ZXJzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgY29sb3I6IFwiI2NjY1wiXG4gICAgfSxcbiAgICBcIi5jbS1ndXR0ZXJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImZsZXggIWltcG9ydGFudFwiLCAvLyBOZWNlc3NhcnkgLS0gcHJldmVudHMgbWFyZ2luIGNvbGxhcHNpbmdcbiAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgbWluSGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICB9LFxuICAgIFwiLmNtLWd1dHRlckVsZW1lbnRcIjoge1xuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiXG4gICAgfSxcbiAgICBcIi5jbS1saW5lTnVtYmVycyAuY20tZ3V0dGVyRWxlbWVudFwiOiB7XG4gICAgICAgIHBhZGRpbmc6IFwiMCAzcHggMCA1cHhcIixcbiAgICAgICAgbWluV2lkdGg6IFwiMjBweFwiLFxuICAgICAgICB0ZXh0QWxpZ246IFwicmlnaHRcIixcbiAgICAgICAgd2hpdGVTcGFjZTogXCJub3dyYXBcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2UyZjJmZlwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1hY3RpdmVMaW5lR3V0dGVyXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMyMjIyMjdcIlxuICAgIH0sXG4gICAgXCIuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgcG9zaXRpb246IFwic3RpY2t5XCIsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHJpZ2h0OiAwXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgY29sb3I6IFwiYmxhY2tcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXBhbmVscy10b3BcIjoge1xuICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXBhbmVscy1ib3R0b21cIjoge1xuICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgIH0sXG4gICAgXCIuY20tdGFiXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwiYm90dG9tXCJcbiAgICB9LFxuICAgIFwiLmNtLXdpZGdldEJ1ZmZlclwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwidGV4dC10b3BcIixcbiAgICAgICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxuICAgIH0sXG4gICAgXCIuY20tcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICBjb2xvcjogXCIjODg4XCIsXG4gICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG4gICAgfSxcbiAgICBcIi5jbS1oaWdobGlnaHRTcGFjZTpiZWZvcmVcIjoge1xuICAgICAgICBjb250ZW50OiBcImF0dHIoZGF0YS1kaXNwbGF5KVwiLFxuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICAgICAgY29sb3I6IFwiIzg4OFwiXG4gICAgfSxcbiAgICBcIi5jbS1oaWdobGlnaHRUYWJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwMFwiIGhlaWdodD1cIjIwXCI+PHBhdGggc3Ryb2tlPVwiJTIzODg4XCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZD1cIk0xIDEwSDE5NkwxOTAgNU0xOTAgMTVMMTk2IDEwTTE5NyA0TDE5NyAxNlwiLz48L3N2Zz4nKWAsXG4gICAgICAgIGJhY2tncm91bmRTaXplOiBcImF1dG8gMTAwJVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFwicmlnaHQgOTAlXCIsXG4gICAgICAgIGJhY2tncm91bmRSZXBlYXQ6IFwibm8tcmVwZWF0XCJcbiAgICB9LFxuICAgIFwiLmNtLXRyYWlsaW5nU3BhY2VcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmMzMyMjU1XCJcbiAgICB9LFxuICAgIFwiLmNtLWJ1dHRvblwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwibWlkZGxlXCIsXG4gICAgICAgIGNvbG9yOiBcImluaGVyaXRcIixcbiAgICAgICAgZm9udFNpemU6IFwiNzAlXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiLjJlbSAxZW1cIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjFweFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjZWZmMWY1LCAjZDlkOWRmKVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM4ODhcIixcbiAgICAgICAgXCImOmFjdGl2ZVwiOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCNiNGI0YjQsICNkMGQzZDYpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCImZGFyayAuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjMzkzOTM5LCAjMTExKVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM4ODhcIixcbiAgICAgICAgXCImOmFjdGl2ZVwiOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCMxMTEsICMzMzMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCIuY20tdGV4dGZpZWxkXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJtaWRkbGVcIixcbiAgICAgICAgY29sb3I6IFwiaW5oZXJpdFwiLFxuICAgICAgICBmb250U2l6ZTogXCI3MCVcIixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCBzaWx2ZXJcIixcbiAgICAgICAgcGFkZGluZzogXCIuMmVtIC41ZW1cIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRleHRmaWVsZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS10ZXh0ZmllbGRcIjoge1xuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM1NTVcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcImluaGVyaXRcIlxuICAgIH1cbn0sIGxpZ2h0RGFya0lEcyk7XG5cbmNvbnN0IExpbmVCcmVha1BsYWNlaG9sZGVyID0gXCJcXHVmZmZmXCI7XG5jbGFzcyBET01SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG4gICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgIHRoaXMubGluZVNlcGFyYXRvciA9IHN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBhcHBlbmQodGV4dCkge1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG4gICAgbGluZUJyZWFrKCkge1xuICAgICAgICB0aGlzLnRleHQgKz0gTGluZUJyZWFrUGxhY2Vob2xkZXI7XG4gICAgfVxuICAgIHJlYWRSYW5nZShzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmICghc3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IHBhcmVudCA9IHN0YXJ0LnBhcmVudE5vZGU7XG4gICAgICAgIGZvciAobGV0IGN1ciA9IHN0YXJ0OzspIHtcbiAgICAgICAgICAgIHRoaXMuZmluZFBvaW50QmVmb3JlKHBhcmVudCwgY3VyKTtcbiAgICAgICAgICAgIGxldCBvbGRMZW4gPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5yZWFkTm9kZShjdXIpO1xuICAgICAgICAgICAgbGV0IG5leHQgPSBjdXIubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAobmV4dCA9PSBlbmQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChjdXIpLCBuZXh0VmlldyA9IENvbnRlbnRWaWV3LmdldChuZXh0KTtcbiAgICAgICAgICAgIGlmICh2aWV3ICYmIG5leHRWaWV3ID8gdmlldy5icmVha0FmdGVyIDpcbiAgICAgICAgICAgICAgICAodmlldyA/IHZpZXcuYnJlYWtBZnRlciA6IGlzQmxvY2tFbGVtZW50KGN1cikpIHx8XG4gICAgICAgICAgICAgICAgICAgIChpc0Jsb2NrRWxlbWVudChuZXh0KSAmJiAoY3VyLm5vZGVOYW1lICE9IFwiQlJcIiB8fCBjdXIuY21JZ25vcmUpICYmIHRoaXMudGV4dC5sZW5ndGggPiBvbGRMZW4pKVxuICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluZFBvaW50QmVmb3JlKHBhcmVudCwgZW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlYWRUZXh0Tm9kZShub2RlKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gbm9kZS5ub2RlVmFsdWU7XG4gICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgaWYgKHBvaW50Lm5vZGUgPT0gbm9kZSlcbiAgICAgICAgICAgICAgICBwb2ludC5wb3MgPSB0aGlzLnRleHQubGVuZ3RoICsgTWF0aC5taW4ocG9pbnQub2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IG9mZiA9IDAsIHJlID0gdGhpcy5saW5lU2VwYXJhdG9yID8gbnVsbCA6IC9cXHJcXG4/fFxcbi9nOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0QnJlYWsgPSAtMSwgYnJlYWtTaXplID0gMSwgbTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBuZXh0QnJlYWsgPSB0ZXh0LmluZGV4T2YodGhpcy5saW5lU2VwYXJhdG9yLCBvZmYpO1xuICAgICAgICAgICAgICAgIGJyZWFrU2l6ZSA9IHRoaXMubGluZVNlcGFyYXRvci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtID0gcmUuZXhlYyh0ZXh0KSkge1xuICAgICAgICAgICAgICAgIG5leHRCcmVhayA9IG0uaW5kZXg7XG4gICAgICAgICAgICAgICAgYnJlYWtTaXplID0gbVswXS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh0ZXh0LnNsaWNlKG9mZiwgbmV4dEJyZWFrIDwgMCA/IHRleHQubGVuZ3RoIDogbmV4dEJyZWFrKSk7XG4gICAgICAgICAgICBpZiAobmV4dEJyZWFrIDwgMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICBpZiAoYnJlYWtTaXplID4gMSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50Lm5vZGUgPT0gbm9kZSAmJiBwb2ludC5wb3MgPiB0aGlzLnRleHQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQucG9zIC09IGJyZWFrU2l6ZSAtIDE7XG4gICAgICAgICAgICBvZmYgPSBuZXh0QnJlYWsgKyBicmVha1NpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZE5vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5jbUlnbm9yZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHZpZXcgPSBDb250ZW50Vmlldy5nZXQobm9kZSk7XG4gICAgICAgIGxldCBmcm9tVmlldyA9IHZpZXcgJiYgdmlldy5vdmVycmlkZURPTVRleHQ7XG4gICAgICAgIGlmIChmcm9tVmlldyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRQb2ludEluc2lkZShub2RlLCBmcm9tVmlldy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZyb21WaWV3Lml0ZXIoKTsgIWkubmV4dCgpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGkubGluZUJyZWFrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhaygpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoaS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRUZXh0Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09IFwiQlJcIikge1xuICAgICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFJhbmdlKG5vZGUuZmlyc3RDaGlsZCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZFBvaW50QmVmb3JlKG5vZGUsIG5leHQpIHtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgb2YgdGhpcy5wb2ludHMpXG4gICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlICYmIG5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdID09IG5leHQpXG4gICAgICAgICAgICAgICAgcG9pbnQucG9zID0gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG4gICAgZmluZFBvaW50SW5zaWRlKG5vZGUsIGxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgPyBwb2ludC5ub2RlID09IG5vZGUgOiBub2RlLmNvbnRhaW5zKHBvaW50Lm5vZGUpKVxuICAgICAgICAgICAgICAgIHBvaW50LnBvcyA9IHRoaXMudGV4dC5sZW5ndGggKyAoaXNBdEVuZChub2RlLCBwb2ludC5ub2RlLCBwb2ludC5vZmZzZXQpID8gbGVuZ3RoIDogMCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNBdEVuZChwYXJlbnQsIG5vZGUsIG9mZnNldCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG9mZnNldCA8IG1heE9mZnNldChub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpICsgMTtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0Jsb2NrRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMSAmJiAvXihESVZ8UHxMSXxVTHxPTHxCTE9DS1FVT1RFfEREfERUfEhcXGR8U0VDVElPTnxQUkUpJC8udGVzdChub2RlLm5vZGVOYW1lKTtcbn1cbmNsYXNzIERPTVBvaW50IHtcbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMucG9zID0gLTE7XG4gICAgfVxufVxuXG5jbGFzcyBET01DaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHN0YXJ0LCBlbmQsIHR5cGVPdmVyKSB7XG4gICAgICAgIHRoaXMudHlwZU92ZXIgPSB0eXBlT3ZlcjtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICBsZXQgeyBpbXByZWNpc2VIZWFkOiBpSGVhZCwgaW1wcmVjaXNlQW5jaG9yOiBpQW5jaG9yIH0gPSB2aWV3LmRvY1ZpZXc7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5ICYmIHN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBjaGFuZ2VzIHdoZW4gdGhlIGVkaXRvciBpcyByZWFkLW9ubHlcbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGFydCA+IC0xICYmICh0aGlzLmJvdW5kcyA9IHZpZXcuZG9jVmlldy5kb21Cb3VuZHNBcm91bmQoc3RhcnQsIGVuZCwgMCkpKSB7XG4gICAgICAgICAgICBsZXQgc2VsUG9pbnRzID0gaUhlYWQgfHwgaUFuY2hvciA/IFtdIDogc2VsZWN0aW9uUG9pbnRzKHZpZXcpO1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBET01SZWFkZXIoc2VsUG9pbnRzLCB2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkUmFuZ2UodGhpcy5ib3VuZHMuc3RhcnRET00sIHRoaXMuYm91bmRzLmVuZERPTSk7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSByZWFkZXIudGV4dDtcbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gc2VsZWN0aW9uRnJvbVBvaW50cyhzZWxQb2ludHMsIHRoaXMuYm91bmRzLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRvbVNlbCA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgICAgICBsZXQgaGVhZCA9IGlIZWFkICYmIGlIZWFkLm5vZGUgPT0gZG9tU2VsLmZvY3VzTm9kZSAmJiBpSGVhZC5vZmZzZXQgPT0gZG9tU2VsLmZvY3VzT2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRhaW5zKHZpZXcuY29udGVudERPTSwgZG9tU2VsLmZvY3VzTm9kZSlcbiAgICAgICAgICAgICAgICA/IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZFxuICAgICAgICAgICAgICAgIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0KTtcbiAgICAgICAgICAgIGxldCBhbmNob3IgPSBpQW5jaG9yICYmIGlBbmNob3Iubm9kZSA9PSBkb21TZWwuYW5jaG9yTm9kZSAmJiBpQW5jaG9yLm9mZnNldCA9PSBkb21TZWwuYW5jaG9yT2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRhaW5zKHZpZXcuY29udGVudERPTSwgZG9tU2VsLmFuY2hvck5vZGUpXG4gICAgICAgICAgICAgICAgPyB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvclxuICAgICAgICAgICAgICAgIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgICAgICAgLy8gaU9TIHdpbGwgcmVmdXNlIHRvIHNlbGVjdCB0aGUgYmxvY2sgZ2FwcyB3aGVuIGRvaW5nIHNlbGVjdC1hbGxcbiAgICAgICAgICAgIGxldCB2cCA9IHZpZXcudmlld3BvcnQ7XG4gICAgICAgICAgICBpZiAoYnJvd3Nlci5pb3MgJiYgdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5lbXB0eSAmJiBoZWFkICE9IGFuY2hvciAmJlxuICAgICAgICAgICAgICAgICh2cC5mcm9tID4gMCB8fCB2cC50byA8IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgb2ZmRnJvbSA9IHZwLmZyb20gLSBNYXRoLm1pbihoZWFkLCBhbmNob3IpLCBvZmZUbyA9IHZwLnRvIC0gTWF0aC5tYXgoaGVhZCwgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoKG9mZkZyb20gPT0gMCB8fCBvZmZGcm9tID09IDEpICYmIChvZmZUbyA9PSAwIHx8IG9mZlRvID09IC0xKSkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gdmlldy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShhbmNob3IsIGhlYWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlET01DaGFuZ2UodmlldywgZG9tQ2hhbmdlKSB7XG4gICAgbGV0IGNoYW5nZTtcbiAgICBsZXQgeyBuZXdTZWwgfSA9IGRvbUNoYW5nZSwgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICBsZXQgbGFzdEtleSA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5VGltZSA+IERhdGUubm93KCkgLSAxMDAgPyB2aWV3LmlucHV0U3RhdGUubGFzdEtleUNvZGUgOiAtMTtcbiAgICBpZiAoZG9tQ2hhbmdlLmJvdW5kcykge1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gZG9tQ2hhbmdlLmJvdW5kcztcbiAgICAgICAgbGV0IHByZWZlcnJlZFBvcyA9IHNlbC5mcm9tLCBwcmVmZXJyZWRTaWRlID0gbnVsbDtcbiAgICAgICAgLy8gUHJlZmVyIGFuY2hvcmluZyB0byBlbmQgd2hlbiBCYWNrc3BhY2UgaXMgcHJlc3NlZCAob3IsIG9uXG4gICAgICAgIC8vIEFuZHJvaWQsIHdoZW4gc29tZXRoaW5nIHdhcyBkZWxldGVkKVxuICAgICAgICBpZiAobGFzdEtleSA9PT0gOCB8fCBicm93c2VyLmFuZHJvaWQgJiYgZG9tQ2hhbmdlLnRleHQubGVuZ3RoIDwgdG8gLSBmcm9tKSB7XG4gICAgICAgICAgICBwcmVmZXJyZWRQb3MgPSBzZWwudG87XG4gICAgICAgICAgICBwcmVmZXJyZWRTaWRlID0gXCJlbmRcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlmZiA9IGZpbmREaWZmKHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvLCBMaW5lQnJlYWtQbGFjZWhvbGRlciksIGRvbUNoYW5nZS50ZXh0LCBwcmVmZXJyZWRQb3MgLSBmcm9tLCBwcmVmZXJyZWRTaWRlKTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIC8vIENocm9tZSBpbnNlcnRzIHR3byBuZXdsaW5lcyB3aGVuIHByZXNzaW5nIHNoaWZ0LWVudGVyIGF0IHRoZVxuICAgICAgICAgICAgLy8gZW5kIG9mIGEgbGluZS4gRG9tQ2hhbmdlIGRyb3BzIG9uZSBvZiB0aG9zZS5cbiAgICAgICAgICAgIGlmIChicm93c2VyLmNocm9tZSAmJiBsYXN0S2V5ID09IDEzICYmXG4gICAgICAgICAgICAgICAgZGlmZi50b0IgPT0gZGlmZi5mcm9tICsgMiAmJiBkb21DaGFuZ2UudGV4dC5zbGljZShkaWZmLmZyb20sIGRpZmYudG9CKSA9PSBMaW5lQnJlYWtQbGFjZWhvbGRlciArIExpbmVCcmVha1BsYWNlaG9sZGVyKVxuICAgICAgICAgICAgICAgIGRpZmYudG9CLS07XG4gICAgICAgICAgICBjaGFuZ2UgPSB7IGZyb206IGZyb20gKyBkaWZmLmZyb20sIHRvOiBmcm9tICsgZGlmZi50b0EsXG4gICAgICAgICAgICAgICAgaW5zZXJ0OiBUZXh0Lm9mKGRvbUNoYW5nZS50ZXh0LnNsaWNlKGRpZmYuZnJvbSwgZGlmZi50b0IpLnNwbGl0KExpbmVCcmVha1BsYWNlaG9sZGVyKSkgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChuZXdTZWwgJiYgKCF2aWV3Lmhhc0ZvY3VzICYmIHZpZXcuc3RhdGUuZmFjZXQoZWRpdGFibGUpIHx8IG5ld1NlbC5tYWluLmVxKHNlbCkpKSB7XG4gICAgICAgIG5ld1NlbCA9IG51bGw7XG4gICAgfVxuICAgIGlmICghY2hhbmdlICYmICFuZXdTZWwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWNoYW5nZSAmJiBkb21DaGFuZ2UudHlwZU92ZXIgJiYgIXNlbC5lbXB0eSAmJiBuZXdTZWwgJiYgbmV3U2VsLm1haW4uZW1wdHkpIHtcbiAgICAgICAgLy8gSGV1cmlzdGljIHRvIG5vdGljZSB0eXBpbmcgb3ZlciBhIHNlbGVjdGVkIGNoYXJhY3RlclxuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IHZpZXcuc3RhdGUuZG9jLnNsaWNlKHNlbC5mcm9tLCBzZWwudG8pIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGNoYW5nZSAmJiBjaGFuZ2UuZnJvbSA+PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPD0gc2VsLnRvICYmXG4gICAgICAgIChjaGFuZ2UuZnJvbSAhPSBzZWwuZnJvbSB8fCBjaGFuZ2UudG8gIT0gc2VsLnRvKSAmJlxuICAgICAgICAoc2VsLnRvIC0gc2VsLmZyb20pIC0gKGNoYW5nZS50byAtIGNoYW5nZS5mcm9tKSA8PSA0KSB7XG4gICAgICAgIC8vIElmIHRoZSBjaGFuZ2UgaXMgaW5zaWRlIHRoZSBzZWxlY3Rpb24gYW5kIGNvdmVycyBtb3N0IG9mIGl0LFxuICAgICAgICAvLyBhc3N1bWUgaXQgaXMgYSBzZWxlY3Rpb24gcmVwbGFjZSAod2l0aCBpZGVudGljYWwgY2hhcmFjdGVycyBhdFxuICAgICAgICAvLyB0aGUgc3RhcnQvZW5kIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGlmZilcbiAgICAgICAgY2hhbmdlID0ge1xuICAgICAgICAgICAgZnJvbTogc2VsLmZyb20sIHRvOiBzZWwudG8sXG4gICAgICAgICAgICBpbnNlcnQ6IHZpZXcuc3RhdGUuZG9jLnNsaWNlKHNlbC5mcm9tLCBjaGFuZ2UuZnJvbSkuYXBwZW5kKGNoYW5nZS5pbnNlcnQpLmFwcGVuZCh2aWV3LnN0YXRlLmRvYy5zbGljZShjaGFuZ2UudG8sIHNlbC50bykpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKChicm93c2VyLm1hYyB8fCBicm93c2VyLmFuZHJvaWQpICYmIGNoYW5nZSAmJiBjaGFuZ2UuZnJvbSA9PSBjaGFuZ2UudG8gJiYgY2hhbmdlLmZyb20gPT0gc2VsLmhlYWQgLSAxICYmXG4gICAgICAgIC9eXFwuID8kLy50ZXN0KGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKSkgJiYgdmlldy5jb250ZW50RE9NLmdldEF0dHJpYnV0ZShcImF1dG9jb3JyZWN0XCIpID09IFwib2ZmXCIpIHtcbiAgICAgICAgLy8gRGV0ZWN0IGluc2VydC1wZXJpb2Qtb24tZG91YmxlLXNwYWNlIE1hYyBhbmQgQW5kcm9pZCBiZWhhdmlvcixcbiAgICAgICAgLy8gYW5kIHRyYW5zZm9ybSBpdCBpbnRvIGEgcmVndWxhciBzcGFjZSBpbnNlcnQuXG4gICAgICAgIGlmIChuZXdTZWwgJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMilcbiAgICAgICAgICAgIG5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUobmV3U2VsLm1haW4uYW5jaG9yIC0gMSwgbmV3U2VsLm1haW4uaGVhZCAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IFRleHQub2YoW1wiIFwiXSkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgY2hhbmdlICYmIGNoYW5nZS5mcm9tID09IGNoYW5nZS50byAmJiBjaGFuZ2UuZnJvbSA9PSBzZWwuaGVhZCAmJlxuICAgICAgICBjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkgPT0gXCJcXG4gXCIgJiYgdmlldy5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgLy8gSW4gQ2hyb21lLCBpZiB5b3UgaW5zZXJ0IGEgc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIGEgd3JhcHBlZFxuICAgICAgICAvLyBsaW5lLCBpdCB3aWxsIGFjdHVhbGx5IGluc2VydCBhIG5ld2xpbmUgYW5kIGEgc3BhY2UsIGNhdXNpbmcgYVxuICAgICAgICAvLyBib2d1cyBuZXcgbGluZSB0byBiZSBjcmVhdGVkIGluIENvZGVNaXJyb3IgKCM5NjgpXG4gICAgICAgIGlmIChuZXdTZWwpXG4gICAgICAgICAgICBuZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKG5ld1NlbC5tYWluLmFuY2hvciAtIDEsIG5ld1NlbC5tYWluLmhlYWQgLSAxKTtcbiAgICAgICAgY2hhbmdlID0geyBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50bywgaW5zZXJ0OiBUZXh0Lm9mKFtcIiBcIl0pIH07XG4gICAgfVxuICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgaWYgKGJyb3dzZXIuaW9zICYmIHZpZXcuaW5wdXRTdGF0ZS5mbHVzaElPU0tleSgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIEFuZHJvaWQgYnJvd3NlcnMgZG9uJ3QgZmlyZSByZWFzb25hYmxlIGtleSBldmVudHMgZm9yIGVudGVyLFxuICAgICAgICAvLyBiYWNrc3BhY2UsIG9yIGRlbGV0ZS4gU28gdGhpcyBkZXRlY3RzIGNoYW5nZXMgdGhhdCBsb29rIGxpa2VcbiAgICAgICAgLy8gdGhleSdyZSBjYXVzZWQgYnkgdGhvc2Uga2V5cywgYW5kIHJlaW50ZXJwcmV0cyB0aGVtIGFzIGtleVxuICAgICAgICAvLyBldmVudHMuIChTb21lIG9mIHRoZXNlIGtleXMgYXJlIGFsc28gaGFuZGxlZCBieSBiZWZvcmVpbnB1dFxuICAgICAgICAvLyBldmVudHMgYW5kIHRoZSBwZW5kaW5nQW5kcm9pZEtleSBtZWNoYW5pc20sIGJ1dCB0aGF0J3Mgbm90XG4gICAgICAgIC8vIHJlbGlhYmxlIGluIGFsbCBzaXR1YXRpb25zLilcbiAgICAgICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJlxuICAgICAgICAgICAgKChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPT0gc2VsLnRvICYmXG4gICAgICAgICAgICAgICAgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMSAmJiBjaGFuZ2UuaW5zZXJ0LmxpbmVzID09IDIgJiZcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiRW50ZXJcIiwgMTMpKSB8fFxuICAgICAgICAgICAgICAgICgoY2hhbmdlLmZyb20gPT0gc2VsLmZyb20gLSAxICYmIGNoYW5nZS50byA9PSBzZWwudG8gJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICBsYXN0S2V5ID09IDggJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPCBjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSAmJiBjaGFuZ2UudG8gPiBzZWwuaGVhZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodmlldy5jb250ZW50RE9NLCBcIkJhY2tzcGFjZVwiLCA4KSkgfHxcbiAgICAgICAgICAgICAgICAoY2hhbmdlLmZyb20gPT0gc2VsLmZyb20gJiYgY2hhbmdlLnRvID09IHNlbC50byArIDEgJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiRGVsZXRlXCIsIDQ2KSkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCB0ZXh0ID0gY2hhbmdlLmluc2VydC50b1N0cmluZygpO1xuICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwKVxuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZysrO1xuICAgICAgICBsZXQgZGVmYXVsdFRyO1xuICAgICAgICBsZXQgZGVmYXVsdEluc2VydCA9ICgpID0+IGRlZmF1bHRUciB8fCAoZGVmYXVsdFRyID0gYXBwbHlEZWZhdWx0SW5zZXJ0KHZpZXcsIGNoYW5nZSwgbmV3U2VsKSk7XG4gICAgICAgIGlmICghdmlldy5zdGF0ZS5mYWNldChpbnB1dEhhbmRsZXIpLnNvbWUoaCA9PiBoKHZpZXcsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8sIHRleHQsIGRlZmF1bHRJbnNlcnQpKSlcbiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goZGVmYXVsdEluc2VydCgpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5ld1NlbCAmJiAhbmV3U2VsLm1haW4uZXEoc2VsKSkge1xuICAgICAgICBsZXQgc2Nyb2xsSW50b1ZpZXcgPSBmYWxzZSwgdXNlckV2ZW50ID0gXCJzZWxlY3RcIjtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uVGltZSA+IERhdGUubm93KCkgLSA1MCkge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uT3JpZ2luID09IFwic2VsZWN0XCIpXG4gICAgICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcgPSB0cnVlO1xuICAgICAgICAgICAgdXNlckV2ZW50ID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTZWxlY3Rpb25PcmlnaW47XG4gICAgICAgIH1cbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IHNlbGVjdGlvbjogbmV3U2VsLCBzY3JvbGxJbnRvVmlldywgdXNlckV2ZW50IH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBhcHBseURlZmF1bHRJbnNlcnQodmlldywgY2hhbmdlLCBuZXdTZWwpIHtcbiAgICBsZXQgdHIsIHN0YXJ0U3RhdGUgPSB2aWV3LnN0YXRlLCBzZWwgPSBzdGFydFN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgIGlmIChjaGFuZ2UuZnJvbSA+PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPD0gc2VsLnRvICYmIGNoYW5nZS50byAtIGNoYW5nZS5mcm9tID49IChzZWwudG8gLSBzZWwuZnJvbSkgLyAzICYmXG4gICAgICAgICghbmV3U2VsIHx8IG5ld1NlbC5tYWluLmVtcHR5ICYmIG5ld1NlbC5tYWluLmZyb20gPT0gY2hhbmdlLmZyb20gKyBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCkgJiZcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA8IDApIHtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHNlbC5mcm9tIDwgY2hhbmdlLmZyb20gPyBzdGFydFN0YXRlLnNsaWNlRG9jKHNlbC5mcm9tLCBjaGFuZ2UuZnJvbSkgOiBcIlwiO1xuICAgICAgICBsZXQgYWZ0ZXIgPSBzZWwudG8gPiBjaGFuZ2UudG8gPyBzdGFydFN0YXRlLnNsaWNlRG9jKGNoYW5nZS50bywgc2VsLnRvKSA6IFwiXCI7XG4gICAgICAgIHRyID0gc3RhcnRTdGF0ZS5yZXBsYWNlU2VsZWN0aW9uKHZpZXcuc3RhdGUudG9UZXh0KGJlZm9yZSArIGNoYW5nZS5pbnNlcnQuc2xpY2VTdHJpbmcoMCwgdW5kZWZpbmVkLCB2aWV3LnN0YXRlLmxpbmVCcmVhaykgKyBhZnRlcikpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBzdGFydFN0YXRlLmNoYW5nZXMoY2hhbmdlKTtcbiAgICAgICAgbGV0IG1haW5TZWwgPSBuZXdTZWwgJiYgbmV3U2VsLm1haW4udG8gPD0gY2hhbmdlcy5uZXdMZW5ndGggPyBuZXdTZWwubWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gVHJ5IHRvIGFwcGx5IGEgY29tcG9zaXRpb24gY2hhbmdlIHRvIGFsbCBjdXJzb3JzXG4gICAgICAgIGlmIChzdGFydFN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoID4gMSAmJiB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS50byA8PSBzZWwudG8gJiYgY2hhbmdlLnRvID49IHNlbC50byAtIDEwKSB7XG4gICAgICAgICAgICBsZXQgcmVwbGFjZWQgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pO1xuICAgICAgICAgICAgbGV0IGNvbXBvc2l0aW9uUmFuZ2UsIGNvbXBvc2l0aW9uID0gbmV3U2VsICYmIGZpbmRDb21wb3NpdGlvbk5vZGUodmlldywgbmV3U2VsLm1haW4uaGVhZCk7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgZExlbiA9IGNoYW5nZS5pbnNlcnQubGVuZ3RoIC0gKGNoYW5nZS50byAtIGNoYW5nZS5mcm9tKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvblJhbmdlID0geyBmcm9tOiBjb21wb3NpdGlvbi5mcm9tLCB0bzogY29tcG9zaXRpb24udG8gLSBkTGVuIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvblJhbmdlID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHNlbC5oZWFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBzZWwudG8gLSBjaGFuZ2UudG8sIHNpemUgPSBzZWwudG8gLSBzZWwuZnJvbTtcbiAgICAgICAgICAgIHRyID0gc3RhcnRTdGF0ZS5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiByYW5nZS50byA9PSBzZWwudG8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXMsIHJhbmdlOiBtYWluU2VsIHx8IHJhbmdlLm1hcChjaGFuZ2VzKSB9O1xuICAgICAgICAgICAgICAgIGxldCB0byA9IHJhbmdlLnRvIC0gb2Zmc2V0LCBmcm9tID0gdG8gLSByZXBsYWNlZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLnRvIC0gcmFuZ2UuZnJvbSAhPSBzaXplIHx8IHZpZXcuc3RhdGUuc2xpY2VEb2MoZnJvbSwgdG8pICE9IHJlcGxhY2VkIHx8XG4gICAgICAgICAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZXJlJ3Mgbm8gd2F5IHRvIG1ha2UgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBpbiB0aGUgc2FtZSBub2RlIHdvcmsgd2l0aG91dCBhYm9ydGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGlvbiwgc28gY3Vyc29ycyBpbiB0aGUgY29tcG9zaXRpb24gcmFuZ2UgYXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnRvID49IGNvbXBvc2l0aW9uUmFuZ2UuZnJvbSAmJiByYW5nZS5mcm9tIDw9IGNvbXBvc2l0aW9uUmFuZ2UudG8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlIH07XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlQ2hhbmdlcyA9IHN0YXJ0U3RhdGUuY2hhbmdlcyh7IGZyb20sIHRvLCBpbnNlcnQ6IGNoYW5nZS5pbnNlcnQgfSksIHNlbE9mZiA9IHJhbmdlLnRvIC0gc2VsLnRvO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXM6IHJhbmdlQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6ICFtYWluU2VsID8gcmFuZ2UubWFwKHJhbmdlQ2hhbmdlcykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yU2VsZWN0aW9uLnJhbmdlKE1hdGgubWF4KDAsIG1haW5TZWwuYW5jaG9yICsgc2VsT2ZmKSwgTWF0aC5tYXgoMCwgbWFpblNlbC5oZWFkICsgc2VsT2ZmKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ciA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogbWFpblNlbCAmJiBzdGFydFN0YXRlLnNlbGVjdGlvbi5yZXBsYWNlUmFuZ2UobWFpblNlbClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHVzZXJFdmVudCA9IFwiaW5wdXQudHlwZVwiO1xuICAgIGlmICh2aWV3LmNvbXBvc2luZyB8fFxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlICYmIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkVuZGVkQXQgPiBEYXRlLm5vdygpIC0gNTApIHtcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSA9IGZhbHNlO1xuICAgICAgICB1c2VyRXZlbnQgKz0gXCIuY29tcG9zZVwiO1xuICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHVzZXJFdmVudCArPSBcIi5zdGFydFwiO1xuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRTdGF0ZS51cGRhdGUodHIsIHsgdXNlckV2ZW50LCBzY3JvbGxJbnRvVmlldzogdHJ1ZSB9KTtcbn1cbmZ1bmN0aW9uIGZpbmREaWZmKGEsIGIsIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSkge1xuICAgIGxldCBtaW5MZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICAgIGxldCBmcm9tID0gMDtcbiAgICB3aGlsZSAoZnJvbSA8IG1pbkxlbiAmJiBhLmNoYXJDb2RlQXQoZnJvbSkgPT0gYi5jaGFyQ29kZUF0KGZyb20pKVxuICAgICAgICBmcm9tKys7XG4gICAgaWYgKGZyb20gPT0gbWluTGVuICYmIGEubGVuZ3RoID09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgdG9BID0gYS5sZW5ndGgsIHRvQiA9IGIubGVuZ3RoO1xuICAgIHdoaWxlICh0b0EgPiAwICYmIHRvQiA+IDAgJiYgYS5jaGFyQ29kZUF0KHRvQSAtIDEpID09IGIuY2hhckNvZGVBdCh0b0IgLSAxKSkge1xuICAgICAgICB0b0EtLTtcbiAgICAgICAgdG9CLS07XG4gICAgfVxuICAgIGlmIChwcmVmZXJyZWRTaWRlID09IFwiZW5kXCIpIHtcbiAgICAgICAgbGV0IGFkanVzdCA9IE1hdGgubWF4KDAsIGZyb20gLSBNYXRoLm1pbih0b0EsIHRvQikpO1xuICAgICAgICBwcmVmZXJyZWRQb3MgLT0gdG9BICsgYWRqdXN0IC0gZnJvbTtcbiAgICB9XG4gICAgaWYgKHRvQSA8IGZyb20gJiYgYS5sZW5ndGggPCBiLmxlbmd0aCkge1xuICAgICAgICBsZXQgbW92ZSA9IHByZWZlcnJlZFBvcyA8PSBmcm9tICYmIHByZWZlcnJlZFBvcyA+PSB0b0EgPyBmcm9tIC0gcHJlZmVycmVkUG9zIDogMDtcbiAgICAgICAgZnJvbSAtPSBtb3ZlO1xuICAgICAgICB0b0IgPSBmcm9tICsgKHRvQiAtIHRvQSk7XG4gICAgICAgIHRvQSA9IGZyb207XG4gICAgfVxuICAgIGVsc2UgaWYgKHRvQiA8IGZyb20pIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gZnJvbSAmJiBwcmVmZXJyZWRQb3MgPj0gdG9CID8gZnJvbSAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIGZyb20gLT0gbW92ZTtcbiAgICAgICAgdG9BID0gZnJvbSArICh0b0EgLSB0b0IpO1xuICAgICAgICB0b0IgPSBmcm9tO1xuICAgIH1cbiAgICByZXR1cm4geyBmcm9tLCB0b0EsIHRvQiB9O1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uUG9pbnRzKHZpZXcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgaWYgKHZpZXcucm9vdC5hY3RpdmVFbGVtZW50ICE9IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICBsZXQgeyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgaWYgKGFuY2hvck5vZGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IERPTVBvaW50KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkpO1xuICAgICAgICBpZiAoZm9jdXNOb2RlICE9IGFuY2hvck5vZGUgfHwgZm9jdXNPZmZzZXQgIT0gYW5jaG9yT2Zmc2V0KVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IERPTVBvaW50KGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvbkZyb21Qb2ludHMocG9pbnRzLCBiYXNlKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFuY2hvciA9IHBvaW50c1swXS5wb3MsIGhlYWQgPSBwb2ludHMubGVuZ3RoID09IDIgPyBwb2ludHNbMV0ucG9zIDogYW5jaG9yO1xuICAgIHJldHVybiBhbmNob3IgPiAtMSAmJiBoZWFkID4gLTEgPyBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGFuY2hvciArIGJhc2UsIGhlYWQgKyBiYXNlKSA6IG51bGw7XG59XG5cbmNvbnN0IG9ic2VydmVPcHRpb25zID0ge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgIHN1YnRyZWU6IHRydWUsXG4gICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6IHRydWVcbn07XG4vLyBJRTExIGhhcyB2ZXJ5IGJyb2tlbiBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHdlIGFsc28gbGlzdGVuIHRvXG4vLyBET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQgdGhlcmVcbmNvbnN0IHVzZUNoYXJEYXRhID0gYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPD0gMTE7XG5jbGFzcyBET01PYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAvLyBUaGUga25vd24gc2VsZWN0aW9uLiBLZXB0IGluIG91ciBvd24gb2JqZWN0LCBhcyBvcHBvc2VkIHRvIGp1c3RcbiAgICAgICAgLy8gZGlyZWN0bHkgYWNjZXNzaW5nIHRoZSBzZWxlY3Rpb24gYmVjYXVzZTpcbiAgICAgICAgLy8gIC0gU2FmYXJpIGRvZXNuJ3QgcmVwb3J0IHRoZSByaWdodCBzZWxlY3Rpb24gaW4gc2hhZG93IERPTVxuICAgICAgICAvLyAgLSBSZWFkaW5nIGZyb20gdGhlIHNlbGVjdGlvbiBmb3JjZXMgYSBET00gbGF5b3V0XG4gICAgICAgIC8vICAtIFRoaXMgd2F5LCB3ZSBjYW4gaWdub3JlIHNlbGVjdGlvbmNoYW5nZSBldmVudHMgaWYgd2UgaGF2ZVxuICAgICAgICAvLyAgICBhbHJlYWR5IHNlZW4gdGhlICduZXcnIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvblJhbmdlID0gbmV3IERPTVNlbGVjdGlvblN0YXRlO1xuICAgICAgICAvLyBTZXQgd2hlbiBhIHNlbGVjdGlvbiBjaGFuZ2UgaXMgZGV0ZWN0ZWQsIGNsZWFyZWQgb24gZmx1c2hcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVsYXllZEZsdXNoID0gLTE7XG4gICAgICAgIHRoaXMucmVzaXplVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuZGVsYXllZEFuZHJvaWRLZXkgPSBudWxsO1xuICAgICAgICB0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RDaGFuZ2UgPSAwO1xuICAgICAgICB0aGlzLnNjcm9sbFRhcmdldHMgPSBbXTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW50ZXJzZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5nYXBzID0gW107XG4gICAgICAgIC8vIFRpbWVvdXQgZm9yIHNjaGVkdWxpbmcgY2hlY2sgb2YgdGhlIHBhcmVudHMgdGhhdCBuZWVkIHNjcm9sbCBoYW5kbGVyc1xuICAgICAgICB0aGlzLnBhcmVudENoZWNrID0gLTE7XG4gICAgICAgIHRoaXMuZG9tID0gdmlldy5jb250ZW50RE9NO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IG11dCBvZiBtdXRhdGlvbnMpXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKG11dCk7XG4gICAgICAgICAgICAvLyBJRTExIHdpbGwgc29tZXRpbWVzIChvbiB0eXBpbmcgb3ZlciBhIHNlbGVjdGlvbiBvclxuICAgICAgICAgICAgLy8gYmFja3NwYWNpbmcgb3V0IGEgc2luZ2xlIGNoYXJhY3RlciB0ZXh0IG5vZGUpIGNhbGwgdGhlXG4gICAgICAgICAgICAvLyBvYnNlcnZlciBjYWxsYmFjayBiZWZvcmUgYWN0dWFsbHkgdXBkYXRpbmcgdGhlIERPTS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBVbnJlbGF0ZWRseSwgaU9TIFNhZmFyaSB3aWxsLCB3aGVuIGVuZGluZyBhIGNvbXBvc2l0aW9uLFxuICAgICAgICAgICAgLy8gc29tZXRpbWVzIGZpcnN0IGNsZWFyIGl0LCBkZWxpdmVyIHRoZSBtdXRhdGlvbnMsIGFuZCB0aGVuXG4gICAgICAgICAgICAvLyByZWluc2VydCB0aGUgZmluaXNoZWQgdGV4dC4gQ29kZU1pcnJvcidzIGhhbmRsaW5nIG9mIHRoZVxuICAgICAgICAgICAgLy8gZGVsZXRpb24gd2lsbCBwcmV2ZW50IHRoZSByZWluc2VydGlvbiBmcm9tIGhhcHBlbmluZyxcbiAgICAgICAgICAgIC8vIGJyZWFraW5nIGNvbXBvc2l0aW9uLlxuICAgICAgICAgICAgaWYgKChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMSB8fCBicm93c2VyLmlvcyAmJiB2aWV3LmNvbXBvc2luZykgJiZcbiAgICAgICAgICAgICAgICBtdXRhdGlvbnMuc29tZShtID0+IG0udHlwZSA9PSBcImNoaWxkTGlzdFwiICYmIG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICBtLnR5cGUgPT0gXCJjaGFyYWN0ZXJEYXRhXCIgJiYgbS5vbGRWYWx1ZS5sZW5ndGggPiBtLnRhcmdldC5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMub25DaGFyRGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh7IHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImNoYXJhY3RlckRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWU6IGV2ZW50LnByZXZWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSA9IHRoaXMub25SZXNpemUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblByaW50ID0gdGhpcy5vblByaW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25TY3JvbGwgPSB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbCA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICgoKF9hID0gdGhpcy52aWV3LmRvY1ZpZXcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXN0VXBkYXRlKSA8IERhdGUubm93KCkgLSA3NSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbC5vYnNlcnZlKHZpZXcuc2Nyb2xsRE9NKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFdpbmRvd0xpc3RlbmVycyh0aGlzLndpbiA9IHZpZXcud2luKTtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICBpZiAodHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Q2hlY2sgPCAwKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENoZWNrID0gc2V0VGltZW91dCh0aGlzLmxpc3RlbkZvclNjcm9sbC5iaW5kKHRoaXMpLCAxMDAwKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIChlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaW50ZXJzZWN0aW9uUmF0aW8gPiAwKSAhPSB0aGlzLmludGVyc2VjdGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVyc2VjdGluZyA9ICF0aGlzLmludGVyc2VjdGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJzZWN0aW5nICE9IHRoaXMudmlldy5pblZpZXcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2Nyb2xsQ2hhbmdlZChkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7IHRocmVzaG9sZDogWzAsIC4wMDFdIH0pO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24ub2JzZXJ2ZSh0aGlzLmRvbSk7XG4gICAgICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIikpO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuRm9yU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgfVxuICAgIG9uU2Nyb2xsQ2hhbmdlZChlKSB7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLnJ1bkhhbmRsZXJzKFwic2Nyb2xsXCIsIGUpO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3RpbmcpXG4gICAgICAgICAgICB0aGlzLnZpZXcubWVhc3VyZSgpO1xuICAgIH1cbiAgICBvblNjcm9sbChlKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGluZylcbiAgICAgICAgICAgIHRoaXMuZmx1c2goZmFsc2UpO1xuICAgICAgICB0aGlzLm9uU2Nyb2xsQ2hhbmdlZChlKTtcbiAgICB9XG4gICAgb25SZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gLTE7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgfVxuICAgIG9uUHJpbnQoKSB7XG4gICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUucHJpbnRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcubWVhc3VyZSgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUucHJpbnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cbiAgICB1cGRhdGVHYXBzKGdhcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2FwSW50ZXJzZWN0aW9uICYmIChnYXBzLmxlbmd0aCAhPSB0aGlzLmdhcHMubGVuZ3RoIHx8IHRoaXMuZ2Fwcy5zb21lKChnLCBpKSA9PiBnICE9IGdhcHNbaV0pKSkge1xuICAgICAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZ2FwIG9mIGdhcHMpXG4gICAgICAgICAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24ub2JzZXJ2ZShnYXApO1xuICAgICAgICAgICAgdGhpcy5nYXBzID0gZ2FwcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblNlbGVjdGlvbkNoYW5nZShldmVudCkge1xuICAgICAgICBsZXQgd2FzQ2hhbmdlZCA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZDtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRTZWxlY3Rpb25SYW5nZSgpIHx8IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIHNlbCA9IHRoaXMuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSA/IHZpZXcucm9vdC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZG9tIDogIWhhc1NlbGVjdGlvbih2aWV3LmRvbSwgc2VsKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBzZWwuYW5jaG9yTm9kZSAmJiB2aWV3LmRvY1ZpZXcubmVhcmVzdChzZWwuYW5jaG9yTm9kZSk7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuaWdub3JlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRpb25zIG9uIElFMTEgZmlyZSB0aGVpciBldmVudHMgaW4gdGhlIHdyb25nIG9yZGVyLCBnaXZpbmdcbiAgICAgICAgLy8gdXMgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IGJlZm9yZSB0aGUgRE9NIGNoYW5nZXMgYXJlXG4gICAgICAgIC8vIHJlcG9ydGVkLlxuICAgICAgICAvLyBDaHJvbWUgQW5kcm9pZCBoYXMgYSBzaW1pbGFyIGlzc3VlIHdoZW4gYmFja3NwYWNpbmcgb3V0IGFcbiAgICAgICAgLy8gc2VsZWN0aW9uICgjNjQ1KS5cbiAgICAgICAgaWYgKChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMSB8fCBicm93c2VyLmFuZHJvaWQgJiYgYnJvd3Nlci5jaHJvbWUpICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmVtcHR5ICYmXG4gICAgICAgICAgICAvLyAoU2VsZWN0aW9uLmlzQ29sbGFwc2VkIGlzbid0IHJlbGlhYmxlIG9uIElFKVxuICAgICAgICAgICAgc2VsLmZvY3VzTm9kZSAmJiBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSlcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZmx1c2goZmFsc2UpO1xuICAgIH1cbiAgICByZWFkU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIC8vIFRoZSBTZWxlY3Rpb24gb2JqZWN0IGlzIGJyb2tlbiBpbiBzaGFkb3cgcm9vdHMgaW4gU2FmYXJpLiBTZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy80MTRcbiAgICAgICAgbGV0IHJhbmdlID0gYnJvd3Nlci5zYWZhcmkgJiYgdmlldy5yb290Lm5vZGVUeXBlID09IDExICYmXG4gICAgICAgICAgICBkZWVwQWN0aXZlRWxlbWVudCh0aGlzLmRvbS5vd25lckRvY3VtZW50KSA9PSB0aGlzLmRvbSAmJlxuICAgICAgICAgICAgc2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrKHRoaXMudmlldykgfHwgZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgICAgIGlmICghcmFuZ2UgfHwgdGhpcy5zZWxlY3Rpb25SYW5nZS5lcShyYW5nZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBsb2NhbCA9IGhhc1NlbGVjdGlvbih0aGlzLmRvbSwgcmFuZ2UpO1xuICAgICAgICAvLyBEZXRlY3QgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgYnJvd3NlciBoYXMsIG9uIGZvY3VzLCBtb3ZlZCB0aGVcbiAgICAgICAgLy8gc2VsZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGVudCBlbGVtZW50LiBSZXNldCBpdCB0byB0aGVcbiAgICAgICAgLy8gcG9zaXRpb24gZnJvbSB0aGUgZWRpdG9yIHN0YXRlLlxuICAgICAgICBpZiAobG9jYWwgJiYgIXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCAmJlxuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPiBEYXRlLm5vdygpIC0gMjAwICYmXG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA8IERhdGUubm93KCkgLSAzMDAgJiZcbiAgICAgICAgICAgIGF0RWxlbWVudFN0YXJ0KHRoaXMuZG9tLCByYW5nZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICAgICAgdmlldy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0UmFuZ2UocmFuZ2UpO1xuICAgICAgICBpZiAobG9jYWwpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2V0U2VsZWN0aW9uUmFuZ2UoYW5jaG9yLCBoZWFkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0KGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0LCBoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIGNsZWFyU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0KG51bGwsIDAsIG51bGwsIDApO1xuICAgIH1cbiAgICBsaXN0ZW5Gb3JTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSAtMTtcbiAgICAgICAgbGV0IGkgPSAwLCBjaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgZG9tID0gdGhpcy5kb207IGRvbTspIHtcbiAgICAgICAgICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiBpIDwgdGhpcy5zY3JvbGxUYXJnZXRzLmxlbmd0aCAmJiB0aGlzLnNjcm9sbFRhcmdldHNbaV0gPT0gZG9tKVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLnNjcm9sbFRhcmdldHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQucHVzaChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5hc3NpZ25lZFNsb3QgfHwgZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgICAgICAgICBkb20gPSBkb20uaG9zdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgdGhpcy5zY3JvbGxUYXJnZXRzLmxlbmd0aCAmJiAhY2hhbmdlZClcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLnNjcm9sbFRhcmdldHMuc2xpY2UoMCwgaSk7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkb20gb2YgdGhpcy5zY3JvbGxUYXJnZXRzKVxuICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cyA9IGNoYW5nZWQpXG4gICAgICAgICAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWdub3JlKGYpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZG9tLCBvYnNlcnZlT3B0aW9ucyk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgIH1cbiAgICAvLyBUaHJvdyBhd2F5IGFueSBwZW5kaW5nIGNoYW5nZXNcbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVjb3JkcygpO1xuICAgICAgICB0aGlzLnF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBDaHJvbWUgQW5kcm9pZCwgZXNwZWNpYWxseSBpbiBjb21iaW5hdGlvbiB3aXRoIEdCb2FyZCwgbm90IG9ubHlcbiAgICAvLyBkb2Vzbid0IHJlbGlhYmx5IGZpcmUgcmVndWxhciBrZXkgZXZlbnRzLCBidXQgYWxzbyBvZnRlblxuICAgIC8vIHN1cnJvdW5kcyB0aGUgZWZmZWN0IG9mIGVudGVyIG9yIGJhY2tzcGFjZSB3aXRoIGEgYnVuY2ggb2ZcbiAgICAvLyBjb21wb3NpdGlvbiBldmVudHMgdGhhdCwgd2hlbiBpbnRlcnJ1cHRlZCwgY2F1c2UgdGV4dCBkdXBsaWNhdGlvblxuICAgIC8vIG9yIG90aGVyIGtpbmRzIG9mIGNvcnJ1cHRpb24uIFRoaXMgaGFjayBtYWtlcyB0aGUgZWRpdG9yIGJhY2sgb2ZmXG4gICAgLy8gZnJvbSBoYW5kbGluZyBET00gY2hhbmdlcyBmb3IgYSBtb21lbnQgd2hlbiBzdWNoIGEga2V5IGlzXG4gICAgLy8gZGV0ZWN0ZWQgKHZpYSBiZWZvcmVpbnB1dCBvciBrZXlkb3duKSwgYW5kIHRoZW4gdHJpZXMgdG8gZmx1c2hcbiAgICAvLyB0aGVtIG9yLCBpZiB0aGF0IGhhcyBubyBlZmZlY3QsIGRpc3BhdGNoZXMgdGhlIGdpdmVuIGtleS5cbiAgICBkZWxheUFuZHJvaWRLZXkoa2V5LCBrZXlDb2RlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KSB7XG4gICAgICAgICAgICBsZXQgZmx1c2ggPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuZGVsYXllZEFuZHJvaWRLZXk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEtleUNvZGUgPSBrZXkua2V5Q29kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEtleVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmx1c2hlZCA9IHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbHVzaGVkICYmIGtleS5mb3JjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KHRoaXMuZG9tLCBrZXkua2V5LCBrZXkua2V5Q29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gdGhpcy52aWV3Lndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmx1c2gpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIGJhY2tzcGFjZSBiZWZvcmVpbnB1dCBpcyBzb21ldGltZXMgc2lnbmFsbGVkIHNwdXJpb3VzbHksXG4gICAgICAgIC8vIEVudGVyIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlLlxuICAgICAgICBpZiAoIXRoaXMuZGVsYXllZEFuZHJvaWRLZXkgfHwga2V5ID09IFwiRW50ZXJcIilcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEFuZHJvaWRLZXkgPSB7XG4gICAgICAgICAgICAgICAga2V5LCBrZXlDb2RlLFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgcnVuIHRoZSBrZXkgaGFuZGxlciB3aGVuIG5vIGNoYW5nZXMgYXJlIGRldGVjdGVkIGlmXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpc24ndCBjb21pbmcgcmlnaHQgYWZ0ZXIgYW5vdGhlciBjaGFuZ2UsIGluIHdoaWNoIGNhc2VcbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBwcm9iYWJseSBwYXJ0IG9mIGEgd2VpcmQgY2hhaW4gb2YgdXBkYXRlcywgYW5kIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIGJlIGlnbm9yZWQgaWYgaXQgcmV0dXJucyB0aGUgRE9NIHRvIGl0cyBwcmV2aW91cyBzdGF0ZS5cbiAgICAgICAgICAgICAgICBmb3JjZTogdGhpcy5sYXN0Q2hhbmdlIDwgRGF0ZS5ub3coKSAtIDUwIHx8ICEhKChfYSA9IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JjZSlcbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIGNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKSB7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5KTtcbiAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gLTE7XG4gICAgfVxuICAgIGZsdXNoU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZEZsdXNoIDwgMClcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEZsdXNoID0gdGhpcy52aWV3Lndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xOyB0aGlzLmZsdXNoKCk7IH0pO1xuICAgIH1cbiAgICBmb3JjZUZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmRlbGF5ZWRGbHVzaCk7XG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gICAgcGVuZGluZ1JlY29yZHMoKSB7XG4gICAgICAgIGZvciAobGV0IG11dCBvZiB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCkpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWU7XG4gICAgfVxuICAgIHByb2Nlc3NSZWNvcmRzKCkge1xuICAgICAgICBsZXQgcmVjb3JkcyA9IHRoaXMucGVuZGluZ1JlY29yZHMoKTtcbiAgICAgICAgaWYgKHJlY29yZHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICBsZXQgZnJvbSA9IC0xLCB0byA9IC0xLCB0eXBlT3ZlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5yZWFkTXV0YXRpb24ocmVjb3JkKTtcbiAgICAgICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmFuZ2UudHlwZU92ZXIpXG4gICAgICAgICAgICAgICAgdHlwZU92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGZyb20gPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAoeyBmcm9tLCB0byB9ID0gcmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IE1hdGgubWluKHJhbmdlLmZyb20sIGZyb20pO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5tYXgocmFuZ2UudG8sIHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmcm9tLCB0bywgdHlwZU92ZXIgfTtcbiAgICB9XG4gICAgcmVhZENoYW5nZSgpIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8sIHR5cGVPdmVyIH0gPSB0aGlzLnByb2Nlc3NSZWNvcmRzKCk7XG4gICAgICAgIGxldCBuZXdTZWwgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgJiYgaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCB0aGlzLnNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgaWYgKGZyb20gPCAwICYmICFuZXdTZWwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGZyb20gPiAtMSlcbiAgICAgICAgICAgIHRoaXMubGFzdENoYW5nZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNoYW5nZSA9IG5ldyBET01DaGFuZ2UodGhpcy52aWV3LCBmcm9tLCB0bywgdHlwZU92ZXIpO1xuICAgICAgICB0aGlzLnZpZXcuZG9jVmlldy5kb21DaGFuZ2VkID0geyBuZXdTZWw6IGNoYW5nZS5uZXdTZWwgPyBjaGFuZ2UubmV3U2VsLm1haW4gOiBudWxsIH07XG4gICAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxuICAgIC8vIEFwcGx5IHBlbmRpbmcgY2hhbmdlcywgaWYgYW55XG4gICAgZmx1c2gocmVhZFNlbGVjdGlvbiA9IHRydWUpIHtcbiAgICAgICAgLy8gQ29tcGxldGVseSBob2xkIG9mZiBmbHVzaGluZyB3aGVuIHBlbmRpbmcga2V5cyBhcmUgc2V0XHUyMDE0dGhlIGNvZGVcbiAgICAgICAgLy8gbWFuYWdpbmcgdGhvc2Ugd2lsbCBtYWtlIHN1cmUgcHJvY2Vzc1JlY29yZHMgaXMgY2FsbGVkIGFuZCB0aGVcbiAgICAgICAgLy8gdmlldyBpcyByZXN5bmNocm9uaXplZCBhZnRlclxuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPj0gMCB8fCB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocmVhZFNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBkb21DaGFuZ2UgPSB0aGlzLnJlYWRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKCFkb21DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydFN0YXRlID0gdGhpcy52aWV3LnN0YXRlO1xuICAgICAgICBsZXQgaGFuZGxlZCA9IGFwcGx5RE9NQ2hhbmdlKHRoaXMudmlldywgZG9tQ2hhbmdlKTtcbiAgICAgICAgLy8gVGhlIHZpZXcgd2Fzbid0IHVwZGF0ZWRcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZSA9PSBzdGFydFN0YXRlKVxuICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgIH1cbiAgICByZWFkTXV0YXRpb24ocmVjKSB7XG4gICAgICAgIGxldCBjVmlldyA9IHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3QocmVjLnRhcmdldCk7XG4gICAgICAgIGlmICghY1ZpZXcgfHwgY1ZpZXcuaWdub3JlTXV0YXRpb24ocmVjKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjVmlldy5tYXJrRGlydHkocmVjLnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpO1xuICAgICAgICBpZiAocmVjLnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpXG4gICAgICAgICAgICBjVmlldy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi87XG4gICAgICAgIGlmIChyZWMudHlwZSA9PSBcImNoaWxkTGlzdFwiKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRCZWZvcmUgPSBmaW5kQ2hpbGQoY1ZpZXcsIHJlYy5wcmV2aW91c1NpYmxpbmcgfHwgcmVjLnRhcmdldC5wcmV2aW91c1NpYmxpbmcsIC0xKTtcbiAgICAgICAgICAgIGxldCBjaGlsZEFmdGVyID0gZmluZENoaWxkKGNWaWV3LCByZWMubmV4dFNpYmxpbmcgfHwgcmVjLnRhcmdldC5uZXh0U2libGluZywgMSk7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tOiBjaGlsZEJlZm9yZSA/IGNWaWV3LnBvc0FmdGVyKGNoaWxkQmVmb3JlKSA6IGNWaWV3LnBvc0F0U3RhcnQsXG4gICAgICAgICAgICAgICAgdG86IGNoaWxkQWZ0ZXIgPyBjVmlldy5wb3NCZWZvcmUoY2hpbGRBZnRlcikgOiBjVmlldy5wb3NBdEVuZCwgdHlwZU92ZXI6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVjLnR5cGUgPT0gXCJjaGFyYWN0ZXJEYXRhXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGNWaWV3LnBvc0F0U3RhcnQsIHRvOiBjVmlldy5wb3NBdEVuZCwgdHlwZU92ZXI6IHJlYy50YXJnZXQubm9kZVZhbHVlID09IHJlYy5vbGRWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0V2luZG93KHdpbikge1xuICAgICAgICBpZiAod2luICE9IHRoaXMud2luKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVdpbmRvd0xpc3RlbmVycyh0aGlzLndpbik7XG4gICAgICAgICAgICB0aGlzLndpbiA9IHdpbjtcbiAgICAgICAgICAgIHRoaXMuYWRkV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRXaW5kb3dMaXN0ZW5lcnMod2luKSB7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMub25SZXNpemUpO1xuICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXByaW50XCIsIHRoaXMub25QcmludCk7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB3aW4uZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgcmVtb3ZlV2luZG93TGlzdGVuZXJzKHdpbikge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JlcHJpbnRcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgd2luLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgKF9hID0gdGhpcy5pbnRlcnNlY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNjb25uZWN0KCk7XG4gICAgICAgIChfYiA9IHRoaXMuZ2FwSW50ZXJzZWN0aW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGlzY29ubmVjdCgpO1xuICAgICAgICAoX2MgPSB0aGlzLnJlc2l6ZVNjcm9sbCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cylcbiAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB0aGlzLnJlbW92ZVdpbmRvd0xpc3RlbmVycyh0aGlzLndpbik7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBhcmVudENoZWNrKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZGVsYXllZEZsdXNoKTtcbiAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRDaGlsZChjVmlldywgZG9tLCBkaXIpIHtcbiAgICB3aGlsZSAoZG9tKSB7XG4gICAgICAgIGxldCBjdXJWaWV3ID0gQ29udGVudFZpZXcuZ2V0KGRvbSk7XG4gICAgICAgIGlmIChjdXJWaWV3ICYmIGN1clZpZXcucGFyZW50ID09IGNWaWV3KVxuICAgICAgICAgICAgcmV0dXJuIGN1clZpZXc7XG4gICAgICAgIGxldCBwYXJlbnQgPSBkb20ucGFyZW50Tm9kZTtcbiAgICAgICAgZG9tID0gcGFyZW50ICE9IGNWaWV3LmRvbSA/IHBhcmVudCA6IGRpciA+IDAgPyBkb20ubmV4dFNpYmxpbmcgOiBkb20ucHJldmlvdXNTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIFVzZWQgdG8gd29yayBhcm91bmQgYSBTYWZhcmkgU2VsZWN0aW9uL3NoYWRvdyBET00gYnVnICgjNDE0KVxuZnVuY3Rpb24gc2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrKHZpZXcpIHtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIC8vIEJlY2F1c2UgU2FmYXJpIChhdCBsZWFzdCBpbiAyMDE4LTIwMjEpIGRvZXNuJ3QgcHJvdmlkZSByZWd1bGFyXG4gICAgLy8gYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gaW5zaWRlIGEgc2hhZG93cm9vdCwgd2UgaGF2ZSB0byBwZXJmb3JtIGFcbiAgICAvLyByaWRpY3Vsb3VzIGhhY2sgdG8gZ2V0IGF0IGl0XHUyMDE0dXNpbmcgYGV4ZWNDb21tYW5kYCB0byB0cmlnZ2VyIGFcbiAgICAvLyBgYmVmb3JlSW5wdXRgIGV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHRhcmdldCByYW5nZSBmcm9tIHRoZVxuICAgIC8vIGV2ZW50LlxuICAgIGZ1bmN0aW9uIHJlYWQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGZvdW5kID0gZXZlbnQuZ2V0VGFyZ2V0UmFuZ2VzKClbMF07XG4gICAgfVxuICAgIHZpZXcuY29udGVudERPTS5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgdmlldy5kb20ub3duZXJEb2N1bWVudC5leGVjQ29tbWFuZChcImluZGVudFwiKTtcbiAgICB2aWV3LmNvbnRlbnRET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIGlmICghZm91bmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBhbmNob3JOb2RlID0gZm91bmQuc3RhcnRDb250YWluZXIsIGFuY2hvck9mZnNldCA9IGZvdW5kLnN0YXJ0T2Zmc2V0O1xuICAgIGxldCBmb2N1c05vZGUgPSBmb3VuZC5lbmRDb250YWluZXIsIGZvY3VzT2Zmc2V0ID0gZm91bmQuZW5kT2Zmc2V0O1xuICAgIGxldCBjdXJBbmNob3IgPSB2aWV3LmRvY1ZpZXcuZG9tQXRQb3Modmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hbmNob3IpO1xuICAgIC8vIFNpbmNlIHN1Y2ggYSByYW5nZSBkb2Vzbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYW5jaG9yIGFuZCBoZWFkLFxuICAgIC8vIHVzZSBhIGhldXJpc3RpYyB0aGF0IGZsaXBzIGl0IGFyb3VuZCBpZiBpdHMgZW5kIG1hdGNoZXMgdGhlXG4gICAgLy8gY3VycmVudCBhbmNob3IuXG4gICAgaWYgKGlzRXF1aXZhbGVudFBvc2l0aW9uKGN1ckFuY2hvci5ub2RlLCBjdXJBbmNob3Iub2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSlcbiAgICAgICAgW2FuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldF0gPSBbZm9jdXNOb2RlLCBmb2N1c09mZnNldCwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0XTtcbiAgICByZXR1cm4geyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfTtcbn1cblxuLy8gVGhlIGVkaXRvcidzIHVwZGF0ZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4vL1xuLy8gICAgIElkbGUgXHUyMTkyIFVwZGF0aW5nIFx1MjFDNiBJZGxlICh1bmNoZWNrZWQpIFx1MjE5MiBNZWFzdXJpbmcgXHUyMTkyIElkbGVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTEgICAgICBcdTIxOTNcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGluZyAobWVhc3VyZSlcbi8vXG4vLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICdJZGxlJyBhbmQgJ0lkbGUgKHVuY2hlY2tlZCknIGxpZXMgaW5cbi8vIHdoZXRoZXIgYSBsYXlvdXQgY2hlY2sgaGFzIGJlZW4gc2NoZWR1bGVkLiBBIHJlZ3VsYXIgdXBkYXRlIHRocm91Z2hcbi8vIHRoZSBgdXBkYXRlYCBtZXRob2QgdXBkYXRlcyB0aGUgRE9NIGluIGEgd3JpdGUtb25seSBmYXNoaW9uLCBhbmRcbi8vIHJlbGllcyBvbiBhIGNoZWNrIChzY2hlZHVsZWQgd2l0aCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCkgdG8gbWFrZVxuLy8gc3VyZSBldmVyeXRoaW5nIGlzIHdoZXJlIGl0IHNob3VsZCBiZSBhbmQgdGhlIHZpZXdwb3J0IGNvdmVycyB0aGVcbi8vIHZpc2libGUgY29kZS4gVGhhdCBjaGVjayBjb250aW51ZXMgdG8gbWVhc3VyZSBhbmQgdGhlbiBvcHRpb25hbGx5XG4vLyB1cGRhdGUgdW50aWwgaXQgcmVhY2hlcyBhIGNvaGVyZW50IHN0YXRlLlxuLyoqXG5BbiBlZGl0b3IgdmlldyByZXByZXNlbnRzIHRoZSBlZGl0b3IncyB1c2VyIGludGVyZmFjZS4gSXQgaG9sZHNcbnRoZSBlZGl0YWJsZSBET00gc3VyZmFjZSwgYW5kIHBvc3NpYmx5IG90aGVyIGVsZW1lbnRzIHN1Y2ggYXMgdGhlXG5saW5lIG51bWJlciBndXR0ZXIuIEl0IGhhbmRsZXMgZXZlbnRzIGFuZCBkaXNwYXRjaGVzIHN0YXRlXG50cmFuc2FjdGlvbnMgZm9yIGVkaXRpbmcgYWN0aW9ucy5cbiovXG5jbGFzcyBFZGl0b3JWaWV3IHtcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5zdGF0ZTsgfVxuICAgIC8qKlxuICAgIFRvIGJlIGFibGUgdG8gZGlzcGxheSBsYXJnZSBkb2N1bWVudHMgd2l0aG91dCBjb25zdW1pbmcgdG9vIG11Y2hcbiAgICBtZW1vcnkgb3Igb3ZlcmxvYWRpbmcgdGhlIGJyb3dzZXIsIENvZGVNaXJyb3Igb25seSBkcmF3cyB0aGVcbiAgICBjb2RlIHRoYXQgaXMgdmlzaWJsZSAocGx1cyBhIG1hcmdpbiBhcm91bmQgaXQpIHRvIHRoZSBET00uIFRoaXNcbiAgICBwcm9wZXJ0eSB0ZWxscyB5b3UgdGhlIGV4dGVudCBvZiB0aGUgY3VycmVudCBkcmF3biB2aWV3cG9ydCwgaW5cbiAgICBkb2N1bWVudCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnQoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aWV3cG9ydDsgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhlcmUgYXJlLCBmb3IgZXhhbXBsZSwgbGFyZ2UgY29sbGFwc2VkIHJhbmdlcyBpbiB0aGVcbiAgICB2aWV3cG9ydCwgaXRzIHNpemUgY2FuIGJlIGEgbG90IGJpZ2dlciB0aGFuIHRoZSBhY3R1YWwgdmlzaWJsZVxuICAgIGNvbnRlbnQuIFRodXMsIGlmIHlvdSBhcmUgZG9pbmcgc29tZXRoaW5nIGxpa2Ugc3R5bGluZyB0aGVcbiAgICBjb250ZW50IGluIHRoZSB2aWV3cG9ydCwgaXQgaXMgcHJlZmVyYWJsZSB0byBvbmx5IGRvIHNvIGZvclxuICAgIHRoZXNlIHJhbmdlcywgd2hpY2ggYXJlIHRoZSBzdWJzZXQgb2YgdGhlIHZpZXdwb3J0IHRoYXQgaXNcbiAgICBhY3R1YWxseSBkcmF3bi5cbiAgICAqL1xuICAgIGdldCB2aXNpYmxlUmFuZ2VzKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUudmlzaWJsZVJhbmdlczsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgZWRpdG9yIGlzIGVudGlyZWx5IHNjcm9sbGVkIG91dCBvZiB2aWV3XG4gICAgb3Igb3RoZXJ3aXNlIGhpZGRlbi5cbiAgICAqL1xuICAgIGdldCBpblZpZXcoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5pblZpZXc7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgY29tcG9zaW5nIHRleHQgdmlhXG4gICAgW0lNRV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW5wdXRfbWV0aG9kKSwgYW5kIGF0IGxlYXN0XG4gICAgb25lIGNoYW5nZSBoYXMgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGNvbXBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGNvbXBvc2luZygpIHsgcmV0dXJuIHRoaXMuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPiAwOyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IGluIGNvbXBvc2luZyBzdGF0ZS4gTm90ZVxuICAgIHRoYXQgb24gc29tZSBwbGF0Zm9ybXMsIGxpa2UgQW5kcm9pZCwgdGhpcyB3aWxsIGJlIHRoZSBjYXNlIGFcbiAgICBsb3QsIHNpbmNlIGp1c3QgcHV0dGluZyB0aGUgY3Vyc29yIG9uIGEgd29yZCBzdGFydHMgYVxuICAgIGNvbXBvc2l0aW9uIHRoZXJlLlxuICAgICovXG4gICAgZ2V0IGNvbXBvc2l0aW9uU3RhcnRlZCgpIHsgcmV0dXJuIHRoaXMuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMDsgfVxuICAgIC8qKlxuICAgIFRoZSBkb2N1bWVudCBvciBzaGFkb3cgcm9vdCB0aGF0IHRoZSB2aWV3IGxpdmVzIGluLlxuICAgICovXG4gICAgZ2V0IHJvb3QoKSB7IHJldHVybiB0aGlzLl9yb290OyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgd2luKCkgeyByZXR1cm4gdGhpcy5kb20ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IH1cbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBuZXcgdmlldy4gWW91J2xsIHdhbnQgdG8gZWl0aGVyIHByb3ZpZGUgYSBgcGFyZW50YFxuICAgIG9wdGlvbiwgb3IgcHV0IGB2aWV3LmRvbWAgaW50byB5b3VyIGRvY3VtZW50IGFmdGVyIGNyZWF0aW5nIGFcbiAgICB2aWV3LCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzZWUgdGhlIGVkaXRvci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuICAgICAgICB0aGlzLnBsdWdpbk1hcCA9IG5ldyBNYXA7XG4gICAgICAgIHRoaXMuZWRpdG9yQXR0cnMgPSB7fTtcbiAgICAgICAgdGhpcy5jb250ZW50QXR0cnMgPSB7fTtcbiAgICAgICAgdGhpcy5iaWRpQ2FjaGUgPSBbXTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0cyA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRlbnRET00gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnNjcm9sbERPTSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NLnRhYkluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NLmNsYXNzTmFtZSA9IFwiY20tc2Nyb2xsZXJcIjtcbiAgICAgICAgdGhpcy5zY3JvbGxET00uYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZURPTSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VET00uY2xhc3NOYW1lID0gXCJjbS1hbm5vdW5jZWRcIjtcbiAgICAgICAgdGhpcy5hbm5vdW5jZURPTS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxpdmVcIiwgXCJwb2xpdGVcIik7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5hbm5vdW5jZURPTSk7XG4gICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKHRoaXMuc2Nyb2xsRE9NKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXJlbnQpXG4gICAgICAgICAgICBjb25maWcucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgbGV0IHsgZGlzcGF0Y2ggfSA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5kaXNwYXRjaFRyYW5zYWN0aW9ucyA9IGNvbmZpZy5kaXNwYXRjaFRyYW5zYWN0aW9ucyB8fFxuICAgICAgICAgICAgKGRpc3BhdGNoICYmICgodHJzKSA9PiB0cnMuZm9yRWFjaCh0ciA9PiBkaXNwYXRjaCh0ciwgdGhpcykpKSkgfHxcbiAgICAgICAgICAgICgodHJzKSA9PiB0aGlzLnVwZGF0ZSh0cnMpKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fcm9vdCA9IChjb25maWcucm9vdCB8fCBnZXRSb290KGNvbmZpZy5wYXJlbnQpIHx8IGRvY3VtZW50KTtcbiAgICAgICAgdGhpcy52aWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKGNvbmZpZy5zdGF0ZSB8fCBFZGl0b3JTdGF0ZS5jcmVhdGUoY29uZmlnKSk7XG4gICAgICAgIGlmIChjb25maWcuc2Nyb2xsVG8gJiYgY29uZmlnLnNjcm9sbFRvLmlzKHNjcm9sbEludG9WaWV3KSlcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCA9IGNvbmZpZy5zY3JvbGxUby52YWx1ZS5jbGlwKHRoaXMudmlld1N0YXRlLnN0YXRlKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gdGhpcy5zdGF0ZS5mYWNldCh2aWV3UGx1Z2luKS5tYXAoc3BlYyA9PiBuZXcgUGx1Z2luSW5zdGFuY2Uoc3BlYykpO1xuICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgcGx1Z2luLnVwZGF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBET01PYnNlcnZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlID0gbmV3IElucHV0U3RhdGUodGhpcyk7XG4gICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5lbnN1cmVIYW5kbGVycyh0aGlzLnBsdWdpbnMpO1xuICAgICAgICB0aGlzLmRvY1ZpZXcgPSBuZXcgRG9jVmlldyh0aGlzKTtcbiAgICAgICAgdGhpcy5tb3VudFN0eWxlcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICB9XG4gICAgZGlzcGF0Y2goLi4uaW5wdXQpIHtcbiAgICAgICAgbGV0IHRycyA9IGlucHV0Lmxlbmd0aCA9PSAxICYmIGlucHV0WzBdIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24gPyBpbnB1dFxuICAgICAgICAgICAgOiBpbnB1dC5sZW5ndGggPT0gMSAmJiBBcnJheS5pc0FycmF5KGlucHV0WzBdKSA/IGlucHV0WzBdXG4gICAgICAgICAgICAgICAgOiBbdGhpcy5zdGF0ZS51cGRhdGUoLi4uaW5wdXQpXTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFRyYW5zYWN0aW9ucyh0cnMsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMuIFRoaXMgd2lsbFxuICAgIHVwZGF0ZSB0aGUgdmlzaWJsZSBkb2N1bWVudCBhbmQgc2VsZWN0aW9uIHRvIG1hdGNoIHRoZSBzdGF0ZVxuICAgIHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbnMsIGFuZCBub3RpZnkgdmlldyBwbHVnaW5zIG9mIHRoZVxuICAgIGNoYW5nZS4gWW91IHNob3VsZCB1c3VhbGx5IGNhbGxcbiAgICBbYGRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpIGluc3RlYWQsIHdoaWNoIHVzZXMgdGhpc1xuICAgIGFzIGEgcHJpbWl0aXZlLlxuICAgICovXG4gICAgdXBkYXRlKHRyYW5zYWN0aW9ucykge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxscyB0byBFZGl0b3JWaWV3LnVwZGF0ZSBhcmUgbm90IGFsbG93ZWQgd2hpbGUgYW4gdXBkYXRlIGlzIGluIHByb2dyZXNzXCIpO1xuICAgICAgICBsZXQgcmVkcmF3biA9IGZhbHNlLCBhdHRyc0NoYW5nZWQgPSBmYWxzZSwgdXBkYXRlO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0ci5zdGFydFN0YXRlICE9IHN0YXRlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIHVwZGF0ZSBzdGF0ZSB3aXRoIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2Vzbid0IHN0YXJ0IGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIHN0YXRlID0gdHIuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmb2N1cyA9IHRoaXMuaGFzRm9jdXMsIGZvY3VzRmxhZyA9IDAsIGRpc3BhdGNoRm9jdXMgPSBudWxsO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb25zLnNvbWUodHIgPT4gdHIuYW5ub3RhdGlvbihpc0ZvY3VzQ2hhbmdlKSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQgPSBmb2N1cztcbiAgICAgICAgICAgIC8vIElmIGEgZm9jdXMtY2hhbmdlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIGRpc3BhdGNoZWQsIHNldCB0aGlzIHVwZGF0ZSBmbGFnLlxuICAgICAgICAgICAgZm9jdXNGbGFnID0gMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZvY3VzICE9IHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQgPSBmb2N1cztcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgc2VwYXJhdGUgZm9jdXMgdHJhbnNhY3Rpb24gaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIGFkZCBhIGZsYWcgdG8gdGhpcyB1cGRhdGVcbiAgICAgICAgICAgIGRpc3BhdGNoRm9jdXMgPSBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHN0YXRlLCBmb2N1cyk7XG4gICAgICAgICAgICBpZiAoIWRpc3BhdGNoRm9jdXMpXG4gICAgICAgICAgICAgICAgZm9jdXNGbGFnID0gMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHBlbmRpbmcgRE9NIGNoYW5nZSwgZWFnZXJseSByZWFkIGl0IGFuZCB0cnkgdG9cbiAgICAgICAgLy8gYXBwbHkgaXQgYWZ0ZXIgdGhlIGdpdmVuIHRyYW5zYWN0aW9ucy5cbiAgICAgICAgbGV0IHBlbmRpbmdLZXkgPSB0aGlzLm9ic2VydmVyLmRlbGF5ZWRBbmRyb2lkS2V5LCBkb21DaGFuZ2UgPSBudWxsO1xuICAgICAgICBpZiAocGVuZGluZ0tleSkge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5jbGVhckRlbGF5ZWRBbmRyb2lkS2V5KCk7XG4gICAgICAgICAgICBkb21DaGFuZ2UgPSB0aGlzLm9ic2VydmVyLnJlYWRDaGFuZ2UoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGFwcGx5IERPTSBjaGFuZ2VzIGlmIHRoZSB0cmFuc2FjdGlvbnMgZGlkbid0XG4gICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRvYyBvciBzZWxlY3Rpb24uXG4gICAgICAgICAgICBpZiAoZG9tQ2hhbmdlICYmICF0aGlzLnN0YXRlLmRvYy5lcShzdGF0ZS5kb2MpIHx8ICF0aGlzLnN0YXRlLnNlbGVjdGlvbi5lcShzdGF0ZS5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgICAgIGRvbUNoYW5nZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGUgcGhyYXNlcyBjaGFuZ2UsIHJlZHJhdyB0aGUgZWRpdG9yXG4gICAgICAgIGlmIChzdGF0ZS5mYWNldChFZGl0b3JTdGF0ZS5waHJhc2VzKSAhPSB0aGlzLnN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoc3RhdGUpO1xuICAgICAgICB1cGRhdGUgPSBWaWV3VXBkYXRlLmNyZWF0ZSh0aGlzLCBzdGF0ZSwgdHJhbnNhY3Rpb25zKTtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IGZvY3VzRmxhZztcbiAgICAgICAgbGV0IHNjcm9sbFRhcmdldCA9IHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAgICAgZm9yIChsZXQgdHIgb2YgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGFyZ2V0ID0gc2Nyb2xsVGFyZ2V0Lm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICBpZiAodHIuc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgbWFpbiB9ID0gdHIuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBuZXcgU2Nyb2xsVGFyZ2V0KG1haW4uZW1wdHkgPyBtYWluIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihtYWluLmhlYWQsIG1haW4uaGVhZCA+IG1haW4uYW5jaG9yID8gLTEgOiAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGUgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXMoc2Nyb2xsSW50b1ZpZXcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGFyZ2V0ID0gZS52YWx1ZS5jbGlwKHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUudXBkYXRlKHVwZGF0ZSwgc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuYmlkaUNhY2hlID0gQ2FjaGVkT3JkZXIudXBkYXRlKHRoaXMuYmlkaUNhY2hlLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICBpZiAoIXVwZGF0ZS5lbXB0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGx1Z2lucyh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZHJhd24gPSB0aGlzLmRvY1ZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5mYWNldChzdHlsZU1vZHVsZSkgIT0gdGhpcy5zdHlsZU1vZHVsZXMpXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VudFN0eWxlcygpO1xuICAgICAgICAgICAgYXR0cnNDaGFuZ2VkID0gdGhpcy51cGRhdGVBdHRycygpO1xuICAgICAgICAgICAgdGhpcy5zaG93QW5ub3VuY2VtZW50cyh0cmFuc2FjdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbihyZWRyYXduLCB0cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5pc1VzZXJFdmVudChcInNlbGVjdC5wb2ludGVyXCIpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldCh0aGVtZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KHRoZW1lKSlcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIGlmIChyZWRyYXduIHx8IGF0dHJzQ2hhbmdlZCB8fCBzY3JvbGxUYXJnZXQgfHwgdGhpcy52aWV3U3RhdGUubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyB8fCB0aGlzLnZpZXdTdGF0ZS5tdXN0TWVhc3VyZUNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgIGlmICghdXBkYXRlLmVtcHR5KVxuICAgICAgICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgdGhpcy5zdGF0ZS5mYWNldCh1cGRhdGVMaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcih1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy5zdGF0ZSwgZSwgXCJ1cGRhdGUgbGlzdGVuZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcGF0Y2hGb2N1cyB8fCBkb21DaGFuZ2UpXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hGb2N1cyAmJiB0aGlzLnN0YXRlID09IGRpc3BhdGNoRm9jdXMuc3RhcnRTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChkaXNwYXRjaEZvY3VzKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9tQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXBwbHlET01DaGFuZ2UodGhpcywgZG9tQ2hhbmdlKSAmJiBwZW5kaW5nS2V5LmZvcmNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodGhpcy5jb250ZW50RE9NLCBwZW5kaW5nS2V5LmtleSwgcGVuZGluZ0tleS5rZXlDb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVzZXQgdGhlIHZpZXcgdG8gdGhlIGdpdmVuIHN0YXRlLiAoVGhpcyB3aWxsIGNhdXNlIHRoZSBlbnRpcmVcbiAgICBkb2N1bWVudCB0byBiZSByZWRyYXduIGFuZCBhbGwgdmlldyBwbHVnaW5zIHRvIGJlIHJlaW5pdGlhbGl6ZWQsXG4gICAgc28geW91IHNob3VsZCBwcm9iYWJseSBvbmx5IHVzZSBpdCB3aGVuIHRoZSBuZXcgc3RhdGUgaXNuJ3RcbiAgICBkZXJpdmVkIGZyb20gdGhlIG9sZCBzdGF0ZS4gT3RoZXJ3aXNlLCB1c2VcbiAgICBbYGRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpIGluc3RlYWQuKVxuICAgICovXG4gICAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgIT0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbHMgdG8gRWRpdG9yVmlldy5zZXRTdGF0ZSBhcmUgbm90IGFsbG93ZWQgd2hpbGUgYW4gdXBkYXRlIGlzIGluIHByb2dyZXNzXCIpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgIGxldCBoYWRGb2N1cyA9IHRoaXMuaGFzRm9jdXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucyA9IG5ld1N0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLm1hcChzcGVjID0+IG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbk1hcC5jbGVhcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgICAgICBwbHVnaW4udXBkYXRlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldyA9IG5ldyBEb2NWaWV3KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLmJpZGlDYWNoZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFkRm9jdXMpXG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICB9XG4gICAgdXBkYXRlUGx1Z2lucyh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXZTcGVjcyA9IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLCBzcGVjcyA9IHVwZGF0ZS5zdGF0ZS5mYWNldCh2aWV3UGx1Z2luKTtcbiAgICAgICAgaWYgKHByZXZTcGVjcyAhPSBzcGVjcykge1xuICAgICAgICAgICAgbGV0IG5ld1BsdWdpbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBwcmV2U3BlY3MuaW5kZXhPZihzcGVjKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BsdWdpbnMucHVzaChuZXcgUGx1Z2luSW5zdGFuY2Uoc3BlYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMucGx1Z2luc1tmb3VuZF07XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5tdXN0VXBkYXRlID0gdXBkYXRlO1xuICAgICAgICAgICAgICAgICAgICBuZXdQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ubXVzdFVwZGF0ZSAhPSB1cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3UGx1Z2lucztcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgICAgICBwLm11c3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnNbaV0udXBkYXRlKHRoaXMpO1xuICAgICAgICBpZiAocHJldlNwZWNzICE9IHNwZWNzKVxuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWVhc3VyZShmbHVzaCA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlU2NoZWR1bGVkID4gLTEpXG4gICAgICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLm1lYXN1cmVTY2hlZHVsZWQpO1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlci5kZWxheWVkQW5kcm9pZEtleSkge1xuICAgICAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gLTE7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gMDsgLy8gUHJldmVudCByZXF1ZXN0TWVhc3VyZSBjYWxscyBmcm9tIHNjaGVkdWxpbmcgYW5vdGhlciBhbmltYXRpb24gZnJhbWVcbiAgICAgICAgaWYgKGZsdXNoKVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5mb3JjZUZsdXNoKCk7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbnVsbDtcbiAgICAgICAgbGV0IHNET00gPSB0aGlzLnNjcm9sbERPTSwgc2Nyb2xsVG9wID0gc0RPTS5zY3JvbGxUb3AgKiB0aGlzLnNjYWxlWTtcbiAgICAgICAgbGV0IHsgc2Nyb2xsQW5jaG9yUG9zLCBzY3JvbGxBbmNob3JIZWlnaHQgfSA9IHRoaXMudmlld1N0YXRlO1xuICAgICAgICBpZiAoTWF0aC5hYnMoc2Nyb2xsVG9wIC0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsVG9wKSA+IDEpXG4gICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgdGhpcy52aWV3U3RhdGUuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxBbmNob3JIZWlnaHQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Njcm9sbGVkVG9Cb3R0b20oc0RPTSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvclBvcyA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gdGhpcy52aWV3U3RhdGUuaGVpZ2h0TWFwLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHRoaXMudmlld1N0YXRlLnNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JQb3MgPSBibG9jay5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gYmxvY2sudG9wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAxIC8qIFVwZGF0ZVN0YXRlLk1lYXN1cmluZyAqLztcbiAgICAgICAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMudmlld1N0YXRlLm1lYXN1cmUodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmICF0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGggJiYgdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0ID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChpID4gNSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4odGhpcy5tZWFzdXJlUmVxdWVzdHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiTWVhc3VyZSBsb29wIHJlc3RhcnRlZCBtb3JlIHRoYW4gNSB0aW1lc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiVmlld3BvcnQgZmFpbGVkIHRvIHN0YWJpbGl6ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJ1biBtZWFzdXJlIHJlcXVlc3RzIGluIHRoaXMgY3ljbGUgd2hlbiB0aGUgdmlld3BvcnQgZGlkbid0IGNoYW5nZVxuICAgICAgICAgICAgICAgIGlmICghKGNoYW5nZWQgJiA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi8pKVxuICAgICAgICAgICAgICAgICAgICBbdGhpcy5tZWFzdXJlUmVxdWVzdHMsIG1lYXN1cmluZ10gPSBbbWVhc3VyaW5nLCB0aGlzLm1lYXN1cmVSZXF1ZXN0c107XG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVkID0gbWVhc3VyaW5nLm1hcChtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLnJlYWQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYWRNZWFzdXJlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHVwZGF0ZSA9IFZpZXdVcGRhdGUuY3JlYXRlKHRoaXMsIHRoaXMuc3RhdGUsIFtdKSwgcmVkcmF3biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHVwZGF0ZS5mbGFncyB8PSBjaGFuZ2VkO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZClcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZmxhZ3MgfD0gY2hhbmdlZDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLztcbiAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZS5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBsdWdpbnModXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZHJhd24gPSB0aGlzLmRvY1ZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVhc3VyaW5nLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZWRbaV0gIT0gQmFkTWVhc3VyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IG1lYXN1cmluZ1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobS53cml0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS53cml0ZShtZWFzdXJlZFtpXSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZWRyYXduKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCAmJiB0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3U3RhdGUuZWRpdG9ySGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnNjcm9sbEludG9WaWV3KHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdBbmNob3JIZWlnaHQgPSBzY3JvbGxBbmNob3JQb3MgPCAwID8gdGhpcy52aWV3U3RhdGUuaGVpZ2h0TWFwLmhlaWdodCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0KHNjcm9sbEFuY2hvclBvcykudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWZmID0gbmV3QW5jaG9ySGVpZ2h0IC0gc2Nyb2xsQW5jaG9ySGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID4gMSB8fCBkaWZmIDwgLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wID0gc2Nyb2xsVG9wICsgZGlmZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RPTS5zY3JvbGxUb3AgPSBzY3JvbGxUb3AgLyB0aGlzLnNjYWxlWTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWQgJiYgIXVwZGF0ZWQuZW1wdHkpXG4gICAgICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLnN0YXRlLmZhY2V0KHVwZGF0ZUxpc3RlbmVyKSlcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcih1cGRhdGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBDU1MgY2xhc3NlcyBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgZWRpdG9yIHRoZW1lcy5cbiAgICAqL1xuICAgIGdldCB0aGVtZUNsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiBiYXNlVGhlbWVJRCArIFwiIFwiICtcbiAgICAgICAgICAgICh0aGlzLnN0YXRlLmZhY2V0KGRhcmtUaGVtZSkgPyBiYXNlRGFya0lEIDogYmFzZUxpZ2h0SUQpICsgXCIgXCIgK1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5mYWNldCh0aGVtZSk7XG4gICAgfVxuICAgIHVwZGF0ZUF0dHJzKCkge1xuICAgICAgICBsZXQgZWRpdG9yQXR0cnMgPSBhdHRyc0Zyb21GYWNldCh0aGlzLCBlZGl0b3JBdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICBjbGFzczogXCJjbS1lZGl0b3JcIiArICh0aGlzLmhhc0ZvY3VzID8gXCIgY20tZm9jdXNlZCBcIiA6IFwiIFwiKSArIHRoaXMudGhlbWVDbGFzc2VzXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgY29udGVudEF0dHJzID0ge1xuICAgICAgICAgICAgc3BlbGxjaGVjazogXCJmYWxzZVwiLFxuICAgICAgICAgICAgYXV0b2NvcnJlY3Q6IFwib2ZmXCIsXG4gICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZTogXCJvZmZcIixcbiAgICAgICAgICAgIHRyYW5zbGF0ZTogXCJub1wiLFxuICAgICAgICAgICAgY29udGVudGVkaXRhYmxlOiAhdGhpcy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgPyBcImZhbHNlXCIgOiBcInRydWVcIixcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWNvbnRlbnRcIixcbiAgICAgICAgICAgIHN0eWxlOiBgJHticm93c2VyLnRhYlNpemV9OiAke3RoaXMuc3RhdGUudGFiU2l6ZX1gLFxuICAgICAgICAgICAgcm9sZTogXCJ0ZXh0Ym94XCIsXG4gICAgICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwidHJ1ZVwiXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICAgICAgY29udGVudEF0dHJzW1wiYXJpYS1yZWFkb25seVwiXSA9IFwidHJ1ZVwiO1xuICAgICAgICBhdHRyc0Zyb21GYWNldCh0aGlzLCBjb250ZW50QXR0cmlidXRlcywgY29udGVudEF0dHJzKTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSB0aGlzLm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZENvbnRlbnQgPSB1cGRhdGVBdHRycyh0aGlzLmNvbnRlbnRET00sIHRoaXMuY29udGVudEF0dHJzLCBjb250ZW50QXR0cnMpO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRFZGl0b3IgPSB1cGRhdGVBdHRycyh0aGlzLmRvbSwgdGhpcy5lZGl0b3JBdHRycywgZWRpdG9yQXR0cnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWRDb250ZW50IHx8IGNoYW5nZWRFZGl0b3I7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVkaXRvckF0dHJzID0gZWRpdG9yQXR0cnM7XG4gICAgICAgIHRoaXMuY29udGVudEF0dHJzID0gY29udGVudEF0dHJzO1xuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG4gICAgc2hvd0Fubm91bmNlbWVudHModHJzKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRycylcbiAgICAgICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgICAgIGlmIChlZmZlY3QuaXMoRWRpdG9yVmlldy5hbm5vdW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdW5jZURPTS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXYgPSB0aGlzLmFubm91bmNlRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICAgICAgICAgICAgICBkaXYudGV4dENvbnRlbnQgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgIH1cbiAgICBtb3VudFN0eWxlcygpIHtcbiAgICAgICAgdGhpcy5zdHlsZU1vZHVsZXMgPSB0aGlzLnN0YXRlLmZhY2V0KHN0eWxlTW9kdWxlKTtcbiAgICAgICAgbGV0IG5vbmNlID0gdGhpcy5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LmNzcE5vbmNlKTtcbiAgICAgICAgU3R5bGVNb2R1bGUubW91bnQodGhpcy5yb290LCB0aGlzLnN0eWxlTW9kdWxlcy5jb25jYXQoYmFzZVRoZW1lJDEpLnJldmVyc2UoKSwgbm9uY2UgPyB7IG5vbmNlIH0gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZWFkTWVhc3VyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlID09IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFkaW5nIHRoZSBlZGl0b3IgbGF5b3V0IGlzbid0IGFsbG93ZWQgZHVyaW5nIGFuIHVwZGF0ZVwiKTtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgPT0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovICYmIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlKGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2NoZWR1bGUgYSBsYXlvdXQgbWVhc3VyZW1lbnQsIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGNhbGxiYWNrcyB0b1xuICAgIGRvIGN1c3RvbSBET00gbWVhc3VyaW5nIGZvbGxvd2VkIGJ5IGEgRE9NIHdyaXRlIHBoYXNlLiBVc2luZ1xuICAgIHRoaXMgaXMgcHJlZmVyYWJsZSByZWFkaW5nIERPTSBsYXlvdXQgZGlyZWN0bHkgZnJvbSwgZm9yXG4gICAgZXhhbXBsZSwgYW4gZXZlbnQgaGFuZGxlciwgYmVjYXVzZSBpdCdsbCBtYWtlIHN1cmUgbWVhc3VyaW5nIGFuZFxuICAgIGRyYXdpbmcgZG9uZSBieSBvdGhlciBjb21wb25lbnRzIGlzIHN5bmNocm9uaXplZCwgYXZvaWRpbmdcbiAgICB1bm5lY2Vzc2FyeSBET00gbGF5b3V0IGNvbXB1dGF0aW9ucy5cbiAgICAqL1xuICAgIHJlcXVlc3RNZWFzdXJlKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA8IDApXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSB0aGlzLndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5tZWFzdXJlKCkpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVhc3VyZVJlcXVlc3RzLmluZGV4T2YocmVxdWVzdCkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5rZXkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lYXN1cmVSZXF1ZXN0c1tpXS5rZXkgPT09IHJlcXVlc3Qua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0c1tpXSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBwbHVnaW4sIGlmIHByZXNlbnQuIE5vdGUgdGhhdFxuICAgIHBsdWdpbnMgdGhhdCBjcmFzaCBjYW4gYmUgZHJvcHBlZCBmcm9tIGEgdmlldywgc28gZXZlbiB3aGVuIHlvdVxuICAgIGtub3cgeW91IHJlZ2lzdGVyZWQgYSBnaXZlbiBwbHVnaW4sIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNoZWNrXG4gICAgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZC5cbiAgICAqL1xuICAgIHBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgbGV0IGtub3duID0gdGhpcy5wbHVnaW5NYXAuZ2V0KHBsdWdpbik7XG4gICAgICAgIGlmIChrbm93biA9PT0gdW5kZWZpbmVkIHx8IGtub3duICYmIGtub3duLnNwZWMgIT0gcGx1Z2luKVxuICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXAuc2V0KHBsdWdpbiwga25vd24gPSB0aGlzLnBsdWdpbnMuZmluZChwID0+IHAuc3BlYyA9PSBwbHVnaW4pIHx8IG51bGwpO1xuICAgICAgICByZXR1cm4ga25vd24gJiYga25vd24udXBkYXRlKHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudCwgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLiBUaGlzXG4gICAgbWF5IGJlIG5lZ2F0aXZlIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxlZCBkb3duLiBQb2ludHNcbiAgICBkaXJlY3RseSB0byB0aGUgdG9wIG9mIHRoZSBmaXJzdCBsaW5lLCBub3QgYWJvdmUgdGhlIHBhZGRpbmcuXG4gICAgKi9cbiAgICBnZXQgZG9jdW1lbnRUb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy52aWV3U3RhdGUucGFkZGluZ1RvcDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwb3J0cyB0aGUgcGFkZGluZyBhYm92ZSBhbmQgYmVsb3cgdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRvY3VtZW50UGFkZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHsgdG9wOiB0aGlzLnZpZXdTdGF0ZS5wYWRkaW5nVG9wLCBib3R0b206IHRoaXMudmlld1N0YXRlLnBhZGRpbmdCb3R0b20gfTtcbiAgICB9XG4gICAgLyoqXG4gICAgSWYgdGhlIGVkaXRvciBpcyB0cmFuc2Zvcm1lZCB3aXRoIENTUywgdGhpcyBwcm92aWRlcyB0aGUgc2NhbGVcbiAgICBhbG9uZyB0aGUgWCBheGlzLiBPdGhlcndpc2UsIGl0IHdpbGwganVzdCBiZSAxLiBOb3RlIHRoYXRcbiAgICB0cmFuc2Zvcm1zIG90aGVyIHRoYW4gdHJhbnNsYXRpb24gYW5kIHNjYWxpbmcgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgKi9cbiAgICBnZXQgc2NhbGVYKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuc2NhbGVYOyB9XG4gICAgLyoqXG4gICAgUHJvdmlkZSB0aGUgQ1NTIHRyYW5zZm9ybWVkIHNjYWxlIGFsb25nIHRoZSBZIGF4aXMuXG4gICAgKi9cbiAgICBnZXQgc2NhbGVZKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuc2NhbGVZOyB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdGV4dCBsaW5lIG9yIGJsb2NrIHdpZGdldCBhdCB0aGUgZ2l2ZW4gdmVydGljYWxcbiAgICBwb3NpdGlvbiAod2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIFt0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvY3VtZW50VG9wKSkuXG4gICAgKi9cbiAgICBlbGVtZW50QXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5lbGVtZW50QXRIZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgbGluZSBibG9jayAoc2VlXG4gICAgW2BsaW5lQmxvY2tBdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVCbG9ja0F0KSBhdCB0aGUgZ2l2ZW5cbiAgICBoZWlnaHQsIGFnYWluIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBbdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb2N1bWVudFRvcCkuXG4gICAgKi9cbiAgICBsaW5lQmxvY2tBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0SGVpZ2h0KGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZXh0ZW50IGFuZCB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBhbGwgW2xpbmVcbiAgICBibG9ja3NdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVCbG9ja0F0KSBpbiB0aGUgdmlld3BvcnQuIFBvc2l0aW9uc1xuICAgIGFyZSByZWxhdGl2ZSB0byB0aGUgW3RvcCBvZiB0aGVcbiAgICBkb2N1bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9jdW1lbnRUb3ApO1xuICAgICovXG4gICAgZ2V0IHZpZXdwb3J0TGluZUJsb2NrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLnZpZXdwb3J0TGluZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGxpbmUgYmxvY2sgYXJvdW5kIHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi4gQSBsaW5lXG4gICAgYmxvY2sgaXMgYSByYW5nZSBkZWxpbWl0ZWQgb24gYm90aCBzaWRlcyBieSBlaXRoZXIgYVxuICAgIG5vbi1baGlkZGVuXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvbl5yZXBsYWNlKSBsaW5lIGJyZWFrcywgb3IgdGhlXG4gICAgc3RhcnQvZW5kIG9mIHRoZSBkb2N1bWVudC4gSXQgd2lsbCB1c3VhbGx5IGp1c3QgaG9sZCBhIGxpbmUgb2ZcbiAgICB0ZXh0LCBidXQgbWF5IGJlIGJyb2tlbiBpbnRvIG11bHRpcGxlIHRleHRibG9ja3MgYnkgYmxvY2tcbiAgICB3aWRnZXRzLlxuICAgICovXG4gICAgbGluZUJsb2NrQXQocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5saW5lQmxvY2tBdChwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZWRpdG9yJ3MgdG90YWwgY29udGVudCBoZWlnaHQuXG4gICAgKi9cbiAgICBnZXQgY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmNvbnRlbnRIZWlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gYnkgW2dyYXBoZW1lXG4gICAgY2x1c3Rlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5maW5kQ2x1c3RlckJyZWFrKS4gYGZvcndhcmRgIGRldGVybWluZXMgd2hldGhlclxuICAgIHRoZSBtb3Rpb24gaXMgYXdheSBmcm9tIHRoZSBsaW5lIHN0YXJ0LCBvciB0b3dhcmRzIGl0LiBJblxuICAgIGJpZGlyZWN0aW9uYWwgdGV4dCwgdGhlIGxpbmUgaXMgdHJhdmVyc2VkIGluIHZpc3VhbCBvcmRlciwgdXNpbmdcbiAgICB0aGUgZWRpdG9yJ3MgW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy50ZXh0RGlyZWN0aW9uKS5cbiAgICBXaGVuIHRoZSBzdGFydCBwb3NpdGlvbiB3YXMgdGhlIGxhc3Qgb25lIG9uIHRoZSBsaW5lLCB0aGVcbiAgICByZXR1cm5lZCBwb3NpdGlvbiB3aWxsIGJlIGFjcm9zcyB0aGUgbGluZSBicmVhay4gSWYgdGhlcmUgaXMgbm9cbiAgICBmdXJ0aGVyIGxpbmUsIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBpcyByZXR1cm5lZC5cbiAgICBcbiAgICBCeSBkZWZhdWx0LCB0aGlzIG1ldGhvZCBtb3ZlcyBvdmVyIGEgc2luZ2xlIGNsdXN0ZXIuIFRoZVxuICAgIG9wdGlvbmFsIGBieWAgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gbW92ZSBhY3Jvc3MgbW9yZS4gSXQgd2lsbFxuICAgIGJlIGNhbGxlZCB3aXRoIHRoZSBmaXJzdCBjbHVzdGVyIGFzIGFyZ3VtZW50LCBhbmQgc2hvdWxkIHJldHVyblxuICAgIGEgcHJlZGljYXRlIHRoYXQgZGV0ZXJtaW5lcywgZm9yIGVhY2ggc3Vic2VxdWVudCBjbHVzdGVyLFxuICAgIHdoZXRoZXIgaXQgc2hvdWxkIGFsc28gYmUgbW92ZWQgb3Zlci5cbiAgICAqL1xuICAgIG1vdmVCeUNoYXIoc3RhcnQsIGZvcndhcmQsIGJ5KSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVCeUNoYXIodGhpcywgc3RhcnQsIGZvcndhcmQsIGJ5KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gYWNyb3NzIHRoZSBuZXh0IGdyb3VwIG9mIGVpdGhlclxuICAgIFtsZXR0ZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYXJDYXRlZ29yaXplcikgb3Igbm9uLWxldHRlclxuICAgIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXG4gICAgKi9cbiAgICBtb3ZlQnlHcm91cChzdGFydCwgZm9yd2FyZCkge1xuICAgICAgICByZXR1cm4gc2tpcEF0b21zKHRoaXMsIHN0YXJ0LCBtb3ZlQnlDaGFyKHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBpbml0aWFsID0+IGJ5R3JvdXAodGhpcywgc3RhcnQuaGVhZCwgaW5pdGlhbCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdmlzdWFsbHkgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIGxpbmUuXG4gICAgTm90ZSB0aGF0IHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBfbG9naWNhbF8gcG9zaXRpb24gYXQgaXRzXG4gICAgc3RhcnQgb3IgZW5kICh3aGljaCBpcyBzaW1wbHkgYXQgYGxpbmUuZnJvbWAvYGxpbmUudG9gKSBpZiB0ZXh0XG4gICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBnb2VzIGFnYWluc3QgdGhlIGxpbmUncyBiYXNlIHRleHQgZGlyZWN0aW9uLlxuICAgICovXG4gICAgdmlzdWFsTGluZVNpZGUobGluZSwgZW5kKSB7XG4gICAgICAgIGxldCBvcmRlciA9IHRoaXMuYmlkaVNwYW5zKGxpbmUpLCBkaXIgPSB0aGlzLnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pO1xuICAgICAgICBsZXQgc3BhbiA9IG9yZGVyW2VuZCA/IG9yZGVyLmxlbmd0aCAtIDEgOiAwXTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioc3Bhbi5zaWRlKGVuZCwgZGlyKSArIGxpbmUuZnJvbSwgc3Bhbi5mb3J3YXJkKCFlbmQsIGRpcikgPyAxIDogLTEpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IGxpbmUgYm91bmRhcnkgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi4gSWZcbiAgICBgaW5jbHVkZVdyYXBgIGlzIHRydWUsIGxpbmUgd3JhcHBpbmcgaXMgb24sIGFuZCB0aGVyZSBpcyBhXG4gICAgZnVydGhlciB3cmFwIHBvaW50IG9uIHRoZSBjdXJyZW50IGxpbmUsIHRoZSB3cmFwIHBvaW50IHdpbGwgYmVcbiAgICByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHN0YXJ0IG9yIGVuZFxuICAgIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgbW92ZVRvTGluZUJvdW5kYXJ5KHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG1vdmVUb0xpbmVCb3VuZGFyeSh0aGlzLCBzdGFydCwgZm9yd2FyZCwgaW5jbHVkZVdyYXApO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIGEgY3Vyc29yIHBvc2l0aW9uIHZlcnRpY2FsbHkuIFdoZW4gYGRpc3RhbmNlYCBpc24ndCBnaXZlbixcbiAgICBpdCBkZWZhdWx0cyB0byBtb3ZpbmcgdG8gdGhlIG5leHQgbGluZSAoaW5jbHVkaW5nIHdyYXBwZWRcbiAgICBsaW5lcykuIE90aGVyd2lzZSwgYGRpc3RhbmNlYCBzaG91bGQgcHJvdmlkZSBhIHBvc2l0aXZlIGRpc3RhbmNlXG4gICAgaW4gcGl4ZWxzLlxuICAgIFxuICAgIFdoZW4gYHN0YXJ0YCBoYXMgYVxuICAgIFtgZ29hbENvbHVtbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuZ29hbENvbHVtbiksIHRoZSB2ZXJ0aWNhbFxuICAgIG1vdGlvbiB3aWxsIHVzZSB0aGF0IGFzIGEgdGFyZ2V0IGhvcml6b250YWwgcG9zaXRpb24uIE90aGVyd2lzZSxcbiAgICB0aGUgY3Vyc29yJ3Mgb3duIGhvcml6b250YWwgcG9zaXRpb24gaXMgdXNlZC4gVGhlIHJldHVybmVkXG4gICAgY3Vyc29yIHdpbGwgaGF2ZSBpdHMgZ29hbCBjb2x1bW4gc2V0IHRvIHdoaWNoZXZlciBjb2x1bW4gd2FzXG4gICAgdXNlZC5cbiAgICAqL1xuICAgIG1vdmVWZXJ0aWNhbGx5KHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkge1xuICAgICAgICByZXR1cm4gc2tpcEF0b21zKHRoaXMsIHN0YXJ0LCBtb3ZlVmVydGljYWxseSh0aGlzLCBzdGFydCwgZm9yd2FyZCwgZGlzdGFuY2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgRE9NIHBhcmVudCBub2RlIGFuZCBvZmZzZXQgKGNoaWxkIG9mZnNldCBpZiBgbm9kZWAgaXNcbiAgICBhbiBlbGVtZW50LCBjaGFyYWN0ZXIgb2Zmc2V0IHdoZW4gaXQgaXMgYSB0ZXh0IG5vZGUpIGF0IHRoZVxuICAgIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgIFxuICAgIE5vdGUgdGhhdCBmb3IgcG9zaXRpb25zIHRoYXQgYXJlbid0IGN1cnJlbnRseSBpblxuICAgIGB2aXNpYmxlUmFuZ2VzYCwgdGhlIHJlc3VsdGluZyBET00gcG9zaXRpb24gaXNuJ3QgbmVjZXNzYXJpbHlcbiAgICBtZWFuaW5nZnVsIChpdCBtYXkganVzdCBwb2ludCBiZWZvcmUgb3IgYWZ0ZXIgYSBwbGFjZWhvbGRlclxuICAgIGVsZW1lbnQpLlxuICAgICovXG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuZG9tQXRQb3MocG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZG9jdW1lbnQgcG9zaXRpb24gYXQgdGhlIGdpdmVuIERPTSBub2RlLiBDYW4gYmUgdXNlZnVsXG4gICAgZm9yIGFzc29jaWF0aW5nIHBvc2l0aW9ucyB3aXRoIERPTSBldmVudHMuIFdpbGwgcmFpc2UgYW4gZXJyb3JcbiAgICB3aGVuIGBub2RlYCBpc24ndCBwYXJ0IG9mIHRoZSBlZGl0b3IgY29udGVudC5cbiAgICAqL1xuICAgIHBvc0F0RE9NKG5vZGUsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCk7XG4gICAgfVxuICAgIHBvc0F0Q29vcmRzKGNvb3JkcywgcHJlY2lzZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHBvc0F0Q29vcmRzKHRoaXMsIGNvb3JkcywgcHJlY2lzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIGF0IHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi5cbiAgICBgc2lkZWAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb29yZGluYXRlcyBhcmUgYmFzZWQgb24gdGhlXG4gICAgZWxlbWVudCBiZWZvcmUgKC0xKSBvciBhZnRlciAoMSkgdGhlIHBvc2l0aW9uIChpZiBubyBlbGVtZW50IGlzXG4gICAgYXZhaWxhYmxlIG9uIHRoZSBnaXZlbiBzaWRlLCB0aGUgbWV0aG9kIHdpbGwgdHJhbnNwYXJlbnRseSB1c2VcbiAgICBhbm90aGVyIHN0cmF0ZWd5IHRvIGdldCByZWFzb25hYmxlIGNvb3JkaW5hdGVzKS5cbiAgICAqL1xuICAgIGNvb3Jkc0F0UG9zKHBvcywgc2lkZSA9IDEpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgbGV0IHJlY3QgPSB0aGlzLmRvY1ZpZXcuY29vcmRzQXQocG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKCFyZWN0IHx8IHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KHBvcyksIG9yZGVyID0gdGhpcy5iaWRpU3BhbnMobGluZSk7XG4gICAgICAgIGxldCBzcGFuID0gb3JkZXJbQmlkaVNwYW4uZmluZChvcmRlciwgcG9zIC0gbGluZS5mcm9tLCAtMSwgc2lkZSldO1xuICAgICAgICByZXR1cm4gZmxhdHRlblJlY3QocmVjdCwgKHNwYW4uZGlyID09IERpcmVjdGlvbi5MVFIpID09IChzaWRlID4gMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIHJlY3RhbmdsZSBhcm91bmQgYSBnaXZlbiBjaGFyYWN0ZXIuIElmIGBwb3NgIGRvZXMgbm90XG4gICAgcG9pbnQgaW4gZnJvbnQgb2YgYSBjaGFyYWN0ZXIgdGhhdCBpcyBpbiB0aGUgdmlld3BvcnQgYW5kXG4gICAgcmVuZGVyZWQgKGkuZS4gbm90IHJlcGxhY2VkLCBub3QgYSBsaW5lIGJyZWFrKSwgdGhpcyB3aWxsIHJldHVyblxuICAgIG51bGwuIEZvciBzcGFjZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIGEgbGluZSB3cmFwIHBvaW50LCB0aGlzIHdpbGxcbiAgICByZXR1cm4gdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgbGluZSBicmVhay5cbiAgICAqL1xuICAgIGNvb3Jkc0ZvckNoYXIocG9zKSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuY29vcmRzRm9yQ2hhcihwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCB3aWR0aCBvZiBhIGNoYXJhY3RlciBpbiB0aGUgZWRpdG9yLiBNYXkgbm90XG4gICAgYWNjdXJhdGVseSByZWZsZWN0IHRoZSB3aWR0aCBvZiBhbGwgY2hhcmFjdGVycyAoZ2l2ZW4gdmFyaWFibGVcbiAgICB3aWR0aCBmb250cyBvciBzdHlsaW5nIG9mIGludmlkaWR1YWwgcmFuZ2VzKS5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0Q2hhcmFjdGVyV2lkdGgoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUuY2hhcldpZHRoOyB9XG4gICAgLyoqXG4gICAgVGhlIGRlZmF1bHQgaGVpZ2h0IG9mIGEgbGluZSBpbiB0aGUgZWRpdG9yLiBNYXkgbm90IGJlIGFjY3VyYXRlXG4gICAgZm9yIGFsbCBsaW5lcy5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0TGluZUhlaWdodCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lSGVpZ2h0OyB9XG4gICAgLyoqXG4gICAgVGhlIHRleHQgZGlyZWN0aW9uXG4gICAgKFtgZGlyZWN0aW9uYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2RpcmVjdGlvbilcbiAgICBDU1MgcHJvcGVydHkpIG9mIHRoZSBlZGl0b3IncyBjb250ZW50IGVsZW1lbnQuXG4gICAgKi9cbiAgICBnZXQgdGV4dERpcmVjdGlvbigpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmRlZmF1bHRUZXh0RGlyZWN0aW9uOyB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdGV4dCBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgYXNcbiAgICBhc3NpZ25lZCBieSBDU1MuIElmXG4gICAgW2BwZXJMaW5lVGV4dERpcmVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnBlckxpbmVUZXh0RGlyZWN0aW9uKVxuICAgIGlzbid0IGVuYWJsZWQsIG9yIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydCxcbiAgICB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBhc1xuICAgIFtgdGV4dERpcmVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLiBOb3RlIHRoYXRcbiAgICB0aGlzIG1heSB0cmlnZ2VyIGEgRE9NIGxheW91dC5cbiAgICAqL1xuICAgIHRleHREaXJlY3Rpb25BdChwb3MpIHtcbiAgICAgICAgbGV0IHBlckxpbmUgPSB0aGlzLnN0YXRlLmZhY2V0KHBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKCFwZXJMaW5lIHx8IHBvcyA8IHRoaXMudmlld3BvcnQuZnJvbSB8fCBwb3MgPiB0aGlzLnZpZXdwb3J0LnRvKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dERpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy50ZXh0RGlyZWN0aW9uQXQocG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGlzIGVkaXRvciBbd3JhcHMgbGluZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVXcmFwcGluZylcbiAgICAoYXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICBbYHdoaXRlLXNwYWNlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3doaXRlLXNwYWNlKVxuICAgIENTUyBwcm9wZXJ0eSBvZiBpdHMgY29udGVudCBlbGVtZW50KS5cbiAgICAqL1xuICAgIGdldCBsaW5lV3JhcHBpbmcoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCB0ZXh0IHN0cnVjdHVyZSBvZiB0aGUgZ2l2ZW4gbGluZVxuICAgICh3aGljaCBzaG91bGQgYmUgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQpIGFzIGFuIGFycmF5IG9mIHNwYW5cbiAgICBvYmplY3RzLiBUaGUgb3JkZXIgb2YgdGhlc2Ugc3BhbnMgbWF0Y2hlcyB0aGUgW3RleHRcbiAgICBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pXHUyMDE0aWYgdGhhdCBpc1xuICAgIGxlZnQtdG8tcmlnaHQsIHRoZSBsZWZ0bW9zdCBzcGFucyBjb21lIGZpcnN0LCBvdGhlcndpc2UgdGhlXG4gICAgcmlnaHRtb3N0IHNwYW5zIGNvbWUgZmlyc3QuXG4gICAgKi9cbiAgICBiaWRpU3BhbnMobGluZSkge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiBNYXhCaWRpTGluZSlcbiAgICAgICAgICAgIHJldHVybiB0cml2aWFsT3JkZXIobGluZS5sZW5ndGgpO1xuICAgICAgICBsZXQgZGlyID0gdGhpcy50ZXh0RGlyZWN0aW9uQXQobGluZS5mcm9tKSwgaXNvbGF0ZXM7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMuYmlkaUNhY2hlKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuZnJvbSA9PSBsaW5lLmZyb20gJiYgZW50cnkuZGlyID09IGRpciAmJlxuICAgICAgICAgICAgICAgIChlbnRyeS5mcmVzaCB8fCBpc29sYXRlc0VxKGVudHJ5Lmlzb2xhdGVzLCBpc29sYXRlcyA9IGdldElzb2xhdGVkUmFuZ2VzKHRoaXMsIGxpbmUpKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNvbGF0ZXMpXG4gICAgICAgICAgICBpc29sYXRlcyA9IGdldElzb2xhdGVkUmFuZ2VzKHRoaXMsIGxpbmUpO1xuICAgICAgICBsZXQgb3JkZXIgPSBjb21wdXRlT3JkZXIobGluZS50ZXh0LCBkaXIsIGlzb2xhdGVzKTtcbiAgICAgICAgdGhpcy5iaWRpQ2FjaGUucHVzaChuZXcgQ2FjaGVkT3JkZXIobGluZS5mcm9tLCBsaW5lLnRvLCBkaXIsIGlzb2xhdGVzLCB0cnVlLCBvcmRlcikpO1xuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlIGVkaXRvciBoYXMgZm9jdXMuXG4gICAgKi9cbiAgICBnZXQgaGFzRm9jdXMoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gU2FmYXJpIHJldHVybiBmYWxzZSBmb3IgaGFzRm9jdXMgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIG9wZW5cbiAgICAgICAgLy8gb3IgY2xvc2luZywgd2hpY2ggbGVhZHMgdXMgdG8gaWdub3JlIHNlbGVjdGlvbiBjaGFuZ2VzIGZyb20gdGhlXG4gICAgICAgIC8vIGNvbnRleHQgbWVudSBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgdGhlIGVkaXRvciBpc24ndCBmb2N1c2VkLlxuICAgICAgICAvLyBUaGlzIGtsdWRnZXMgYXJvdW5kIHRoYXQuXG4gICAgICAgIHJldHVybiAodGhpcy5kb20ub3duZXJEb2N1bWVudC5oYXNGb2N1cygpIHx8IGJyb3dzZXIuc2FmYXJpICYmICgoX2EgPSB0aGlzLmlucHV0U3RhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXN0Q29udGV4dE1lbnUpID4gRGF0ZS5ub3coKSAtIDNlNCkgJiZcbiAgICAgICAgICAgIHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuY29udGVudERPTTtcbiAgICB9XG4gICAgLyoqXG4gICAgUHV0IGZvY3VzIG9uIHRoZSBlZGl0b3IuXG4gICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgZm9jdXNQcmV2ZW50U2Nyb2xsKHRoaXMuY29udGVudERPTSk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIFtyb290XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvIyN2aWV3LkVkaXRvclZpZXdDb25maWcucm9vdCkgaW4gd2hpY2ggdGhlIGVkaXRvciBsaXZlcy4gVGhpcyBpcyBvbmx5XG4gICAgbmVjZXNzYXJ5IHdoZW4gbW92aW5nIHRoZSBlZGl0b3IncyBleGlzdGluZyBET00gdG8gYSBuZXcgd2luZG93IG9yIHNoYWRvdyByb290LlxuICAgICovXG4gICAgc2V0Um9vdChyb290KSB7XG4gICAgICAgIGlmICh0aGlzLl9yb290ICE9IHJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5zZXRXaW5kb3coKHJvb3Qubm9kZVR5cGUgPT0gOSA/IHJvb3QgOiByb290Lm93bmVyRG9jdW1lbnQpLmRlZmF1bHRWaWV3IHx8IHdpbmRvdyk7XG4gICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ2xlYW4gdXAgdGhpcyBlZGl0b3IgdmlldywgcmVtb3ZpbmcgaXRzIGVsZW1lbnQgZnJvbSB0aGVcbiAgICBkb2N1bWVudCwgdW5yZWdpc3RlcmluZyBldmVudCBoYW5kbGVycywgYW5kIG5vdGlmeWluZ1xuICAgIHBsdWdpbnMuIFRoZSB2aWV3IGluc3RhbmNlIGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlclxuICAgIGNhbGxpbmcgdGhpcy5cbiAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW4uZGVzdHJveSh0aGlzKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9jVmlldy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5tZWFzdXJlU2NoZWR1bGVkKTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGFuIGVmZmVjdCB0aGF0IGNhbiBiZVxuICAgIFthZGRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykgdG8gYSB0cmFuc2FjdGlvbiB0b1xuICAgIGNhdXNlIGl0IHRvIHNjcm9sbCB0aGUgZ2l2ZW4gcG9zaXRpb24gb3IgcmFuZ2UgaW50byB2aWV3LlxuICAgICovXG4gICAgc3RhdGljIHNjcm9sbEludG9WaWV3KHBvcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbnRvVmlldy5vZihuZXcgU2Nyb2xsVGFyZ2V0KHR5cGVvZiBwb3MgPT0gXCJudW1iZXJcIiA/IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zKSA6IHBvcywgb3B0aW9ucy55LCBvcHRpb25zLngsIG9wdGlvbnMueU1hcmdpbiwgb3B0aW9ucy54TWFyZ2luKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhbiBlZmZlY3QgdGhhdCByZXNldHMgdGhlIGVkaXRvciB0byBpdHMgY3VycmVudCAoYXQgdGhlXG4gICAgdGltZSB0aGlzIG1ldGhvZCB3YXMgY2FsbGVkKSBzY3JvbGwgcG9zaXRpb24uIE5vdGUgdGhhdCB0aGlzXG4gICAgb25seSBhZmZlY3RzIHRoZSBlZGl0b3IncyBvd24gc2Nyb2xsYWJsZSBlbGVtZW50LCBub3QgcGFyZW50cy5cbiAgICBTZWUgYWxzb1xuICAgIFtgRWRpdG9yVmlld0NvbmZpZy5zY3JvbGxUb2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Q29uZmlnLnNjcm9sbFRvKS5cbiAgICBcbiAgICBUaGUgZWZmZWN0IHNob3VsZCBiZSB1c2VkIHdpdGggYSBkb2N1bWVudCBpZGVudGljYWwgdG8gdGhlIG9uZVxuICAgIGl0IHdhcyBjcmVhdGVkIGZvci4gRmFpbGluZyB0byBkbyBzbyBpcyBub3QgYW4gZXJyb3IsIGJ1dCBtYXlcbiAgICBub3Qgc2Nyb2xsIHRvIHRoZSBleHBlY3RlZCBwb3NpdGlvbi4gWW91IGNhblxuICAgIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3QubWFwKSB0aGUgZWZmZWN0IHRvIGFjY291bnQgZm9yIGNoYW5nZXMuXG4gICAgKi9cbiAgICBzY3JvbGxTbmFwc2hvdCgpIHtcbiAgICAgICAgbGV0IHsgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0IH0gPSB0aGlzLnNjcm9sbERPTTtcbiAgICAgICAgbGV0IHJlZiA9IHRoaXMudmlld1N0YXRlLnNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCk7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbnRvVmlldy5vZihuZXcgU2Nyb2xsVGFyZ2V0KEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmVmLmZyb20pLCBcInN0YXJ0XCIsIFwic3RhcnRcIiwgcmVmLnRvcCAtIHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCwgdHJ1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBET00gZXZlbnQgaGFuZGxlcnMuXG4gICAgVGhlIHZhbHVlIHNob3VsZCBiZSBhbiBvYmplY3QgbWFwcGluZyBldmVudCBuYW1lcyB0byBoYW5kbGVyXG4gICAgZnVuY3Rpb25zLiBGb3IgYW55IGdpdmVuIGV2ZW50LCBzdWNoIGZ1bmN0aW9ucyBhcmUgb3JkZXJlZCBieVxuICAgIGV4dGVuc2lvbiBwcmVjZWRlbmNlLCBhbmQgdGhlIGZpcnN0IGhhbmRsZXIgdG8gcmV0dXJuIHRydWUgd2lsbFxuICAgIGJlIGFzc3VtZWQgdG8gaGF2ZSBoYW5kbGVkIHRoYXQgZXZlbnQsIGFuZCBubyBvdGhlciBoYW5kbGVycyBvclxuICAgIGJ1aWx0LWluIGJlaGF2aW9yIHdpbGwgYmUgYWN0aXZhdGVkIGZvciBpdC4gVGhlc2UgYXJlIHJlZ2lzdGVyZWRcbiAgICBvbiB0aGUgW2NvbnRlbnQgZWxlbWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuY29udGVudERPTSksIGV4Y2VwdFxuICAgIGZvciBgc2Nyb2xsYCBoYW5kbGVycywgd2hpY2ggd2lsbCBiZSBjYWxsZWQgYW55IHRpbWUgdGhlXG4gICAgZWRpdG9yJ3MgW3Njcm9sbCBlbGVtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5zY3JvbGxET00pIG9yIG9uZSBvZlxuICAgIGl0cyBwYXJlbnQgbm9kZXMgaXMgc2Nyb2xsZWQuXG4gICAgKi9cbiAgICBzdGF0aWMgZG9tRXZlbnRIYW5kbGVycyhoYW5kbGVycykge1xuICAgICAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUoKCkgPT4gKHt9KSwgeyBldmVudEhhbmRsZXJzOiBoYW5kbGVycyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IHJlZ2lzdGVycyBET00gZXZlbnQgb2JzZXJ2ZXJzLiBDb250cmFyeVxuICAgIHRvIGV2ZW50IFtoYW5kbGVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZG9tRXZlbnRIYW5kbGVycyksXG4gICAgb2JzZXJ2ZXJzIGNhbid0IGJlIHByZXZlbnRlZCBmcm9tIHJ1bm5pbmcgYnkgYSBoaWdoZXItcHJlY2VkZW5jZVxuICAgIGhhbmRsZXIgcmV0dXJuaW5nIHRydWUuIFRoZXkgYWxzbyBkb24ndCBwcmV2ZW50IG90aGVyIGhhbmRsZXJzXG4gICAgYW5kIG9ic2VydmVycyBmcm9tIHJ1bm5pbmcgd2hlbiB0aGV5IHJldHVybiB0cnVlLCBhbmQgc2hvdWxkIG5vdFxuICAgIGNhbGwgYHByZXZlbnREZWZhdWx0YC5cbiAgICAqL1xuICAgIHN0YXRpYyBkb21FdmVudE9ic2VydmVycyhvYnNlcnZlcnMpIHtcbiAgICAgICAgcmV0dXJuIFZpZXdQbHVnaW4uZGVmaW5lKCgpID0+ICh7fSksIHsgZXZlbnRPYnNlcnZlcnM6IG9ic2VydmVycyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGhlbWUgZXh0ZW5zaW9uLiBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGJlIGFcbiAgICBbYHN0eWxlLW1vZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL3N0eWxlLW1vZCNkb2N1bWVudGF0aW9uKVxuICAgIHN0eWxlIHNwZWMgcHJvdmlkaW5nIHRoZSBzdHlsZXMgZm9yIHRoZSB0aGVtZS4gVGhlc2Ugd2lsbCBiZVxuICAgIHByZWZpeGVkIHdpdGggYSBnZW5lcmF0ZWQgY2xhc3MgZm9yIHRoZSBzdHlsZS5cbiAgICBcbiAgICBCZWNhdXNlIHRoZSBzZWxlY3RvcnMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIGEgc2NvcGUgY2xhc3MsIHJ1bGVcbiAgICB0aGF0IGRpcmVjdGx5IG1hdGNoIHRoZSBlZGl0b3IncyBbd3JhcHBlclxuICAgIGVsZW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvbSlcdTIwMTR0byB3aGljaCB0aGUgc2NvcGUgY2xhc3Mgd2lsbCBiZVxuICAgIGFkZGVkXHUyMDE0bmVlZCB0byBiZSBleHBsaWNpdGx5IGRpZmZlcmVudGlhdGVkIGJ5IGFkZGluZyBhbiBgJmAgdG9cbiAgICB0aGUgc2VsZWN0b3IgZm9yIHRoYXQgZWxlbWVudFx1MjAxNGZvciBleGFtcGxlXG4gICAgYCYuY20tZm9jdXNlZGAuXG4gICAgXG4gICAgV2hlbiBgZGFya2AgaXMgc2V0IHRvIHRydWUsIHRoZSB0aGVtZSB3aWxsIGJlIG1hcmtlZCBhcyBkYXJrLFxuICAgIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGAmZGFya2AgcnVsZXMgZnJvbSBbYmFzZVxuICAgIHRoZW1lc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeYmFzZVRoZW1lKSB0byBiZSB1c2VkIChhcyBvcHBvc2VkIHRvXG4gICAgYCZsaWdodGAgd2hlbiBhIGxpZ2h0IHRoZW1lIGlzIGFjdGl2ZSkuXG4gICAgKi9cbiAgICBzdGF0aWMgdGhlbWUoc3BlYywgb3B0aW9ucykge1xuICAgICAgICBsZXQgcHJlZml4ID0gU3R5bGVNb2R1bGUubmV3TmFtZSgpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW3RoZW1lLm9mKHByZWZpeCksIHN0eWxlTW9kdWxlLm9mKGJ1aWxkVGhlbWUoYC4ke3ByZWZpeH1gLCBzcGVjKSldO1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRhcmspXG4gICAgICAgICAgICByZXN1bHQucHVzaChkYXJrVGhlbWUub2YodHJ1ZSkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyBzdHlsZXMgdG8gdGhlIGJhc2UgdGhlbWUuIExpa2VcbiAgICB3aXRoIFtgdGhlbWVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld150aGVtZSksIHVzZSBgJmAgdG8gaW5kaWNhdGUgdGhlXG4gICAgcGxhY2Ugb2YgdGhlIGVkaXRvciB3cmFwcGVyIGVsZW1lbnQgd2hlbiBkaXJlY3RseSB0YXJnZXRpbmdcbiAgICB0aGF0LiBZb3UgY2FuIGFsc28gdXNlIGAmZGFya2Agb3IgYCZsaWdodGAgaW5zdGVhZCB0byBvbmx5XG4gICAgdGFyZ2V0IGVkaXRvcnMgd2l0aCBhIGRhcmsgb3IgbGlnaHQgdGhlbWUuXG4gICAgKi9cbiAgICBzdGF0aWMgYmFzZVRoZW1lKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIFByZWMubG93ZXN0KHN0eWxlTW9kdWxlLm9mKGJ1aWxkVGhlbWUoXCIuXCIgKyBiYXNlVGhlbWVJRCwgc3BlYywgbGlnaHREYXJrSURzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSBhbiBlZGl0b3IgdmlldyBpbnN0YW5jZSBmcm9tIHRoZSB2aWV3J3MgRE9NXG4gICAgcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZEZyb21ET00oZG9tKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBkb20ucXVlcnlTZWxlY3RvcihcIi5jbS1jb250ZW50XCIpO1xuICAgICAgICBsZXQgY1ZpZXcgPSBjb250ZW50ICYmIENvbnRlbnRWaWV3LmdldChjb250ZW50KSB8fCBDb250ZW50Vmlldy5nZXQoZG9tKTtcbiAgICAgICAgcmV0dXJuICgoX2EgPSBjVmlldyA9PT0gbnVsbCB8fCBjVmlldyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY1ZpZXcucm9vdFZpZXcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52aWV3KSB8fCBudWxsO1xuICAgIH1cbn1cbi8qKlxuRmFjZXQgdG8gYWRkIGEgW3N0eWxlXG5tb2R1bGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL3N0eWxlLW1vZCNkb2N1bWVudGF0aW9uKSB0b1xuYW4gZWRpdG9yIHZpZXcuIFRoZSB2aWV3IHdpbGwgZW5zdXJlIHRoYXQgdGhlIG1vZHVsZSBpc1xubW91bnRlZCBpbiBpdHMgW2RvY3VtZW50XG5yb290XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5jb25zdHJ1Y3Rvcl5jb25maWcucm9vdCkuXG4qL1xuRWRpdG9yVmlldy5zdHlsZU1vZHVsZSA9IHN0eWxlTW9kdWxlO1xuLyoqXG5BbiBpbnB1dCBoYW5kbGVyIGNhbiBvdmVycmlkZSB0aGUgd2F5IGNoYW5nZXMgdG8gdGhlIGVkaXRhYmxlXG5ET00gY29udGVudCBhcmUgaGFuZGxlZC4gSGFuZGxlcnMgYXJlIHBhc3NlZCB0aGUgZG9jdW1lbnRcbnBvc2l0aW9ucyBiZXR3ZWVuIHdoaWNoIHRoZSBjaGFuZ2Ugd2FzIGZvdW5kLCBhbmQgdGhlIG5ld1xuY29udGVudC4gV2hlbiBvbmUgcmV0dXJucyB0cnVlLCBubyBmdXJ0aGVyIGlucHV0IGhhbmRsZXJzIGFyZVxuY2FsbGVkIGFuZCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBwcmV2ZW50ZWQuXG5cblRoZSBgaW5zZXJ0YCBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGRlZmF1bHQgdHJhbnNhY3Rpb25cbnRoYXQgd291bGQgYmUgYXBwbGllZCBmb3IgdGhpcyBpbnB1dC4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW5cbmRpc3BhdGNoaW5nIHRoZSBjdXN0b20gYmVoYXZpb3IgYXMgYSBzZXBhcmF0ZSB0cmFuc2FjdGlvbi5cbiovXG5FZGl0b3JWaWV3LmlucHV0SGFuZGxlciA9IGlucHV0SGFuZGxlcjtcbi8qKlxuVGhpcyBmYWNldCBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSBlZmZlY3RzXG50byBiZSBkaXNwYXRjaGVkIHdoZW4gdGhlIGVkaXRvcidzIGZvY3VzIHN0YXRlIGNoYW5nZXMuXG4qL1xuRWRpdG9yVmlldy5mb2N1c0NoYW5nZUVmZmVjdCA9IGZvY3VzQ2hhbmdlRWZmZWN0O1xuLyoqXG5CeSBkZWZhdWx0LCB0aGUgZWRpdG9yIGFzc3VtZXMgYWxsIGl0cyBjb250ZW50IGhhcyB0aGUgc2FtZVxuW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0aW9uKS4gQ29uZmlndXJlIHRoaXMgd2l0aCBhIGB0cnVlYFxudmFsdWUgdG8gbWFrZSBpdCByZWFkIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiBldmVyeSAocmVuZGVyZWQpXG5saW5lIHNlcGFyYXRlbHkuXG4qL1xuRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbiA9IHBlckxpbmVUZXh0RGlyZWN0aW9uO1xuLyoqXG5BbGxvd3MgeW91IHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGVcbmxpYnJhcnkgY2F0Y2hlcyBhbiBleGNlcHRpb24gZnJvbSBhbiBleHRlbnNpb24gKG1vc3RseSBmcm9tIHZpZXdcbnBsdWdpbnMsIGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlciBleHRlbnNpb25zIHRvIHJvdXRlIGV4Y2VwdGlvbnNcbmZyb20gdXNlci1jb2RlLXByb3ZpZGVkIGNhbGxiYWNrcykuIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3JcbmRlYnVnZ2luZyBhbmQgbG9nZ2luZy4gU2VlIFtgbG9nRXhjZXB0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmxvZ0V4Y2VwdGlvbikuXG4qL1xuRWRpdG9yVmlldy5leGNlcHRpb25TaW5rID0gZXhjZXB0aW9uU2luaztcbi8qKlxuQSBmYWNldCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG5ldmVyeSB0aW1lIHRoZSB2aWV3IHVwZGF0ZXMuXG4qL1xuRWRpdG9yVmlldy51cGRhdGVMaXN0ZW5lciA9IHVwZGF0ZUxpc3RlbmVyO1xuLyoqXG5GYWNldCB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGVkaXRvciBjb250ZW50IERPTSBpcyBlZGl0YWJsZS5cbldoZW4gaXRzIGhpZ2hlc3QtcHJlY2VkZW5jZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgZWxlbWVudCB3aWxsXG5ub3QgaGF2ZSBpdHMgYGNvbnRlbnRlZGl0YWJsZWAgYXR0cmlidXRlIHNldC4gKE5vdGUgdGhhdCB0aGlzXG5kb2Vzbid0IGFmZmVjdCBBUEkgY2FsbHMgdGhhdCBjaGFuZ2UgdGhlIGVkaXRvciBjb250ZW50LCBldmVuXG53aGVuIHRob3NlIGFyZSBib3VuZCB0byBrZXlzIG9yIGJ1dHRvbnMuIFNlZSB0aGVcbltgcmVhZE9ubHlgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnJlYWRPbmx5KSBmYWNldCBmb3IgdGhhdC4pXG4qL1xuRWRpdG9yVmlldy5lZGl0YWJsZSA9IGVkaXRhYmxlO1xuLyoqXG5BbGxvd3MgeW91IHRvIGluZmx1ZW5jZSB0aGUgd2F5IG1vdXNlIHNlbGVjdGlvbiBoYXBwZW5zLiBUaGVcbmZ1bmN0aW9ucyBpbiB0aGlzIGZhY2V0IHdpbGwgYmUgY2FsbGVkIGZvciBhIGBtb3VzZWRvd25gIGV2ZW50XG5vbiB0aGUgZWRpdG9yLCBhbmQgY2FuIHJldHVybiBhbiBvYmplY3QgdGhhdCBvdmVycmlkZXMgdGhlIHdheSBhXG5zZWxlY3Rpb24gaXMgY29tcHV0ZWQgZnJvbSB0aGF0IG1vdXNlIGNsaWNrIG9yIGRyYWcuXG4qL1xuRWRpdG9yVmlldy5tb3VzZVNlbGVjdGlvblN0eWxlID0gbW91c2VTZWxlY3Rpb25TdHlsZTtcbi8qKlxuRmFjZXQgdXNlZCB0byBjb25maWd1cmUgd2hldGhlciBhIGdpdmVuIHNlbGVjdGlvbiBkcmFnIGV2ZW50XG5zaG91bGQgbW92ZSBvciBjb3B5IHRoZSBzZWxlY3Rpb24uIFRoZSBnaXZlbiBwcmVkaWNhdGUgd2lsbCBiZVxuY2FsbGVkIHdpdGggdGhlIGBtb3VzZWRvd25gIGV2ZW50LCBhbmQgY2FuIHJldHVybiBgdHJ1ZWAgd2hlblxudGhlIGRyYWcgc2hvdWxkIG1vdmUgdGhlIGNvbnRlbnQuXG4qL1xuRWRpdG9yVmlldy5kcmFnTW92ZXNTZWxlY3Rpb24gPSBkcmFnTW92ZXNTZWxlY3Rpb24kMTtcbi8qKlxuRmFjZXQgdXNlZCB0byBjb25maWd1cmUgd2hldGhlciBhIGdpdmVuIHNlbGVjdGluZyBjbGljayBhZGRzIGFcbm5ldyByYW5nZSB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIG9yIHJlcGxhY2VzIGl0IGVudGlyZWx5LiBUaGVcbmRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2hlY2sgYGV2ZW50Lm1ldGFLZXlgIG9uIG1hY09TLCBhbmRcbmBldmVudC5jdHJsS2V5YCBlbHNld2hlcmUuXG4qL1xuRWRpdG9yVmlldy5jbGlja0FkZHNTZWxlY3Rpb25SYW5nZSA9IGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlO1xuLyoqXG5BIGZhY2V0IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBbZGVjb3JhdGlvbnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uKVxuYXJlIHNob3duIGluIHRoZSB2aWV3LiBEZWNvcmF0aW9ucyBjYW4gYmUgcHJvdmlkZWQgaW4gdHdvXG53YXlzXHUyMDE0ZGlyZWN0bHksIG9yIHZpYSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gZWRpdG9yIHZpZXcuXG5cbk9ubHkgZGVjb3JhdGlvbiBzZXRzIHByb3ZpZGVkIGRpcmVjdGx5IGFyZSBhbGxvd2VkIHRvIGluZmx1ZW5jZVxudGhlIGVkaXRvcidzIHZlcnRpY2FsIGxheW91dCBzdHJ1Y3R1cmUuIFRoZSBvbmVzIHByb3ZpZGVkIGFzXG5mdW5jdGlvbnMgYXJlIGNhbGxlZCBfYWZ0ZXJfIHRoZSBuZXcgdmlld3BvcnQgaGFzIGJlZW4gY29tcHV0ZWQsXG5hbmQgdGh1cyAqKm11c3Qgbm90KiogaW50cm9kdWNlIGJsb2NrIHdpZGdldHMgb3IgcmVwbGFjaW5nXG5kZWNvcmF0aW9ucyB0aGF0IGNvdmVyIGxpbmUgYnJlYWtzLlxuXG5JZiB5b3Ugd2FudCBkZWNvcmF0ZWQgcmFuZ2VzIHRvIGJlaGF2ZSBsaWtlIGF0b21pYyB1bml0cyBmb3JcbmN1cnNvciBtb3Rpb24gYW5kIGRlbGV0aW9uIHB1cnBvc2VzLCBhbHNvIHByb3ZpZGUgdGhlIHJhbmdlIHNldFxuY29udGFpbmluZyB0aGUgZGVjb3JhdGlvbnMgdG9cbltgRWRpdG9yVmlldy5hdG9taWNSYW5nZXNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15hdG9taWNSYW5nZXMpLlxuKi9cbkVkaXRvclZpZXcuZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9ucztcbi8qKlxuRmFjZXQgdGhhdCB3b3JrcyBtdWNoIGxpa2VcbltgZGVjb3JhdGlvbnNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kZWNvcmF0aW9ucyksIGJ1dCBwdXRzIGl0c1xuaW5wdXRzIGF0IHRoZSB2ZXJ5IGJvdHRvbSBvZiB0aGUgcHJlY2VkZW5jZSBzdGFjaywgbWVhbmluZyBtYXJrXG5kZWNvcmF0aW9ucyBwcm92aWRlZCBoZXJlIHdpbGwgb25seSBiZSBzcGxpdCBieSBvdGhlciwgcGFydGlhbGx5XG5vdmVybGFwcGluZyBcXGBvdXRlckRlY29yYXRpb25zXFxgIHJhbmdlcywgYW5kIHdyYXAgYXJvdW5kIGFsbFxucmVndWxhciBkZWNvcmF0aW9ucy4gVXNlIHRoaXMgZm9yIG1hcmsgZWxlbWVudHMgdGhhdCBzaG91bGQsIGFzXG5tdWNoIGFzIHBvc3NpYmxlLCByZW1haW4gaW4gb25lIHBpZWNlLlxuKi9cbkVkaXRvclZpZXcub3V0ZXJEZWNvcmF0aW9ucyA9IG91dGVyRGVjb3JhdGlvbnM7XG4vKipcblVzZWQgdG8gcHJvdmlkZSByYW5nZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhdG9tcyBhcyBmYXIgYXNcbmN1cnNvciBtb3Rpb24gaXMgY29uY2VybmVkLiBUaGlzIGNhdXNlcyBtZXRob2RzIGxpa2VcbltgbW92ZUJ5Q2hhcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVCeUNoYXIpIGFuZFxuW2Btb3ZlVmVydGljYWxseWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVWZXJ0aWNhbGx5KSAoYW5kIHRoZVxuY29tbWFuZHMgYnVpbHQgb24gdG9wIG9mIHRoZW0pIHRvIHNraXAgYWNyb3NzIHN1Y2ggcmVnaW9ucyB3aGVuXG5hIHNlbGVjdGlvbiBlbmRwb2ludCB3b3VsZCBlbnRlciB0aGVtLiBUaGlzIGRvZXMgX25vdF8gcHJldmVudFxuZGlyZWN0IHByb2dyYW1tYXRpYyBbc2VsZWN0aW9uXG51cGRhdGVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZWxlY3Rpb24pIGZyb20gbW92aW5nIGludG8gc3VjaFxucmVnaW9ucy5cbiovXG5FZGl0b3JWaWV3LmF0b21pY1JhbmdlcyA9IGF0b21pY1Jhbmdlcztcbi8qKlxuV2hlbiByYW5nZSBkZWNvcmF0aW9ucyBhZGQgYSBgdW5pY29kZS1iaWRpOiBpc29sYXRlYCBzdHlsZSwgdGhleVxuc2hvdWxkIGFsc28gaW5jbHVkZSBhXG5bYGJpZGlJc29sYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3Lk1hcmtEZWNvcmF0aW9uU3BlYy5iaWRpSXNvbGF0ZSkgcHJvcGVydHlcbmluIHRoZWlyIGRlY29yYXRpb24gc3BlYywgYW5kIGJlIGV4cG9zZWQgdGhyb3VnaCB0aGlzIGZhY2V0LCBzb1xudGhhdCB0aGUgZWRpdG9yIGNhbiBjb21wdXRlIHRoZSBwcm9wZXIgdGV4dCBvcmRlci4gKE90aGVyIHZhbHVlc1xuZm9yIGB1bmljb2RlLWJpZGlgLCBleGNlcHQgb2YgY291cnNlIGBub3JtYWxgLCBhcmUgbm90XG5zdXBwb3J0ZWQuKVxuKi9cbkVkaXRvclZpZXcuYmlkaUlzb2xhdGVkUmFuZ2VzID0gYmlkaUlzb2xhdGVkUmFuZ2VzO1xuLyoqXG5GYWNldCB0aGF0IGFsbG93cyBleHRlbnNpb25zIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBzY3JvbGxcbm1hcmdpbnMgKHNwYWNlIGFyb3VuZCB0aGUgc2lkZXMgb2YgdGhlIHNjcm9sbGluZyBlbGVtZW50IHRoYXRcbnNob3VsZCBiZSBjb25zaWRlcmVkIGludmlzaWJsZSkuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZVxucGx1Z2luIGludHJvZHVjZXMgZWxlbWVudHMgdGhhdCBjb3ZlciBwYXJ0IG9mIHRoYXQgZWxlbWVudCAoZm9yXG5leGFtcGxlIGEgaG9yaXpvbnRhbGx5IGZpeGVkIGd1dHRlcikuXG4qL1xuRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zID0gc2Nyb2xsTWFyZ2lucztcbi8qKlxuVGhpcyBmYWNldCByZWNvcmRzIHdoZXRoZXIgYSBkYXJrIHRoZW1lIGlzIGFjdGl2ZS4gVGhlIGV4dGVuc2lvblxucmV0dXJuZWQgYnkgW2B0aGVtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnRoZW1lKSBhdXRvbWF0aWNhbGx5XG5pbmNsdWRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIHdoZW4gdGhlIGBkYXJrYCBvcHRpb24gaXMgc2V0IHRvXG50cnVlLlxuKi9cbkVkaXRvclZpZXcuZGFya1RoZW1lID0gZGFya1RoZW1lO1xuLyoqXG5Qcm92aWRlcyBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IG5vbmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nXG50aGUgc3R5bGUgc2hlZXRzIGZvciB0aGUgZWRpdG9yLiBIb2xkcyB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gbm9cbm5vbmNlIGhhcyBiZWVuIHByb3ZpZGVkLlxuKi9cbkVkaXRvclZpZXcuY3NwTm9uY2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiBcIlwiIH0pO1xuLyoqXG5GYWNldCB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgRE9NIGF0dHJpYnV0ZXMgZm9yIHRoZSBlZGl0b3Inc1xuZWRpdGFibGUgRE9NIGVsZW1lbnQuXG4qL1xuRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcyA9IGNvbnRlbnRBdHRyaWJ1dGVzO1xuLyoqXG5GYWNldCB0aGF0IHByb3ZpZGVzIERPTSBhdHRyaWJ1dGVzIGZvciB0aGUgZWRpdG9yJ3Mgb3V0ZXJcbmVsZW1lbnQuXG4qL1xuRWRpdG9yVmlldy5lZGl0b3JBdHRyaWJ1dGVzID0gZWRpdG9yQXR0cmlidXRlcztcbi8qKlxuQW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBsaW5lIHdyYXBwaW5nIGluIHRoZSBlZGl0b3IgKGJ5XG5zZXR0aW5nIENTUyBgd2hpdGUtc3BhY2VgIHRvIGBwcmUtd3JhcGAgaW4gdGhlIGNvbnRlbnQpLlxuKi9cbkVkaXRvclZpZXcubGluZVdyYXBwaW5nID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMub2YoeyBcImNsYXNzXCI6IFwiY20tbGluZVdyYXBwaW5nXCIgfSk7XG4vKipcblN0YXRlIGVmZmVjdCB1c2VkIHRvIGluY2x1ZGUgc2NyZWVuIHJlYWRlciBhbm5vdW5jZW1lbnRzIGluIGFcbnRyYW5zYWN0aW9uLiBUaGVzZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBET00gaW4gYSB2aXN1YWxseSBoaWRkZW5cbmVsZW1lbnQgd2l0aCBgYXJpYS1saXZlPVwicG9saXRlXCJgIHNldCwgYW5kIHNob3VsZCBiZSB1c2VkIHRvXG5kZXNjcmliZSBlZmZlY3RzIHRoYXQgYXJlIHZpc3VhbGx5IG9idmlvdXMgYnV0IG1heSBub3QgYmVcbm5vdGljZWQgYnkgc2NyZWVuIHJlYWRlciB1c2VycyAoc3VjaCBhcyBtb3ZpbmcgdG8gdGhlIG5leHRcbnNlYXJjaCBtYXRjaCkuXG4qL1xuRWRpdG9yVmlldy5hbm5vdW5jZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8vIE1heGltdW0gbGluZSBsZW5ndGggZm9yIHdoaWNoIHdlIGNvbXB1dGUgYWNjdXJhdGUgYmlkaSBpbmZvXG5jb25zdCBNYXhCaWRpTGluZSA9IDQwOTY7XG5jb25zdCBCYWRNZWFzdXJlID0ge307XG5jbGFzcyBDYWNoZWRPcmRlciB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8sIGRpciwgaXNvbGF0ZXMsIGZyZXNoLCBvcmRlcikge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuZGlyID0gZGlyO1xuICAgICAgICB0aGlzLmlzb2xhdGVzID0gaXNvbGF0ZXM7XG4gICAgICAgIHRoaXMuZnJlc2ggPSBmcmVzaDtcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgIH1cbiAgICBzdGF0aWMgdXBkYXRlKGNhY2hlLCBjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmVtcHR5ICYmICFjYWNoZS5zb21lKGMgPT4gYy5mcmVzaCkpXG4gICAgICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXSwgbGFzdERpciA9IGNhY2hlLmxlbmd0aCA/IGNhY2hlW2NhY2hlLmxlbmd0aCAtIDFdLmRpciA6IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1heCgwLCBjYWNoZS5sZW5ndGggLSAxMCk7IGkgPCBjYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gY2FjaGVbaV07XG4gICAgICAgICAgICBpZiAoZW50cnkuZGlyID09IGxhc3REaXIgJiYgIWNoYW5nZXMudG91Y2hlc1JhbmdlKGVudHJ5LmZyb20sIGVudHJ5LnRvKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgQ2FjaGVkT3JkZXIoY2hhbmdlcy5tYXBQb3MoZW50cnkuZnJvbSwgMSksIGNoYW5nZXMubWFwUG9zKGVudHJ5LnRvLCAtMSksIGVudHJ5LmRpciwgZW50cnkuaXNvbGF0ZXMsIGZhbHNlLCBlbnRyeS5vcmRlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gYXR0cnNGcm9tRmFjZXQodmlldywgZmFjZXQsIGJhc2UpIHtcbiAgICBmb3IgKGxldCBzb3VyY2VzID0gdmlldy5zdGF0ZS5mYWNldChmYWNldCksIGkgPSBzb3VyY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzW2ldLCB2YWx1ZSA9IHR5cGVvZiBzb3VyY2UgPT0gXCJmdW5jdGlvblwiID8gc291cmNlKHZpZXcpIDogc291cmNlO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICBjb21iaW5lQXR0cnModmFsdWUsIGJhc2UpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbn1cblxuY29uc3QgY3VycmVudFBsYXRmb3JtID0gYnJvd3Nlci5tYWMgPyBcIm1hY1wiIDogYnJvd3Nlci53aW5kb3dzID8gXCJ3aW5cIiA6IGJyb3dzZXIubGludXggPyBcImxpbnV4XCIgOiBcImtleVwiO1xuZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lLCBwbGF0Zm9ybSkge1xuICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLyk7XG4gICAgbGV0IHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChyZXN1bHQgPT0gXCJTcGFjZVwiKVxuICAgICAgICByZXN1bHQgPSBcIiBcIjtcbiAgICBsZXQgYWx0LCBjdHJsLCBzaGlmdCwgbWV0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBjb25zdCBtb2QgPSBwYXJ0c1tpXTtcbiAgICAgICAgaWYgKC9eKGNtZHxtZXRhfG0pJC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXmEobHQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBhbHQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgY3RybCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ecyhoaWZ0KT8kL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgc2hpZnQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXm1vZCQvaS50ZXN0KG1vZCkpIHtcbiAgICAgICAgICAgIGlmIChwbGF0Zm9ybSA9PSBcIm1hY1wiKVxuICAgICAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGN0cmwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCk7XG4gICAgfVxuICAgIGlmIChhbHQpXG4gICAgICAgIHJlc3VsdCA9IFwiQWx0LVwiICsgcmVzdWx0O1xuICAgIGlmIChjdHJsKVxuICAgICAgICByZXN1bHQgPSBcIkN0cmwtXCIgKyByZXN1bHQ7XG4gICAgaWYgKG1ldGEpXG4gICAgICAgIHJlc3VsdCA9IFwiTWV0YS1cIiArIHJlc3VsdDtcbiAgICBpZiAoc2hpZnQpXG4gICAgICAgIHJlc3VsdCA9IFwiU2hpZnQtXCIgKyByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZGlmaWVycyhuYW1lLCBldmVudCwgc2hpZnQpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICBuYW1lID0gXCJBbHQtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSlcbiAgICAgICAgbmFtZSA9IFwiTWV0YS1cIiArIG5hbWU7XG4gICAgaWYgKHNoaWZ0ICE9PSBmYWxzZSAmJiBldmVudC5zaGlmdEtleSlcbiAgICAgICAgbmFtZSA9IFwiU2hpZnQtXCIgKyBuYW1lO1xuICAgIHJldHVybiBuYW1lO1xufVxuY29uc3QgaGFuZGxlS2V5RXZlbnRzID0gLypAX19QVVJFX18qL1ByZWMuZGVmYXVsdCgvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5kb21FdmVudEhhbmRsZXJzKHtcbiAgICBrZXlkb3duKGV2ZW50LCB2aWV3KSB7XG4gICAgICAgIHJldHVybiBydW5IYW5kbGVycyhnZXRLZXltYXAodmlldy5zdGF0ZSksIGV2ZW50LCB2aWV3LCBcImVkaXRvclwiKTtcbiAgICB9XG59KSk7XG4vKipcbkZhY2V0IHVzZWQgZm9yIHJlZ2lzdGVyaW5nIGtleW1hcHMuXG5cbllvdSBjYW4gYWRkIG11bHRpcGxlIGtleW1hcHMgdG8gYW4gZWRpdG9yLiBUaGVpciBwcmlvcml0aWVzXG5kZXRlcm1pbmUgdGhlaXIgcHJlY2VkZW5jZSAodGhlIG9uZXMgc3BlY2lmaWVkIGVhcmx5IG9yIHdpdGggaGlnaFxucHJpb3JpdHkgZ2V0IGNoZWNrZWQgZmlyc3QpLiBXaGVuIGEgaGFuZGxlciBoYXMgcmV0dXJuZWQgYHRydWVgXG5mb3IgYSBnaXZlbiBrZXksIG5vIGZ1cnRoZXIgaGFuZGxlcnMgYXJlIGNhbGxlZC5cbiovXG5jb25zdCBrZXltYXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgZW5hYmxlczogaGFuZGxlS2V5RXZlbnRzIH0pO1xuY29uc3QgS2V5bWFwcyA9IC8qQF9fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuLy8gVGhpcyBpcyBoaWRkZW4gYmVoaW5kIGFuIGluZGlyZWN0aW9uLCByYXRoZXIgdGhhbiBkaXJlY3RseSBjb21wdXRlZFxuLy8gYnkgdGhlIGZhY2V0LCB0byBrZWVwIGludGVybmFsIHR5cGVzIG91dCBvZiB0aGUgZmFjZXQncyB0eXBlLlxuZnVuY3Rpb24gZ2V0S2V5bWFwKHN0YXRlKSB7XG4gICAgbGV0IGJpbmRpbmdzID0gc3RhdGUuZmFjZXQoa2V5bWFwKTtcbiAgICBsZXQgbWFwID0gS2V5bWFwcy5nZXQoYmluZGluZ3MpO1xuICAgIGlmICghbWFwKVxuICAgICAgICBLZXltYXBzLnNldChiaW5kaW5ncywgbWFwID0gYnVpbGRLZXltYXAoYmluZGluZ3MucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pKSk7XG4gICAgcmV0dXJuIG1hcDtcbn1cbi8qKlxuUnVuIHRoZSBrZXkgaGFuZGxlcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBzY29wZS4gVGhlIGV2ZW50XG5vYmplY3Qgc2hvdWxkIGJlIGEgYFwia2V5ZG93blwiYCBldmVudC4gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGVcbmhhbmRsZXJzIGhhbmRsZWQgaXQuXG4qL1xuZnVuY3Rpb24gcnVuU2NvcGVIYW5kbGVycyh2aWV3LCBldmVudCwgc2NvcGUpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlcnMoZ2V0S2V5bWFwKHZpZXcuc3RhdGUpLCBldmVudCwgdmlldywgc2NvcGUpO1xufVxubGV0IHN0b3JlZFByZWZpeCA9IG51bGw7XG5jb25zdCBQcmVmaXhUaW1lb3V0ID0gNDAwMDtcbmZ1bmN0aW9uIGJ1aWxkS2V5bWFwKGJpbmRpbmdzLCBwbGF0Zm9ybSA9IGN1cnJlbnRQbGF0Zm9ybSkge1xuICAgIGxldCBib3VuZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGlzUHJlZml4ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY2hlY2tQcmVmaXggPSAobmFtZSwgaXMpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBpc1ByZWZpeFtuYW1lXTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbClcbiAgICAgICAgICAgIGlzUHJlZml4W25hbWVdID0gaXM7XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgIT0gaXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJLZXkgYmluZGluZyBcIiArIG5hbWUgKyBcIiBpcyB1c2VkIGJvdGggYXMgYSByZWd1bGFyIGJpbmRpbmcgYW5kIGFzIGEgbXVsdGktc3Ryb2tlIHByZWZpeFwiKTtcbiAgICB9O1xuICAgIGxldCBhZGQgPSAoc2NvcGUsIGtleSwgY29tbWFuZCwgcHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbikgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBsZXQgc2NvcGVPYmogPSBib3VuZFtzY29wZV0gfHwgKGJvdW5kW3Njb3BlXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICBsZXQgcGFydHMgPSBrZXkuc3BsaXQoLyAoPyEkKS8pLm1hcChrID0+IG5vcm1hbGl6ZUtleU5hbWUoaywgcGxhdGZvcm0pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHByZWZpeCA9IHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY2hlY2tQcmVmaXgocHJlZml4LCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVPYmpbcHJlZml4XSlcbiAgICAgICAgICAgICAgICBzY29wZU9ialtwcmVmaXhdID0ge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBbKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3VyT2JqID0gc3RvcmVkUHJlZml4ID0geyB2aWV3LCBwcmVmaXgsIHNjb3BlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdG9yZWRQcmVmaXggPT0gb3VyT2JqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRQcmVmaXggPSBudWxsOyB9LCBQcmVmaXhUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZnVsbCA9IHBhcnRzLmpvaW4oXCIgXCIpO1xuICAgICAgICBjaGVja1ByZWZpeChmdWxsLCBmYWxzZSk7XG4gICAgICAgIGxldCBiaW5kaW5nID0gc2NvcGVPYmpbZnVsbF0gfHwgKHNjb3BlT2JqW2Z1bGxdID0ge1xuICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIHJ1bjogKChfYiA9IChfYSA9IHNjb3BlT2JqLl9hbnkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ydW4pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zbGljZSgpKSB8fCBbXVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbW1hbmQpXG4gICAgICAgICAgICBiaW5kaW5nLnJ1bi5wdXNoKGNvbW1hbmQpO1xuICAgICAgICBpZiAocHJldmVudERlZmF1bHQpXG4gICAgICAgICAgICBiaW5kaW5nLnByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgIGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICB9O1xuICAgIGZvciAobGV0IGIgb2YgYmluZGluZ3MpIHtcbiAgICAgICAgbGV0IHNjb3BlcyA9IGIuc2NvcGUgPyBiLnNjb3BlLnNwbGl0KFwiIFwiKSA6IFtcImVkaXRvclwiXTtcbiAgICAgICAgaWYgKGIuYW55KVxuICAgICAgICAgICAgZm9yIChsZXQgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNjb3BlT2JqID0gYm91bmRbc2NvcGVdIHx8IChib3VuZFtzY29wZV0gPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlT2JqLl9hbnkpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlT2JqLl9hbnkgPSB7IHByZXZlbnREZWZhdWx0OiBmYWxzZSwgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSwgcnVuOiBbXSB9O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBzY29wZU9iailcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVPYmpba2V5XS5ydW4ucHVzaChiLmFueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBuYW1lID0gYltwbGF0Zm9ybV0gfHwgYi5rZXk7XG4gICAgICAgIGlmICghbmFtZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgICAgICAgIGFkZChzY29wZSwgbmFtZSwgYi5ydW4sIGIucHJldmVudERlZmF1bHQsIGIuc3RvcFByb3BhZ2F0aW9uKTtcbiAgICAgICAgICAgIGlmIChiLnNoaWZ0KVxuICAgICAgICAgICAgICAgIGFkZChzY29wZSwgXCJTaGlmdC1cIiArIG5hbWUsIGIuc2hpZnQsIGIucHJldmVudERlZmF1bHQsIGIuc3RvcFByb3BhZ2F0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYm91bmQ7XG59XG5mdW5jdGlvbiBydW5IYW5kbGVycyhtYXAsIGV2ZW50LCB2aWV3LCBzY29wZSkge1xuICAgIGxldCBuYW1lID0ga2V5TmFtZShldmVudCk7XG4gICAgbGV0IGNoYXJDb2RlID0gY29kZVBvaW50QXQobmFtZSwgMCksIGlzQ2hhciA9IGNvZGVQb2ludFNpemUoY2hhckNvZGUpID09IG5hbWUubGVuZ3RoICYmIG5hbWUgIT0gXCIgXCI7XG4gICAgbGV0IHByZWZpeCA9IFwiXCIsIGhhbmRsZWQgPSBmYWxzZSwgcHJldmVudGVkID0gZmFsc2UsIHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlO1xuICAgIGlmIChzdG9yZWRQcmVmaXggJiYgc3RvcmVkUHJlZml4LnZpZXcgPT0gdmlldyAmJiBzdG9yZWRQcmVmaXguc2NvcGUgPT0gc2NvcGUpIHtcbiAgICAgICAgcHJlZml4ID0gc3RvcmVkUHJlZml4LnByZWZpeCArIFwiIFwiO1xuICAgICAgICBpZiAobW9kaWZpZXJDb2Rlcy5pbmRleE9mKGV2ZW50LmtleUNvZGUpIDwgMCkge1xuICAgICAgICAgICAgcHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0b3JlZFByZWZpeCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJhbiA9IG5ldyBTZXQ7XG4gICAgbGV0IHJ1bkZvciA9IChiaW5kaW5nKSA9PiB7XG4gICAgICAgIGlmIChiaW5kaW5nKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjbWQgb2YgYmluZGluZy5ydW4pXG4gICAgICAgICAgICAgICAgaWYgKCFyYW4uaGFzKGNtZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuLmFkZChjbWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY21kKHZpZXcsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaW5kaW5nLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgbGV0IHNjb3BlT2JqID0gbWFwW3Njb3BlXSwgYmFzZU5hbWUsIHNoaWZ0TmFtZTtcbiAgICBpZiAoc2NvcGVPYmopIHtcbiAgICAgICAgaWYgKHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMobmFtZSwgZXZlbnQsICFpc0NoYXIpXSkpIHtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ2hhciAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcbiAgICAgICAgICAgIC8vIEN0cmwtQWx0IG1heSBiZSB1c2VkIGZvciBBbHRHciBvbiBXaW5kb3dzXG4gICAgICAgICAgICAhKGJyb3dzZXIud2luZG93cyAmJiBldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSkgJiZcbiAgICAgICAgICAgIChiYXNlTmFtZSA9IGJhc2VbZXZlbnQua2V5Q29kZV0pICYmIGJhc2VOYW1lICE9IG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKGJhc2VOYW1lLCBldmVudCwgdHJ1ZSldKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgKHNoaWZ0TmFtZSA9IHNoaWZ0W2V2ZW50LmtleUNvZGVdKSAhPSBuYW1lICYmIHNoaWZ0TmFtZSAhPSBiYXNlTmFtZSAmJlxuICAgICAgICAgICAgICAgIHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMoc2hpZnROYW1lLCBldmVudCwgZmFsc2UpXSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NoYXIgJiYgZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAgICAgICAgIHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMobmFtZSwgZXZlbnQsIHRydWUpXSkpIHtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFuZGxlZCAmJiBydW5Gb3Ioc2NvcGVPYmouX2FueSkpXG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByZXZlbnRlZClcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgaWYgKGhhbmRsZWQgJiYgc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm4gaGFuZGxlZDtcbn1cblxuLyoqXG5JbXBsZW1lbnRhdGlvbiBvZiBbYExheWVyTWFya2VyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkxheWVyTWFya2VyKSB0aGF0IGNyZWF0ZXNcbmEgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gc2V0IG9mIGNvb3JkaW5hdGVzLlxuKi9cbmNsYXNzIFJlY3RhbmdsZU1hcmtlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFya2VyIHdpdGggdGhlIGdpdmVuIGNsYXNzIGFuZCBkaW1lbnNpb25zLiBJZiBgd2lkdGhgXG4gICAgaXMgbnVsbCwgdGhlIERPTSBlbGVtZW50IHdpbGwgZ2V0IG5vIHdpZHRoIHN0eWxlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY2xhc3NOYW1lLCBcbiAgICAvKipcbiAgICBUaGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIChpbiBwaXhlbHMsIGRvY3VtZW50LXJlbGF0aXZlKS5cbiAgICAqL1xuICAgIGxlZnQsIFxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIG1hcmtlci5cbiAgICAqL1xuICAgIHRvcCwgXG4gICAgLyoqXG4gICAgVGhlIHdpZHRoIG9mIHRoZSBtYXJrZXIsIG9yIG51bGwgaWYgaXQgc2hvdWxkbid0IGdldCBhIHdpZHRoIGFzc2lnbmVkLlxuICAgICovXG4gICAgd2lkdGgsIFxuICAgIC8qKlxuICAgIFRoZSBoZWlnaHQgb2YgdGhlIG1hcmtlci5cbiAgICAqL1xuICAgIGhlaWdodCkge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbHQuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgICAgIHRoaXMuYWRqdXN0KGVsdCk7XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIHVwZGF0ZShlbHQsIHByZXYpIHtcbiAgICAgICAgaWYgKHByZXYuY2xhc3NOYW1lICE9IHRoaXMuY2xhc3NOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmFkanVzdChlbHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYWRqdXN0KGVsdCkge1xuICAgICAgICBlbHQuc3R5bGUubGVmdCA9IHRoaXMubGVmdCArIFwicHhcIjtcbiAgICAgICAgZWx0LnN0eWxlLnRvcCA9IHRoaXMudG9wICsgXCJweFwiO1xuICAgICAgICBpZiAodGhpcy53aWR0aCAhPSBudWxsKVxuICAgICAgICAgICAgZWx0LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcbiAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgXCJweFwiO1xuICAgIH1cbiAgICBlcShwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZnQgPT0gcC5sZWZ0ICYmIHRoaXMudG9wID09IHAudG9wICYmIHRoaXMud2lkdGggPT0gcC53aWR0aCAmJiB0aGlzLmhlaWdodCA9PSBwLmhlaWdodCAmJlxuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPT0gcC5jbGFzc05hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNldCBvZiByZWN0YW5nbGVzIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHJhbmdlLFxuICAgIGFzc2lnbmluZyB0aGVtIHRoZWNsYXNzYGNsYXNzTmFtZWAuIFdpbGwgY3JlYXRlIGEgc2luZ2xlXG4gICAgcmVjdGFuZ2xlIGZvciBlbXB0eSByYW5nZXMsIGFuZCBhIHNldCBvZiBzZWxlY3Rpb24tc3R5bGVcbiAgICByZWN0YW5nbGVzIGNvdmVyaW5nIHRoZSByYW5nZSdzIGNvbnRlbnQgKGluIGEgYmlkaS1hd2FyZVxuICAgIHdheSkgZm9yIG5vbi1lbXB0eSBvbmVzLlxuICAgICovXG4gICAgc3RhdGljIGZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gdmlldy5jb29yZHNBdFBvcyhyYW5nZS5oZWFkLCByYW5nZS5hc3NvYyB8fCAxKTtcbiAgICAgICAgICAgIGlmICghcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGxldCBiYXNlID0gZ2V0QmFzZSh2aWV3KTtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFJlY3RhbmdsZU1hcmtlcihjbGFzc05hbWUsIHBvcy5sZWZ0IC0gYmFzZS5sZWZ0LCBwb3MudG9wIC0gYmFzZS50b3AsIG51bGwsIHBvcy5ib3R0b20gLSBwb3MudG9wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjdGFuZ2xlc0ZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QmFzZSh2aWV3KSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgbGVmdCA9IHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodCAtIHZpZXcuc2Nyb2xsRE9NLmNsaWVudFdpZHRoICogdmlldy5zY2FsZVg7XG4gICAgcmV0dXJuIHsgbGVmdDogbGVmdCAtIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgKiB2aWV3LnNjYWxlWCwgdG9wOiByZWN0LnRvcCAtIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHZpZXcuc2NhbGVZIH07XG59XG5mdW5jdGlvbiB3cmFwcGVkTGluZSh2aWV3LCBwb3MsIGluc2lkZSkge1xuICAgIGxldCByYW5nZSA9IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zKTtcbiAgICByZXR1cm4geyBmcm9tOiBNYXRoLm1heChpbnNpZGUuZnJvbSwgdmlldy5tb3ZlVG9MaW5lQm91bmRhcnkocmFuZ2UsIGZhbHNlLCB0cnVlKS5mcm9tKSxcbiAgICAgICAgdG86IE1hdGgubWluKGluc2lkZS50bywgdmlldy5tb3ZlVG9MaW5lQm91bmRhcnkocmFuZ2UsIHRydWUsIHRydWUpLmZyb20pLFxuICAgICAgICB0eXBlOiBCbG9ja1R5cGUuVGV4dCB9O1xufVxuZnVuY3Rpb24gcmVjdGFuZ2xlc0ZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpIHtcbiAgICBpZiAocmFuZ2UudG8gPD0gdmlldy52aWV3cG9ydC5mcm9tIHx8IHJhbmdlLmZyb20gPj0gdmlldy52aWV3cG9ydC50bylcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIGxldCBmcm9tID0gTWF0aC5tYXgocmFuZ2UuZnJvbSwgdmlldy52aWV3cG9ydC5mcm9tKSwgdG8gPSBNYXRoLm1pbihyYW5nZS50bywgdmlldy52aWV3cG9ydC50byk7XG4gICAgbGV0IGx0ciA9IHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgIGxldCBjb250ZW50ID0gdmlldy5jb250ZW50RE9NLCBjb250ZW50UmVjdCA9IGNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGJhc2UgPSBnZXRCYXNlKHZpZXcpO1xuICAgIGxldCBsaW5lRWx0ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLmNtLWxpbmVcIiksIGxpbmVTdHlsZSA9IGxpbmVFbHQgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUobGluZUVsdCk7XG4gICAgbGV0IGxlZnRTaWRlID0gY29udGVudFJlY3QubGVmdCArXG4gICAgICAgIChsaW5lU3R5bGUgPyBwYXJzZUludChsaW5lU3R5bGUucGFkZGluZ0xlZnQpICsgTWF0aC5taW4oMCwgcGFyc2VJbnQobGluZVN0eWxlLnRleHRJbmRlbnQpKSA6IDApO1xuICAgIGxldCByaWdodFNpZGUgPSBjb250ZW50UmVjdC5yaWdodCAtIChsaW5lU3R5bGUgPyBwYXJzZUludChsaW5lU3R5bGUucGFkZGluZ1JpZ2h0KSA6IDApO1xuICAgIGxldCBzdGFydEJsb2NrID0gYmxvY2tBdCh2aWV3LCBmcm9tKSwgZW5kQmxvY2sgPSBibG9ja0F0KHZpZXcsIHRvKTtcbiAgICBsZXQgdmlzdWFsU3RhcnQgPSBzdGFydEJsb2NrLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQgPyBzdGFydEJsb2NrIDogbnVsbDtcbiAgICBsZXQgdmlzdWFsRW5kID0gZW5kQmxvY2sudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCA/IGVuZEJsb2NrIDogbnVsbDtcbiAgICBpZiAodmlzdWFsU3RhcnQgJiYgKHZpZXcubGluZVdyYXBwaW5nIHx8IHN0YXJ0QmxvY2sud2lkZ2V0TGluZUJyZWFrcykpXG4gICAgICAgIHZpc3VhbFN0YXJ0ID0gd3JhcHBlZExpbmUodmlldywgZnJvbSwgdmlzdWFsU3RhcnQpO1xuICAgIGlmICh2aXN1YWxFbmQgJiYgKHZpZXcubGluZVdyYXBwaW5nIHx8IGVuZEJsb2NrLndpZGdldExpbmVCcmVha3MpKVxuICAgICAgICB2aXN1YWxFbmQgPSB3cmFwcGVkTGluZSh2aWV3LCB0bywgdmlzdWFsRW5kKTtcbiAgICBpZiAodmlzdWFsU3RhcnQgJiYgdmlzdWFsRW5kICYmIHZpc3VhbFN0YXJ0LmZyb20gPT0gdmlzdWFsRW5kLmZyb20pIHtcbiAgICAgICAgcmV0dXJuIHBpZWNlcyhkcmF3Rm9yTGluZShyYW5nZS5mcm9tLCByYW5nZS50bywgdmlzdWFsU3RhcnQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCB0b3AgPSB2aXN1YWxTdGFydCA/IGRyYXdGb3JMaW5lKHJhbmdlLmZyb20sIG51bGwsIHZpc3VhbFN0YXJ0KSA6IGRyYXdGb3JXaWRnZXQoc3RhcnRCbG9jaywgZmFsc2UpO1xuICAgICAgICBsZXQgYm90dG9tID0gdmlzdWFsRW5kID8gZHJhd0ZvckxpbmUobnVsbCwgcmFuZ2UudG8sIHZpc3VhbEVuZCkgOiBkcmF3Rm9yV2lkZ2V0KGVuZEJsb2NrLCB0cnVlKTtcbiAgICAgICAgbGV0IGJldHdlZW4gPSBbXTtcbiAgICAgICAgaWYgKCh2aXN1YWxTdGFydCB8fCBzdGFydEJsb2NrKS50byA8ICh2aXN1YWxFbmQgfHwgZW5kQmxvY2spLmZyb20gLSAodmlzdWFsU3RhcnQgJiYgdmlzdWFsRW5kID8gMSA6IDApIHx8XG4gICAgICAgICAgICBzdGFydEJsb2NrLndpZGdldExpbmVCcmVha3MgPiAxICYmIHRvcC5ib3R0b20gKyB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC8gMiA8IGJvdHRvbS50b3ApXG4gICAgICAgICAgICBiZXR3ZWVuLnB1c2gocGllY2UobGVmdFNpZGUsIHRvcC5ib3R0b20sIHJpZ2h0U2lkZSwgYm90dG9tLnRvcCkpO1xuICAgICAgICBlbHNlIGlmICh0b3AuYm90dG9tIDwgYm90dG9tLnRvcCAmJiB2aWV3LmVsZW1lbnRBdEhlaWdodCgodG9wLmJvdHRvbSArIGJvdHRvbS50b3ApIC8gMikudHlwZSA9PSBCbG9ja1R5cGUuVGV4dClcbiAgICAgICAgICAgIHRvcC5ib3R0b20gPSBib3R0b20udG9wID0gKHRvcC5ib3R0b20gKyBib3R0b20udG9wKSAvIDI7XG4gICAgICAgIHJldHVybiBwaWVjZXModG9wKS5jb25jYXQoYmV0d2VlbikuY29uY2F0KHBpZWNlcyhib3R0b20pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGllY2UobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlTWFya2VyKGNsYXNzTmFtZSwgbGVmdCAtIGJhc2UubGVmdCwgdG9wIC0gYmFzZS50b3AgLSAwLjAxIC8qIEMuRXBzaWxvbiAqLywgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AgKyAwLjAxIC8qIEMuRXBzaWxvbiAqLyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpZWNlcyh7IHRvcCwgYm90dG9tLCBob3Jpem9udGFsIH0pIHtcbiAgICAgICAgbGV0IHBpZWNlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvcml6b250YWwubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgICAgICBwaWVjZXMucHVzaChwaWVjZShob3Jpem9udGFsW2ldLCB0b3AsIGhvcml6b250YWxbaSArIDFdLCBib3R0b20pKTtcbiAgICAgICAgcmV0dXJuIHBpZWNlcztcbiAgICB9XG4gICAgLy8gR2V0cyBwYXNzZWQgZnJvbS90byBpbiBsaW5lLWxvY2FsIHBvc2l0aW9uc1xuICAgIGZ1bmN0aW9uIGRyYXdGb3JMaW5lKGZyb20sIHRvLCBsaW5lKSB7XG4gICAgICAgIGxldCB0b3AgPSAxZTksIGJvdHRvbSA9IC0xZTksIGhvcml6b250YWwgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkU3Bhbihmcm9tLCBmcm9tT3BlbiwgdG8sIHRvT3BlbiwgZGlyKSB7XG4gICAgICAgICAgICAvLyBQYXNzaW5nIDIvLTIgaXMgYSBrbHVkZ2UgdG8gZm9yY2UgdGhlIHZpZXcgdG8gcmV0dXJuXG4gICAgICAgICAgICAvLyBjb29yZGluYXRlcyBvbiB0aGUgcHJvcGVyIHNpZGUgb2YgYmxvY2sgd2lkZ2V0cywgc2luY2VcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6aW5nIHRoZSBzaWRlIHRoZXJlLCB0aG91Z2ggYXBwcm9wcmlhdGUgZm9yIG1vc3RcbiAgICAgICAgICAgIC8vIGNvb3Jkc0F0UG9zIHF1ZXJpZXMsIHdvdWxkIGJyZWFrIHNlbGVjdGlvbiBkcmF3aW5nLlxuICAgICAgICAgICAgbGV0IGZyb21Db29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKGZyb20sIChmcm9tID09IGxpbmUudG8gPyAtMiA6IDIpKTtcbiAgICAgICAgICAgIGxldCB0b0Nvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3ModG8sICh0byA9PSBsaW5lLmZyb20gPyAyIDogLTIpKTtcbiAgICAgICAgICAgIGlmICghZnJvbUNvb3JkcyB8fCAhdG9Db29yZHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdG9wID0gTWF0aC5taW4oZnJvbUNvb3Jkcy50b3AsIHRvQ29vcmRzLnRvcCwgdG9wKTtcbiAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGZyb21Db29yZHMuYm90dG9tLCB0b0Nvb3Jkcy5ib3R0b20sIGJvdHRvbSk7XG4gICAgICAgICAgICBpZiAoZGlyID09IERpcmVjdGlvbi5MVFIpXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5wdXNoKGx0ciAmJiBmcm9tT3BlbiA/IGxlZnRTaWRlIDogZnJvbUNvb3Jkcy5sZWZ0LCBsdHIgJiYgdG9PcGVuID8gcmlnaHRTaWRlIDogdG9Db29yZHMucmlnaHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGhvcml6b250YWwucHVzaCghbHRyICYmIHRvT3BlbiA/IGxlZnRTaWRlIDogdG9Db29yZHMubGVmdCwgIWx0ciAmJiBmcm9tT3BlbiA/IHJpZ2h0U2lkZSA6IGZyb21Db29yZHMucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IGZyb20gIT09IG51bGwgJiYgZnJvbSAhPT0gdm9pZCAwID8gZnJvbSA6IGxpbmUuZnJvbSwgZW5kID0gdG8gIT09IG51bGwgJiYgdG8gIT09IHZvaWQgMCA/IHRvIDogbGluZS50bztcbiAgICAgICAgLy8gU3BsaXQgdGhlIHJhbmdlIGJ5IHZpc2libGUgcmFuZ2UgYW5kIGRvY3VtZW50IGxpbmVcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnZpc2libGVSYW5nZXMpXG4gICAgICAgICAgICBpZiAoci50byA+IHN0YXJ0ICYmIHIuZnJvbSA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IE1hdGgubWF4KHIuZnJvbSwgc3RhcnQpLCBlbmRQb3MgPSBNYXRoLm1pbihyLnRvLCBlbmQpOzspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0xpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3BhbiBvZiB2aWV3LmJpZGlTcGFucyhkb2NMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYW5Gcm9tID0gc3Bhbi5mcm9tICsgZG9jTGluZS5mcm9tLCBzcGFuVG8gPSBzcGFuLnRvICsgZG9jTGluZS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5Gcm9tID49IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuVG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3BhbihNYXRoLm1heChzcGFuRnJvbSwgcG9zKSwgZnJvbSA9PSBudWxsICYmIHNwYW5Gcm9tIDw9IHN0YXJ0LCBNYXRoLm1pbihzcGFuVG8sIGVuZFBvcyksIHRvID09IG51bGwgJiYgc3BhblRvID49IGVuZCwgc3Bhbi5kaXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IGRvY0xpbmUudG8gKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGhvcml6b250YWwubGVuZ3RoID09IDApXG4gICAgICAgICAgICBhZGRTcGFuKHN0YXJ0LCBmcm9tID09IG51bGwsIGVuZCwgdG8gPT0gbnVsbCwgdmlldy50ZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHsgdG9wLCBib3R0b20sIGhvcml6b250YWwgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhd0ZvcldpZGdldChibG9jaywgdG9wKSB7XG4gICAgICAgIGxldCB5ID0gY29udGVudFJlY3QudG9wICsgKHRvcCA/IGJsb2NrLnRvcCA6IGJsb2NrLmJvdHRvbSk7XG4gICAgICAgIHJldHVybiB7IHRvcDogeSwgYm90dG9tOiB5LCBob3Jpem9udGFsOiBbXSB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVNYXJrZXIoYSwgYikge1xuICAgIHJldHVybiBhLmNvbnN0cnVjdG9yID09IGIuY29uc3RydWN0b3IgJiYgYS5lcShiKTtcbn1cbmNsYXNzIExheWVyVmlldyB7XG4gICAgY29uc3RydWN0b3IodmlldywgbGF5ZXIpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5sYXllciA9IGxheWVyO1xuICAgICAgICB0aGlzLmRyYXduID0gW107XG4gICAgICAgIHRoaXMuc2NhbGVYID0gMTtcbiAgICAgICAgdGhpcy5zY2FsZVkgPSAxO1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXEgPSB7IHJlYWQ6IHRoaXMubWVhc3VyZS5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy5kcmF3LmJpbmQodGhpcykgfTtcbiAgICAgICAgdGhpcy5kb20gPSB2aWV3LnNjcm9sbERPTS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLWxheWVyXCIpO1xuICAgICAgICBpZiAobGF5ZXIuYWJvdmUpXG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tbGF5ZXItYWJvdmVcIik7XG4gICAgICAgIGlmIChsYXllci5jbGFzcylcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQobGF5ZXIuY2xhc3MpO1xuICAgICAgICB0aGlzLnNjYWxlKCk7XG4gICAgICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgdGhpcy5zZXRPcmRlcih2aWV3LnN0YXRlKTtcbiAgICAgICAgdmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICBpZiAobGF5ZXIubW91bnQpXG4gICAgICAgICAgICBsYXllci5tb3VudCh0aGlzLmRvbSwgdmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxheWVyT3JkZXIpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChsYXllck9yZGVyKSlcbiAgICAgICAgICAgIHRoaXMuc2V0T3JkZXIodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIudXBkYXRlKHVwZGF0ZSwgdGhpcy5kb20pIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2NhbGUoKTtcbiAgICAgICAgICAgIHVwZGF0ZS52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0T3JkZXIoc3RhdGUpIHtcbiAgICAgICAgbGV0IHBvcyA9IDAsIG9yZGVyID0gc3RhdGUuZmFjZXQobGF5ZXJPcmRlcik7XG4gICAgICAgIHdoaWxlIChwb3MgPCBvcmRlci5sZW5ndGggJiYgb3JkZXJbcG9zXSAhPSB0aGlzLmxheWVyKVxuICAgICAgICAgICAgcG9zKys7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLnpJbmRleCA9IFN0cmluZygodGhpcy5sYXllci5hYm92ZSA/IDE1MCA6IC0xKSAtIHBvcyk7XG4gICAgfVxuICAgIG1lYXN1cmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyLm1hcmtlcnModGhpcy52aWV3KTtcbiAgICB9XG4gICAgc2NhbGUoKSB7XG4gICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgIGlmIChzY2FsZVggIT0gdGhpcy5zY2FsZVggfHwgc2NhbGVZICE9IHRoaXMuc2NhbGVZKSB7XG4gICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHNjYWxlWDtcbiAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gc2NhbGVZO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MSAvIHNjYWxlWH0sICR7MSAvIHNjYWxlWX0pYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkcmF3KG1hcmtlcnMpIHtcbiAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoICE9IHRoaXMuZHJhd24ubGVuZ3RoIHx8IG1hcmtlcnMuc29tZSgocCwgaSkgPT4gIXNhbWVNYXJrZXIocCwgdGhpcy5kcmF3bltpXSkpKSB7XG4gICAgICAgICAgICBsZXQgb2xkID0gdGhpcy5kb20uZmlyc3RDaGlsZCwgb2xkSSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBtYXJrZXIgb2YgbWFya2Vycykge1xuICAgICAgICAgICAgICAgIGlmIChtYXJrZXIudXBkYXRlICYmIG9sZCAmJiBtYXJrZXIuY29uc3RydWN0b3IgJiYgdGhpcy5kcmF3bltvbGRJXS5jb25zdHJ1Y3RvciAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZXIudXBkYXRlKG9sZCwgdGhpcy5kcmF3bltvbGRJXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkID0gb2xkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBvbGRJKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUobWFya2VyLmRyYXcoKSwgb2xkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAob2xkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBvbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgb2xkLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIG9sZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyYXduID0gbWFya2VycztcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5sYXllci5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5sYXllci5kZXN0cm95KHRoaXMuZG9tLCB0aGlzLnZpZXcpO1xuICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICB9XG59XG5jb25zdCBsYXllck9yZGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5EZWZpbmUgYSBsYXllci5cbiovXG5mdW5jdGlvbiBsYXllcihjb25maWcpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBWaWV3UGx1Z2luLmRlZmluZSh2ID0+IG5ldyBMYXllclZpZXcodiwgY29uZmlnKSksXG4gICAgICAgIGxheWVyT3JkZXIub2YoY29uZmlnKVxuICAgIF07XG59XG5cbmNvbnN0IENhbkhpZGVQcmltYXJ5ID0gIWJyb3dzZXIuaW9zOyAvLyBGSVhNRSB0ZXN0IElFXG5jb25zdCBzZWxlY3Rpb25Db25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGNvbmZpZ3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcoY29uZmlncywge1xuICAgICAgICAgICAgY3Vyc29yQmxpbmtSYXRlOiAxMjAwLFxuICAgICAgICAgICAgZHJhd1JhbmdlQ3Vyc29yOiB0cnVlXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGN1cnNvckJsaW5rUmF0ZTogKGEsIGIpID0+IE1hdGgubWluKGEsIGIpLFxuICAgICAgICAgICAgZHJhd1JhbmdlQ3Vyc29yOiAoYSwgYikgPT4gYSB8fCBiXG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGhpZGVzIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNlbGVjdGlvbiBhbmRcbmN1cnNvciwgcmVwbGFjaW5nIHRoZSBzZWxlY3Rpb24gd2l0aCBhIGJhY2tncm91bmQgYmVoaW5kIHRoZSB0ZXh0XG4od2l0aCB0aGUgYGNtLXNlbGVjdGlvbkJhY2tncm91bmRgIGNsYXNzKSwgYW5kIHRoZVxuY3Vyc29ycyB3aXRoIGVsZW1lbnRzIG92ZXJsYWlkIG92ZXIgdGhlIGNvZGUgKHVzaW5nXG5gY20tY3Vyc29yLXByaW1hcnlgIGFuZCBgY20tY3Vyc29yLXNlY29uZGFyeWApLlxuXG5UaGlzIGFsbG93cyB0aGUgZWRpdG9yIHRvIGRpc3BsYXkgc2Vjb25kYXJ5IHNlbGVjdGlvbiByYW5nZXMsIGFuZFxudGVuZHMgdG8gcHJvZHVjZSBhIHR5cGUgb2Ygc2VsZWN0aW9uIG1vcmUgaW4gbGluZSB3aXRoIHRoYXQgdXNlcnNcbmV4cGVjdCBpbiBhIHRleHQgZWRpdG9yICh0aGUgbmF0aXZlIHNlbGVjdGlvbiBzdHlsaW5nIHdpbGwgb2Z0ZW5cbmxlYXZlIGdhcHMgYmV0d2VlbiBsaW5lcyBhbmQgd29uJ3QgZmlsbCB0aGUgaG9yaXpvbnRhbCBzcGFjZSBhZnRlclxuYSBsaW5lIHdoZW4gdGhlIHNlbGVjdGlvbiBjb250aW51ZXMgcGFzdCBpdCkuXG5cbkl0IGRvZXMgaGF2ZSBhIHBlcmZvcm1hbmNlIGNvc3QsIGluIHRoYXQgaXQgcmVxdWlyZXMgYW4gZXh0cmEgRE9NXG5sYXlvdXQgY3ljbGUgZm9yIG1hbnkgdXBkYXRlcyAodGhlIHNlbGVjdGlvbiBpcyBkcmF3biBiYXNlZCBvbiBET01cbmxheW91dCBpbmZvcm1hdGlvbiB0aGF0J3Mgb25seSBhdmFpbGFibGUgYWZ0ZXIgbGF5aW5nIG91dCB0aGVcbmNvbnRlbnQpLlxuKi9cbmZ1bmN0aW9uIGRyYXdTZWxlY3Rpb24oY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBzZWxlY3Rpb25Db25maWcub2YoY29uZmlnKSxcbiAgICAgICAgY3Vyc29yTGF5ZXIsXG4gICAgICAgIHNlbGVjdGlvbkxheWVyLFxuICAgICAgICBoaWRlTmF0aXZlU2VsZWN0aW9uLFxuICAgICAgICBuYXRpdmVTZWxlY3Rpb25IaWRkZW4ub2YodHJ1ZSlcbiAgICBdO1xufVxuLyoqXG5SZXRyaWV2ZSB0aGUgW2BkcmF3U2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmRyYXdTZWxlY3Rpb24pIGNvbmZpZ3VyYXRpb25cbmZvciB0aGlzIHN0YXRlLiAoTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gYSBzZXQgb2YgZGVmYXVsdHMgZXZlblxuaWYgYGRyYXdTZWxlY3Rpb25gIGlzbid0IGVuYWJsZWQuKVxuKi9cbmZ1bmN0aW9uIGdldERyYXdTZWxlY3Rpb25Db25maWcoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbn1cbmZ1bmN0aW9uIGNvbmZpZ0NoYW5nZWQodXBkYXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZykgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZyk7XG59XG5jb25zdCBjdXJzb3JMYXllciA9IC8qQF9fUFVSRV9fKi9sYXllcih7XG4gICAgYWJvdmU6IHRydWUsXG4gICAgbWFya2Vycyh2aWV3KSB7XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjb25mID0gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbiAgICAgICAgbGV0IGN1cnNvcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgciBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgcHJpbSA9IHIgPT0gc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgICAgICBpZiAoci5lbXB0eSA/ICFwcmltIHx8IENhbkhpZGVQcmltYXJ5IDogY29uZi5kcmF3UmFuZ2VDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gcHJpbSA/IFwiY20tY3Vyc29yIGNtLWN1cnNvci1wcmltYXJ5XCIgOiBcImNtLWN1cnNvciBjbS1jdXJzb3Itc2Vjb25kYXJ5XCI7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnNvciA9IHIuZW1wdHkgPyByIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyLmhlYWQsIHIuaGVhZCA+IHIuYW5jaG9yID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwaWVjZSBvZiBSZWN0YW5nbGVNYXJrZXIuZm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCBjdXJzb3IpKVxuICAgICAgICAgICAgICAgICAgICBjdXJzb3JzLnB1c2gocGllY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJzb3JzO1xuICAgIH0sXG4gICAgdXBkYXRlKHVwZGF0ZSwgZG9tKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLnNvbWUodHIgPT4gdHIuc2VsZWN0aW9uKSlcbiAgICAgICAgICAgIGRvbS5zdHlsZS5hbmltYXRpb25OYW1lID0gZG9tLnN0eWxlLmFuaW1hdGlvbk5hbWUgPT0gXCJjbS1ibGlua1wiID8gXCJjbS1ibGluazJcIiA6IFwiY20tYmxpbmtcIjtcbiAgICAgICAgbGV0IGNvbmZDaGFuZ2UgPSBjb25maWdDaGFuZ2VkKHVwZGF0ZSk7XG4gICAgICAgIGlmIChjb25mQ2hhbmdlKVxuICAgICAgICAgICAgc2V0QmxpbmtSYXRlKHVwZGF0ZS5zdGF0ZSwgZG9tKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQgfHwgY29uZkNoYW5nZTtcbiAgICB9LFxuICAgIG1vdW50KGRvbSwgdmlldykge1xuICAgICAgICBzZXRCbGlua1JhdGUodmlldy5zdGF0ZSwgZG9tKTtcbiAgICB9LFxuICAgIGNsYXNzOiBcImNtLWN1cnNvckxheWVyXCJcbn0pO1xuZnVuY3Rpb24gc2V0QmxpbmtSYXRlKHN0YXRlLCBkb20pIHtcbiAgICBkb20uc3R5bGUuYW5pbWF0aW9uRHVyYXRpb24gPSBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpLmN1cnNvckJsaW5rUmF0ZSArIFwibXNcIjtcbn1cbmNvbnN0IHNlbGVjdGlvbkxheWVyID0gLypAX19QVVJFX18qL2xheWVyKHtcbiAgICBhYm92ZTogZmFsc2UsXG4gICAgbWFya2Vycyh2aWV3KSB7XG4gICAgICAgIHJldHVybiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubWFwKHIgPT4gci5lbXB0eSA/IFtdIDogUmVjdGFuZ2xlTWFya2VyLmZvclJhbmdlKHZpZXcsIFwiY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiLCByKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbiAgICB9LFxuICAgIHVwZGF0ZSh1cGRhdGUsIGRvbSkge1xuICAgICAgICByZXR1cm4gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8IGNvbmZpZ0NoYW5nZWQodXBkYXRlKTtcbiAgICB9LFxuICAgIGNsYXNzOiBcImNtLXNlbGVjdGlvbkxheWVyXCJcbn0pO1xuY29uc3QgdGhlbWVTcGVjID0ge1xuICAgIFwiLmNtLWxpbmVcIjoge1xuICAgICAgICBcIiYgOjpzZWxlY3Rpb25cIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiIH0sXG4gICAgICAgIFwiJjo6c2VsZWN0aW9uXCI6IHsgYmFja2dyb3VuZENvbG9yOiBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIiB9XG4gICAgfVxufTtcbmlmIChDYW5IaWRlUHJpbWFyeSkge1xuICAgIHRoZW1lU3BlY1tcIi5jbS1saW5lXCJdLmNhcmV0Q29sb3IgPSBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIjtcbiAgICB0aGVtZVNwZWNbXCIuY20tY29udGVudFwiXSA9IHsgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudCAhaW1wb3J0YW50XCIgfTtcbn1cbmNvbnN0IGhpZGVOYXRpdmVTZWxlY3Rpb24gPSAvKkBfX1BVUkVfXyovUHJlYy5oaWdoZXN0KC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LnRoZW1lKHRoZW1lU3BlYykpO1xuXG5jb25zdCBzZXREcm9wQ3Vyc29yUG9zID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7XG4gICAgbWFwKHBvcywgbWFwcGluZykgeyByZXR1cm4gcG9zID09IG51bGwgPyBudWxsIDogbWFwcGluZy5tYXBQb3MocG9zKTsgfVxufSk7XG5jb25zdCBkcm9wQ3Vyc29yUG9zID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7IHJldHVybiBudWxsOyB9LFxuICAgIHVwZGF0ZShwb3MsIHRyKSB7XG4gICAgICAgIGlmIChwb3MgIT0gbnVsbClcbiAgICAgICAgICAgIHBvcyA9IHRyLmNoYW5nZXMubWFwUG9zKHBvcyk7XG4gICAgICAgIHJldHVybiB0ci5lZmZlY3RzLnJlZHVjZSgocG9zLCBlKSA9PiBlLmlzKHNldERyb3BDdXJzb3JQb3MpID8gZS52YWx1ZSA6IHBvcywgcG9zKTtcbiAgICB9XG59KTtcbmNvbnN0IGRyYXdEcm9wQ3Vyc29yID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxID0geyByZWFkOiB0aGlzLnJlYWRQb3MuYmluZCh0aGlzKSwgd3JpdGU6IHRoaXMuZHJhd0N1cnNvci5iaW5kKHRoaXMpIH07XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY3Vyc29yUG9zID0gdXBkYXRlLnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpO1xuICAgICAgICBpZiAoY3Vyc29yUG9zID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgKF9hID0gdGhpcy5jdXJzb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSB0aGlzLnZpZXcuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLmNsYXNzTmFtZSA9IFwiY20tZHJvcEN1cnNvclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpICE9IGN1cnNvclBvcyB8fCB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWRQb3MoKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIGxldCBwb3MgPSB2aWV3LnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpO1xuICAgICAgICBsZXQgcmVjdCA9IHBvcyAhPSBudWxsICYmIHZpZXcuY29vcmRzQXRQb3MocG9zKTtcbiAgICAgICAgaWYgKCFyZWN0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBvdXRlciA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0IC0gb3V0ZXIubGVmdCArIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgKiB2aWV3LnNjYWxlWCxcbiAgICAgICAgICAgIHRvcDogcmVjdC50b3AgLSBvdXRlci50b3AgKyB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgKiB2aWV3LnNjYWxlWSxcbiAgICAgICAgICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICAgICAgICB9O1xuICAgIH1cbiAgICBkcmF3Q3Vyc29yKHBvcykge1xuICAgICAgICBpZiAodGhpcy5jdXJzb3IpIHtcbiAgICAgICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgICAgICBpZiAocG9zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUubGVmdCA9IHBvcy5sZWZ0IC8gc2NhbGVYICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLnRvcCA9IHBvcy50b3AgLyBzY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gcG9zLmhlaWdodCAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQgPSBcIi0xMDAwMDBweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvcilcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlbW92ZSgpO1xuICAgIH1cbiAgICBzZXREcm9wUG9zKHBvcykge1xuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpICE9IHBvcylcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHNldERyb3BDdXJzb3JQb3Mub2YocG9zKSB9KTtcbiAgICB9XG59LCB7XG4gICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgZHJhZ292ZXIoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyh0aGlzLnZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2xlYXZlKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09IHRoaXMudmlldy5jb250ZW50RE9NIHx8ICF0aGlzLnZpZXcuY29udGVudERPTS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdlbmQoKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyb3AoKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbi8qKlxuRHJhd3MgYSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgZHJvcCBwb3NpdGlvbiB3aGVuIHNvbWV0aGluZyBpc1xuZHJhZ2dlZCBvdmVyIHRoZSBlZGl0b3IuXG4qL1xuZnVuY3Rpb24gZHJvcEN1cnNvcigpIHtcbiAgICByZXR1cm4gW2Ryb3BDdXJzb3JQb3MsIGRyYXdEcm9wQ3Vyc29yXTtcbn1cblxuZnVuY3Rpb24gaXRlck1hdGNoZXMoZG9jLCByZSwgZnJvbSwgdG8sIGYpIHtcbiAgICByZS5sYXN0SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGN1cnNvciA9IGRvYy5pdGVyUmFuZ2UoZnJvbSwgdG8pLCBwb3MgPSBmcm9tLCBtOyAhY3Vyc29yLm5leHQoKS5kb25lOyBwb3MgKz0gY3Vyc29yLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICBpZiAoIWN1cnNvci5saW5lQnJlYWspXG4gICAgICAgICAgICB3aGlsZSAobSA9IHJlLmV4ZWMoY3Vyc29yLnZhbHVlKSlcbiAgICAgICAgICAgICAgICBmKHBvcyArIG0uaW5kZXgsIG0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hdGNoUmFuZ2VzKHZpZXcsIG1heExlbmd0aCkge1xuICAgIGxldCB2aXNpYmxlID0gdmlldy52aXNpYmxlUmFuZ2VzO1xuICAgIGlmICh2aXNpYmxlLmxlbmd0aCA9PSAxICYmIHZpc2libGVbMF0uZnJvbSA9PSB2aWV3LnZpZXdwb3J0LmZyb20gJiZcbiAgICAgICAgdmlzaWJsZVswXS50byA9PSB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gdmlzaWJsZTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHZpc2libGUpIHtcbiAgICAgICAgZnJvbSA9IE1hdGgubWF4KHZpZXcuc3RhdGUuZG9jLmxpbmVBdChmcm9tKS5mcm9tLCBmcm9tIC0gbWF4TGVuZ3RoKTtcbiAgICAgICAgdG8gPSBNYXRoLm1pbih2aWV3LnN0YXRlLmRvYy5saW5lQXQodG8pLnRvLCB0byArIG1heExlbmd0aCk7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICYmIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0udG8gPj0gZnJvbSlcbiAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0udG8gPSB0bztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuSGVscGVyIGNsYXNzIHVzZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gZGVjb3JhdGlvbnMgb25cbnZpc2libGUgY29kZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uIFRvIGJlIHVzZWRcbmluIGEgW3ZpZXcgcGx1Z2luXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuVmlld1BsdWdpbikuIEluc3RhbmNlcyBvZiB0aGlzIG9iamVjdFxucmVwcmVzZW50IGEgbWF0Y2hpbmcgY29uZmlndXJhdGlvbi5cbiovXG5jbGFzcyBNYXRjaERlY29yYXRvciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZGVjb3JhdG9yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgcmVnZXhwLCBkZWNvcmF0aW9uLCBkZWNvcmF0ZSwgYm91bmRhcnksIG1heExlbmd0aCA9IDEwMDAgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFyZWdleHAuZ2xvYmFsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIHRvIE1hdGNoRGVjb3JhdG9yIHNob3VsZCBoYXZlIGl0cyAnZycgZmxhZyBzZXRcIik7XG4gICAgICAgIHRoaXMucmVnZXhwID0gcmVnZXhwO1xuICAgICAgICBpZiAoZGVjb3JhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIHZpZXcsIGZyb20sIGFkZCkgPT4gZGVjb3JhdGUoYWRkLCBmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBtYXRjaCwgdmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlY29yYXRpb24gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hdGNoID0gKG1hdGNoLCB2aWV3LCBmcm9tLCBhZGQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbyA9IGRlY29yYXRpb24obWF0Y2gsIHZpZXcsIGZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChkZWNvKVxuICAgICAgICAgICAgICAgICAgICBhZGQoZnJvbSwgZnJvbSArIG1hdGNoWzBdLmxlbmd0aCwgZGVjbyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlY29yYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIF92aWV3LCBmcm9tLCBhZGQpID0+IGFkZChmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBkZWNvcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRWl0aGVyICdkZWNvcmF0ZScgb3IgJ2RlY29yYXRpb24nIHNob3VsZCBiZSBwcm92aWRlZCB0byBNYXRjaERlY29yYXRvclwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvdW5kYXJ5ID0gYm91bmRhcnk7XG4gICAgICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wdXRlIHRoZSBmdWxsIHNldCBvZiBkZWNvcmF0aW9ucyBmb3IgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW5cbiAgICB2aWV3J3Mgdmlld3BvcnQuIFlvdSdsbCB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIGluaXRpYWxpemluZyB5b3VyXG4gICAgcGx1Z2luLlxuICAgICovXG4gICAgY3JlYXRlRGVjbyh2aWV3KSB7XG4gICAgICAgIGxldCBidWlsZCA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKSwgYWRkID0gYnVpbGQuYWRkLmJpbmQoYnVpbGQpO1xuICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgbWF0Y2hSYW5nZXModmlldywgdGhpcy5tYXhMZW5ndGgpKVxuICAgICAgICAgICAgaXRlck1hdGNoZXModmlldy5zdGF0ZS5kb2MsIHRoaXMucmVnZXhwLCBmcm9tLCB0bywgKGZyb20sIG0pID0+IHRoaXMuYWRkTWF0Y2gobSwgdmlldywgZnJvbSwgYWRkKSk7XG4gICAgICAgIHJldHVybiBidWlsZC5maW5pc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIGEgc2V0IG9mIGRlY29yYXRpb25zIGZvciBhIHZpZXcgdXBkYXRlLiBgZGVjb2AgX211c3RfIGJlXG4gICAgdGhlIHNldCBvZiBkZWNvcmF0aW9ucyBwcm9kdWNlZCBieSBfdGhpc18gYE1hdGNoRGVjb3JhdG9yYCBmb3JcbiAgICB0aGUgdmlldyBzdGF0ZSBiZWZvcmUgdGhlIHVwZGF0ZS5cbiAgICAqL1xuICAgIHVwZGF0ZURlY28odXBkYXRlLCBkZWNvKSB7XG4gICAgICAgIGxldCBjaGFuZ2VGcm9tID0gMWU5LCBjaGFuZ2VUbyA9IC0xO1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpXG4gICAgICAgICAgICB1cGRhdGUuY2hhbmdlcy5pdGVyQ2hhbmdlcygoX2YsIF90LCBmcm9tLCB0bykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0byA+IHVwZGF0ZS52aWV3LnZpZXdwb3J0LmZyb20gJiYgZnJvbSA8IHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUZyb20gPSBNYXRoLm1pbihmcm9tLCBjaGFuZ2VGcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG8gPSBNYXRoLm1heCh0bywgY2hhbmdlVG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAodXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fCBjaGFuZ2VUbyAtIGNoYW5nZUZyb20gPiAxMDAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGVjbyh1cGRhdGUudmlldyk7XG4gICAgICAgIGlmIChjaGFuZ2VUbyA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmFuZ2UodXBkYXRlLnZpZXcsIGRlY28ubWFwKHVwZGF0ZS5jaGFuZ2VzKSwgY2hhbmdlRnJvbSwgY2hhbmdlVG8pO1xuICAgICAgICByZXR1cm4gZGVjbztcbiAgICB9XG4gICAgdXBkYXRlUmFuZ2UodmlldywgZGVjbywgdXBkYXRlRnJvbSwgdXBkYXRlVG8pIHtcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnZpc2libGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gTWF0aC5tYXgoci5mcm9tLCB1cGRhdGVGcm9tKSwgdG8gPSBNYXRoLm1pbihyLnRvLCB1cGRhdGVUbyk7XG4gICAgICAgICAgICBpZiAodG8gPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb21MaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KGZyb20pLCB0b0xpbmUgPSBmcm9tTGluZS50byA8IHRvID8gdmlldy5zdGF0ZS5kb2MubGluZUF0KHRvKSA6IGZyb21MaW5lO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHIuZnJvbSwgZnJvbUxpbmUuZnJvbSksIGVuZCA9IE1hdGgubWluKHIudG8sIHRvTGluZS50byk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGZyb20gPiBmcm9tTGluZS5mcm9tOyBmcm9tLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3VuZGFyeS50ZXN0KGZyb21MaW5lLnRleHRbZnJvbSAtIDEgLSBmcm9tTGluZS5mcm9tXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyB0byA8IHRvTGluZS50bzsgdG8rKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kYXJ5LnRlc3QodG9MaW5lLnRleHRbdG8gLSB0b0xpbmUuZnJvbV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gdG87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByYW5nZXMgPSBbXSwgbTtcbiAgICAgICAgICAgICAgICBsZXQgYWRkID0gKGZyb20sIHRvLCBkZWNvKSA9PiByYW5nZXMucHVzaChkZWNvLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21MaW5lID09IHRvTGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSBzdGFydCAtIGZyb21MaW5lLmZyb207XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobSA9IHRoaXMucmVnZXhwLmV4ZWMoZnJvbUxpbmUudGV4dCkpICYmIG0uaW5kZXggPCBlbmQgLSBmcm9tTGluZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNYXRjaChtLCB2aWV3LCBtLmluZGV4ICsgZnJvbUxpbmUuZnJvbSwgYWRkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJNYXRjaGVzKHZpZXcuc3RhdGUuZG9jLCB0aGlzLnJlZ2V4cCwgc3RhcnQsIGVuZCwgKGZyb20sIG0pID0+IHRoaXMuYWRkTWF0Y2gobSwgdmlldywgZnJvbSwgYWRkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlY28gPSBkZWNvLnVwZGF0ZSh7IGZpbHRlckZyb206IHN0YXJ0LCBmaWx0ZXJUbzogZW5kLCBmaWx0ZXI6IChmcm9tLCB0bykgPT4gZnJvbSA8IHN0YXJ0IHx8IHRvID4gZW5kLCBhZGQ6IHJhbmdlcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjbztcbiAgICB9XG59XG5cbmNvbnN0IFVuaWNvZGVSZWdleHBTdXBwb3J0ID0gL3gvLnVuaWNvZGUgIT0gbnVsbCA/IFwiZ3VcIiA6IFwiZ1wiO1xuY29uc3QgU3BlY2lhbHMgPSAvKkBfX1BVUkVfXyovbmV3IFJlZ0V4cChcIltcXHUwMDAwLVxcdTAwMDhcXHUwMDBhLVxcdTAwMWZcXHUwMDdmLVxcdTAwOWZcXHUwMGFkXFx1MDYxY1xcdTIwMGJcXHUyMDBlXFx1MjAwZlxcdTIwMjhcXHUyMDI5XFx1MjAyZFxcdTIwMmVcXHUyMDY2XFx1MjA2N1xcdTIwNjlcXHVmZWZmXFx1ZmZmOS1cXHVmZmZjXVwiLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG5jb25zdCBOYW1lcyA9IHtcbiAgICAwOiBcIm51bGxcIixcbiAgICA3OiBcImJlbGxcIixcbiAgICA4OiBcImJhY2tzcGFjZVwiLFxuICAgIDEwOiBcIm5ld2xpbmVcIixcbiAgICAxMTogXCJ2ZXJ0aWNhbCB0YWJcIixcbiAgICAxMzogXCJjYXJyaWFnZSByZXR1cm5cIixcbiAgICAyNzogXCJlc2NhcGVcIixcbiAgICA4MjAzOiBcInplcm8gd2lkdGggc3BhY2VcIixcbiAgICA4MjA0OiBcInplcm8gd2lkdGggbm9uLWpvaW5lclwiLFxuICAgIDgyMDU6IFwiemVybyB3aWR0aCBqb2luZXJcIixcbiAgICA4MjA2OiBcImxlZnQtdG8tcmlnaHQgbWFya1wiLFxuICAgIDgyMDc6IFwicmlnaHQtdG8tbGVmdCBtYXJrXCIsXG4gICAgODIzMjogXCJsaW5lIHNlcGFyYXRvclwiLFxuICAgIDgyMzc6IFwibGVmdC10by1yaWdodCBvdmVycmlkZVwiLFxuICAgIDgyMzg6IFwicmlnaHQtdG8tbGVmdCBvdmVycmlkZVwiLFxuICAgIDgyOTQ6IFwibGVmdC10by1yaWdodCBpc29sYXRlXCIsXG4gICAgODI5NTogXCJyaWdodC10by1sZWZ0IGlzb2xhdGVcIixcbiAgICA4Mjk3OiBcInBvcCBkaXJlY3Rpb25hbCBpc29sYXRlXCIsXG4gICAgODIzMzogXCJwYXJhZ3JhcGggc2VwYXJhdG9yXCIsXG4gICAgNjUyNzk6IFwiemVybyB3aWR0aCBuby1icmVhayBzcGFjZVwiLFxuICAgIDY1NTMyOiBcIm9iamVjdCByZXBsYWNlbWVudFwiXG59O1xubGV0IF9zdXBwb3J0c1RhYlNpemUgPSBudWxsO1xuZnVuY3Rpb24gc3VwcG9ydHNUYWJTaXplKCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoX3N1cHBvcnRzVGFiU2l6ZSA9PSBudWxsICYmIHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgbGV0IHN0eWxlcyA9IGRvY3VtZW50LmJvZHkuc3R5bGU7XG4gICAgICAgIF9zdXBwb3J0c1RhYlNpemUgPSAoKF9hID0gc3R5bGVzLnRhYlNpemUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHN0eWxlcy5Nb3pUYWJTaXplKSAhPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gX3N1cHBvcnRzVGFiU2l6ZSB8fCBmYWxzZTtcbn1cbmNvbnN0IHNwZWNpYWxDaGFyQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIGxldCBjb25maWcgPSBjb21iaW5lQ29uZmlnKGNvbmZpZ3MsIHtcbiAgICAgICAgICAgIHJlbmRlcjogbnVsbCxcbiAgICAgICAgICAgIHNwZWNpYWxDaGFyczogU3BlY2lhbHMsXG4gICAgICAgICAgICBhZGRTcGVjaWFsQ2hhcnM6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWcucmVwbGFjZVRhYnMgPSAhc3VwcG9ydHNUYWJTaXplKCkpXG4gICAgICAgICAgICBjb25maWcuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cChcIlxcdHxcIiArIGNvbmZpZy5zcGVjaWFsQ2hhcnMuc291cmNlLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG4gICAgICAgIGlmIChjb25maWcuYWRkU3BlY2lhbENoYXJzKVxuICAgICAgICAgICAgY29uZmlnLnNwZWNpYWxDaGFycyA9IG5ldyBSZWdFeHAoY29uZmlnLnNwZWNpYWxDaGFycy5zb3VyY2UgKyBcInxcIiArIGNvbmZpZy5hZGRTcGVjaWFsQ2hhcnMuc291cmNlLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgaW5zdGFsbHMgaGlnaGxpZ2h0aW5nIG9mIHNwZWNpYWxcbmNoYXJhY3RlcnMuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0U3BlY2lhbENoYXJzKFxuLyoqXG5Db25maWd1cmF0aW9uIG9wdGlvbnMuXG4qL1xuY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW3NwZWNpYWxDaGFyQ29uZmlnLm9mKGNvbmZpZyksIHNwZWNpYWxDaGFyUGx1Z2luKCldO1xufVxubGV0IF9wbHVnaW4gPSBudWxsO1xuZnVuY3Rpb24gc3BlY2lhbENoYXJQbHVnaW4oKSB7XG4gICAgcmV0dXJuIF9wbHVnaW4gfHwgKF9wbHVnaW4gPSBWaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9uQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0b3IgPSB0aGlzLm1ha2VEZWNvcmF0b3Iodmlldy5zdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZykpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdG9yLmNyZWF0ZURlY28odmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgbWFrZURlY29yYXRvcihjb25mKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICAgICAgICAgICAgICByZWdleHA6IGNvbmYuc3BlY2lhbENoYXJzLFxuICAgICAgICAgICAgICAgIGRlY29yYXRpb246IChtLCB2aWV3LCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgZG9jIH0gPSB2aWV3LnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZSA9IGNvZGVQb2ludEF0KG1bMF0sIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gdmlldy5zdGF0ZS50YWJTaXplLCBjb2wgPSBjb3VudENvbHVtbihsaW5lLnRleHQsIHNpemUsIHBvcyAtIGxpbmUuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBUYWJXaWRnZXQoKHNpemUgLSAoY29sICUgc2l6ZSkpICogdGhpcy52aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCAvIHRoaXMudmlldy5zY2FsZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvcmF0aW9uQ2FjaGVbY29kZV0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmRlY29yYXRpb25DYWNoZVtjb2RlXSA9IERlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogbmV3IFNwZWNpYWxDaGFyV2lkZ2V0KGNvbmYsIGNvZGUpIH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5OiBjb25mLnJlcGxhY2VUYWJzID8gdW5kZWZpbmVkIDogL1teXS9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgICAgIGxldCBjb25mID0gdXBkYXRlLnN0YXRlLmZhY2V0KHNwZWNpYWxDaGFyQ29uZmlnKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZykgIT0gY29uZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdG9yID0gdGhpcy5tYWtlRGVjb3JhdG9yKGNvbmYpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci5jcmVhdGVEZWNvKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci51cGRhdGVEZWNvKHVwZGF0ZSwgdGhpcy5kZWNvcmF0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbiAgICB9KSk7XG59XG5jb25zdCBEZWZhdWx0UGxhY2Vob2xkZXIgPSBcIlxcdTIwMjJcIjtcbi8vIEFzc2lnbnMgcGxhY2Vob2xkZXIgY2hhcmFjdGVycyBmcm9tIHRoZSBDb250cm9sIFBpY3R1cmVzIGJsb2NrIHRvXG4vLyBBU0NJSSBjb250cm9sIGNoYXJhY3RlcnNcbmZ1bmN0aW9uIHBsYWNlaG9sZGVyJDEoY29kZSkge1xuICAgIGlmIChjb2RlID49IDMyKVxuICAgICAgICByZXR1cm4gRGVmYXVsdFBsYWNlaG9sZGVyO1xuICAgIGlmIChjb2RlID09IDEwKVxuICAgICAgICByZXR1cm4gXCJcXHUyNDI0XCI7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoOTIxNiArIGNvZGUpO1xufVxuY2xhc3MgU3BlY2lhbENoYXJXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5jb2RlID09IHRoaXMuY29kZTsgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgbGV0IHBoID0gcGxhY2Vob2xkZXIkMSh0aGlzLmNvZGUpO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuc3RhdGUucGhyYXNlKFwiQ29udHJvbCBjaGFyYWN0ZXJcIikgKyBcIiBcIiArIChOYW1lc1t0aGlzLmNvZGVdIHx8IFwiMHhcIiArIHRoaXMuY29kZS50b1N0cmluZygxNikpO1xuICAgICAgICBsZXQgY3VzdG9tID0gdGhpcy5vcHRpb25zLnJlbmRlciAmJiB0aGlzLm9wdGlvbnMucmVuZGVyKHRoaXMuY29kZSwgZGVzYywgcGgpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHBoO1xuICAgICAgICBzcGFuLnRpdGxlID0gZGVzYztcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGRlc2MpO1xuICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IFwiY20tc3BlY2lhbENoYXJcIjtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbmNsYXNzIFRhYldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHdpZHRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLndpZHRoID09IHRoaXMud2lkdGg7IH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IFwiXFx0XCI7XG4gICAgICAgIHNwYW4uY2xhc3NOYW1lID0gXCJjbS10YWJcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyBcInB4XCI7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbmNvbnN0IHBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTAwMDtcbiAgICAgICAgdGhpcy5hdHRycyA9IHsgc3R5bGU6IFwicGFkZGluZy1ib3R0b206IDEwMDBweFwiIH07XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdXBkYXRlO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gdmlldy52aWV3U3RhdGUuZWRpdG9ySGVpZ2h0ICogdmlldy5zY2FsZVkgLVxuICAgICAgICAgICAgdmlldy5kZWZhdWx0TGluZUhlaWdodCAtIHZpZXcuZG9jdW1lbnRQYWRkaW5nLnRvcCAtIDAuNTtcbiAgICAgICAgaWYgKGhlaWdodCA+PSAwICYmIGhlaWdodCAhPSB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmF0dHJzID0geyBzdHlsZTogYHBhZGRpbmctYm90dG9tOiAke2hlaWdodH1weGAgfTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IG1ha2VzIHN1cmUgdGhlIGNvbnRlbnQgaGFzIGEgYm90dG9tXG5tYXJnaW4gZXF1aXZhbGVudCB0byB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IsIG1pbnVzIG9uZSBsaW5lXG5oZWlnaHQsIHNvIHRoYXQgZXZlcnkgbGluZSBpbiB0aGUgZG9jdW1lbnQgY2FuIGJlIHNjcm9sbGVkIHRvIHRoZVxudG9wIG9mIHRoZSBlZGl0b3IuXG5cblRoaXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxhYmxlLCBhbmQgc2hvdWxkXG5ub3QgYmUgZW5hYmxlZCBpbiBlZGl0b3JzIHRoYXQgdGFrZSB0aGUgc2l6ZSBvZiB0aGVpciBjb250ZW50LlxuKi9cbmZ1bmN0aW9uIHNjcm9sbFBhc3RFbmQoKSB7XG4gICAgcmV0dXJuIFtwbHVnaW4sIGNvbnRlbnRBdHRyaWJ1dGVzLm9mKHZpZXcgPT4geyB2YXIgX2E7IHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4ocGx1Z2luKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmF0dHJzKSB8fCBudWxsOyB9KV07XG59XG5cbi8qKlxuTWFyayBsaW5lcyB0aGF0IGhhdmUgYSBjdXJzb3Igb24gdGhlbSB3aXRoIHRoZSBgXCJjbS1hY3RpdmVMaW5lXCJgXG5ET00gY2xhc3MuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0QWN0aXZlTGluZSgpIHtcbiAgICByZXR1cm4gYWN0aXZlTGluZUhpZ2hsaWdodGVyO1xufVxuY29uc3QgbGluZURlY28gPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5saW5lKHsgY2xhc3M6IFwiY20tYWN0aXZlTGluZVwiIH0pO1xuY29uc3QgYWN0aXZlTGluZUhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmdldERlY28odmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQpXG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5nZXREZWNvKHVwZGF0ZS52aWV3KTtcbiAgICB9XG4gICAgZ2V0RGVjbyh2aWV3KSB7XG4gICAgICAgIGxldCBsYXN0TGluZVN0YXJ0ID0gLTEsIGRlY28gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdmlldy5saW5lQmxvY2tBdChyLmhlYWQpO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA+IGxhc3RMaW5lU3RhcnQpIHtcbiAgICAgICAgICAgICAgICBkZWNvLnB1c2gobGluZURlY28ucmFuZ2UobGluZS5mcm9tKSk7XG4gICAgICAgICAgICAgICAgbGFzdExpbmVTdGFydCA9IGxpbmUuZnJvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjbyk7XG4gICAgfVxufSwge1xuICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbn0pO1xuXG5jbGFzcyBQbGFjZWhvbGRlciBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRlbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHdyYXAuY2xhc3NOYW1lID0gXCJjbS1wbGFjZWhvbGRlclwiO1xuICAgICAgICB3cmFwLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgd3JhcC5hcHBlbmRDaGlsZCh0eXBlb2YgdGhpcy5jb250ZW50ID09IFwic3RyaW5nXCIgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNvbnRlbnQpIDogdGhpcy5jb250ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnRlbnQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHdyYXAuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcInBsYWNlaG9sZGVyIFwiICsgdGhpcy5jb250ZW50KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIHJldHVybiB3cmFwO1xuICAgIH1cbiAgICBjb29yZHNBdChkb20pIHtcbiAgICAgICAgbGV0IHJlY3RzID0gZG9tLmZpcnN0Q2hpbGQgPyBjbGllbnRSZWN0c0Zvcihkb20uZmlyc3RDaGlsZCkgOiBbXTtcbiAgICAgICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tLnBhcmVudE5vZGUpO1xuICAgICAgICBsZXQgcmVjdCA9IGZsYXR0ZW5SZWN0KHJlY3RzWzBdLCBzdHlsZS5kaXJlY3Rpb24gIT0gXCJydGxcIik7XG4gICAgICAgIGxldCBsaW5lSGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUubGluZUhlaWdodCk7XG4gICAgICAgIGlmIChyZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gbGluZUhlaWdodCAqIDEuNSlcbiAgICAgICAgICAgIHJldHVybiB7IGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QucmlnaHQsIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC50b3AgKyBsaW5lSGVpZ2h0IH07XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vKipcbkV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgYSBwbGFjZWhvbGRlclx1MjAxNGEgcGllY2Ugb2YgZXhhbXBsZSBjb250ZW50XG50byBzaG93IHdoZW4gdGhlIGVkaXRvciBpcyBlbXB0eS5cbiovXG5mdW5jdGlvbiBwbGFjZWhvbGRlcihjb250ZW50KSB7XG4gICAgcmV0dXJuIFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBjb250ZW50XG4gICAgICAgICAgICAgICAgPyBEZWNvcmF0aW9uLnNldChbRGVjb3JhdGlvbi53aWRnZXQoeyB3aWRnZXQ6IG5ldyBQbGFjZWhvbGRlcihjb250ZW50KSwgc2lkZTogMSB9KS5yYW5nZSgwKV0pXG4gICAgICAgICAgICAgICAgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGRlY29yYXRpb25zKCkgeyByZXR1cm4gdGhpcy52aWV3LnN0YXRlLmRvYy5sZW5ndGggPyBEZWNvcmF0aW9uLm5vbmUgOiB0aGlzLnBsYWNlaG9sZGVyOyB9XG4gICAgfSwgeyBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zIH0pO1xufVxuXG4vLyBEb24ndCBjb21wdXRlIHByZWNpc2UgY29sdW1uIHBvc2l0aW9ucyBmb3IgbGluZSBvZmZzZXRzIGFib3ZlIHRoaXNcbi8vIChzaW5jZSBpdCBjb3VsZCBnZXQgZXhwZW5zaXZlKS4gQXNzdW1lIG9mZnNldD09Y29sdW1uIGZvciB0aGVtLlxuY29uc3QgTWF4T2ZmID0gMjAwMDtcbmZ1bmN0aW9uIHJlY3RhbmdsZUZvcihzdGF0ZSwgYSwgYikge1xuICAgIGxldCBzdGFydExpbmUgPSBNYXRoLm1pbihhLmxpbmUsIGIubGluZSksIGVuZExpbmUgPSBNYXRoLm1heChhLmxpbmUsIGIubGluZSk7XG4gICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgIGlmIChhLm9mZiA+IE1heE9mZiB8fCBiLm9mZiA+IE1heE9mZiB8fCBhLmNvbCA8IDAgfHwgYi5jb2wgPCAwKSB7XG4gICAgICAgIGxldCBzdGFydE9mZiA9IE1hdGgubWluKGEub2ZmLCBiLm9mZiksIGVuZE9mZiA9IE1hdGgubWF4KGEub2ZmLCBiLm9mZik7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPD0gZW5kTGluZTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGkpO1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDw9IGVuZE9mZilcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChFZGl0b3JTZWxlY3Rpb24ucmFuZ2UobGluZS5mcm9tICsgc3RhcnRPZmYsIGxpbmUudG8gKyBlbmRPZmYpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHN0YXJ0Q29sID0gTWF0aC5taW4oYS5jb2wsIGIuY29sKSwgZW5kQ29sID0gTWF0aC5tYXgoYS5jb2wsIGIuY29sKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUoaSk7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBmaW5kQ29sdW1uKGxpbmUudGV4dCwgc3RhcnRDb2wsIHN0YXRlLnRhYlNpemUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobGluZS50bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGZpbmRDb2x1bW4obGluZS50ZXh0LCBlbmRDb2wsIHN0YXRlLnRhYlNpemUpO1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKEVkaXRvclNlbGVjdGlvbi5yYW5nZShsaW5lLmZyb20gKyBzdGFydCwgbGluZS5mcm9tICsgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cbmZ1bmN0aW9uIGFic29sdXRlQ29sdW1uKHZpZXcsIHgpIHtcbiAgICBsZXQgcmVmID0gdmlldy5jb29yZHNBdFBvcyh2aWV3LnZpZXdwb3J0LmZyb20pO1xuICAgIHJldHVybiByZWYgPyBNYXRoLnJvdW5kKE1hdGguYWJzKChyZWYubGVmdCAtIHgpIC8gdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGgpKSA6IC0xO1xufVxuZnVuY3Rpb24gZ2V0UG9zKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IG9mZnNldCA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICBsZXQgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChvZmZzZXQpLCBvZmYgPSBvZmZzZXQgLSBsaW5lLmZyb207XG4gICAgbGV0IGNvbCA9IG9mZiA+IE1heE9mZiA/IC0xXG4gICAgICAgIDogb2ZmID09IGxpbmUubGVuZ3RoID8gYWJzb2x1dGVDb2x1bW4odmlldywgZXZlbnQuY2xpZW50WClcbiAgICAgICAgICAgIDogY291bnRDb2x1bW4obGluZS50ZXh0LCB2aWV3LnN0YXRlLnRhYlNpemUsIG9mZnNldCAtIGxpbmUuZnJvbSk7XG4gICAgcmV0dXJuIHsgbGluZTogbGluZS5udW1iZXIsIGNvbCwgb2ZmIH07XG59XG5mdW5jdGlvbiByZWN0YW5nbGVTZWxlY3Rpb25TdHlsZSh2aWV3LCBldmVudCkge1xuICAgIGxldCBzdGFydCA9IGdldFBvcyh2aWV3LCBldmVudCksIHN0YXJ0U2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCFzdGFydClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1N0YXJ0ID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHVwZGF0ZS5zdGFydFN0YXRlLmRvYy5saW5lKHN0YXJ0LmxpbmUpLmZyb20pO1xuICAgICAgICAgICAgICAgIGxldCBuZXdMaW5lID0gdXBkYXRlLnN0YXRlLmRvYy5saW5lQXQobmV3U3RhcnQpO1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0geyBsaW5lOiBuZXdMaW5lLm51bWJlciwgY29sOiBzdGFydC5jb2wsIG9mZjogTWF0aC5taW4oc3RhcnQub2ZmLCBuZXdMaW5lLmxlbmd0aCkgfTtcbiAgICAgICAgICAgICAgICBzdGFydFNlbCA9IHN0YXJ0U2VsLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldChldmVudCwgX2V4dGVuZCwgbXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSBnZXRQb3ModmlldywgZXZlbnQpO1xuICAgICAgICAgICAgaWYgKCFjdXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U2VsO1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHJlY3RhbmdsZUZvcih2aWV3LnN0YXRlLCBzdGFydCwgY3VyKTtcbiAgICAgICAgICAgIGlmICghcmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWw7XG4gICAgICAgICAgICBpZiAobXVsdGlwbGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLmNvbmNhdChzdGFydFNlbC5yYW5nZXMpKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgcmVjdGFuZ3VsYXIgc2VsZWN0aW9ucy4gQnlcbmRlZmF1bHQsIGl0IHdpbGwgcmVhY3QgdG8gbGVmdCBtb3VzZSBkcmFnIHdpdGggdGhlIEFsdCBrZXkgaGVsZFxuZG93bi4gV2hlbiBzdWNoIGEgc2VsZWN0aW9uIG9jY3VycywgdGhlIHRleHQgd2l0aGluIHRoZSByZWN0YW5nbGVcbnRoYXQgd2FzIGRyYWdnZWQgb3ZlciB3aWxsIGJlIHNlbGVjdGVkLCBhcyBvbmUgc2VsZWN0aW9uXG5bcmFuZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UpIHBlciBsaW5lLlxuKi9cbmZ1bmN0aW9uIHJlY3Rhbmd1bGFyU2VsZWN0aW9uKG9wdGlvbnMpIHtcbiAgICBsZXQgZmlsdGVyID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ldmVudEZpbHRlcikgfHwgKGUgPT4gZS5hbHRLZXkgJiYgZS5idXR0b24gPT0gMCk7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcubW91c2VTZWxlY3Rpb25TdHlsZS5vZigodmlldywgZXZlbnQpID0+IGZpbHRlcihldmVudCkgPyByZWN0YW5nbGVTZWxlY3Rpb25TdHlsZSh2aWV3LCBldmVudCkgOiBudWxsKTtcbn1cbmNvbnN0IGtleXMgPSB7XG4gICAgQWx0OiBbMTgsIGUgPT4gISFlLmFsdEtleV0sXG4gICAgQ29udHJvbDogWzE3LCBlID0+ICEhZS5jdHJsS2V5XSxcbiAgICBTaGlmdDogWzE2LCBlID0+ICEhZS5zaGlmdEtleV0sXG4gICAgTWV0YTogWzkxLCBlID0+ICEhZS5tZXRhS2V5XVxufTtcbmNvbnN0IHNob3dDcm9zc2hhaXIgPSB7IHN0eWxlOiBcImN1cnNvcjogY3Jvc3NoYWlyXCIgfTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCB0dXJucyB0aGUgcG9pbnRlciBjdXJzb3IgaW50byBhXG5jcm9zc2hhaXIgd2hlbiBhIGdpdmVuIG1vZGlmaWVyIGtleSwgZGVmYXVsdGluZyB0byBBbHQsIGlzIGhlbGRcbmRvd24uIENhbiBzZXJ2ZSBhcyBhIHZpc3VhbCBoaW50IHRoYXQgcmVjdGFuZ3VsYXIgc2VsZWN0aW9uIGlzXG5nb2luZyB0byBoYXBwZW4gd2hlbiBwYWlyZWQgd2l0aFxuW2ByZWN0YW5ndWxhclNlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5yZWN0YW5ndWxhclNlbGVjdGlvbikuXG4qL1xuZnVuY3Rpb24gY3Jvc3NoYWlyQ3Vyc29yKG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBbY29kZSwgZ2V0dGVyXSA9IGtleXNbb3B0aW9ucy5rZXkgfHwgXCJBbHRcIl07XG4gICAgbGV0IHBsdWdpbiA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICAgIHRoaXMuaXNEb3duID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc2V0KGlzRG93bikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEb3duICE9IGlzRG93bikge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEb3duID0gaXNEb3duO1xuICAgICAgICAgICAgICAgIHRoaXMudmlldy51cGRhdGUoW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBldmVudE9ic2VydmVyczoge1xuICAgICAgICAgICAga2V5ZG93bihlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoZS5rZXlDb2RlID09IGNvZGUgfHwgZ2V0dGVyKGUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBrZXl1cChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSBjb2RlIHx8ICFnZXR0ZXIoZSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VzZW1vdmUoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGdldHRlcihlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW1xuICAgICAgICBwbHVnaW4sXG4gICAgICAgIEVkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMub2YodmlldyA9PiB7IHZhciBfYTsgcmV0dXJuICgoX2EgPSB2aWV3LnBsdWdpbihwbHVnaW4pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNEb3duKSA/IHNob3dDcm9zc2hhaXIgOiBudWxsOyB9KVxuICAgIF07XG59XG5cbmNvbnN0IE91dHNpZGUgPSBcIi0xMDAwMHB4XCI7XG5jbGFzcyBUb29sdGlwVmlld01hbmFnZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGZhY2V0LCBjcmVhdGVUb29sdGlwVmlldykge1xuICAgICAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7XG4gICAgICAgIHRoaXMuY3JlYXRlVG9vbHRpcFZpZXcgPSBjcmVhdGVUb29sdGlwVmlldztcbiAgICAgICAgdGhpcy5pbnB1dCA9IHZpZXcuc3RhdGUuZmFjZXQoZmFjZXQpO1xuICAgICAgICB0aGlzLnRvb2x0aXBzID0gdGhpcy5pbnB1dC5maWx0ZXIodCA9PiB0KTtcbiAgICAgICAgdGhpcy50b29sdGlwVmlld3MgPSB0aGlzLnRvb2x0aXBzLm1hcChjcmVhdGVUb29sdGlwVmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUsIGFib3ZlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGlucHV0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KHRoaXMuZmFjZXQpO1xuICAgICAgICBsZXQgdG9vbHRpcHMgPSBpbnB1dC5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgaWYgKGlucHV0ID09PSB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIGlmICh0LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdC51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9vbHRpcFZpZXdzID0gW10sIG5ld0Fib3ZlID0gYWJvdmUgPyBbXSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0aXAgPSB0b29sdGlwc1tpXSwga25vd24gPSAtMTtcbiAgICAgICAgICAgIGlmICghdGlwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gdGhpcy50b29sdGlwc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob3RoZXIgJiYgb3RoZXIuY3JlYXRlID09IHRpcC5jcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgIGtub3duID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICB0b29sdGlwVmlld3NbaV0gPSB0aGlzLmNyZWF0ZVRvb2x0aXBWaWV3KHRpcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Fib3ZlKVxuICAgICAgICAgICAgICAgICAgICBuZXdBYm92ZVtpXSA9ICEhdGlwLmFib3ZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvb2x0aXBWaWV3ID0gdG9vbHRpcFZpZXdzW2ldID0gdGhpcy50b29sdGlwVmlld3Nba25vd25dO1xuICAgICAgICAgICAgICAgIGlmIChuZXdBYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgbmV3QWJvdmVbaV0gPSBhYm92ZVtrbm93bl07XG4gICAgICAgICAgICAgICAgaWYgKHRvb2x0aXBWaWV3LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgIGlmICh0b29sdGlwVmlld3MuaW5kZXhPZih0KSA8IDApIHtcbiAgICAgICAgICAgICAgICB0LmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAoX2EgPSB0LmRlc3Ryb3kpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoYWJvdmUpIHtcbiAgICAgICAgICAgIG5ld0Fib3ZlLmZvckVhY2goKHZhbCwgaSkgPT4gYWJvdmVbaV0gPSB2YWwpO1xuICAgICAgICAgICAgYWJvdmUubGVuZ3RoID0gbmV3QWJvdmUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy50b29sdGlwcyA9IHRvb2x0aXBzO1xuICAgICAgICB0aGlzLnRvb2x0aXBWaWV3cyA9IHRvb2x0aXBWaWV3cztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuLyoqXG5DcmVhdGVzIGFuIGV4dGVuc2lvbiB0aGF0IGNvbmZpZ3VyZXMgdG9vbHRpcCBiZWhhdmlvci5cbiovXG5mdW5jdGlvbiB0b29sdGlwcyhjb25maWcgPSB7fSkge1xuICAgIHJldHVybiB0b29sdGlwQ29uZmlnLm9mKGNvbmZpZyk7XG59XG5mdW5jdGlvbiB3aW5kb3dTcGFjZSh2aWV3KSB7XG4gICAgbGV0IHsgd2luIH0gPSB2aWV3O1xuICAgIHJldHVybiB7IHRvcDogMCwgbGVmdDogMCwgYm90dG9tOiB3aW4uaW5uZXJIZWlnaHQsIHJpZ2h0OiB3aW4uaW5uZXJXaWR0aCB9O1xufVxuY29uc3QgdG9vbHRpcENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICByZXR1cm4gKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBicm93c2VyLmlvcyA/IFwiYWJzb2x1dGVcIiA6ICgoX2EgPSB2YWx1ZXMuZmluZChjb25mID0+IGNvbmYucG9zaXRpb24pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucG9zaXRpb24pIHx8IFwiZml4ZWRcIixcbiAgICAgICAgICAgIHBhcmVudDogKChfYiA9IHZhbHVlcy5maW5kKGNvbmYgPT4gY29uZi5wYXJlbnQpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyZW50KSB8fCBudWxsLFxuICAgICAgICAgICAgdG9vbHRpcFNwYWNlOiAoKF9jID0gdmFsdWVzLmZpbmQoY29uZiA9PiBjb25mLnRvb2x0aXBTcGFjZSkpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b29sdGlwU3BhY2UpIHx8IHdpbmRvd1NwYWNlLFxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbmNvbnN0IGtub3duSGVpZ2h0ID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG5jb25zdCB0b29sdGlwUGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuYWJvdmUgPSBbXTtcbiAgICAgICAgdGhpcy5pblZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLm1hZGVBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxhc3RUcmFuc2FjdGlvbiA9IDA7XG4gICAgICAgIHRoaXMubWVhc3VyZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHZpZXcuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZyk7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBjb25maWcucG9zaXRpb247XG4gICAgICAgIHRoaXMucGFyZW50ID0gY29uZmlnLnBhcmVudDtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gdmlldy50aGVtZUNsYXNzZXM7XG4gICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5yZWFkTWVhc3VyZS5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy53cml0ZU1lYXN1cmUuYmluZCh0aGlzKSwga2V5OiB0aGlzIH07XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG5ldyBUb29sdGlwVmlld01hbmFnZXIodmlldywgc2hvd1Rvb2x0aXAsIHQgPT4gdGhpcy5jcmVhdGVUb29sdGlwKHQpKTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciA9IHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PSBcImZ1bmN0aW9uXCIgPyBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IHRoaXMubGFzdFRyYW5zYWN0aW9uIC0gNTAgJiZcbiAgICAgICAgICAgICAgICBlbnRyaWVzLmxlbmd0aCA+IDAgJiYgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdLmludGVyc2VjdGlvblJhdGlvIDwgMSlcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVTb29uKCk7XG4gICAgICAgIH0sIHsgdGhyZXNob2xkOiBbMV0gfSkgOiBudWxsO1xuICAgICAgICB0aGlzLm9ic2VydmVJbnRlcnNlY3Rpb24oKTtcbiAgICAgICAgdmlldy53aW4uYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm1lYXN1cmVTb29uID0gdGhpcy5tZWFzdXJlU29vbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5tYXliZU1lYXN1cmUoKTtcbiAgICB9XG4gICAgY3JlYXRlQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy52aWV3LnRoZW1lQ2xhc3NlcztcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy52aWV3LmRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvYnNlcnZlSW50ZXJzZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0b29sdGlwIG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5vYnNlcnZlKHRvb2x0aXAuZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZWFzdXJlU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMubGFzdFRyYW5zYWN0aW9uID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSB0aGlzLm1hbmFnZXIudXBkYXRlKHVwZGF0ZSwgdGhpcy5hYm92ZSk7XG4gICAgICAgIGlmICh1cGRhdGVkKVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlSW50ZXJzZWN0aW9uKCk7XG4gICAgICAgIGxldCBzaG91bGRNZWFzdXJlID0gdXBkYXRlZCB8fCB1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkO1xuICAgICAgICBsZXQgbmV3Q29uZmlnID0gdXBkYXRlLnN0YXRlLmZhY2V0KHRvb2x0aXBDb25maWcpO1xuICAgICAgICBpZiAobmV3Q29uZmlnLnBvc2l0aW9uICE9IHRoaXMucG9zaXRpb24gJiYgIXRoaXMubWFkZUFic29sdXRlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3Q29uZmlnLnBvc2l0aW9uO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHQuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgICAgIHNob3VsZE1lYXN1cmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdDb25maWcucGFyZW50ICE9IHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IG5ld0NvbmZpZy5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbnRhaW5lcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHQuZG9tKTtcbiAgICAgICAgICAgIHNob3VsZE1lYXN1cmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMudmlldy50aGVtZUNsYXNzZXMgIT0gdGhpcy5jbGFzc2VzKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRNZWFzdXJlKVxuICAgICAgICAgICAgdGhpcy5tYXliZU1lYXN1cmUoKTtcbiAgICB9XG4gICAgY3JlYXRlVG9vbHRpcCh0b29sdGlwKSB7XG4gICAgICAgIGxldCB0b29sdGlwVmlldyA9IHRvb2x0aXAuY3JlYXRlKHRoaXMudmlldyk7XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcFwiKTtcbiAgICAgICAgaWYgKHRvb2x0aXAuYXJyb3cgJiYgIXRvb2x0aXBWaWV3LmRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLXRvb2x0aXAgPiAuY20tdG9vbHRpcC1hcnJvd1wiKSkge1xuICAgICAgICAgICAgbGV0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFycm93LmNsYXNzTmFtZSA9IFwiY20tdG9vbHRpcC1hcnJvd1wiO1xuICAgICAgICAgICAgdG9vbHRpcFZpZXcuZG9tLmFwcGVuZENoaWxkKGFycm93KTtcbiAgICAgICAgfVxuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b29sdGlwVmlldy5kb20pO1xuICAgICAgICBpZiAodG9vbHRpcFZpZXcubW91bnQpXG4gICAgICAgICAgICB0b29sdGlwVmlldy5tb3VudCh0aGlzLnZpZXcpO1xuICAgICAgICByZXR1cm4gdG9vbHRpcFZpZXc7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMudmlldy53aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm1lYXN1cmVTb29uKTtcbiAgICAgICAgZm9yIChsZXQgdG9vbHRpcFZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgKF9hID0gdG9vbHRpcFZpZXcuZGVzdHJveSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodG9vbHRpcFZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudClcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICAoX2IgPSB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGlzY29ubmVjdCgpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tZWFzdXJlVGltZW91dCk7XG4gICAgfVxuICAgIHJlYWRNZWFzdXJlKCkge1xuICAgICAgICBsZXQgZWRpdG9yID0gdGhpcy52aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IHNjYWxlWCA9IDEsIHNjYWxlWSA9IDEsIG1ha2VBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBcImZpeGVkXCIgJiYgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IGRvbSB9ID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3c1swXTtcbiAgICAgICAgICAgIGlmIChicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBzZXRzIHRoZSBlbGVtZW50J3MgYG9mZnNldFBhcmVudGAgdG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtZWQgZWxlbWVudCB3aGVuIGEgdHJhbnNmb3JtIGludGVyZmVyZXMgd2l0aCBmaXhlZFxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uaW5nLlxuICAgICAgICAgICAgICAgIG1ha2VBYnNvbHV0ZSA9IGRvbS5vZmZzZXRQYXJlbnQgIT0gdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLnN0eWxlLnRvcCA9PSBPdXRzaWRlICYmIGRvbS5zdHlsZS5sZWZ0ID09IFwiMHB4XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBPbiBvdGhlciBicm93c2Vycywgd2UgaGF2ZSB0byBhd2t3YXJkbHkgdHJ5IGFuZCB1c2Ugb3RoZXJcbiAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byBkZXRlY3QgYSB0cmFuc2Zvcm0uXG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgbWFrZUFic29sdXRlID0gTWF0aC5hYnMocmVjdC50b3AgKyAxMDAwMCkgPiAxIHx8IE1hdGguYWJzKHJlY3QubGVmdCkgPiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYWtlQWJzb2x1dGUgfHwgdGhpcy5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdGhpcy5wYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVYID0gcmVjdC53aWR0aCAvIHRoaXMucGFyZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBzY2FsZVkgPSByZWN0LmhlaWdodCAvIHRoaXMucGFyZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAoeyBzY2FsZVgsIHNjYWxlWSB9ID0gdGhpcy52aWV3LnZpZXdTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQgPyB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IGVkaXRvcixcbiAgICAgICAgICAgIHBvczogdGhpcy5tYW5hZ2VyLnRvb2x0aXBzLm1hcCgodCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0diA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbaV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR2LmdldENvb3JkcyA/IHR2LmdldENvb3Jkcyh0LnBvcykgOiB0aGlzLnZpZXcuY29vcmRzQXRQb3ModC5wb3MpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaXplOiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzLm1hcCgoeyBkb20gfSkgPT4gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxcbiAgICAgICAgICAgIHNwYWNlOiB0aGlzLnZpZXcuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZykudG9vbHRpcFNwYWNlKHRoaXMudmlldyksXG4gICAgICAgICAgICBzY2FsZVgsIHNjYWxlWSwgbWFrZUFic29sdXRlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdyaXRlTWVhc3VyZShtZWFzdXJlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChtZWFzdXJlZC5tYWtlQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRoaXMubWFkZUFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdC5kb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgZWRpdG9yLCBzcGFjZSwgc2NhbGVYLCBzY2FsZVkgfSA9IG1lYXN1cmVkO1xuICAgICAgICBsZXQgb3RoZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYW5hZ2VyLnRvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdG9vbHRpcCA9IHRoaXMubWFuYWdlci50b29sdGlwc1tpXSwgdFZpZXcgPSB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzW2ldLCB7IGRvbSB9ID0gdFZpZXc7XG4gICAgICAgICAgICBsZXQgcG9zID0gbWVhc3VyZWQucG9zW2ldLCBzaXplID0gbWVhc3VyZWQuc2l6ZVtpXTtcbiAgICAgICAgICAgIC8vIEhpZGUgdG9vbHRpcHMgdGhhdCBhcmUgb3V0c2lkZSBvZiB0aGUgZWRpdG9yLlxuICAgICAgICAgICAgaWYgKCFwb3MgfHwgcG9zLmJvdHRvbSA8PSBNYXRoLm1heChlZGl0b3IudG9wLCBzcGFjZS50b3ApIHx8XG4gICAgICAgICAgICAgICAgcG9zLnRvcCA+PSBNYXRoLm1pbihlZGl0b3IuYm90dG9tLCBzcGFjZS5ib3R0b20pIHx8XG4gICAgICAgICAgICAgICAgcG9zLnJpZ2h0IDwgTWF0aC5tYXgoZWRpdG9yLmxlZnQsIHNwYWNlLmxlZnQpIC0gLjEgfHxcbiAgICAgICAgICAgICAgICBwb3MubGVmdCA+IE1hdGgubWluKGVkaXRvci5yaWdodCwgc3BhY2UucmlnaHQpICsgLjEpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhcnJvdyA9IHRvb2x0aXAuYXJyb3cgPyB0Vmlldy5kb20ucXVlcnlTZWxlY3RvcihcIi5jbS10b29sdGlwLWFycm93XCIpIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBhcnJvd0hlaWdodCA9IGFycm93ID8gNyAvKiBBcnJvdy5TaXplICovIDogMDtcbiAgICAgICAgICAgIGxldCB3aWR0aCA9IHNpemUucmlnaHQgLSBzaXplLmxlZnQsIGhlaWdodCA9IChfYSA9IGtub3duSGVpZ2h0LmdldCh0VmlldykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHNpemUuYm90dG9tIC0gc2l6ZS50b3A7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gdFZpZXcub2Zmc2V0IHx8IG5vT2Zmc2V0LCBsdHIgPSB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICAgICAgbGV0IGxlZnQgPSBzaXplLndpZHRoID4gc3BhY2UucmlnaHQgLSBzcGFjZS5sZWZ0ID8gKGx0ciA/IHNwYWNlLmxlZnQgOiBzcGFjZS5yaWdodCAtIHNpemUud2lkdGgpXG4gICAgICAgICAgICAgICAgOiBsdHIgPyBNYXRoLm1pbihwb3MubGVmdCAtIChhcnJvdyA/IDE0IC8qIEFycm93Lk9mZnNldCAqLyA6IDApICsgb2Zmc2V0LngsIHNwYWNlLnJpZ2h0IC0gd2lkdGgpXG4gICAgICAgICAgICAgICAgICAgIDogTWF0aC5tYXgoc3BhY2UubGVmdCwgcG9zLmxlZnQgLSB3aWR0aCArIChhcnJvdyA/IDE0IC8qIEFycm93Lk9mZnNldCAqLyA6IDApIC0gb2Zmc2V0LngpO1xuICAgICAgICAgICAgbGV0IGFib3ZlID0gdGhpcy5hYm92ZVtpXTtcbiAgICAgICAgICAgIGlmICghdG9vbHRpcC5zdHJpY3RTaWRlICYmIChhYm92ZVxuICAgICAgICAgICAgICAgID8gcG9zLnRvcCAtIChzaXplLmJvdHRvbSAtIHNpemUudG9wKSAtIG9mZnNldC55IDwgc3BhY2UudG9wXG4gICAgICAgICAgICAgICAgOiBwb3MuYm90dG9tICsgKHNpemUuYm90dG9tIC0gc2l6ZS50b3ApICsgb2Zmc2V0LnkgPiBzcGFjZS5ib3R0b20pICYmXG4gICAgICAgICAgICAgICAgYWJvdmUgPT0gKHNwYWNlLmJvdHRvbSAtIHBvcy5ib3R0b20gPiBwb3MudG9wIC0gc3BhY2UudG9wKSlcbiAgICAgICAgICAgICAgICBhYm92ZSA9IHRoaXMuYWJvdmVbaV0gPSAhYWJvdmU7XG4gICAgICAgICAgICBsZXQgc3BhY2VWZXJ0ID0gKGFib3ZlID8gcG9zLnRvcCAtIHNwYWNlLnRvcCA6IHNwYWNlLmJvdHRvbSAtIHBvcy5ib3R0b20pIC0gYXJyb3dIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoc3BhY2VWZXJ0IDwgaGVpZ2h0ICYmIHRWaWV3LnJlc2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2VWZXJ0IDwgdGhpcy52aWV3LmRlZmF1bHRMaW5lSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga25vd25IZWlnaHQuc2V0KHRWaWV3LCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSAoaGVpZ2h0ID0gc3BhY2VWZXJ0KSAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5zdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3AgPSBhYm92ZSA/IHBvcy50b3AgLSBoZWlnaHQgLSBhcnJvd0hlaWdodCAtIG9mZnNldC55IDogcG9zLmJvdHRvbSArIGFycm93SGVpZ2h0ICsgb2Zmc2V0Lnk7XG4gICAgICAgICAgICBsZXQgcmlnaHQgPSBsZWZ0ICsgd2lkdGg7XG4gICAgICAgICAgICBpZiAodFZpZXcub3ZlcmxhcCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIG90aGVycylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIubGVmdCA8IHJpZ2h0ICYmIHIucmlnaHQgPiBsZWZ0ICYmIHIudG9wIDwgdG9wICsgaGVpZ2h0ICYmIHIuYm90dG9tID4gdG9wKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gYWJvdmUgPyByLnRvcCAtIGhlaWdodCAtIDIgLSBhcnJvd0hlaWdodCA6IHIuYm90dG9tICsgYXJyb3dIZWlnaHQgKyAyO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9ICh0b3AgLSBtZWFzdXJlZC5wYXJlbnQudG9wKSAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUubGVmdCA9IChsZWZ0IC0gbWVhc3VyZWQucGFyZW50LmxlZnQpIC8gc2NhbGVYICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9IHRvcCAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUubGVmdCA9IGxlZnQgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJyb3cpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyb3dMZWZ0ID0gcG9zLmxlZnQgKyAobHRyID8gb2Zmc2V0LnggOiAtb2Zmc2V0LngpIC0gKGxlZnQgKyAxNCAvKiBBcnJvdy5PZmZzZXQgKi8gLSA3IC8qIEFycm93LlNpemUgKi8pO1xuICAgICAgICAgICAgICAgIGFycm93LnN0eWxlLmxlZnQgPSBhcnJvd0xlZnQgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodFZpZXcub3ZlcmxhcCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICBvdGhlcnMucHVzaCh7IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTogdG9wICsgaGVpZ2h0IH0pO1xuICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC50b2dnbGUoXCJjbS10b29sdGlwLWFib3ZlXCIsIGFib3ZlKTtcbiAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QudG9nZ2xlKFwiY20tdG9vbHRpcC1iZWxvd1wiLCAhYWJvdmUpO1xuICAgICAgICAgICAgaWYgKHRWaWV3LnBvc2l0aW9uZWQpXG4gICAgICAgICAgICAgICAgdFZpZXcucG9zaXRpb25lZChtZWFzdXJlZC5zcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWF5YmVNZWFzdXJlKCkge1xuICAgICAgICBpZiAodGhpcy5tYW5hZ2VyLnRvb2x0aXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5pblZpZXcpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pblZpZXcgIT0gdGhpcy52aWV3LmluVmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5WaWV3ID0gdGhpcy52aWV3LmluVmlldztcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5WaWV3KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0diBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHYuZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59LCB7XG4gICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgc2Nyb2xsKCkgeyB0aGlzLm1heWJlTWVhc3VyZSgpOyB9XG4gICAgfVxufSk7XG5jb25zdCBiYXNlVGhlbWUgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICB6SW5kZXg6IDEwMCxcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNiYmJcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRvb2x0aXAtc2VjdGlvbjpub3QoOmZpcnN0LWNoaWxkKVwiOiB7XG4gICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2JiYlwiLFxuICAgIH0sXG4gICAgXCImZGFyayAuY20tdG9vbHRpcFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMzMzMzM4XCIsXG4gICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICB9LFxuICAgIFwiLmNtLXRvb2x0aXAtYXJyb3dcIjoge1xuICAgICAgICBoZWlnaHQ6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weGAsXG4gICAgICAgIHdpZHRoOiBgJHs3IC8qIEFycm93LlNpemUgKi8gKiAyfXB4YCxcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgekluZGV4OiAtMSxcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIFwiJjpiZWZvcmUsICY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgY29udGVudDogXCInJ1wiLFxuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgYm9yZGVyTGVmdDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkIHRyYW5zcGFyZW50YCxcbiAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgdHJhbnNwYXJlbnRgLFxuICAgICAgICB9LFxuICAgICAgICBcIi5jbS10b29sdGlwLWFib3ZlICZcIjoge1xuICAgICAgICAgICAgYm90dG9tOiBgLSR7NyAvKiBBcnJvdy5TaXplICovfXB4YCxcbiAgICAgICAgICAgIFwiJjpiZWZvcmVcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlclRvcDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNiYmJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiJjphZnRlclwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyVG9wOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2Y1ZjVmNWAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBcIjFweFwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiLmNtLXRvb2x0aXAtYmVsb3cgJlwiOiB7XG4gICAgICAgICAgICB0b3A6IGAtJHs3IC8qIEFycm93LlNpemUgKi99cHhgLFxuICAgICAgICAgICAgXCImOmJlZm9yZVwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2JiYmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCImOmFmdGVyXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjZjVmNWY1YCxcbiAgICAgICAgICAgICAgICB0b3A6IFwiMXB4XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXRvb2x0aXAgLmNtLXRvb2x0aXAtYXJyb3dcIjoge1xuICAgICAgICBcIiY6YmVmb3JlXCI6IHtcbiAgICAgICAgICAgIGJvcmRlclRvcENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiBcIiMzMzMzMzhcIlxuICAgICAgICB9LFxuICAgICAgICBcIiY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgYm9yZGVyVG9wQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuY29uc3Qgbm9PZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbi8qKlxuRmFjZXQgdG8gd2hpY2ggYW4gZXh0ZW5zaW9uIGNhbiBhZGQgYSB2YWx1ZSB0byBzaG93IGEgdG9vbHRpcC5cbiovXG5jb25zdCBzaG93VG9vbHRpcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGVuYWJsZXM6IFt0b29sdGlwUGx1Z2luLCBiYXNlVGhlbWVdXG59KTtcbmNvbnN0IHNob3dIb3ZlclRvb2x0aXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jbGFzcyBIb3ZlclRvb2x0aXBIb3N0IHtcbiAgICAvLyBOZWVkcyB0byBiZSBzdGF0aWMgc28gdGhhdCBob3N0IHRvb2x0aXAgaW5zdGFuY2VzIGFsd2F5cyBtYXRjaFxuICAgIHN0YXRpYyBjcmVhdGUodmlldykge1xuICAgICAgICByZXR1cm4gbmV3IEhvdmVyVG9vbHRpcEhvc3Qodmlldyk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLXRvb2x0aXAtaG92ZXJcIik7XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG5ldyBUb29sdGlwVmlld01hbmFnZXIodmlldywgc2hvd0hvdmVyVG9vbHRpcCwgdCA9PiB0aGlzLmNyZWF0ZUhvc3RlZFZpZXcodCkpO1xuICAgIH1cbiAgICBjcmVhdGVIb3N0ZWRWaWV3KHRvb2x0aXApIHtcbiAgICAgICAgbGV0IGhvc3RlZFZpZXcgPSB0b29sdGlwLmNyZWF0ZSh0aGlzLnZpZXcpO1xuICAgICAgICBob3N0ZWRWaWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcC1zZWN0aW9uXCIpO1xuICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChob3N0ZWRWaWV3LmRvbSk7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQgJiYgaG9zdGVkVmlldy5tb3VudClcbiAgICAgICAgICAgIGhvc3RlZFZpZXcubW91bnQodGhpcy52aWV3KTtcbiAgICAgICAgcmV0dXJuIGhvc3RlZFZpZXc7XG4gICAgfVxuICAgIG1vdW50KHZpZXcpIHtcbiAgICAgICAgZm9yIChsZXQgaG9zdGVkVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBpZiAoaG9zdGVkVmlldy5tb3VudClcbiAgICAgICAgICAgICAgICBob3N0ZWRWaWV3Lm1vdW50KHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHBvc2l0aW9uZWQoc3BhY2UpIHtcbiAgICAgICAgZm9yIChsZXQgaG9zdGVkVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBpZiAoaG9zdGVkVmlldy5wb3NpdGlvbmVkKVxuICAgICAgICAgICAgICAgIGhvc3RlZFZpZXcucG9zaXRpb25lZChzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIudXBkYXRlKHVwZGF0ZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgKF9hID0gdC5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0KTtcbiAgICB9XG4gICAgcGFzc1Byb3AobmFtZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgbGV0IGdpdmVuID0gdmlld1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChnaXZlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2l2ZW47XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IGdpdmVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IG9mZnNldCgpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJvZmZzZXRcIik7IH1cbiAgICBnZXQgZ2V0Q29vcmRzKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcImdldENvb3Jkc1wiKTsgfVxuICAgIGdldCBvdmVybGFwKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcIm92ZXJsYXBcIik7IH1cbiAgICBnZXQgcmVzaXplKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcInJlc2l6ZVwiKTsgfVxufVxuY29uc3Qgc2hvd0hvdmVyVG9vbHRpcEhvc3QgPSAvKkBfX1BVUkVfXyovc2hvd1Rvb2x0aXAuY29tcHV0ZShbc2hvd0hvdmVyVG9vbHRpcF0sIHN0YXRlID0+IHtcbiAgICBsZXQgdG9vbHRpcHMgPSBzdGF0ZS5mYWNldChzaG93SG92ZXJUb29sdGlwKS5maWx0ZXIodCA9PiB0KTtcbiAgICBpZiAodG9vbHRpcHMubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBwb3M6IE1hdGgubWluKC4uLnRvb2x0aXBzLm1hcCh0ID0+IHQucG9zKSksXG4gICAgICAgIGVuZDogTWF0aC5tYXgoLi4udG9vbHRpcHMubWFwKHQgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSB0LmVuZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdC5wb3M7IH0pKSxcbiAgICAgICAgY3JlYXRlOiBIb3ZlclRvb2x0aXBIb3N0LmNyZWF0ZSxcbiAgICAgICAgYWJvdmU6IHRvb2x0aXBzWzBdLmFib3ZlLFxuICAgICAgICBhcnJvdzogdG9vbHRpcHMuc29tZSh0ID0+IHQuYXJyb3cpLFxuICAgIH07XG59KTtcbmNsYXNzIEhvdmVyUGx1Z2luIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzb3VyY2UsIGZpZWxkLCBzZXRIb3ZlciwgaG92ZXJUaW1lKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgICAgIHRoaXMuc2V0SG92ZXIgPSBzZXRIb3ZlcjtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWUgPSBob3ZlclRpbWU7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucmVzdGFydFRpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0TW92ZSA9IHsgeDogMCwgeTogMCwgdGFyZ2V0OiB2aWV3LmRvbSwgdGltZTogMCB9O1xuICAgICAgICB0aGlzLmNoZWNrSG92ZXIgPSB0aGlzLmNoZWNrSG92ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy5tb3VzZWxlYXZlID0gdGhpcy5tb3VzZWxlYXZlLmJpbmQodGhpcykpO1xuICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlID0gdGhpcy5tb3VzZW1vdmUuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc3RhcnRUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucmVzdGFydFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RhcnRIb3ZlcigpLCAyMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5zdGF0ZS5maWVsZCh0aGlzLmZpZWxkKTtcbiAgICB9XG4gICAgY2hlY2tIb3ZlcigpIHtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgaG92ZXJlZCA9IERhdGUubm93KCkgLSB0aGlzLmxhc3RNb3ZlLnRpbWU7XG4gICAgICAgIGlmIChob3ZlcmVkIDwgdGhpcy5ob3ZlclRpbWUpXG4gICAgICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5jaGVja0hvdmVyLCB0aGlzLmhvdmVyVGltZSAtIGhvdmVyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnN0YXJ0SG92ZXIoKTtcbiAgICB9XG4gICAgc3RhcnRIb3ZlcigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzdGFydFRpbWVvdXQpO1xuICAgICAgICBsZXQgeyB2aWV3LCBsYXN0TW92ZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChsYXN0TW92ZS50YXJnZXQpO1xuICAgICAgICBpZiAoIWRlc2MpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBwb3MsIHNpZGUgPSAxO1xuICAgICAgICBpZiAoZGVzYyBpbnN0YW5jZW9mIFdpZGdldFZpZXcpIHtcbiAgICAgICAgICAgIHBvcyA9IGRlc2MucG9zQXRTdGFydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvcyA9IHZpZXcucG9zQXRDb29yZHMobGFzdE1vdmUpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBwb3NDb29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKHBvcyk7XG4gICAgICAgICAgICBpZiAoIXBvc0Nvb3JkcyB8fFxuICAgICAgICAgICAgICAgIGxhc3RNb3ZlLnkgPCBwb3NDb29yZHMudG9wIHx8IGxhc3RNb3ZlLnkgPiBwb3NDb29yZHMuYm90dG9tIHx8XG4gICAgICAgICAgICAgICAgbGFzdE1vdmUueCA8IHBvc0Nvb3Jkcy5sZWZ0IC0gdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGggfHxcbiAgICAgICAgICAgICAgICBsYXN0TW92ZS54ID4gcG9zQ29vcmRzLnJpZ2h0ICsgdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IGJpZGkgPSB2aWV3LmJpZGlTcGFucyh2aWV3LnN0YXRlLmRvYy5saW5lQXQocG9zKSkuZmluZChzID0+IHMuZnJvbSA8PSBwb3MgJiYgcy50byA+PSBwb3MpO1xuICAgICAgICAgICAgbGV0IHJ0bCA9IGJpZGkgJiYgYmlkaS5kaXIgPT0gRGlyZWN0aW9uLlJUTCA/IC0xIDogMTtcbiAgICAgICAgICAgIHNpZGUgPSAobGFzdE1vdmUueCA8IHBvc0Nvb3Jkcy5sZWZ0ID8gLXJ0bCA6IHJ0bCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZW4gPSB0aGlzLnNvdXJjZSh2aWV3LCBwb3MsIHNpZGUpO1xuICAgICAgICBpZiAob3BlbiA9PT0gbnVsbCB8fCBvcGVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcGVuLnRoZW4pIHtcbiAgICAgICAgICAgIGxldCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nID0geyBwb3MgfTtcbiAgICAgICAgICAgIG9wZW4udGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmcgPT0gcGVuZGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YocmVzdWx0KSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlID0+IGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcImhvdmVyIHRvb2x0aXBcIikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKG9wZW4pIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB0b29sdGlwKCkge1xuICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy52aWV3LnBsdWdpbih0b29sdGlwUGx1Z2luKTtcbiAgICAgICAgbGV0IGluZGV4ID0gcGx1Z2luID8gcGx1Z2luLm1hbmFnZXIudG9vbHRpcHMuZmluZEluZGV4KHQgPT4gdC5jcmVhdGUgPT0gSG92ZXJUb29sdGlwSG9zdC5jcmVhdGUpIDogLTE7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gcGx1Z2luLm1hbmFnZXIudG9vbHRpcFZpZXdzW2luZGV4XSA6IG51bGw7XG4gICAgfVxuICAgIG1vdXNlbW92ZShldmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMubGFzdE1vdmUgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFksIHRhcmdldDogZXZlbnQudGFyZ2V0LCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGlmICh0aGlzLmhvdmVyVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5jaGVja0hvdmVyLCB0aGlzLmhvdmVyVGltZSk7XG4gICAgICAgIGxldCB7IGFjdGl2ZSwgdG9vbHRpcCB9ID0gdGhpcztcbiAgICAgICAgaWYgKGFjdGl2ZSAmJiB0b29sdGlwICYmICFpc0luVG9vbHRpcCh0b29sdGlwLmRvbSwgZXZlbnQpIHx8IHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgbGV0IHsgcG9zIH0gPSBhY3RpdmUgfHwgdGhpcy5wZW5kaW5nLCBlbmQgPSAoX2EgPSBhY3RpdmUgPT09IG51bGwgfHwgYWN0aXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY3RpdmUuZW5kKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBwb3M7XG4gICAgICAgICAgICBpZiAoKHBvcyA9PSBlbmQgPyB0aGlzLnZpZXcucG9zQXRDb29yZHModGhpcy5sYXN0TW92ZSkgIT0gcG9zXG4gICAgICAgICAgICAgICAgOiAhaXNPdmVyUmFuZ2UodGhpcy52aWV3LCBwb3MsIGVuZCwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihudWxsKSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG1vdXNlbGVhdmUoZXZlbnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaG92ZXJUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSAtMTtcbiAgICAgICAgbGV0IHsgYWN0aXZlIH0gPSB0aGlzO1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgICBsZXQgeyB0b29sdGlwIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IGluVG9vbHRpcCA9IHRvb2x0aXAgJiYgdG9vbHRpcC5kb20uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCk7XG4gICAgICAgICAgICBpZiAoIWluVG9vbHRpcClcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKG51bGwpIH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hUb29sdGlwTGVhdmUodG9vbHRpcC5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdhdGNoVG9vbHRpcExlYXZlKHRvb2x0aXApIHtcbiAgICAgICAgbGV0IHdhdGNoID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0b29sdGlwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHdhdGNoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSAmJiAhdGhpcy52aWV3LmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKG51bGwpIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0b29sdGlwLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHdhdGNoKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaG92ZXJUaW1lb3V0KTtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLm1vdXNlbGVhdmUpO1xuICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmUpO1xuICAgIH1cbn1cbmNvbnN0IHRvb2x0aXBNYXJnaW4gPSA0O1xuZnVuY3Rpb24gaXNJblRvb2x0aXAodG9vbHRpcCwgZXZlbnQpIHtcbiAgICBsZXQgcmVjdCA9IHRvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFggPj0gcmVjdC5sZWZ0IC0gdG9vbHRpcE1hcmdpbiAmJiBldmVudC5jbGllbnRYIDw9IHJlY3QucmlnaHQgKyB0b29sdGlwTWFyZ2luICYmXG4gICAgICAgIGV2ZW50LmNsaWVudFkgPj0gcmVjdC50b3AgLSB0b29sdGlwTWFyZ2luICYmIGV2ZW50LmNsaWVudFkgPD0gcmVjdC5ib3R0b20gKyB0b29sdGlwTWFyZ2luO1xufVxuZnVuY3Rpb24gaXNPdmVyUmFuZ2UodmlldywgZnJvbSwgdG8sIHgsIHksIG1hcmdpbikge1xuICAgIGxldCByZWN0ID0gdmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRvY0JvdHRvbSA9IHZpZXcuZG9jdW1lbnRUb3AgKyB2aWV3LmRvY3VtZW50UGFkZGluZy50b3AgKyB2aWV3LmNvbnRlbnRIZWlnaHQ7XG4gICAgaWYgKHJlY3QubGVmdCA+IHggfHwgcmVjdC5yaWdodCA8IHggfHwgcmVjdC50b3AgPiB5IHx8IE1hdGgubWluKHJlY3QuYm90dG9tLCBkb2NCb3R0b20pIDwgeSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeCwgeSB9LCBmYWxzZSk7XG4gICAgcmV0dXJuIHBvcyA+PSBmcm9tICYmIHBvcyA8PSB0bztcbn1cbi8qKlxuU2V0IHVwIGEgaG92ZXIgdG9vbHRpcCwgd2hpY2ggc2hvd3MgdXAgd2hlbiB0aGUgcG9pbnRlciBob3ZlcnNcbm92ZXIgcmFuZ2VzIG9mIHRleHQuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgbW91c2UgaG92ZXJzXG5vdmVyIHRoZSBkb2N1bWVudCB0ZXh0LiBJdCBzaG91bGQsIGlmIHRoZXJlIGlzIGEgdG9vbHRpcFxuYXNzb2NpYXRlZCB3aXRoIHBvc2l0aW9uIGBwb3NgLCByZXR1cm4gdGhlIHRvb2x0aXAgZGVzY3JpcHRpb25cbihlaXRoZXIgZGlyZWN0bHkgb3IgaW4gYSBwcm9taXNlKS4gVGhlIGBzaWRlYCBhcmd1bWVudCBpbmRpY2F0ZXNcbm9uIHdoaWNoIHNpZGUgb2YgdGhlIHBvc2l0aW9uIHRoZSBwb2ludGVyIGlzXHUyMDE0aXQgd2lsbCBiZSAtMSBpZiB0aGVcbnBvaW50ZXIgaXMgYmVmb3JlIHRoZSBwb3NpdGlvbiwgMSBpZiBhZnRlciB0aGUgcG9zaXRpb24uXG5cbk5vdGUgdGhhdCBhbGwgaG92ZXIgdG9vbHRpcHMgYXJlIGhvc3RlZCB3aXRoaW4gYSBzaW5nbGUgdG9vbHRpcFxuY29udGFpbmVyIGVsZW1lbnQuIFRoaXMgYWxsb3dzIG11bHRpcGxlIHRvb2x0aXBzIG92ZXIgdGhlIHNhbWVcbnJhbmdlIHRvIGJlIFwibWVyZ2VkXCIgdG9nZXRoZXIgd2l0aG91dCBvdmVybGFwcGluZy5cbiovXG5mdW5jdGlvbiBob3ZlclRvb2x0aXAoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgc2V0SG92ZXIgPSBTdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbiAgICBsZXQgaG92ZXJTdGF0ZSA9IFN0YXRlRmllbGQuZGVmaW5lKHtcbiAgICAgICAgY3JlYXRlKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgdXBkYXRlKHZhbHVlLCB0cikge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIChvcHRpb25zLmhpZGVPbkNoYW5nZSAmJiAodHIuZG9jQ2hhbmdlZCB8fCB0ci5zZWxlY3Rpb24pIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oaWRlT24gJiYgb3B0aW9ucy5oaWRlT24odHIsIHZhbHVlKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHIuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdQb3MgPSB0ci5jaGFuZ2VzLm1hcFBvcyh2YWx1ZS5wb3MsIC0xLCBNYXBNb2RlLlRyYWNrRGVsKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3UG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBjb3B5ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29weS5wb3MgPSBuZXdQb3M7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVuZCAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBjb3B5LmVuZCA9IHRyLmNoYW5nZXMubWFwUG9zKHZhbHVlLmVuZCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjb3B5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIHRyLmVmZmVjdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKHNldEhvdmVyKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhjbG9zZUhvdmVyVG9vbHRpcEVmZmVjdCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdmlkZTogZiA9PiBzaG93SG92ZXJUb29sdGlwLmZyb20oZilcbiAgICB9KTtcbiAgICByZXR1cm4gW1xuICAgICAgICBob3ZlclN0YXRlLFxuICAgICAgICBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBIb3ZlclBsdWdpbih2aWV3LCBzb3VyY2UsIGhvdmVyU3RhdGUsIHNldEhvdmVyLCBvcHRpb25zLmhvdmVyVGltZSB8fCAzMDAgLyogSG92ZXIuVGltZSAqLykpLFxuICAgICAgICBzaG93SG92ZXJUb29sdGlwSG9zdFxuICAgIF07XG59XG4vKipcbkdldCB0aGUgYWN0aXZlIHRvb2x0aXAgdmlldyBmb3IgYSBnaXZlbiB0b29sdGlwLCBpZiBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gZ2V0VG9vbHRpcCh2aWV3LCB0b29sdGlwKSB7XG4gICAgbGV0IHBsdWdpbiA9IHZpZXcucGx1Z2luKHRvb2x0aXBQbHVnaW4pO1xuICAgIGlmICghcGx1Z2luKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBwbHVnaW4ubWFuYWdlci50b29sdGlwcy5pbmRleE9mKHRvb2x0aXApO1xuICAgIHJldHVybiBmb3VuZCA8IDAgPyBudWxsIDogcGx1Z2luLm1hbmFnZXIudG9vbHRpcFZpZXdzW2ZvdW5kXTtcbn1cbi8qKlxuUmV0dXJucyB0cnVlIGlmIGFueSBob3ZlciB0b29sdGlwcyBhcmUgY3VycmVudGx5IGFjdGl2ZS5cbiovXG5mdW5jdGlvbiBoYXNIb3ZlclRvb2x0aXBzKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZhY2V0KHNob3dIb3ZlclRvb2x0aXApLnNvbWUoeCA9PiB4KTtcbn1cbmNvbnN0IGNsb3NlSG92ZXJUb29sdGlwRWZmZWN0ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5UcmFuc2FjdGlvbiBlZmZlY3QgdGhhdCBjbG9zZXMgYWxsIGhvdmVyIHRvb2x0aXBzLlxuKi9cbmNvbnN0IGNsb3NlSG92ZXJUb29sdGlwcyA9IC8qQF9fUFVSRV9fKi9jbG9zZUhvdmVyVG9vbHRpcEVmZmVjdC5vZihudWxsKTtcbi8qKlxuVGVsbCB0aGUgdG9vbHRpcCBleHRlbnNpb24gdG8gcmVjb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0aXZlXG50b29sdGlwcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgKHN1Y2ggYXMgYVxucmUtcG9zaXRpb25pbmcgb3IgQ1NTIGNoYW5nZSBhZmZlY3RpbmcgdGhlIGVkaXRvcikgdGhhdCBjb3VsZFxuaW52YWxpZGF0ZSB0aGUgZXhpc3RpbmcgdG9vbHRpcCBwb3NpdGlvbnMuXG4qL1xuZnVuY3Rpb24gcmVwb3NpdGlvblRvb2x0aXBzKHZpZXcpIHtcbiAgICBsZXQgcGx1Z2luID0gdmlldy5wbHVnaW4odG9vbHRpcFBsdWdpbik7XG4gICAgaWYgKHBsdWdpbilcbiAgICAgICAgcGx1Z2luLm1heWJlTWVhc3VyZSgpO1xufVxuXG5jb25zdCBwYW5lbENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICBsZXQgdG9wQ29udGFpbmVyLCBib3R0b21Db250YWluZXI7XG4gICAgICAgIGZvciAobGV0IGMgb2YgY29uZmlncykge1xuICAgICAgICAgICAgdG9wQ29udGFpbmVyID0gdG9wQ29udGFpbmVyIHx8IGMudG9wQ29udGFpbmVyO1xuICAgICAgICAgICAgYm90dG9tQ29udGFpbmVyID0gYm90dG9tQ29udGFpbmVyIHx8IGMuYm90dG9tQ29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRvcENvbnRhaW5lciwgYm90dG9tQ29udGFpbmVyIH07XG4gICAgfVxufSk7XG4vKipcbkNvbmZpZ3VyZXMgdGhlIHBhbmVsLW1hbmFnaW5nIGV4dGVuc2lvbi5cbiovXG5mdW5jdGlvbiBwYW5lbHMoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZyA/IFtwYW5lbENvbmZpZy5vZihjb25maWcpXSA6IFtdO1xufVxuLyoqXG5HZXQgdGhlIGFjdGl2ZSBwYW5lbCBjcmVhdGVkIGJ5IHRoZSBnaXZlbiBjb25zdHJ1Y3RvciwgaWYgYW55LlxuVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IG5lZWQgYWNjZXNzIHRvIHlvdXIgcGFuZWxzJyBET01cbnN0cnVjdHVyZS5cbiovXG5mdW5jdGlvbiBnZXRQYW5lbCh2aWV3LCBwYW5lbCkge1xuICAgIGxldCBwbHVnaW4gPSB2aWV3LnBsdWdpbihwYW5lbFBsdWdpbik7XG4gICAgbGV0IGluZGV4ID0gcGx1Z2luID8gcGx1Z2luLnNwZWNzLmluZGV4T2YocGFuZWwpIDogLTE7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBwbHVnaW4ucGFuZWxzW2luZGV4XSA6IG51bGw7XG59XG5jb25zdCBwYW5lbFBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLmlucHV0ID0gdmlldy5zdGF0ZS5mYWNldChzaG93UGFuZWwpO1xuICAgICAgICB0aGlzLnNwZWNzID0gdGhpcy5pbnB1dC5maWx0ZXIocyA9PiBzKTtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB0aGlzLnNwZWNzLm1hcChzcGVjID0+IHNwZWModmlldykpO1xuICAgICAgICBsZXQgY29uZiA9IHZpZXcuc3RhdGUuZmFjZXQocGFuZWxDb25maWcpO1xuICAgICAgICB0aGlzLnRvcCA9IG5ldyBQYW5lbEdyb3VwKHZpZXcsIHRydWUsIGNvbmYudG9wQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5ib3R0b20gPSBuZXcgUGFuZWxHcm91cCh2aWV3LCBmYWxzZSwgY29uZi5ib3R0b21Db250YWluZXIpO1xuICAgICAgICB0aGlzLnRvcC5zeW5jKHRoaXMucGFuZWxzLmZpbHRlcihwID0+IHAudG9wKSk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmModGhpcy5wYW5lbHMuZmlsdGVyKHAgPT4gIXAudG9wKSk7XG4gICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpIHtcbiAgICAgICAgICAgIHAuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1wYW5lbFwiKTtcbiAgICAgICAgICAgIGlmIChwLm1vdW50KVxuICAgICAgICAgICAgICAgIHAubW91bnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBjb25mID0gdXBkYXRlLnN0YXRlLmZhY2V0KHBhbmVsQ29uZmlnKTtcbiAgICAgICAgaWYgKHRoaXMudG9wLmNvbnRhaW5lciAhPSBjb25mLnRvcENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy50b3Auc3luYyhbXSk7XG4gICAgICAgICAgICB0aGlzLnRvcCA9IG5ldyBQYW5lbEdyb3VwKHVwZGF0ZS52aWV3LCB0cnVlLCBjb25mLnRvcENvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYm90dG9tLmNvbnRhaW5lciAhPSBjb25mLmJvdHRvbUNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5ib3R0b20uc3luYyhbXSk7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbSA9IG5ldyBQYW5lbEdyb3VwKHVwZGF0ZS52aWV3LCBmYWxzZSwgY29uZi5ib3R0b21Db250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9wLnN5bmNDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmNDbGFzc2VzKCk7XG4gICAgICAgIGxldCBpbnB1dCA9IHVwZGF0ZS5zdGF0ZS5mYWNldChzaG93UGFuZWwpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gdGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgbGV0IHNwZWNzID0gaW5wdXQuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBsZXQgcGFuZWxzID0gW10sIHRvcCA9IFtdLCBib3R0b20gPSBbXSwgbW91bnQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgICAgICAgICAgICBsZXQga25vd24gPSB0aGlzLnNwZWNzLmluZGV4T2Yoc3BlYyksIHBhbmVsO1xuICAgICAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwgPSBzcGVjKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgbW91bnQucHVzaChwYW5lbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IHRoaXMucGFuZWxzW2tub3duXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhbmVsLnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYW5lbHMucHVzaChwYW5lbCk7XG4gICAgICAgICAgICAgICAgKHBhbmVsLnRvcCA/IHRvcCA6IGJvdHRvbSkucHVzaChwYW5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNwZWNzID0gc3BlY3M7XG4gICAgICAgICAgICB0aGlzLnBhbmVscyA9IHBhbmVscztcbiAgICAgICAgICAgIHRoaXMudG9wLnN5bmModG9wKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tLnN5bmMoYm90dG9tKTtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgbW91bnQpIHtcbiAgICAgICAgICAgICAgICBwLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tcGFuZWxcIik7XG4gICAgICAgICAgICAgICAgaWYgKHAubW91bnQpXG4gICAgICAgICAgICAgICAgICAgIHAubW91bnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpXG4gICAgICAgICAgICAgICAgaWYgKHAudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICBwLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG9wLnN5bmMoW10pO1xuICAgICAgICB0aGlzLmJvdHRvbS5zeW5jKFtdKTtcbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IEVkaXRvclZpZXcuc2Nyb2xsTWFyZ2lucy5vZih2aWV3ID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdmlldy5wbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHsgdG9wOiB2YWx1ZS50b3Auc2Nyb2xsTWFyZ2luKCksIGJvdHRvbTogdmFsdWUuYm90dG9tLnNjcm9sbE1hcmdpbigpIH07XG4gICAgfSlcbn0pO1xuY2xhc3MgUGFuZWxHcm91cCB7XG4gICAgY29uc3RydWN0b3IodmlldywgdG9wLCBjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgICAgICB0aGlzLmRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gXCJcIjtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSBbXTtcbiAgICAgICAgdGhpcy5zeW5jQ2xhc3NlcygpO1xuICAgIH1cbiAgICBzeW5jKHBhbmVscykge1xuICAgICAgICBmb3IgKGxldCBwIG9mIHRoaXMucGFuZWxzKVxuICAgICAgICAgICAgaWYgKHAuZGVzdHJveSAmJiBwYW5lbHMuaW5kZXhPZihwKSA8IDApXG4gICAgICAgICAgICAgICAgcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucGFuZWxzID0gcGFuZWxzO1xuICAgICAgICB0aGlzLnN5bmNET00oKTtcbiAgICB9XG4gICAgc3luY0RPTSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSB0aGlzLnRvcCA/IFwiY20tcGFuZWxzIGNtLXBhbmVscy10b3BcIiA6IFwiY20tcGFuZWxzIGNtLXBhbmVscy1ib3R0b21cIjtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlW3RoaXMudG9wID8gXCJ0b3BcIiA6IFwiYm90dG9tXCJdID0gXCIwXCI7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5jb250YWluZXIgfHwgdGhpcy52aWV3LmRvbTtcbiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHRoaXMudG9wID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VyRE9NID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcbiAgICAgICAgZm9yIChsZXQgcGFuZWwgb2YgdGhpcy5wYW5lbHMpIHtcbiAgICAgICAgICAgIGlmIChwYW5lbC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJET00gIT0gcGFuZWwuZG9tKVxuICAgICAgICAgICAgICAgICAgICBjdXJET00gPSBybShjdXJET00pO1xuICAgICAgICAgICAgICAgIGN1ckRPTSA9IGN1ckRPTS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYW5lbC5kb20sIGN1ckRPTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGN1ckRPTSlcbiAgICAgICAgICAgIGN1ckRPTSA9IHJtKGN1ckRPTSk7XG4gICAgfVxuICAgIHNjcm9sbE1hcmdpbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRvbSB8fCB0aGlzLmNvbnRhaW5lciA/IDBcbiAgICAgICAgICAgIDogTWF0aC5tYXgoMCwgdGhpcy50b3AgP1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtIE1hdGgubWF4KDAsIHRoaXMudmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKSA6XG4gICAgICAgICAgICAgICAgTWF0aC5taW4oaW5uZXJIZWlnaHQsIHRoaXMudmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKSAtIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCk7XG4gICAgfVxuICAgIHN5bmNDbGFzc2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8IHRoaXMuY2xhc3NlcyA9PSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBjbHMgb2YgdGhpcy5jbGFzc2VzLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICAgICAgICBmb3IgKGxldCBjbHMgb2YgKHRoaXMuY2xhc3NlcyA9IHRoaXMudmlldy50aGVtZUNsYXNzZXMpLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChjbHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJtKG5vZGUpIHtcbiAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgbm9kZS5yZW1vdmUoKTtcbiAgICByZXR1cm4gbmV4dDtcbn1cbi8qKlxuT3BlbmluZyBhIHBhbmVsIGlzIGRvbmUgYnkgcHJvdmlkaW5nIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yXG50aGUgcGFuZWwgdGhyb3VnaCB0aGlzIGZhY2V0LiAoVGhlIHBhbmVsIGlzIGNsb3NlZCBhZ2FpbiB3aGVuIGl0c1xuY29uc3RydWN0b3IgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkLikgVmFsdWVzIG9mIGBudWxsYCBhcmUgaWdub3JlZC5cbiovXG5jb25zdCBzaG93UGFuZWwgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBlbmFibGVzOiBwYW5lbFBsdWdpblxufSk7XG5cbi8qKlxuQSBndXR0ZXIgbWFya2VyIHJlcHJlc2VudHMgYSBiaXQgb2YgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gYSBsaW5lXG5pbiBhIHNwZWNpZmljIGd1dHRlci4gWW91ciBvd24gY3VzdG9tIG1hcmtlcnMgaGF2ZSB0byBleHRlbmQgdGhpc1xuY2xhc3MuXG4qL1xuY2xhc3MgR3V0dGVyTWFya2VyIGV4dGVuZHMgUmFuZ2VWYWx1ZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHRoaXMuY29uc3RydWN0b3IgPT0gb3RoZXIuY29uc3RydWN0b3IgJiYgdGhpcy5lcShvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBtYXJrZXIgdG8gYW5vdGhlciBtYXJrZXIgb2YgdGhlIHNhbWUgdHlwZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIENhbGxlZCBpZiB0aGUgbWFya2VyIGhhcyBhIGB0b0RPTWAgbWV0aG9kIGFuZCBpdHMgcmVwcmVzZW50YXRpb25cbiAgICB3YXMgcmVtb3ZlZCBmcm9tIGEgZ3V0dGVyLlxuICAgICovXG4gICAgZGVzdHJveShkb20pIHsgfVxufVxuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5lbGVtZW50Q2xhc3MgPSBcIlwiO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS50b0RPTSA9IHVuZGVmaW5lZDtcbkd1dHRlck1hcmtlci5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tCZWZvcmU7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnN0YXJ0U2lkZSA9IEd1dHRlck1hcmtlci5wcm90b3R5cGUuZW5kU2lkZSA9IC0xO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5wb2ludCA9IHRydWU7XG4vKipcbkZhY2V0IHVzZWQgdG8gYWRkIGEgY2xhc3MgdG8gYWxsIGd1dHRlciBlbGVtZW50cyBmb3IgYSBnaXZlbiBsaW5lLlxuTWFya2VycyBnaXZlbiB0byB0aGlzIGZhY2V0IHNob3VsZCBfb25seV8gZGVmaW5lIGFuXG5bYGVsZW1lbnRjbGFzc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5HdXR0ZXJNYXJrZXIuZWxlbWVudENsYXNzKSwgbm90IGFcbltgdG9ET01gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuR3V0dGVyTWFya2VyLnRvRE9NKSAob3IgdGhlIG1hcmtlciB3aWxsIGFwcGVhclxuaW4gYWxsIGd1dHRlcnMgZm9yIHRoZSBsaW5lKS5cbiovXG5jb25zdCBndXR0ZXJMaW5lQ2xhc3MgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgICBjbGFzczogXCJcIixcbiAgICByZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcbiAgICBlbGVtZW50U3R5bGU6IFwiXCIsXG4gICAgbWFya2VyczogKCkgPT4gUmFuZ2VTZXQuZW1wdHksXG4gICAgbGluZU1hcmtlcjogKCkgPT4gbnVsbCxcbiAgICB3aWRnZXRNYXJrZXI6ICgpID0+IG51bGwsXG4gICAgbGluZU1hcmtlckNoYW5nZTogbnVsbCxcbiAgICBpbml0aWFsU3BhY2VyOiBudWxsLFxuICAgIHVwZGF0ZVNwYWNlcjogbnVsbCxcbiAgICBkb21FdmVudEhhbmRsZXJzOiB7fVxufTtcbmNvbnN0IGFjdGl2ZUd1dHRlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkRlZmluZSBhbiBlZGl0b3IgZ3V0dGVyLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGd1dHRlcnMgYXBwZWFyIGlzXG5kZXRlcm1pbmVkIGJ5IHRoZWlyIGV4dGVuc2lvbiBwcmlvcml0eS5cbiovXG5mdW5jdGlvbiBndXR0ZXIoY29uZmlnKSB7XG4gICAgcmV0dXJuIFtndXR0ZXJzKCksIGFjdGl2ZUd1dHRlcnMub2YoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyksIGNvbmZpZykpXTtcbn1cbmNvbnN0IHVuZml4R3V0dGVycyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpXG59KTtcbi8qKlxuVGhlIGd1dHRlci1kcmF3aW5nIHBsdWdpbiBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiB5b3UgYWRkIGFcbmd1dHRlciwgYnV0IHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZXhwbGljaXRseSBjb25maWd1cmUgaXQuXG5cblVubGVzcyBgZml4ZWRgIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGBmYWxzZWAsIHRoZSBndXR0ZXJzIGFyZVxuZml4ZWQsIG1lYW5pbmcgdGhleSBkb24ndCBzY3JvbGwgYWxvbmcgd2l0aCB0aGUgY29udGVudFxuaG9yaXpvbnRhbGx5IChleGNlcHQgb24gSW50ZXJuZXQgRXhwbG9yZXIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydFxuQ1NTIFtgcG9zaXRpb246XG5zdGlja3lgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcG9zaXRpb24jc3RpY2t5KSkuXG4qL1xuZnVuY3Rpb24gZ3V0dGVycyhjb25maWcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW1xuICAgICAgICBndXR0ZXJWaWV3LFxuICAgIF07XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuZml4ZWQgPT09IGZhbHNlKVxuICAgICAgICByZXN1bHQucHVzaCh1bmZpeEd1dHRlcnMub2YodHJ1ZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBndXR0ZXJWaWV3ID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucHJldlZpZXdwb3J0ID0gdmlldy52aWV3cG9ydDtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlcnNcIjtcbiAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSAodGhpcy52aWV3LmNvbnRlbnRIZWlnaHQgLyB0aGlzLnZpZXcuc2NhbGVZKSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5ndXR0ZXJzID0gdmlldy5zdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKS5tYXAoY29uZiA9PiBuZXcgU2luZ2xlR3V0dGVyVmlldyh2aWV3LCBjb25mKSk7XG4gICAgICAgIGZvciAobGV0IGd1dHRlciBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChndXR0ZXIuZG9tKTtcbiAgICAgICAgdGhpcy5maXhlZCA9ICF2aWV3LnN0YXRlLmZhY2V0KHVuZml4R3V0dGVycyk7XG4gICAgICAgIGlmICh0aGlzLmZpeGVkKSB7XG4gICAgICAgICAgICAvLyBGSVhNRSBJRTExIGZhbGxiYWNrLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgcG9zaXRpb246IHN0aWNreSxcbiAgICAgICAgICAgIC8vIGJ5IHVzaW5nIHBvc2l0aW9uOiByZWxhdGl2ZSArIGV2ZW50IGhhbmRsZXJzIHRoYXQgcmVhbGlnbiB0aGVcbiAgICAgICAgICAgIC8vIGd1dHRlciAob3IganVzdCBmb3JjZSBmaXhlZD1mYWxzZSBvbiBJRTExPylcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnBvc2l0aW9uID0gXCJzdGlja3lcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNHdXR0ZXJzKGZhbHNlKTtcbiAgICAgICAgdmlldy5zY3JvbGxET00uaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCB2aWV3LmNvbnRlbnRET00pO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUd1dHRlcnModXBkYXRlKSkge1xuICAgICAgICAgICAgLy8gRGV0YWNoIGR1cmluZyBzeW5jIHdoZW4gdGhlIHZpZXdwb3J0IGNoYW5nZWQgc2lnbmlmaWNhbnRseVxuICAgICAgICAgICAgLy8gKHN1Y2ggYXMgZHVyaW5nIHNjcm9sbGluZyksIHNpbmNlIGZvciBsYXJnZSB1cGRhdGVzIHRoYXQgaXNcbiAgICAgICAgICAgIC8vIGZhc3Rlci5cbiAgICAgICAgICAgIGxldCB2cEEgPSB0aGlzLnByZXZWaWV3cG9ydCwgdnBCID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG4gICAgICAgICAgICBsZXQgdnBPdmVybGFwID0gTWF0aC5taW4odnBBLnRvLCB2cEIudG8pIC0gTWF0aC5tYXgodnBBLmZyb20sIHZwQi5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0d1dHRlcnModnBPdmVybGFwIDwgKHZwQi50byAtIHZwQi5mcm9tKSAqIDAuOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpXG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLnZpZXcuY29udGVudEhlaWdodCArIFwicHhcIjtcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZS5mYWNldCh1bmZpeEd1dHRlcnMpICE9ICF0aGlzLmZpeGVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpeGVkID0gIXRoaXMuZml4ZWQ7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5wb3NpdGlvbiA9IHRoaXMuZml4ZWQgPyBcInN0aWNreVwiIDogXCJcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXZWaWV3cG9ydCA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuICAgIH1cbiAgICBzeW5jR3V0dGVycyhkZXRhY2gpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gdGhpcy5kb20ubmV4dFNpYmxpbmc7XG4gICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgbGV0IGxpbmVDbGFzc2VzID0gUmFuZ2VTZXQuaXRlcih0aGlzLnZpZXcuc3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdGhpcy52aWV3LnZpZXdwb3J0LmZyb20pO1xuICAgICAgICBsZXQgY2xhc3NTZXQgPSBbXTtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gdGhpcy5ndXR0ZXJzLm1hcChndXR0ZXIgPT4gbmV3IFVwZGF0ZUNvbnRleHQoZ3V0dGVyLCB0aGlzLnZpZXcudmlld3BvcnQsIC10aGlzLnZpZXcuZG9jdW1lbnRQYWRkaW5nLnRvcCkpO1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudmlldy52aWV3cG9ydExpbmVCbG9ja3MpIHtcbiAgICAgICAgICAgIGlmIChjbGFzc1NldC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgY2xhc3NTZXQgPSBbXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGIgb2YgbGluZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQgJiYgZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VDdXJzb3IobGluZUNsYXNzZXMsIGNsYXNzU2V0LCBiLmZyb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3gubGluZSh0aGlzLnZpZXcsIGIsIGNsYXNzU2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYi53aWRnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LndpZGdldCh0aGlzLnZpZXcsIGIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGluZS50eXBlID09IEJsb2NrVHlwZS5UZXh0KSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZUN1cnNvcihsaW5lQ2xhc3NlcywgY2xhc3NTZXQsIGxpbmUuZnJvbSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgIGN4LmxpbmUodGhpcy52aWV3LCBsaW5lLCBjbGFzc1NldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaW5lLndpZGdldCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgICAgICAgICBjeC53aWRnZXQodGhpcy52aWV3LCBsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgIGN4LmZpbmlzaCgpO1xuICAgICAgICBpZiAoZGV0YWNoKVxuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbERPTS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIGFmdGVyKTtcbiAgICB9XG4gICAgdXBkYXRlR3V0dGVycyh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXYgPSB1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKSwgY3VyID0gdXBkYXRlLnN0YXRlLmZhY2V0KGFjdGl2ZUd1dHRlcnMpO1xuICAgICAgICBsZXQgY2hhbmdlID0gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLmhlaWdodENoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fFxuICAgICAgICAgICAgIVJhbmdlU2V0LmVxKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGd1dHRlckxpbmVDbGFzcyksIHVwZGF0ZS5zdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLCB1cGRhdGUudmlldy52aWV3cG9ydC5mcm9tLCB1cGRhdGUudmlldy52aWV3cG9ydC50byk7XG4gICAgICAgIGlmIChwcmV2ID09IGN1cikge1xuICAgICAgICAgICAgZm9yIChsZXQgZ3V0dGVyIG9mIHRoaXMuZ3V0dGVycylcbiAgICAgICAgICAgICAgICBpZiAoZ3V0dGVyLnVwZGF0ZSh1cGRhdGUpKVxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBndXR0ZXJzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBjb25mIG9mIGN1cikge1xuICAgICAgICAgICAgICAgIGxldCBrbm93biA9IHByZXYuaW5kZXhPZihjb25mKTtcbiAgICAgICAgICAgICAgICBpZiAoa25vd24gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGd1dHRlcnMucHVzaChuZXcgU2luZ2xlR3V0dGVyVmlldyh0aGlzLnZpZXcsIGNvbmYpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3V0dGVyc1trbm93bl0udXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGd1dHRlcnMucHVzaCh0aGlzLmd1dHRlcnNba25vd25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBnIG9mIHRoaXMuZ3V0dGVycykge1xuICAgICAgICAgICAgICAgIGcuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChndXR0ZXJzLmluZGV4T2YoZykgPCAwKVxuICAgICAgICAgICAgICAgICAgICBnLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGcgb2YgZ3V0dGVycylcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChnLmRvbSk7XG4gICAgICAgICAgICB0aGlzLmd1dHRlcnMgPSBndXR0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5ndXR0ZXJzKVxuICAgICAgICAgICAgdmlldy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgIH1cbn0sIHtcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4gRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zLm9mKHZpZXcgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmd1dHRlcnMubGVuZ3RoID09IDAgfHwgIXZhbHVlLmZpeGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB2aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUlxuICAgICAgICAgICAgPyB7IGxlZnQ6IHZhbHVlLmRvbS5vZmZzZXRXaWR0aCAqIHZpZXcuc2NhbGVYIH1cbiAgICAgICAgICAgIDogeyByaWdodDogdmFsdWUuZG9tLm9mZnNldFdpZHRoICogdmlldy5zY2FsZVggfTtcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBhc0FycmF5KHZhbCkgeyByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdKTsgfVxuZnVuY3Rpb24gYWR2YW5jZUN1cnNvcihjdXJzb3IsIGNvbGxlY3QsIHBvcykge1xuICAgIHdoaWxlIChjdXJzb3IudmFsdWUgJiYgY3Vyc29yLmZyb20gPD0gcG9zKSB7XG4gICAgICAgIGlmIChjdXJzb3IuZnJvbSA9PSBwb3MpXG4gICAgICAgICAgICBjb2xsZWN0LnB1c2goY3Vyc29yLnZhbHVlKTtcbiAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICB9XG59XG5jbGFzcyBVcGRhdGVDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihndXR0ZXIsIHZpZXdwb3J0LCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5ndXR0ZXIgPSBndXR0ZXI7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLmN1cnNvciA9IFJhbmdlU2V0Lml0ZXIoZ3V0dGVyLm1hcmtlcnMsIHZpZXdwb3J0LmZyb20pO1xuICAgIH1cbiAgICBhZGRFbGVtZW50KHZpZXcsIGJsb2NrLCBtYXJrZXJzKSB7XG4gICAgICAgIGxldCB7IGd1dHRlciB9ID0gdGhpcywgYWJvdmUgPSAoYmxvY2sudG9wIC0gdGhpcy5oZWlnaHQpIC8gdmlldy5zY2FsZVksIGhlaWdodCA9IGJsb2NrLmhlaWdodCAvIHZpZXcuc2NhbGVZO1xuICAgICAgICBpZiAodGhpcy5pID09IGd1dHRlci5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZXdFbHQgPSBuZXcgR3V0dGVyRWxlbWVudCh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKTtcbiAgICAgICAgICAgIGd1dHRlci5lbGVtZW50cy5wdXNoKG5ld0VsdCk7XG4gICAgICAgICAgICBndXR0ZXIuZG9tLmFwcGVuZENoaWxkKG5ld0VsdC5kb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ3V0dGVyLmVsZW1lbnRzW3RoaXMuaV0udXBkYXRlKHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gYmxvY2suYm90dG9tO1xuICAgICAgICB0aGlzLmkrKztcbiAgICB9XG4gICAgbGluZSh2aWV3LCBsaW5lLCBleHRyYU1hcmtlcnMpIHtcbiAgICAgICAgbGV0IGxvY2FsTWFya2VycyA9IFtdO1xuICAgICAgICBhZHZhbmNlQ3Vyc29yKHRoaXMuY3Vyc29yLCBsb2NhbE1hcmtlcnMsIGxpbmUuZnJvbSk7XG4gICAgICAgIGlmIChleHRyYU1hcmtlcnMubGVuZ3RoKVxuICAgICAgICAgICAgbG9jYWxNYXJrZXJzID0gbG9jYWxNYXJrZXJzLmNvbmNhdChleHRyYU1hcmtlcnMpO1xuICAgICAgICBsZXQgZm9yTGluZSA9IHRoaXMuZ3V0dGVyLmNvbmZpZy5saW5lTWFya2VyKHZpZXcsIGxpbmUsIGxvY2FsTWFya2Vycyk7XG4gICAgICAgIGlmIChmb3JMaW5lKVxuICAgICAgICAgICAgbG9jYWxNYXJrZXJzLnVuc2hpZnQoZm9yTGluZSk7XG4gICAgICAgIGxldCBndXR0ZXIgPSB0aGlzLmd1dHRlcjtcbiAgICAgICAgaWYgKGxvY2FsTWFya2Vycy5sZW5ndGggPT0gMCAmJiAhZ3V0dGVyLmNvbmZpZy5yZW5kZXJFbXB0eUVsZW1lbnRzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmFkZEVsZW1lbnQodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcbiAgICB9XG4gICAgd2lkZ2V0KHZpZXcsIGJsb2NrKSB7XG4gICAgICAgIGxldCBtYXJrZXIgPSB0aGlzLmd1dHRlci5jb25maWcud2lkZ2V0TWFya2VyKHZpZXcsIGJsb2NrLndpZGdldCwgYmxvY2spO1xuICAgICAgICBpZiAobWFya2VyKVxuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KHZpZXcsIGJsb2NrLCBbbWFya2VyXSk7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgbGV0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuICAgICAgICB3aGlsZSAoZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCA+IHRoaXMuaSkge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBndXR0ZXIuZWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBndXR0ZXIuZG9tLnJlbW92ZUNoaWxkKGxhc3QuZG9tKTtcbiAgICAgICAgICAgIGxhc3QuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU2luZ2xlR3V0dGVyVmlldyB7XG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107XG4gICAgICAgIHRoaXMuc3BhY2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlclwiICsgKHRoaXMuY29uZmlnLmNsYXNzID8gXCIgXCIgKyB0aGlzLmNvbmZpZy5jbGFzcyA6IFwiXCIpO1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIGNvbmZpZy5kb21FdmVudEhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKHByb3AsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQsIHk7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSB0aGlzLmRvbSAmJiB0aGlzLmRvbS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXQucGFyZW50Tm9kZSAhPSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IChyZWN0LnRvcCArIHJlY3QuYm90dG9tKSAvIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0SGVpZ2h0KHkgLSB2aWV3LmRvY3VtZW50VG9wKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmRvbUV2ZW50SGFuZGxlcnNbcHJvcF0odmlldywgbGluZSwgZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrZXJzID0gYXNBcnJheShjb25maWcubWFya2Vycyh2aWV3KSk7XG4gICAgICAgIGlmIChjb25maWcuaW5pdGlhbFNwYWNlcikge1xuICAgICAgICAgICAgdGhpcy5zcGFjZXIgPSBuZXcgR3V0dGVyRWxlbWVudCh2aWV3LCAwLCAwLCBbY29uZmlnLmluaXRpYWxTcGFjZXIodmlldyldKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKHRoaXMuc3BhY2VyLmRvbSk7XG4gICAgICAgICAgICB0aGlzLnNwYWNlci5kb20uc3R5bGUuY3NzVGV4dCArPSBcInZpc2liaWxpdHk6IGhpZGRlbjsgcG9pbnRlci1ldmVudHM6IG5vbmVcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBwcmV2TWFya2VycyA9IHRoaXMubWFya2VycztcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gYXNBcnJheSh0aGlzLmNvbmZpZy5tYXJrZXJzKHVwZGF0ZS52aWV3KSk7XG4gICAgICAgIGlmICh0aGlzLnNwYWNlciAmJiB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gdGhpcy5jb25maWcudXBkYXRlU3BhY2VyKHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0sIHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlZCAhPSB0aGlzLnNwYWNlci5tYXJrZXJzWzBdKVxuICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VyLnVwZGF0ZSh1cGRhdGUudmlldywgMCwgMCwgW3VwZGF0ZWRdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdnAgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcbiAgICAgICAgcmV0dXJuICFSYW5nZVNldC5lcSh0aGlzLm1hcmtlcnMsIHByZXZNYXJrZXJzLCB2cC5mcm9tLCB2cC50bykgfHxcbiAgICAgICAgICAgICh0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlID8gdGhpcy5jb25maWcubGluZU1hcmtlckNoYW5nZSh1cGRhdGUpIDogZmFsc2UpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBlbHQgb2YgdGhpcy5lbGVtZW50cylcbiAgICAgICAgICAgIGVsdC5kZXN0cm95KCk7XG4gICAgfVxufVxuY2xhc3MgR3V0dGVyRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycykge1xuICAgICAgICB0aGlzLmhlaWdodCA9IC0xO1xuICAgICAgICB0aGlzLmFib3ZlID0gMDtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJFbGVtZW50XCI7XG4gICAgICAgIHRoaXMudXBkYXRlKHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgIH1cbiAgICB1cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycykge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hYm92ZSAhPSBhYm92ZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLm1hcmdpblRvcCA9ICh0aGlzLmFib3ZlID0gYWJvdmUpID8gYWJvdmUgKyBcInB4XCIgOiBcIlwiO1xuICAgICAgICBpZiAoIXNhbWVNYXJrZXJzKHRoaXMubWFya2VycywgbWFya2VycykpXG4gICAgICAgICAgICB0aGlzLnNldE1hcmtlcnModmlldywgbWFya2Vycyk7XG4gICAgfVxuICAgIHNldE1hcmtlcnModmlldywgbWFya2Vycykge1xuICAgICAgICBsZXQgY2xzID0gXCJjbS1ndXR0ZXJFbGVtZW50XCIsIGRvbVBvcyA9IHRoaXMuZG9tLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGZvciAobGV0IGlOZXcgPSAwLCBpT2xkID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgc2tpcFRvID0gaU9sZCwgbWFya2VyID0gaU5ldyA8IG1hcmtlcnMubGVuZ3RoID8gbWFya2Vyc1tpTmV3KytdIDogbnVsbCwgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG1hcmtlcikge1xuICAgICAgICAgICAgICAgIGxldCBjID0gbWFya2VyLmVsZW1lbnRDbGFzcztcbiAgICAgICAgICAgICAgICBpZiAoYylcbiAgICAgICAgICAgICAgICAgICAgY2xzICs9IFwiIFwiICsgYztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gaU9sZDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFya2Vyc1tpXS5jb21wYXJlKG1hcmtlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUbyA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBza2lwVG8gPSB0aGlzLm1hcmtlcnMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGlPbGQgPCBza2lwVG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMubWFya2Vyc1tpT2xkKytdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQuZGVzdHJveShkb21Qb3MpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBkb21Qb3MubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGRvbVBvcy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zID0gYWZ0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXJrZXIpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAobWFya2VyLnRvRE9NKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQpXG4gICAgICAgICAgICAgICAgICAgIGRvbVBvcyA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShtYXJrZXIudG9ET00odmlldyksIGRvbVBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hlZClcbiAgICAgICAgICAgICAgICBpT2xkKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gY2xzO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBtYXJrZXJzO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNldE1hcmtlcnMobnVsbCwgW10pOyAvLyBGaXJzdCBhcmd1bWVudCBub3QgdXNlZCB1bmxlc3MgY3JlYXRpbmcgbWFya2Vyc1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVNYXJrZXJzKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYVtpXS5jb21wYXJlKGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG5GYWNldCB1c2VkIHRvIHByb3ZpZGUgbWFya2VycyB0byB0aGUgbGluZSBudW1iZXIgZ3V0dGVyLlxuKi9cbmNvbnN0IGxpbmVOdW1iZXJNYXJrZXJzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgbGluZU51bWJlckNvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBjb21iaW5lQ29uZmlnKHZhbHVlcywgeyBmb3JtYXROdW1iZXI6IFN0cmluZywgZG9tRXZlbnRIYW5kbGVyczoge30gfSwge1xuICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVycyhhLCBiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGEpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGV2ZW50IGluIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IHJlc3VsdFtldmVudF0sIGFkZCA9IGJbZXZlbnRdO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXZlbnRdID0gZXhpc3RzID8gKHZpZXcsIGxpbmUsIGV2ZW50KSA9PiBleGlzdHModmlldywgbGluZSwgZXZlbnQpIHx8IGFkZCh2aWV3LCBsaW5lLCBldmVudCkgOiBhZGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuY2xhc3MgTnVtYmVyTWFya2VyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3RvcihudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLm51bWJlciA9PSBvdGhlci5udW1iZXI7IH1cbiAgICB0b0RPTSgpIHsgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMubnVtYmVyKTsgfVxufVxuZnVuY3Rpb24gZm9ybWF0TnVtYmVyKHZpZXcsIG51bWJlcikge1xuICAgIHJldHVybiB2aWV3LnN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpLmZvcm1hdE51bWJlcihudW1iZXIsIHZpZXcuc3RhdGUpO1xufVxuY29uc3QgbGluZU51bWJlckd1dHRlciA9IC8qQF9fUFVSRV9fKi9hY3RpdmVHdXR0ZXJzLmNvbXB1dGUoW2xpbmVOdW1iZXJDb25maWddLCBzdGF0ZSA9PiAoe1xuICAgIGNsYXNzOiBcImNtLWxpbmVOdW1iZXJzXCIsXG4gICAgcmVuZGVyRW1wdHlFbGVtZW50czogZmFsc2UsXG4gICAgbWFya2Vycyh2aWV3KSB7IHJldHVybiB2aWV3LnN0YXRlLmZhY2V0KGxpbmVOdW1iZXJNYXJrZXJzKTsgfSxcbiAgICBsaW5lTWFya2VyKHZpZXcsIGxpbmUsIG90aGVycykge1xuICAgICAgICBpZiAob3RoZXJzLnNvbWUobSA9PiBtLnRvRE9NKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IE51bWJlck1hcmtlcihmb3JtYXROdW1iZXIodmlldywgdmlldy5zdGF0ZS5kb2MubGluZUF0KGxpbmUuZnJvbSkubnVtYmVyKSk7XG4gICAgfSxcbiAgICB3aWRnZXRNYXJrZXI6ICgpID0+IG51bGwsXG4gICAgbGluZU1hcmtlckNoYW5nZTogdXBkYXRlID0+IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKSxcbiAgICBpbml0aWFsU3BhY2VyKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJNYXJrZXIoZm9ybWF0TnVtYmVyKHZpZXcsIG1heExpbmVOdW1iZXIodmlldy5zdGF0ZS5kb2MubGluZXMpKSk7XG4gICAgfSxcbiAgICB1cGRhdGVTcGFjZXIoc3BhY2VyLCB1cGRhdGUpIHtcbiAgICAgICAgbGV0IG1heCA9IGZvcm1hdE51bWJlcih1cGRhdGUudmlldywgbWF4TGluZU51bWJlcih1cGRhdGUudmlldy5zdGF0ZS5kb2MubGluZXMpKTtcbiAgICAgICAgcmV0dXJuIG1heCA9PSBzcGFjZXIubnVtYmVyID8gc3BhY2VyIDogbmV3IE51bWJlck1hcmtlcihtYXgpO1xuICAgIH0sXG4gICAgZG9tRXZlbnRIYW5kbGVyczogc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykuZG9tRXZlbnRIYW5kbGVyc1xufSkpO1xuLyoqXG5DcmVhdGUgYSBsaW5lIG51bWJlciBndXR0ZXIgZXh0ZW5zaW9uLlxuKi9cbmZ1bmN0aW9uIGxpbmVOdW1iZXJzKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbGluZU51bWJlckNvbmZpZy5vZihjb25maWcpLFxuICAgICAgICBndXR0ZXJzKCksXG4gICAgICAgIGxpbmVOdW1iZXJHdXR0ZXJcbiAgICBdO1xufVxuZnVuY3Rpb24gbWF4TGluZU51bWJlcihsaW5lcykge1xuICAgIGxldCBsYXN0ID0gOTtcbiAgICB3aGlsZSAobGFzdCA8IGxpbmVzKVxuICAgICAgICBsYXN0ID0gbGFzdCAqIDEwICsgOTtcbiAgICByZXR1cm4gbGFzdDtcbn1cbmNvbnN0IGFjdGl2ZUxpbmVHdXR0ZXJNYXJrZXIgPSAvKkBfX1BVUkVfXyovbmV3IGNsYXNzIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5lbGVtZW50Q2xhc3MgPSBcImNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjtcbiAgICB9XG59O1xuY29uc3QgYWN0aXZlTGluZUd1dHRlckhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL2d1dHRlckxpbmVDbGFzcy5jb21wdXRlKFtcInNlbGVjdGlvblwiXSwgc3RhdGUgPT4ge1xuICAgIGxldCBtYXJrcyA9IFtdLCBsYXN0ID0gLTE7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICBsZXQgbGluZVBvcyA9IHN0YXRlLmRvYy5saW5lQXQocmFuZ2UuaGVhZCkuZnJvbTtcbiAgICAgICAgaWYgKGxpbmVQb3MgPiBsYXN0KSB7XG4gICAgICAgICAgICBsYXN0ID0gbGluZVBvcztcbiAgICAgICAgICAgIG1hcmtzLnB1c2goYWN0aXZlTGluZUd1dHRlck1hcmtlci5yYW5nZShsaW5lUG9zKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFJhbmdlU2V0Lm9mKG1hcmtzKTtcbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgYSBgY20tYWN0aXZlTGluZUd1dHRlcmAgY2xhc3MgdG9cbmFsbCBndXR0ZXIgZWxlbWVudHMgb24gdGhlIFthY3RpdmVcbmxpbmVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5oaWdobGlnaHRBY3RpdmVMaW5lKS5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRBY3RpdmVMaW5lR3V0dGVyKCkge1xuICAgIHJldHVybiBhY3RpdmVMaW5lR3V0dGVySGlnaGxpZ2h0ZXI7XG59XG5cbmNvbnN0IFdoaXRlc3BhY2VEZWNvID0gLypAX19QVVJFX18qL25ldyBNYXAoKTtcbmZ1bmN0aW9uIGdldFdoaXRlc3BhY2VEZWNvKHNwYWNlKSB7XG4gICAgbGV0IGRlY28gPSBXaGl0ZXNwYWNlRGVjby5nZXQoc3BhY2UpO1xuICAgIGlmICghZGVjbylcbiAgICAgICAgV2hpdGVzcGFjZURlY28uc2V0KHNwYWNlLCBkZWNvID0gRGVjb3JhdGlvbi5tYXJrKHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYWNlID09PSBcIlxcdFwiID8ge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBcImNtLWhpZ2hsaWdodFRhYlwiLFxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJjbS1oaWdobGlnaHRTcGFjZVwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YS1kaXNwbGF5XCI6IHNwYWNlLnJlcGxhY2UoLyAvZywgXCJcdTAwQjdcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIHJldHVybiBkZWNvO1xufVxuZnVuY3Rpb24gbWF0Y2hlcihkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUodmlldyA9PiAoe1xuICAgICAgICBkZWNvcmF0aW9uczogZGVjb3JhdG9yLmNyZWF0ZURlY28odmlldyksXG4gICAgICAgIHVwZGF0ZSh1KSB7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gZGVjb3JhdG9yLnVwZGF0ZURlY28odSwgdGhpcy5kZWNvcmF0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfSksIHtcbiAgICAgICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xuICAgIH0pO1xufVxuY29uc3Qgd2hpdGVzcGFjZUhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL21hdGNoZXIoLypAX19QVVJFX18qL25ldyBNYXRjaERlY29yYXRvcih7XG4gICAgcmVnZXhwOiAvXFx0fCArL2csXG4gICAgZGVjb3JhdGlvbjogbWF0Y2ggPT4gZ2V0V2hpdGVzcGFjZURlY28obWF0Y2hbMF0pLFxuICAgIGJvdW5kYXJ5OiAvXFxTLyxcbn0pKTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBoaWdobGlnaHRzIHdoaXRlc3BhY2UsIGFkZGluZyBhXG5gY20taGlnaGxpZ2h0U3BhY2VgIGNsYXNzIHRvIHN0cmV0Y2hlcyBvZiBzcGFjZXMsIGFuZCBhXG5gY20taGlnaGxpZ2h0VGFiYCBjbGFzcyB0byBpbmRpdmlkdWFsIHRhYiBjaGFyYWN0ZXJzLiBCeSBkZWZhdWx0LFxudGhlIGZvcm1lciBhcmUgc2hvd24gYXMgZmFpbnQgZG90cywgYW5kIHRoZSBsYXR0ZXIgYXMgYXJyb3dzLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFdoaXRlc3BhY2UoKSB7XG4gICAgcmV0dXJuIHdoaXRlc3BhY2VIaWdobGlnaHRlcjtcbn1cbmNvbnN0IHRyYWlsaW5nSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovbWF0Y2hlcigvKkBfX1BVUkVfXyovbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICByZWdleHA6IC9cXHMrJC9nLFxuICAgIGRlY29yYXRpb246IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS10cmFpbGluZ1NwYWNlXCIgfSksXG4gICAgYm91bmRhcnk6IC9cXFMvLFxufSkpO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgYSBgY20tdHJhaWxpbmdTcGFjZWAgY2xhc3MgdG8gYWxsXG50cmFpbGluZyB3aGl0ZXNwYWNlLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFRyYWlsaW5nV2hpdGVzcGFjZSgpIHtcbiAgICByZXR1cm4gdHJhaWxpbmdIaWdobGlnaHRlcjtcbn1cblxuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX3Rlc3QgPSB7IEhlaWdodE1hcCwgSGVpZ2h0T3JhY2xlLCBNZWFzdXJlZEhlaWdodHMsIFF1ZXJ5VHlwZSwgQ2hhbmdlZFJhbmdlLCBjb21wdXRlT3JkZXIsIG1vdmVWaXN1YWxseSB9O1xuXG5leHBvcnQgeyBCaWRpU3BhbiwgQmxvY2tJbmZvLCBCbG9ja1R5cGUsIERlY29yYXRpb24sIERpcmVjdGlvbiwgRWRpdG9yVmlldywgR3V0dGVyTWFya2VyLCBNYXRjaERlY29yYXRvciwgUmVjdGFuZ2xlTWFya2VyLCBWaWV3UGx1Z2luLCBWaWV3VXBkYXRlLCBXaWRnZXRUeXBlLCBfX3Rlc3QsIGNsb3NlSG92ZXJUb29sdGlwcywgY3Jvc3NoYWlyQ3Vyc29yLCBkcmF3U2VsZWN0aW9uLCBkcm9wQ3Vyc29yLCBnZXREcmF3U2VsZWN0aW9uQ29uZmlnLCBnZXRQYW5lbCwgZ2V0VG9vbHRpcCwgZ3V0dGVyLCBndXR0ZXJMaW5lQ2xhc3MsIGd1dHRlcnMsIGhhc0hvdmVyVG9vbHRpcHMsIGhpZ2hsaWdodEFjdGl2ZUxpbmUsIGhpZ2hsaWdodEFjdGl2ZUxpbmVHdXR0ZXIsIGhpZ2hsaWdodFNwZWNpYWxDaGFycywgaGlnaGxpZ2h0VHJhaWxpbmdXaGl0ZXNwYWNlLCBoaWdobGlnaHRXaGl0ZXNwYWNlLCBob3ZlclRvb2x0aXAsIGtleW1hcCwgbGF5ZXIsIGxpbmVOdW1iZXJNYXJrZXJzLCBsaW5lTnVtYmVycywgbG9nRXhjZXB0aW9uLCBwYW5lbHMsIHBsYWNlaG9sZGVyLCByZWN0YW5ndWxhclNlbGVjdGlvbiwgcmVwb3NpdGlvblRvb2x0aXBzLCBydW5TY29wZUhhbmRsZXJzLCBzY3JvbGxQYXN0RW5kLCBzaG93UGFuZWwsIHNob3dUb29sdGlwLCB0b29sdGlwcyB9O1xuIiwgImltcG9ydCB7IE5vZGVQcm9wIH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5cbmxldCBuZXh0VGFnSUQgPSAwO1xuLyoqXG5IaWdobGlnaHRpbmcgdGFncyBhcmUgbWFya2VycyB0aGF0IGRlbm90ZSBhIGhpZ2hsaWdodGluZyBjYXRlZ29yeS5cblRoZXkgYXJlIFthc3NvY2lhdGVkXSgjaGlnaGxpZ2h0LnN0eWxlVGFncykgd2l0aCBwYXJ0cyBvZiBhIHN5bnRheFxudHJlZSBieSBhIGxhbmd1YWdlIG1vZGUsIGFuZCB0aGVuIG1hcHBlZCB0byBhbiBhY3R1YWwgQ1NTIHN0eWxlIGJ5XG5hIFtoaWdobGlnaHRlcl0oI2hpZ2hsaWdodC5IaWdobGlnaHRlcikuXG5cbkJlY2F1c2Ugc3ludGF4IHRyZWUgbm9kZSB0eXBlcyBhbmQgaGlnaGxpZ2h0IHN0eWxlcyBoYXZlIHRvIGJlXG5hYmxlIHRvIHRhbGsgdGhlIHNhbWUgbGFuZ3VhZ2UsIENvZGVNaXJyb3IgdXNlcyBhIG1vc3RseSBfY2xvc2VkX1xuW3ZvY2FidWxhcnldKCNoaWdobGlnaHQudGFncykgb2Ygc3ludGF4IHRhZ3MgKGFzIG9wcG9zZWQgdG9cbnRyYWRpdGlvbmFsIG9wZW4gc3RyaW5nLWJhc2VkIHN5c3RlbXMsIHdoaWNoIG1ha2UgaXQgaGFyZCBmb3JcbmhpZ2hsaWdodGluZyB0aGVtZXMgdG8gY292ZXIgYWxsIHRoZSB0b2tlbnMgcHJvZHVjZWQgYnkgdGhlXG52YXJpb3VzIGxhbmd1YWdlcykuXG5cbkl0IF9pc18gcG9zc2libGUgdG8gW2RlZmluZV0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lKSB5b3VyIG93blxuaGlnaGxpZ2h0aW5nIHRhZ3MgZm9yIHN5c3RlbS1pbnRlcm5hbCB1c2UgKHdoZXJlIHlvdSBjb250cm9sIGJvdGhcbnRoZSBsYW5ndWFnZSBwYWNrYWdlIGFuZCB0aGUgaGlnaGxpZ2h0ZXIpLCBidXQgc3VjaCB0YWdzIHdpbGwgbm90XG5iZSBwaWNrZWQgdXAgYnkgcmVndWxhciBoaWdobGlnaHRlcnMgKHRob3VnaCB5b3UgY2FuIGRlcml2ZSB0aGVtXG5mcm9tIHN0YW5kYXJkIHRhZ3MgdG8gYWxsb3cgaGlnaGxpZ2h0ZXJzIHRvIGZhbGwgYmFjayB0byB0aG9zZSkuXG4qL1xuY2xhc3MgVGFnIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzZXQgb2YgdGhpcyB0YWcgYW5kIGFsbCBpdHMgcGFyZW50IHRhZ3MsIHN0YXJ0aW5nIHdpdGhcbiAgICB0aGlzIG9uZSBpdHNlbGYgYW5kIHNvcnRlZCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nIHNwZWNpZmljaXR5LlxuICAgICovXG4gICAgc2V0LCBcbiAgICAvKipcbiAgICBUaGUgYmFzZSB1bm1vZGlmaWVkIHRhZyB0aGF0IHRoaXMgb25lIGlzIGJhc2VkIG9uLCBpZiBpdCdzXG4gICAgbW9kaWZpZWQgQGludGVybmFsXG4gICAgKi9cbiAgICBiYXNlLCBcbiAgICAvKipcbiAgICBUaGUgbW9kaWZpZXJzIGFwcGxpZWQgdG8gdGhpcy5iYXNlIEBpbnRlcm5hbFxuICAgICovXG4gICAgbW9kaWZpZWQpIHtcbiAgICAgICAgdGhpcy5zZXQgPSBzZXQ7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMubW9kaWZpZWQgPSBtb2RpZmllZDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gbmV4dFRhZ0lEKys7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5ldyB0YWcuIElmIGBwYXJlbnRgIGlzIGdpdmVuLCB0aGUgdGFnIGlzIHRyZWF0ZWQgYXMgYVxuICAgIHN1Yi10YWcgb2YgdGhhdCBwYXJlbnQsIGFuZFxuICAgIFtoaWdobGlnaHRlcnNdKCNoaWdobGlnaHQudGFnSGlnaGxpZ2h0ZXIpIHRoYXQgZG9uJ3QgbWVudGlvblxuICAgIHRoaXMgdGFnIHdpbGwgdHJ5IHRvIGZhbGwgYmFjayB0byB0aGUgcGFyZW50IHRhZyAob3IgZ3JhbmRwYXJlbnRcbiAgICB0YWcsIGV0YykuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHBhcmVudCkge1xuICAgICAgICBpZiAocGFyZW50ID09PSBudWxsIHx8IHBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50LmJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IGRlcml2ZSBmcm9tIGEgbW9kaWZpZWQgdGFnXCIpO1xuICAgICAgICBsZXQgdGFnID0gbmV3IFRhZyhbXSwgbnVsbCwgW10pO1xuICAgICAgICB0YWcuc2V0LnB1c2godGFnKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgcGFyZW50LnNldClcbiAgICAgICAgICAgICAgICB0YWcuc2V0LnB1c2godCk7XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHRhZyBfbW9kaWZpZXJfLCB3aGljaCBpcyBhIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgdGFnLFxuICAgIHdpbGwgcmV0dXJuIGEgdGFnIHRoYXQgaXMgYSBzdWJ0YWcgb2YgdGhlIG9yaWdpbmFsLiBBcHBseWluZyB0aGVcbiAgICBzYW1lIG1vZGlmaWVyIHRvIGEgdHdpY2UgdGFnIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIChgbTEodDEpXG4gICAgPT0gbTEodDEpYCkgYW5kIGFwcGx5aW5nIG11bHRpcGxlIG1vZGlmaWVycyB3aWxsLCByZWdhcmRsZXNzIG9yXG4gICAgb3JkZXIsIHByb2R1Y2UgdGhlIHNhbWUgdGFnIChgbTEobTIodDEpKSA9PSBtMihtMSh0MSkpYCkuXG4gICAgXG4gICAgV2hlbiBtdWx0aXBsZSBtb2RpZmllcnMgYXJlIGFwcGxpZWQgdG8gYSBnaXZlbiBiYXNlIHRhZywgZWFjaFxuICAgIHNtYWxsZXIgc2V0IG9mIG1vZGlmaWVycyBpcyByZWdpc3RlcmVkIGFzIGEgcGFyZW50LCBzbyB0aGF0IGZvclxuICAgIGV4YW1wbGUgYG0xKG0yKG0zKHQxKSkpYCBpcyBhIHN1YnR5cGUgb2YgYG0xKG0yKHQxKSlgLFxuICAgIGBtMShtMyh0MSlgLCBhbmQgc28gb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTW9kaWZpZXIoKSB7XG4gICAgICAgIGxldCBtb2QgPSBuZXcgTW9kaWZpZXI7XG4gICAgICAgIHJldHVybiAodGFnKSA9PiB7XG4gICAgICAgICAgICBpZiAodGFnLm1vZGlmaWVkLmluZGV4T2YobW9kKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgICAgICByZXR1cm4gTW9kaWZpZXIuZ2V0KHRhZy5iYXNlIHx8IHRhZywgdGFnLm1vZGlmaWVkLmNvbmNhdChtb2QpLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKSk7XG4gICAgICAgIH07XG4gICAgfVxufVxubGV0IG5leHRNb2RpZmllcklEID0gMDtcbmNsYXNzIE1vZGlmaWVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5pZCA9IG5leHRNb2RpZmllcklEKys7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQoYmFzZSwgbW9kcykge1xuICAgICAgICBpZiAoIW1vZHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIGxldCBleGlzdHMgPSBtb2RzWzBdLmluc3RhbmNlcy5maW5kKHQgPT4gdC5iYXNlID09IGJhc2UgJiYgc2FtZUFycmF5KG1vZHMsIHQubW9kaWZpZWQpKTtcbiAgICAgICAgaWYgKGV4aXN0cylcbiAgICAgICAgICAgIHJldHVybiBleGlzdHM7XG4gICAgICAgIGxldCBzZXQgPSBbXSwgdGFnID0gbmV3IFRhZyhzZXQsIGJhc2UsIG1vZHMpO1xuICAgICAgICBmb3IgKGxldCBtIG9mIG1vZHMpXG4gICAgICAgICAgICBtLmluc3RhbmNlcy5wdXNoKHRhZyk7XG4gICAgICAgIGxldCBjb25maWdzID0gcG93ZXJTZXQobW9kcyk7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCBvZiBiYXNlLnNldClcbiAgICAgICAgICAgIGlmICghcGFyZW50Lm1vZGlmaWVkLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb25maWcgb2YgY29uZmlncylcbiAgICAgICAgICAgICAgICAgICAgc2V0LnB1c2goTW9kaWZpZXIuZ2V0KHBhcmVudCwgY29uZmlnKSk7XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZUFycmF5KGEsIGIpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggPT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoeCwgaSkgPT4geCA9PSBiW2ldKTtcbn1cbmZ1bmN0aW9uIHBvd2VyU2V0KGFycmF5KSB7XG4gICAgbGV0IHNldHMgPSBbW11dO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGUgPSBzZXRzLmxlbmd0aDsgaiA8IGU7IGorKykge1xuICAgICAgICAgICAgc2V0cy5wdXNoKHNldHNbal0uY29uY2F0KGFycmF5W2ldKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNldHMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aCk7XG59XG4vKipcblRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSBzZXQgb2YgdGFncyB0byBhIGxhbmd1YWdlIHN5bnRheFxudmlhIFtgTm9kZVNldC5leHRlbmRgXSgjY29tbW9uLk5vZGVTZXQuZXh0ZW5kKSBvclxuW2BMUlBhcnNlci5jb25maWd1cmVgXSgjbHIuTFJQYXJzZXIuY29uZmlndXJlKS5cblxuVGhlIGFyZ3VtZW50IG9iamVjdCBtYXBzIG5vZGUgc2VsZWN0b3JzIHRvIFtoaWdobGlnaHRpbmdcbnRhZ3NdKCNoaWdobGlnaHQuVGFnKSBvciBhcnJheXMgb2YgdGFncy5cblxuTm9kZSBzZWxlY3RvcnMgbWF5IGhvbGQgb25lIG9yIG1vcmUgKHNwYWNlLXNlcGFyYXRlZCkgbm9kZSBwYXRocy5cblN1Y2ggYSBwYXRoIGNhbiBiZSBhIFtub2RlIG5hbWVdKCNjb21tb24uTm9kZVR5cGUubmFtZSksIG9yXG5tdWx0aXBsZSBub2RlIG5hbWVzIChvciBgKmAgd2lsZGNhcmRzKSBzZXBhcmF0ZWQgYnkgc2xhc2hcbmNoYXJhY3RlcnMsIGFzIGluIGBcIkJsb2NrL0RlY2xhcmF0aW9uL1ZhcmlhYmxlTmFtZVwiYC4gU3VjaCBhIHBhdGhcbm1hdGNoZXMgdGhlIGZpbmFsIG5vZGUgYnV0IG9ubHkgaWYgaXRzIGRpcmVjdCBwYXJlbnQgbm9kZXMgYXJlIHRoZVxub3RoZXIgbm9kZXMgbWVudGlvbmVkLiBBIGAqYCBpbiBzdWNoIGEgcGF0aCBtYXRjaGVzIGFueSBwYXJlbnQsXG5idXQgb25seSBhIHNpbmdsZSBsZXZlbFx1MjAxNHdpbGRjYXJkcyB0aGF0IG1hdGNoIG11bHRpcGxlIHBhcmVudHNcbmFyZW4ndCBzdXBwb3J0ZWQsIGJvdGggZm9yIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBMZXplclxudHJlZXMgbWFrZSBpdCByYXRoZXIgaGFyZCB0byByZWFzb24gYWJvdXQgd2hhdCB0aGV5IHdvdWxkIG1hdGNoLilcblxuQSBwYXRoIGNhbiBiZSBlbmRlZCB3aXRoIGAvLi4uYCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0YWcgYXNzaWduZWRcbnRvIHRoZSBub2RlIHNob3VsZCBhbHNvIGFwcGx5IHRvIGFsbCBjaGlsZCBub2RlcywgZXZlbiBpZiB0aGV5XG5tYXRjaCB0aGVpciBvd24gc3R5bGUgKGJ5IGRlZmF1bHQsIG9ubHkgdGhlIGlubmVybW9zdCBzdHlsZSBpc1xudXNlZCkuXG5cbldoZW4gYSBwYXRoIGVuZHMgaW4gYCFgLCBhcyBpbiBgQXR0cmlidXRlIWAsIG5vIGZ1cnRoZXIgbWF0Y2hpbmdcbmhhcHBlbnMgZm9yIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMsIGFuZCB0aGUgZW50aXJlIG5vZGUgZ2V0cyB0aGVcbmdpdmVuIHN0eWxlLlxuXG5JbiB0aGlzIG5vdGF0aW9uLCBub2RlIG5hbWVzIHRoYXQgY29udGFpbiBgL2AsIGAhYCwgYCpgLCBvciBgLi4uYFxubXVzdCBiZSBxdW90ZWQgYXMgSlNPTiBzdHJpbmdzLlxuXG5Gb3IgZXhhbXBsZTpcblxuYGBgamF2YXNjcmlwdFxucGFyc2VyLndpdGhQcm9wcyhcbiAgc3R5bGVUYWdzKHtcbiAgICAvLyBTdHlsZSBOdW1iZXIgYW5kIEJpZ051bWJlciBub2Rlc1xuICAgIFwiTnVtYmVyIEJpZ051bWJlclwiOiB0YWdzLm51bWJlcixcbiAgICAvLyBTdHlsZSBFc2NhcGUgbm9kZXMgd2hvc2UgcGFyZW50IGlzIFN0cmluZ1xuICAgIFwiU3RyaW5nL0VzY2FwZVwiOiB0YWdzLmVzY2FwZSxcbiAgICAvLyBTdHlsZSBhbnl0aGluZyBpbnNpZGUgQXR0cmlidXRlcyBub2Rlc1xuICAgIFwiQXR0cmlidXRlcyFcIjogdGFncy5tZXRhLFxuICAgIC8vIEFkZCBhIHN0eWxlIHRvIGFsbCBjb250ZW50IGluc2lkZSBJdGFsaWMgbm9kZXNcbiAgICBcIkl0YWxpYy8uLi5cIjogdGFncy5lbXBoYXNpcyxcbiAgICAvLyBTdHlsZSBJbnZhbGlkU3RyaW5nIG5vZGVzIGFzIGJvdGggYHN0cmluZ2AgYW5kIGBpbnZhbGlkYFxuICAgIFwiSW52YWxpZFN0cmluZ1wiOiBbdGFncy5zdHJpbmcsIHRhZ3MuaW52YWxpZF0sXG4gICAgLy8gU3R5bGUgdGhlIG5vZGUgbmFtZWQgXCIvXCIgYXMgcHVuY3R1YXRpb25cbiAgICAnXCIvXCInOiB0YWdzLnB1bmN0dWF0aW9uXG4gIH0pXG4pXG5gYGBcbiovXG5mdW5jdGlvbiBzdHlsZVRhZ3Moc3BlYykge1xuICAgIGxldCBieU5hbWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgICAgICBsZXQgdGFncyA9IHNwZWNbcHJvcF07XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSlcbiAgICAgICAgICAgIHRhZ3MgPSBbdGFnc107XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcHJvcC5zcGxpdChcIiBcIikpXG4gICAgICAgICAgICBpZiAocGFydCkge1xuICAgICAgICAgICAgICAgIGxldCBwaWVjZXMgPSBbXSwgbW9kZSA9IDIgLyogTW9kZS5Ob3JtYWwgKi8sIHJlc3QgPSBwYXJ0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IDA7Oykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PSBcIi4uLlwiICYmIHBvcyA+IDAgJiYgcG9zICsgMyA9PSBwYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDEgLyogTW9kZS5Jbmhlcml0ICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSAvXlwiKD86W15cIlxcXFxdfFxcXFwuKSo/XCJ8W15cXC8hXSsvLmV4ZWMocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICBwaWVjZXMucHVzaChtWzBdID09IFwiKlwiID8gXCJcIiA6IG1bMF1bMF0gPT0gJ1wiJyA/IEpTT04ucGFyc2UobVswXSkgOiBtWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IG1bMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IHBhcnQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcGFydFtwb3MrK107XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gcGFydC5sZW5ndGggJiYgbmV4dCA9PSBcIiFcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDAgLyogTW9kZS5PcGFxdWUgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBcIi9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICByZXN0ID0gcGFydC5zbGljZShwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IHBpZWNlcy5sZW5ndGggLSAxLCBpbm5lciA9IHBpZWNlc1tsYXN0XTtcbiAgICAgICAgICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcGF0aDogXCIgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG5ldyBSdWxlKHRhZ3MsIG1vZGUsIGxhc3QgPiAwID8gcGllY2VzLnNsaWNlKDAsIGxhc3QpIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgYnlOYW1lW2lubmVyXSA9IHJ1bGUuc29ydChieU5hbWVbaW5uZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ1bGVOb2RlUHJvcC5hZGQoYnlOYW1lKTtcbn1cbmNvbnN0IHJ1bGVOb2RlUHJvcCA9IG5ldyBOb2RlUHJvcCgpO1xuY2xhc3MgUnVsZSB7XG4gICAgY29uc3RydWN0b3IodGFncywgbW9kZSwgY29udGV4dCwgbmV4dCkge1xuICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLm5leHQgPSBuZXh0O1xuICAgIH1cbiAgICBnZXQgb3BhcXVlKCkgeyByZXR1cm4gdGhpcy5tb2RlID09IDAgLyogTW9kZS5PcGFxdWUgKi87IH1cbiAgICBnZXQgaW5oZXJpdCgpIHsgcmV0dXJuIHRoaXMubW9kZSA9PSAxIC8qIE1vZGUuSW5oZXJpdCAqLzsgfVxuICAgIHNvcnQob3RoZXIpIHtcbiAgICAgICAgaWYgKCFvdGhlciB8fCBvdGhlci5kZXB0aCA8IHRoaXMuZGVwdGgpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCA9IG90aGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXIubmV4dCA9IHRoaXMuc29ydChvdGhlci5uZXh0KTtcbiAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgIH1cbiAgICBnZXQgZGVwdGgoKSB7IHJldHVybiB0aGlzLmNvbnRleHQgPyB0aGlzLmNvbnRleHQubGVuZ3RoIDogMDsgfVxufVxuUnVsZS5lbXB0eSA9IG5ldyBSdWxlKFtdLCAyIC8qIE1vZGUuTm9ybWFsICovLCBudWxsKTtcbi8qKlxuRGVmaW5lIGEgW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKSBmcm9tIGFuIGFycmF5IG9mXG50YWcvY2xhc3MgcGFpcnMuIENsYXNzZXMgYXNzb2NpYXRlZCB3aXRoIG1vcmUgc3BlY2lmaWMgdGFncyB3aWxsXG50YWtlIHByZWNlZGVuY2UuXG4qL1xuZnVuY3Rpb24gdGFnSGlnaGxpZ2h0ZXIodGFncywgb3B0aW9ucykge1xuICAgIGxldCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHN0eWxlIG9mIHRhZ3MpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0eWxlLnRhZykpXG4gICAgICAgICAgICBtYXBbc3R5bGUudGFnLmlkXSA9IHN0eWxlLmNsYXNzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmb3IgKGxldCB0YWcgb2Ygc3R5bGUudGFnKVxuICAgICAgICAgICAgICAgIG1hcFt0YWcuaWRdID0gc3R5bGUuY2xhc3M7XG4gICAgfVxuICAgIGxldCB7IHNjb3BlLCBhbGwgPSBudWxsIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiAodGFncykgPT4ge1xuICAgICAgICAgICAgbGV0IGNscyA9IGFsbDtcbiAgICAgICAgICAgIGZvciAobGV0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViIG9mIHRhZy5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ0NsYXNzID0gbWFwW3N1Yi5pZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2xzID8gY2xzICsgXCIgXCIgKyB0YWdDbGFzcyA6IHRhZ0NsYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgICB9LFxuICAgICAgICBzY29wZVxuICAgIH07XG59XG5mdW5jdGlvbiBoaWdobGlnaHRUYWdzKGhpZ2hsaWdodGVycywgdGFncykge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGZvciAobGV0IGhpZ2hsaWdodGVyIG9mIGhpZ2hsaWdodGVycykge1xuICAgICAgICBsZXQgdmFsdWUgPSBoaWdobGlnaHRlci5zdHlsZSh0YWdzKTtcbiAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gcmVzdWx0ICsgXCIgXCIgKyB2YWx1ZSA6IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5IaWdobGlnaHQgdGhlIGdpdmVuIFt0cmVlXSgjY29tbW9uLlRyZWUpIHdpdGggdGhlIGdpdmVuXG5baGlnaGxpZ2h0ZXJdKCNoaWdobGlnaHQuSGlnaGxpZ2h0ZXIpLiBPZnRlbiwgdGhlIGhpZ2hlci1sZXZlbFxuW2BoaWdobGlnaHRDb2RlYF0oI2hpZ2hsaWdodC5oaWdobGlnaHRDb2RlKSBmdW5jdGlvbiBpcyBlYXNpZXIgdG9cbnVzZS5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRUcmVlKHRyZWUsIGhpZ2hsaWdodGVyLCBcbi8qKlxuQXNzaWduIHN0eWxpbmcgdG8gYSByZWdpb24gb2YgdGhlIHRleHQuIFdpbGwgYmUgY2FsbGVkLCBpbiBvcmRlclxub2YgcG9zaXRpb24sIGZvciBhbnkgcmFuZ2VzIHdoZXJlIG1vcmUgdGhhbiB6ZXJvIGNsYXNzZXMgYXBwbHkuXG5gY2xhc3Nlc2AgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIENTUyBjbGFzc2VzLlxuKi9cbnB1dFN0eWxlLCBcbi8qKlxuVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBoaWdobGlnaHQuXG4qL1xuZnJvbSA9IDAsIFxuLyoqXG5UaGUgZW5kIG9mIHRoZSByYW5nZS5cbiovXG50byA9IHRyZWUubGVuZ3RoKSB7XG4gICAgbGV0IGJ1aWxkZXIgPSBuZXcgSGlnaGxpZ2h0QnVpbGRlcihmcm9tLCBBcnJheS5pc0FycmF5KGhpZ2hsaWdodGVyKSA/IGhpZ2hsaWdodGVyIDogW2hpZ2hsaWdodGVyXSwgcHV0U3R5bGUpO1xuICAgIGJ1aWxkZXIuaGlnaGxpZ2h0UmFuZ2UodHJlZS5jdXJzb3IoKSwgZnJvbSwgdG8sIFwiXCIsIGJ1aWxkZXIuaGlnaGxpZ2h0ZXJzKTtcbiAgICBidWlsZGVyLmZsdXNoKHRvKTtcbn1cbi8qKlxuSGlnaGxpZ2h0IHRoZSBnaXZlbiB0cmVlIHdpdGggdGhlIGdpdmVuIGhpZ2hsaWdodGVyLCBjYWxsaW5nXG5gcHV0VGV4dGAgZm9yIGV2ZXJ5IHBpZWNlIG9mIHRleHQsIGVpdGhlciB3aXRoIGEgc2V0IG9mIGNsYXNzZXMgb3JcbndpdGggdGhlIGVtcHR5IHN0cmluZyB3aGVuIHVuc3R5bGVkLCBhbmQgYHB1dEJyZWFrYCBmb3IgZXZlcnkgbGluZVxuYnJlYWsuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0Q29kZShjb2RlLCB0cmVlLCBoaWdobGlnaHRlciwgcHV0VGV4dCwgcHV0QnJlYWssIGZyb20gPSAwLCB0byA9IGNvZGUubGVuZ3RoKSB7XG4gICAgbGV0IHBvcyA9IGZyb207XG4gICAgZnVuY3Rpb24gd3JpdGVUbyhwLCBjbGFzc2VzKSB7XG4gICAgICAgIGlmIChwIDw9IHBvcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgdGV4dCA9IGNvZGUuc2xpY2UocG9zLCBwKSwgaSA9IDA7Oykge1xuICAgICAgICAgICAgbGV0IG5leHRCcmVhayA9IHRleHQuaW5kZXhPZihcIlxcblwiLCBpKTtcbiAgICAgICAgICAgIGxldCB1cHRvID0gbmV4dEJyZWFrIDwgMCA/IHRleHQubGVuZ3RoIDogbmV4dEJyZWFrO1xuICAgICAgICAgICAgaWYgKHVwdG8gPiBpKVxuICAgICAgICAgICAgICAgIHB1dFRleHQodGV4dC5zbGljZShpLCB1cHRvKSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICBpZiAobmV4dEJyZWFrIDwgMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHB1dEJyZWFrKCk7XG4gICAgICAgICAgICBpID0gbmV4dEJyZWFrICsgMTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBwO1xuICAgIH1cbiAgICBoaWdobGlnaHRUcmVlKHRyZWUsIGhpZ2hsaWdodGVyLCAoZnJvbSwgdG8sIGNsYXNzZXMpID0+IHtcbiAgICAgICAgd3JpdGVUbyhmcm9tLCBcIlwiKTtcbiAgICAgICAgd3JpdGVUbyh0bywgY2xhc3Nlcyk7XG4gICAgfSwgZnJvbSwgdG8pO1xuICAgIHdyaXRlVG8odG8sIFwiXCIpO1xufVxuY2xhc3MgSGlnaGxpZ2h0QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoYXQsIGhpZ2hsaWdodGVycywgc3Bhbikge1xuICAgICAgICB0aGlzLmF0ID0gYXQ7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZXJzID0gaGlnaGxpZ2h0ZXJzO1xuICAgICAgICB0aGlzLnNwYW4gPSBzcGFuO1xuICAgICAgICB0aGlzLmNsYXNzID0gXCJcIjtcbiAgICB9XG4gICAgc3RhcnRTcGFuKGF0LCBjbHMpIHtcbiAgICAgICAgaWYgKGNscyAhPSB0aGlzLmNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKGF0KTtcbiAgICAgICAgICAgIGlmIChhdCA+IHRoaXMuYXQpXG4gICAgICAgICAgICAgICAgdGhpcy5hdCA9IGF0O1xuICAgICAgICAgICAgdGhpcy5jbGFzcyA9IGNscztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaCh0bykge1xuICAgICAgICBpZiAodG8gPiB0aGlzLmF0ICYmIHRoaXMuY2xhc3MpXG4gICAgICAgICAgICB0aGlzLnNwYW4odGhpcy5hdCwgdG8sIHRoaXMuY2xhc3MpO1xuICAgIH1cbiAgICBoaWdobGlnaHRSYW5nZShjdXJzb3IsIGZyb20sIHRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGxldCB7IHR5cGUsIGZyb206IHN0YXJ0LCB0bzogZW5kIH0gPSBjdXJzb3I7XG4gICAgICAgIGlmIChzdGFydCA+PSB0byB8fCBlbmQgPD0gZnJvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGUuaXNUb3ApXG4gICAgICAgICAgICBoaWdobGlnaHRlcnMgPSB0aGlzLmhpZ2hsaWdodGVycy5maWx0ZXIoaCA9PiAhaC5zY29wZSB8fCBoLnNjb3BlKHR5cGUpKTtcbiAgICAgICAgbGV0IGNscyA9IGluaGVyaXRlZENsYXNzO1xuICAgICAgICBsZXQgcnVsZSA9IGdldFN0eWxlVGFncyhjdXJzb3IpIHx8IFJ1bGUuZW1wdHk7XG4gICAgICAgIGxldCB0YWdDbHMgPSBoaWdobGlnaHRUYWdzKGhpZ2hsaWdodGVycywgcnVsZS50YWdzKTtcbiAgICAgICAgaWYgKHRhZ0Nscykge1xuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCI7XG4gICAgICAgICAgICBjbHMgKz0gdGFnQ2xzO1xuICAgICAgICAgICAgaWYgKHJ1bGUubW9kZSA9PSAxIC8qIE1vZGUuSW5oZXJpdCAqLylcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWRDbGFzcyArPSAoaW5oZXJpdGVkQ2xhc3MgPyBcIiBcIiA6IFwiXCIpICsgdGFnQ2xzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWF4KGZyb20sIHN0YXJ0KSwgY2xzKTtcbiAgICAgICAgaWYgKHJ1bGUub3BhcXVlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbW91bnRlZCA9IGN1cnNvci50cmVlICYmIGN1cnNvci50cmVlLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgIGlmIChtb3VudGVkICYmIG1vdW50ZWQub3ZlcmxheSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gY3Vyc29yLm5vZGUuZW50ZXIobW91bnRlZC5vdmVybGF5WzBdLmZyb20gKyBzdGFydCwgMSk7XG4gICAgICAgICAgICBsZXQgaW5uZXJIaWdobGlnaHRlcnMgPSB0aGlzLmhpZ2hsaWdodGVycy5maWx0ZXIoaCA9PiAhaC5zY29wZSB8fCBoLnNjb3BlKG1vdW50ZWQudHJlZS50eXBlKSk7XG4gICAgICAgICAgICBsZXQgaGFzQ2hpbGQgPSBjdXJzb3IuZmlyc3RDaGlsZCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IHN0YXJ0OzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBpIDwgbW91bnRlZC5vdmVybGF5Lmxlbmd0aCA/IG1vdW50ZWQub3ZlcmxheVtpXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRQb3MgPSBuZXh0ID8gbmV4dC5mcm9tICsgc3RhcnQgOiBlbmQ7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlRnJvbSA9IE1hdGgubWF4KGZyb20sIHBvcyksIHJhbmdlVG8gPSBNYXRoLm1pbih0bywgbmV4dFBvcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlRnJvbSA8IHJhbmdlVG8gJiYgaGFzQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5mcm9tIDwgcmFuZ2VUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShjdXJzb3IsIHJhbmdlRnJvbSwgcmFuZ2VUbywgaW5oZXJpdGVkQ2xhc3MsIGhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbihyYW5nZVRvLCBjdXJzb3IudG8pLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci50byA+PSBuZXh0UG9zIHx8ICFjdXJzb3IubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dFBvcyA+IHRvKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwb3MgPSBuZXh0LnRvICsgc3RhcnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShpbm5lci5jdXJzb3IoKSwgTWF0aC5tYXgoZnJvbSwgbmV4dC5mcm9tICsgc3RhcnQpLCBNYXRoLm1pbih0bywgcG9zKSwgXCJcIiwgaW5uZXJIaWdobGlnaHRlcnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbih0bywgcG9zKSwgY2xzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzQ2hpbGQpXG4gICAgICAgICAgICAgICAgY3Vyc29yLnBhcmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnNvci5maXJzdENoaWxkKCkpIHtcbiAgICAgICAgICAgIGlmIChtb3VudGVkKVxuICAgICAgICAgICAgICAgIGluaGVyaXRlZENsYXNzID0gXCJcIjtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLnRvIDw9IGZyb20pXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZnJvbSA+PSB0bylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShjdXJzb3IsIGZyb20sIHRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbih0bywgY3Vyc29yLnRvKSwgY2xzKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5uZXh0U2libGluZygpKTtcbiAgICAgICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuTWF0Y2ggYSBzeW50YXggbm9kZSdzIFtoaWdobGlnaHQgcnVsZXNdKCNoaWdobGlnaHQuc3R5bGVUYWdzKS4gSWZcbnRoZXJlJ3MgYSBtYXRjaCwgcmV0dXJuIGl0cyBzZXQgb2YgdGFncywgYW5kIHdoZXRoZXIgaXQgaXNcbm9wYXF1ZSAodXNlcyBhIGAhYCkgb3IgYXBwbGllcyB0byBhbGwgY2hpbGQgbm9kZXMgKGAvLi4uYCkuXG4qL1xuZnVuY3Rpb24gZ2V0U3R5bGVUYWdzKG5vZGUpIHtcbiAgICBsZXQgcnVsZSA9IG5vZGUudHlwZS5wcm9wKHJ1bGVOb2RlUHJvcCk7XG4gICAgd2hpbGUgKHJ1bGUgJiYgcnVsZS5jb250ZXh0ICYmICFub2RlLm1hdGNoQ29udGV4dChydWxlLmNvbnRleHQpKVxuICAgICAgICBydWxlID0gcnVsZS5uZXh0O1xuICAgIHJldHVybiBydWxlIHx8IG51bGw7XG59XG5jb25zdCB0ID0gVGFnLmRlZmluZTtcbmNvbnN0IGNvbW1lbnQgPSB0KCksIG5hbWUgPSB0KCksIHR5cGVOYW1lID0gdChuYW1lKSwgcHJvcGVydHlOYW1lID0gdChuYW1lKSwgbGl0ZXJhbCA9IHQoKSwgc3RyaW5nID0gdChsaXRlcmFsKSwgbnVtYmVyID0gdChsaXRlcmFsKSwgY29udGVudCA9IHQoKSwgaGVhZGluZyA9IHQoY29udGVudCksIGtleXdvcmQgPSB0KCksIG9wZXJhdG9yID0gdCgpLCBwdW5jdHVhdGlvbiA9IHQoKSwgYnJhY2tldCA9IHQocHVuY3R1YXRpb24pLCBtZXRhID0gdCgpO1xuLyoqXG5UaGUgZGVmYXVsdCBzZXQgb2YgaGlnaGxpZ2h0aW5nIFt0YWdzXSgjaGlnaGxpZ2h0LlRhZykuXG5cblRoaXMgY29sbGVjdGlvbiBpcyBoZWF2aWx5IGJpYXNlZCB0b3dhcmRzIHByb2dyYW1taW5nIGxhbmd1YWdlcyxcbmFuZCBuZWNlc3NhcmlseSBpbmNvbXBsZXRlLiBBIGZ1bGwgb250b2xvZ3kgb2Ygc3ludGFjdGljXG5jb25zdHJ1Y3RzIHdvdWxkIGZpbGwgYSBzdGFjayBvZiBib29rcywgYW5kIGJlIGltcHJhY3RpY2FsIHRvXG53cml0ZSB0aGVtZXMgZm9yLiBTbyB0cnkgdG8gbWFrZSBkbyB3aXRoIHRoaXMgc2V0LiBJZiBhbGwgZWxzZVxuZmFpbHMsIFtvcGVuIGFuXG5pc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvci5uZXh0KSB0byBwcm9wb3NlIGFcbm5ldyB0YWcsIG9yIFtkZWZpbmVdKCNoaWdobGlnaHQuVGFnXmRlZmluZSkgYSBsb2NhbCBjdXN0b20gdGFnIGZvclxueW91ciB1c2UgY2FzZS5cblxuTm90ZSB0aGF0IGl0IGlzIG5vdCBvYmxpZ2F0b3J5IHRvIGFsd2F5cyBhdHRhY2ggdGhlIG1vc3Qgc3BlY2lmaWNcbnRhZyBwb3NzaWJsZSB0byBhbiBlbGVtZW50XHUyMDE0aWYgeW91ciBncmFtbWFyIGNhbid0IGVhc2lseVxuZGlzdGluZ3Vpc2ggYSBjZXJ0YWluIHR5cGUgb2YgZWxlbWVudCAoc3VjaCBhcyBhIGxvY2FsIHZhcmlhYmxlKSxcbml0IGlzIG9rYXkgdG8gc3R5bGUgaXQgYXMgaXRzIG1vcmUgZ2VuZXJhbCB2YXJpYW50IChhIHZhcmlhYmxlKS5cblxuRm9yIHRhZ3MgdGhhdCBleHRlbmQgc29tZSBwYXJlbnQgdGFnLCB0aGUgZG9jdW1lbnRhdGlvbiBsaW5rcyB0b1xudGhlIHBhcmVudC5cbiovXG5jb25zdCB0YWdzID0ge1xuICAgIC8qKlxuICAgIEEgY29tbWVudC5cbiAgICAqL1xuICAgIGNvbW1lbnQsXG4gICAgLyoqXG4gICAgQSBsaW5lIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBsaW5lQ29tbWVudDogdChjb21tZW50KSxcbiAgICAvKipcbiAgICBBIGJsb2NrIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBibG9ja0NvbW1lbnQ6IHQoY29tbWVudCksXG4gICAgLyoqXG4gICAgQSBkb2N1bWVudGF0aW9uIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBkb2NDb21tZW50OiB0KGNvbW1lbnQpLFxuICAgIC8qKlxuICAgIEFueSBraW5kIG9mIGlkZW50aWZpZXIuXG4gICAgKi9cbiAgICBuYW1lLFxuICAgIC8qKlxuICAgIFRoZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIG9mIGEgdmFyaWFibGUuXG4gICAgKi9cbiAgICB2YXJpYWJsZU5hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSB0eXBlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICB0eXBlTmFtZTogdHlwZU5hbWUsXG4gICAgLyoqXG4gICAgQSB0YWcgbmFtZSAoc3VidGFnIG9mIFtgdHlwZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudHlwZU5hbWUpKS5cbiAgICAqL1xuICAgIHRhZ05hbWU6IHQodHlwZU5hbWUpLFxuICAgIC8qKlxuICAgIEEgcHJvcGVydHkgb3IgZmllbGQgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgIC8qKlxuICAgIEFuIGF0dHJpYnV0ZSBuYW1lIChzdWJ0YWcgb2YgW2Bwcm9wZXJ0eU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKSkuXG4gICAgKi9cbiAgICBhdHRyaWJ1dGVOYW1lOiB0KHByb3BlcnR5TmFtZSksXG4gICAgLyoqXG4gICAgVGhlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgb2YgYSBjbGFzcy5cbiAgICAqL1xuICAgIGNsYXNzTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIGxhYmVsIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICBsYWJlbE5hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSBuYW1lc3BhY2UgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIG5hbWVzcGFjZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBUaGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSBvZiBhIG1hY3JvLlxuICAgICovXG4gICAgbWFjcm9OYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgbGl0ZXJhbCB2YWx1ZS5cbiAgICAqL1xuICAgIGxpdGVyYWwsXG4gICAgLyoqXG4gICAgQSBzdHJpbmcgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHN0cmluZyxcbiAgICAvKipcbiAgICBBIGRvY3VtZW50YXRpb24gW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykuXG4gICAgKi9cbiAgICBkb2NTdHJpbmc6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBIGNoYXJhY3RlciBsaXRlcmFsIChzdWJ0YWcgb2YgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykpLlxuICAgICovXG4gICAgY2hhcmFjdGVyOiB0KHN0cmluZyksXG4gICAgLyoqXG4gICAgQW4gYXR0cmlidXRlIHZhbHVlIChzdWJ0YWcgb2YgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykpLlxuICAgICovXG4gICAgYXR0cmlidXRlVmFsdWU6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBIG51bWJlciBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgbnVtYmVyLFxuICAgIC8qKlxuICAgIEFuIGludGVnZXIgW251bWJlcl0oI2hpZ2hsaWdodC50YWdzLm51bWJlcikgbGl0ZXJhbC5cbiAgICAqL1xuICAgIGludGVnZXI6IHQobnVtYmVyKSxcbiAgICAvKipcbiAgICBBIGZsb2F0aW5nLXBvaW50IFtudW1iZXJdKCNoaWdobGlnaHQudGFncy5udW1iZXIpIGxpdGVyYWwuXG4gICAgKi9cbiAgICBmbG9hdDogdChudW1iZXIpLFxuICAgIC8qKlxuICAgIEEgYm9vbGVhbiBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgYm9vbDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBSZWd1bGFyIGV4cHJlc3Npb24gW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHJlZ2V4cDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBbiBlc2NhcGUgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKSwgZm9yIGV4YW1wbGUgYVxuICAgIGJhY2tzbGFzaCBlc2NhcGUgaW4gYSBzdHJpbmcuXG4gICAgKi9cbiAgICBlc2NhcGU6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBjb2xvciBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgY29sb3I6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBVUkwgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHVybDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBIGxhbmd1YWdlIGtleXdvcmQuXG4gICAgKi9cbiAgICBrZXl3b3JkLFxuICAgIC8qKlxuICAgIFRoZSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGZvciB0aGUgc2VsZiBvciB0aGlzXG4gICAgb2JqZWN0LlxuICAgICovXG4gICAgc2VsZjogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBUaGUgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSBmb3IgbnVsbC5cbiAgICAqL1xuICAgIG51bGw6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGRlbm90aW5nIHNvbWUgYXRvbWljIHZhbHVlLlxuICAgICovXG4gICAgYXRvbTogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCByZXByZXNlbnRzIGEgdW5pdC5cbiAgICAqL1xuICAgIHVuaXQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBtb2RpZmllciBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpLlxuICAgICovXG4gICAgbW9kaWZpZXI6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHRoYXQgYWN0cyBhcyBhbiBvcGVyYXRvci5cbiAgICAqL1xuICAgIG9wZXJhdG9yS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIGNvbnRyb2wtZmxvdyByZWxhdGVkIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkuXG4gICAgKi9cbiAgICBjb250cm9sS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCBkZWZpbmVzIHNvbWV0aGluZy5cbiAgICAqL1xuICAgIGRlZmluaXRpb25LZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSByZWxhdGVkIHRvIGRlZmluaW5nIG9yXG4gICAgaW50ZXJmYWNpbmcgd2l0aCBtb2R1bGVzLlxuICAgICovXG4gICAgbW9kdWxlS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBbiBvcGVyYXRvci5cbiAgICAqL1xuICAgIG9wZXJhdG9yLFxuICAgIC8qKlxuICAgIEFuIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IGRlcmVmZXJlbmNlcyBzb21ldGhpbmcuXG4gICAgKi9cbiAgICBkZXJlZk9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBBcml0aG1ldGljLXJlbGF0ZWQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgYXJpdGhtZXRpY09wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBMb2dpY2FsIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGxvZ2ljT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIEJpdCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBiaXR3aXNlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIENvbXBhcmlzb24gW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgY29tcGFyZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBbT3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikgdGhhdCB1cGRhdGVzIGl0cyBvcGVyYW5kLlxuICAgICovXG4gICAgdXBkYXRlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFtPcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IGRlZmluZXMgc29tZXRoaW5nLlxuICAgICovXG4gICAgZGVmaW5pdGlvbk9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBUeXBlLXJlbGF0ZWQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgdHlwZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBDb250cm9sLWZsb3cgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgY29udHJvbE9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBQcm9ncmFtIG9yIG1hcmt1cCBwdW5jdHVhdGlvbi5cbiAgICAqL1xuICAgIHB1bmN0dWF0aW9uLFxuICAgIC8qKlxuICAgIFtQdW5jdHVhdGlvbl0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKSB0aGF0IHNlcGFyYXRlc1xuICAgIHRoaW5ncy5cbiAgICAqL1xuICAgIHNlcGFyYXRvcjogdChwdW5jdHVhdGlvbiksXG4gICAgLyoqXG4gICAgQnJhY2tldC1zdHlsZSBbcHVuY3R1YXRpb25dKCNoaWdobGlnaHQudGFncy5wdW5jdHVhdGlvbikuXG4gICAgKi9cbiAgICBicmFja2V0LFxuICAgIC8qKlxuICAgIEFuZ2xlIFticmFja2V0c10oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpICh1c3VhbGx5IGA8YCBhbmQgYD5gXG4gICAgdG9rZW5zKS5cbiAgICAqL1xuICAgIGFuZ2xlQnJhY2tldDogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBTcXVhcmUgW2JyYWNrZXRzXSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkgKHVzdWFsbHkgYFtgIGFuZCBgXWBcbiAgICB0b2tlbnMpLlxuICAgICovXG4gICAgc3F1YXJlQnJhY2tldDogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBQYXJlbnRoZXNlcyAodXN1YWxseSBgKGAgYW5kIGApYCB0b2tlbnMpLiBTdWJ0YWcgb2ZcbiAgICBbYnJhY2tldF0oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpLlxuICAgICovXG4gICAgcGFyZW46IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgQnJhY2VzICh1c3VhbGx5IGB7YCBhbmQgYH1gIHRva2VucykuIFN1YnRhZyBvZlxuICAgIFticmFja2V0XSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkuXG4gICAgKi9cbiAgICBicmFjZTogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBDb250ZW50LCBmb3IgZXhhbXBsZSBwbGFpbiB0ZXh0IGluIFhNTCBvciBtYXJrdXAgZG9jdW1lbnRzLlxuICAgICovXG4gICAgY29udGVudCxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIGhlYWRpbmcuXG4gICAgKi9cbiAgICBoZWFkaW5nLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgMSBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzE6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCAyIFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nMjogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDMgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmczOiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgNCBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzQ6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCA1IFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nNTogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDYgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmc2OiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgcHJvc2Ugc2VwYXJhdG9yIChzdWNoIGFzIGEgaG9yaXpvbnRhbCBydWxlKS5cbiAgICAqL1xuICAgIGNvbnRlbnRTZXBhcmF0b3I6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IHJlcHJlc2VudHMgYSBsaXN0LlxuICAgICovXG4gICAgbGlzdDogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIHF1b3RlLlxuICAgICovXG4gICAgcXVvdGU6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IGlzIGVtcGhhc2l6ZWQuXG4gICAgKi9cbiAgICBlbXBoYXNpczogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgc3R5bGVkIHN0cm9uZy5cbiAgICAqL1xuICAgIHN0cm9uZzogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgcGFydCBvZiBhIGxpbmsuXG4gICAgKi9cbiAgICBsaW5rOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBzdHlsZWQgYXMgY29kZSBvclxuICAgIG1vbm9zcGFjZS5cbiAgICAqL1xuICAgIG1vbm9zcGFjZTogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaGFzIGEgc3RyaWtlLXRocm91Z2hcbiAgICBzdHlsZS5cbiAgICAqL1xuICAgIHN0cmlrZXRocm91Z2g6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgSW5zZXJ0ZWQgdGV4dCBpbiBhIGNoYW5nZS10cmFja2luZyBmb3JtYXQuXG4gICAgKi9cbiAgICBpbnNlcnRlZDogdCgpLFxuICAgIC8qKlxuICAgIERlbGV0ZWQgdGV4dC5cbiAgICAqL1xuICAgIGRlbGV0ZWQ6IHQoKSxcbiAgICAvKipcbiAgICBDaGFuZ2VkIHRleHQuXG4gICAgKi9cbiAgICBjaGFuZ2VkOiB0KCksXG4gICAgLyoqXG4gICAgQW4gaW52YWxpZCBvciB1bnN5bnRhY3RpYyBlbGVtZW50LlxuICAgICovXG4gICAgaW52YWxpZDogdCgpLFxuICAgIC8qKlxuICAgIE1ldGFkYXRhIG9yIG1ldGEtaW5zdHJ1Y3Rpb24uXG4gICAgKi9cbiAgICBtZXRhLFxuICAgIC8qKlxuICAgIFtNZXRhZGF0YV0oI2hpZ2hsaWdodC50YWdzLm1ldGEpIHRoYXQgYXBwbGllcyB0byB0aGUgZW50aXJlXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBkb2N1bWVudE1ldGE6IHQobWV0YSksXG4gICAgLyoqXG4gICAgW01ldGFkYXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkgdGhhdCBhbm5vdGF0ZXMgb3IgYWRkc1xuICAgIGF0dHJpYnV0ZXMgdG8gYSBnaXZlbiBzeW50YWN0aWMgZWxlbWVudC5cbiAgICAqL1xuICAgIGFubm90YXRpb246IHQobWV0YSksXG4gICAgLyoqXG4gICAgUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLiBTdWJ0YWcgb2ZcbiAgICBbbWV0YV0oI2hpZ2hsaWdodC50YWdzLm1ldGEpLlxuICAgICovXG4gICAgcHJvY2Vzc2luZ0luc3RydWN0aW9uOiB0KG1ldGEpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgaW5kaWNhdGVzIHRoYXQgYVxuICAgIGdpdmVuIGVsZW1lbnQgaXMgYmVpbmcgZGVmaW5lZC4gRXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoIHRoZVxuICAgIHZhcmlvdXMgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSB0YWdzLlxuICAgICovXG4gICAgZGVmaW5pdGlvbjogVGFnLmRlZmluZU1vZGlmaWVyKCksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgdGhhdFxuICAgIHNvbWV0aGluZyBpcyBjb25zdGFudC4gTW9zdGx5IGV4cGVjdGVkIHRvIGJlIHVzZWQgd2l0aFxuICAgIFt2YXJpYWJsZSBuYW1lc10oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkuXG4gICAgKi9cbiAgICBjb25zdGFudDogVGFnLmRlZmluZU1vZGlmaWVyKCksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdXNlZCB0byBpbmRpY2F0ZSB0aGF0XG4gICAgYSBbdmFyaWFibGVdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpIG9yIFtwcm9wZXJ0eVxuICAgIG5hbWVdKCNoaWdobGlnaHQudGFncy5wcm9wZXJ0eU5hbWUpIGlzIGJlaW5nIGNhbGxlZCBvciBkZWZpbmVkXG4gICAgYXMgYSBmdW5jdGlvbi5cbiAgICAqL1xuICAgIGZ1bmN0aW9uOiBUYWcuZGVmaW5lTW9kaWZpZXIoKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvXG4gICAgW25hbWVzXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgdG8gaW5kaWNhdGUgdGhhdCB0aGV5IGJlbG9uZyB0b1xuICAgIHRoZSBsYW5ndWFnZSdzIHN0YW5kYXJkIGVudmlyb25tZW50LlxuICAgICovXG4gICAgc3RhbmRhcmQ6IFRhZy5kZWZpbmVNb2RpZmllcigpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgaW5kaWNhdGVzIGEgZ2l2ZW5cbiAgICBbbmFtZXNdKCNoaWdobGlnaHQudGFncy5uYW1lKSBpcyBsb2NhbCB0byBzb21lIHNjb3BlLlxuICAgICovXG4gICAgbG9jYWw6IFRhZy5kZWZpbmVNb2RpZmllcigpLFxuICAgIC8qKlxuICAgIEEgZ2VuZXJpYyB2YXJpYW50IFttb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXRcbiAgICBjYW4gYmUgdXNlZCB0byB0YWcgbGFuZ3VhZ2Utc3BlY2lmaWMgYWx0ZXJuYXRpdmUgdmFyaWFudHMgb2ZcbiAgICBzb21lIGNvbW1vbiB0YWcuIEl0IGlzIHJlY29tbWVuZGVkIGZvciB0aGVtZXMgdG8gZGVmaW5lIHNwZWNpYWxcbiAgICBmb3JtcyBvZiBhdCBsZWFzdCB0aGUgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykgYW5kXG4gICAgW3ZhcmlhYmxlIG5hbWVdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpIHRhZ3MsIHNpbmNlIHRob3NlXG4gICAgY29tZSB1cCBhIGxvdC5cbiAgICAqL1xuICAgIHNwZWNpYWw6IFRhZy5kZWZpbmVNb2RpZmllcigpXG59O1xuLyoqXG5UaGlzIGlzIGEgaGlnaGxpZ2h0ZXIgdGhhdCBhZGRzIHN0YWJsZSwgcHJlZGljdGFibGUgY2xhc3NlcyB0b1xudG9rZW5zLCBmb3Igc3R5bGluZyB3aXRoIGV4dGVybmFsIENTUy5cblxuVGhlIGZvbGxvd2luZyB0YWdzIGFyZSBtYXBwZWQgdG8gdGhlaXIgbmFtZSBwcmVmaXhlZCB3aXRoIGBcInRvay1cImBcbihmb3IgZXhhbXBsZSBgXCJ0b2stY29tbWVudFwiYCk6XG5cbiogW2BsaW5rYF0oI2hpZ2hsaWdodC50YWdzLmxpbmspXG4qIFtgaGVhZGluZ2BdKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKVxuKiBbYGVtcGhhc2lzYF0oI2hpZ2hsaWdodC50YWdzLmVtcGhhc2lzKVxuKiBbYHN0cm9uZ2BdKCNoaWdobGlnaHQudGFncy5zdHJvbmcpXG4qIFtga2V5d29yZGBdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKVxuKiBbYGF0b21gXSgjaGlnaGxpZ2h0LnRhZ3MuYXRvbSlcbiogW2Bib29sYF0oI2hpZ2hsaWdodC50YWdzLmJvb2wpXG4qIFtgdXJsYF0oI2hpZ2hsaWdodC50YWdzLnVybClcbiogW2BsYWJlbE5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MubGFiZWxOYW1lKVxuKiBbYGluc2VydGVkYF0oI2hpZ2hsaWdodC50YWdzLmluc2VydGVkKVxuKiBbYGRlbGV0ZWRgXSgjaGlnaGxpZ2h0LnRhZ3MuZGVsZXRlZClcbiogW2BsaXRlcmFsYF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpXG4qIFtgc3RyaW5nYF0oI2hpZ2hsaWdodC50YWdzLnN0cmluZylcbiogW2BudW1iZXJgXSgjaGlnaGxpZ2h0LnRhZ3MubnVtYmVyKVxuKiBbYHZhcmlhYmxlTmFtZWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4qIFtgdHlwZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudHlwZU5hbWUpXG4qIFtgbmFtZXNwYWNlYF0oI2hpZ2hsaWdodC50YWdzLm5hbWVzcGFjZSlcbiogW2BjbGFzc05hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MuY2xhc3NOYW1lKVxuKiBbYG1hY3JvTmFtZWBdKCNoaWdobGlnaHQudGFncy5tYWNyb05hbWUpXG4qIFtgcHJvcGVydHlOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSlcbiogW2BvcGVyYXRvcmBdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcilcbiogW2Bjb21tZW50YF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpXG4qIFtgbWV0YWBdKCNoaWdobGlnaHQudGFncy5tZXRhKVxuKiBbYHB1bmN0dWF0aW9uYF0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKVxuKiBbYGludmFsaWRgXSgjaGlnaGxpZ2h0LnRhZ3MuaW52YWxpZClcblxuSW4gYWRkaXRpb24sIHRoZXNlIG1hcHBpbmdzIGFyZSBwcm92aWRlZDpcblxuKiBbYHJlZ2V4cGBdKCNoaWdobGlnaHQudGFncy5yZWdleHApLFxuICBbYGVzY2FwZWBdKCNoaWdobGlnaHQudGFncy5lc2NhcGUpLCBhbmRcbiAgW2BzcGVjaWFsYF0oI2hpZ2hsaWdodC50YWdzLnNwZWNpYWwpW2Aoc3RyaW5nKWBdKCNoaWdobGlnaHQudGFncy5zdHJpbmcpXG4gIGFyZSBtYXBwZWQgdG8gYFwidG9rLXN0cmluZzJcImBcbiogW2BzcGVjaWFsYF0oI2hpZ2hsaWdodC50YWdzLnNwZWNpYWwpW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUyXCJgXG4qIFtgbG9jYWxgXSgjaGlnaGxpZ2h0LnRhZ3MubG9jYWwpW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUgdG9rLWxvY2FsXCJgXG4qIFtgZGVmaW5pdGlvbmBdKCNoaWdobGlnaHQudGFncy5kZWZpbml0aW9uKVtgKHZhcmlhYmxlTmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuICB0byBgXCJ0b2stdmFyaWFibGVOYW1lIHRvay1kZWZpbml0aW9uXCJgXG4qIFtgZGVmaW5pdGlvbmBdKCNoaWdobGlnaHQudGFncy5kZWZpbml0aW9uKVtgKHByb3BlcnR5TmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKVxuICB0byBgXCJ0b2stcHJvcGVydHlOYW1lIHRvay1kZWZpbml0aW9uXCJgXG4qL1xuY29uc3QgY2xhc3NIaWdobGlnaHRlciA9IHRhZ0hpZ2hsaWdodGVyKFtcbiAgICB7IHRhZzogdGFncy5saW5rLCBjbGFzczogXCJ0b2stbGlua1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaGVhZGluZywgY2xhc3M6IFwidG9rLWhlYWRpbmdcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmVtcGhhc2lzLCBjbGFzczogXCJ0b2stZW1waGFzaXNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cm9uZywgY2xhc3M6IFwidG9rLXN0cm9uZ1wiIH0sXG4gICAgeyB0YWc6IHRhZ3Mua2V5d29yZCwgY2xhc3M6IFwidG9rLWtleXdvcmRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmF0b20sIGNsYXNzOiBcInRvay1hdG9tXCIgfSxcbiAgICB7IHRhZzogdGFncy5ib29sLCBjbGFzczogXCJ0b2stYm9vbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MudXJsLCBjbGFzczogXCJ0b2stdXJsXCIgfSxcbiAgICB7IHRhZzogdGFncy5sYWJlbE5hbWUsIGNsYXNzOiBcInRvay1sYWJlbE5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmluc2VydGVkLCBjbGFzczogXCJ0b2staW5zZXJ0ZWRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmRlbGV0ZWQsIGNsYXNzOiBcInRvay1kZWxldGVkXCIgfSxcbiAgICB7IHRhZzogdGFncy5saXRlcmFsLCBjbGFzczogXCJ0b2stbGl0ZXJhbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3RyaW5nLCBjbGFzczogXCJ0b2stc3RyaW5nXCIgfSxcbiAgICB7IHRhZzogdGFncy5udW1iZXIsIGNsYXNzOiBcInRvay1udW1iZXJcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5yZWdleHAsIHRhZ3MuZXNjYXBlLCB0YWdzLnNwZWNpYWwodGFncy5zdHJpbmcpXSwgY2xhc3M6IFwidG9rLXN0cmluZzJcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnZhcmlhYmxlTmFtZSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubG9jYWwodGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lIHRvay1sb2NhbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVmaW5pdGlvbih0YWdzLnZhcmlhYmxlTmFtZSksIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWUgdG9rLWRlZmluaXRpb25cIiB9LFxuICAgIHsgdGFnOiB0YWdzLnNwZWNpYWwodGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lMlwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVmaW5pdGlvbih0YWdzLnByb3BlcnR5TmFtZSksIGNsYXNzOiBcInRvay1wcm9wZXJ0eU5hbWUgdG9rLWRlZmluaXRpb25cIiB9LFxuICAgIHsgdGFnOiB0YWdzLnR5cGVOYW1lLCBjbGFzczogXCJ0b2stdHlwZU5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm5hbWVzcGFjZSwgY2xhc3M6IFwidG9rLW5hbWVzcGFjZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY2xhc3NOYW1lLCBjbGFzczogXCJ0b2stY2xhc3NOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5tYWNyb05hbWUsIGNsYXNzOiBcInRvay1tYWNyb05hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnByb3BlcnR5TmFtZSwgY2xhc3M6IFwidG9rLXByb3BlcnR5TmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3Mub3BlcmF0b3IsIGNsYXNzOiBcInRvay1vcGVyYXRvclwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY29tbWVudCwgY2xhc3M6IFwidG9rLWNvbW1lbnRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm1ldGEsIGNsYXNzOiBcInRvay1tZXRhXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnZhbGlkLCBjbGFzczogXCJ0b2staW52YWxpZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MucHVuY3R1YXRpb24sIGNsYXNzOiBcInRvay1wdW5jdHVhdGlvblwiIH1cbl0pO1xuXG5leHBvcnQgeyBUYWcsIGNsYXNzSGlnaGxpZ2h0ZXIsIGdldFN0eWxlVGFncywgaGlnaGxpZ2h0Q29kZSwgaGlnaGxpZ2h0VHJlZSwgc3R5bGVUYWdzLCB0YWdIaWdobGlnaHRlciwgdGFncyB9O1xuIiwgImltcG9ydCB7IE5vZGVQcm9wLCBJdGVyTW9kZSwgVHJlZSwgVHJlZUZyYWdtZW50LCBQYXJzZXIsIE5vZGVUeXBlLCBOb2RlU2V0IH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5pbXBvcnQgeyBTdGF0ZUVmZmVjdCwgU3RhdGVGaWVsZCwgRmFjZXQsIEVkaXRvclN0YXRlLCBjb3VudENvbHVtbiwgY29tYmluZUNvbmZpZywgUmFuZ2VTZXQsIFJhbmdlU2V0QnVpbGRlciwgUHJlYyB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IFZpZXdQbHVnaW4sIGxvZ0V4Y2VwdGlvbiwgRWRpdG9yVmlldywgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSwgZ3V0dGVyLCBHdXR0ZXJNYXJrZXIsIERpcmVjdGlvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHsgdGFncywgdGFnSGlnaGxpZ2h0ZXIsIGhpZ2hsaWdodFRyZWUsIHN0eWxlVGFncyB9IGZyb20gJ0BsZXplci9oaWdobGlnaHQnO1xuaW1wb3J0IHsgU3R5bGVNb2R1bGUgfSBmcm9tICdzdHlsZS1tb2QnO1xuXG52YXIgX2E7XG4vKipcbk5vZGUgcHJvcCBzdG9yZWQgaW4gYSBwYXJzZXIncyB0b3Agc3ludGF4IG5vZGUgdG8gcHJvdmlkZSB0aGVcbmZhY2V0IHRoYXQgc3RvcmVzIGxhbmd1YWdlLXNwZWNpZmljIGRhdGEgZm9yIHRoYXQgbGFuZ3VhZ2UuXG4qL1xuY29uc3QgbGFuZ3VhZ2VEYXRhUHJvcCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbi8qKlxuSGVscGVyIGZ1bmN0aW9uIHRvIGRlZmluZSBhIGZhY2V0ICh0byBiZSBhZGRlZCB0byB0aGUgdG9wIHN5bnRheFxubm9kZShzKSBmb3IgYSBsYW5ndWFnZSB2aWFcbltgbGFuZ3VhZ2VEYXRhUHJvcGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UubGFuZ3VhZ2VEYXRhUHJvcCkpLCB0aGF0IHdpbGwgYmVcbnVzZWQgdG8gYXNzb2NpYXRlIGxhbmd1YWdlIGRhdGEgd2l0aCB0aGUgbGFuZ3VhZ2UuIFlvdVxucHJvYmFibHkgb25seSBuZWVkIHRoaXMgd2hlbiBzdWJjbGFzc2luZ1xuW2BMYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpLlxuKi9cbmZ1bmN0aW9uIGRlZmluZUxhbmd1YWdlRmFjZXQoYmFzZURhdGEpIHtcbiAgICByZXR1cm4gRmFjZXQuZGVmaW5lKHtcbiAgICAgICAgY29tYmluZTogYmFzZURhdGEgPyB2YWx1ZXMgPT4gdmFsdWVzLmNvbmNhdChiYXNlRGF0YSkgOiB1bmRlZmluZWRcbiAgICB9KTtcbn1cbi8qKlxuU3ludGF4IG5vZGUgcHJvcCB1c2VkIHRvIHJlZ2lzdGVyIHN1Ymxhbmd1YWdlcy4gU2hvdWxkIGJlIGFkZGVkIHRvXG50aGUgdG9wIGxldmVsIG5vZGUgdHlwZSBmb3IgdGhlIGxhbmd1YWdlLlxuKi9cbmNvbnN0IHN1Ymxhbmd1YWdlUHJvcCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbi8qKlxuQSBsYW5ndWFnZSBvYmplY3QgbWFuYWdlcyBwYXJzaW5nIGFuZCBwZXItbGFuZ3VhZ2VcblttZXRhZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCkuIFBhcnNlIGRhdGEgaXNcbm1hbmFnZWQgYXMgYSBbTGV6ZXJdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQpIHRyZWUuIFRoZSBjbGFzc1xuY2FuIGJlIHVzZWQgZGlyZWN0bHksIHZpYSB0aGUgW2BMUkxhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MUkxhbmd1YWdlKVxuc3ViY2xhc3MgZm9yIFtMZXplcl0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC8pIExSIHBhcnNlcnMsIG9yXG52aWEgdGhlIFtgU3RyZWFtTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLlN0cmVhbUxhbmd1YWdlKSBzdWJjbGFzc1xuZm9yIHN0cmVhbSBwYXJzZXJzLlxuKi9cbmNsYXNzIExhbmd1YWdlIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBsYW5ndWFnZSBvYmplY3QuIElmIHlvdSBuZWVkIHRvIGludm9rZSB0aGlzXG4gICAgZGlyZWN0bHksIGZpcnN0IGRlZmluZSBhIGRhdGEgZmFjZXQgd2l0aFxuICAgIFtgZGVmaW5lTGFuZ3VhZ2VGYWNldGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZGVmaW5lTGFuZ3VhZ2VGYWNldCksIGFuZCB0aGVuXG4gICAgY29uZmlndXJlIHlvdXIgcGFyc2VyIHRvIFthdHRhY2hdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UubGFuZ3VhZ2VEYXRhUHJvcCkgaXRcbiAgICB0byB0aGUgbGFuZ3VhZ2UncyBvdXRlciBzeW50YXggbm9kZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBbbGFuZ3VhZ2UgZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCkgZmFjZXRcbiAgICB1c2VkIGZvciB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgZGF0YSwgcGFyc2VyLCBleHRyYUV4dGVuc2lvbnMgPSBbXSwgXG4gICAgLyoqXG4gICAgQSBsYW5ndWFnZSBuYW1lLlxuICAgICovXG4gICAgbmFtZSA9IFwiXCIpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgLy8gS2x1ZGdlIHRvIGRlZmluZSBFZGl0b3JTdGF0ZS50cmVlIGFzIGEgZGVidWdnaW5nIGhlbHBlcixcbiAgICAgICAgLy8gd2l0aG91dCB0aGUgRWRpdG9yU3RhdGUgcGFja2FnZSBhY3R1YWxseSBrbm93aW5nIGFib3V0XG4gICAgICAgIC8vIGxhbmd1YWdlcyBhbmQgbGV6ZXIgdHJlZXMuXG4gICAgICAgIGlmICghRWRpdG9yU3RhdGUucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwidHJlZVwiKSlcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFZGl0b3JTdGF0ZS5wcm90b3R5cGUsIFwidHJlZVwiLCB7IGdldCgpIHsgcmV0dXJuIHN5bnRheFRyZWUodGhpcyk7IH0gfSk7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IFtcbiAgICAgICAgICAgIGxhbmd1YWdlLm9mKHRoaXMpLFxuICAgICAgICAgICAgRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhLm9mKChzdGF0ZSwgcG9zLCBzaWRlKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRvcE5vZGVBdChzdGF0ZSwgcG9zLCBzaWRlKSwgZGF0YSA9IHRvcC50eXBlLnByb3AobGFuZ3VhZ2VEYXRhUHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgbGV0IGJhc2UgPSBzdGF0ZS5mYWNldChkYXRhKSwgc3ViID0gdG9wLnR5cGUucHJvcChzdWJsYW5ndWFnZVByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChzdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyTm9kZSA9IHRvcC5yZXNvbHZlKHBvcyAtIHRvcC5mcm9tLCBzaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3VibGFuZyBvZiBzdWIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VibGFuZy50ZXN0KGlubmVyTm9kZSwgc3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBzdGF0ZS5mYWNldChzdWJsYW5nLmZhY2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VibGFuZy50eXBlID09IFwicmVwbGFjZVwiID8gZGF0YSA6IGRhdGEuY29uY2F0KGJhc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0uY29uY2F0KGV4dHJhRXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJ5IHdoZXRoZXIgdGhpcyBsYW5ndWFnZSBpcyBhY3RpdmUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgaXNBY3RpdmVBdChzdGF0ZSwgcG9zLCBzaWRlID0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRvcE5vZGVBdChzdGF0ZSwgcG9zLCBzaWRlKS50eXBlLnByb3AobGFuZ3VhZ2VEYXRhUHJvcCkgPT0gdGhpcy5kYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBkb2N1bWVudCByZWdpb25zIHRoYXQgd2VyZSBwYXJzZWQgdXNpbmcgdGhpcyBsYW5ndWFnZS5cbiAgICBUaGUgcmV0dXJuZWQgcmVnaW9ucyB3aWxsIF9pbmNsdWRlXyBhbnkgbmVzdGVkIGxhbmd1YWdlcyByb290ZWRcbiAgICBpbiB0aGlzIGxhbmd1YWdlLCB3aGVuIHRob3NlIGV4aXN0LlxuICAgICovXG4gICAgZmluZFJlZ2lvbnMoc3RhdGUpIHtcbiAgICAgICAgbGV0IGxhbmcgPSBzdGF0ZS5mYWNldChsYW5ndWFnZSk7XG4gICAgICAgIGlmICgobGFuZyA9PT0gbnVsbCB8fCBsYW5nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYW5nLmRhdGEpID09IHRoaXMuZGF0YSlcbiAgICAgICAgICAgIHJldHVybiBbeyBmcm9tOiAwLCB0bzogc3RhdGUuZG9jLmxlbmd0aCB9XTtcbiAgICAgICAgaWYgKCFsYW5nIHx8ICFsYW5nLmFsbG93c05lc3RpbmcpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGV4cGxvcmUgPSAodHJlZSwgZnJvbSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRyZWUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb20sIHRvOiBmcm9tICsgdHJlZS5sZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1vdW50ID0gdHJlZS5wcm9wKE5vZGVQcm9wLm1vdW50ZWQpO1xuICAgICAgICAgICAgaWYgKG1vdW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vdW50LnRyZWUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdW50Lm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIG1vdW50Lm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tOiByLmZyb20gKyBmcm9tLCB0bzogci50byArIGZyb20gfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbTogZnJvbSwgdG86IGZyb20gKyB0cmVlLmxlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb3VudC5vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgZXhwbG9yZShtb3VudC50cmVlLCBtb3VudC5vdmVybGF5WzBdLmZyb20gKyBmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiBzaXplKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRyZWUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgaWYgKGNoIGluc3RhbmNlb2YgVHJlZSlcbiAgICAgICAgICAgICAgICAgICAgZXhwbG9yZShjaCwgdHJlZS5wb3NpdGlvbnNbaV0gKyBmcm9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZXhwbG9yZShzeW50YXhUcmVlKHN0YXRlKSwgMCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbGFuZ3VhZ2UgYWxsb3dzIG5lc3RlZCBsYW5ndWFnZXMuIFRoZVxuICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlLlxuICAgICovXG4gICAgZ2V0IGFsbG93c05lc3RpbmcoKSB7IHJldHVybiB0cnVlOyB9XG59XG4vKipcbkBpbnRlcm5hbFxuKi9cbkxhbmd1YWdlLnNldFN0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuZnVuY3Rpb24gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgdG9wTGFuZyA9IHN0YXRlLmZhY2V0KGxhbmd1YWdlKSwgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpLnRvcE5vZGU7XG4gICAgaWYgKCF0b3BMYW5nIHx8IHRvcExhbmcuYWxsb3dzTmVzdGluZykge1xuICAgICAgICBmb3IgKGxldCBub2RlID0gdHJlZTsgbm9kZTsgbm9kZSA9IG5vZGUuZW50ZXIocG9zLCBzaWRlLCBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycykpXG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmlzVG9wKVxuICAgICAgICAgICAgICAgIHRyZWUgPSBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gdHJlZTtcbn1cbi8qKlxuQSBzdWJjbGFzcyBvZiBbYExhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkgZm9yIHVzZSB3aXRoIExlemVyXG5bTFIgcGFyc2Vyc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNsci5MUlBhcnNlcilcbnBhcnNlcnMuXG4qL1xuY2xhc3MgTFJMYW5ndWFnZSBleHRlbmRzIExhbmd1YWdlIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBwYXJzZXIsIG5hbWUpIHtcbiAgICAgICAgc3VwZXIoZGF0YSwgcGFyc2VyLCBbXSwgbmFtZSk7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBsYW5ndWFnZSBmcm9tIGEgcGFyc2VyLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjKSB7XG4gICAgICAgIGxldCBkYXRhID0gZGVmaW5lTGFuZ3VhZ2VGYWNldChzcGVjLmxhbmd1YWdlRGF0YSk7XG4gICAgICAgIHJldHVybiBuZXcgTFJMYW5ndWFnZShkYXRhLCBzcGVjLnBhcnNlci5jb25maWd1cmUoe1xuICAgICAgICAgICAgcHJvcHM6IFtsYW5ndWFnZURhdGFQcm9wLmFkZCh0eXBlID0+IHR5cGUuaXNUb3AgPyBkYXRhIDogdW5kZWZpbmVkKV1cbiAgICAgICAgfSksIHNwZWMubmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGxhbmd1YWdlIHdpdGggYSByZWNvbmZpZ3VyZWRcbiAgICB2ZXJzaW9uIG9mIGl0cyBwYXJzZXIgYW5kIG9wdGlvbmFsbHkgYSBuZXcgbmFtZS5cbiAgICAqL1xuICAgIGNvbmZpZ3VyZShvcHRpb25zLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgTFJMYW5ndWFnZSh0aGlzLmRhdGEsIHRoaXMucGFyc2VyLmNvbmZpZ3VyZShvcHRpb25zKSwgbmFtZSB8fCB0aGlzLm5hbWUpO1xuICAgIH1cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIHRoaXMucGFyc2VyLmhhc1dyYXBwZXJzKCk7IH1cbn1cbi8qKlxuR2V0IHRoZSBzeW50YXggdHJlZSBmb3IgYSBzdGF0ZSwgd2hpY2ggaXMgdGhlIGN1cnJlbnQgKHBvc3NpYmx5XG5pbmNvbXBsZXRlKSBwYXJzZSB0cmVlIG9mIHRoZSBhY3RpdmVcbltsYW5ndWFnZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSksIG9yIHRoZSBlbXB0eSB0cmVlIGlmIHRoZXJlIGlzIG5vXG5sYW5ndWFnZSBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gc3ludGF4VHJlZShzdGF0ZSkge1xuICAgIGxldCBmaWVsZCA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZpZWxkID8gZmllbGQudHJlZSA6IFRyZWUuZW1wdHk7XG59XG4vKipcblRyeSB0byBnZXQgYSBwYXJzZSB0cmVlIHRoYXQgc3BhbnMgYXQgbGVhc3QgdXAgdG8gYHVwdG9gLiBUaGVcbm1ldGhvZCB3aWxsIGRvIGF0IG1vc3QgYHRpbWVvdXRgIG1pbGxpc2Vjb25kcyBvZiB3b3JrIHRvIHBhcnNlXG51cCB0byB0aGF0IHBvaW50IGlmIHRoZSB0cmVlIGlzbid0IGFscmVhZHkgYXZhaWxhYmxlLlxuKi9cbmZ1bmN0aW9uIGVuc3VyZVN5bnRheFRyZWUoc3RhdGUsIHVwdG8sIHRpbWVvdXQgPSA1MCkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgcGFyc2UgPSAoX2EgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSwgZmFsc2UpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGV4dDtcbiAgICBpZiAoIXBhcnNlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgb2xkVmllcG9ydCA9IHBhcnNlLnZpZXdwb3J0O1xuICAgIHBhcnNlLnVwZGF0ZVZpZXdwb3J0KHsgZnJvbTogMCwgdG86IHVwdG8gfSk7XG4gICAgbGV0IHJlc3VsdCA9IHBhcnNlLmlzRG9uZSh1cHRvKSB8fCBwYXJzZS53b3JrKHRpbWVvdXQsIHVwdG8pID8gcGFyc2UudHJlZSA6IG51bGw7XG4gICAgcGFyc2UudXBkYXRlVmlld3BvcnQob2xkVmllcG9ydCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuUXVlcmllcyB3aGV0aGVyIHRoZXJlIGlzIGEgZnVsbCBzeW50YXggdHJlZSBhdmFpbGFibGUgdXAgdG8gdGhlXG5naXZlbiBkb2N1bWVudCBwb3NpdGlvbi4gSWYgdGhlcmUgaXNuJ3QsIHRoZSBiYWNrZ3JvdW5kIHBhcnNlXG5wcm9jZXNzIF9taWdodF8gc3RpbGwgYmUgd29ya2luZyBhbmQgdXBkYXRlIHRoZSB0cmVlIGZ1cnRoZXIsIGJ1dFxudGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9mIHRoYXRcdTIwMTR0aGUgcGFyc2VyIHdpbGwgW3N0b3BcbndvcmtpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2Uuc3ludGF4UGFyc2VyUnVubmluZykgd2hlbiBpdCBoYXMgc3BlbnQgYVxuY2VydGFpbiBhbW91bnQgb2YgdGltZSBvciBoYXMgbW92ZWQgYmV5b25kIHRoZSB2aXNpYmxlIHZpZXdwb3J0LlxuQWx3YXlzIHJldHVybnMgZmFsc2UgaWYgbm8gbGFuZ3VhZ2UgaGFzIGJlZW4gZW5hYmxlZC5cbiovXG5mdW5jdGlvbiBzeW50YXhUcmVlQXZhaWxhYmxlKHN0YXRlLCB1cHRvID0gc3RhdGUuZG9jLmxlbmd0aCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKChfYSA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250ZXh0LmlzRG9uZSh1cHRvKSkgfHwgZmFsc2U7XG59XG4vKipcbk1vdmUgcGFyc2luZyBmb3J3YXJkLCBhbmQgdXBkYXRlIHRoZSBlZGl0b3Igc3RhdGUgYWZ0ZXJ3YXJkcyB0b1xucmVmbGVjdCB0aGUgbmV3IHRyZWUuIFdpbGwgd29yayBmb3IgYXQgbW9zdCBgdGltZW91dGBcbm1pbGxpc2Vjb25kcy4gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJzZXIgbWFuYWdlZCBnZXQgdG8gdGhlIGdpdmVuXG5wb3NpdGlvbiBpbiB0aGF0IHRpbWUuXG4qL1xuZnVuY3Rpb24gZm9yY2VQYXJzaW5nKHZpZXcsIHVwdG8gPSB2aWV3LnZpZXdwb3J0LnRvLCB0aW1lb3V0ID0gMTAwKSB7XG4gICAgbGV0IHN1Y2Nlc3MgPSBlbnN1cmVTeW50YXhUcmVlKHZpZXcuc3RhdGUsIHVwdG8sIHRpbWVvdXQpO1xuICAgIGlmIChzdWNjZXNzICE9IHN5bnRheFRyZWUodmlldy5zdGF0ZSkpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goe30pO1xuICAgIHJldHVybiAhIXN1Y2Nlc3M7XG59XG4vKipcblRlbGxzIHlvdSB3aGV0aGVyIHRoZSBsYW5ndWFnZSBwYXJzZXIgaXMgcGxhbm5pbmcgdG8gZG8gbW9yZVxucGFyc2luZyB3b3JrIChpbiBhIGByZXF1ZXN0SWRsZUNhbGxiYWNrYCBwc2V1ZG8tdGhyZWFkKSBvciBoYXNcbnN0b3BwZWQgcnVubmluZywgZWl0aGVyIGJlY2F1c2UgaXQgcGFyc2VkIHRoZSBlbnRpcmUgZG9jdW1lbnQsXG5iZWNhdXNlIGl0IHNwZW50IHRvbyBtdWNoIHRpbWUgYW5kIHdhcyBjdXQgb2ZmLCBvciBiZWNhdXNlIHRoZXJlXG5pcyBubyBsYW5ndWFnZSBwYXJzZXIgZW5hYmxlZC5cbiovXG5mdW5jdGlvbiBzeW50YXhQYXJzZXJSdW5uaW5nKHZpZXcpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuICgoX2EgPSB2aWV3LnBsdWdpbihwYXJzZVdvcmtlcikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc1dvcmtpbmcoKSkgfHwgZmFsc2U7XG59XG4vKipcbkxlemVyLXN0eWxlXG5bYElucHV0YF0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNjb21tb24uSW5wdXQpXG5vYmplY3QgZm9yIGEgW2BUZXh0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UZXh0KSBvYmplY3QuXG4qL1xuY2xhc3MgRG9jSW5wdXQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnB1dCBvYmplY3QgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvYykge1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5jdXJzb3JQb3MgPSAwO1xuICAgICAgICB0aGlzLnN0cmluZyA9IFwiXCI7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gZG9jLml0ZXIoKTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuZG9jLmxlbmd0aDsgfVxuICAgIHN5bmNUbyhwb3MpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSB0aGlzLmN1cnNvci5uZXh0KHBvcyAtIHRoaXMuY3Vyc29yUG9zKS52YWx1ZTtcbiAgICAgICAgdGhpcy5jdXJzb3JQb3MgPSBwb3MgKyB0aGlzLnN0cmluZy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnNvclBvcyAtIHRoaXMuc3RyaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgY2h1bmsocG9zKSB7XG4gICAgICAgIHRoaXMuc3luY1RvKHBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZztcbiAgICB9XG4gICAgZ2V0IGxpbmVDaHVua3MoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgcmVhZChmcm9tLCB0bykge1xuICAgICAgICBsZXQgc3RyaW5nU3RhcnQgPSB0aGlzLmN1cnNvclBvcyAtIHRoaXMuc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgaWYgKGZyb20gPCBzdHJpbmdTdGFydCB8fCB0byA+PSB0aGlzLmN1cnNvclBvcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvYy5zbGljZVN0cmluZyhmcm9tLCB0byk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tIC0gc3RyaW5nU3RhcnQsIHRvIC0gc3RyaW5nU3RhcnQpO1xuICAgIH1cbn1cbmxldCBjdXJyZW50Q29udGV4dCA9IG51bGw7XG4vKipcbkEgcGFyc2UgY29udGV4dCBwcm92aWRlZCB0byBwYXJzZXJzIHdvcmtpbmcgb24gdGhlIGVkaXRvciBjb250ZW50LlxuKi9cbmNsYXNzIFBhcnNlQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBzdGF0ZSwgXG4gICAgLyoqXG4gICAgVHJlZSBmcmFnbWVudHMgdGhhdCBjYW4gYmUgcmV1c2VkIGJ5IGluY3JlbWVudGFsIHJlLXBhcnNlcy5cbiAgICAqL1xuICAgIGZyYWdtZW50cyA9IFtdLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRyZWUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdHJlZUxlbiwgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZWRpdG9yIHZpZXdwb3J0IChvciBzb21lIG92ZXJhcHByb3hpbWF0aW9uXG4gICAgdGhlcmVvZikuIEludGVuZGVkIHRvIGJlIHVzZWQgZm9yIG9wcG9ydHVuaXN0aWNhbGx5IGF2b2lkaW5nXG4gICAgd29yayAoaW4gd2hpY2ggY2FzZVxuICAgIFtgc2tpcFVudGlsSW5WaWV3YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5QYXJzZUNvbnRleHQuc2tpcFVudGlsSW5WaWV3KVxuICAgIHNob3VsZCBiZSBjYWxsZWQgdG8gbWFrZSBzdXJlIHRoZSBwYXJzZXIgaXMgcmVzdGFydGVkIHdoZW4gdGhlXG4gICAgc2tpcHBlZCByZWdpb24gYmVjb21lcyB2aXNpYmxlKS5cbiAgICAqL1xuICAgIHZpZXdwb3J0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNraXBwZWQsIFxuICAgIC8qKlxuICAgIFRoaXMgaXMgd2hlcmUgc2tpcHBpbmcgcGFyc2VycyBjYW4gcmVnaXN0ZXIgYSBwcm9taXNlIHRoYXQsXG4gICAgd2hlbiByZXNvbHZlZCwgd2lsbCBzY2hlZHVsZSBhIG5ldyBwYXJzZS4gSXQgaXMgY2xlYXJlZCB3aGVuXG4gICAgdGhlIHBhcnNlIHdvcmtlciBwaWNrcyB1cCB0aGUgcHJvbWlzZS4gQGludGVybmFsXG4gICAgKi9cbiAgICBzY2hlZHVsZU9uKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLnRyZWVMZW4gPSB0cmVlTGVuO1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgICAgIHRoaXMuc2tpcHBlZCA9IHNraXBwZWQ7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVPbiA9IHNjaGVkdWxlT247XG4gICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudGVtcFNraXBwZWQgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHBhcnNlciwgc3RhdGUsIHZpZXdwb3J0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VDb250ZXh0KHBhcnNlciwgc3RhdGUsIFtdLCBUcmVlLmVtcHR5LCAwLCB2aWV3cG9ydCwgW10sIG51bGwpO1xuICAgIH1cbiAgICBzdGFydFBhcnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZXIuc3RhcnRQYXJzZShuZXcgRG9jSW5wdXQodGhpcy5zdGF0ZS5kb2MpLCB0aGlzLmZyYWdtZW50cyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgd29yayh1bnRpbCwgdXB0bykge1xuICAgICAgICBpZiAodXB0byAhPSBudWxsICYmIHVwdG8gPj0gdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKVxuICAgICAgICAgICAgdXB0byA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMudHJlZSAhPSBUcmVlLmVtcHR5ICYmIHRoaXMuaXNEb25lKHVwdG8gIT09IG51bGwgJiYgdXB0byAhPT0gdm9pZCAwID8gdXB0byA6IHRoaXMuc3RhdGUuZG9jLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRoaXMudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhDb250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW50aWwgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIGxldCBlbmRUaW1lID0gRGF0ZS5ub3coKSArIHVudGlsO1xuICAgICAgICAgICAgICAgIHVudGlsID0gKCkgPT4gRGF0ZS5ub3coKSA+IGVuZFRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyc2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMuc3RhcnRQYXJzZSgpO1xuICAgICAgICAgICAgaWYgKHVwdG8gIT0gbnVsbCAmJiAodGhpcy5wYXJzZS5zdG9wcGVkQXQgPT0gbnVsbCB8fCB0aGlzLnBhcnNlLnN0b3BwZWRBdCA+IHVwdG8pICYmXG4gICAgICAgICAgICAgICAgdXB0byA8IHRoaXMuc3RhdGUuZG9jLmxlbmd0aClcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlLnN0b3BBdCh1cHRvKTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IHRoaXMucGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzID0gdGhpcy53aXRob3V0VGVtcFNraXBwZWQoVHJlZUZyYWdtZW50LmFkZFRyZWUoZG9uZSwgdGhpcy5mcmFnbWVudHMsIHRoaXMucGFyc2Uuc3RvcHBlZEF0ICE9IG51bGwpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlTGVuID0gKF9hID0gdGhpcy5wYXJzZS5zdG9wcGVkQXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuc3RhdGUuZG9jLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlID0gZG9uZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyZWVMZW4gPCAodXB0byAhPT0gbnVsbCAmJiB1cHRvICE9PSB2b2lkIDAgPyB1cHRvIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnN0YXJ0UGFyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1bnRpbCgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRha2VUcmVlKCkge1xuICAgICAgICBsZXQgcG9zLCB0cmVlO1xuICAgICAgICBpZiAodGhpcy5wYXJzZSAmJiAocG9zID0gdGhpcy5wYXJzZS5wYXJzZWRQb3MpID49IHRoaXMudHJlZUxlbikge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyc2Uuc3RvcHBlZEF0ID09IG51bGwgfHwgdGhpcy5wYXJzZS5zdG9wcGVkQXQgPiBwb3MpXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZS5zdG9wQXQocG9zKTtcbiAgICAgICAgICAgIHRoaXMud2l0aENvbnRleHQoKCkgPT4geyB3aGlsZSAoISh0cmVlID0gdGhpcy5wYXJzZS5hZHZhbmNlKCkpKSB7IH0gfSk7XG4gICAgICAgICAgICB0aGlzLnRyZWVMZW4gPSBwb3M7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMgPSB0aGlzLndpdGhvdXRUZW1wU2tpcHBlZChUcmVlRnJhZ21lbnQuYWRkVHJlZSh0aGlzLnRyZWUsIHRoaXMuZnJhZ21lbnRzLCB0cnVlKSk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aXRoQ29udGV4dChmKSB7XG4gICAgICAgIGxldCBwcmV2ID0gY3VycmVudENvbnRleHQ7XG4gICAgICAgIGN1cnJlbnRDb250ZXh0ID0gdGhpcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9IHByZXY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2l0aG91dFRlbXBTa2lwcGVkKGZyYWdtZW50cykge1xuICAgICAgICBmb3IgKGxldCByOyByID0gdGhpcy50ZW1wU2tpcHBlZC5wb3AoKTspXG4gICAgICAgICAgICBmcmFnbWVudHMgPSBjdXRGcmFnbWVudHMoZnJhZ21lbnRzLCByLmZyb20sIHIudG8pO1xuICAgICAgICByZXR1cm4gZnJhZ21lbnRzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoYW5nZXMoY2hhbmdlcywgbmV3U3RhdGUpIHtcbiAgICAgICAgbGV0IHsgZnJhZ21lbnRzLCB0cmVlLCB0cmVlTGVuLCB2aWV3cG9ydCwgc2tpcHBlZCB9ID0gdGhpcztcbiAgICAgICAgdGhpcy50YWtlVHJlZSgpO1xuICAgICAgICBpZiAoIWNoYW5nZXMuZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIGNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpID0+IHJhbmdlcy5wdXNoKHsgZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiB9KSk7XG4gICAgICAgICAgICBmcmFnbWVudHMgPSBUcmVlRnJhZ21lbnQuYXBwbHlDaGFuZ2VzKGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgICAgIHRyZWUgPSBUcmVlLmVtcHR5O1xuICAgICAgICAgICAgdHJlZUxlbiA9IDA7XG4gICAgICAgICAgICB2aWV3cG9ydCA9IHsgZnJvbTogY2hhbmdlcy5tYXBQb3Modmlld3BvcnQuZnJvbSwgLTEpLCB0bzogY2hhbmdlcy5tYXBQb3Modmlld3BvcnQudG8sIDEpIH07XG4gICAgICAgICAgICBpZiAodGhpcy5za2lwcGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNraXBwZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIHRoaXMuc2tpcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IGNoYW5nZXMubWFwUG9zKHIuZnJvbSwgMSksIHRvID0gY2hhbmdlcy5tYXBQb3Moci50bywgLTEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZC5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VDb250ZXh0KHRoaXMucGFyc2VyLCBuZXdTdGF0ZSwgZnJhZ21lbnRzLCB0cmVlLCB0cmVlTGVuLCB2aWV3cG9ydCwgc2tpcHBlZCwgdGhpcy5zY2hlZHVsZU9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB1cGRhdGVWaWV3cG9ydCh2aWV3cG9ydCkge1xuICAgICAgICBpZiAodGhpcy52aWV3cG9ydC5mcm9tID09IHZpZXdwb3J0LmZyb20gJiYgdGhpcy52aWV3cG9ydC50byA9PSB2aWV3cG9ydC50bylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICBsZXQgc3RhcnRMZW4gPSB0aGlzLnNraXBwZWQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2tpcHBlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMuc2tpcHBlZFtpXTtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgdmlld3BvcnQudG8gJiYgdG8gPiB2aWV3cG9ydC5mcm9tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBjdXRGcmFnbWVudHModGhpcy5mcmFnbWVudHMsIGZyb20sIHRvKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBwZWQuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2tpcHBlZC5sZW5ndGggPj0gc3RhcnRMZW4pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLnRha2VUcmVlKCk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBOb3RpZnkgdGhlIHBhcnNlIHNjaGVkdWxlciB0aGF0IHRoZSBnaXZlbiByZWdpb24gd2FzIHNraXBwZWRcbiAgICBiZWNhdXNlIGl0IHdhc24ndCBpbiB2aWV3LCBhbmQgdGhlIHBhcnNlIHNob3VsZCBiZSByZXN0YXJ0ZWRcbiAgICB3aGVuIGl0IGNvbWVzIGludG8gdmlldy5cbiAgICAqL1xuICAgIHNraXBVbnRpbEluVmlldyhmcm9tLCB0bykge1xuICAgICAgICB0aGlzLnNraXBwZWQucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgcGFyc2VyIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgcGxhY2Vob2xkZXIgd2hlblxuICAgIGFzeW5jaHJvbm91c2x5IGxvYWRpbmcgYSBuZXN0ZWQgcGFyc2VyLiBJdCdsbCBza2lwIGl0cyBpbnB1dCBhbmRcbiAgICBtYXJrIGl0IGFzIG5vdC1yZWFsbHktcGFyc2VkLCBzbyB0aGF0IHRoZSBuZXh0IHVwZGF0ZSB3aWxsIHBhcnNlXG4gICAgaXQgYWdhaW4uXG4gICAgXG4gICAgV2hlbiBgdW50aWxgIGlzIGdpdmVuLCBhIHJlcGFyc2Ugd2lsbCBiZSBzY2hlZHVsZWQgd2hlbiB0aGF0XG4gICAgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBnZXRTa2lwcGluZ1BhcnNlcih1bnRpbCkge1xuICAgICAgICByZXR1cm4gbmV3IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHtcbiAgICAgICAgICAgIGNyZWF0ZVBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gcmFuZ2VzWzBdLmZyb20sIHRvID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS50bztcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VyID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWRQb3M6IGZyb20sXG4gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3ggPSBjdXJyZW50Q29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgcmFuZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC50ZW1wU2tpcHBlZC5wdXNoKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bnRpbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3guc2NoZWR1bGVPbiA9IGN4LnNjaGVkdWxlT24gPyBQcm9taXNlLmFsbChbY3guc2NoZWR1bGVPbiwgdW50aWxdKSA6IHVudGlsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSB0bztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZShOb2RlVHlwZS5ub25lLCBbXSwgW10sIHRvIC0gZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHN0b3BwZWRBdDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcEF0KCkgeyB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGlzRG9uZSh1cHRvKSB7XG4gICAgICAgIHVwdG8gPSBNYXRoLm1pbih1cHRvLCB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICBsZXQgZnJhZ3MgPSB0aGlzLmZyYWdtZW50cztcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZUxlbiA+PSB1cHRvICYmIGZyYWdzLmxlbmd0aCAmJiBmcmFnc1swXS5mcm9tID09IDAgJiYgZnJhZ3NbMF0udG8gPj0gdXB0bztcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb250ZXh0IGZvciB0aGUgY3VycmVudCBwYXJzZSwgb3IgYG51bGxgIGlmIG5vIGVkaXRvclxuICAgIHBhcnNlIGlzIGluIHByb2dyZXNzLlxuICAgICovXG4gICAgc3RhdGljIGdldCgpIHsgcmV0dXJuIGN1cnJlbnRDb250ZXh0OyB9XG59XG5mdW5jdGlvbiBjdXRGcmFnbWVudHMoZnJhZ21lbnRzLCBmcm9tLCB0bykge1xuICAgIHJldHVybiBUcmVlRnJhZ21lbnQuYXBwbHlDaGFuZ2VzKGZyYWdtZW50cywgW3sgZnJvbUE6IGZyb20sIHRvQTogdG8sIGZyb21COiBmcm9tLCB0b0I6IHRvIH1dKTtcbn1cbmNsYXNzIExhbmd1YWdlU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIEEgbXV0YWJsZSBwYXJzZSBzdGF0ZSB0aGF0IGlzIHVzZWQgdG8gcHJlc2VydmUgd29yayBkb25lIGR1cmluZ1xuICAgIC8vIHRoZSBsaWZldGltZSBvZiBhIHN0YXRlIHdoZW4gbW92aW5nIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy50cmVlID0gY29udGV4dC50cmVlO1xuICAgIH1cbiAgICBhcHBseSh0cikge1xuICAgICAgICBpZiAoIXRyLmRvY0NoYW5nZWQgJiYgdGhpcy50cmVlID09IHRoaXMuY29udGV4dC50cmVlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCBuZXdDeCA9IHRoaXMuY29udGV4dC5jaGFuZ2VzKHRyLmNoYW5nZXMsIHRyLnN0YXRlKTtcbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIHBhcnNlIHdhc24ndCBkb25lLCBnbyBmb3J3YXJkIG9ubHkgdXAgdG8gaXRzXG4gICAgICAgIC8vIGVuZCBwb3NpdGlvbiBvciB0aGUgZW5kIG9mIHRoZSB2aWV3cG9ydCwgdG8gYXZvaWQgc2xvd2luZyBkb3duXG4gICAgICAgIC8vIHN0YXRlIHVwZGF0ZXMgd2l0aCBwYXJzZSB3b3JrIGJleW9uZCB0aGUgdmlld3BvcnQuXG4gICAgICAgIGxldCB1cHRvID0gdGhpcy5jb250ZXh0LnRyZWVMZW4gPT0gdHIuc3RhcnRTdGF0ZS5kb2MubGVuZ3RoID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IE1hdGgubWF4KHRyLmNoYW5nZXMubWFwUG9zKHRoaXMuY29udGV4dC50cmVlTGVuKSwgbmV3Q3gudmlld3BvcnQudG8pO1xuICAgICAgICBpZiAoIW5ld0N4LndvcmsoMjAgLyogV29yay5BcHBseSAqLywgdXB0bykpXG4gICAgICAgICAgICBuZXdDeC50YWtlVHJlZSgpO1xuICAgICAgICByZXR1cm4gbmV3IExhbmd1YWdlU3RhdGUobmV3Q3gpO1xuICAgIH1cbiAgICBzdGF0aWMgaW5pdChzdGF0ZSkge1xuICAgICAgICBsZXQgdnBUbyA9IE1hdGgubWluKDMwMDAgLyogV29yay5Jbml0Vmlld3BvcnQgKi8sIHN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICBsZXQgcGFyc2VTdGF0ZSA9IFBhcnNlQ29udGV4dC5jcmVhdGUoc3RhdGUuZmFjZXQobGFuZ3VhZ2UpLnBhcnNlciwgc3RhdGUsIHsgZnJvbTogMCwgdG86IHZwVG8gfSk7XG4gICAgICAgIGlmICghcGFyc2VTdGF0ZS53b3JrKDIwIC8qIFdvcmsuQXBwbHkgKi8sIHZwVG8pKVxuICAgICAgICAgICAgcGFyc2VTdGF0ZS50YWtlVHJlZSgpO1xuICAgICAgICByZXR1cm4gbmV3IExhbmd1YWdlU3RhdGUocGFyc2VTdGF0ZSk7XG4gICAgfVxufVxuTGFuZ3VhZ2Uuc3RhdGUgPSAvKkBfX1BVUkVfXyovU3RhdGVGaWVsZC5kZWZpbmUoe1xuICAgIGNyZWF0ZTogTGFuZ3VhZ2VTdGF0ZS5pbml0LFxuICAgIHVwZGF0ZSh2YWx1ZSwgdHIpIHtcbiAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgaWYgKGUuaXMoTGFuZ3VhZ2Uuc2V0U3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlO1xuICAgICAgICBpZiAodHIuc3RhcnRTdGF0ZS5mYWNldChsYW5ndWFnZSkgIT0gdHIuc3RhdGUuZmFjZXQobGFuZ3VhZ2UpKVxuICAgICAgICAgICAgcmV0dXJuIExhbmd1YWdlU3RhdGUuaW5pdCh0ci5zdGF0ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZS5hcHBseSh0cik7XG4gICAgfVxufSk7XG5sZXQgcmVxdWVzdElkbGUgPSAoY2FsbGJhY2spID0+IHtcbiAgICBsZXQgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2soKSwgNTAwIC8qIFdvcmsuTWF4UGF1c2UgKi8pO1xuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCk7XG59O1xuaWYgKHR5cGVvZiByZXF1ZXN0SWRsZUNhbGxiYWNrICE9IFwidW5kZWZpbmVkXCIpXG4gICAgcmVxdWVzdElkbGUgPSAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgbGV0IGlkbGUgPSAtMSwgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWRsZSA9IHJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dDogNTAwIC8qIFdvcmsuTWF4UGF1c2UgKi8gLSAxMDAgLyogV29yay5NaW5QYXVzZSAqLyB9KTtcbiAgICAgICAgfSwgMTAwIC8qIFdvcmsuTWluUGF1c2UgKi8pO1xuICAgICAgICByZXR1cm4gKCkgPT4gaWRsZSA8IDAgPyBjbGVhclRpbWVvdXQodGltZW91dCkgOiBjYW5jZWxJZGxlQ2FsbGJhY2soaWRsZSk7XG4gICAgfTtcbmNvbnN0IGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmICgoX2EgPSBuYXZpZ2F0b3Iuc2NoZWR1bGluZykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzSW5wdXRQZW5kaW5nKVxuICAgID8gKCkgPT4gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcoKSA6IG51bGw7XG5jb25zdCBwYXJzZVdvcmtlciA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyBQYXJzZVdvcmtlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLndvcmtpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLndvcmtTY2hlZHVsZWQgPSAwO1xuICAgICAgICAvLyBFbmQgb2YgdGhlIGN1cnJlbnQgdGltZSBjaHVua1xuICAgICAgICB0aGlzLmNodW5rRW5kID0gLTE7XG4gICAgICAgIC8vIE1pbGxpc2Vjb25kcyBvZiBidWRnZXQgbGVmdCBmb3IgdGhpcyBjaHVua1xuICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ID0gLTE7XG4gICAgICAgIHRoaXMud29yayA9IHRoaXMud29yay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBjeCA9IHRoaXMudmlldy5zdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSkuY29udGV4dDtcbiAgICAgICAgaWYgKGN4LnVwZGF0ZVZpZXdwb3J0KHVwZGF0ZS52aWV3LnZpZXdwb3J0KSB8fCB0aGlzLnZpZXcudmlld3BvcnQudG8gPiBjeC50cmVlTGVuKVxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmsoKTtcbiAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuaGFzRm9jdXMpXG4gICAgICAgICAgICAgICAgdGhpcy5jaHVua0J1ZGdldCArPSA1MCAvKiBXb3JrLkNoYW5nZUJvbnVzICovO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmsoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrQXN5bmNTY2hlZHVsZShjeCk7XG4gICAgfVxuICAgIHNjaGVkdWxlV29yaygpIHtcbiAgICAgICAgaWYgKHRoaXMud29ya2luZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHRoaXMudmlldywgZmllbGQgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSk7XG4gICAgICAgIGlmIChmaWVsZC50cmVlICE9IGZpZWxkLmNvbnRleHQudHJlZSB8fCAhZmllbGQuY29udGV4dC5pc0RvbmUoc3RhdGUuZG9jLmxlbmd0aCkpXG4gICAgICAgICAgICB0aGlzLndvcmtpbmcgPSByZXF1ZXN0SWRsZSh0aGlzLndvcmspO1xuICAgIH1cbiAgICB3b3JrKGRlYWRsaW5lKSB7XG4gICAgICAgIHRoaXMud29ya2luZyA9IG51bGw7XG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodGhpcy5jaHVua0VuZCA8IG5vdyAmJiAodGhpcy5jaHVua0VuZCA8IDAgfHwgdGhpcy52aWV3Lmhhc0ZvY3VzKSkgeyAvLyBTdGFydCBhIG5ldyBjaHVua1xuICAgICAgICAgICAgdGhpcy5jaHVua0VuZCA9IG5vdyArIDMwMDAwIC8qIFdvcmsuQ2h1bmtUaW1lICovO1xuICAgICAgICAgICAgdGhpcy5jaHVua0J1ZGdldCA9IDMwMDAgLyogV29yay5DaHVua0J1ZGdldCAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaHVua0J1ZGdldCA8PSAwKVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBObyBtb3JlIGJ1ZGdldFxuICAgICAgICBsZXQgeyBzdGF0ZSwgdmlld3BvcnQ6IHsgdG86IHZwVG8gfSB9ID0gdGhpcy52aWV3LCBmaWVsZCA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKTtcbiAgICAgICAgaWYgKGZpZWxkLnRyZWUgPT0gZmllbGQuY29udGV4dC50cmVlICYmIGZpZWxkLmNvbnRleHQuaXNEb25lKHZwVG8gKyAxMDAwMDAgLyogV29yay5NYXhQYXJzZUFoZWFkICovKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBEYXRlLm5vdygpICsgTWF0aC5taW4odGhpcy5jaHVua0J1ZGdldCwgMTAwIC8qIFdvcmsuU2xpY2UgKi8sIGRlYWRsaW5lICYmICFpc0lucHV0UGVuZGluZyA/IE1hdGgubWF4KDI1IC8qIFdvcmsuTWluU2xpY2UgKi8sIGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKSAtIDUpIDogMWU5KTtcbiAgICAgICAgbGV0IHZpZXdwb3J0Rmlyc3QgPSBmaWVsZC5jb250ZXh0LnRyZWVMZW4gPCB2cFRvICYmIHN0YXRlLmRvYy5sZW5ndGggPiB2cFRvICsgMTAwMDtcbiAgICAgICAgbGV0IGRvbmUgPSBmaWVsZC5jb250ZXh0LndvcmsoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlzSW5wdXRQZW5kaW5nICYmIGlzSW5wdXRQZW5kaW5nKCkgfHwgRGF0ZS5ub3coKSA+IGVuZFRpbWU7XG4gICAgICAgIH0sIHZwVG8gKyAodmlld3BvcnRGaXJzdCA/IDAgOiAxMDAwMDAgLyogV29yay5NYXhQYXJzZUFoZWFkICovKSk7XG4gICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgLT0gRGF0ZS5ub3coKSAtIG5vdztcbiAgICAgICAgaWYgKGRvbmUgfHwgdGhpcy5jaHVua0J1ZGdldCA8PSAwKSB7XG4gICAgICAgICAgICBmaWVsZC5jb250ZXh0LnRha2VUcmVlKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBMYW5ndWFnZS5zZXRTdGF0ZS5vZihuZXcgTGFuZ3VhZ2VTdGF0ZShmaWVsZC5jb250ZXh0KSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2h1bmtCdWRnZXQgPiAwICYmICEoZG9uZSAmJiAhdmlld3BvcnRGaXJzdCkpXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICB0aGlzLmNoZWNrQXN5bmNTY2hlZHVsZShmaWVsZC5jb250ZXh0KTtcbiAgICB9XG4gICAgY2hlY2tBc3luY1NjaGVkdWxlKGN4KSB7XG4gICAgICAgIGlmIChjeC5zY2hlZHVsZU9uKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtTY2hlZHVsZWQrKztcbiAgICAgICAgICAgIGN4LnNjaGVkdWxlT25cbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnNjaGVkdWxlV29yaygpKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gbG9nRXhjZXB0aW9uKHRoaXMudmlldy5zdGF0ZSwgZXJyKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLndvcmtTY2hlZHVsZWQtLSk7XG4gICAgICAgICAgICBjeC5zY2hlZHVsZU9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy53b3JraW5nKVxuICAgICAgICAgICAgdGhpcy53b3JraW5nKCk7XG4gICAgfVxuICAgIGlzV29ya2luZygpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMud29ya2luZyB8fCB0aGlzLndvcmtTY2hlZHVsZWQgPiAwKTtcbiAgICB9XG59LCB7XG4gICAgZXZlbnRIYW5kbGVyczogeyBmb2N1cygpIHsgdGhpcy5zY2hlZHVsZVdvcmsoKTsgfSB9XG59KTtcbi8qKlxuVGhlIGZhY2V0IHVzZWQgdG8gYXNzb2NpYXRlIGEgbGFuZ3VhZ2Ugd2l0aCBhbiBlZGl0b3Igc3RhdGUuIFVzZWRcbmJ5IGBMYW5ndWFnZWAgb2JqZWN0J3MgYGV4dGVuc2lvbmAgcHJvcGVydHkgKHNvIHlvdSBkb24ndCBuZWVkIHRvXG5tYW51YWxseSB3cmFwIHlvdXIgbGFuZ3VhZ2VzIGluIHRoaXMpLiBDYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlXG5jdXJyZW50IGxhbmd1YWdlIG9uIGEgc3RhdGUuXG4qL1xuY29uc3QgbGFuZ3VhZ2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGxhbmd1YWdlcykgeyByZXR1cm4gbGFuZ3VhZ2VzLmxlbmd0aCA/IGxhbmd1YWdlc1swXSA6IG51bGw7IH0sXG4gICAgZW5hYmxlczogbGFuZ3VhZ2UgPT4gW1xuICAgICAgICBMYW5ndWFnZS5zdGF0ZSxcbiAgICAgICAgcGFyc2VXb3JrZXIsXG4gICAgICAgIEVkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMuY29tcHV0ZShbbGFuZ3VhZ2VdLCBzdGF0ZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGFuZyA9IHN0YXRlLmZhY2V0KGxhbmd1YWdlKTtcbiAgICAgICAgICAgIHJldHVybiBsYW5nICYmIGxhbmcubmFtZSA/IHsgXCJkYXRhLWxhbmd1YWdlXCI6IGxhbmcubmFtZSB9IDoge307XG4gICAgICAgIH0pXG4gICAgXVxufSk7XG4vKipcblRoaXMgY2xhc3MgYnVuZGxlcyBhIFtsYW5ndWFnZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkgd2l0aCBhblxub3B0aW9uYWwgc2V0IG9mIHN1cHBvcnRpbmcgZXh0ZW5zaW9ucy4gTGFuZ3VhZ2UgcGFja2FnZXMgYXJlXG5lbmNvdXJhZ2VkIHRvIGV4cG9ydCBhIGZ1bmN0aW9uIHRoYXQgb3B0aW9uYWxseSB0YWtlcyBhXG5jb25maWd1cmF0aW9uIG9iamVjdCBhbmQgcmV0dXJucyBhIGBMYW5ndWFnZVN1cHBvcnRgIGluc3RhbmNlLCBhc1xudGhlIG1haW4gd2F5IGZvciBjbGllbnQgY29kZSB0byB1c2UgdGhlIHBhY2thZ2UuXG4qL1xuY2xhc3MgTGFuZ3VhZ2VTdXBwb3J0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBsYW5ndWFnZSBzdXBwb3J0IG9iamVjdC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsYW5ndWFnZSBvYmplY3QuXG4gICAgKi9cbiAgICBsYW5ndWFnZSwgXG4gICAgLyoqXG4gICAgQW4gb3B0aW9uYWwgc2V0IG9mIHN1cHBvcnRpbmcgZXh0ZW5zaW9ucy4gV2hlbiBuZXN0aW5nIGFcbiAgICBsYW5ndWFnZSBpbiBhbm90aGVyIGxhbmd1YWdlLCB0aGUgb3V0ZXIgbGFuZ3VhZ2UgaXMgZW5jb3VyYWdlZFxuICAgIHRvIGluY2x1ZGUgdGhlIHN1cHBvcnRpbmcgZXh0ZW5zaW9ucyBmb3IgaXRzIGlubmVyIGxhbmd1YWdlc1xuICAgIGluIGl0cyBvd24gc2V0IG9mIHN1cHBvcnQgZXh0ZW5zaW9ucy5cbiAgICAqL1xuICAgIHN1cHBvcnQgPSBbXSkge1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgICAgIHRoaXMuc3VwcG9ydCA9IHN1cHBvcnQ7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gW2xhbmd1YWdlLCBzdXBwb3J0XTtcbiAgICB9XG59XG4vKipcbkxhbmd1YWdlIGRlc2NyaXB0aW9ucyBhcmUgdXNlZCB0byBzdG9yZSBtZXRhZGF0YSBhYm91dCBsYW5ndWFnZXNcbmFuZCB0byBkeW5hbWljYWxseSBsb2FkIHRoZW0uIFRoZWlyIG1haW4gcm9sZSBpcyBmaW5kaW5nIHRoZVxuYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgZm9yIGEgZmlsZW5hbWUgb3IgZHluYW1pY2FsbHkgbG9hZGluZyBuZXN0ZWRcbnBhcnNlcnMuXG4qL1xuY2xhc3MgTGFuZ3VhZ2VEZXNjcmlwdGlvbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgb2YgdGhpcyBsYW5ndWFnZS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEFsdGVybmF0aXZlIG5hbWVzIGZvciB0aGUgbW9kZSAobG93ZXJjYXNlZCwgaW5jbHVkZXMgYHRoaXMubmFtZWApLlxuICAgICovXG4gICAgYWxpYXMsIFxuICAgIC8qKlxuICAgIEZpbGUgZXh0ZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYW5ndWFnZS5cbiAgICAqL1xuICAgIGV4dGVuc2lvbnMsIFxuICAgIC8qKlxuICAgIE9wdGlvbmFsIGZpbGVuYW1lIHBhdHRlcm4gdGhhdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXNcbiAgICBsYW5ndWFnZS5cbiAgICAqL1xuICAgIGZpbGVuYW1lLCBsb2FkRnVuYywgXG4gICAgLyoqXG4gICAgSWYgdGhlIGxhbmd1YWdlIGhhcyBiZWVuIGxvYWRlZCwgdGhpcyB3aWxsIGhvbGQgaXRzIHZhbHVlLlxuICAgICovXG4gICAgc3VwcG9ydCA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG4gICAgICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgdGhpcy5sb2FkRnVuYyA9IGxvYWRGdW5jO1xuICAgICAgICB0aGlzLnN1cHBvcnQgPSBzdXBwb3J0O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBTdGFydCBsb2FkaW5nIHRoZSB0aGUgbGFuZ3VhZ2UuIFdpbGwgcmV0dXJuIGEgcHJvbWlzZSB0aGF0XG4gICAgcmVzb2x2ZXMgdG8gYSBbYExhbmd1YWdlU3VwcG9ydGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2VTdXBwb3J0KVxuICAgIG9iamVjdCB3aGVuIHRoZSBsYW5ndWFnZSBzdWNjZXNzZnVsbHkgbG9hZHMuXG4gICAgKi9cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8ICh0aGlzLmxvYWRpbmcgPSB0aGlzLmxvYWRGdW5jKCkudGhlbihzdXBwb3J0ID0+IHRoaXMuc3VwcG9ydCA9IHN1cHBvcnQsIGVyciA9PiB7IHRoaXMubG9hZGluZyA9IG51bGw7IHRocm93IGVycjsgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBsYW5ndWFnZSBkZXNjcmlwdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBvZihzcGVjKSB7XG4gICAgICAgIGxldCB7IGxvYWQsIHN1cHBvcnQgfSA9IHNwZWM7XG4gICAgICAgIGlmICghbG9hZCkge1xuICAgICAgICAgICAgaWYgKCFzdXBwb3J0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVzdCBwYXNzIGVpdGhlciAnbG9hZCcgb3IgJ3N1cHBvcnQnIHRvIExhbmd1YWdlRGVzY3JpcHRpb24ub2ZcIik7XG4gICAgICAgICAgICBsb2FkID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHN1cHBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VEZXNjcmlwdGlvbihzcGVjLm5hbWUsIChzcGVjLmFsaWFzIHx8IFtdKS5jb25jYXQoc3BlYy5uYW1lKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpLCBzcGVjLmV4dGVuc2lvbnMgfHwgW10sIHNwZWMuZmlsZW5hbWUsIGxvYWQsIHN1cHBvcnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBMb29rIGZvciBhIGxhbmd1YWdlIGluIHRoZSBnaXZlbiBhcnJheSBvZiBkZXNjcmlwdGlvbnMgdGhhdFxuICAgIG1hdGNoZXMgdGhlIGZpbGVuYW1lLiBXaWxsIGZpcnN0IG1hdGNoXG4gICAgW2BmaWxlbmFtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2VEZXNjcmlwdGlvbi5maWxlbmFtZSkgcGF0dGVybnMsXG4gICAgYW5kIHRoZW4gW2V4dGVuc2lvbnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2VEZXNjcmlwdGlvbi5leHRlbnNpb25zKSxcbiAgICBhbmQgcmV0dXJuIHRoZSBmaXJzdCBsYW5ndWFnZSB0aGF0IG1hdGNoZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgbWF0Y2hGaWxlbmFtZShkZXNjcywgZmlsZW5hbWUpIHtcbiAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgIGlmIChkLmZpbGVuYW1lICYmIGQuZmlsZW5hbWUudGVzdChmaWxlbmFtZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgIGxldCBleHQgPSAvXFwuKFteLl0rKSQvLmV4ZWMoZmlsZW5hbWUpO1xuICAgICAgICBpZiAoZXh0KVxuICAgICAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgICAgICBpZiAoZC5leHRlbnNpb25zLmluZGV4T2YoZXh0WzFdKSA+IC0xKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIExvb2sgZm9yIGEgbGFuZ3VhZ2Ugd2hvc2UgbmFtZSBvciBhbGlhcyBtYXRjaGVzIHRoZSB0aGUgZ2l2ZW5cbiAgICBuYW1lIChjYXNlLWluc2Vuc2l0aXZlbHkpLiBJZiBgZnV6enlgIGlzIHRydWUsIGFuZCBubyBkaXJlY3RcbiAgICBtYXRjaHMgaXMgZm91bmQsIHRoaXMnbGwgYWxzbyBzZWFyY2ggZm9yIGEgbGFuZ3VhZ2Ugd2hvc2UgbmFtZVxuICAgIG9yIGFsaWFzIG9jY3VycyBpbiB0aGUgc3RyaW5nIChmb3IgbmFtZXMgc2hvcnRlciB0aGFuIHRocmVlXG4gICAgY2hhcmFjdGVycywgb25seSB3aGVuIHN1cnJvdW5kZWQgYnkgbm9uLXdvcmQgY2hhcmFjdGVycykuXG4gICAgKi9cbiAgICBzdGF0aWMgbWF0Y2hMYW5ndWFnZU5hbWUoZGVzY3MsIG5hbWUsIGZ1enp5ID0gdHJ1ZSkge1xuICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgaWYgKGQuYWxpYXMuc29tZShhID0+IGEgPT0gbmFtZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgIGlmIChmdXp6eSlcbiAgICAgICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYSBvZiBkLmFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IG5hbWUuaW5kZXhPZihhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEgJiYgKGEubGVuZ3RoID4gMiB8fCAhL1xcdy8udGVzdChuYW1lW2ZvdW5kIC0gMV0pICYmICEvXFx3Ly50ZXN0KG5hbWVbZm91bmQgKyBhLmxlbmd0aF0pKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vKipcbkZhY2V0IHRoYXQgZGVmaW5lcyBhIHdheSB0byBwcm92aWRlIGEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyB0aGVcbmFwcHJvcHJpYXRlIGluZGVudGF0aW9uIGRlcHRoLCBhcyBhIGNvbHVtbiBudW1iZXIgKHNlZVxuW2BpbmRlbnRTdHJpbmdgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFN0cmluZykpLCBhdCB0aGUgc3RhcnQgb2YgYSBnaXZlblxubGluZS4gQSByZXR1cm4gdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyBubyBpbmRlbnRhdGlvbiBjYW4gYmVcbmRldGVybWluZWQsIGFuZCB0aGUgbGluZSBzaG91bGQgaW5oZXJpdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIG9uZVxuYWJvdmUgaXQuIEEgcmV0dXJuIHZhbHVlIG9mIGB1bmRlZmluZWRgIGRlZmVycyB0byB0aGUgbmV4dCBpbmRlbnRcbnNlcnZpY2UuXG4qL1xuY29uc3QgaW5kZW50U2VydmljZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuRmFjZXQgZm9yIG92ZXJyaWRpbmcgdGhlIHVuaXQgYnkgd2hpY2ggaW5kZW50YXRpb24gaGFwcGVucy4gU2hvdWxkXG5iZSBhIHN0cmluZyBjb25zaXN0aW5nIGVpdGhlciBlbnRpcmVseSBvZiB0aGUgc2FtZSB3aGl0ZXNwYWNlXG5jaGFyYWN0ZXIuIFdoZW4gbm90IHNldCwgdGhpcyBkZWZhdWx0cyB0byAyIHNwYWNlcy5cbiovXG5jb25zdCBpbmRlbnRVbml0ID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFwiICBcIjtcbiAgICAgICAgbGV0IHVuaXQgPSB2YWx1ZXNbMF07XG4gICAgICAgIGlmICghdW5pdCB8fCAvXFxTLy50ZXN0KHVuaXQpIHx8IEFycmF5LmZyb20odW5pdCkuc29tZShlID0+IGUgIT0gdW5pdFswXSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGluZGVudCB1bml0OiBcIiArIEpTT04uc3RyaW5naWZ5KHZhbHVlc1swXSkpO1xuICAgICAgICByZXR1cm4gdW5pdDtcbiAgICB9XG59KTtcbi8qKlxuUmV0dXJuIHRoZSBfY29sdW1uIHdpZHRoXyBvZiBhbiBpbmRlbnQgdW5pdCBpbiB0aGUgc3RhdGUuXG5EZXRlcm1pbmVkIGJ5IHRoZSBbYGluZGVudFVuaXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFVuaXQpXG5mYWNldCwgYW5kIFtgdGFiU2l6ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedGFiU2l6ZSkgd2hlbiB0aGF0XG5jb250YWlucyB0YWJzLlxuKi9cbmZ1bmN0aW9uIGdldEluZGVudFVuaXQoc3RhdGUpIHtcbiAgICBsZXQgdW5pdCA9IHN0YXRlLmZhY2V0KGluZGVudFVuaXQpO1xuICAgIHJldHVybiB1bml0LmNoYXJDb2RlQXQoMCkgPT0gOSA/IHN0YXRlLnRhYlNpemUgKiB1bml0Lmxlbmd0aCA6IHVuaXQubGVuZ3RoO1xufVxuLyoqXG5DcmVhdGUgYW4gaW5kZW50YXRpb24gc3RyaW5nIHRoYXQgY292ZXJzIGNvbHVtbnMgMCB0byBgY29sc2AuXG5XaWxsIHVzZSB0YWJzIGZvciBhcyBtdWNoIG9mIHRoZSBjb2x1bW5zIGFzIHBvc3NpYmxlIHdoZW4gdGhlXG5bYGluZGVudFVuaXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFVuaXQpIGZhY2V0IGNvbnRhaW5zXG50YWJzLlxuKi9cbmZ1bmN0aW9uIGluZGVudFN0cmluZyhzdGF0ZSwgY29scykge1xuICAgIGxldCByZXN1bHQgPSBcIlwiLCB0cyA9IHN0YXRlLnRhYlNpemUsIGNoID0gc3RhdGUuZmFjZXQoaW5kZW50VW5pdClbMF07XG4gICAgaWYgKGNoID09IFwiXFx0XCIpIHtcbiAgICAgICAgd2hpbGUgKGNvbHMgPj0gdHMpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcdFwiO1xuICAgICAgICAgICAgY29scyAtPSB0cztcbiAgICAgICAgfVxuICAgICAgICBjaCA9IFwiIFwiO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHM7IGkrKylcbiAgICAgICAgcmVzdWx0ICs9IGNoO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbkdldCB0aGUgaW5kZW50YXRpb24sIGFzIGEgY29sdW1uIG51bWJlciwgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuV2lsbCBmaXJzdCBjb25zdWx0IGFueSBbaW5kZW50IHNlcnZpY2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFNlcnZpY2UpXG50aGF0IGFyZSByZWdpc3RlcmVkLCBhbmQgaWYgbm9uZSBvZiB0aG9zZSByZXR1cm4gYW4gaW5kZW50YXRpb24sXG50aGlzIHdpbGwgY2hlY2sgdGhlIHN5bnRheCB0cmVlIGZvciB0aGUgW2luZGVudCBub2RlXG5wcm9wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudE5vZGVQcm9wKSBhbmQgdXNlIHRoYXQgaWYgZm91bmQuIFJldHVybnMgYVxubnVtYmVyIHdoZW4gYW4gaW5kZW50YXRpb24gY291bGQgYmUgZGV0ZXJtaW5lZCwgYW5kIG51bGxcbm90aGVyd2lzZS5cbiovXG5mdW5jdGlvbiBnZXRJbmRlbnRhdGlvbihjb250ZXh0LCBwb3MpIHtcbiAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVkaXRvclN0YXRlKVxuICAgICAgICBjb250ZXh0ID0gbmV3IEluZGVudENvbnRleHQoY29udGV4dCk7XG4gICAgZm9yIChsZXQgc2VydmljZSBvZiBjb250ZXh0LnN0YXRlLmZhY2V0KGluZGVudFNlcnZpY2UpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlKGNvbnRleHQsIHBvcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShjb250ZXh0LnN0YXRlKTtcbiAgICByZXR1cm4gdHJlZS5sZW5ndGggPj0gcG9zID8gc3ludGF4SW5kZW50YXRpb24oY29udGV4dCwgdHJlZSwgcG9zKSA6IG51bGw7XG59XG4vKipcbkNyZWF0ZSBhIGNoYW5nZSBzZXQgdGhhdCBhdXRvLWluZGVudHMgYWxsIGxpbmVzIHRvdWNoZWQgYnkgdGhlXG5naXZlbiBkb2N1bWVudCByYW5nZS5cbiovXG5mdW5jdGlvbiBpbmRlbnRSYW5nZShzdGF0ZSwgZnJvbSwgdG8pIHtcbiAgICBsZXQgdXBkYXRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGNvbnRleHQgPSBuZXcgSW5kZW50Q29udGV4dChzdGF0ZSwgeyBvdmVycmlkZUluZGVudGF0aW9uOiBzdGFydCA9PiB7IHZhciBfYTsgcmV0dXJuIChfYSA9IHVwZGF0ZWRbc3RhcnRdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAtMTsgfSB9KTtcbiAgICBsZXQgY2hhbmdlcyA9IFtdO1xuICAgIGZvciAobGV0IHBvcyA9IGZyb207IHBvcyA8PSB0bzspIHtcbiAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgIHBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICBsZXQgaW5kZW50ID0gZ2V0SW5kZW50YXRpb24oY29udGV4dCwgbGluZS5mcm9tKTtcbiAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmICghL1xcUy8udGVzdChsaW5lLnRleHQpKVxuICAgICAgICAgICAgaW5kZW50ID0gMDtcbiAgICAgICAgbGV0IGN1ciA9IC9eXFxzKi8uZXhlYyhsaW5lLnRleHQpWzBdO1xuICAgICAgICBsZXQgbm9ybSA9IGluZGVudFN0cmluZyhzdGF0ZSwgaW5kZW50KTtcbiAgICAgICAgaWYgKGN1ciAhPSBub3JtKSB7XG4gICAgICAgICAgICB1cGRhdGVkW2xpbmUuZnJvbV0gPSBpbmRlbnQ7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goeyBmcm9tOiBsaW5lLmZyb20sIHRvOiBsaW5lLmZyb20gKyBjdXIubGVuZ3RoLCBpbnNlcnQ6IG5vcm0gfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmNoYW5nZXMoY2hhbmdlcyk7XG59XG4vKipcbkluZGVudGF0aW9uIGNvbnRleHRzIGFyZSB1c2VkIHdoZW4gY2FsbGluZyBbaW5kZW50YXRpb25cbnNlcnZpY2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFNlcnZpY2UpLiBUaGV5IHByb3ZpZGUgaGVscGVyIHV0aWxpdGllc1xudXNlZnVsIGluIGluZGVudGF0aW9uIGxvZ2ljLCBhbmQgY2FuIHNlbGVjdGl2ZWx5IG92ZXJyaWRlIHRoZVxuaW5kZW50YXRpb24gcmVwb3J0ZWQgZm9yIHNvbWUgbGluZXMuXG4qL1xuY2xhc3MgSW5kZW50Q29udGV4dCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluZGVudCBjb250ZXh0LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudW5pdCA9IGdldEluZGVudFVuaXQoc3RhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIHRha2luZ1xuICAgIFtzaW11bGF0ZWQgbGluZVxuICAgIGJyZWFrc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5JbmRlbnRDb250ZXh0LmNvbnN0cnVjdG9yXm9wdGlvbnMuc2ltdWxhdGVCcmVhaylcbiAgICBpbnRvIGFjY291bnQuIElmIHRoZXJlIGlzIHN1Y2ggYSBicmVhayBhdCBgcG9zYCwgdGhlIGBiaWFzYFxuICAgIGFyZ3VtZW50IGRldGVybWluZXMgd2hldGhlciB0aGUgcGFydCBvZiB0aGUgbGluZSBsaW5lIGJlZm9yZSBvclxuICAgIGFmdGVyIHRoZSBicmVhayBpcyB1c2VkLlxuICAgICovXG4gICAgbGluZUF0KHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgbGV0IHsgc2ltdWxhdGVCcmVhaywgc2ltdWxhdGVEb3VibGVCcmVhayB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAoc2ltdWxhdGVCcmVhayAhPSBudWxsICYmIHNpbXVsYXRlQnJlYWsgPj0gbGluZS5mcm9tICYmIHNpbXVsYXRlQnJlYWsgPD0gbGluZS50bykge1xuICAgICAgICAgICAgaWYgKHNpbXVsYXRlRG91YmxlQnJlYWsgJiYgc2ltdWxhdGVCcmVhayA9PSBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dDogXCJcIiwgZnJvbTogcG9zIH07XG4gICAgICAgICAgICBlbHNlIGlmIChiaWFzIDwgMCA/IHNpbXVsYXRlQnJlYWsgPCBwb3MgOiBzaW11bGF0ZUJyZWFrIDw9IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0OiBsaW5lLnRleHQuc2xpY2Uoc2ltdWxhdGVCcmVhayAtIGxpbmUuZnJvbSksIGZyb206IHNpbXVsYXRlQnJlYWsgfTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0OiBsaW5lLnRleHQuc2xpY2UoMCwgc2ltdWxhdGVCcmVhayAtIGxpbmUuZnJvbSksIGZyb206IGxpbmUuZnJvbSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHRleHQgZGlyZWN0bHkgYWZ0ZXIgYHBvc2AsIGVpdGhlciB0aGUgZW50aXJlIGxpbmVcbiAgICBvciB0aGUgbmV4dCAxMDAgY2hhcmFjdGVycywgd2hpY2hldmVyIGlzIHNob3J0ZXIuXG4gICAgKi9cbiAgICB0ZXh0QWZ0ZXJQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbXVsYXRlRG91YmxlQnJlYWsgJiYgcG9zID09IHRoaXMub3B0aW9ucy5zaW11bGF0ZUJyZWFrKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20gfSA9IHRoaXMubGluZUF0KHBvcywgYmlhcyk7XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHBvcyAtIGZyb20sIE1hdGgubWluKHRleHQubGVuZ3RoLCBwb3MgKyAxMDAgLSBmcm9tKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGNvbHVtbiBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgY29sdW1uKHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY291bnRDb2x1bW4odGV4dCwgcG9zIC0gZnJvbSk7XG4gICAgICAgIGxldCBvdmVycmlkZSA9IHRoaXMub3B0aW9ucy5vdmVycmlkZUluZGVudGF0aW9uID8gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb24oZnJvbSkgOiAtMTtcbiAgICAgICAgaWYgKG92ZXJyaWRlID4gLTEpXG4gICAgICAgICAgICByZXN1bHQgKz0gb3ZlcnJpZGUgLSB0aGlzLmNvdW50Q29sdW1uKHRleHQsIHRleHQuc2VhcmNoKC9cXFN8JC8pKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY29sdW1uIHBvc2l0aW9uICh0YWtpbmcgdGFicyBpbnRvIGFjY291bnQpIG9mIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uIGluIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgKi9cbiAgICBjb3VudENvbHVtbihsaW5lLCBwb3MgPSBsaW5lLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gY291bnRDb2x1bW4obGluZSwgdGhpcy5zdGF0ZS50YWJTaXplLCBwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBpbmRlbnRhdGlvbiBjb2x1bW4gb2YgdGhlIGxpbmUgYXQgdGhlIGdpdmVuIHBvaW50LlxuICAgICovXG4gICAgbGluZUluZGVudChwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20gfSA9IHRoaXMubGluZUF0KHBvcywgYmlhcyk7XG4gICAgICAgIGxldCBvdmVycmlkZSA9IHRoaXMub3B0aW9ucy5vdmVycmlkZUluZGVudGF0aW9uO1xuICAgICAgICBpZiAob3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGxldCBvdmVycmlkZW4gPSBvdmVycmlkZShmcm9tKTtcbiAgICAgICAgICAgIGlmIChvdmVycmlkZW4gPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvdW50Q29sdW1uKHRleHQsIHRleHQuc2VhcmNoKC9cXFN8JC8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgW3NpbXVsYXRlZCBsaW5lXG4gICAgYnJlYWtdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuSW5kZW50Q29udGV4dC5jb25zdHJ1Y3Rvcl5vcHRpb25zLnNpbXVsYXRlQnJlYWspXG4gICAgZm9yIHRoaXMgY29udGV4dCwgaWYgYW55LlxuICAgICovXG4gICAgZ2V0IHNpbXVsYXRlZEJyZWFrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNpbXVsYXRlQnJlYWsgfHwgbnVsbDtcbiAgICB9XG59XG4vKipcbkEgc3ludGF4IHRyZWUgbm9kZSBwcm9wIHVzZWQgdG8gYXNzb2NpYXRlIGluZGVudGF0aW9uIHN0cmF0ZWdpZXNcbndpdGggbm9kZSB0eXBlcy4gU3VjaCBhIHN0cmF0ZWd5IGlzIGEgZnVuY3Rpb24gZnJvbSBhbiBpbmRlbnRhdGlvblxuY29udGV4dCB0byBhIGNvbHVtbiBudW1iZXIgKHNlZSBhbHNvXG5bYGluZGVudFN0cmluZ2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U3RyaW5nKSkgb3IgbnVsbCwgd2hlcmUgbnVsbFxuaW5kaWNhdGVzIHRoYXQgbm8gZGVmaW5pdGl2ZSBpbmRlbnRhdGlvbiBjYW4gYmUgZGV0ZXJtaW5lZC5cbiovXG5jb25zdCBpbmRlbnROb2RlUHJvcCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbi8vIENvbXB1dGUgdGhlIGluZGVudGF0aW9uIGZvciBhIGdpdmVuIHBvc2l0aW9uIGZyb20gdGhlIHN5bnRheCB0cmVlLlxuZnVuY3Rpb24gc3ludGF4SW5kZW50YXRpb24oY3gsIGFzdCwgcG9zKSB7XG4gICAgbGV0IHN0YWNrID0gYXN0LnJlc29sdmVTdGFjayhwb3MpO1xuICAgIGxldCBpbm5lciA9IHN0YWNrLm5vZGUuZW50ZXJVbmZpbmlzaGVkTm9kZXNCZWZvcmUocG9zKTtcbiAgICBpZiAoaW5uZXIgIT0gc3RhY2subm9kZSkge1xuICAgICAgICBsZXQgYWRkID0gW107XG4gICAgICAgIGZvciAobGV0IGN1ciA9IGlubmVyOyBjdXIgIT0gc3RhY2subm9kZTsgY3VyID0gY3VyLnBhcmVudClcbiAgICAgICAgICAgIGFkZC5wdXNoKGN1cik7XG4gICAgICAgIGZvciAobGV0IGkgPSBhZGQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBzdGFjayA9IHsgbm9kZTogYWRkW2ldLCBuZXh0OiBzdGFjayB9O1xuICAgIH1cbiAgICByZXR1cm4gaW5kZW50Rm9yKHN0YWNrLCBjeCwgcG9zKTtcbn1cbmZ1bmN0aW9uIGluZGVudEZvcihzdGFjaywgY3gsIHBvcykge1xuICAgIGZvciAobGV0IGN1ciA9IHN0YWNrOyBjdXI7IGN1ciA9IGN1ci5uZXh0KSB7XG4gICAgICAgIGxldCBzdHJhdGVneSA9IGluZGVudFN0cmF0ZWd5KGN1ci5ub2RlKTtcbiAgICAgICAgaWYgKHN0cmF0ZWd5KVxuICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWd5KFRyZWVJbmRlbnRDb250ZXh0LmNyZWF0ZShjeCwgcG9zLCBjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBpZ25vcmVDbG9zZWQoY3gpIHtcbiAgICByZXR1cm4gY3gucG9zID09IGN4Lm9wdGlvbnMuc2ltdWxhdGVCcmVhayAmJiBjeC5vcHRpb25zLnNpbXVsYXRlRG91YmxlQnJlYWs7XG59XG5mdW5jdGlvbiBpbmRlbnRTdHJhdGVneSh0cmVlKSB7XG4gICAgbGV0IHN0cmF0ZWd5ID0gdHJlZS50eXBlLnByb3AoaW5kZW50Tm9kZVByb3ApO1xuICAgIGlmIChzdHJhdGVneSlcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5O1xuICAgIGxldCBmaXJzdCA9IHRyZWUuZmlyc3RDaGlsZCwgY2xvc2U7XG4gICAgaWYgKGZpcnN0ICYmIChjbG9zZSA9IGZpcnN0LnR5cGUucHJvcChOb2RlUHJvcC5jbG9zZWRCeSkpKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdHJlZS5sYXN0Q2hpbGQsIGNsb3NlZCA9IGxhc3QgJiYgY2xvc2UuaW5kZXhPZihsYXN0Lm5hbWUpID4gLTE7XG4gICAgICAgIHJldHVybiBjeCA9PiBkZWxpbWl0ZWRTdHJhdGVneShjeCwgdHJ1ZSwgMSwgdW5kZWZpbmVkLCBjbG9zZWQgJiYgIWlnbm9yZUNsb3NlZChjeCkgPyBsYXN0LmZyb20gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJlZS5wYXJlbnQgPT0gbnVsbCA/IHRvcEluZGVudCA6IG51bGw7XG59XG5mdW5jdGlvbiB0b3BJbmRlbnQoKSB7IHJldHVybiAwOyB9XG4vKipcbk9iamVjdHMgb2YgdGhpcyB0eXBlIHByb3ZpZGUgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgaGVscGVyXG5tZXRob2RzIHRvIGluZGVudGF0aW9uIGZ1bmN0aW9ucyByZWdpc3RlcmVkIG9uIHN5bnRheCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlSW5kZW50Q29udGV4dCBleHRlbmRzIEluZGVudENvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB3aGljaCBpbmRlbnRhdGlvbiBpcyBiZWluZyBjb21wdXRlZC5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGJhc2Uuc3RhdGUsIGJhc2Uub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3ludGF4IHRyZWUgbm9kZSB0byB3aGljaCB0aGUgaW5kZW50YXRpb24gc3RyYXRlZ3lcbiAgICBhcHBsaWVzLlxuICAgICovXG4gICAgZ2V0IG5vZGUoKSB7IHJldHVybiB0aGlzLmNvbnRleHQubm9kZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShiYXNlLCBwb3MsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSW5kZW50Q29udGV4dChiYXNlLCBwb3MsIGNvbnRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHRleHQgZGlyZWN0bHkgYWZ0ZXIgYHRoaXMucG9zYCwgZWl0aGVyIHRoZSBlbnRpcmUgbGluZVxuICAgIG9yIHRoZSBuZXh0IDEwMCBjaGFyYWN0ZXJzLCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAgICAqL1xuICAgIGdldCB0ZXh0QWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRBZnRlclBvcyh0aGlzLnBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gYXQgdGhlIHJlZmVyZW5jZSBsaW5lIGZvciBgdGhpcy5ub2RlYCwgd2hpY2hcbiAgICBpcyB0aGUgbGluZSBvbiB3aGljaCBpdCBzdGFydHMsIHVubGVzcyB0aGVyZSBpcyBhIG5vZGUgdGhhdCBpc1xuICAgIF9ub3RfIGEgcGFyZW50IG9mIHRoaXMgbm9kZSBjb3ZlcmluZyB0aGUgc3RhcnQgb2YgdGhhdCBsaW5lLiBJZlxuICAgIHNvLCB0aGUgbGluZSBhdCB0aGUgc3RhcnQgb2YgdGhhdCBub2RlIGlzIHRyaWVkLCBhZ2FpbiBza2lwcGluZ1xuICAgIG9uIGlmIGl0IGlzIGNvdmVyZWQgYnkgYW5vdGhlciBzdWNoIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgYmFzZUluZGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUluZGVudEZvcih0aGlzLm5vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGluZGVudGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlIGxpbmUgb2YgdGhlIGdpdmVuIG5vZGVcbiAgICAoc2VlIFtgYmFzZUluZGVudGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuVHJlZUluZGVudENvbnRleHQuYmFzZUluZGVudCkpLlxuICAgICovXG4gICAgYmFzZUluZGVudEZvcihub2RlKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KG5vZGUuZnJvbSk7XG4gICAgICAgIC8vIFNraXAgbGluZSBzdGFydHMgdGhhdCBhcmUgY292ZXJlZCBieSBhIHNpYmxpbmcgKG9yIGNvdXNpbiwgZXRjKVxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgYXRCcmVhayA9IG5vZGUucmVzb2x2ZShsaW5lLmZyb20pO1xuICAgICAgICAgICAgd2hpbGUgKGF0QnJlYWsucGFyZW50ICYmIGF0QnJlYWsucGFyZW50LmZyb20gPT0gYXRCcmVhay5mcm9tKVxuICAgICAgICAgICAgICAgIGF0QnJlYWsgPSBhdEJyZWFrLnBhcmVudDtcbiAgICAgICAgICAgIGlmIChpc1BhcmVudChhdEJyZWFrLCBub2RlKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQoYXRCcmVhay5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5kZW50KGxpbmUuZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnRpbnVlIGxvb2tpbmcgZm9yIGluZGVudGF0aW9ucyBpbiB0aGUgbm9kZSdzIHBhcmVudCBub2RlcyxcbiAgICBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhhdC5cbiAgICAqL1xuICAgIGNvbnRpbnVlKCkge1xuICAgICAgICByZXR1cm4gaW5kZW50Rm9yKHRoaXMuY29udGV4dC5uZXh0LCB0aGlzLmJhc2UsIHRoaXMucG9zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1BhcmVudChwYXJlbnQsIG9mKSB7XG4gICAgZm9yIChsZXQgY3VyID0gb2Y7IGN1cjsgY3VyID0gY3VyLnBhcmVudClcbiAgICAgICAgaWYgKHBhcmVudCA9PSBjdXIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBDaGVjayB3aGV0aGVyIGEgZGVsaW1pdGVkIG5vZGUgaXMgYWxpZ25lZCAobWVhbmluZyB0aGVyZSBhcmVcbi8vIG5vbi1za2lwcGVkIG5vZGVzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgZGVsaW1pdGVyKS4gQW5kXG4vLyBpZiBzbywgcmV0dXJuIHRoZSBvcGVuaW5nIHRva2VuLlxuZnVuY3Rpb24gYnJhY2tldGVkQWxpZ25lZChjb250ZXh0KSB7XG4gICAgbGV0IHRyZWUgPSBjb250ZXh0Lm5vZGU7XG4gICAgbGV0IG9wZW5Ub2tlbiA9IHRyZWUuY2hpbGRBZnRlcih0cmVlLmZyb20pLCBsYXN0ID0gdHJlZS5sYXN0Q2hpbGQ7XG4gICAgaWYgKCFvcGVuVG9rZW4pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzaW0gPSBjb250ZXh0Lm9wdGlvbnMuc2ltdWxhdGVCcmVhaztcbiAgICBsZXQgb3BlbkxpbmUgPSBjb250ZXh0LnN0YXRlLmRvYy5saW5lQXQob3BlblRva2VuLmZyb20pO1xuICAgIGxldCBsaW5lRW5kID0gc2ltID09IG51bGwgfHwgc2ltIDw9IG9wZW5MaW5lLmZyb20gPyBvcGVuTGluZS50byA6IE1hdGgubWluKG9wZW5MaW5lLnRvLCBzaW0pO1xuICAgIGZvciAobGV0IHBvcyA9IG9wZW5Ub2tlbi50bzs7KSB7XG4gICAgICAgIGxldCBuZXh0ID0gdHJlZS5jaGlsZEFmdGVyKHBvcyk7XG4gICAgICAgIGlmICghbmV4dCB8fCBuZXh0ID09IGxhc3QpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFuZXh0LnR5cGUuaXNTa2lwcGVkKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQuZnJvbSA8IGxpbmVFbmQgPyBvcGVuVG9rZW4gOiBudWxsO1xuICAgICAgICBwb3MgPSBuZXh0LnRvO1xuICAgIH1cbn1cbi8qKlxuQW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgZm9yIGRlbGltaXRlZCAodXN1YWxseSBicmFja2V0ZWQpIG5vZGVzLlxuV2lsbCwgYnkgZGVmYXVsdCwgaW5kZW50IG9uZSB1bml0IG1vcmUgdGhhbiB0aGUgcGFyZW50J3MgYmFzZVxuaW5kZW50IHVubGVzcyB0aGUgbGluZSBzdGFydHMgd2l0aCBhIGNsb3NpbmcgdG9rZW4uIFdoZW4gYGFsaWduYFxuaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG5vbi1za2lwcGVkIG5vZGVzIG9uIHRoZSBub2RlJ3Mgb3BlbmluZ1xubGluZSwgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUgd2lsbCBiZSBhbGlnbmVkIHdpdGggdGhlIGVuZCBvZiB0aGVcbm9wZW5pbmcgbm9kZSwgbGlrZSB0aGlzOlxuXG4gICAgZm9vKGJhcixcbiAgICAgICAgYmF6KVxuKi9cbmZ1bmN0aW9uIGRlbGltaXRlZEluZGVudCh7IGNsb3NpbmcsIGFsaWduID0gdHJ1ZSwgdW5pdHMgPSAxIH0pIHtcbiAgICByZXR1cm4gKGNvbnRleHQpID0+IGRlbGltaXRlZFN0cmF0ZWd5KGNvbnRleHQsIGFsaWduLCB1bml0cywgY2xvc2luZyk7XG59XG5mdW5jdGlvbiBkZWxpbWl0ZWRTdHJhdGVneShjb250ZXh0LCBhbGlnbiwgdW5pdHMsIGNsb3NpbmcsIGNsb3NlZEF0KSB7XG4gICAgbGV0IGFmdGVyID0gY29udGV4dC50ZXh0QWZ0ZXIsIHNwYWNlID0gYWZ0ZXIubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuICAgIGxldCBjbG9zZWQgPSBjbG9zaW5nICYmIGFmdGVyLnNsaWNlKHNwYWNlLCBzcGFjZSArIGNsb3NpbmcubGVuZ3RoKSA9PSBjbG9zaW5nIHx8IGNsb3NlZEF0ID09IGNvbnRleHQucG9zICsgc3BhY2U7XG4gICAgbGV0IGFsaWduZWQgPSBhbGlnbiA/IGJyYWNrZXRlZEFsaWduZWQoY29udGV4dCkgOiBudWxsO1xuICAgIGlmIChhbGlnbmVkKVxuICAgICAgICByZXR1cm4gY2xvc2VkID8gY29udGV4dC5jb2x1bW4oYWxpZ25lZC5mcm9tKSA6IGNvbnRleHQuY29sdW1uKGFsaWduZWQudG8pO1xuICAgIHJldHVybiBjb250ZXh0LmJhc2VJbmRlbnQgKyAoY2xvc2VkID8gMCA6IGNvbnRleHQudW5pdCAqIHVuaXRzKTtcbn1cbi8qKlxuQW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgdGhhdCBhbGlnbnMgYSBub2RlJ3MgY29udGVudCB0byBpdHMgYmFzZVxuaW5kZW50YXRpb24uXG4qL1xuY29uc3QgZmxhdEluZGVudCA9IChjb250ZXh0KSA9PiBjb250ZXh0LmJhc2VJbmRlbnQ7XG4vKipcbkNyZWF0ZXMgYW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgdGhhdCwgYnkgZGVmYXVsdCwgaW5kZW50c1xuY29udGludWVkIGxpbmVzIG9uZSB1bml0IG1vcmUgdGhhbiB0aGUgbm9kZSdzIGJhc2UgaW5kZW50YXRpb24uXG5Zb3UgY2FuIHByb3ZpZGUgYGV4Y2VwdGAgdG8gcHJldmVudCBpbmRlbnRhdGlvbiBvZiBsaW5lcyB0aGF0XG5tYXRjaCBhIHBhdHRlcm4gKGZvciBleGFtcGxlIGAvXmVsc2VcXGIvYCBpbiBgaWZgL2BlbHNlYFxuY29uc3RydWN0cyksIGFuZCB5b3UgY2FuIGNoYW5nZSB0aGUgYW1vdW50IG9mIHVuaXRzIHVzZWQgd2l0aCB0aGVcbmB1bml0c2Agb3B0aW9uLlxuKi9cbmZ1bmN0aW9uIGNvbnRpbnVlZEluZGVudCh7IGV4Y2VwdCwgdW5pdHMgPSAxIH0gPSB7fSkge1xuICAgIHJldHVybiAoY29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgbWF0Y2hFeGNlcHQgPSBleGNlcHQgJiYgZXhjZXB0LnRlc3QoY29udGV4dC50ZXh0QWZ0ZXIpO1xuICAgICAgICByZXR1cm4gY29udGV4dC5iYXNlSW5kZW50ICsgKG1hdGNoRXhjZXB0ID8gMCA6IHVuaXRzICogY29udGV4dC51bml0KTtcbiAgICB9O1xufVxuY29uc3QgRG9udEluZGVudEJleW9uZCA9IDIwMDtcbi8qKlxuRW5hYmxlcyByZWluZGVudGF0aW9uIG9uIGlucHV0LiBXaGVuIGEgbGFuZ3VhZ2UgZGVmaW5lcyBhblxuYGluZGVudE9uSW5wdXRgIGZpZWxkIGluIGl0cyBbbGFuZ3VhZ2VcbmRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpLCB3aGljaCBtdXN0IGhvbGQgYSByZWd1bGFyXG5leHByZXNzaW9uLCB0aGUgbGluZSBhdCB0aGUgY3Vyc29yIHdpbGwgYmUgcmVpbmRlbnRlZCB3aGVuZXZlciBuZXdcbnRleHQgaXMgdHlwZWQgYW5kIHRoZSBpbnB1dCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGluZSB1cCB0byB0aGVcbmN1cnNvciBtYXRjaGVzIHRoYXQgcmVnZXhwLlxuXG5UbyBhdm9pZCB1bm5lY2Nlc2FyeSByZWluZGVudHMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0YXJ0IHRoZVxucmVnZXhwIHdpdGggYF5gICh1c3VhbGx5IGZvbGxvd2VkIGJ5IGBcXHMqYCksIGFuZCBlbmQgaXQgd2l0aCBgJGAuXG5Gb3IgZXhhbXBsZSwgYC9eXFxzKlxcfSQvYCB3aWxsIHJlaW5kZW50IHdoZW4gYSBjbG9zaW5nIGJyYWNlIGlzXG5hZGRlZCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLlxuKi9cbmZ1bmN0aW9uIGluZGVudE9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIEVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRmlsdGVyLm9mKHRyID0+IHtcbiAgICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkIHx8ICF0ci5pc1VzZXJFdmVudChcImlucHV0LnR5cGVcIikgJiYgIXRyLmlzVXNlckV2ZW50KFwiaW5wdXQuY29tcGxldGVcIikpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBydWxlcyA9IHRyLnN0YXJ0U3RhdGUubGFuZ3VhZ2VEYXRhQXQoXCJpbmRlbnRPbklucHV0XCIsIHRyLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZCk7XG4gICAgICAgIGlmICghcnVsZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgZG9jID0gdHIubmV3RG9jLCB7IGhlYWQgfSA9IHRyLm5ld1NlbGVjdGlvbi5tYWluLCBsaW5lID0gZG9jLmxpbmVBdChoZWFkKTtcbiAgICAgICAgaWYgKGhlYWQgPiBsaW5lLmZyb20gKyBEb250SW5kZW50QmV5b25kKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gZG9jLnNsaWNlU3RyaW5nKGxpbmUuZnJvbSwgaGVhZCk7XG4gICAgICAgIGlmICghcnVsZXMuc29tZShyID0+IHIudGVzdChsaW5lU3RhcnQpKSlcbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHRyLCBsYXN0ID0gLTEsIGNoYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeyBoZWFkIH0gb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KGhlYWQpO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA9PSBsYXN0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGFzdCA9IGxpbmUuZnJvbTtcbiAgICAgICAgICAgIGxldCBpbmRlbnQgPSBnZXRJbmRlbnRhdGlvbihzdGF0ZSwgbGluZS5mcm9tKTtcbiAgICAgICAgICAgIGlmIChpbmRlbnQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBjdXIgPSAvXlxccyovLmV4ZWMobGluZS50ZXh0KVswXTtcbiAgICAgICAgICAgIGxldCBub3JtID0gaW5kZW50U3RyaW5nKHN0YXRlLCBpbmRlbnQpO1xuICAgICAgICAgICAgaWYgKGN1ciAhPSBub3JtKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IGxpbmUuZnJvbSArIGN1ci5sZW5ndGgsIGluc2VydDogbm9ybSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlcy5sZW5ndGggPyBbdHIsIHsgY2hhbmdlcywgc2VxdWVudGlhbDogdHJ1ZSB9XSA6IHRyO1xuICAgIH0pO1xufVxuXG4vKipcbkEgZmFjZXQgdGhhdCByZWdpc3RlcnMgYSBjb2RlIGZvbGRpbmcgc2VydmljZS4gV2hlbiBjYWxsZWQgd2l0aFxudGhlIGV4dGVudCBvZiBhIGxpbmUsIHN1Y2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgZm9sZGFibGVcbnJhbmdlIHRoYXQgc3RhcnRzIG9uIHRoYXQgbGluZSAoYnV0IGNvbnRpbnVlcyBiZXlvbmQgaXQpLCBpZiBvbmVcbmNhbiBiZSBmb3VuZC5cbiovXG5jb25zdCBmb2xkU2VydmljZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuVGhpcyBub2RlIHByb3AgaXMgdXNlZCB0byBhc3NvY2lhdGUgZm9sZGluZyBpbmZvcm1hdGlvbiB3aXRoXG5zeW50YXggbm9kZSB0eXBlcy4gR2l2ZW4gYSBzeW50YXggbm9kZSwgaXQgc2hvdWxkIGNoZWNrIHdoZXRoZXJcbnRoYXQgdHJlZSBpcyBmb2xkYWJsZSBhbmQgcmV0dXJuIHRoZSByYW5nZSB0aGF0IGNhbiBiZSBjb2xsYXBzZWRcbndoZW4gaXQgaXMuXG4qL1xuY29uc3QgZm9sZE5vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5bRm9sZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkTm9kZVByb3ApIGZ1bmN0aW9uIHRoYXQgZm9sZHMgZXZlcnl0aGluZyBidXRcbnRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgY2hpbGQgb2YgYSBzeW50YXggbm9kZS4gVXNlZnVsIGZvciBub2Rlc1xudGhhdCBzdGFydCBhbmQgZW5kIHdpdGggZGVsaW1pdGVycy5cbiovXG5mdW5jdGlvbiBmb2xkSW5zaWRlKG5vZGUpIHtcbiAgICBsZXQgZmlyc3QgPSBub2RlLmZpcnN0Q2hpbGQsIGxhc3QgPSBub2RlLmxhc3RDaGlsZDtcbiAgICByZXR1cm4gZmlyc3QgJiYgZmlyc3QudG8gPCBsYXN0LmZyb20gPyB7IGZyb206IGZpcnN0LnRvLCB0bzogbGFzdC50eXBlLmlzRXJyb3IgPyBub2RlLnRvIDogbGFzdC5mcm9tIH0gOiBudWxsO1xufVxuZnVuY3Rpb24gc3ludGF4Rm9sZGluZyhzdGF0ZSwgc3RhcnQsIGVuZCkge1xuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgaWYgKHRyZWUubGVuZ3RoIDwgZW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3RhY2sgPSB0cmVlLnJlc29sdmVTdGFjayhlbmQsIDEpO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChsZXQgaXRlciA9IHN0YWNrOyBpdGVyOyBpdGVyID0gaXRlci5uZXh0KSB7XG4gICAgICAgIGxldCBjdXIgPSBpdGVyLm5vZGU7XG4gICAgICAgIGlmIChjdXIudG8gPD0gZW5kIHx8IGN1ci5mcm9tID4gZW5kKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChmb3VuZCAmJiBjdXIuZnJvbSA8IHN0YXJ0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBwcm9wID0gY3VyLnR5cGUucHJvcChmb2xkTm9kZVByb3ApO1xuICAgICAgICBpZiAocHJvcCAmJiAoY3VyLnRvIDwgdHJlZS5sZW5ndGggLSA1MCB8fCB0cmVlLmxlbmd0aCA9PSBzdGF0ZS5kb2MubGVuZ3RoIHx8ICFpc1VuZmluaXNoZWQoY3VyKSkpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHByb3AoY3VyLCBzdGF0ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuZnJvbSA8PSBlbmQgJiYgdmFsdWUuZnJvbSA+PSBzdGFydCAmJiB2YWx1ZS50byA+IGVuZClcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGlzVW5maW5pc2hlZChub2RlKSB7XG4gICAgbGV0IGNoID0gbm9kZS5sYXN0Q2hpbGQ7XG4gICAgcmV0dXJuIGNoICYmIGNoLnRvID09IG5vZGUudG8gJiYgY2gudHlwZS5pc0Vycm9yO1xufVxuLyoqXG5DaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBsaW5lIGlzIGZvbGRhYmxlLiBGaXJzdCBhc2tzIGFueSBmb2xkXG5zZXJ2aWNlcyByZWdpc3RlcmVkIHRocm91Z2hcbltgZm9sZFNlcnZpY2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRTZXJ2aWNlKSwgYW5kIGlmIG5vbmUgb2YgdGhlbSByZXR1cm5cbmEgcmVzdWx0LCB0cmllcyB0byBxdWVyeSB0aGUgW2ZvbGQgbm9kZVxucHJvcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkTm9kZVByb3ApIG9mIHN5bnRheCBub2RlcyB0aGF0IGNvdmVyIHRoZSBlbmRcbm9mIHRoZSBsaW5lLlxuKi9cbmZ1bmN0aW9uIGZvbGRhYmxlKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpIHtcbiAgICBmb3IgKGxldCBzZXJ2aWNlIG9mIHN0YXRlLmZhY2V0KGZvbGRTZXJ2aWNlKSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZShzdGF0ZSwgbGluZVN0YXJ0LCBsaW5lRW5kKTtcbiAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBzeW50YXhGb2xkaW5nKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpO1xufVxuZnVuY3Rpb24gbWFwUmFuZ2UocmFuZ2UsIG1hcHBpbmcpIHtcbiAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUG9zKHJhbmdlLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUG9zKHJhbmdlLnRvLCAtMSk7XG4gICAgcmV0dXJuIGZyb20gPj0gdG8gPyB1bmRlZmluZWQgOiB7IGZyb20sIHRvIH07XG59XG4vKipcblN0YXRlIGVmZmVjdCB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHRyYW5zYWN0aW9uIHRvIGZvbGQgdGhlXG5naXZlbiByYW5nZS4gKFlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdGhpcyBpbiBleGNlcHRpb25hbFxuY2lyY3Vtc3RhbmNlc1x1MjAxNHVzdWFsbHkgeW91J2xsIGp1c3Qgd2FudCB0byBsZXRcbltgZm9sZENvZGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRDb2RlKSBhbmQgdGhlIFtmb2xkXG5ndXR0ZXJdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZEd1dHRlcikgY3JlYXRlIHRoZSB0cmFuc2FjdGlvbnMuKVxuKi9cbmNvbnN0IGZvbGRFZmZlY3QgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHsgbWFwOiBtYXBSYW5nZSB9KTtcbi8qKlxuU3RhdGUgZWZmZWN0IHRoYXQgdW5mb2xkcyB0aGUgZ2l2ZW4gcmFuZ2UgKGlmIGl0IHdhcyBmb2xkZWQpLlxuKi9cbmNvbnN0IHVuZm9sZEVmZmVjdCA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6IG1hcFJhbmdlIH0pO1xuZnVuY3Rpb24gc2VsZWN0ZWRMaW5lcyh2aWV3KSB7XG4gICAgbGV0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgeyBoZWFkIH0gb2Ygdmlldy5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgIGlmIChsaW5lcy5zb21lKGwgPT4gbC5mcm9tIDw9IGhlYWQgJiYgbC50byA+PSBoZWFkKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsaW5lcy5wdXNoKHZpZXcubGluZUJsb2NrQXQoaGVhZCkpO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXM7XG59XG4vKipcblRoZSBzdGF0ZSBmaWVsZCB0aGF0IHN0b3JlcyB0aGUgZm9sZGVkIHJhbmdlcyAoYXMgYSBbZGVjb3JhdGlvblxuc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvblNldCkpLiBDYW4gYmUgcGFzc2VkIHRvXG5bYEVkaXRvclN0YXRlLnRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudG9KU09OKSBhbmRcbltgZnJvbUpTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmZyb21KU09OKSB0byBzZXJpYWxpemUgdGhlIGZvbGRcbnN0YXRlLlxuKi9cbmNvbnN0IGZvbGRTdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgIH0sXG4gICAgdXBkYXRlKGZvbGRlZCwgdHIpIHtcbiAgICAgICAgZm9sZGVkID0gZm9sZGVkLm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKSB7XG4gICAgICAgICAgICBpZiAoZS5pcyhmb2xkRWZmZWN0KSAmJiAhZm9sZEV4aXN0cyhmb2xkZWQsIGUudmFsdWUuZnJvbSwgZS52YWx1ZS50bykpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBwcmVwYXJlUGxhY2Vob2xkZXIgfSA9IHRyLnN0YXRlLmZhY2V0KGZvbGRDb25maWcpO1xuICAgICAgICAgICAgICAgIGxldCB3aWRnZXQgPSAhcHJlcGFyZVBsYWNlaG9sZGVyID8gZm9sZFdpZGdldCA6XG4gICAgICAgICAgICAgICAgICAgIERlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogbmV3IFByZXBhcmVkRm9sZFdpZGdldChwcmVwYXJlUGxhY2Vob2xkZXIodHIuc3RhdGUsIGUudmFsdWUpKSB9KTtcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHsgYWRkOiBbd2lkZ2V0LnJhbmdlKGUudmFsdWUuZnJvbSwgZS52YWx1ZS50byldIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZS5pcyh1bmZvbGRFZmZlY3QpKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVkID0gZm9sZGVkLnVwZGF0ZSh7IGZpbHRlcjogKGZyb20sIHRvKSA9PiBlLnZhbHVlLmZyb20gIT0gZnJvbSB8fCBlLnZhbHVlLnRvICE9IHRvLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGcm9tOiBlLnZhbHVlLmZyb20sIGZpbHRlclRvOiBlLnZhbHVlLnRvIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyIGZvbGRlZCByYW5nZXMgdGhhdCBjb3ZlciB0aGUgc2VsZWN0aW9uIGhlYWRcbiAgICAgICAgaWYgKHRyLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgbGV0IG9uU2VsZWN0aW9uID0gZmFsc2UsIHsgaGVhZCB9ID0gdHIuc2VsZWN0aW9uLm1haW47XG4gICAgICAgICAgICBmb2xkZWQuYmV0d2VlbihoZWFkLCBoZWFkLCAoYSwgYikgPT4geyBpZiAoYSA8IGhlYWQgJiYgYiA+IGhlYWQpXG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb24gPSB0cnVlOyB9KTtcbiAgICAgICAgICAgIGlmIChvblNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnJvbTogaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVG86IGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogKGEsIGIpID0+IGIgPD0gaGVhZCB8fCBhID49IGhlYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9sZGVkO1xuICAgIH0sXG4gICAgcHJvdmlkZTogZiA9PiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLmZyb20oZiksXG4gICAgdG9KU09OKGZvbGRlZCwgc3RhdGUpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBmb2xkZWQuYmV0d2VlbigwLCBzdGF0ZS5kb2MubGVuZ3RoLCAoZnJvbSwgdG8pID0+IHsgcmFuZ2VzLnB1c2goZnJvbSwgdG8pOyB9KTtcbiAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9LFxuICAgIGZyb21KU09OKHZhbHVlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoICUgMilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIGZvciBmb2xkIHN0YXRlXCIpO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSB2YWx1ZVtpKytdLCB0byA9IHZhbHVlW2krK107XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiBmb3IgZm9sZCBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKGZvbGRXaWRnZXQucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQocmFuZ2VzLCB0cnVlKTtcbiAgICB9XG59KTtcbi8qKlxuR2V0IGEgW3JhbmdlIHNldF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZVNldCkgY29udGFpbmluZyB0aGUgZm9sZGVkIHJhbmdlc1xuaW4gdGhlIGdpdmVuIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIGZvbGRlZFJhbmdlcyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSB8fCBSYW5nZVNldC5lbXB0eTtcbn1cbmZ1bmN0aW9uIGZpbmRGb2xkKHN0YXRlLCBmcm9tLCB0bykge1xuICAgIHZhciBfYTtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIChfYSA9IHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmV0d2Vlbihmcm9tLCB0bywgKGZyb20sIHRvKSA9PiB7XG4gICAgICAgIGlmICghZm91bmQgfHwgZm91bmQuZnJvbSA+IGZyb20pXG4gICAgICAgICAgICBmb3VuZCA9IHsgZnJvbSwgdG8gfTtcbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBmb2xkRXhpc3RzKGZvbGRlZCwgZnJvbSwgdG8pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb2xkZWQuYmV0d2Vlbihmcm9tLCBmcm9tLCAoYSwgYikgPT4geyBpZiAoYSA9PSBmcm9tICYmIGIgPT0gdG8pXG4gICAgICAgIGZvdW5kID0gdHJ1ZTsgfSk7XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gbWF5YmVFbmFibGUoc3RhdGUsIG90aGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpID8gb3RoZXIgOiBvdGhlci5jb25jYXQoU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnLm9mKGNvZGVGb2xkaW5nKCkpKTtcbn1cbi8qKlxuRm9sZCB0aGUgbGluZXMgdGhhdCBhcmUgc2VsZWN0ZWQsIGlmIHBvc3NpYmxlLlxuKi9cbmNvbnN0IGZvbGRDb2RlID0gdmlldyA9PiB7XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCByYW5nZSA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IG1heWJlRW5hYmxlKHZpZXcuc3RhdGUsIFtmb2xkRWZmZWN0Lm9mKHJhbmdlKSwgYW5ub3VuY2VGb2xkKHZpZXcsIHJhbmdlKV0pIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuVW5mb2xkIGZvbGRlZCByYW5nZXMgb24gc2VsZWN0ZWQgbGluZXMuXG4qL1xuY29uc3QgdW5mb2xkQ29kZSA9IHZpZXcgPT4ge1xuICAgIGlmICghdmlldy5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKVxuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKHVuZm9sZEVmZmVjdC5vZihmb2xkZWQpLCBhbm5vdW5jZUZvbGQodmlldywgZm9sZGVkLCBmYWxzZSkpO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzIH0pO1xuICAgIHJldHVybiBlZmZlY3RzLmxlbmd0aCA+IDA7XG59O1xuZnVuY3Rpb24gYW5ub3VuY2VGb2xkKHZpZXcsIHJhbmdlLCBmb2xkID0gdHJ1ZSkge1xuICAgIGxldCBsaW5lRnJvbSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5mcm9tKS5udW1iZXIsIGxpbmVUbyA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChyYW5nZS50bykubnVtYmVyO1xuICAgIHJldHVybiBFZGl0b3JWaWV3LmFubm91bmNlLm9mKGAke3ZpZXcuc3RhdGUucGhyYXNlKGZvbGQgPyBcIkZvbGRlZCBsaW5lc1wiIDogXCJVbmZvbGRlZCBsaW5lc1wiKX0gJHtsaW5lRnJvbX0gJHt2aWV3LnN0YXRlLnBocmFzZShcInRvXCIpfSAke2xpbmVUb30uYCk7XG59XG4vKipcbkZvbGQgYWxsIHRvcC1sZXZlbCBmb2xkYWJsZSByYW5nZXMuIE5vdGUgdGhhdCwgaW4gbW9zdCBjYXNlcyxcbmZvbGRpbmcgaW5mb3JtYXRpb24gd2lsbCBkZXBlbmQgb24gdGhlIFtzeW50YXhcbnRyZWVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2Uuc3ludGF4VHJlZSksIGFuZCBmb2xkaW5nIGV2ZXJ5dGhpbmcgbWF5IG5vdCB3b3JrXG5yZWxpYWJseSB3aGVuIHRoZSBkb2N1bWVudCBoYXNuJ3QgYmVlbiBmdWxseSBwYXJzZWQgKGVpdGhlclxuYmVjYXVzZSB0aGUgZWRpdG9yIHN0YXRlIHdhcyBvbmx5IGp1c3QgaW5pdGlhbGl6ZWQsIG9yIGJlY2F1c2UgdGhlXG5kb2N1bWVudCBpcyBzbyBiaWcgdGhhdCB0aGUgcGFyc2VyIGRlY2lkZWQgbm90IHRvIHBhcnNlIGl0XG5lbnRpcmVseSkuXG4qL1xuY29uc3QgZm9sZEFsbCA9IHZpZXcgPT4ge1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgc3RhdGUuZG9jLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHBvcyksIHJhbmdlID0gZm9sZGFibGUoc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaChmb2xkRWZmZWN0Lm9mKHJhbmdlKSk7XG4gICAgICAgIHBvcyA9IChyYW5nZSA/IHZpZXcubGluZUJsb2NrQXQocmFuZ2UudG8pIDogbGluZSkudG8gKyAxO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBtYXliZUVuYWJsZSh2aWV3LnN0YXRlLCBlZmZlY3RzKSB9KTtcbiAgICByZXR1cm4gISFlZmZlY3RzLmxlbmd0aDtcbn07XG4vKipcblVuZm9sZCBhbGwgZm9sZGVkIGNvZGUuXG4qL1xuY29uc3QgdW5mb2xkQWxsID0gdmlldyA9PiB7XG4gICAgbGV0IGZpZWxkID0gdmlldy5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKTtcbiAgICBpZiAoIWZpZWxkIHx8ICFmaWVsZC5zaXplKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmaWVsZC5iZXR3ZWVuKDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCwgKGZyb20sIHRvKSA9PiB7IGVmZmVjdHMucHVzaCh1bmZvbGRFZmZlY3Qub2YoeyBmcm9tLCB0byB9KSk7IH0pO1xuICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzIH0pO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8vIEZpbmQgdGhlIGZvbGRhYmxlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBnaXZlbiBsaW5lLCBpZiBvbmUgZXhpc3RzXG5mdW5jdGlvbiBmb2xkYWJsZUNvbnRhaW5lcih2aWV3LCBsaW5lQmxvY2spIHtcbiAgICAvLyBMb29rIGJhY2t3YXJkcyB0aHJvdWdoIGxpbmUgYmxvY2tzIHVudGlsIHdlIGZpbmQgYSBmb2xkYWJsZSByZWdpb24gdGhhdFxuICAgIC8vIGludGVyc2VjdHMgd2l0aCB0aGUgbGluZVxuICAgIGZvciAobGV0IGxpbmUgPSBsaW5lQmxvY2s7Oykge1xuICAgICAgICBsZXQgZm9sZGFibGVSZWdpb24gPSBmb2xkYWJsZSh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGFibGVSZWdpb24gJiYgZm9sZGFibGVSZWdpb24udG8gPiBsaW5lQmxvY2suZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBmb2xkYWJsZVJlZ2lvbjtcbiAgICAgICAgaWYgKCFsaW5lLmZyb20pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGluZSA9IHZpZXcubGluZUJsb2NrQXQobGluZS5mcm9tIC0gMSk7XG4gICAgfVxufVxuLyoqXG5Ub2dnbGUgZm9sZGluZyBhdCBjdXJzb3JzLiBVbmZvbGRzIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGZvbGRcbnN0YXJ0aW5nIGluIHRoYXQgbGluZSwgdHJpZXMgdG8gZmluZCBhIGZvbGRhYmxlIHJhbmdlIGFyb3VuZCBpdFxub3RoZXJ3aXNlLlxuKi9cbmNvbnN0IHRvZ2dsZUZvbGQgPSAodmlldykgPT4ge1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkZWQsIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZm9sZFJhbmdlID0gZm9sZGFibGVDb250YWluZXIodmlldywgbGluZSk7XG4gICAgICAgICAgICBpZiAoZm9sZFJhbmdlKVxuICAgICAgICAgICAgICAgIGVmZmVjdHMucHVzaChmb2xkRWZmZWN0Lm9mKGZvbGRSYW5nZSksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkUmFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGggPiAwKVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogbWF5YmVFbmFibGUodmlldy5zdGF0ZSwgZWZmZWN0cykgfSk7XG4gICAgcmV0dXJuICEhZWZmZWN0cy5sZW5ndGg7XG59O1xuLyoqXG5EZWZhdWx0IGZvbGQtcmVsYXRlZCBrZXkgYmluZGluZ3MuXG5cbiAtIEN0cmwtU2hpZnQtWyAoQ21kLUFsdC1bIG9uIG1hY09TKTogW2Bmb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZENvZGUpLlxuIC0gQ3RybC1TaGlmdC1dIChDbWQtQWx0LV0gb24gbWFjT1MpOiBbYHVuZm9sZENvZGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnVuZm9sZENvZGUpLlxuIC0gQ3RybC1BbHQtWzogW2Bmb2xkQWxsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkQWxsKS5cbiAtIEN0cmwtQWx0LV06IFtgdW5mb2xkQWxsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS51bmZvbGRBbGwpLlxuKi9cbmNvbnN0IGZvbGRLZXltYXAgPSBbXG4gICAgeyBrZXk6IFwiQ3RybC1TaGlmdC1bXCIsIG1hYzogXCJDbWQtQWx0LVtcIiwgcnVuOiBmb2xkQ29kZSB9LFxuICAgIHsga2V5OiBcIkN0cmwtU2hpZnQtXVwiLCBtYWM6IFwiQ21kLUFsdC1dXCIsIHJ1bjogdW5mb2xkQ29kZSB9LFxuICAgIHsga2V5OiBcIkN0cmwtQWx0LVtcIiwgcnVuOiBmb2xkQWxsIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1BbHQtXVwiLCBydW46IHVuZm9sZEFsbCB9XG5dO1xuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBwbGFjZWhvbGRlckRPTTogbnVsbCxcbiAgICBwcmVwYXJlUGxhY2Vob2xkZXI6IG51bGwsXG4gICAgcGxhY2Vob2xkZXJUZXh0OiBcIlx1MjAyNlwiXG59O1xuY29uc3QgZm9sZENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUodmFsdWVzKSB7IHJldHVybiBjb21iaW5lQ29uZmlnKHZhbHVlcywgZGVmYXVsdENvbmZpZyk7IH1cbn0pO1xuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29uZmlndXJlcyBjb2RlIGZvbGRpbmcuXG4qL1xuZnVuY3Rpb24gY29kZUZvbGRpbmcoY29uZmlnKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtmb2xkU3RhdGUsIGJhc2VUaGVtZSQxXTtcbiAgICBpZiAoY29uZmlnKVxuICAgICAgICByZXN1bHQucHVzaChmb2xkQ29uZmlnLm9mKGNvbmZpZykpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB3aWRnZXRUb0RPTSh2aWV3LCBwcmVwYXJlZCkge1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjb25mID0gc3RhdGUuZmFjZXQoZm9sZENvbmZpZyk7XG4gICAgbGV0IG9uY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHZpZXcucG9zQXRET00oZXZlbnQudGFyZ2V0KSk7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHVuZm9sZEVmZmVjdC5vZihmb2xkZWQpIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgaWYgKGNvbmYucGxhY2Vob2xkZXJET00pXG4gICAgICAgIHJldHVybiBjb25mLnBsYWNlaG9sZGVyRE9NKHZpZXcsIG9uY2xpY2ssIHByZXBhcmVkKTtcbiAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBjb25mLnBsYWNlaG9sZGVyVGV4dDtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgc3RhdGUucGhyYXNlKFwiZm9sZGVkIGNvZGVcIikpO1xuICAgIGVsZW1lbnQudGl0bGUgPSBzdGF0ZS5waHJhc2UoXCJ1bmZvbGRcIik7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSBcImNtLWZvbGRQbGFjZWhvbGRlclwiO1xuICAgIGVsZW1lbnQub25jbGljayA9IG9uY2xpY2s7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5jb25zdCBmb2xkV2lkZ2V0ID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogLypAX19QVVJFX18qL25ldyBjbGFzcyBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgICAgICB0b0RPTSh2aWV3KSB7IHJldHVybiB3aWRnZXRUb0RPTSh2aWV3LCBudWxsKTsgfVxuICAgIH0gfSk7XG5jbGFzcyBQcmVwYXJlZEZvbGRXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLnZhbHVlID09IG90aGVyLnZhbHVlOyB9XG4gICAgdG9ET00odmlldykgeyByZXR1cm4gd2lkZ2V0VG9ET00odmlldywgdGhpcy52YWx1ZSk7IH1cbn1cbmNvbnN0IGZvbGRHdXR0ZXJEZWZhdWx0cyA9IHtcbiAgICBvcGVuVGV4dDogXCJcdTIzMDRcIixcbiAgICBjbG9zZWRUZXh0OiBcIlx1MjAzQVwiLFxuICAgIG1hcmtlckRPTTogbnVsbCxcbiAgICBkb21FdmVudEhhbmRsZXJzOiB7fSxcbiAgICBmb2xkaW5nQ2hhbmdlZDogKCkgPT4gZmFsc2Vcbn07XG5jbGFzcyBGb2xkTWFya2VyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIG9wZW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMub3BlbiA9IG9wZW47XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLmNvbmZpZyA9PSBvdGhlci5jb25maWcgJiYgdGhpcy5vcGVuID09IG90aGVyLm9wZW47IH1cbiAgICB0b0RPTSh2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5tYXJrZXJET00pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcubWFya2VyRE9NKHRoaXMub3Blbik7XG4gICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLm9wZW4gPyB0aGlzLmNvbmZpZy5vcGVuVGV4dCA6IHRoaXMuY29uZmlnLmNsb3NlZFRleHQ7XG4gICAgICAgIHNwYW4udGl0bGUgPSB2aWV3LnN0YXRlLnBocmFzZSh0aGlzLm9wZW4gPyBcIkZvbGQgbGluZVwiIDogXCJVbmZvbGQgbGluZVwiKTtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxufVxuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgcmVnaXN0ZXJzIGEgZm9sZCBndXR0ZXIsIHdoaWNoIHNob3dzIGFcbmZvbGQgc3RhdHVzIGluZGljYXRvciBiZWZvcmUgZm9sZGFibGUgbGluZXMgKHdoaWNoIGNhbiBiZSBjbGlja2VkXG50byBmb2xkIG9yIHVuZm9sZCB0aGUgbGluZSkuXG4qL1xuZnVuY3Rpb24gZm9sZEd1dHRlcihjb25maWcgPSB7fSkge1xuICAgIGxldCBmdWxsQ29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmb2xkR3V0dGVyRGVmYXVsdHMpLCBjb25maWcpO1xuICAgIGxldCBjYW5Gb2xkID0gbmV3IEZvbGRNYXJrZXIoZnVsbENvbmZpZywgdHJ1ZSksIGNhblVuZm9sZCA9IG5ldyBGb2xkTWFya2VyKGZ1bGxDb25maWcsIGZhbHNlKTtcbiAgICBsZXQgbWFya2VycyA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdmlldy52aWV3cG9ydC5mcm9tO1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzID0gdGhpcy5idWlsZE1hcmtlcnModmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHxcbiAgICAgICAgICAgICAgICB1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChsYW5ndWFnZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxhbmd1YWdlKSB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpICE9IHVwZGF0ZS5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgIHN5bnRheFRyZWUodXBkYXRlLnN0YXJ0U3RhdGUpICE9IHN5bnRheFRyZWUodXBkYXRlLnN0YXRlKSB8fFxuICAgICAgICAgICAgICAgIGZ1bGxDb25maWcuZm9sZGluZ0NoYW5nZWQodXBkYXRlKSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSB0aGlzLmJ1aWxkTWFya2Vycyh1cGRhdGUudmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRNYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgbGluZSBvZiB2aWV3LnZpZXdwb3J0TGluZUJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gZmluZEZvbGQodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKSA/IGNhblVuZm9sZFxuICAgICAgICAgICAgICAgICAgICA6IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50bykgPyBjYW5Gb2xkIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobWFyaylcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQobGluZS5mcm9tLCBsaW5lLmZyb20sIG1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgeyBkb21FdmVudEhhbmRsZXJzIH0gPSBmdWxsQ29uZmlnO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hcmtlcnMsXG4gICAgICAgIGd1dHRlcih7XG4gICAgICAgICAgICBjbGFzczogXCJjbS1mb2xkR3V0dGVyXCIsXG4gICAgICAgICAgICBtYXJrZXJzKHZpZXcpIHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKG1hcmtlcnMpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFya2VycykgfHwgUmFuZ2VTZXQuZW1wdHk7IH0sXG4gICAgICAgICAgICBpbml0aWFsU3BhY2VyKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9sZE1hcmtlcihmdWxsQ29uZmlnLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkb21FdmVudEhhbmRsZXJzKSwgeyBjbGljazogKHZpZXcsIGxpbmUsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21FdmVudEhhbmRsZXJzLmNsaWNrICYmIGRvbUV2ZW50SGFuZGxlcnMuY2xpY2sodmlldywgbGluZSwgZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBmb2xkYWJsZSh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBmb2xkRWZmZWN0Lm9mKHJhbmdlKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IH0pXG4gICAgICAgIH0pLFxuICAgICAgICBjb2RlRm9sZGluZygpXG4gICAgXTtcbn1cbmNvbnN0IGJhc2VUaGVtZSQxID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuYmFzZVRoZW1lKHtcbiAgICBcIi5jbS1mb2xkUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2VlZVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNkZGRcIixcbiAgICAgICAgY29sb3I6IFwiIzg4OFwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiLjJlbVwiLFxuICAgICAgICBtYXJnaW46IFwiMCAxcHhcIixcbiAgICAgICAgcGFkZGluZzogXCIwIDFweFwiLFxuICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgfSxcbiAgICBcIi5jbS1mb2xkR3V0dGVyIHNwYW5cIjoge1xuICAgICAgICBwYWRkaW5nOiBcIjAgMXB4XCIsXG4gICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICB9XG59KTtcblxuLyoqXG5BIGhpZ2hsaWdodCBzdHlsZSBhc3NvY2lhdGVzIENTUyBzdHlsZXMgd2l0aCBoaWdsaWdodGluZ1xuW3RhZ3NdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjaGlnaGxpZ2h0LlRhZykuXG4qL1xuY2xhc3MgSGlnaGxpZ2h0U3R5bGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0YWcgc3R5bGVzIHVzZWQgdG8gY3JlYXRlIHRoaXMgaGlnaGxpZ2h0IHN0eWxlLlxuICAgICovXG4gICAgc3BlY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zcGVjcyA9IHNwZWNzO1xuICAgICAgICBsZXQgbW9kU3BlYztcbiAgICAgICAgZnVuY3Rpb24gZGVmKHNwZWMpIHtcbiAgICAgICAgICAgIGxldCBjbHMgPSBTdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG4gICAgICAgICAgICAobW9kU3BlYyB8fCAobW9kU3BlYyA9IE9iamVjdC5jcmVhdGUobnVsbCkpKVtcIi5cIiArIGNsc10gPSBzcGVjO1xuICAgICAgICAgICAgcmV0dXJuIGNscztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGwgPSB0eXBlb2Ygb3B0aW9ucy5hbGwgPT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMuYWxsIDogb3B0aW9ucy5hbGwgPyBkZWYob3B0aW9ucy5hbGwpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY29wZU9wdCA9IG9wdGlvbnMuc2NvcGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZU9wdCBpbnN0YW5jZW9mIExhbmd1YWdlID8gKHR5cGUpID0+IHR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSBzY29wZU9wdC5kYXRhXG4gICAgICAgICAgICA6IHNjb3BlT3B0ID8gKHR5cGUpID0+IHR5cGUgPT0gc2NvcGVPcHQgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSB0YWdIaWdobGlnaHRlcihzcGVjcy5tYXAoc3R5bGUgPT4gKHtcbiAgICAgICAgICAgIHRhZzogc3R5bGUudGFnLFxuICAgICAgICAgICAgY2xhc3M6IHN0eWxlLmNsYXNzIHx8IGRlZihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSwgeyB0YWc6IG51bGwgfSkpXG4gICAgICAgIH0pKSwge1xuICAgICAgICAgICAgYWxsLFxuICAgICAgICB9KS5zdHlsZTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2RTcGVjID8gbmV3IFN0eWxlTW9kdWxlKG1vZFNwZWMpIDogbnVsbDtcbiAgICAgICAgdGhpcy50aGVtZVR5cGUgPSBvcHRpb25zLnRoZW1lVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgaGlnaGxpZ2h0ZXIgc3R5bGUgdGhhdCBhc3NvY2lhdGVzIHRoZSBnaXZlbiBzdHlsZXMgdG9cbiAgICB0aGUgZ2l2ZW4gdGFncy4gVGhlIHNwZWNzIG11c3QgYmUgb2JqZWN0cyB0aGF0IGhvbGQgYSBzdHlsZSB0YWdcbiAgICBvciBhcnJheSBvZiB0YWdzIGluIHRoZWlyIGB0YWdgIHByb3BlcnR5LCBhbmQgZWl0aGVyIGEgc2luZ2xlXG4gICAgYGNsYXNzYCBwcm9wZXJ0eSBwcm92aWRpbmcgYSBzdGF0aWMgQ1NTIGNsYXNzIChmb3IgaGlnaGxpZ2h0ZXJcbiAgICB0aGF0IHJlbHkgb24gZXh0ZXJuYWwgc3R5bGluZyksIG9yIGFcbiAgICBbYHN0eWxlLW1vZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL3N0eWxlLW1vZCNkb2N1bWVudGF0aW9uKS1zdHlsZVxuICAgIHNldCBvZiBDU1MgcHJvcGVydGllcyAod2hpY2ggZGVmaW5lIHRoZSBzdHlsaW5nIGZvciB0aG9zZSB0YWdzKS5cbiAgICBcbiAgICBUaGUgQ1NTIHJ1bGVzIGNyZWF0ZWQgZm9yIGEgaGlnaGxpZ2h0ZXIgd2lsbCBiZSBlbWl0dGVkIGluIHRoZVxuICAgIG9yZGVyIG9mIHRoZSBzcGVjJ3MgcHJvcGVydGllcy4gVGhhdCBtZWFucyB0aGF0IGZvciBlbGVtZW50cyB0aGF0XG4gICAgaGF2ZSBtdWx0aXBsZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBzdHlsZXMgZGVmaW5lZCBmdXJ0aGVyXG4gICAgZG93biBpbiB0aGUgbGlzdCB3aWxsIGhhdmUgYSBoaWdoZXIgQ1NTIHByZWNlZGVuY2UgdGhhbiBzdHlsZXNcbiAgICBkZWZpbmVkIGVhcmxpZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWNzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0U3R5bGUoc3BlY3MsIG9wdGlvbnMgfHwge30pO1xuICAgIH1cbn1cbmNvbnN0IGhpZ2hsaWdodGVyRmFjZXQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBmYWxsYmFja0hpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHsgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyBbdmFsdWVzWzBdXSA6IG51bGw7IH1cbn0pO1xuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0ZXJzKHN0YXRlKSB7XG4gICAgbGV0IG1haW4gPSBzdGF0ZS5mYWNldChoaWdobGlnaHRlckZhY2V0KTtcbiAgICByZXR1cm4gbWFpbi5sZW5ndGggPyBtYWluIDogc3RhdGUuZmFjZXQoZmFsbGJhY2tIaWdobGlnaHRlcik7XG59XG4vKipcbldyYXAgYSBoaWdobGlnaHRlciBpbiBhbiBlZGl0b3IgZXh0ZW5zaW9uIHRoYXQgdXNlcyBpdCB0byBhcHBseVxuc3ludGF4IGhpZ2hsaWdodGluZyB0byB0aGUgZWRpdG9yIGNvbnRlbnQuXG5cbldoZW4gbXVsdGlwbGUgKG5vbi1mYWxsYmFjaykgc3R5bGVzIGFyZSBwcm92aWRlZCwgdGhlIHN0eWxpbmdcbmFwcGxpZWQgaXMgdGhlIHVuaW9uIG9mIHRoZSBjbGFzc2VzIHRoZXkgZW1pdC5cbiovXG5mdW5jdGlvbiBzeW50YXhIaWdobGlnaHRpbmcoaGlnaGxpZ2h0ZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgZXh0ID0gW3RyZWVIaWdobGlnaHRlcl0sIHRoZW1lVHlwZTtcbiAgICBpZiAoaGlnaGxpZ2h0ZXIgaW5zdGFuY2VvZiBIaWdobGlnaHRTdHlsZSkge1xuICAgICAgICBpZiAoaGlnaGxpZ2h0ZXIubW9kdWxlKVxuICAgICAgICAgICAgZXh0LnB1c2goRWRpdG9yVmlldy5zdHlsZU1vZHVsZS5vZihoaWdobGlnaHRlci5tb2R1bGUpKTtcbiAgICAgICAgdGhlbWVUeXBlID0gaGlnaGxpZ2h0ZXIudGhlbWVUeXBlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZhbGxiYWNrKVxuICAgICAgICBleHQucHVzaChmYWxsYmFja0hpZ2hsaWdodGVyLm9mKGhpZ2hsaWdodGVyKSk7XG4gICAgZWxzZSBpZiAodGhlbWVUeXBlKVxuICAgICAgICBleHQucHVzaChoaWdobGlnaHRlckZhY2V0LmNvbXB1dGVOKFtFZGl0b3JWaWV3LmRhcmtUaGVtZV0sIHN0YXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5mYWNldChFZGl0b3JWaWV3LmRhcmtUaGVtZSkgPT0gKHRoZW1lVHlwZSA9PSBcImRhcmtcIikgPyBbaGlnaGxpZ2h0ZXJdIDogW107XG4gICAgICAgIH0pKTtcbiAgICBlbHNlXG4gICAgICAgIGV4dC5wdXNoKGhpZ2hsaWdodGVyRmFjZXQub2YoaGlnaGxpZ2h0ZXIpKTtcbiAgICByZXR1cm4gZXh0O1xufVxuLyoqXG5SZXR1cm5zIHRoZSBDU1MgY2xhc3NlcyAoaWYgYW55KSB0aGF0IHRoZSBoaWdobGlnaHRlcnMgYWN0aXZlIGluXG50aGUgc3RhdGUgd291bGQgYXNzaWduIHRvIHRoZSBnaXZlbiBzdHlsZVxuW3RhZ3NdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjaGlnaGxpZ2h0LlRhZykgYW5kXG4ob3B0aW9uYWwpIGxhbmd1YWdlXG5bc2NvcGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuSGlnaGxpZ2h0U3R5bGVeZGVmaW5lXm9wdGlvbnMuc2NvcGUpLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodGluZ0ZvcihzdGF0ZSwgdGFncywgc2NvcGUpIHtcbiAgICBsZXQgaGlnaGxpZ2h0ZXJzID0gZ2V0SGlnaGxpZ2h0ZXJzKHN0YXRlKTtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoaGlnaGxpZ2h0ZXJzKVxuICAgICAgICBmb3IgKGxldCBoaWdobGlnaHRlciBvZiBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgICAgIGlmICghaGlnaGxpZ2h0ZXIuc2NvcGUgfHwgc2NvcGUgJiYgaGlnaGxpZ2h0ZXIuc2NvcGUoc2NvcGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNscyA9IGhpZ2hsaWdodGVyLnN0eWxlKHRhZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA/IHJlc3VsdCArIFwiIFwiICsgY2xzIDogY2xzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNsYXNzIFRyZWVIaWdobGlnaHRlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLm1hcmtDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG4gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh2aWV3LCBnZXRIaWdobGlnaHRlcnModmlldy5zdGF0ZSkpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpLCBoaWdobGlnaHRlcnMgPSBnZXRIaWdobGlnaHRlcnModXBkYXRlLnN0YXRlKTtcbiAgICAgICAgbGV0IHN0eWxlQ2hhbmdlID0gaGlnaGxpZ2h0ZXJzICE9IGdldEhpZ2hsaWdodGVycyh1cGRhdGUuc3RhcnRTdGF0ZSk7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA8IHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvICYmICFzdHlsZUNoYW5nZSAmJiB0cmVlLnR5cGUgPT0gdGhpcy50cmVlLnR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRpb25zLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJlZSAhPSB0aGlzLnRyZWUgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fCBzdHlsZUNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh1cGRhdGUudmlldywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsZERlY28odmlldywgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGlmICghaGlnaGxpZ2h0ZXJzIHx8ICF0aGlzLnRyZWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiB2aWV3LnZpc2libGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGhpZ2hsaWdodFRyZWUodGhpcy50cmVlLCBoaWdobGlnaHRlcnMsIChmcm9tLCB0bywgc3R5bGUpID0+IHtcbiAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChmcm9tLCB0bywgdGhpcy5tYXJrQ2FjaGVbc3R5bGVdIHx8ICh0aGlzLm1hcmtDYWNoZVtzdHlsZV0gPSBEZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogc3R5bGUgfSkpKTtcbiAgICAgICAgICAgIH0sIGZyb20sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICB9XG59XG5jb25zdCB0cmVlSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovUHJlYy5oaWdoKC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhUcmVlSGlnaGxpZ2h0ZXIsIHtcbiAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG59KSk7XG4vKipcbkEgZGVmYXVsdCBoaWdobGlnaHQgc3R5bGUgKHdvcmtzIHdlbGwgd2l0aCBsaWdodCB0aGVtZXMpLlxuKi9cbmNvbnN0IGRlZmF1bHRIaWdobGlnaHRTdHlsZSA9IC8qQF9fUFVSRV9fKi9IaWdobGlnaHRTdHlsZS5kZWZpbmUoW1xuICAgIHsgdGFnOiB0YWdzLm1ldGEsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQ3NDBcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxpbmssXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaGVhZGluZyxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFwidW5kZXJsaW5lXCIsXG4gICAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZW1waGFzaXMsXG4gICAgICAgIGZvbnRTdHlsZTogXCJpdGFsaWNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cm9uZyxcbiAgICAgICAgZm9udFdlaWdodDogXCJib2xkXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJpa2V0aHJvdWdoLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJsaW5lLXRocm91Z2hcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmtleXdvcmQsXG4gICAgICAgIGNvbG9yOiBcIiM3MDhcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5hdG9tLCB0YWdzLmJvb2wsIHRhZ3MudXJsLCB0YWdzLmNvbnRlbnRTZXBhcmF0b3IsIHRhZ3MubGFiZWxOYW1lXSxcbiAgICAgICAgY29sb3I6IFwiIzIxOVwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLmxpdGVyYWwsIHRhZ3MuaW5zZXJ0ZWRdLFxuICAgICAgICBjb2xvcjogXCIjMTY0XCIgfSxcbiAgICB7IHRhZzogW3RhZ3Muc3RyaW5nLCB0YWdzLmRlbGV0ZWRdLFxuICAgICAgICBjb2xvcjogXCIjYTExXCIgfSxcbiAgICB7IHRhZzogW3RhZ3MucmVnZXhwLCB0YWdzLmVzY2FwZSwgLypAX19QVVJFX18qL3RhZ3Muc3BlY2lhbCh0YWdzLnN0cmluZyldLFxuICAgICAgICBjb2xvcjogXCIjZTQwXCIgfSxcbiAgICB7IHRhZzogLypAX19QVVJFX18qL3RhZ3MuZGVmaW5pdGlvbih0YWdzLnZhcmlhYmxlTmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMwMGZcIiB9LFxuICAgIHsgdGFnOiAvKkBfX1BVUkVfXyovdGFncy5sb2NhbCh0YWdzLnZhcmlhYmxlTmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMzMGFcIiB9LFxuICAgIHsgdGFnOiBbdGFncy50eXBlTmFtZSwgdGFncy5uYW1lc3BhY2VdLFxuICAgICAgICBjb2xvcjogXCIjMDg1XCIgfSxcbiAgICB7IHRhZzogdGFncy5jbGFzc05hbWUsXG4gICAgICAgIGNvbG9yOiBcIiMxNjdcIiB9LFxuICAgIHsgdGFnOiBbLypAX19QVVJFX18qL3RhZ3Muc3BlY2lhbCh0YWdzLnZhcmlhYmxlTmFtZSksIHRhZ3MubWFjcm9OYW1lXSxcbiAgICAgICAgY29sb3I6IFwiIzI1NlwiIH0sXG4gICAgeyB0YWc6IC8qQF9fUFVSRV9fKi90YWdzLmRlZmluaXRpb24odGFncy5wcm9wZXJ0eU5hbWUpLFxuICAgICAgICBjb2xvcjogXCIjMDBjXCIgfSxcbiAgICB7IHRhZzogdGFncy5jb21tZW50LFxuICAgICAgICBjb2xvcjogXCIjOTQwXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnZhbGlkLFxuICAgICAgICBjb2xvcjogXCIjZjAwXCIgfVxuXSk7XG5cbmNvbnN0IGJhc2VUaGVtZSA9IC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmJhc2VUaGVtZSh7XG4gICAgXCImLmNtLWZvY3VzZWQgLmNtLW1hdGNoaW5nQnJhY2tldFwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjMzI4YzgyNTJcIiB9LFxuICAgIFwiJi5jbS1mb2N1c2VkIC5jbS1ub25tYXRjaGluZ0JyYWNrZXRcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiI2JiNTU1NTQ0XCIgfVxufSk7XG5jb25zdCBEZWZhdWx0U2NhbkRpc3QgPSAxMDAwMCwgRGVmYXVsdEJyYWNrZXRzID0gXCIoKVtde31cIjtcbmNvbnN0IGJyYWNrZXRNYXRjaGluZ0NvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICBhZnRlckN1cnNvcjogdHJ1ZSxcbiAgICAgICAgICAgIGJyYWNrZXRzOiBEZWZhdWx0QnJhY2tldHMsXG4gICAgICAgICAgICBtYXhTY2FuRGlzdGFuY2U6IERlZmF1bHRTY2FuRGlzdCxcbiAgICAgICAgICAgIHJlbmRlck1hdGNoOiBkZWZhdWx0UmVuZGVyTWF0Y2hcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jb25zdCBtYXRjaGluZ01hcmsgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20tbWF0Y2hpbmdCcmFja2V0XCIgfSksIG5vbm1hdGNoaW5nTWFyayA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1ub25tYXRjaGluZ0JyYWNrZXRcIiB9KTtcbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJNYXRjaChtYXRjaCkge1xuICAgIGxldCBkZWNvcmF0aW9ucyA9IFtdO1xuICAgIGxldCBtYXJrID0gbWF0Y2gubWF0Y2hlZCA/IG1hdGNoaW5nTWFyayA6IG5vbm1hdGNoaW5nTWFyaztcbiAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcmsucmFuZ2UobWF0Y2guc3RhcnQuZnJvbSwgbWF0Y2guc3RhcnQudG8pKTtcbiAgICBpZiAobWF0Y2guZW5kKVxuICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcmsucmFuZ2UobWF0Y2guZW5kLmZyb20sIG1hdGNoLmVuZC50bykpO1xuICAgIHJldHVybiBkZWNvcmF0aW9ucztcbn1cbmNvbnN0IGJyYWNrZXRNYXRjaGluZ1N0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7IHJldHVybiBEZWNvcmF0aW9uLm5vbmU7IH0sXG4gICAgdXBkYXRlKGRlY28sIHRyKSB7XG4gICAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiAhdHIuc2VsZWN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGRlY287XG4gICAgICAgIGxldCBkZWNvcmF0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgY29uZmlnID0gdHIuc3RhdGUuZmFjZXQoYnJhY2tldE1hdGNoaW5nQ29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2YgdHIuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQsIC0xLCBjb25maWcpXG4gICAgICAgICAgICAgICAgfHwgKHJhbmdlLmhlYWQgPiAwICYmIG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQgLSAxLCAxLCBjb25maWcpKVxuICAgICAgICAgICAgICAgIHx8IChjb25maWcuYWZ0ZXJDdXJzb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgKG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQsIDEsIGNvbmZpZykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyYW5nZS5oZWFkIDwgdHIuc3RhdGUuZG9jLmxlbmd0aCAmJiBtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkICsgMSwgLTEsIGNvbmZpZykpKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9ucy5jb25jYXQoY29uZmlnLnJlbmRlck1hdGNoKG1hdGNoLCB0ci5zdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvcmF0aW9ucywgdHJ1ZSk7XG4gICAgfSxcbiAgICBwcm92aWRlOiBmID0+IEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmKVxufSk7XG5jb25zdCBicmFja2V0TWF0Y2hpbmdVbmlxdWUgPSBbXG4gICAgYnJhY2tldE1hdGNoaW5nU3RhdGUsXG4gICAgYmFzZVRoZW1lXG5dO1xuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBicmFja2V0IG1hdGNoaW5nLiBXaGVuZXZlciB0aGVcbmN1cnNvciBpcyBuZXh0IHRvIGEgYnJhY2tldCwgdGhhdCBicmFja2V0IGFuZCB0aGUgb25lIGl0IG1hdGNoZXNcbmFyZSBoaWdobGlnaHRlZC4gT3IsIHdoZW4gbm8gbWF0Y2hpbmcgYnJhY2tldCBpcyBmb3VuZCwgYW5vdGhlclxuaGlnaGxpZ2h0aW5nIHN0eWxlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhpcy5cbiovXG5mdW5jdGlvbiBicmFja2V0TWF0Y2hpbmcoY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW2JyYWNrZXRNYXRjaGluZ0NvbmZpZy5vZihjb25maWcpLCBicmFja2V0TWF0Y2hpbmdVbmlxdWVdO1xufVxuLyoqXG5XaGVuIGxhcmdlciBzeW50YXggbm9kZXMsIHN1Y2ggYXMgSFRNTCB0YWdzLCBhcmUgbWFya2VkIGFzXG5vcGVuaW5nL2Nsb3NpbmcsIGl0IGNhbiBiZSBhIGJpdCBtZXNzeSB0byB0cmVhdCB0aGUgd2hvbGUgbm9kZSBhc1xuYSBtYXRjaGFibGUgYnJhY2tldC4gVGhpcyBub2RlIHByb3AgYWxsb3dzIHlvdSB0byBkZWZpbmUsIGZvciBzdWNoXG5hIG5vZGUsIGEgXHUyMDE4aGFuZGxlXHUyMDE5XHUyMDE0dGhlIHBhcnQgb2YgdGhlIG5vZGUgdGhhdCBpcyBoaWdobGlnaHRlZCwgYW5kXG50aGF0IHRoZSBjdXJzb3IgbXVzdCBiZSBvbiB0byBhY3RpdmF0ZSBoaWdobGlnaHRpbmcgaW4gdGhlIGZpcnN0XG5wbGFjZS5cbiovXG5jb25zdCBicmFja2V0TWF0Y2hpbmdIYW5kbGUgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG5mdW5jdGlvbiBtYXRjaGluZ05vZGVzKG5vZGUsIGRpciwgYnJhY2tldHMpIHtcbiAgICBsZXQgYnlQcm9wID0gbm9kZS5wcm9wKGRpciA8IDAgPyBOb2RlUHJvcC5vcGVuZWRCeSA6IE5vZGVQcm9wLmNsb3NlZEJ5KTtcbiAgICBpZiAoYnlQcm9wKVxuICAgICAgICByZXR1cm4gYnlQcm9wO1xuICAgIGlmIChub2RlLm5hbWUubGVuZ3RoID09IDEpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gYnJhY2tldHMuaW5kZXhPZihub2RlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCAlIDIgPT0gKGRpciA8IDAgPyAxIDogMCkpXG4gICAgICAgICAgICByZXR1cm4gW2JyYWNrZXRzW2luZGV4ICsgZGlyXV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmluZEhhbmRsZShub2RlKSB7XG4gICAgbGV0IGhhc0hhbmRsZSA9IG5vZGUudHlwZS5wcm9wKGJyYWNrZXRNYXRjaGluZ0hhbmRsZSk7XG4gICAgcmV0dXJuIGhhc0hhbmRsZSA/IGhhc0hhbmRsZShub2RlLm5vZGUpIDogbm9kZTtcbn1cbi8qKlxuRmluZCB0aGUgbWF0Y2hpbmcgYnJhY2tldCBmb3IgdGhlIHRva2VuIGF0IGBwb3NgLCBzY2FubmluZ1xuZGlyZWN0aW9uIGBkaXJgLiBPbmx5IHRoZSBgYnJhY2tldHNgIGFuZCBgbWF4U2NhbkRpc3RhbmNlYFxucHJvcGVydGllcyBhcmUgdXNlZCBmcm9tIGBjb25maWdgLCBpZiBnaXZlbi4gUmV0dXJucyBudWxsIGlmIG5vXG5icmFja2V0IHdhcyBmb3VuZCBhdCBgcG9zYCwgb3IgYSBtYXRjaCByZXN1bHQgb3RoZXJ3aXNlLlxuKi9cbmZ1bmN0aW9uIG1hdGNoQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCBjb25maWcgPSB7fSkge1xuICAgIGxldCBtYXhTY2FuRGlzdGFuY2UgPSBjb25maWcubWF4U2NhbkRpc3RhbmNlIHx8IERlZmF1bHRTY2FuRGlzdCwgYnJhY2tldHMgPSBjb25maWcuYnJhY2tldHMgfHwgRGVmYXVsdEJyYWNrZXRzO1xuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSksIG5vZGUgPSB0cmVlLnJlc29sdmVJbm5lcihwb3MsIGRpcik7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZTsgY3VyOyBjdXIgPSBjdXIucGFyZW50KSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gbWF0Y2hpbmdOb2RlcyhjdXIudHlwZSwgZGlyLCBicmFja2V0cyk7XG4gICAgICAgIGlmIChtYXRjaGVzICYmIGN1ci5mcm9tIDwgY3VyLnRvKSB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gZmluZEhhbmRsZShjdXIpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZSAmJiAoZGlyID4gMCA/IHBvcyA+PSBoYW5kbGUuZnJvbSAmJiBwb3MgPCBoYW5kbGUudG8gOiBwb3MgPiBoYW5kbGUuZnJvbSAmJiBwb3MgPD0gaGFuZGxlLnRvKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hNYXJrZWRCcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIGN1ciwgaGFuZGxlLCBtYXRjaGVzLCBicmFja2V0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoUGxhaW5CcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIHRyZWUsIG5vZGUudHlwZSwgbWF4U2NhbkRpc3RhbmNlLCBicmFja2V0cyk7XG59XG5mdW5jdGlvbiBtYXRjaE1hcmtlZEJyYWNrZXRzKF9zdGF0ZSwgX3BvcywgZGlyLCB0b2tlbiwgaGFuZGxlLCBtYXRjaGluZywgYnJhY2tldHMpIHtcbiAgICBsZXQgcGFyZW50ID0gdG9rZW4ucGFyZW50LCBmaXJzdFRva2VuID0geyBmcm9tOiBoYW5kbGUuZnJvbSwgdG86IGhhbmRsZS50byB9O1xuICAgIGxldCBkZXB0aCA9IDAsIGN1cnNvciA9IHBhcmVudCA9PT0gbnVsbCB8fCBwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudC5jdXJzb3IoKTtcbiAgICBpZiAoY3Vyc29yICYmIChkaXIgPCAwID8gY3Vyc29yLmNoaWxkQmVmb3JlKHRva2VuLmZyb20pIDogY3Vyc29yLmNoaWxkQWZ0ZXIodG9rZW4udG8pKSlcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGRpciA8IDAgPyBjdXJzb3IudG8gPD0gdG9rZW4uZnJvbSA6IGN1cnNvci5mcm9tID49IHRva2VuLnRvKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDAgJiYgbWF0Y2hpbmcuaW5kZXhPZihjdXJzb3IudHlwZS5uYW1lKSA+IC0xICYmIGN1cnNvci5mcm9tIDwgY3Vyc29yLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmRIYW5kbGUgPSBmaW5kSGFuZGxlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBmaXJzdFRva2VuLCBlbmQ6IGVuZEhhbmRsZSA/IHsgZnJvbTogZW5kSGFuZGxlLmZyb20sIHRvOiBlbmRIYW5kbGUudG8gfSA6IHVuZGVmaW5lZCwgbWF0Y2hlZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaGluZ05vZGVzKGN1cnNvci50eXBlLCBkaXIsIGJyYWNrZXRzKSkge1xuICAgICAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaGluZ05vZGVzKGN1cnNvci50eXBlLCAtZGlyLCBicmFja2V0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRIYW5kbGUgPSBmaW5kSGFuZGxlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBmaXJzdFRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZW5kSGFuZGxlICYmIGVuZEhhbmRsZS5mcm9tIDwgZW5kSGFuZGxlLnRvID8geyBmcm9tOiBlbmRIYW5kbGUuZnJvbSwgdG86IGVuZEhhbmRsZS50byB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChkaXIgPCAwID8gY3Vyc29yLnByZXZTaWJsaW5nKCkgOiBjdXJzb3IubmV4dFNpYmxpbmcoKSk7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IGZpcnN0VG9rZW4sIG1hdGNoZWQ6IGZhbHNlIH07XG59XG5mdW5jdGlvbiBtYXRjaFBsYWluQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCB0cmVlLCB0b2tlblR5cGUsIG1heFNjYW5EaXN0YW5jZSwgYnJhY2tldHMpIHtcbiAgICBsZXQgc3RhcnRDaCA9IGRpciA8IDAgPyBzdGF0ZS5zbGljZURvYyhwb3MgLSAxLCBwb3MpIDogc3RhdGUuc2xpY2VEb2MocG9zLCBwb3MgKyAxKTtcbiAgICBsZXQgYnJhY2tldCA9IGJyYWNrZXRzLmluZGV4T2Yoc3RhcnRDaCk7XG4gICAgaWYgKGJyYWNrZXQgPCAwIHx8IChicmFja2V0ICUgMiA9PSAwKSAhPSAoZGlyID4gMCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzdGFydFRva2VuID0geyBmcm9tOiBkaXIgPCAwID8gcG9zIC0gMSA6IHBvcywgdG86IGRpciA+IDAgPyBwb3MgKyAxIDogcG9zIH07XG4gICAgbGV0IGl0ZXIgPSBzdGF0ZS5kb2MuaXRlclJhbmdlKHBvcywgZGlyID4gMCA/IHN0YXRlLmRvYy5sZW5ndGggOiAwKSwgZGVwdGggPSAwO1xuICAgIGZvciAobGV0IGRpc3RhbmNlID0gMDsgIShpdGVyLm5leHQoKSkuZG9uZSAmJiBkaXN0YW5jZSA8PSBtYXhTY2FuRGlzdGFuY2U7KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gaXRlci52YWx1ZTtcbiAgICAgICAgaWYgKGRpciA8IDApXG4gICAgICAgICAgICBkaXN0YW5jZSArPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgbGV0IGJhc2VQb3MgPSBwb3MgKyBkaXN0YW5jZSAqIGRpcjtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gZGlyID4gMCA/IDAgOiB0ZXh0Lmxlbmd0aCAtIDEsIGVuZCA9IGRpciA+IDAgPyB0ZXh0Lmxlbmd0aCA6IC0xOyBwb3MgIT0gZW5kOyBwb3MgKz0gZGlyKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBicmFja2V0cy5pbmRleE9mKHRleHRbcG9zXSk7XG4gICAgICAgICAgICBpZiAoZm91bmQgPCAwIHx8IHRyZWUucmVzb2x2ZUlubmVyKGJhc2VQb3MgKyBwb3MsIDEpLnR5cGUgIT0gdG9rZW5UeXBlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKChmb3VuZCAlIDIgPT0gMCkgPT0gKGRpciA+IDApKSB7XG4gICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRlcHRoID09IDEpIHsgLy8gQ2xvc2luZ1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydFRva2VuLCBlbmQ6IHsgZnJvbTogYmFzZVBvcyArIHBvcywgdG86IGJhc2VQb3MgKyBwb3MgKyAxIH0sIG1hdGNoZWQ6IChmb3VuZCA+PiAxKSA9PSAoYnJhY2tldCA+PiAxKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyID4gMClcbiAgICAgICAgICAgIGRpc3RhbmNlICs9IHRleHQubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gaXRlci5kb25lID8geyBzdGFydDogc3RhcnRUb2tlbiwgbWF0Y2hlZDogZmFsc2UgfSA6IG51bGw7XG59XG5cbi8vIENvdW50cyB0aGUgY29sdW1uIG9mZnNldCBpbiBhIHN0cmluZywgdGFraW5nIHRhYnMgaW50byBhY2NvdW50LlxuLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi5cbmZ1bmN0aW9uIGNvdW50Q29sKHN0cmluZywgZW5kLCB0YWJTaXplLCBzdGFydEluZGV4ID0gMCwgc3RhcnRWYWx1ZSA9IDApIHtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgICAgZW5kID0gc3RyaW5nLnNlYXJjaCgvW15cXHNcXHUwMGEwXS8pO1xuICAgICAgICBpZiAoZW5kID09IC0xKVxuICAgICAgICAgICAgZW5kID0gc3RyaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgbGV0IG4gPSBzdGFydFZhbHVlO1xuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KGkpID09IDkpXG4gICAgICAgICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuKys7XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuLyoqXG5FbmNhcHN1bGF0ZXMgYSBzaW5nbGUgbGluZSBvZiBpbnB1dC4gR2l2ZW4gdG8gc3RyZWFtIHN5bnRheCBjb2RlLFxud2hpY2ggdXNlcyBpdCB0byB0b2tlbml6ZSB0aGUgY29udGVudC5cbiovXG5jbGFzcyBTdHJpbmdTdHJlYW0ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHN0cmVhbS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsaW5lLlxuICAgICovXG4gICAgc3RyaW5nLCB0YWJTaXplLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBpbmRlbnQgdW5pdCBzaXplLlxuICAgICovXG4gICAgaW5kZW50VW5pdCwgb3ZlcnJpZGVJbmRlbnQpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgICAgIHRoaXMudGFiU2l6ZSA9IHRhYlNpemU7XG4gICAgICAgIHRoaXMuaW5kZW50VW5pdCA9IGluZGVudFVuaXQ7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVJbmRlbnQgPSBvdmVycmlkZUluZGVudDtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBsaW5lLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhcnQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBlb2woKSB7IHJldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBzb2woKSB7IHJldHVybiB0aGlzLnBvcyA9PSAwOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBuZXh0IGNvZGUgdW5pdCBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbiwgb3IgdW5kZWZpbmVkXG4gICAgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHBlZWsoKSB7IHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpIHx8IHVuZGVmaW5lZDsgfVxuICAgIC8qKlxuICAgIFJlYWQgdGhlIG5leHQgY29kZSB1bml0IGFuZCBhZHZhbmNlIGB0aGlzLnBvc2AuXG4gICAgKi9cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPCB0aGlzLnN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCB0aGUgbmV4dCBjaGFyYWN0ZXIgYWdhaW5zdCB0aGUgZ2l2ZW4gc3RyaW5nLCByZWd1bGFyXG4gICAgZXhwcmVzc2lvbiwgb3IgcHJlZGljYXRlLiBDb25zdW1lIGFuZCByZXR1cm4gaXQgaWYgaXQgbWF0Y2hlcy5cbiAgICAqL1xuICAgIGVhdChtYXRjaCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpO1xuICAgICAgICBsZXQgb2s7XG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIG9rID0gY2ggPT0gbWF0Y2g7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9rID0gY2ggJiYgKG1hdGNoIGluc3RhbmNlb2YgUmVnRXhwID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpO1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ29udGludWUgbWF0Y2hpbmcgY2hhcmFjdGVycyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBzdHJpbmcsXG4gICAgcmVndWxhciBleHByZXNzaW9uLCBvciBwcmVkaWNhdGUgZnVuY3Rpb24uIFJldHVybiB0cnVlIGlmIGFueVxuICAgIGNoYXJhY3RlcnMgd2VyZSBjb25zdW1lZC5cbiAgICAqL1xuICAgIGVhdFdoaWxlKG1hdGNoKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgICAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKSB7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnN1bWUgd2hpdGVzcGFjZSBhaGVhZCBvZiBgdGhpcy5wb3NgLiBSZXR1cm4gdHJ1ZSBpZiBhbnkgd2FzXG4gICAgZm91bmQuXG4gICAgKi9cbiAgICBlYXRTcGFjZSgpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICgvW1xcc1xcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKVxuICAgICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHNraXBUb0VuZCgpIHsgdGhpcy5wb3MgPSB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIGRpcmVjdGx5IGJlZm9yZSB0aGUgZ2l2ZW4gY2hhcmFjdGVyLCBpZiBmb3VuZCBvbiB0aGVcbiAgICBjdXJyZW50IGxpbmUuXG4gICAgKi9cbiAgICBza2lwVG8oY2gpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpO1xuICAgICAgICBpZiAoZm91bmQgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBmb3VuZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYmFjayBgbmAgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIGJhY2tVcChuKSB7IHRoaXMucG9zIC09IG47IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbHVtbiBwb3NpdGlvbiBhdCBgdGhpcy5wb3NgLlxuICAgICovXG4gICAgY29sdW1uKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0Q29sdW1uUG9zIDwgdGhpcy5zdGFydCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSBjb3VudENvbCh0aGlzLnN0cmluZywgdGhpcy5zdGFydCwgdGhpcy50YWJTaXplLCB0aGlzLmxhc3RDb2x1bW5Qb3MsIHRoaXMubGFzdENvbHVtblZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubGFzdENvbHVtblBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdENvbHVtblZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGluZGVudGF0aW9uIGNvbHVtbiBvZiB0aGUgY3VycmVudCBsaW5lLlxuICAgICovXG4gICAgaW5kZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMub3ZlcnJpZGVJbmRlbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvdW50Q29sKHRoaXMuc3RyaW5nLCBudWxsLCB0aGlzLnRhYlNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCB0aGUgaW5wdXQgYWdhaW5zdCB0aGUgZ2l2ZW4gc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgICh3aGljaCBzaG91bGQgc3RhcnQgd2l0aCBhIGBeYCkuIFJldHVybiB0cnVlIG9yIHRoZSByZWdleHAgbWF0Y2hcbiAgICBpZiBpdCBtYXRjaGVzLlxuICAgIFxuICAgIFVubGVzcyBgY29uc3VtZWAgaXMgc2V0IHRvIGBmYWxzZWAsIHRoaXMgd2lsbCBtb3ZlIGB0aGlzLnBvc2BcbiAgICBwYXN0IHRoZSBtYXRjaGVkIHRleHQuXG4gICAgXG4gICAgV2hlbiBtYXRjaGluZyBhIHN0cmluZyBgY2FzZUluc2Vuc2l0aXZlYCBjYW4gYmUgc2V0IHRvIHRydWUgdG9cbiAgICBtYWtlIHRoZSBtYXRjaCBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICovXG4gICAgbWF0Y2gocGF0dGVybiwgY29uc3VtZSwgY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgY2FzZWQgPSAoc3RyKSA9PiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjtcbiAgICAgICAgICAgIGxldCBzdWJzdHIgPSB0aGlzLnN0cmluZy5zdWJzdHIodGhpcy5wb3MsIHBhdHRlcm4ubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChjYXNlZChzdWJzdHIpID09IGNhc2VkKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgY29uc3VtZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY3VycmVudCB0b2tlbi5cbiAgICAqL1xuICAgIGN1cnJlbnQoKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyk7IH1cbn1cblxuZnVuY3Rpb24gZnVsbFBhcnNlcihzcGVjKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogc3BlYy5uYW1lIHx8IFwiXCIsXG4gICAgICAgIHRva2VuOiBzcGVjLnRva2VuLFxuICAgICAgICBibGFua0xpbmU6IHNwZWMuYmxhbmtMaW5lIHx8ICgoKSA9PiB7IH0pLFxuICAgICAgICBzdGFydFN0YXRlOiBzcGVjLnN0YXJ0U3RhdGUgfHwgKCgpID0+IHRydWUpLFxuICAgICAgICBjb3B5U3RhdGU6IHNwZWMuY29weVN0YXRlIHx8IGRlZmF1bHRDb3B5U3RhdGUsXG4gICAgICAgIGluZGVudDogc3BlYy5pbmRlbnQgfHwgKCgpID0+IG51bGwpLFxuICAgICAgICBsYW5ndWFnZURhdGE6IHNwZWMubGFuZ3VhZ2VEYXRhIHx8IHt9LFxuICAgICAgICB0b2tlblRhYmxlOiBzcGVjLnRva2VuVGFibGUgfHwgbm9Ub2tlbnNcbiAgICB9O1xufVxuZnVuY3Rpb24gZGVmYXVsdENvcHlTdGF0ZShzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgIT0gXCJvYmplY3RcIilcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIGxldCBuZXdTdGF0ZSA9IHt9O1xuICAgIGZvciAobGV0IHByb3AgaW4gc3RhdGUpIHtcbiAgICAgICAgbGV0IHZhbCA9IHN0YXRlW3Byb3BdO1xuICAgICAgICBuZXdTdGF0ZVtwcm9wXSA9ICh2YWwgaW5zdGFuY2VvZiBBcnJheSA/IHZhbC5zbGljZSgpIDogdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xufVxuY29uc3QgSW5kZW50ZWRGcm9tID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4vKipcbkEgW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSBjbGFzcyBiYXNlZCBvbiBhIENvZGVNaXJyb3JcbjUtc3R5bGUgW3N0cmVhbWluZyBwYXJzZXJdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuU3RyZWFtUGFyc2VyKS5cbiovXG5jbGFzcyBTdHJlYW1MYW5ndWFnZSBleHRlbmRzIExhbmd1YWdlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBkZWZpbmVMYW5ndWFnZUZhY2V0KHBhcnNlci5sYW5ndWFnZURhdGEpO1xuICAgICAgICBsZXQgcCA9IGZ1bGxQYXJzZXIocGFyc2VyKSwgc2VsZjtcbiAgICAgICAgbGV0IGltcGwgPSBuZXcgY2xhc3MgZXh0ZW5kcyBQYXJzZXIge1xuICAgICAgICAgICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZShzZWxmLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihkYXRhLCBpbXBsLCBbaW5kZW50U2VydmljZS5vZigoY3gsIHBvcykgPT4gdGhpcy5nZXRJbmRlbnQoY3gsIHBvcykpXSwgcGFyc2VyLm5hbWUpO1xuICAgICAgICB0aGlzLnRvcE5vZGUgPSBkb2NJRChkYXRhKTtcbiAgICAgICAgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3RyZWFtUGFyc2VyID0gcDtcbiAgICAgICAgdGhpcy5zdGF0ZUFmdGVyID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy50b2tlblRhYmxlID0gcGFyc2VyLnRva2VuVGFibGUgPyBuZXcgVG9rZW5UYWJsZShwLnRva2VuVGFibGUpIDogZGVmYXVsdFRva2VuVGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHN0cmVhbSBsYW5ndWFnZS5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYykgeyByZXR1cm4gbmV3IFN0cmVhbUxhbmd1YWdlKHNwZWMpOyB9XG4gICAgZ2V0SW5kZW50KGN4LCBwb3MpIHtcbiAgICAgICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKGN4LnN0YXRlKSwgYXQgPSB0cmVlLnJlc29sdmUocG9zKTtcbiAgICAgICAgd2hpbGUgKGF0ICYmIGF0LnR5cGUgIT0gdGhpcy50b3BOb2RlKVxuICAgICAgICAgICAgYXQgPSBhdC5wYXJlbnQ7XG4gICAgICAgIGlmICghYXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGZyb20gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB7IG92ZXJyaWRlSW5kZW50YXRpb24gfSA9IGN4Lm9wdGlvbnM7XG4gICAgICAgIGlmIChvdmVycmlkZUluZGVudGF0aW9uKSB7XG4gICAgICAgICAgICBmcm9tID0gSW5kZW50ZWRGcm9tLmdldChjeC5zdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZnJvbSAhPSBudWxsICYmIGZyb20gPCBwb3MgLSAxZTQpXG4gICAgICAgICAgICAgICAgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBmaW5kU3RhdGUodGhpcywgdHJlZSwgMCwgYXQuZnJvbSwgZnJvbSAhPT0gbnVsbCAmJiBmcm9tICE9PSB2b2lkIDAgPyBmcm9tIDogcG9zKSwgc3RhdGVQb3MsIHN0YXRlO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gc3RhcnQuc3RhdGU7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IHN0YXJ0LnBvcyArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHRoaXMuc3RyZWFtUGFyc2VyLnN0YXJ0U3RhdGUoY3gudW5pdCk7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyAtIHN0YXRlUG9zID4gMTAwMDAgLyogQy5NYXhJbmRlbnRTY2FuRGlzdCAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAoc3RhdGVQb3MgPCBwb3MpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gY3guc3RhdGUuZG9jLmxpbmVBdChzdGF0ZVBvcyksIGVuZCA9IE1hdGgubWluKHBvcywgbGluZS50byk7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZW50YXRpb24gPSBvdmVycmlkZUluZGVudGF0aW9uID8gb3ZlcnJpZGVJbmRlbnRhdGlvbihsaW5lLmZyb20pIDogLTE7XG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZS50ZXh0LCBjeC5zdGF0ZS50YWJTaXplLCBjeC51bml0LCBpbmRlbnRhdGlvbiA8IDAgPyB1bmRlZmluZWQgOiBpbmRlbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBlbmQgLSBsaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHJlYWRUb2tlbih0aGlzLnN0cmVhbVBhcnNlci50b2tlbiwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbVBhcnNlci5ibGFua0xpbmUoc3RhdGUsIGN4LnVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZCA9PSBwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lID0gY3gubGluZUF0KHBvcyk7XG4gICAgICAgIGlmIChvdmVycmlkZUluZGVudGF0aW9uICYmIGZyb20gPT0gbnVsbClcbiAgICAgICAgICAgIEluZGVudGVkRnJvbS5zZXQoY3guc3RhdGUsIGxpbmUuZnJvbSk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbVBhcnNlci5pbmRlbnQoc3RhdGUsIC9eXFxzKiguKikvLmV4ZWMobGluZS50ZXh0KVsxXSwgY3gpO1xuICAgIH1cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5mdW5jdGlvbiBmaW5kU3RhdGUobGFuZywgdHJlZSwgb2ZmLCBzdGFydFBvcywgYmVmb3JlKSB7XG4gICAgbGV0IHN0YXRlID0gb2ZmID49IHN0YXJ0UG9zICYmIG9mZiArIHRyZWUubGVuZ3RoIDw9IGJlZm9yZSAmJiB0cmVlLnByb3AobGFuZy5zdGF0ZUFmdGVyKTtcbiAgICBpZiAoc3RhdGUpXG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBsYW5nLnN0cmVhbVBhcnNlci5jb3B5U3RhdGUoc3RhdGUpLCBwb3M6IG9mZiArIHRyZWUubGVuZ3RoIH07XG4gICAgZm9yIChsZXQgaSA9IHRyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGNoaWxkID0gdHJlZS5jaGlsZHJlbltpXSwgcG9zID0gb2ZmICsgdHJlZS5wb3NpdGlvbnNbaV07XG4gICAgICAgIGxldCBmb3VuZCA9IGNoaWxkIGluc3RhbmNlb2YgVHJlZSAmJiBwb3MgPCBiZWZvcmUgJiYgZmluZFN0YXRlKGxhbmcsIGNoaWxkLCBwb3MsIHN0YXJ0UG9zLCBiZWZvcmUpO1xuICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY3V0VHJlZShsYW5nLCB0cmVlLCBmcm9tLCB0bywgaW5zaWRlKSB7XG4gICAgaWYgKGluc2lkZSAmJiBmcm9tIDw9IDAgJiYgdG8gPj0gdHJlZS5sZW5ndGgpXG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIGlmICghaW5zaWRlICYmIHRyZWUudHlwZSA9PSBsYW5nLnRvcE5vZGUpXG4gICAgICAgIGluc2lkZSA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IHRyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IHBvcyA9IHRyZWUucG9zaXRpb25zW2ldLCBjaGlsZCA9IHRyZWUuY2hpbGRyZW5baV0sIGlubmVyO1xuICAgICAgICBpZiAocG9zIDwgdG8gJiYgY2hpbGQgaW5zdGFuY2VvZiBUcmVlKSB7XG4gICAgICAgICAgICBpZiAoIShpbm5lciA9IGN1dFRyZWUobGFuZywgY2hpbGQsIGZyb20gLSBwb3MsIHRvIC0gcG9zLCBpbnNpZGUpKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHJldHVybiAhaW5zaWRlID8gaW5uZXJcbiAgICAgICAgICAgICAgICA6IG5ldyBUcmVlKHRyZWUudHlwZSwgdHJlZS5jaGlsZHJlbi5zbGljZSgwLCBpKS5jb25jYXQoaW5uZXIpLCB0cmVlLnBvc2l0aW9ucy5zbGljZSgwLCBpICsgMSksIHBvcyArIGlubmVyLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBmaW5kU3RhcnRJbkZyYWdtZW50cyhsYW5nLCBmcmFnbWVudHMsIHN0YXJ0UG9zLCBlZGl0b3JTdGF0ZSkge1xuICAgIGZvciAobGV0IGYgb2YgZnJhZ21lbnRzKSB7XG4gICAgICAgIGxldCBmcm9tID0gZi5mcm9tICsgKGYub3BlblN0YXJ0ID8gMjUgOiAwKSwgdG8gPSBmLnRvIC0gKGYub3BlbkVuZCA/IDI1IDogMCk7XG4gICAgICAgIGxldCBmb3VuZCA9IGZyb20gPD0gc3RhcnRQb3MgJiYgdG8gPiBzdGFydFBvcyAmJiBmaW5kU3RhdGUobGFuZywgZi50cmVlLCAwIC0gZi5vZmZzZXQsIHN0YXJ0UG9zLCB0byksIHRyZWU7XG4gICAgICAgIGlmIChmb3VuZCAmJiAodHJlZSA9IGN1dFRyZWUobGFuZywgZi50cmVlLCBzdGFydFBvcyArIGYub2Zmc2V0LCBmb3VuZC5wb3MgKyBmLm9mZnNldCwgZmFsc2UpKSlcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBmb3VuZC5zdGF0ZSwgdHJlZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdGF0ZTogbGFuZy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShlZGl0b3JTdGF0ZSA/IGdldEluZGVudFVuaXQoZWRpdG9yU3RhdGUpIDogNCksIHRyZWU6IFRyZWUuZW1wdHkgfTtcbn1cbmNsYXNzIFBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihsYW5nLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5sYW5nID0gbGFuZztcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtSZXVzZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMudG8gPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICBsZXQgY29udGV4dCA9IFBhcnNlQ29udGV4dC5nZXQoKSwgZnJvbSA9IHJhbmdlc1swXS5mcm9tO1xuICAgICAgICBsZXQgeyBzdGF0ZSwgdHJlZSB9ID0gZmluZFN0YXJ0SW5GcmFnbWVudHMobGFuZywgZnJhZ21lbnRzLCBmcm9tLCBjb250ZXh0ID09PSBudWxsIHx8IGNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbnRleHQuc3RhdGUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMucGFyc2VkUG9zID0gdGhpcy5jaHVua1N0YXJ0ID0gZnJvbSArIHRyZWUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyZWUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtzLnB1c2godHJlZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2godHJlZS5wb3NpdGlvbnNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0ICYmIHRoaXMucGFyc2VkUG9zIDwgY29udGV4dC52aWV3cG9ydC5mcm9tIC0gMTAwMDAwIC8qIEMuTWF4RGlzdGFuY2VCZWZvcmVWaWV3cG9ydCAqLykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMubGFuZy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShnZXRJbmRlbnRVbml0KGNvbnRleHQuc3RhdGUpKTtcbiAgICAgICAgICAgIGNvbnRleHQuc2tpcFVudGlsSW5WaWV3KHRoaXMucGFyc2VkUG9zLCBjb250ZXh0LnZpZXdwb3J0LmZyb20pO1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSBjb250ZXh0LnZpZXdwb3J0LmZyb207XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb3ZlUmFuZ2VJbmRleCgpO1xuICAgIH1cbiAgICBhZHZhbmNlKCkge1xuICAgICAgICBsZXQgY29udGV4dCA9IFBhcnNlQ29udGV4dC5nZXQoKTtcbiAgICAgICAgbGV0IHBhcnNlRW5kID0gdGhpcy5zdG9wcGVkQXQgPT0gbnVsbCA/IHRoaXMudG8gOiBNYXRoLm1pbih0aGlzLnRvLCB0aGlzLnN0b3BwZWRBdCk7XG4gICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbihwYXJzZUVuZCwgdGhpcy5jaHVua1N0YXJ0ICsgMjA0OCAvKiBDLkNodW5rU2l6ZSAqLyk7XG4gICAgICAgIGlmIChjb250ZXh0KVxuICAgICAgICAgICAgZW5kID0gTWF0aC5taW4oZW5kLCBjb250ZXh0LnZpZXdwb3J0LnRvKTtcbiAgICAgICAgd2hpbGUgKHRoaXMucGFyc2VkUG9zIDwgZW5kKVxuICAgICAgICAgICAgdGhpcy5wYXJzZUxpbmUoY29udGV4dCk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rU3RhcnQgPCB0aGlzLnBhcnNlZFBvcylcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQ2h1bmsoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUG9zID49IHBhcnNlRW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoKCk7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIHRoaXMucGFyc2VkUG9zID49IGNvbnRleHQudmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2tpcFVudGlsSW5WaWV3KHRoaXMucGFyc2VkUG9zLCBwYXJzZUVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3RvcEF0KHBvcykge1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IHBvcztcbiAgICB9XG4gICAgbGluZUFmdGVyKHBvcykge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmlucHV0LmNodW5rKHBvcyk7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dC5saW5lQ2h1bmtzKSB7XG4gICAgICAgICAgICBsZXQgZW9sID0gY2h1bmsuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgICAgIGlmIChlb2wgPiAtMSlcbiAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rLnNsaWNlKDAsIGVvbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2h1bmsgPT0gXCJcXG5cIikge1xuICAgICAgICAgICAgY2h1bmsgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3MgKyBjaHVuay5sZW5ndGggPD0gdGhpcy50byA/IGNodW5rIDogY2h1bmsuc2xpY2UoMCwgdGhpcy50byAtIHBvcyk7XG4gICAgfVxuICAgIG5leHRMaW5lKCkge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMucGFyc2VkUG9zLCBsaW5lID0gdGhpcy5saW5lQWZ0ZXIoZnJvbSksIGVuZCA9IGZyb20gKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLnJhbmdlSW5kZXg7Oykge1xuICAgICAgICAgICAgbGV0IHJhbmdlRW5kID0gdGhpcy5yYW5nZXNbaW5kZXhdLnRvO1xuICAgICAgICAgICAgaWYgKHJhbmdlRW5kID49IGVuZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKDAsIHJhbmdlRW5kIC0gKGVuZCAtIGxpbmUubGVuZ3RoKSk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IHRoaXMucmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCByYW5nZVN0YXJ0ID0gdGhpcy5yYW5nZXNbaW5kZXhdLmZyb207XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmxpbmVBZnRlcihyYW5nZVN0YXJ0KTtcbiAgICAgICAgICAgIGxpbmUgKz0gYWZ0ZXI7XG4gICAgICAgICAgICBlbmQgPSByYW5nZVN0YXJ0ICsgYWZ0ZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGVuZCB9O1xuICAgIH1cbiAgICBza2lwR2Fwc1RvKHBvcywgb2Zmc2V0LCBzaWRlKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXhdLnRvLCBvZmZQb3MgPSBwb3MgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoc2lkZSA+IDAgPyBlbmQgPiBvZmZQb3MgOiBlbmQgPj0gb2ZmUG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbKyt0aGlzLnJhbmdlSW5kZXhdLmZyb207XG4gICAgICAgICAgICBvZmZzZXQgKz0gc3RhcnQgLSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgbW92ZVJhbmdlSW5kZXgoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXhdLnRvIDwgdGhpcy5wYXJzZWRQb3MpXG4gICAgICAgICAgICB0aGlzLnJhbmdlSW5kZXgrKztcbiAgICB9XG4gICAgZW1pdFRva2VuKGlkLCBmcm9tLCB0bywgc2l6ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnNraXBHYXBzVG8oZnJvbSwgb2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIGZyb20gKz0gb2Zmc2V0O1xuICAgICAgICAgICAgbGV0IGxlbjAgPSB0aGlzLmNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuc2tpcEdhcHNUbyh0bywgb2Zmc2V0LCAtMSk7XG4gICAgICAgICAgICB0byArPSBvZmZzZXQ7XG4gICAgICAgICAgICBzaXplICs9IHRoaXMuY2h1bmsubGVuZ3RoIC0gbGVuMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNodW5rLnB1c2goaWQsIGZyb20sIHRvLCBzaXplKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgcGFyc2VMaW5lKGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHsgbGluZSwgZW5kIH0gPSB0aGlzLm5leHRMaW5lKCksIG9mZnNldCA9IDAsIHsgc3RyZWFtUGFyc2VyIH0gPSB0aGlzLmxhbmc7XG4gICAgICAgIGxldCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGxpbmUsIGNvbnRleHQgPyBjb250ZXh0LnN0YXRlLnRhYlNpemUgOiA0LCBjb250ZXh0ID8gZ2V0SW5kZW50VW5pdChjb250ZXh0LnN0YXRlKSA6IDIpO1xuICAgICAgICBpZiAoc3RyZWFtLmVvbCgpKSB7XG4gICAgICAgICAgICBzdHJlYW1QYXJzZXIuYmxhbmtMaW5lKHRoaXMuc3RhdGUsIHN0cmVhbS5pbmRlbnRVbml0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRva2VuID0gcmVhZFRva2VuKHN0cmVhbVBhcnNlci50b2tlbiwgc3RyZWFtLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4pXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZW1pdFRva2VuKHRoaXMubGFuZy50b2tlblRhYmxlLnJlc29sdmUodG9rZW4pLCB0aGlzLnBhcnNlZFBvcyArIHN0cmVhbS5zdGFydCwgdGhpcy5wYXJzZWRQb3MgKyBzdHJlYW0ucG9zLCA0LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uc3RhcnQgPiAxMDAwMCAvKiBDLk1heExpbmVMZW5ndGggKi8pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyc2VkUG9zID0gZW5kO1xuICAgICAgICB0aGlzLm1vdmVSYW5nZUluZGV4KCk7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlZFBvcyA8IHRoaXMudG8pXG4gICAgICAgICAgICB0aGlzLnBhcnNlZFBvcysrO1xuICAgIH1cbiAgICBmaW5pc2hDaHVuaygpIHtcbiAgICAgICAgbGV0IHRyZWUgPSBUcmVlLmJ1aWxkKHtcbiAgICAgICAgICAgIGJ1ZmZlcjogdGhpcy5jaHVuayxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNodW5rU3RhcnQsXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMucGFyc2VkUG9zIC0gdGhpcy5jaHVua1N0YXJ0LFxuICAgICAgICAgICAgbm9kZVNldCxcbiAgICAgICAgICAgIHRvcElEOiAwLFxuICAgICAgICAgICAgbWF4QnVmZmVyTGVuZ3RoOiAyMDQ4IC8qIEMuQ2h1bmtTaXplICovLFxuICAgICAgICAgICAgcmV1c2VkOiB0aGlzLmNodW5rUmV1c2VkXG4gICAgICAgIH0pO1xuICAgICAgICB0cmVlID0gbmV3IFRyZWUodHJlZS50eXBlLCB0cmVlLmNoaWxkcmVuLCB0cmVlLnBvc2l0aW9ucywgdHJlZS5sZW5ndGgsIFtbdGhpcy5sYW5nLnN0YXRlQWZ0ZXIsIHRoaXMubGFuZy5zdHJlYW1QYXJzZXIuY29weVN0YXRlKHRoaXMuc3RhdGUpXV0pO1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKHRyZWUpO1xuICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2godGhpcy5jaHVua1N0YXJ0IC0gdGhpcy5yYW5nZXNbMF0uZnJvbSk7XG4gICAgICAgIHRoaXMuY2h1bmsgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1JldXNlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jaHVua1N0YXJ0ID0gdGhpcy5wYXJzZWRQb3M7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlKHRoaXMubGFuZy50b3BOb2RlLCB0aGlzLmNodW5rcywgdGhpcy5jaHVua1BvcywgdGhpcy5wYXJzZWRQb3MgLSB0aGlzLnJhbmdlc1swXS5mcm9tKS5iYWxhbmNlKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVhZFRva2VuKHRva2VuLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRva2VuKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHN0cmVhbS5zdGFydClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlN0cmVhbSBwYXJzZXIgZmFpbGVkIHRvIGFkdmFuY2Ugc3RyZWFtLlwiKTtcbn1cbmNvbnN0IG5vVG9rZW5zID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCB0eXBlQXJyYXkgPSBbTm9kZVR5cGUubm9uZV07XG5jb25zdCBub2RlU2V0ID0gLypAX19QVVJFX18qL25ldyBOb2RlU2V0KHR5cGVBcnJheSk7XG5jb25zdCB3YXJuZWQgPSBbXTtcbi8vIENhY2hlIG9mIG5vZGUgdHlwZXMgYnkgbmFtZSBhbmQgdGFnc1xuY29uc3QgYnlUYWcgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKTtcbmNvbnN0IGRlZmF1bHRUYWJsZSA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuZm9yIChsZXQgW2xlZ2FjeU5hbWUsIG5hbWVdIG9mIFtcbiAgICBbXCJ2YXJpYWJsZVwiLCBcInZhcmlhYmxlTmFtZVwiXSxcbiAgICBbXCJ2YXJpYWJsZS0yXCIsIFwidmFyaWFibGVOYW1lLnNwZWNpYWxcIl0sXG4gICAgW1wic3RyaW5nLTJcIiwgXCJzdHJpbmcuc3BlY2lhbFwiXSxcbiAgICBbXCJkZWZcIiwgXCJ2YXJpYWJsZU5hbWUuZGVmaW5pdGlvblwiXSxcbiAgICBbXCJ0YWdcIiwgXCJ0YWdOYW1lXCJdLFxuICAgIFtcImF0dHJpYnV0ZVwiLCBcImF0dHJpYnV0ZU5hbWVcIl0sXG4gICAgW1widHlwZVwiLCBcInR5cGVOYW1lXCJdLFxuICAgIFtcImJ1aWx0aW5cIiwgXCJ2YXJpYWJsZU5hbWUuc3RhbmRhcmRcIl0sXG4gICAgW1wicXVhbGlmaWVyXCIsIFwibW9kaWZpZXJcIl0sXG4gICAgW1wiZXJyb3JcIiwgXCJpbnZhbGlkXCJdLFxuICAgIFtcImhlYWRlclwiLCBcImhlYWRpbmdcIl0sXG4gICAgW1wicHJvcGVydHlcIiwgXCJwcm9wZXJ0eU5hbWVcIl1cbl0pXG4gICAgZGVmYXVsdFRhYmxlW2xlZ2FjeU5hbWVdID0gLypAX19QVVJFX18qL2NyZWF0ZVRva2VuVHlwZShub1Rva2VucywgbmFtZSk7XG5jbGFzcyBUb2tlblRhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihleHRyYSkge1xuICAgICAgICB0aGlzLmV4dHJhID0gZXh0cmE7XG4gICAgICAgIHRoaXMudGFibGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIGRlZmF1bHRUYWJsZSk7XG4gICAgfVxuICAgIHJlc29sdmUodGFnKSB7XG4gICAgICAgIHJldHVybiAhdGFnID8gMCA6IHRoaXMudGFibGVbdGFnXSB8fCAodGhpcy50YWJsZVt0YWddID0gY3JlYXRlVG9rZW5UeXBlKHRoaXMuZXh0cmEsIHRhZykpO1xuICAgIH1cbn1cbmNvbnN0IGRlZmF1bHRUb2tlblRhYmxlID0gLypAX19QVVJFX18qL25ldyBUb2tlblRhYmxlKG5vVG9rZW5zKTtcbmZ1bmN0aW9uIHdhcm5Gb3JQYXJ0KHBhcnQsIG1zZykge1xuICAgIGlmICh3YXJuZWQuaW5kZXhPZihwYXJ0KSA+IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgd2FybmVkLnB1c2gocGFydCk7XG4gICAgY29uc29sZS53YXJuKG1zZyk7XG59XG5mdW5jdGlvbiBjcmVhdGVUb2tlblR5cGUoZXh0cmEsIHRhZ1N0cikge1xuICAgIGxldCB0YWdzJDEgPSBbXTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIHRhZ1N0ci5zcGxpdChcIiBcIikpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gW107XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgbmFtZS5zcGxpdChcIi5cIikpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IChleHRyYVtwYXJ0XSB8fCB0YWdzW3BhcnRdKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB3YXJuRm9yUGFydChwYXJ0LCBgVW5rbm93biBoaWdobGlnaHRpbmcgdGFnICR7cGFydH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgd2FybkZvclBhcnQocGFydCwgYE1vZGlmaWVyICR7cGFydH0gdXNlZCBhdCBzdGFydCBvZiB0YWdgKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZm91bmQubWFwKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQYXJ0KHBhcnQsIGBUYWcgJHtwYXJ0fSB1c2VkIGFzIG1vZGlmaWVyYCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHRhZyBvZiBmb3VuZClcbiAgICAgICAgICAgIHRhZ3MkMS5wdXNoKHRhZyk7XG4gICAgfVxuICAgIGlmICghdGFncyQxLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgbGV0IG5hbWUgPSB0YWdTdHIucmVwbGFjZSgvIC9nLCBcIl9cIiksIGtleSA9IG5hbWUgKyBcIiBcIiArIHRhZ3MkMS5tYXAodCA9PiB0LmlkKTtcbiAgICBsZXQga25vd24gPSBieVRhZ1trZXldO1xuICAgIGlmIChrbm93bilcbiAgICAgICAgcmV0dXJuIGtub3duLmlkO1xuICAgIGxldCB0eXBlID0gYnlUYWdba2V5XSA9IE5vZGVUeXBlLmRlZmluZSh7XG4gICAgICAgIGlkOiB0eXBlQXJyYXkubGVuZ3RoLFxuICAgICAgICBuYW1lLFxuICAgICAgICBwcm9wczogW3N0eWxlVGFncyh7IFtuYW1lXTogdGFncyQxIH0pXVxuICAgIH0pO1xuICAgIHR5cGVBcnJheS5wdXNoKHR5cGUpO1xuICAgIHJldHVybiB0eXBlLmlkO1xufVxuZnVuY3Rpb24gZG9jSUQoZGF0YSkge1xuICAgIGxldCB0eXBlID0gTm9kZVR5cGUuZGVmaW5lKHsgaWQ6IHR5cGVBcnJheS5sZW5ndGgsIG5hbWU6IFwiRG9jdW1lbnRcIiwgcHJvcHM6IFtsYW5ndWFnZURhdGFQcm9wLmFkZCgoKSA9PiBkYXRhKV0sIHRvcDogdHJ1ZSB9KTtcbiAgICB0eXBlQXJyYXkucHVzaCh0eXBlKTtcbiAgICByZXR1cm4gdHlwZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRGb3JMaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gbGluZS5sZW5ndGggPD0gNDA5NiAmJiAvW1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTA3MDAtXFx1MDhhY1xcdWZiNTAtXFx1ZmRmZl0vLnRlc3QobGluZSk7XG59XG5mdW5jdGlvbiB0ZXh0SGFzUlRMKHRleHQpIHtcbiAgICBmb3IgKGxldCBpID0gdGV4dC5pdGVyKCk7ICFpLm5leHQoKS5kb25lOylcbiAgICAgICAgaWYgKGJ1aWxkRm9yTGluZShpLnZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNoYW5nZUFkZHNSVEwoY2hhbmdlKSB7XG4gICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgY2hhbmdlLml0ZXJDaGFuZ2VzKChmQSwgdEEsIGZCLCB0QiwgaW5zKSA9PiB7XG4gICAgICAgIGlmICghYWRkZWQgJiYgdGV4dEhhc1JUTChpbnMpKVxuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiBhZGRlZDtcbn1cbmNvbnN0IGFsd2F5c0lzb2xhdGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHggPT4geCkgfSk7XG4vKipcbk1ha2Ugc3VyZSBub2Rlc1xuW21hcmtlZF0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbW9uLk5vZGVQcm9wXmlzb2xhdGUpXG5hcyBpc29sYXRpbmcgZm9yIGJpZGlyZWN0aW9uYWwgdGV4dCBhcmUgcmVuZGVyZWQgaW4gYSB3YXkgdGhhdFxuaXNvbGF0ZXMgdGhlbSBmcm9tIHRoZSBzdXJyb3VuZGluZyB0ZXh0LlxuKi9cbmZ1bmN0aW9uIGJpZGlJc29sYXRlcyhvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZXh0ZW5zaW9ucyA9IFtpc29sYXRlTWFya3NdO1xuICAgIGlmIChvcHRpb25zLmFsd2F5c0lzb2xhdGUpXG4gICAgICAgIGV4dGVuc2lvbnMucHVzaChhbHdheXNJc29sYXRlLm9mKHRydWUpKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9ucztcbn1cbmNvbnN0IGlzb2xhdGVNYXJrcyA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLmFsd2F5cyA9IHZpZXcuc3RhdGUuZmFjZXQoYWx3YXlzSXNvbGF0ZSkgfHxcbiAgICAgICAgICAgIHZpZXcudGV4dERpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTFRSIHx8XG4gICAgICAgICAgICB2aWV3LnN0YXRlLmZhY2V0KEVkaXRvclZpZXcucGVyTGluZVRleHREaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmhhc1JUTCA9ICF0aGlzLmFsd2F5cyAmJiB0ZXh0SGFzUlRMKHZpZXcuc3RhdGUuZG9jKTtcbiAgICAgICAgdGhpcy50cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IGJ1aWxkRGVjbyh2aWV3LCB0aGlzLnRyZWUsIHRoaXMuYWx3YXlzKTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgYWx3YXlzID0gdXBkYXRlLnN0YXRlLmZhY2V0KGFsd2F5c0lzb2xhdGUpIHx8XG4gICAgICAgICAgICB1cGRhdGUudmlldy50ZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgfHxcbiAgICAgICAgICAgIHVwZGF0ZS5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKCFhbHdheXMgJiYgIXRoaXMuaGFzUlRMICYmIGNoYW5nZUFkZHNSVEwodXBkYXRlLmNoYW5nZXMpKVxuICAgICAgICAgICAgdGhpcy5oYXNSVEwgPSB0cnVlO1xuICAgICAgICBpZiAoIWFsd2F5cyAmJiAhdGhpcy5oYXNSVEwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAoYWx3YXlzICE9IHRoaXMuYWx3YXlzIHx8IHRyZWUgIT0gdGhpcy50cmVlIHx8IHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmFsd2F5cyA9IGFsd2F5cztcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBidWlsZERlY28odXBkYXRlLnZpZXcsIHRyZWUsIGFsd2F5cyk7XG4gICAgICAgIH1cbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IHtcbiAgICAgICAgZnVuY3Rpb24gYWNjZXNzKHZpZXcpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdmlldy5wbHVnaW4ocGx1Z2luKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29yYXRpb25zKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtFZGl0b3JWaWV3Lm91dGVyRGVjb3JhdGlvbnMub2YoYWNjZXNzKSxcbiAgICAgICAgICAgIFByZWMubG93ZXN0KEVkaXRvclZpZXcuYmlkaUlzb2xhdGVkUmFuZ2VzLm9mKGFjY2VzcykpXTtcbiAgICB9XG59KTtcbmZ1bmN0aW9uIGJ1aWxkRGVjbyh2aWV3LCB0cmVlLCBhbHdheXMpIHtcbiAgICBsZXQgZGVjbyA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICBsZXQgcmFuZ2VzID0gdmlldy52aXNpYmxlUmFuZ2VzO1xuICAgIGlmICghYWx3YXlzKVxuICAgICAgICByYW5nZXMgPSBjbGlwUlRMTGluZXMocmFuZ2VzLCB2aWV3LnN0YXRlLmRvYyk7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHJhbmdlcykge1xuICAgICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICAgICAgZW50ZXI6IG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc28gPSBub2RlLnR5cGUucHJvcChOb2RlUHJvcC5pc29sYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNvKVxuICAgICAgICAgICAgICAgICAgICBkZWNvLmFkZChub2RlLmZyb20sIG5vZGUudG8sIG1hcmtzW2lzb10pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZyb20sIHRvXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVjby5maW5pc2goKTtcbn1cbmZ1bmN0aW9uIGNsaXBSVExMaW5lcyhyYW5nZXMsIGRvYykge1xuICAgIGxldCBjdXIgPSBkb2MuaXRlcigpLCBwb3MgPSAwLCByZXN1bHQgPSBbXSwgbGFzdCA9IG51bGw7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHJhbmdlcykge1xuICAgICAgICBpZiAoZnJvbSAhPSBwb3MpIHtcbiAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tKVxuICAgICAgICAgICAgICAgIGN1ci5uZXh0KGZyb20gLSBwb3MpO1xuICAgICAgICAgICAgcG9zID0gZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBwb3MsIGVuZCA9IHBvcyArIGN1ci52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIWN1ci5saW5lQnJlYWsgJiYgYnVpbGRGb3JMaW5lKGN1ci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBsYXN0LnRvID4gc3RhcnQgLSAxMClcbiAgICAgICAgICAgICAgICAgICAgbGFzdC50byA9IE1hdGgubWluKHRvLCBlbmQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGFzdCA9IHsgZnJvbTogc3RhcnQsIHRvOiBNYXRoLm1pbih0bywgZW5kKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPj0gdG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgICBjdXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBtYXJrcyA9IHtcbiAgICBydGw6IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJydGxcIiB9LCBiaWRpSXNvbGF0ZTogRGlyZWN0aW9uLlJUTCB9KSxcbiAgICBsdHI6IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJsdHJcIiB9LCBiaWRpSXNvbGF0ZTogRGlyZWN0aW9uLkxUUiB9KSxcbiAgICBhdXRvOiAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taXNvXCIsIGluY2x1c2l2ZTogdHJ1ZSwgYXR0cmlidXRlczogeyBkaXI6IFwiYXV0b1wiIH0sIGJpZGlJc29sYXRlOiBudWxsIH0pXG59O1xuXG5leHBvcnQgeyBEb2NJbnB1dCwgSGlnaGxpZ2h0U3R5bGUsIEluZGVudENvbnRleHQsIExSTGFuZ3VhZ2UsIExhbmd1YWdlLCBMYW5ndWFnZURlc2NyaXB0aW9uLCBMYW5ndWFnZVN1cHBvcnQsIFBhcnNlQ29udGV4dCwgU3RyZWFtTGFuZ3VhZ2UsIFN0cmluZ1N0cmVhbSwgVHJlZUluZGVudENvbnRleHQsIGJpZGlJc29sYXRlcywgYnJhY2tldE1hdGNoaW5nLCBicmFja2V0TWF0Y2hpbmdIYW5kbGUsIGNvZGVGb2xkaW5nLCBjb250aW51ZWRJbmRlbnQsIGRlZmF1bHRIaWdobGlnaHRTdHlsZSwgZGVmaW5lTGFuZ3VhZ2VGYWNldCwgZGVsaW1pdGVkSW5kZW50LCBlbnN1cmVTeW50YXhUcmVlLCBmbGF0SW5kZW50LCBmb2xkQWxsLCBmb2xkQ29kZSwgZm9sZEVmZmVjdCwgZm9sZEd1dHRlciwgZm9sZEluc2lkZSwgZm9sZEtleW1hcCwgZm9sZE5vZGVQcm9wLCBmb2xkU2VydmljZSwgZm9sZFN0YXRlLCBmb2xkYWJsZSwgZm9sZGVkUmFuZ2VzLCBmb3JjZVBhcnNpbmcsIGdldEluZGVudFVuaXQsIGdldEluZGVudGF0aW9uLCBoaWdobGlnaHRpbmdGb3IsIGluZGVudE5vZGVQcm9wLCBpbmRlbnRPbklucHV0LCBpbmRlbnRSYW5nZSwgaW5kZW50U2VydmljZSwgaW5kZW50U3RyaW5nLCBpbmRlbnRVbml0LCBsYW5ndWFnZSwgbGFuZ3VhZ2VEYXRhUHJvcCwgbWF0Y2hCcmFja2V0cywgc3VibGFuZ3VhZ2VQcm9wLCBzeW50YXhIaWdobGlnaHRpbmcsIHN5bnRheFBhcnNlclJ1bm5pbmcsIHN5bnRheFRyZWUsIHN5bnRheFRyZWVBdmFpbGFibGUsIHRvZ2dsZUZvbGQsIHVuZm9sZEFsbCwgdW5mb2xkQ29kZSwgdW5mb2xkRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgUGFyc2VyLCBOb2RlUHJvcCwgTm9kZVNldCwgTm9kZVR5cGUsIERlZmF1bHRCdWZmZXJMZW5ndGgsIFRyZWUsIEl0ZXJNb2RlIH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5cbi8qKlxuQSBwYXJzZSBzdGFjay4gVGhlc2UgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgcGFyc2VyIHRvIHRyYWNrXG5wYXJzaW5nIHByb2dyZXNzLiBUaGV5IGFsc28gcHJvdmlkZSBzb21lIHByb3BlcnRpZXMgYW5kIG1ldGhvZHNcbnRoYXQgZXh0ZXJuYWwgY29kZSBzdWNoIGFzIGEgdG9rZW5pemVyIGNhbiB1c2UgdG8gZ2V0IGluZm9ybWF0aW9uXG5hYm91dCB0aGUgcGFyc2Ugc3RhdGUuXG4qL1xuY2xhc3MgU3RhY2sge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBhcnNlIHRoYXQgdGhpcyBzdGFjayBpcyBwYXJ0IG9mIEBpbnRlcm5hbFxuICAgICovXG4gICAgcCwgXG4gICAgLyoqXG4gICAgSG9sZHMgc3RhdGUsIGlucHV0IHBvcywgYnVmZmVyIGluZGV4IHRyaXBsZXRzIGZvciBhbGwgYnV0IHRoZVxuICAgIHRvcCBzdGF0ZSBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YWNrLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBwYXJzZSBzdGF0ZSBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvLyBUaGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIG5leHQgcmVkdWNlIHNob3VsZCB0YWtlIHBsYWNlLiBUaGlzXG4gICAgLy8gY2FuIGJlIGxlc3MgdGhhbiBgdGhpcy5wb3NgIHdoZW4gc2tpcHBlZCBleHByZXNzaW9ucyBoYXZlIGJlZW5cbiAgICAvLyBhZGRlZCB0byB0aGUgc3RhY2sgKHdoaWNoIHNob3VsZCBiZSBtb3ZlZCBvdXRzaWRlIG9mIHRoZSBuZXh0XG4gICAgLy8gcmVkdWN0aW9uKVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVkdWNlUG9zLCBcbiAgICAvKipcbiAgICBUaGUgaW5wdXQgcG9zaXRpb24gdXAgdG8gd2hpY2ggdGhpcyBzdGFjayBoYXMgcGFyc2VkLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgZHluYW1pYyBzY29yZSBvZiB0aGUgc3RhY2ssIGluY2x1ZGluZyBkeW5hbWljIHByZWNlZGVuY2VcbiAgICBhbmQgZXJyb3ItcmVjb3ZlcnkgcGVuYWx0aWVzXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzY29yZSwgXG4gICAgLy8gVGhlIG91dHB1dCBidWZmZXIuIEhvbGRzICh0eXBlLCBzdGFydCwgZW5kLCBzaXplKSBxdWFkc1xuICAgIC8vIHJlcHJlc2VudGluZyBub2RlcyBjcmVhdGVkIGJ5IHRoZSBwYXJzZXIsIHdoZXJlIGBzaXplYCBpc1xuICAgIC8vIGFtb3VudCBvZiBidWZmZXIgYXJyYXkgZW50cmllcyBjb3ZlcmVkIGJ5IHRoaXMgbm9kZS5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGJ1ZmZlciwgXG4gICAgLy8gVGhlIGJhc2Ugb2Zmc2V0IG9mIHRoZSBidWZmZXIuIFdoZW4gc3RhY2tzIGFyZSBzcGxpdCwgdGhlIHNwbGl0XG4gICAgLy8gaW5zdGFuY2Ugc2hhcmVkIHRoZSBidWZmZXIgaGlzdG9yeSB3aXRoIGl0cyBwYXJlbnQgdXAgdG9cbiAgICAvLyBgYnVmZmVyQmFzZWAsIHdoaWNoIGlzIHRoZSBhYnNvbHV0ZSBvZmZzZXQgKGluY2x1ZGluZyB0aGVcbiAgICAvLyBvZmZzZXQgb2YgcHJldmlvdXMgc3BsaXRzKSBpbnRvIHRoZSBidWZmZXIgYXQgd2hpY2ggdGhpcyBzdGFja1xuICAgIC8vIHN0YXJ0cyB3cml0aW5nLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYnVmZmVyQmFzZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjdXJDb250ZXh0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGxvb2tBaGVhZCA9IDAsIFxuICAgIC8vIEEgcGFyZW50IHN0YWNrIGZyb20gd2hpY2ggdGhpcyB3YXMgc3BsaXQgb2ZmLCBpZiBhbnkuIFRoaXMgaXNcbiAgICAvLyBzZXQgdXAgc28gdGhhdCBpdCBhbHdheXMgcG9pbnRzIHRvIGEgc3RhY2sgdGhhdCBoYXMgc29tZVxuICAgIC8vIGFkZGl0aW9uYWwgYnVmZmVyIGNvbnRlbnQsIG5ldmVyIHRvIGEgc3RhY2sgd2l0aCBhbiBlcXVhbFxuICAgIC8vIGBidWZmZXJCYXNlYC5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHBhcmVudCkge1xuICAgICAgICB0aGlzLnAgPSBwO1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5yZWR1Y2VQb3MgPSByZWR1Y2VQb3M7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLnNjb3JlID0gc2NvcmU7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmJ1ZmZlckJhc2UgPSBidWZmZXJCYXNlO1xuICAgICAgICB0aGlzLmN1ckNvbnRleHQgPSBjdXJDb250ZXh0O1xuICAgICAgICB0aGlzLmxvb2tBaGVhZCA9IGxvb2tBaGVhZDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgWyR7dGhpcy5zdGFjay5maWx0ZXIoKF8sIGkpID0+IGkgJSAzID09IDApLmNvbmNhdCh0aGlzLnN0YXRlKX1dQCR7dGhpcy5wb3N9JHt0aGlzLnNjb3JlID8gXCIhXCIgKyB0aGlzLnNjb3JlIDogXCJcIn1gO1xuICAgIH1cbiAgICAvLyBTdGFydCBhbiBlbXB0eSBzdGFja1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHN0YXJ0KHAsIHN0YXRlLCBwb3MgPSAwKSB7XG4gICAgICAgIGxldCBjeCA9IHAucGFyc2VyLmNvbnRleHQ7XG4gICAgICAgIHJldHVybiBuZXcgU3RhY2socCwgW10sIHN0YXRlLCBwb3MsIHBvcywgMCwgW10sIDAsIGN4ID8gbmV3IFN0YWNrQ29udGV4dChjeCwgY3guc3RhcnQpIDogbnVsbCwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFjaydzIGN1cnJlbnQgW2NvbnRleHRdKCNsci5Db250ZXh0VHJhY2tlcikgdmFsdWUsIGlmXG4gICAgYW55LiBJdHMgdHlwZSB3aWxsIGRlcGVuZCBvbiB0aGUgY29udGV4dCB0cmFja2VyJ3MgdHlwZVxuICAgIHBhcmFtZXRlciwgb3IgaXQgd2lsbCBiZSBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gY29udGV4dFxuICAgIHRyYWNrZXIuXG4gICAgKi9cbiAgICBnZXQgY29udGV4dCgpIHsgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCA/IHRoaXMuY3VyQ29udGV4dC5jb250ZXh0IDogbnVsbDsgfVxuICAgIC8vIFB1c2ggYSBzdGF0ZSBvbnRvIHRoZSBzdGFjaywgdHJhY2tpbmcgaXRzIHN0YXJ0IHBvc2l0aW9uIGFzIHdlbGxcbiAgICAvLyBhcyB0aGUgYnVmZmVyIGJhc2UgYXQgdGhhdCBwb2ludC5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1c2hTdGF0ZShzdGF0ZSwgc3RhcnQpIHtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuc3RhdGUsIHN0YXJ0LCB0aGlzLmJ1ZmZlckJhc2UgKyB0aGlzLmJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuICAgIC8vIEFwcGx5IGEgcmVkdWNlIGFjdGlvblxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVkdWNlKGFjdGlvbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBkZXB0aCA9IGFjdGlvbiA+PiAxOSAvKiBBY3Rpb24uUmVkdWNlRGVwdGhTaGlmdCAqLywgdHlwZSA9IGFjdGlvbiAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi87XG4gICAgICAgIGxldCB7IHBhcnNlciB9ID0gdGhpcy5wO1xuICAgICAgICBsZXQgZFByZWMgPSBwYXJzZXIuZHluYW1pY1ByZWNlZGVuY2UodHlwZSk7XG4gICAgICAgIGlmIChkUHJlYylcbiAgICAgICAgICAgIHRoaXMuc2NvcmUgKz0gZFByZWM7XG4gICAgICAgIGlmIChkZXB0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hTdGF0ZShwYXJzZXIuZ2V0R290byh0aGlzLnN0YXRlLCB0eXBlLCB0cnVlKSwgdGhpcy5yZWR1Y2VQb3MpO1xuICAgICAgICAgICAgLy8gWmVyby1kZXB0aCByZWR1Y3Rpb25zIGFyZSBhIHNwZWNpYWwgY2FzZVx1MjAxNHRoZXkgYWRkIHN0dWZmIHRvXG4gICAgICAgICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBwb3BwaW5nIGFueXRoaW5nIG9mZi5cbiAgICAgICAgICAgIGlmICh0eXBlIDwgcGFyc2VyLm1pblJlcGVhdFRlcm0pXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUodHlwZSwgdGhpcy5yZWR1Y2VQb3MsIHRoaXMucmVkdWNlUG9zLCA0LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucmVkdWNlQ29udGV4dCh0eXBlLCB0aGlzLnJlZHVjZVBvcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmluZCB0aGUgYmFzZSBpbmRleCBpbnRvIGB0aGlzLnN0YWNrYCwgY29udGVudCBhZnRlciB3aGljaCB3aWxsXG4gICAgICAgIC8vIGJlIGRyb3BwZWQuIE5vdGUgdGhhdCB3aXRoIGBTdGF5RmxhZ2AgcmVkdWN0aW9ucyB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIGNvbnN1bWUgdHdvIGV4dHJhIGZyYW1lcyAodGhlIGR1bW15IHBhcmVudCBub2RlIGZvciB0aGUgc2tpcHBlZFxuICAgICAgICAvLyBleHByZXNzaW9uIGFuZCB0aGUgc3RhdGUgdGhhdCB3ZSdsbCBiZSBzdGF5aW5nIGluLCB3aGljaCBzaG91bGRcbiAgICAgICAgLy8gYmUgbW92ZWQgdG8gYHRoaXMuc3RhdGVgKS5cbiAgICAgICAgbGV0IGJhc2UgPSB0aGlzLnN0YWNrLmxlbmd0aCAtICgoZGVwdGggLSAxKSAqIDMpIC0gKGFjdGlvbiAmIDI2MjE0NCAvKiBBY3Rpb24uU3RheUZsYWcgKi8gPyA2IDogMCk7XG4gICAgICAgIGxldCBzdGFydCA9IGJhc2UgPyB0aGlzLnN0YWNrW2Jhc2UgLSAyXSA6IHRoaXMucC5yYW5nZXNbMF0uZnJvbSwgc2l6ZSA9IHRoaXMucmVkdWNlUG9zIC0gc3RhcnQ7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8gdHJ5IGFuZCBkZXRlY3Qgb3Zlcmx5IGRlZXAgbGVmdC1hc3NvY2lhdGl2ZVxuICAgICAgICAvLyB0cmVlcywgd2hpY2ggd2lsbCBub3QgaW5jcmVhc2UgdGhlIHBhcnNlIHN0YWNrIGRlcHRoIGFuZCB0aHVzXG4gICAgICAgIC8vIHdvbid0IGJlIGNhdWdodCBieSB0aGUgcmVndWxhciBzdGFjay1kZXB0aCBsaW1pdCBjaGVjay5cbiAgICAgICAgaWYgKHNpemUgPj0gMjAwMCAvKiBSZWNvdmVyLk1pbkJpZ1JlZHVjdGlvbiAqLyAmJiAhKChfYSA9IHRoaXMucC5wYXJzZXIubm9kZVNldC50eXBlc1t0eXBlXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzQW5vbnltb3VzKSkge1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID09IHRoaXMucC5sYXN0QmlnUmVkdWN0aW9uU3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnAuYmlnUmVkdWN0aW9uQ291bnQrKztcbiAgICAgICAgICAgICAgICB0aGlzLnAubGFzdEJpZ1JlZHVjdGlvblNpemUgPSBzaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wLmxhc3RCaWdSZWR1Y3Rpb25TaXplIDwgc2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucC5iaWdSZWR1Y3Rpb25Db3VudCA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5wLmxhc3RCaWdSZWR1Y3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgIHRoaXMucC5sYXN0QmlnUmVkdWN0aW9uU2l6ZSA9IHNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJ1ZmZlckJhc2UgPSBiYXNlID8gdGhpcy5zdGFja1tiYXNlIC0gMV0gOiAwLCBjb3VudCA9IHRoaXMuYnVmZmVyQmFzZSArIHRoaXMuYnVmZmVyLmxlbmd0aCAtIGJ1ZmZlckJhc2U7XG4gICAgICAgIC8vIFN0b3JlIG5vcm1hbCB0ZXJtcyBvciBgUiAtPiBSIFJgIHJlcGVhdCByZWR1Y3Rpb25zXG4gICAgICAgIGlmICh0eXBlIDwgcGFyc2VyLm1pblJlcGVhdFRlcm0gfHwgKGFjdGlvbiAmIDEzMTA3MiAvKiBBY3Rpb24uUmVwZWF0RmxhZyAqLykpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBwYXJzZXIuc3RhdGVGbGFnKHRoaXMuc3RhdGUsIDEgLyogU3RhdGVGbGFnLlNraXBwZWQgKi8pID8gdGhpcy5wb3MgOiB0aGlzLnJlZHVjZVBvcztcbiAgICAgICAgICAgIHRoaXMuc3RvcmVOb2RlKHR5cGUsIHN0YXJ0LCBwb3MsIGNvdW50ICsgNCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbiAmIDI2MjE0NCAvKiBBY3Rpb24uU3RheUZsYWcgKi8pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YWNrW2Jhc2VdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJhc2VTdGF0ZUlEID0gdGhpcy5zdGFja1tiYXNlIC0gM107XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gcGFyc2VyLmdldEdvdG8oYmFzZVN0YXRlSUQsIHR5cGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IGJhc2UpXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICB0aGlzLnJlZHVjZUNvbnRleHQodHlwZSwgc3RhcnQpO1xuICAgIH1cbiAgICAvLyBTaGlmdCBhIHZhbHVlIGludG8gdGhlIGJ1ZmZlclxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RvcmVOb2RlKHRlcm0sIHN0YXJ0LCBlbmQsIHNpemUgPSA0LCBpc1JlZHVjZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0ZXJtID09IDAgLyogVGVybS5FcnIgKi8gJiZcbiAgICAgICAgICAgICghdGhpcy5zdGFjay5sZW5ndGggfHwgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdIDwgdGhpcy5idWZmZXIubGVuZ3RoICsgdGhpcy5idWZmZXJCYXNlKSkge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIG9taXQvbWVyZ2UgYWRqYWNlbnQgZXJyb3Igbm9kZXNcbiAgICAgICAgICAgIGxldCBjdXIgPSB0aGlzLCB0b3AgPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICBpZiAodG9wID09IDAgJiYgY3VyLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIHRvcCA9IGN1ci5idWZmZXJCYXNlIC0gY3VyLnBhcmVudC5idWZmZXJCYXNlO1xuICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9wID4gMCAmJiBjdXIuYnVmZmVyW3RvcCAtIDRdID09IDAgLyogVGVybS5FcnIgKi8gJiYgY3VyLmJ1ZmZlclt0b3AgLSAxXSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChjdXIuYnVmZmVyW3RvcCAtIDJdID49IHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ci5idWZmZXJbdG9wIC0gMl0gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1JlZHVjZSB8fCB0aGlzLnBvcyA9PSBlbmQpIHsgLy8gU2ltcGxlIGNhc2UsIGp1c3QgYXBwZW5kXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHRlcm0sIHN0YXJ0LCBlbmQsIHNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBUaGVyZSBtYXkgYmUgc2tpcHBlZCBub2RlcyB0aGF0IGhhdmUgdG8gYmUgbW92ZWQgZm9yd2FyZFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCAmJiB0aGlzLmJ1ZmZlcltpbmRleCAtIDRdICE9IDAgLyogVGVybS5FcnIgKi8pXG4gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4ID4gMCAmJiB0aGlzLmJ1ZmZlcltpbmRleCAtIDJdID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhpcyByZWNvcmQgZm9yd2FyZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleF0gPSB0aGlzLmJ1ZmZlcltpbmRleCAtIDRdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleCArIDFdID0gdGhpcy5idWZmZXJbaW5kZXggLSAzXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKyAyXSA9IHRoaXMuYnVmZmVyW2luZGV4IC0gMl07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgM10gPSB0aGlzLmJ1ZmZlcltpbmRleCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSA0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplIC09IDQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXhdID0gdGVybTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgMV0gPSBzdGFydDtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgMl0gPSBlbmQ7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleCArIDNdID0gc2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHBseSBhIHNoaWZ0IGFjdGlvblxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2hpZnQoYWN0aW9uLCB0eXBlLCBzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmIChhY3Rpb24gJiAxMzEwNzIgLyogQWN0aW9uLkdvdG9GbGFnICovKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hTdGF0ZShhY3Rpb24gJiA2NTUzNSAvKiBBY3Rpb24uVmFsdWVNYXNrICovLCB0aGlzLnBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGFjdGlvbiAmIDI2MjE0NCAvKiBBY3Rpb24uU3RheUZsYWcgKi8pID09IDApIHsgLy8gUmVndWxhciBzaGlmdFxuICAgICAgICAgICAgbGV0IG5leHRTdGF0ZSA9IGFjdGlvbiwgeyBwYXJzZXIgfSA9IHRoaXMucDtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0aGlzLnBvcyB8fCB0eXBlIDw9IHBhcnNlci5tYXhOb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZXIuc3RhdGVGbGFnKG5leHRTdGF0ZSwgMSAvKiBTdGF0ZUZsYWcuU2tpcHBlZCAqLykpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkdWNlUG9zID0gZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoU3RhdGUobmV4dFN0YXRlLCBzdGFydCk7XG4gICAgICAgICAgICB0aGlzLnNoaWZ0Q29udGV4dCh0eXBlLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAodHlwZSA8PSBwYXJzZXIubWF4Tm9kZSlcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHR5cGUsIHN0YXJ0LCBlbmQsIDQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBTaGlmdC1hbmQtc3RheSwgd2hpY2ggbWVhbnMgdGhpcyBpcyBhIHNraXBwZWQgdG9rZW5cbiAgICAgICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICAgICAgdGhpcy5zaGlmdENvbnRleHQodHlwZSwgc3RhcnQpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPD0gdGhpcy5wLnBhcnNlci5tYXhOb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godHlwZSwgc3RhcnQsIGVuZCwgNCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXBwbHkgYW4gYWN0aW9uXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhcHBseShhY3Rpb24sIG5leHQsIG5leHRTdGFydCwgbmV4dEVuZCkge1xuICAgICAgICBpZiAoYWN0aW9uICYgNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8pXG4gICAgICAgICAgICB0aGlzLnJlZHVjZShhY3Rpb24pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNoaWZ0KGFjdGlvbiwgbmV4dCwgbmV4dFN0YXJ0LCBuZXh0RW5kKTtcbiAgICB9XG4gICAgLy8gQWRkIGEgcHJlYnVpbHQgKHJldXNlZCkgbm9kZSBpbnRvIHRoZSBidWZmZXIuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB1c2VOb2RlKHZhbHVlLCBuZXh0KSB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMucC5yZXVzZWQubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCB0aGlzLnAucmV1c2VkW2luZGV4XSAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wLnJldXNlZC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucmVkdWNlUG9zID0gdGhpcy5wb3MgPSBzdGFydCArIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgdGhpcy5wdXNoU3RhdGUobmV4dCwgc3RhcnQpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKGluZGV4LCBzdGFydCwgdGhpcy5yZWR1Y2VQb3MsIC0xIC8qIHNpemUgPT0gLTEgbWVhbnMgdGhpcyBpcyBhIHJldXNlZCB2YWx1ZSAqLyk7XG4gICAgICAgIGlmICh0aGlzLmN1ckNvbnRleHQpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRleHQodGhpcy5jdXJDb250ZXh0LnRyYWNrZXIucmV1c2UodGhpcy5jdXJDb250ZXh0LmNvbnRleHQsIHZhbHVlLCB0aGlzLCB0aGlzLnAuc3RyZWFtLnJlc2V0KHRoaXMucG9zIC0gdmFsdWUubGVuZ3RoKSkpO1xuICAgIH1cbiAgICAvLyBTcGxpdCB0aGUgc3RhY2suIER1ZSB0byB0aGUgYnVmZmVyIHNoYXJpbmcgYW5kIHRoZSBmYWN0XG4gICAgLy8gdGhhdCBgdGhpcy5zdGFja2AgdGVuZHMgdG8gc3RheSBxdWl0ZSBzaGFsbG93LCB0aGlzIGlzbid0IHZlcnlcbiAgICAvLyBleHBlbnNpdmUuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzcGxpdCgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgICAgIGxldCBvZmYgPSBwYXJlbnQuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgdG9wIG9mIHRoZSBidWZmZXIgKGFmdGVyIHRoaXMucG9zKSBtYXkgYmUgbXV0YXRlZFxuICAgICAgICAvLyB0byByZW9yZGVyIHJlZHVjdGlvbnMgYW5kIHNraXBwZWQgdG9rZW5zLCBhbmQgc2hhcmVkIGJ1ZmZlcnNcbiAgICAgICAgLy8gc2hvdWxkIGJlIGltbXV0YWJsZSwgdGhpcyBjb3BpZXMgYW55IG91dHN0YW5kaW5nIHNraXBwZWQgdG9rZW5zXG4gICAgICAgIC8vIHRvIHRoZSBuZXcgYnVmZmVyLCBhbmQgcHV0cyB0aGUgYmFzZSBwb2ludGVyIGJlZm9yZSB0aGVtLlxuICAgICAgICB3aGlsZSAob2ZmID4gMCAmJiBwYXJlbnQuYnVmZmVyW29mZiAtIDJdID4gcGFyZW50LnJlZHVjZVBvcylcbiAgICAgICAgICAgIG9mZiAtPSA0O1xuICAgICAgICBsZXQgYnVmZmVyID0gcGFyZW50LmJ1ZmZlci5zbGljZShvZmYpLCBiYXNlID0gcGFyZW50LmJ1ZmZlckJhc2UgKyBvZmY7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBwYXJlbnQgcG9pbnRzIHRvIGFuIGFjdHVhbCBwYXJlbnQgd2l0aCBjb250ZW50LCBpZiB0aGVyZSBpcyBzdWNoIGEgcGFyZW50LlxuICAgICAgICB3aGlsZSAocGFyZW50ICYmIGJhc2UgPT0gcGFyZW50LmJ1ZmZlckJhc2UpXG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgICByZXR1cm4gbmV3IFN0YWNrKHRoaXMucCwgdGhpcy5zdGFjay5zbGljZSgpLCB0aGlzLnN0YXRlLCB0aGlzLnJlZHVjZVBvcywgdGhpcy5wb3MsIHRoaXMuc2NvcmUsIGJ1ZmZlciwgYmFzZSwgdGhpcy5jdXJDb250ZXh0LCB0aGlzLmxvb2tBaGVhZCwgcGFyZW50KTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBieSAnZGVsZXRpbmcnIChpZ25vcmluZykgb25lIHRva2VuLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVjb3ZlckJ5RGVsZXRlKG5leHQsIG5leHRFbmQpIHtcbiAgICAgICAgbGV0IGlzTm9kZSA9IG5leHQgPD0gdGhpcy5wLnBhcnNlci5tYXhOb2RlO1xuICAgICAgICBpZiAoaXNOb2RlKVxuICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUobmV4dCwgdGhpcy5wb3MsIG5leHRFbmQsIDQpO1xuICAgICAgICB0aGlzLnN0b3JlTm9kZSgwIC8qIFRlcm0uRXJyICovLCB0aGlzLnBvcywgbmV4dEVuZCwgaXNOb2RlID8gOCA6IDQpO1xuICAgICAgICB0aGlzLnBvcyA9IHRoaXMucmVkdWNlUG9zID0gbmV4dEVuZDtcbiAgICAgICAgdGhpcy5zY29yZSAtPSAxOTAgLyogUmVjb3Zlci5EZWxldGUgKi87XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIGlmIHRoZSBnaXZlbiB0ZXJtIHdvdWxkIGJlIGFibGUgdG8gYmUgc2hpZnRlZCAob3B0aW9uYWxseVxuICAgIGFmdGVyIHNvbWUgcmVkdWN0aW9ucykgb24gdGhpcyBzdGFjay4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvclxuICAgIGV4dGVybmFsIHRva2VuaXplcnMgdGhhdCB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5IG9ubHkgcHJvdmlkZSBhXG4gICAgZ2l2ZW4gdG9rZW4gd2hlbiBpdCBhcHBsaWVzLlxuICAgICovXG4gICAgY2FuU2hpZnQodGVybSkge1xuICAgICAgICBmb3IgKGxldCBzaW0gPSBuZXcgU2ltdWxhdGVkU3RhY2sodGhpcyk7Oykge1xuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IHRoaXMucC5wYXJzZXIuc3RhdGVTbG90KHNpbS5zdGF0ZSwgNCAvKiBQYXJzZVN0YXRlLkRlZmF1bHRSZWR1Y2UgKi8pIHx8IHRoaXMucC5wYXJzZXIuaGFzQWN0aW9uKHNpbS5zdGF0ZSwgdGVybSk7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKChhY3Rpb24gJiA2NTUzNiAvKiBBY3Rpb24uUmVkdWNlRmxhZyAqLykgPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHNpbS5yZWR1Y2UoYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHBseSB1cCB0byBSZWNvdmVyLk1heE5leHQgcmVjb3ZlcnkgYWN0aW9ucyB0aGF0IGNvbmNlcHR1YWxseVxuICAgIC8vIGluc2VydHMgc29tZSBtaXNzaW5nIHRva2VuIG9yIHJ1bGUuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWNvdmVyQnlJbnNlcnQobmV4dCkge1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPj0gMzAwIC8qIFJlY292ZXIuTWF4SW5zZXJ0U3RhY2tEZXB0aCAqLylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IG5leHRTdGF0ZXMgPSB0aGlzLnAucGFyc2VyLm5leHRTdGF0ZXModGhpcy5zdGF0ZSk7XG4gICAgICAgIGlmIChuZXh0U3RhdGVzLmxlbmd0aCA+IDQgLyogUmVjb3Zlci5NYXhOZXh0ICovIDw8IDEgfHwgdGhpcy5zdGFjay5sZW5ndGggPj0gMTIwIC8qIFJlY292ZXIuRGFtcGVuSW5zZXJ0U3RhY2tEZXB0aCAqLykge1xuICAgICAgICAgICAgbGV0IGJlc3QgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBzOyBpIDwgbmV4dFN0YXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgIGlmICgocyA9IG5leHRTdGF0ZXNbaSArIDFdKSAhPSB0aGlzLnN0YXRlICYmIHRoaXMucC5wYXJzZXIuaGFzQWN0aW9uKHMsIG5leHQpKVxuICAgICAgICAgICAgICAgICAgICBiZXN0LnB1c2gobmV4dFN0YXRlc1tpXSwgcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAxMjAgLyogUmVjb3Zlci5EYW1wZW5JbnNlcnRTdGFja0RlcHRoICovKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBiZXN0Lmxlbmd0aCA8IDQgLyogUmVjb3Zlci5NYXhOZXh0ICovIDw8IDEgJiYgaSA8IG5leHRTdGF0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSBuZXh0U3RhdGVzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiZXN0LnNvbWUoKHYsIGkpID0+IChpICYgMSkgJiYgdiA9PSBzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QucHVzaChuZXh0U3RhdGVzW2ldLCBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0U3RhdGVzID0gYmVzdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV4dFN0YXRlcy5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IDQgLyogUmVjb3Zlci5NYXhOZXh0ICovOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBzID0gbmV4dFN0YXRlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAocyA9PSB0aGlzLnN0YXRlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHN0YWNrID0gdGhpcy5zcGxpdCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaFN0YXRlKHMsIHRoaXMucG9zKTtcbiAgICAgICAgICAgIHN0YWNrLnN0b3JlTm9kZSgwIC8qIFRlcm0uRXJyICovLCBzdGFjay5wb3MsIHN0YWNrLnBvcywgNCwgdHJ1ZSk7XG4gICAgICAgICAgICBzdGFjay5zaGlmdENvbnRleHQobmV4dFN0YXRlc1tpXSwgdGhpcy5wb3MpO1xuICAgICAgICAgICAgc3RhY2sucmVkdWNlUG9zID0gdGhpcy5wb3M7XG4gICAgICAgICAgICBzdGFjay5zY29yZSAtPSAyMDAgLyogUmVjb3Zlci5JbnNlcnQgKi87XG4gICAgICAgICAgICByZXN1bHQucHVzaChzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gRm9yY2UgYSByZWR1Y2UsIGlmIHBvc3NpYmxlLiBSZXR1cm4gZmFsc2UgaWYgdGhhdCBjYW4ndFxuICAgIC8vIGJlIGRvbmUuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmb3JjZVJlZHVjZSgpIHtcbiAgICAgICAgbGV0IHsgcGFyc2VyIH0gPSB0aGlzLnA7XG4gICAgICAgIGxldCByZWR1Y2UgPSBwYXJzZXIuc3RhdGVTbG90KHRoaXMuc3RhdGUsIDUgLyogUGFyc2VTdGF0ZS5Gb3JjZWRSZWR1Y2UgKi8pO1xuICAgICAgICBpZiAoKHJlZHVjZSAmIDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovKSA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXBhcnNlci52YWxpZEFjdGlvbih0aGlzLnN0YXRlLCByZWR1Y2UpKSB7XG4gICAgICAgICAgICBsZXQgZGVwdGggPSByZWR1Y2UgPj4gMTkgLyogQWN0aW9uLlJlZHVjZURlcHRoU2hpZnQgKi8sIHRlcm0gPSByZWR1Y2UgJiA2NTUzNSAvKiBBY3Rpb24uVmFsdWVNYXNrICovO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gZGVwdGggKiAzO1xuICAgICAgICAgICAgaWYgKHRhcmdldCA8IDAgfHwgcGFyc2VyLmdldEdvdG8odGhpcy5zdGFja1t0YXJnZXRdLCB0ZXJtLCBmYWxzZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJhY2t1cCA9IHRoaXMuZmluZEZvcmNlZFJlZHVjdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChiYWNrdXAgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlZHVjZSA9IGJhY2t1cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RvcmVOb2RlKDAgLyogVGVybS5FcnIgKi8sIHRoaXMucG9zLCB0aGlzLnBvcywgNCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnNjb3JlIC09IDEwMCAvKiBSZWNvdmVyLlJlZHVjZSAqLztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZHVjZVBvcyA9IHRoaXMucG9zO1xuICAgICAgICB0aGlzLnJlZHVjZShyZWR1Y2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIHNjYW4gdGhyb3VnaCB0aGUgYXV0b21hdG9uIHRvIGZpbmQgc29tZSBraW5kIG9mIHJlZHVjdGlvblxuICAgIHRoYXQgY2FuIGJlIGFwcGxpZWQuIFVzZWQgd2hlbiB0aGUgcmVndWxhciBGb3JjZWRSZWR1Y2UgZmllbGRcbiAgICBpc24ndCBhIHZhbGlkIGFjdGlvbi4gQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5kRm9yY2VkUmVkdWN0aW9uKCkge1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHRoaXMucCwgc2VlbiA9IFtdO1xuICAgICAgICBsZXQgZXhwbG9yZSA9IChzdGF0ZSwgZGVwdGgpID0+IHtcbiAgICAgICAgICAgIGlmIChzZWVuLmluY2x1ZGVzKHN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzZWVuLnB1c2goc3RhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5hbGxBY3Rpb25zKHN0YXRlLCAoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiAmICgyNjIxNDQgLyogQWN0aW9uLlN0YXlGbGFnICovIHwgMTMxMDcyIC8qIEFjdGlvbi5Hb3RvRmxhZyAqLykpIDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gJiA2NTUzNiAvKiBBY3Rpb24uUmVkdWNlRmxhZyAqLykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgckRlcHRoID0gKGFjdGlvbiA+PiAxOSAvKiBBY3Rpb24uUmVkdWNlRGVwdGhTaGlmdCAqLykgLSBkZXB0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJEZXB0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtID0gYWN0aW9uICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLywgdGFyZ2V0ID0gdGhpcy5zdGFjay5sZW5ndGggLSByRGVwdGggKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA+PSAwICYmIHBhcnNlci5nZXRHb3RvKHRoaXMuc3RhY2tbdGFyZ2V0XSwgdGVybSwgZmFsc2UpID49IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyRGVwdGggPDwgMTkgLyogQWN0aW9uLlJlZHVjZURlcHRoU2hpZnQgKi8pIHwgNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8gfCB0ZXJtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBleHBsb3JlKGFjdGlvbiwgZGVwdGggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBleHBsb3JlKHRoaXMuc3RhdGUsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZvcmNlQWxsKCkge1xuICAgICAgICB3aGlsZSAoIXRoaXMucC5wYXJzZXIuc3RhdGVGbGFnKHRoaXMuc3RhdGUsIDIgLyogU3RhdGVGbGFnLkFjY2VwdGluZyAqLykpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JjZVJlZHVjZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUoMCAvKiBUZXJtLkVyciAqLywgdGhpcy5wb3MsIHRoaXMucG9zLCA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGlzIHN0YXRlIGhhcyBubyBmdXJ0aGVyIGFjdGlvbnMgKGFzc3VtZWQgdG8gYmUgYSBkaXJlY3QgZGVzY2VuZGFudCBvZiB0aGVcbiAgICB0b3Agc3RhdGUsIHNpbmNlIGFueSBvdGhlciBzdGF0ZXMgbXVzdCBiZSBhYmxlIHRvIGNvbnRpbnVlXG4gICAgc29tZWhvdykuIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGRlYWRFbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCAhPSAzKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHRoaXMucDtcbiAgICAgICAgcmV0dXJuIHBhcnNlci5kYXRhW3BhcnNlci5zdGF0ZVNsb3QodGhpcy5zdGF0ZSwgMSAvKiBQYXJzZVN0YXRlLkFjdGlvbnMgKi8pXSA9PSA2NTUzNSAvKiBTZXEuRW5kICovICYmXG4gICAgICAgICAgICAhcGFyc2VyLnN0YXRlU2xvdCh0aGlzLnN0YXRlLCA0IC8qIFBhcnNlU3RhdGUuRGVmYXVsdFJlZHVjZSAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlc3RhcnQgdGhlIHN0YWNrIChwdXQgaXQgYmFjayBpbiBpdHMgc3RhcnQgc3RhdGUpLiBPbmx5IHNhZmVcbiAgICB3aGVuIHRoaXMuc3RhY2subGVuZ3RoID09IDMgKHN0YXRlIGlzIGRpcmVjdGx5IGJlbG93IHRoZSB0b3BcbiAgICBzdGF0ZSkuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzdGFydCgpIHtcbiAgICAgICAgdGhpcy5zdG9yZU5vZGUoMCAvKiBUZXJtLkVyciAqLywgdGhpcy5wb3MsIHRoaXMucG9zLCA0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhY2tbMF07XG4gICAgICAgIHRoaXMuc3RhY2subGVuZ3RoID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzYW1lU3RhdGUob3RoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT0gb3RoZXIuc3RhdGUgfHwgdGhpcy5zdGFjay5sZW5ndGggIT0gb3RoZXIuc3RhY2subGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhY2subGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBpZiAodGhpcy5zdGFja1tpXSAhPSBvdGhlci5zdGFja1tpXSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHBhcnNlciB1c2VkIGJ5IHRoaXMgc3RhY2suXG4gICAgKi9cbiAgICBnZXQgcGFyc2VyKCkgeyByZXR1cm4gdGhpcy5wLnBhcnNlcjsgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciBhIGdpdmVuIGRpYWxlY3QgKGJ5IG51bWVyaWMgSUQsIGFzIGV4cG9ydGVkIGZyb21cbiAgICB0aGUgdGVybXMgZmlsZSkgaXMgZW5hYmxlZC5cbiAgICAqL1xuICAgIGRpYWxlY3RFbmFibGVkKGRpYWxlY3RJRCkgeyByZXR1cm4gdGhpcy5wLnBhcnNlci5kaWFsZWN0LmZsYWdzW2RpYWxlY3RJRF07IH1cbiAgICBzaGlmdENvbnRleHQodGVybSwgc3RhcnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyQ29udGV4dClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGV4dCh0aGlzLmN1ckNvbnRleHQudHJhY2tlci5zaGlmdCh0aGlzLmN1ckNvbnRleHQuY29udGV4dCwgdGVybSwgdGhpcywgdGhpcy5wLnN0cmVhbS5yZXNldChzdGFydCkpKTtcbiAgICB9XG4gICAgcmVkdWNlQ29udGV4dCh0ZXJtLCBzdGFydCkge1xuICAgICAgICBpZiAodGhpcy5jdXJDb250ZXh0KVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZXh0KHRoaXMuY3VyQ29udGV4dC50cmFja2VyLnJlZHVjZSh0aGlzLmN1ckNvbnRleHQuY29udGV4dCwgdGVybSwgdGhpcywgdGhpcy5wLnN0cmVhbS5yZXNldChzdGFydCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbWl0Q29udGV4dCgpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmJ1ZmZlci5sZW5ndGggLSAxO1xuICAgICAgICBpZiAobGFzdCA8IDAgfHwgdGhpcy5idWZmZXJbbGFzdF0gIT0gLTMpXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHRoaXMuY3VyQ29udGV4dC5oYXNoLCB0aGlzLnBvcywgdGhpcy5wb3MsIC0zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbWl0TG9va0FoZWFkKCkge1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChsYXN0IDwgMCB8fCB0aGlzLmJ1ZmZlcltsYXN0XSAhPSAtNClcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godGhpcy5sb29rQWhlYWQsIHRoaXMucG9zLCB0aGlzLnBvcywgLTQpO1xuICAgIH1cbiAgICB1cGRhdGVDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgIT0gdGhpcy5jdXJDb250ZXh0LmNvbnRleHQpIHtcbiAgICAgICAgICAgIGxldCBuZXdDeCA9IG5ldyBTdGFja0NvbnRleHQodGhpcy5jdXJDb250ZXh0LnRyYWNrZXIsIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKG5ld0N4Lmhhc2ggIT0gdGhpcy5jdXJDb250ZXh0Lmhhc2gpXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5jdXJDb250ZXh0ID0gbmV3Q3g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZXRMb29rQWhlYWQobG9va0FoZWFkKSB7XG4gICAgICAgIGlmIChsb29rQWhlYWQgPiB0aGlzLmxvb2tBaGVhZCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0TG9va0FoZWFkKCk7XG4gICAgICAgICAgICB0aGlzLmxvb2tBaGVhZCA9IGxvb2tBaGVhZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJDb250ZXh0ICYmIHRoaXMuY3VyQ29udGV4dC50cmFja2VyLnN0cmljdClcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMubG9va0FoZWFkID4gMClcbiAgICAgICAgICAgIHRoaXMuZW1pdExvb2tBaGVhZCgpO1xuICAgIH1cbn1cbmNsYXNzIFN0YWNrQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IodHJhY2tlciwgY29udGV4dCkge1xuICAgICAgICB0aGlzLnRyYWNrZXIgPSB0cmFja2VyO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmhhc2ggPSB0cmFja2VyLnN0cmljdCA/IHRyYWNrZXIuaGFzaChjb250ZXh0KSA6IDA7XG4gICAgfVxufVxuLy8gVXNlZCB0byBjaGVhcGx5IHJ1biBzb21lIHJlZHVjdGlvbnMgdG8gc2NhbiBhaGVhZCB3aXRob3V0IG11dGF0aW5nXG4vLyBhbiBlbnRpcmUgc3RhY2tcbmNsYXNzIFNpbXVsYXRlZFN0YWNrIHtcbiAgICBjb25zdHJ1Y3RvcihzdGFydCkge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGFydC5zdGF0ZTtcbiAgICAgICAgdGhpcy5zdGFjayA9IHN0YXJ0LnN0YWNrO1xuICAgICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0YWNrLmxlbmd0aDtcbiAgICB9XG4gICAgcmVkdWNlKGFjdGlvbikge1xuICAgICAgICBsZXQgdGVybSA9IGFjdGlvbiAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi8sIGRlcHRoID0gYWN0aW9uID4+IDE5IC8qIEFjdGlvbi5SZWR1Y2VEZXB0aFNoaWZ0ICovO1xuICAgICAgICBpZiAoZGVwdGggPT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2sgPT0gdGhpcy5zdGFydC5zdGFjaylcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gdGhpcy5zdGFjay5zbGljZSgpO1xuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuc3RhdGUsIDAsIDApO1xuICAgICAgICAgICAgdGhpcy5iYXNlICs9IDM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJhc2UgLT0gKGRlcHRoIC0gMSkgKiAzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBnb3RvID0gdGhpcy5zdGFydC5wLnBhcnNlci5nZXRHb3RvKHRoaXMuc3RhY2tbdGhpcy5iYXNlIC0gM10sIHRlcm0sIHRydWUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gZ290bztcbiAgICB9XG59XG4vLyBUaGlzIGlzIGdpdmVuIHRvIGBUcmVlLmJ1aWxkYCB0byBidWlsZCBhIGJ1ZmZlciwgYW5kIGVuY2Fwc3VsYXRlc1xuLy8gdGhlIHBhcmVudC1zdGFjay13YWxraW5nIG5lY2Vzc2FyeSB0byByZWFkIHRoZSBub2Rlcy5cbmNsYXNzIFN0YWNrQnVmZmVyQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihzdGFjaywgcG9zLCBpbmRleCkge1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gc3RhY2suYnVmZmVyO1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PSAwKVxuICAgICAgICAgICAgdGhpcy5tYXliZU5leHQoKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShzdGFjaywgcG9zID0gc3RhY2suYnVmZmVyQmFzZSArIHN0YWNrLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFja0J1ZmZlckN1cnNvcihzdGFjaywgcG9zLCBwb3MgLSBzdGFjay5idWZmZXJCYXNlKTtcbiAgICB9XG4gICAgbWF5YmVOZXh0KCkge1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuc3RhY2sucGFyZW50O1xuICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy5zdGFjay5idWZmZXJCYXNlIC0gbmV4dC5idWZmZXJCYXNlO1xuICAgICAgICAgICAgdGhpcy5zdGFjayA9IG5leHQ7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5leHQuYnVmZmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSA0XTsgfVxuICAgIGdldCBzdGFydCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAzXTsgfVxuICAgIGdldCBlbmQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gMl07IH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAxXTsgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIHRoaXMuaW5kZXggLT0gNDtcbiAgICAgICAgdGhpcy5wb3MgLT0gNDtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gMClcbiAgICAgICAgICAgIHRoaXMubWF5YmVOZXh0KCk7XG4gICAgfVxuICAgIGZvcmsoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhY2tCdWZmZXJDdXJzb3IodGhpcy5zdGFjaywgdGhpcy5wb3MsIHRoaXMuaW5kZXgpO1xuICAgIH1cbn1cblxuLy8gU2VlIGxlemVyLWdlbmVyYXRvci9zcmMvZW5jb2RlLnRzIGZvciBjb21tZW50cyBhYm91dCB0aGUgZW5jb2Rpbmdcbi8vIHVzZWQgaGVyZVxuZnVuY3Rpb24gZGVjb2RlQXJyYXkoaW5wdXQsIFR5cGUgPSBVaW50MTZBcnJheSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIGxldCBhcnJheSA9IG51bGw7XG4gICAgZm9yIChsZXQgcG9zID0gMCwgb3V0ID0gMDsgcG9zIDwgaW5wdXQubGVuZ3RoOykge1xuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQocG9zKyspLCBzdG9wID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobmV4dCA9PSAxMjYgLyogRW5jb2RlLkJpZ1ZhbENvZGUgKi8pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IDY1NTM1IC8qIEVuY29kZS5CaWdWYWwgKi87XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV4dCA+PSA5MiAvKiBFbmNvZGUuR2FwMiAqLylcbiAgICAgICAgICAgICAgICBuZXh0LS07XG4gICAgICAgICAgICBpZiAobmV4dCA+PSAzNCAvKiBFbmNvZGUuR2FwMSAqLylcbiAgICAgICAgICAgICAgICBuZXh0LS07XG4gICAgICAgICAgICBsZXQgZGlnaXQgPSBuZXh0IC0gMzIgLyogRW5jb2RlLlN0YXJ0ICovO1xuICAgICAgICAgICAgaWYgKGRpZ2l0ID49IDQ2IC8qIEVuY29kZS5CYXNlICovKSB7XG4gICAgICAgICAgICAgICAgZGlnaXQgLT0gNDYgLyogRW5jb2RlLkJhc2UgKi87XG4gICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSArPSBkaWdpdDtcbiAgICAgICAgICAgIGlmIChzdG9wKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdmFsdWUgKj0gNDYgLyogRW5jb2RlLkJhc2UgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFycmF5KVxuICAgICAgICAgICAgYXJyYXlbb3V0KytdID0gdmFsdWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGFycmF5ID0gbmV3IFR5cGUodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbmNsYXNzIENhY2hlZFRva2VuIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnZhbHVlID0gLTE7XG4gICAgICAgIHRoaXMuZW5kID0gLTE7XG4gICAgICAgIHRoaXMuZXh0ZW5kZWQgPSAtMTtcbiAgICAgICAgdGhpcy5sb29rQWhlYWQgPSAwO1xuICAgICAgICB0aGlzLm1hc2sgPSAwO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSAwO1xuICAgIH1cbn1cbmNvbnN0IG51bGxUb2tlbiA9IG5ldyBDYWNoZWRUb2tlbjtcbi8qKlxuW1Rva2VuaXplcnNdKCNsci5FeHRlcm5hbFRva2VuaXplcikgaW50ZXJhY3Qgd2l0aCB0aGUgaW5wdXRcbnRocm91Z2ggdGhpcyBpbnRlcmZhY2UuIEl0IHByZXNlbnRzIHRoZSBpbnB1dCBhcyBhIHN0cmVhbSBvZlxuY2hhcmFjdGVycywgdHJhY2tpbmcgbG9va2FoZWFkIGFuZCBoaWRpbmcgdGhlIGNvbXBsZXhpdHkgb2ZcbltyYW5nZXNdKCNjb21tb24uUGFyc2VyLnBhcnNlXnJhbmdlcykgZnJvbSB0b2tlbml6ZXIgY29kZS5cbiovXG5jbGFzcyBJbnB1dFN0cmVhbSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGlucHV0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJhbmdlcykge1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2h1bmsgPSBcIlwiO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2h1bmtPZmYgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgQmFja3VwIGNodW5rXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2h1bmsyID0gXCJcIjtcbiAgICAgICAgdGhpcy5jaHVuazJQb3MgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIGNoYXJhY3RlciBjb2RlIG9mIHRoZSBuZXh0IGNvZGUgdW5pdCBpbiB0aGUgaW5wdXQsIG9yIC0xXG4gICAgICAgIHdoZW4gdGhlIHN0cmVhbSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uZXh0ID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy50b2tlbiA9IG51bGxUb2tlbjtcbiAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5wb3MgPSB0aGlzLmNodW5rUG9zID0gcmFuZ2VzWzBdLmZyb207XG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZXNbMF07XG4gICAgICAgIHRoaXMuZW5kID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS50bztcbiAgICAgICAgdGhpcy5yZWFkTmV4dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlc29sdmVPZmZzZXQob2Zmc2V0LCBhc3NvYykge1xuICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLnJhbmdlLCBpbmRleCA9IHRoaXMucmFuZ2VJbmRleDtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMucG9zICsgb2Zmc2V0O1xuICAgICAgICB3aGlsZSAocG9zIDwgcmFuZ2UuZnJvbSkge1xuICAgICAgICAgICAgaWYgKCFpbmRleClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5yYW5nZXNbLS1pbmRleF07XG4gICAgICAgICAgICBwb3MgLT0gcmFuZ2UuZnJvbSAtIG5leHQudG87XG4gICAgICAgICAgICByYW5nZSA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGFzc29jIDwgMCA/IHBvcyA+IHJhbmdlLnRvIDogcG9zID49IHJhbmdlLnRvKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5yYW5nZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5yYW5nZXNbKytpbmRleF07XG4gICAgICAgICAgICBwb3MgKz0gbmV4dC5mcm9tIC0gcmFuZ2UudG87XG4gICAgICAgICAgICByYW5nZSA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjbGlwUG9zKHBvcykge1xuICAgICAgICBpZiAocG9zID49IHRoaXMucmFuZ2UuZnJvbSAmJiBwb3MgPCB0aGlzLnJhbmdlLnRvKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2YgdGhpcy5yYW5nZXMpXG4gICAgICAgICAgICBpZiAocmFuZ2UudG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHBvcywgcmFuZ2UuZnJvbSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgTG9vayBhdCBhIGNvZGUgdW5pdCBuZWFyIHRoZSBzdHJlYW0gcG9zaXRpb24uIGAucGVlaygwKWAgZXF1YWxzXG4gICAgYC5uZXh0YCwgYC5wZWVrKC0xKWAgZ2l2ZXMgeW91IHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIsIGFuZCBzb1xuICAgIG9uLlxuICAgIFxuICAgIE5vdGUgdGhhdCBsb29raW5nIGFyb3VuZCBkdXJpbmcgdG9rZW5pemluZyBjcmVhdGVzIGRlcGVuZGVuY2llc1xuICAgIG9uIHBvdGVudGlhbGx5IGZhci1hd2F5IGNvbnRlbnQsIHdoaWNoIG1heSByZWR1Y2UgdGhlXG4gICAgZWZmZWN0aXZlbmVzcyBpbmNyZW1lbnRhbCBwYXJzaW5nXHUyMDE0d2hlbiBsb29raW5nIGZvcndhcmRcdTIwMTRvciBldmVuXG4gICAgY2F1c2UgaW52YWxpZCByZXBhcnNlcyB3aGVuIGxvb2tpbmcgYmFja3dhcmQgbW9yZSB0aGFuIDI1IGNvZGVcbiAgICB1bml0cywgc2luY2UgdGhlIGxpYnJhcnkgZG9lcyBub3QgdHJhY2sgbG9va2JlaGluZC5cbiAgICAqL1xuICAgIHBlZWsob2Zmc2V0KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNodW5rT2ZmICsgb2Zmc2V0LCBwb3MsIHJlc3VsdDtcbiAgICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBwb3MgPSB0aGlzLnBvcyArIG9mZnNldDtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY2h1bmsuY2hhckNvZGVBdChpZHgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlT2Zmc2V0KG9mZnNldCwgMSk7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICBwb3MgPSByZXNvbHZlZDtcbiAgICAgICAgICAgIGlmIChwb3MgPj0gdGhpcy5jaHVuazJQb3MgJiYgcG9zIDwgdGhpcy5jaHVuazJQb3MgKyB0aGlzLmNodW5rMi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmNodW5rMi5jaGFyQ29kZUF0KHBvcyAtIHRoaXMuY2h1bmsyUG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpID0gdGhpcy5yYW5nZUluZGV4LCByYW5nZSA9IHRoaXMucmFuZ2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJhbmdlLnRvIDw9IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLnJhbmdlc1srK2ldO1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmsyID0gdGhpcy5pbnB1dC5jaHVuayh0aGlzLmNodW5rMlBvcyA9IHBvcyk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyArIHRoaXMuY2h1bmsyLmxlbmd0aCA+IHJhbmdlLnRvKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNodW5rMiA9IHRoaXMuY2h1bmsyLnNsaWNlKDAsIHJhbmdlLnRvIC0gcG9zKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmNodW5rMi5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgPj0gdGhpcy50b2tlbi5sb29rQWhlYWQpXG4gICAgICAgICAgICB0aGlzLnRva2VuLmxvb2tBaGVhZCA9IHBvcyArIDE7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEFjY2VwdCBhIHRva2VuLiBCeSBkZWZhdWx0LCB0aGUgZW5kIG9mIHRoZSB0b2tlbiBpcyBzZXQgdG8gdGhlXG4gICAgY3VycmVudCBzdHJlYW0gcG9zaXRpb24sIGJ1dCB5b3UgY2FuIHBhc3MgYW4gb2Zmc2V0IChyZWxhdGl2ZSB0b1xuICAgIHRoZSBzdHJlYW0gcG9zaXRpb24pIHRvIGNoYW5nZSB0aGF0LlxuICAgICovXG4gICAgYWNjZXB0VG9rZW4odG9rZW4sIGVuZE9mZnNldCA9IDApIHtcbiAgICAgICAgbGV0IGVuZCA9IGVuZE9mZnNldCA/IHRoaXMucmVzb2x2ZU9mZnNldChlbmRPZmZzZXQsIC0xKSA6IHRoaXMucG9zO1xuICAgICAgICBpZiAoZW5kID09IG51bGwgfHwgZW5kIDwgdGhpcy50b2tlbi5zdGFydClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVG9rZW4gZW5kIG91dCBvZiBib3VuZHNcIik7XG4gICAgICAgIHRoaXMudG9rZW4udmFsdWUgPSB0b2tlbjtcbiAgICAgICAgdGhpcy50b2tlbi5lbmQgPSBlbmQ7XG4gICAgfVxuICAgIGdldENodW5rKCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5jaHVuazJQb3MgJiYgdGhpcy5wb3MgPCB0aGlzLmNodW5rMlBvcyArIHRoaXMuY2h1bmsyLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHsgY2h1bmssIGNodW5rUG9zIH0gPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5jaHVuayA9IHRoaXMuY2h1bmsyO1xuICAgICAgICAgICAgdGhpcy5jaHVua1BvcyA9IHRoaXMuY2h1bmsyUG9zO1xuICAgICAgICAgICAgdGhpcy5jaHVuazIgPSBjaHVuaztcbiAgICAgICAgICAgIHRoaXMuY2h1bmsyUG9zID0gY2h1bmtQb3M7XG4gICAgICAgICAgICB0aGlzLmNodW5rT2ZmID0gdGhpcy5wb3MgLSB0aGlzLmNodW5rUG9zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaHVuazIgPSB0aGlzLmNodW5rO1xuICAgICAgICAgICAgdGhpcy5jaHVuazJQb3MgPSB0aGlzLmNodW5rUG9zO1xuICAgICAgICAgICAgbGV0IG5leHRDaHVuayA9IHRoaXMuaW5wdXQuY2h1bmsodGhpcy5wb3MpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMucG9zICsgbmV4dENodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsgPSBlbmQgPiB0aGlzLnJhbmdlLnRvID8gbmV4dENodW5rLnNsaWNlKDAsIHRoaXMucmFuZ2UudG8gLSB0aGlzLnBvcykgOiBuZXh0Q2h1bms7XG4gICAgICAgICAgICB0aGlzLmNodW5rUG9zID0gdGhpcy5wb3M7XG4gICAgICAgICAgICB0aGlzLmNodW5rT2ZmID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtPZmYgPj0gdGhpcy5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2h1bmsoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNodW5rT2ZmID09IHRoaXMuY2h1bmsubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0ID0gdGhpcy5jaHVuay5jaGFyQ29kZUF0KHRoaXMuY2h1bmtPZmYpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBzdHJlYW0gZm9yd2FyZCBOIChkZWZhdWx0cyB0byAxKSBjb2RlIHVuaXRzLiBSZXR1cm5zXG4gICAgdGhlIG5ldyB2YWx1ZSBvZiBbYG5leHRgXSgjbHIuSW5wdXRTdHJlYW0ubmV4dCkuXG4gICAgKi9cbiAgICBhZHZhbmNlKG4gPSAxKSB7XG4gICAgICAgIHRoaXMuY2h1bmtPZmYgKz0gbjtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zICsgbiA+PSB0aGlzLnJhbmdlLnRvKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yYW5nZUluZGV4ID09IHRoaXMucmFuZ2VzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0RG9uZSgpO1xuICAgICAgICAgICAgbiAtPSB0aGlzLnJhbmdlLnRvIC0gdGhpcy5wb3M7XG4gICAgICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5yYW5nZXNbKyt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSB0aGlzLnJhbmdlLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3MgKz0gbjtcbiAgICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMudG9rZW4ubG9va0FoZWFkKVxuICAgICAgICAgICAgdGhpcy50b2tlbi5sb29rQWhlYWQgPSB0aGlzLnBvcyArIDE7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWROZXh0KCk7XG4gICAgfVxuICAgIHNldERvbmUoKSB7XG4gICAgICAgIHRoaXMucG9zID0gdGhpcy5jaHVua1BvcyA9IHRoaXMuZW5kO1xuICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5yYW5nZXNbdGhpcy5yYW5nZUluZGV4ID0gdGhpcy5yYW5nZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMuY2h1bmsgPSBcIlwiO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0ID0gLTE7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzZXQocG9zLCB0b2tlbikge1xuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgIHRva2VuLnN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgdG9rZW4ubG9va0FoZWFkID0gcG9zICsgMTtcbiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gdG9rZW4uZXh0ZW5kZWQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSBudWxsVG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9zICE9IHBvcykge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgICAgICBpZiAocG9zID09IHRoaXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREb25lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAocG9zIDwgdGhpcy5yYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLnJhbmdlc1stLXRoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICB3aGlsZSAocG9zID49IHRoaXMucmFuZ2UudG8pXG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHRoaXMucmFuZ2VzWysrdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgIGlmIChwb3MgPj0gdGhpcy5jaHVua1BvcyAmJiBwb3MgPCB0aGlzLmNodW5rUG9zICsgdGhpcy5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNodW5rT2ZmID0gcG9zIC0gdGhpcy5jaHVua1BvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmsgPSBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtPZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkTmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlYWQoZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKGZyb20gPj0gdGhpcy5jaHVua1BvcyAmJiB0byA8PSB0aGlzLmNodW5rUG9zICsgdGhpcy5jaHVuay5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaHVuay5zbGljZShmcm9tIC0gdGhpcy5jaHVua1BvcywgdG8gLSB0aGlzLmNodW5rUG9zKTtcbiAgICAgICAgaWYgKGZyb20gPj0gdGhpcy5jaHVuazJQb3MgJiYgdG8gPD0gdGhpcy5jaHVuazJQb3MgKyB0aGlzLmNodW5rMi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaHVuazIuc2xpY2UoZnJvbSAtIHRoaXMuY2h1bmsyUG9zLCB0byAtIHRoaXMuY2h1bmsyUG9zKTtcbiAgICAgICAgaWYgKGZyb20gPj0gdGhpcy5yYW5nZS5mcm9tICYmIHRvIDw9IHRoaXMucmFuZ2UudG8pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC5yZWFkKGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IHIgb2YgdGhpcy5yYW5nZXMpIHtcbiAgICAgICAgICAgIGlmIChyLmZyb20gPj0gdG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoci50byA+IGZyb20pXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuaW5wdXQucmVhZChNYXRoLm1heChyLmZyb20sIGZyb20pLCBNYXRoLm1pbihyLnRvLCB0bykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5jbGFzcyBUb2tlbkdyb3VwIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBpZCkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgfVxuICAgIHRva2VuKGlucHV0LCBzdGFjaykge1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHN0YWNrLnA7XG4gICAgICAgIHJlYWRUb2tlbih0aGlzLmRhdGEsIGlucHV0LCBzdGFjaywgdGhpcy5pZCwgcGFyc2VyLmRhdGEsIHBhcnNlci50b2tlblByZWNUYWJsZSk7XG4gICAgfVxufVxuVG9rZW5Hcm91cC5wcm90b3R5cGUuY29udGV4dHVhbCA9IFRva2VuR3JvdXAucHJvdG90eXBlLmZhbGxiYWNrID0gVG9rZW5Hcm91cC5wcm90b3R5cGUuZXh0ZW5kID0gZmFsc2U7XG4vKipcbkBoaWRlXG4qL1xuY2xhc3MgTG9jYWxUb2tlbkdyb3VwIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBwcmVjVGFibGUsIGVsc2VUb2tlbikge1xuICAgICAgICB0aGlzLnByZWNUYWJsZSA9IHByZWNUYWJsZTtcbiAgICAgICAgdGhpcy5lbHNlVG9rZW4gPSBlbHNlVG9rZW47XG4gICAgICAgIHRoaXMuZGF0YSA9IHR5cGVvZiBkYXRhID09IFwic3RyaW5nXCIgPyBkZWNvZGVBcnJheShkYXRhKSA6IGRhdGE7XG4gICAgfVxuICAgIHRva2VuKGlucHV0LCBzdGFjaykge1xuICAgICAgICBsZXQgc3RhcnQgPSBpbnB1dC5wb3MsIHNraXBwZWQgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgYXRFb2YgPSBpbnB1dC5uZXh0IDwgMCwgbmV4dFBvcyA9IGlucHV0LnJlc29sdmVPZmZzZXQoMSwgMSk7XG4gICAgICAgICAgICByZWFkVG9rZW4odGhpcy5kYXRhLCBpbnB1dCwgc3RhY2ssIDAsIHRoaXMuZGF0YSwgdGhpcy5wcmVjVGFibGUpO1xuICAgICAgICAgICAgaWYgKGlucHV0LnRva2VuLnZhbHVlID4gLTEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAodGhpcy5lbHNlVG9rZW4gPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWF0RW9mKVxuICAgICAgICAgICAgICAgIHNraXBwZWQrKztcbiAgICAgICAgICAgIGlmIChuZXh0UG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpbnB1dC5yZXNldChuZXh0UG9zLCBpbnB1dC50b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNraXBwZWQpIHtcbiAgICAgICAgICAgIGlucHV0LnJlc2V0KHN0YXJ0LCBpbnB1dC50b2tlbik7XG4gICAgICAgICAgICBpbnB1dC5hY2NlcHRUb2tlbih0aGlzLmVsc2VUb2tlbiwgc2tpcHBlZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5Mb2NhbFRva2VuR3JvdXAucHJvdG90eXBlLmNvbnRleHR1YWwgPSBUb2tlbkdyb3VwLnByb3RvdHlwZS5mYWxsYmFjayA9IFRva2VuR3JvdXAucHJvdG90eXBlLmV4dGVuZCA9IGZhbHNlO1xuLyoqXG5gQGV4dGVybmFsIHRva2Vuc2AgZGVjbGFyYXRpb25zIGluIHRoZSBncmFtbWFyIHNob3VsZCByZXNvbHZlIHRvXG5hbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuKi9cbmNsYXNzIEV4dGVybmFsVG9rZW5pemVyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB0b2tlbml6ZXIuIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgZnVuY3Rpb24gdGhhdCxcbiAgICBnaXZlbiBhbiBpbnB1dCBzdHJlYW0sIHNjYW5zIGZvciB0aGUgdHlwZXMgb2YgdG9rZW5zIGl0XG4gICAgcmVjb2duaXplcyBhdCB0aGUgc3RyZWFtJ3MgcG9zaXRpb24sIGFuZCBjYWxsc1xuICAgIFtgYWNjZXB0VG9rZW5gXSgjbHIuSW5wdXRTdHJlYW0uYWNjZXB0VG9rZW4pIHdoZW4gaXQgZmluZHNcbiAgICBvbmUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRva2VuLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB0aGlzLmNvbnRleHR1YWwgPSAhIW9wdGlvbnMuY29udGV4dHVhbDtcbiAgICAgICAgdGhpcy5mYWxsYmFjayA9ICEhb3B0aW9ucy5mYWxsYmFjaztcbiAgICAgICAgdGhpcy5leHRlbmQgPSAhIW9wdGlvbnMuZXh0ZW5kO1xuICAgIH1cbn1cbi8vIFRva2VuaXplciBkYXRhIGlzIHN0b3JlZCBhIGJpZyB1aW50MTYgYXJyYXkgY29udGFpbmluZywgZm9yIGVhY2hcbi8vIHN0YXRlOlxuLy9cbi8vICAtIEEgZ3JvdXAgYml0bWFzaywgaW5kaWNhdGluZyB3aGF0IHRva2VuIGdyb3VwcyBhcmUgcmVhY2hhYmxlIGZyb21cbi8vICAgIHRoaXMgc3RhdGUsIHNvIHRoYXQgcGF0aHMgdGhhdCBjYW4gb25seSBsZWFkIHRvIHRva2VucyBub3QgaW5cbi8vICAgIGFueSBvZiB0aGUgY3VycmVudCBncm91cHMgY2FuIGJlIGN1dCBvZmYgZWFybHkuXG4vL1xuLy8gIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIHN0YXRlJ3Mgc2VxdWVuY2Ugb2YgYWNjZXB0aW5nXG4vLyAgICB0b2tlbnNcbi8vXG4vLyAgLSBUaGUgbnVtYmVyIG9mIG91dGdvaW5nIGVkZ2VzIGZvciB0aGUgc3RhdGVcbi8vXG4vLyAgLSBUaGUgYWNjZXB0aW5nIHRva2VucywgYXMgKHRva2VuIGlkLCBncm91cCBtYXNrKSBwYWlyc1xuLy9cbi8vICAtIFRoZSBvdXRnb2luZyBlZGdlcywgYXMgKHN0YXJ0IGNoYXJhY3RlciwgZW5kIGNoYXJhY3Rlciwgc3RhdGVcbi8vICAgIGluZGV4KSB0cmlwbGVzLCB3aXRoIGVuZCBjaGFyYWN0ZXIgYmVpbmcgZXhjbHVzaXZlXG4vL1xuLy8gVGhpcyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoYXQgZGF0YSwgcnVubmluZyB0aHJvdWdoIGEgc3RyZWFtIGFzXG4vLyBsb25nIGFzIG5ldyBzdGF0ZXMgd2l0aCB0aGUgYSBtYXRjaGluZyBncm91cCBtYXNrIGNhbiBiZSByZWFjaGVkLFxuLy8gYW5kIHVwZGF0aW5nIGBpbnB1dC50b2tlbmAgd2hlbiBpdCBtYXRjaGVzIGEgdG9rZW4uXG5mdW5jdGlvbiByZWFkVG9rZW4oZGF0YSwgaW5wdXQsIHN0YWNrLCBncm91cCwgcHJlY1RhYmxlLCBwcmVjT2Zmc2V0KSB7XG4gICAgbGV0IHN0YXRlID0gMCwgZ3JvdXBNYXNrID0gMSA8PCBncm91cCwgeyBkaWFsZWN0IH0gPSBzdGFjay5wLnBhcnNlcjtcbiAgICBzY2FuOiBmb3IgKDs7KSB7XG4gICAgICAgIGlmICgoZ3JvdXBNYXNrICYgZGF0YVtzdGF0ZV0pID09IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGFjY0VuZCA9IGRhdGFbc3RhdGUgKyAxXTtcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIHN0YXRlIGNhbiBsZWFkIHRvIGEgdG9rZW4gaW4gdGhlIGN1cnJlbnQgZ3JvdXBcbiAgICAgICAgLy8gQWNjZXB0IHRva2VucyBpbiB0aGlzIHN0YXRlLCBwb3NzaWJseSBvdmVyd3JpdGluZ1xuICAgICAgICAvLyBsb3dlci1wcmVjZWRlbmNlIC8gc2hvcnRlciB0b2tlbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXRlICsgMzsgaSA8IGFjY0VuZDsgaSArPSAyKVxuICAgICAgICAgICAgaWYgKChkYXRhW2kgKyAxXSAmIGdyb3VwTWFzaykgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRlcm0gPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgIGlmIChkaWFsZWN0LmFsbG93cyh0ZXJtKSAmJlxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQudG9rZW4udmFsdWUgPT0gLTEgfHwgaW5wdXQudG9rZW4udmFsdWUgPT0gdGVybSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzKHRlcm0sIGlucHV0LnRva2VuLnZhbHVlLCBwcmVjVGFibGUsIHByZWNPZmZzZXQpKSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5hY2NlcHRUb2tlbih0ZXJtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dCA9IGlucHV0Lm5leHQsIGxvdyA9IDAsIGhpZ2ggPSBkYXRhW3N0YXRlICsgMl07XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgRU9GXG4gICAgICAgIGlmIChpbnB1dC5uZXh0IDwgMCAmJiBoaWdoID4gbG93ICYmIGRhdGFbYWNjRW5kICsgaGlnaCAqIDMgLSAzXSA9PSA2NTUzNSAvKiBTZXEuRW5kICovKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGRhdGFbYWNjRW5kICsgaGlnaCAqIDMgLSAxXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIHNjYW47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gYSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBzdGF0ZSdzIGVkZ2VzXG4gICAgICAgIGZvciAoOyBsb3cgPCBoaWdoOykge1xuICAgICAgICAgICAgbGV0IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxO1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gYWNjRW5kICsgbWlkICsgKG1pZCA8PCAxKTtcbiAgICAgICAgICAgIGxldCBmcm9tID0gZGF0YVtpbmRleF0sIHRvID0gZGF0YVtpbmRleCArIDFdIHx8IDB4MTAwMDA7XG4gICAgICAgICAgICBpZiAobmV4dCA8IGZyb20pXG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPj0gdG8pXG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXRlID0gZGF0YVtpbmRleCArIDJdO1xuICAgICAgICAgICAgICAgIGlucHV0LmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZSBzY2FuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRPZmZzZXQoZGF0YSwgc3RhcnQsIHRlcm0pIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQsIG5leHQ7IChuZXh0ID0gZGF0YVtpXSkgIT0gNjU1MzUgLyogU2VxLkVuZCAqLzsgaSsrKVxuICAgICAgICBpZiAobmV4dCA9PSB0ZXJtKVxuICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDtcbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBvdmVycmlkZXModG9rZW4sIHByZXYsIHRhYmxlRGF0YSwgdGFibGVPZmZzZXQpIHtcbiAgICBsZXQgaVByZXYgPSBmaW5kT2Zmc2V0KHRhYmxlRGF0YSwgdGFibGVPZmZzZXQsIHByZXYpO1xuICAgIHJldHVybiBpUHJldiA8IDAgfHwgZmluZE9mZnNldCh0YWJsZURhdGEsIHRhYmxlT2Zmc2V0LCB0b2tlbikgPCBpUHJldjtcbn1cblxuLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCB0byBjb250cm9sIGNvbnNvbGUgb3V0cHV0XG5jb25zdCB2ZXJib3NlID0gdHlwZW9mIHByb2Nlc3MgIT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudiAmJiAvXFxicGFyc2VcXGIvLnRlc3QocHJvY2Vzcy5lbnYuTE9HKTtcbmxldCBzdGFja0lEcyA9IG51bGw7XG5mdW5jdGlvbiBjdXRBdCh0cmVlLCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgY3Vyc29yID0gdHJlZS5jdXJzb3IoSXRlck1vZGUuSW5jbHVkZUFub255bW91cyk7XG4gICAgY3Vyc29yLm1vdmVUbyhwb3MpO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCEoc2lkZSA8IDAgPyBjdXJzb3IuY2hpbGRCZWZvcmUocG9zKSA6IGN1cnNvci5jaGlsZEFmdGVyKHBvcykpKVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmICgoc2lkZSA8IDAgPyBjdXJzb3IudG8gPCBwb3MgOiBjdXJzb3IuZnJvbSA+IHBvcykgJiYgIWN1cnNvci50eXBlLmlzRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWRlIDwgMCA/IE1hdGgubWF4KDAsIE1hdGgubWluKGN1cnNvci50byAtIDEsIHBvcyAtIDI1IC8qIFNhZmV0eS5NYXJnaW4gKi8pKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1pbih0cmVlLmxlbmd0aCwgTWF0aC5tYXgoY3Vyc29yLmZyb20gKyAxLCBwb3MgKyAyNSAvKiBTYWZldHkuTWFyZ2luICovKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNpZGUgPCAwID8gY3Vyc29yLnByZXZTaWJsaW5nKCkgOiBjdXJzb3IubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWRlIDwgMCA/IDAgOiB0cmVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBGcmFnbWVudEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoZnJhZ21lbnRzLCBub2RlU2V0KSB7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLm5vZGVTZXQgPSBub2RlU2V0O1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYWZlRnJvbSA9IC0xO1xuICAgICAgICB0aGlzLnNhZmVUbyA9IC0xO1xuICAgICAgICB0aGlzLnRyZWVzID0gW107XG4gICAgICAgIHRoaXMuc3RhcnQgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRleCA9IFtdO1xuICAgICAgICB0aGlzLm5leHRGcmFnbWVudCgpO1xuICAgIH1cbiAgICBuZXh0RnJhZ21lbnQoKSB7XG4gICAgICAgIGxldCBmciA9IHRoaXMuZnJhZ21lbnQgPSB0aGlzLmkgPT0gdGhpcy5mcmFnbWVudHMubGVuZ3RoID8gbnVsbCA6IHRoaXMuZnJhZ21lbnRzW3RoaXMuaSsrXTtcbiAgICAgICAgaWYgKGZyKSB7XG4gICAgICAgICAgICB0aGlzLnNhZmVGcm9tID0gZnIub3BlblN0YXJ0ID8gY3V0QXQoZnIudHJlZSwgZnIuZnJvbSArIGZyLm9mZnNldCwgMSkgLSBmci5vZmZzZXQgOiBmci5mcm9tO1xuICAgICAgICAgICAgdGhpcy5zYWZlVG8gPSBmci5vcGVuRW5kID8gY3V0QXQoZnIudHJlZSwgZnIudG8gKyBmci5vZmZzZXQsIC0xKSAtIGZyLm9mZnNldCA6IGZyLnRvO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMudHJlZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0LnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXgucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyZWVzLnB1c2goZnIudHJlZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0LnB1c2goLWZyLm9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLmluZGV4LnB1c2goMCk7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGFydCA9IHRoaXMuc2FmZUZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGFydCA9IDFlOTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBgcG9zYCBtdXN0IGJlID49IGFueSBwcmV2aW91c2x5IGdpdmVuIGBwb3NgIGZvciB0aGlzIGN1cnNvclxuICAgIG5vZGVBdChwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA8IHRoaXMubmV4dFN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlICh0aGlzLmZyYWdtZW50ICYmIHRoaXMuc2FmZVRvIDw9IHBvcylcbiAgICAgICAgICAgIHRoaXMubmV4dEZyYWdtZW50KCk7XG4gICAgICAgIGlmICghdGhpcy5mcmFnbWVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMudHJlZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGlmIChsYXN0IDwgMCkgeyAvLyBFbmQgb2YgdHJlZVxuICAgICAgICAgICAgICAgIHRoaXMubmV4dEZyYWdtZW50KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy50cmVlc1tsYXN0XSwgaW5kZXggPSB0aGlzLmluZGV4W2xhc3RdO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IHRvcC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleC5wb3AoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBuZXh0ID0gdG9wLmNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuc3RhcnRbbGFzdF0gKyB0b3AucG9zaXRpb25zW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzdGFydCA+IHBvcykge1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFRyZWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IHRoaXMuc2FmZUZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICsgbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPD0gdGhpcy5zYWZlVG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsb29rQWhlYWQgPSBuZXh0LnByb3AoTm9kZVByb3AubG9va0FoZWFkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9va0FoZWFkIHx8IGVuZCArIGxvb2tBaGVhZCA8IHRoaXMuZnJhZ21lbnQudG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleFtsYXN0XSsrO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydCArIG5leHQubGVuZ3RoID49IE1hdGgubWF4KHRoaXMuc2FmZUZyb20sIHBvcykpIHsgLy8gRW50ZXIgdGhpcyBub2RlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZXMucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydC5wdXNoKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleC5wdXNoKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhbbGFzdF0rKztcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGFydCA9IHN0YXJ0ICsgbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBUb2tlbkNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIHN0cmVhbSkge1xuICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy50b2tlbnMgPSBbXTtcbiAgICAgICAgdGhpcy5tYWluVG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy50b2tlbnMgPSBwYXJzZXIudG9rZW5pemVycy5tYXAoXyA9PiBuZXcgQ2FjaGVkVG9rZW4pO1xuICAgIH1cbiAgICBnZXRBY3Rpb25zKHN0YWNrKSB7XG4gICAgICAgIGxldCBhY3Rpb25JbmRleCA9IDA7XG4gICAgICAgIGxldCBtYWluID0gbnVsbDtcbiAgICAgICAgbGV0IHsgcGFyc2VyIH0gPSBzdGFjay5wLCB7IHRva2VuaXplcnMgfSA9IHBhcnNlcjtcbiAgICAgICAgbGV0IG1hc2sgPSBwYXJzZXIuc3RhdGVTbG90KHN0YWNrLnN0YXRlLCAzIC8qIFBhcnNlU3RhdGUuVG9rZW5pemVyTWFzayAqLyk7XG4gICAgICAgIGxldCBjb250ZXh0ID0gc3RhY2suY3VyQ29udGV4dCA/IHN0YWNrLmN1ckNvbnRleHQuaGFzaCA6IDA7XG4gICAgICAgIGxldCBsb29rQWhlYWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgoKDEgPDwgaSkgJiBtYXNrKSA9PSAwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHRva2VuaXplciA9IHRva2VuaXplcnNbaV0sIHRva2VuID0gdGhpcy50b2tlbnNbaV07XG4gICAgICAgICAgICBpZiAobWFpbiAmJiAhdG9rZW5pemVyLmZhbGxiYWNrKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRva2VuaXplci5jb250ZXh0dWFsIHx8IHRva2VuLnN0YXJ0ICE9IHN0YWNrLnBvcyB8fCB0b2tlbi5tYXNrICE9IG1hc2sgfHwgdG9rZW4uY29udGV4dCAhPSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZWRUb2tlbih0b2tlbiwgdG9rZW5pemVyLCBzdGFjayk7XG4gICAgICAgICAgICAgICAgdG9rZW4ubWFzayA9IG1hc2s7XG4gICAgICAgICAgICAgICAgdG9rZW4uY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9rZW4ubG9va0FoZWFkID4gdG9rZW4uZW5kICsgMjUgLyogU2FmZXR5Lk1hcmdpbiAqLylcbiAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSBNYXRoLm1heCh0b2tlbi5sb29rQWhlYWQsIGxvb2tBaGVhZCk7XG4gICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgIT0gMCAvKiBUZXJtLkVyciAqLykge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gYWN0aW9uSW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4dGVuZGVkID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbkluZGV4ID0gdGhpcy5hZGRBY3Rpb25zKHN0YWNrLCB0b2tlbi5leHRlbmRlZCwgdG9rZW4uZW5kLCBhY3Rpb25JbmRleCk7XG4gICAgICAgICAgICAgICAgYWN0aW9uSW5kZXggPSB0aGlzLmFkZEFjdGlvbnMoc3RhY2ssIHRva2VuLnZhbHVlLCB0b2tlbi5lbmQsIGFjdGlvbkluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRva2VuaXplci5leHRlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uSW5kZXggPiBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLmFjdGlvbnMubGVuZ3RoID4gYWN0aW9uSW5kZXgpXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMucG9wKCk7XG4gICAgICAgIGlmIChsb29rQWhlYWQpXG4gICAgICAgICAgICBzdGFjay5zZXRMb29rQWhlYWQobG9va0FoZWFkKTtcbiAgICAgICAgaWYgKCFtYWluICYmIHN0YWNrLnBvcyA9PSB0aGlzLnN0cmVhbS5lbmQpIHtcbiAgICAgICAgICAgIG1haW4gPSBuZXcgQ2FjaGVkVG9rZW47XG4gICAgICAgICAgICBtYWluLnZhbHVlID0gc3RhY2sucC5wYXJzZXIuZW9mVGVybTtcbiAgICAgICAgICAgIG1haW4uc3RhcnQgPSBtYWluLmVuZCA9IHN0YWNrLnBvcztcbiAgICAgICAgICAgIGFjdGlvbkluZGV4ID0gdGhpcy5hZGRBY3Rpb25zKHN0YWNrLCBtYWluLnZhbHVlLCBtYWluLmVuZCwgYWN0aW9uSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFpblRva2VuID0gbWFpbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucztcbiAgICB9XG4gICAgZ2V0TWFpblRva2VuKHN0YWNrKSB7XG4gICAgICAgIGlmICh0aGlzLm1haW5Ub2tlbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5Ub2tlbjtcbiAgICAgICAgbGV0IG1haW4gPSBuZXcgQ2FjaGVkVG9rZW4sIHsgcG9zLCBwIH0gPSBzdGFjaztcbiAgICAgICAgbWFpbi5zdGFydCA9IHBvcztcbiAgICAgICAgbWFpbi5lbmQgPSBNYXRoLm1pbihwb3MgKyAxLCBwLnN0cmVhbS5lbmQpO1xuICAgICAgICBtYWluLnZhbHVlID0gcG9zID09IHAuc3RyZWFtLmVuZCA/IHAucGFyc2VyLmVvZlRlcm0gOiAwIC8qIFRlcm0uRXJyICovO1xuICAgICAgICByZXR1cm4gbWFpbjtcbiAgICB9XG4gICAgdXBkYXRlQ2FjaGVkVG9rZW4odG9rZW4sIHRva2VuaXplciwgc3RhY2spIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zdHJlYW0uY2xpcFBvcyhzdGFjay5wb3MpO1xuICAgICAgICB0b2tlbml6ZXIudG9rZW4odGhpcy5zdHJlYW0ucmVzZXQoc3RhcnQsIHRva2VuKSwgc3RhY2spO1xuICAgICAgICBpZiAodG9rZW4udmFsdWUgPiAtMSkge1xuICAgICAgICAgICAgbGV0IHsgcGFyc2VyIH0gPSBzdGFjay5wO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJzZXIuc3BlY2lhbGl6ZWQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlci5zcGVjaWFsaXplZFtpXSA9PSB0b2tlbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcGFyc2VyLnNwZWNpYWxpemVyc1tpXSh0aGlzLnN0cmVhbS5yZWFkKHRva2VuLnN0YXJ0LCB0b2tlbi5lbmQpLCBzdGFjayk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPj0gMCAmJiBzdGFjay5wLnBhcnNlci5kaWFsZWN0LmFsbG93cyhyZXN1bHQgPj4gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ICYgMSkgPT0gMCAvKiBTcGVjaWFsaXplLlNwZWNpYWxpemUgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSByZXN1bHQgPj4gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5leHRlbmRlZCA9IHJlc3VsdCA+PiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b2tlbi52YWx1ZSA9IDAgLyogVGVybS5FcnIgKi87XG4gICAgICAgICAgICB0b2tlbi5lbmQgPSB0aGlzLnN0cmVhbS5jbGlwUG9zKHN0YXJ0ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHV0QWN0aW9uKGFjdGlvbiwgdG9rZW4sIGVuZCwgaW5kZXgpIHtcbiAgICAgICAgLy8gRG9uJ3QgYWRkIGR1cGxpY2F0ZSBhY3Rpb25zXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbnNbaV0gPT0gYWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgdGhpcy5hY3Rpb25zW2luZGV4KytdID0gYWN0aW9uO1xuICAgICAgICB0aGlzLmFjdGlvbnNbaW5kZXgrK10gPSB0b2tlbjtcbiAgICAgICAgdGhpcy5hY3Rpb25zW2luZGV4KytdID0gZW5kO1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGFkZEFjdGlvbnMoc3RhY2ssIHRva2VuLCBlbmQsIGluZGV4KSB7XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSBzdGFjaywgeyBwYXJzZXIgfSA9IHN0YWNrLnAsIHsgZGF0YSB9ID0gcGFyc2VyO1xuICAgICAgICBmb3IgKGxldCBzZXQgPSAwOyBzZXQgPCAyOyBzZXQrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBhcnNlci5zdGF0ZVNsb3Qoc3RhdGUsIHNldCA/IDIgLyogUGFyc2VTdGF0ZS5Ta2lwICovIDogMSAvKiBQYXJzZVN0YXRlLkFjdGlvbnMgKi8pOzsgaSArPSAzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFbaV0gPT0gNjU1MzUgLyogU2VxLkVuZCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVtpICsgMV0gPT0gMSAvKiBTZXEuTmV4dCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHBhaXIoZGF0YSwgaSArIDIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDAgJiYgZGF0YVtpICsgMV0gPT0gMiAvKiBTZXEuT3RoZXIgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLnB1dEFjdGlvbihwYWlyKGRhdGEsIGkgKyAyKSwgdG9rZW4sIGVuZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFbaV0gPT0gdG9rZW4pXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5wdXRBY3Rpb24ocGFpcihkYXRhLCBpICsgMSksIHRva2VuLCBlbmQsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufVxuY2xhc3MgUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLnJlY292ZXJpbmcgPSAwO1xuICAgICAgICB0aGlzLm5leHRTdGFja0lEID0gMHgyNjU0OyAvLyBcdTI2NTQsIFx1MjY1NSwgXHUyNjU2LCBcdTI2NTcsIFx1MjY1OCwgXHUyNjU5LCBcdTI2NjAsIFx1MjY2MSwgXHUyNjYyLCBcdTI2NjMsIFx1MjY2NCwgXHUyNjY1LCBcdTI2NjYsIFx1MjY2N1xuICAgICAgICB0aGlzLm1pblN0YWNrUG9zID0gMDtcbiAgICAgICAgdGhpcy5yZXVzZWQgPSBbXTtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RCaWdSZWR1Y3Rpb25TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RCaWdSZWR1Y3Rpb25TaXplID0gMDtcbiAgICAgICAgdGhpcy5iaWdSZWR1Y3Rpb25Db3VudCA9IDA7XG4gICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IElucHV0U3RyZWFtKGlucHV0LCByYW5nZXMpO1xuICAgICAgICB0aGlzLnRva2VucyA9IG5ldyBUb2tlbkNhY2hlKHBhcnNlciwgdGhpcy5zdHJlYW0pO1xuICAgICAgICB0aGlzLnRvcFRlcm0gPSBwYXJzZXIudG9wWzFdO1xuICAgICAgICBsZXQgeyBmcm9tIH0gPSByYW5nZXNbMF07XG4gICAgICAgIHRoaXMuc3RhY2tzID0gW1N0YWNrLnN0YXJ0KHRoaXMsIHBhcnNlci50b3BbMF0sIGZyb20pXTtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHMubGVuZ3RoICYmIHRoaXMuc3RyZWFtLmVuZCAtIGZyb20gPiBwYXJzZXIuYnVmZmVyTGVuZ3RoICogNFxuICAgICAgICAgICAgPyBuZXcgRnJhZ21lbnRDdXJzb3IoZnJhZ21lbnRzLCBwYXJzZXIubm9kZVNldCkgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgcGFyc2VkUG9zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW5TdGFja1BvcztcbiAgICB9XG4gICAgLy8gTW92ZSB0aGUgcGFyc2VyIGZvcndhcmQuIFRoaXMgd2lsbCBwcm9jZXNzIGFsbCBwYXJzZSBzdGFja3MgYXRcbiAgICAvLyBgdGhpcy5wb3NgIGFuZCB0cnkgdG8gYWR2YW5jZSB0aGVtIHRvIGEgZnVydGhlciBwb3NpdGlvbi4gSWYgbm9cbiAgICAvLyBzdGFjayBmb3Igc3VjaCBhIHBvc2l0aW9uIGlzIGZvdW5kLCBpdCdsbCBzdGFydCBlcnJvci1yZWNvdmVyeS5cbiAgICAvL1xuICAgIC8vIFdoZW4gdGhlIHBhcnNlIGlzIGZpbmlzaGVkLCB0aGlzIHdpbGwgcmV0dXJuIGEgc3ludGF4IHRyZWUuIFdoZW5cbiAgICAvLyBub3QsIGl0IHJldHVybnMgYG51bGxgLlxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIGxldCBzdGFja3MgPSB0aGlzLnN0YWNrcywgcG9zID0gdGhpcy5taW5TdGFja1BvcztcbiAgICAgICAgLy8gVGhpcyB3aWxsIGhvbGQgc3RhY2tzIGJleW9uZCBgcG9zYC5cbiAgICAgICAgbGV0IG5ld1N0YWNrcyA9IHRoaXMuc3RhY2tzID0gW107XG4gICAgICAgIGxldCBzdG9wcGVkLCBzdG9wcGVkVG9rZW5zO1xuICAgICAgICAvLyBJZiBhIGxhcmdlIGFtb3VudCBvZiByZWR1Y3Rpb25zIGhhcHBlbmVkIHdpdGggdGhlIHNhbWUgc3RhcnRcbiAgICAgICAgLy8gcG9zaXRpb24sIGZvcmNlIHRoZSBzdGFjayBvdXQgb2YgdGhhdCBwcm9kdWN0aW9uIGluIG9yZGVyIHRvXG4gICAgICAgIC8vIGF2b2lkIGNyZWF0aW5nIGEgdHJlZSB0b28gZGVlcCB0byByZWN1cnNlIHRocm91Z2guXG4gICAgICAgIC8vIChUaGlzIGlzIGFuIHVnbHkga2x1ZGdlLCBiZWNhdXNlIHVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm9cbiAgICAgICAgLy8gc3RyYWlnaHRmb3J3YXJkLCBjaGVhcCB3YXkgdG8gY2hlY2sgZm9yIHRoaXMgaGFwcGVuaW5nLCBkdWUgdG9cbiAgICAgICAgLy8gdGhlIGhpc3Rvcnkgb2YgcmVkdWN0aW9ucyBvbmx5IGJlaW5nIGF2YWlsYWJsZSBpbiBhblxuICAgICAgICAvLyBleHBlbnNpdmUtdG8tYWNjZXNzIGZvcm1hdCBpbiB0aGUgc3RhY2sgYnVmZmVycy4pXG4gICAgICAgIGlmICh0aGlzLmJpZ1JlZHVjdGlvbkNvdW50ID4gMzAwIC8qIFJlYy5NYXhMZWZ0QXNzb2NpYXRpdmVSZWR1Y3Rpb25Db3VudCAqLyAmJiBzdGFja3MubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIGxldCBbc10gPSBzdGFja3M7XG4gICAgICAgICAgICB3aGlsZSAocy5mb3JjZVJlZHVjZSgpICYmIHMuc3RhY2subGVuZ3RoICYmIHMuc3RhY2tbcy5zdGFjay5sZW5ndGggLSAyXSA+PSB0aGlzLmxhc3RCaWdSZWR1Y3Rpb25TdGFydCkgeyB9XG4gICAgICAgICAgICB0aGlzLmJpZ1JlZHVjdGlvbkNvdW50ID0gdGhpcy5sYXN0QmlnUmVkdWN0aW9uU2l6ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gS2VlcCBhZHZhbmNpbmcgYW55IHN0YWNrcyBhdCBgcG9zYCB1bnRpbCB0aGV5IGVpdGhlciBtb3ZlXG4gICAgICAgIC8vIGZvcndhcmQgb3IgY2FuJ3QgYmUgYWR2YW5jZWQuIEdhdGhlciBzdGFja3MgdGhhdCBjYW4ndCBiZVxuICAgICAgICAvLyBhZHZhbmNlZCBmdXJ0aGVyIGluIGBzdG9wcGVkYC5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFjayA9IHN0YWNrc1tpXTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5tYWluVG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChzdGFjay5wb3MgPiBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RhY2tzLnB1c2goc3RhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFkdmFuY2VTdGFjayhzdGFjaywgbmV3U3RhY2tzLCBzdGFja3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGVkID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGVkVG9rZW5zID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZC5wdXNoKHN0YWNrKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvayA9IHRoaXMudG9rZW5zLmdldE1haW5Ub2tlbihzdGFjayk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3BwZWRUb2tlbnMucHVzaCh0b2sudmFsdWUsIHRvay5lbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5ld1N0YWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IHN0b3BwZWQgJiYgZmluZEZpbmlzaGVkKHN0b3BwZWQpO1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmluaXNoIHdpdGggXCIgKyB0aGlzLnN0YWNrSUQoZmluaXNoZWQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFja1RvVHJlZShmaW5pc2hlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZXIuc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UgJiYgc3RvcHBlZClcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTdHVjayB3aXRoIHRva2VuIFwiICsgKHRoaXMudG9rZW5zLm1haW5Ub2tlbiA/IHRoaXMucGFyc2VyLmdldE5hbWUodGhpcy50b2tlbnMubWFpblRva2VuLnZhbHVlKSA6IFwibm9uZVwiKSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiTm8gcGFyc2UgYXQgXCIgKyBwb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnJlY292ZXJpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyaW5nID0gNSAvKiBSZWMuRGlzdGFuY2UgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVjb3ZlcmluZyAmJiBzdG9wcGVkKSB7XG4gICAgICAgICAgICBsZXQgZmluaXNoZWQgPSB0aGlzLnN0b3BwZWRBdCAhPSBudWxsICYmIHN0b3BwZWRbMF0ucG9zID4gdGhpcy5zdG9wcGVkQXQgPyBzdG9wcGVkWzBdXG4gICAgICAgICAgICAgICAgOiB0aGlzLnJ1blJlY292ZXJ5KHN0b3BwZWQsIHN0b3BwZWRUb2tlbnMsIG5ld1N0YWNrcyk7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGb3JjZS1maW5pc2ggXCIgKyB0aGlzLnN0YWNrSUQoZmluaXNoZWQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFja1RvVHJlZShmaW5pc2hlZC5mb3JjZUFsbCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWNvdmVyaW5nKSB7XG4gICAgICAgICAgICBsZXQgbWF4UmVtYWluaW5nID0gdGhpcy5yZWNvdmVyaW5nID09IDEgPyAxIDogdGhpcy5yZWNvdmVyaW5nICogMyAvKiBSZWMuTWF4UmVtYWluaW5nUGVyU3RlcCAqLztcbiAgICAgICAgICAgIGlmIChuZXdTdGFja3MubGVuZ3RoID4gbWF4UmVtYWluaW5nKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhY2tzLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV3U3RhY2tzLmxlbmd0aCA+IG1heFJlbWFpbmluZylcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RhY2tzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5ld1N0YWNrcy5zb21lKHMgPT4gcy5yZWR1Y2VQb3MgPiBwb3MpKVxuICAgICAgICAgICAgICAgIHRoaXMucmVjb3ZlcmluZy0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ld1N0YWNrcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBQcnVuZSBzdGFja3MgdGhhdCBhcmUgaW4gdGhlIHNhbWUgc3RhdGUsIG9yIHRoYXQgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBydW5uaW5nIHdpdGhvdXQgc3BsaXR0aW5nIGZvciBhIHdoaWxlLCB0byBhdm9pZCBnZXR0aW5nIHN0dWNrXG4gICAgICAgICAgICAvLyB3aXRoIG11bHRpcGxlIHN1Y2Nlc3NmdWwgc3RhY2tzIHJ1bm5pbmcgZW5kbGVzc2x5IG9uLlxuICAgICAgICAgICAgb3V0ZXI6IGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U3RhY2tzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBzdGFjayA9IG5ld1N0YWNrc1tpXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuZXdTdGFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG90aGVyID0gbmV3U3RhY2tzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suc2FtZVN0YXRlKG90aGVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suYnVmZmVyLmxlbmd0aCA+IDUwMCAvKiBSZWMuTWluQnVmZmVyTGVuZ3RoUHJ1bmUgKi8gJiYgb3RoZXIuYnVmZmVyLmxlbmd0aCA+IDUwMCAvKiBSZWMuTWluQnVmZmVyTGVuZ3RoUHJ1bmUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHN0YWNrLnNjb3JlIC0gb3RoZXIuc2NvcmUpIHx8IChzdGFjay5idWZmZXIubGVuZ3RoIC0gb3RoZXIuYnVmZmVyLmxlbmd0aCkpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YWNrcy5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YWNrcy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXdTdGFja3MubGVuZ3RoID4gMTIgLyogUmVjLk1heFN0YWNrQ291bnQgKi8pXG4gICAgICAgICAgICAgICAgbmV3U3RhY2tzLnNwbGljZSgxMiAvKiBSZWMuTWF4U3RhY2tDb3VudCAqLywgbmV3U3RhY2tzLmxlbmd0aCAtIDEyIC8qIFJlYy5NYXhTdGFja0NvdW50ICovKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pblN0YWNrUG9zID0gbmV3U3RhY2tzWzBdLnBvcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuZXdTdGFja3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobmV3U3RhY2tzW2ldLnBvcyA8IHRoaXMubWluU3RhY2tQb3MpXG4gICAgICAgICAgICAgICAgdGhpcy5taW5TdGFja1BvcyA9IG5ld1N0YWNrc1tpXS5wb3M7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdG9wQXQocG9zKSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsICYmIHRoaXMuc3RvcHBlZEF0IDwgcG9zKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBtb3ZlIHN0b3BwZWRBdCBmb3J3YXJkXCIpO1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IHBvcztcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhbiB1cGRhdGVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIHN0YWNrLCBvciBudWxsIGlmIHRoZVxuICAgIC8vIHN0YWNrIGNhbid0IGFkdmFuY2Ugbm9ybWFsbHkuIFdoZW4gYHNwbGl0YCBhbmQgYHN0YWNrc2AgYXJlXG4gICAgLy8gZ2l2ZW4sIHN0YWNrcyBzcGxpdCBvZmYgYnkgYW1iaWd1b3VzIG9wZXJhdGlvbnMgd2lsbCBiZSBwdXNoZWQgdG9cbiAgICAvLyBgc3BsaXRgLCBvciBhZGRlZCB0byBgc3RhY2tzYCBpZiB0aGV5IG1vdmUgYHBvc2AgZm9yd2FyZC5cbiAgICBhZHZhbmNlU3RhY2soc3RhY2ssIHN0YWNrcywgc3BsaXQpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gc3RhY2sucG9zLCB7IHBhcnNlciB9ID0gdGhpcztcbiAgICAgICAgbGV0IGJhc2UgPSB2ZXJib3NlID8gdGhpcy5zdGFja0lEKHN0YWNrKSArIFwiIC0+IFwiIDogXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwgJiYgc3RhcnQgPiB0aGlzLnN0b3BwZWRBdClcbiAgICAgICAgICAgIHJldHVybiBzdGFjay5mb3JjZVJlZHVjZSgpID8gc3RhY2sgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5mcmFnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdHJpY3RDeCA9IHN0YWNrLmN1ckNvbnRleHQgJiYgc3RhY2suY3VyQ29udGV4dC50cmFja2VyLnN0cmljdCwgY3hIYXNoID0gc3RyaWN0Q3ggPyBzdGFjay5jdXJDb250ZXh0Lmhhc2ggOiAwO1xuICAgICAgICAgICAgZm9yIChsZXQgY2FjaGVkID0gdGhpcy5mcmFnbWVudHMubm9kZUF0KHN0YXJ0KTsgY2FjaGVkOykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMucGFyc2VyLm5vZGVTZXQudHlwZXNbY2FjaGVkLnR5cGUuaWRdID09IGNhY2hlZC50eXBlID8gcGFyc2VyLmdldEdvdG8oc3RhY2suc3RhdGUsIGNhY2hlZC50eXBlLmlkKSA6IC0xO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA+IC0xICYmIGNhY2hlZC5sZW5ndGggJiYgKCFzdHJpY3RDeCB8fCAoY2FjaGVkLnByb3AoTm9kZVByb3AuY29udGV4dEhhc2gpIHx8IDApID09IGN4SGFzaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sudXNlTm9kZShjYWNoZWQsIG1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKHN0YWNrKSArIGAgKHZpYSByZXVzZSBvZiAke3BhcnNlci5nZXROYW1lKGNhY2hlZC50eXBlLmlkKX0pYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIShjYWNoZWQgaW5zdGFuY2VvZiBUcmVlKSB8fCBjYWNoZWQuY2hpbGRyZW4ubGVuZ3RoID09IDAgfHwgY2FjaGVkLnBvc2l0aW9uc1swXSA+IDApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IGNhY2hlZC5jaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIgaW5zdGFuY2VvZiBUcmVlICYmIGNhY2hlZC5wb3NpdGlvbnNbMF0gPT0gMClcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkID0gaW5uZXI7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVmYXVsdFJlZHVjZSA9IHBhcnNlci5zdGF0ZVNsb3Qoc3RhY2suc3RhdGUsIDQgLyogUGFyc2VTdGF0ZS5EZWZhdWx0UmVkdWNlICovKTtcbiAgICAgICAgaWYgKGRlZmF1bHRSZWR1Y2UgPiAwKSB7XG4gICAgICAgICAgICBzdGFjay5yZWR1Y2UoZGVmYXVsdFJlZHVjZSk7XG4gICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKHN0YWNrKSArIGAgKHZpYSBhbHdheXMtcmVkdWNlICR7cGFyc2VyLmdldE5hbWUoZGVmYXVsdFJlZHVjZSAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi8pfSlgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFjay5zdGFjay5sZW5ndGggPj0gODQwMCAvKiBSZWMuQ3V0RGVwdGggKi8pIHtcbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5zdGFjay5sZW5ndGggPiA2MDAwIC8qIFJlYy5DdXRUbyAqLyAmJiBzdGFjay5mb3JjZVJlZHVjZSgpKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYWN0aW9ucyA9IHRoaXMudG9rZW5zLmdldEFjdGlvbnMoc3RhY2spO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGFjdGlvbnNbaSsrXSwgdGVybSA9IGFjdGlvbnNbaSsrXSwgZW5kID0gYWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBpID09IGFjdGlvbnMubGVuZ3RoIHx8ICFzcGxpdDtcbiAgICAgICAgICAgIGxldCBsb2NhbFN0YWNrID0gbGFzdCA/IHN0YWNrIDogc3RhY2suc3BsaXQoKTtcbiAgICAgICAgICAgIGxldCBtYWluID0gdGhpcy50b2tlbnMubWFpblRva2VuO1xuICAgICAgICAgICAgbG9jYWxTdGFjay5hcHBseShhY3Rpb24sIHRlcm0sIG1haW4gPyBtYWluLnN0YXJ0IDogbG9jYWxTdGFjay5wb3MsIGVuZCk7XG4gICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKGxvY2FsU3RhY2spICsgYCAodmlhICR7KGFjdGlvbiAmIDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovKSA9PSAwID8gXCJzaGlmdFwiXG4gICAgICAgICAgICAgICAgICAgIDogYHJlZHVjZSBvZiAke3BhcnNlci5nZXROYW1lKGFjdGlvbiAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi8pfWB9IGZvciAke3BhcnNlci5nZXROYW1lKHRlcm0pfSBAICR7c3RhcnR9JHtsb2NhbFN0YWNrID09IHN0YWNrID8gXCJcIiA6IFwiLCBzcGxpdFwifSlgKTtcbiAgICAgICAgICAgIGlmIChsYXN0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAobG9jYWxTdGFjay5wb3MgPiBzdGFydClcbiAgICAgICAgICAgICAgICBzdGFja3MucHVzaChsb2NhbFN0YWNrKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzcGxpdC5wdXNoKGxvY2FsU3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQWR2YW5jZSBhIGdpdmVuIHN0YWNrIGZvcndhcmQgYXMgZmFyIGFzIGl0IHdpbGwgZ28uIFJldHVybnMgdGhlXG4gICAgLy8gKHBvc3NpYmx5IHVwZGF0ZWQpIHN0YWNrIGlmIGl0IGdvdCBzdHVjaywgb3IgbnVsbCBpZiBpdCBtb3ZlZFxuICAgIC8vIGZvcndhcmQgYW5kIHdhcyBnaXZlbiB0byBgcHVzaFN0YWNrRGVkdXBgLlxuICAgIGFkdmFuY2VGdWxseShzdGFjaywgbmV3U3RhY2tzKSB7XG4gICAgICAgIGxldCBwb3MgPSBzdGFjay5wb3M7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hZHZhbmNlU3RhY2soc3RhY2ssIG51bGwsIG51bGwpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzdGFjay5wb3MgPiBwb3MpIHtcbiAgICAgICAgICAgICAgICBwdXNoU3RhY2tEZWR1cChzdGFjaywgbmV3U3RhY2tzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBydW5SZWNvdmVyeShzdGFja3MsIHRva2VucywgbmV3U3RhY2tzKSB7XG4gICAgICAgIGxldCBmaW5pc2hlZCA9IG51bGwsIHJlc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YWNrID0gc3RhY2tzW2ldLCB0b2tlbiA9IHRva2Vuc1tpIDw8IDFdLCB0b2tlbkVuZCA9IHRva2Vuc1soaSA8PCAxKSArIDFdO1xuICAgICAgICAgICAgbGV0IGJhc2UgPSB2ZXJib3NlID8gdGhpcy5zdGFja0lEKHN0YWNrKSArIFwiIC0+IFwiIDogXCJcIjtcbiAgICAgICAgICAgIGlmIChzdGFjay5kZWFkRW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgcmVzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdGFjay5yZXN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJhc2UgKyB0aGlzLnN0YWNrSUQoc3RhY2spICsgXCIgKHJlc3RhcnRlZClcIik7XG4gICAgICAgICAgICAgICAgbGV0IGRvbmUgPSB0aGlzLmFkdmFuY2VGdWxseShzdGFjaywgbmV3U3RhY2tzKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZm9yY2UgPSBzdGFjay5zcGxpdCgpLCBmb3JjZUJhc2UgPSBiYXNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGZvcmNlLmZvcmNlUmVkdWNlKCkgJiYgaiA8IDEwIC8qIFJlYy5Gb3JjZVJlZHVjZUxpbWl0ICovOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZm9yY2VCYXNlICsgdGhpcy5zdGFja0lEKGZvcmNlKSArIFwiICh2aWEgZm9yY2UtcmVkdWNlKVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IHRoaXMuYWR2YW5jZUZ1bGx5KGZvcmNlLCBuZXdTdGFja3MpO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgZm9yY2VCYXNlID0gdGhpcy5zdGFja0lEKGZvcmNlKSArIFwiIC0+IFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaW5zZXJ0IG9mIHN0YWNrLnJlY292ZXJCeUluc2VydCh0b2tlbikpIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmFzZSArIHRoaXMuc3RhY2tJRChpbnNlcnQpICsgXCIgKHZpYSByZWNvdmVyLWluc2VydClcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlRnVsbHkoaW5zZXJ0LCBuZXdTdGFja3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc3RyZWFtLmVuZCA+IHN0YWNrLnBvcykge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbkVuZCA9PSBzdGFjay5wb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5FbmQrKztcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSAwIC8qIFRlcm0uRXJyICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFjay5yZWNvdmVyQnlEZWxldGUodG9rZW4sIHRva2VuRW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmFzZSArIHRoaXMuc3RhY2tJRChzdGFjaykgKyBgICh2aWEgcmVjb3Zlci1kZWxldGUgJHt0aGlzLnBhcnNlci5nZXROYW1lKHRva2VuKX0pYCk7XG4gICAgICAgICAgICAgICAgcHVzaFN0YWNrRGVkdXAoc3RhY2ssIG5ld1N0YWNrcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghZmluaXNoZWQgfHwgZmluaXNoZWQuc2NvcmUgPCBzdGFjay5zY29yZSkge1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gc3RhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IHRoZSBzdGFjaydzIGJ1ZmZlciB0byBhIHN5bnRheCB0cmVlLlxuICAgIHN0YWNrVG9UcmVlKHN0YWNrKSB7XG4gICAgICAgIHN0YWNrLmNsb3NlKCk7XG4gICAgICAgIHJldHVybiBUcmVlLmJ1aWxkKHsgYnVmZmVyOiBTdGFja0J1ZmZlckN1cnNvci5jcmVhdGUoc3RhY2spLFxuICAgICAgICAgICAgbm9kZVNldDogdGhpcy5wYXJzZXIubm9kZVNldCxcbiAgICAgICAgICAgIHRvcElEOiB0aGlzLnRvcFRlcm0sXG4gICAgICAgICAgICBtYXhCdWZmZXJMZW5ndGg6IHRoaXMucGFyc2VyLmJ1ZmZlckxlbmd0aCxcbiAgICAgICAgICAgIHJldXNlZDogdGhpcy5yZXVzZWQsXG4gICAgICAgICAgICBzdGFydDogdGhpcy5yYW5nZXNbMF0uZnJvbSxcbiAgICAgICAgICAgIGxlbmd0aDogc3RhY2sucG9zIC0gdGhpcy5yYW5nZXNbMF0uZnJvbSxcbiAgICAgICAgICAgIG1pblJlcGVhdFR5cGU6IHRoaXMucGFyc2VyLm1pblJlcGVhdFRlcm0gfSk7XG4gICAgfVxuICAgIHN0YWNrSUQoc3RhY2spIHtcbiAgICAgICAgbGV0IGlkID0gKHN0YWNrSURzIHx8IChzdGFja0lEcyA9IG5ldyBXZWFrTWFwKSkuZ2V0KHN0YWNrKTtcbiAgICAgICAgaWYgKCFpZClcbiAgICAgICAgICAgIHN0YWNrSURzLnNldChzdGFjaywgaWQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludCh0aGlzLm5leHRTdGFja0lEKyspKTtcbiAgICAgICAgcmV0dXJuIGlkICsgc3RhY2s7XG4gICAgfVxufVxuZnVuY3Rpb24gcHVzaFN0YWNrRGVkdXAoc3RhY2ssIG5ld1N0YWNrcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U3RhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBvdGhlciA9IG5ld1N0YWNrc1tpXTtcbiAgICAgICAgaWYgKG90aGVyLnBvcyA9PSBzdGFjay5wb3MgJiYgb3RoZXIuc2FtZVN0YXRlKHN0YWNrKSkge1xuICAgICAgICAgICAgaWYgKG5ld1N0YWNrc1tpXS5zY29yZSA8IHN0YWNrLnNjb3JlKVxuICAgICAgICAgICAgICAgIG5ld1N0YWNrc1tpXSA9IHN0YWNrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5ld1N0YWNrcy5wdXNoKHN0YWNrKTtcbn1cbmNsYXNzIERpYWxlY3Qge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgZmxhZ3MsIGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9XG4gICAgYWxsb3dzKHRlcm0pIHsgcmV0dXJuICF0aGlzLmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWRbdGVybV0gPT0gMDsgfVxufVxuY29uc3QgaWQgPSB4ID0+IHg7XG4vKipcbkNvbnRleHQgdHJhY2tlcnMgYXJlIHVzZWQgdG8gdHJhY2sgc3RhdGVmdWwgY29udGV4dCAoc3VjaCBhc1xuaW5kZW50YXRpb24gaW4gdGhlIFB5dGhvbiBncmFtbWFyLCBvciBwYXJlbnQgZWxlbWVudHMgaW4gdGhlIFhNTFxuZ3JhbW1hcikgbmVlZGVkIGJ5IGV4dGVybmFsIHRva2VuaXplcnMuIFlvdSBkZWNsYXJlIHRoZW0gaW4gYVxuZ3JhbW1hciBmaWxlIGFzIGBAY29udGV4dCBleHBvcnROYW1lIGZyb20gXCJtb2R1bGVcImAuXG5cbkNvbnRleHQgdmFsdWVzIHNob3VsZCBiZSBpbW11dGFibGUsIGFuZCBjYW4gYmUgdXBkYXRlZCAocmVwbGFjZWQpXG5vbiBzaGlmdCBvciByZWR1Y2UgYWN0aW9ucy5cblxuVGhlIGV4cG9ydCB1c2VkIGluIGEgYEBjb250ZXh0YCBkZWNsYXJhdGlvbiBzaG91bGQgYmUgb2YgdGhpc1xudHlwZS5cbiovXG5jbGFzcyBDb250ZXh0VHJhY2tlciB7XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgY29udGV4dCB0cmFja2VyLlxuICAgICovXG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3BlYy5zdGFydDtcbiAgICAgICAgdGhpcy5zaGlmdCA9IHNwZWMuc2hpZnQgfHwgaWQ7XG4gICAgICAgIHRoaXMucmVkdWNlID0gc3BlYy5yZWR1Y2UgfHwgaWQ7XG4gICAgICAgIHRoaXMucmV1c2UgPSBzcGVjLnJldXNlIHx8IGlkO1xuICAgICAgICB0aGlzLmhhc2ggPSBzcGVjLmhhc2ggfHwgKCgpID0+IDApO1xuICAgICAgICB0aGlzLnN0cmljdCA9IHNwZWMuc3RyaWN0ICE9PSBmYWxzZTtcbiAgICB9XG59XG4vKipcbkhvbGRzIHRoZSBwYXJzZSB0YWJsZXMgZm9yIGEgZ2l2ZW4gZ3JhbW1hciwgYXMgZ2VuZXJhdGVkIGJ5XG5gbGV6ZXItZ2VuZXJhdG9yYCwgYW5kIHByb3ZpZGVzIFttZXRob2RzXSgjY29tbW9uLlBhcnNlcikgdG8gcGFyc2VcbmNvbnRlbnQgd2l0aC5cbiovXG5jbGFzcyBMUlBhcnNlciBleHRlbmRzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy53cmFwcGVycyA9IFtdO1xuICAgICAgICBpZiAoc3BlYy52ZXJzaW9uICE9IDE0IC8qIEZpbGUuVmVyc2lvbiAqLylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQYXJzZXIgdmVyc2lvbiAoJHtzcGVjLnZlcnNpb259KSBkb2Vzbid0IG1hdGNoIHJ1bnRpbWUgdmVyc2lvbiAoJHsxNCAvKiBGaWxlLlZlcnNpb24gKi99KWApO1xuICAgICAgICBsZXQgbm9kZU5hbWVzID0gc3BlYy5ub2RlTmFtZXMuc3BsaXQoXCIgXCIpO1xuICAgICAgICB0aGlzLm1pblJlcGVhdFRlcm0gPSBub2RlTmFtZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWMucmVwZWF0Tm9kZUNvdW50OyBpKyspXG4gICAgICAgICAgICBub2RlTmFtZXMucHVzaChcIlwiKTtcbiAgICAgICAgbGV0IHRvcFRlcm1zID0gT2JqZWN0LmtleXMoc3BlYy50b3BSdWxlcykubWFwKHIgPT4gc3BlYy50b3BSdWxlc1tyXVsxXSk7XG4gICAgICAgIGxldCBub2RlUHJvcHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlTmFtZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBub2RlUHJvcHMucHVzaChbXSk7XG4gICAgICAgIGZ1bmN0aW9uIHNldFByb3Aobm9kZUlELCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICAgICAgbm9kZVByb3BzW25vZGVJRF0ucHVzaChbcHJvcCwgcHJvcC5kZXNlcmlhbGl6ZShTdHJpbmcodmFsdWUpKV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjLm5vZGVQcm9wcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3BTcGVjIG9mIHNwZWMubm9kZVByb3BzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3AgPSBwcm9wU3BlY1swXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgcHJvcCA9IE5vZGVQcm9wW3Byb3BdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcHJvcFNwZWMubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHByb3BTcGVjW2krK107XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb3AobmV4dCwgcHJvcCwgcHJvcFNwZWNbaSsrXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwcm9wU3BlY1tpICsgLW5leHRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IC1uZXh0OyBqID4gMDsgai0tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb3AocHJvcFNwZWNbaSsrXSwgcHJvcCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVTZXQgPSBuZXcgTm9kZVNldChub2RlTmFtZXMubWFwKChuYW1lLCBpKSA9PiBOb2RlVHlwZS5kZWZpbmUoe1xuICAgICAgICAgICAgbmFtZTogaSA+PSB0aGlzLm1pblJlcGVhdFRlcm0gPyB1bmRlZmluZWQgOiBuYW1lLFxuICAgICAgICAgICAgaWQ6IGksXG4gICAgICAgICAgICBwcm9wczogbm9kZVByb3BzW2ldLFxuICAgICAgICAgICAgdG9wOiB0b3BUZXJtcy5pbmRleE9mKGkpID4gLTEsXG4gICAgICAgICAgICBlcnJvcjogaSA9PSAwLFxuICAgICAgICAgICAgc2tpcHBlZDogc3BlYy5za2lwcGVkTm9kZXMgJiYgc3BlYy5za2lwcGVkTm9kZXMuaW5kZXhPZihpKSA+IC0xXG4gICAgICAgIH0pKSk7XG4gICAgICAgIGlmIChzcGVjLnByb3BTb3VyY2VzKVxuICAgICAgICAgICAgdGhpcy5ub2RlU2V0ID0gdGhpcy5ub2RlU2V0LmV4dGVuZCguLi5zcGVjLnByb3BTb3VyY2VzKTtcbiAgICAgICAgdGhpcy5zdHJpY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBEZWZhdWx0QnVmZmVyTGVuZ3RoO1xuICAgICAgICBsZXQgdG9rZW5BcnJheSA9IGRlY29kZUFycmF5KHNwZWMudG9rZW5EYXRhKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gc3BlYy5jb250ZXh0O1xuICAgICAgICB0aGlzLnNwZWNpYWxpemVyU3BlY3MgPSBzcGVjLnNwZWNpYWxpemVkIHx8IFtdO1xuICAgICAgICB0aGlzLnNwZWNpYWxpemVkID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuc3BlY2lhbGl6ZXJTcGVjcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3BlY2lhbGl6ZXJTcGVjcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuc3BlY2lhbGl6ZWRbaV0gPSB0aGlzLnNwZWNpYWxpemVyU3BlY3NbaV0udGVybTtcbiAgICAgICAgdGhpcy5zcGVjaWFsaXplcnMgPSB0aGlzLnNwZWNpYWxpemVyU3BlY3MubWFwKGdldFNwZWNpYWxpemVyKTtcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSBkZWNvZGVBcnJheShzcGVjLnN0YXRlcywgVWludDMyQXJyYXkpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkZWNvZGVBcnJheShzcGVjLnN0YXRlRGF0YSk7XG4gICAgICAgIHRoaXMuZ290byA9IGRlY29kZUFycmF5KHNwZWMuZ290byk7XG4gICAgICAgIHRoaXMubWF4VGVybSA9IHNwZWMubWF4VGVybTtcbiAgICAgICAgdGhpcy50b2tlbml6ZXJzID0gc3BlYy50b2tlbml6ZXJzLm1hcCh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIiA/IG5ldyBUb2tlbkdyb3VwKHRva2VuQXJyYXksIHZhbHVlKSA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy50b3BSdWxlcyA9IHNwZWMudG9wUnVsZXM7XG4gICAgICAgIHRoaXMuZGlhbGVjdHMgPSBzcGVjLmRpYWxlY3RzIHx8IHt9O1xuICAgICAgICB0aGlzLmR5bmFtaWNQcmVjZWRlbmNlcyA9IHNwZWMuZHluYW1pY1ByZWNlZGVuY2VzIHx8IG51bGw7XG4gICAgICAgIHRoaXMudG9rZW5QcmVjVGFibGUgPSBzcGVjLnRva2VuUHJlYztcbiAgICAgICAgdGhpcy50ZXJtTmFtZXMgPSBzcGVjLnRlcm1OYW1lcyB8fCBudWxsO1xuICAgICAgICB0aGlzLm1heE5vZGUgPSB0aGlzLm5vZGVTZXQudHlwZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5kaWFsZWN0ID0gdGhpcy5wYXJzZURpYWxlY3QoKTtcbiAgICAgICAgdGhpcy50b3AgPSB0aGlzLnRvcFJ1bGVzW09iamVjdC5rZXlzKHRoaXMudG9wUnVsZXMpWzBdXTtcbiAgICB9XG4gICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIGxldCBwYXJzZSA9IG5ldyBQYXJzZSh0aGlzLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICBmb3IgKGxldCB3IG9mIHRoaXMud3JhcHBlcnMpXG4gICAgICAgICAgICBwYXJzZSA9IHcocGFyc2UsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgIHJldHVybiBwYXJzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgZ290byB0YWJsZSBlbnRyeSBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldEdvdG8oc3RhdGUsIHRlcm0sIGxvb3NlID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHRhYmxlID0gdGhpcy5nb3RvO1xuICAgICAgICBpZiAodGVybSA+PSB0YWJsZVswXSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gdGFibGVbdGVybSArIDFdOzspIHtcbiAgICAgICAgICAgIGxldCBncm91cFRhZyA9IHRhYmxlW3BvcysrXSwgbGFzdCA9IGdyb3VwVGFnICYgMTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0YWJsZVtwb3MrK107XG4gICAgICAgICAgICBpZiAobGFzdCAmJiBsb29zZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgZm9yIChsZXQgZW5kID0gcG9zICsgKGdyb3VwVGFnID4+IDEpOyBwb3MgPCBlbmQ7IHBvcysrKVxuICAgICAgICAgICAgICAgIGlmICh0YWJsZVtwb3NdID09IHN0YXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIGlmIHRoaXMgc3RhdGUgaGFzIGFuIGFjdGlvbiBmb3IgYSBnaXZlbiB0ZXJtaW5hbCBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGhhc0FjdGlvbihzdGF0ZSwgdGVybWluYWwpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIGZvciAobGV0IHNldCA9IDA7IHNldCA8IDI7IHNldCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGF0ZVNsb3Qoc3RhdGUsIHNldCA/IDIgLyogUGFyc2VTdGF0ZS5Ta2lwICovIDogMSAvKiBQYXJzZVN0YXRlLkFjdGlvbnMgKi8pLCBuZXh0OzsgaSArPSAzKSB7XG4gICAgICAgICAgICAgICAgaWYgKChuZXh0ID0gZGF0YVtpXSkgPT0gNjU1MzUgLyogU2VxLkVuZCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVtpICsgMV0gPT0gMSAvKiBTZXEuTmV4dCAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBkYXRhW2kgPSBwYWlyKGRhdGEsIGkgKyAyKV07XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbaSArIDFdID09IDIgLyogU2VxLk90aGVyICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXIoZGF0YSwgaSArIDIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gdGVybWluYWwgfHwgbmV4dCA9PSAwIC8qIFRlcm0uRXJyICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpcihkYXRhLCBpICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGVTbG90KHN0YXRlLCBzbG90KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlc1soc3RhdGUgKiA2IC8qIFBhcnNlU3RhdGUuU2l6ZSAqLykgKyBzbG90XTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0ZUZsYWcoc3RhdGUsIGZsYWcpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXRlU2xvdChzdGF0ZSwgMCAvKiBQYXJzZVN0YXRlLkZsYWdzICovKSAmIGZsYWcpID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB2YWxpZEFjdGlvbihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYWxsQWN0aW9ucyhzdGF0ZSwgYSA9PiBhID09IGFjdGlvbiA/IHRydWUgOiBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhbGxBY3Rpb25zKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgbGV0IGRlZmx0ID0gdGhpcy5zdGF0ZVNsb3Qoc3RhdGUsIDQgLyogUGFyc2VTdGF0ZS5EZWZhdWx0UmVkdWNlICovKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGRlZmx0ID8gYWN0aW9uKGRlZmx0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhdGVTbG90KHN0YXRlLCAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyk7IHJlc3VsdCA9PSBudWxsOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPT0gNjU1MzUgLyogU2VxLkVuZCAqLykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaSArIDFdID09IDEgLyogU2VxLk5leHQgKi8pXG4gICAgICAgICAgICAgICAgICAgIGkgPSBwYWlyKHRoaXMuZGF0YSwgaSArIDIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSBhY3Rpb24ocGFpcih0aGlzLmRhdGEsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzdGF0ZXMgdGhhdCBjYW4gZm9sbG93IHRoaXMgb25lIHRocm91Z2ggc2hpZnQgYWN0aW9ucyBvclxuICAgIGdvdG8ganVtcHMuIEBpbnRlcm5hbFxuICAgICovXG4gICAgbmV4dFN0YXRlcyhzdGF0ZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YXRlU2xvdChzdGF0ZSwgMSAvKiBQYXJzZVN0YXRlLkFjdGlvbnMgKi8pOzsgaSArPSAzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldID09IDY1NTM1IC8qIFNlcS5FbmQgKi8pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhW2kgKyAxXSA9PSAxIC8qIFNlcS5OZXh0ICovKVxuICAgICAgICAgICAgICAgICAgICBpID0gcGFpcih0aGlzLmRhdGEsIGkgKyAyKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0aGlzLmRhdGFbaSArIDJdICYgKDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovID4+IDE2KSkgPT0gMCkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZGF0YVtpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuc29tZSgodiwgaSkgPT4gKGkgJiAxKSAmJiB2ID09IHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5kYXRhW2ldLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29uZmlndXJlIHRoZSBwYXJzZXIuIFJldHVybnMgYSBuZXcgcGFyc2VyIGluc3RhbmNlIHRoYXQgaGFzIHRoZVxuICAgIGdpdmVuIHNldHRpbmdzIG1vZGlmaWVkLiBTZXR0aW5ncyBub3QgcHJvdmlkZWQgaW4gYGNvbmZpZ2AgYXJlXG4gICAga2VwdCBmcm9tIHRoZSBvcmlnaW5hbCBwYXJzZXIuXG4gICAgKi9cbiAgICBjb25maWd1cmUoY29uZmlnKSB7XG4gICAgICAgIC8vIEhpZGVvdXMgcmVmbGVjdGlvbi1iYXNlZCBrbHVkZ2UgdG8gbWFrZSBpdCBlYXN5IHRvIGNyZWF0ZSBhXG4gICAgICAgIC8vIHNsaWdodGx5IG1vZGlmaWVkIGNvcHkgb2YgYSBwYXJzZXIuXG4gICAgICAgIGxldCBjb3B5ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKExSUGFyc2VyLnByb3RvdHlwZSksIHRoaXMpO1xuICAgICAgICBpZiAoY29uZmlnLnByb3BzKVxuICAgICAgICAgICAgY29weS5ub2RlU2V0ID0gdGhpcy5ub2RlU2V0LmV4dGVuZCguLi5jb25maWcucHJvcHMpO1xuICAgICAgICBpZiAoY29uZmlnLnRvcCkge1xuICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLnRvcFJ1bGVzW2NvbmZpZy50b3BdO1xuICAgICAgICAgICAgaWYgKCFpbmZvKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHRvcCBydWxlIG5hbWUgJHtjb25maWcudG9wfWApO1xuICAgICAgICAgICAgY29weS50b3AgPSBpbmZvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcudG9rZW5pemVycylcbiAgICAgICAgICAgIGNvcHkudG9rZW5pemVycyA9IHRoaXMudG9rZW5pemVycy5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gY29uZmlnLnRva2VuaXplcnMuZmluZChyID0+IHIuZnJvbSA9PSB0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQgPyBmb3VuZC50byA6IHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZy5zcGVjaWFsaXplcnMpIHtcbiAgICAgICAgICAgIGNvcHkuc3BlY2lhbGl6ZXJzID0gdGhpcy5zcGVjaWFsaXplcnMuc2xpY2UoKTtcbiAgICAgICAgICAgIGNvcHkuc3BlY2lhbGl6ZXJTcGVjcyA9IHRoaXMuc3BlY2lhbGl6ZXJTcGVjcy5tYXAoKHMsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBjb25maWcuc3BlY2lhbGl6ZXJzLmZpbmQociA9PiByLmZyb20gPT0gcy5leHRlcm5hbCk7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICAgICAgbGV0IHNwZWMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHMpLCB7IGV4dGVybmFsOiBmb3VuZC50byB9KTtcbiAgICAgICAgICAgICAgICBjb3B5LnNwZWNpYWxpemVyc1tpXSA9IGdldFNwZWNpYWxpemVyKHNwZWMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzcGVjO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5jb250ZXh0VHJhY2tlcilcbiAgICAgICAgICAgIGNvcHkuY29udGV4dCA9IGNvbmZpZy5jb250ZXh0VHJhY2tlcjtcbiAgICAgICAgaWYgKGNvbmZpZy5kaWFsZWN0KVxuICAgICAgICAgICAgY29weS5kaWFsZWN0ID0gdGhpcy5wYXJzZURpYWxlY3QoY29uZmlnLmRpYWxlY3QpO1xuICAgICAgICBpZiAoY29uZmlnLnN0cmljdCAhPSBudWxsKVxuICAgICAgICAgICAgY29weS5zdHJpY3QgPSBjb25maWcuc3RyaWN0O1xuICAgICAgICBpZiAoY29uZmlnLndyYXApXG4gICAgICAgICAgICBjb3B5LndyYXBwZXJzID0gY29weS53cmFwcGVycy5jb25jYXQoY29uZmlnLndyYXApO1xuICAgICAgICBpZiAoY29uZmlnLmJ1ZmZlckxlbmd0aCAhPSBudWxsKVxuICAgICAgICAgICAgY29weS5idWZmZXJMZW5ndGggPSBjb25maWcuYnVmZmVyTGVuZ3RoO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgYW55IFtwYXJzZSB3cmFwcGVyc10oI2xyLlBhcnNlckNvbmZpZy53cmFwKVxuICAgIGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIHBhcnNlci5cbiAgICAqL1xuICAgIGhhc1dyYXBwZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVycy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHRlcm0uIFRoaXMgd2lsbCBvbmx5XG4gICAgd29yayBmb3IgYWxsIHRlcm1zIHdoZW4gdGhlIHBhcnNlciB3YXMgZ2VuZXJhdGVkIHdpdGggdGhlXG4gICAgYC0tbmFtZXNgIG9wdGlvbi4gQnkgZGVmYXVsdCwgb25seSB0aGUgbmFtZXMgb2YgdGFnZ2VkIHRlcm1zIGFyZVxuICAgIHN0b3JlZC5cbiAgICAqL1xuICAgIGdldE5hbWUodGVybSkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXJtTmFtZXMgPyB0aGlzLnRlcm1OYW1lc1t0ZXJtXSA6IFN0cmluZyh0ZXJtIDw9IHRoaXMubWF4Tm9kZSAmJiB0aGlzLm5vZGVTZXQudHlwZXNbdGVybV0ubmFtZSB8fCB0ZXJtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGVvZiB0ZXJtIGlkIGlzIGFsd2F5cyBhbGxvY2F0ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIG5vZGVcbiAgICB0eXBlcy4gQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgZW9mVGVybSgpIHsgcmV0dXJuIHRoaXMubWF4Tm9kZSArIDE7IH1cbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiB0b3Agbm9kZSBwcm9kdWNlZCBieSB0aGUgcGFyc2VyLlxuICAgICovXG4gICAgZ2V0IHRvcE5vZGUoKSB7IHJldHVybiB0aGlzLm5vZGVTZXQudHlwZXNbdGhpcy50b3BbMV1dOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkeW5hbWljUHJlY2VkZW5jZSh0ZXJtKSB7XG4gICAgICAgIGxldCBwcmVjID0gdGhpcy5keW5hbWljUHJlY2VkZW5jZXM7XG4gICAgICAgIHJldHVybiBwcmVjID09IG51bGwgPyAwIDogcHJlY1t0ZXJtXSB8fCAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHBhcnNlRGlhbGVjdChkaWFsZWN0KSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBPYmplY3Qua2V5cyh0aGlzLmRpYWxlY3RzKSwgZmxhZ3MgPSB2YWx1ZXMubWFwKCgpID0+IGZhbHNlKTtcbiAgICAgICAgaWYgKGRpYWxlY3QpXG4gICAgICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIGRpYWxlY3Quc3BsaXQoXCIgXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkID0gdmFsdWVzLmluZGV4T2YocGFydCk7XG4gICAgICAgICAgICAgICAgaWYgKGlkID49IDApXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzW2lkXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBkaXNhYmxlZCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFmbGFnc1tpXSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSB0aGlzLmRpYWxlY3RzW3ZhbHVlc1tpXV0sIGlkOyAoaWQgPSB0aGlzLmRhdGFbaisrXSkgIT0gNjU1MzUgLyogU2VxLkVuZCAqLzspXG4gICAgICAgICAgICAgICAgICAgIChkaXNhYmxlZCB8fCAoZGlzYWJsZWQgPSBuZXcgVWludDhBcnJheSh0aGlzLm1heFRlcm0gKyAxKSkpW2lkXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGlhbGVjdChkaWFsZWN0LCBmbGFncywgZGlzYWJsZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2VkIGJ5IHRoZSBvdXRwdXQgb2YgdGhlIHBhcnNlciBnZW5lcmF0b3IuIE5vdCBhdmFpbGFibGUgdG9cbiAgICB1c2VyIGNvZGUuIEBoaWRlXG4gICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUoc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IExSUGFyc2VyKHNwZWMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhaXIoZGF0YSwgb2ZmKSB7IHJldHVybiBkYXRhW29mZl0gfCAoZGF0YVtvZmYgKyAxXSA8PCAxNik7IH1cbmZ1bmN0aW9uIGZpbmRGaW5pc2hlZChzdGFja3MpIHtcbiAgICBsZXQgYmVzdCA9IG51bGw7XG4gICAgZm9yIChsZXQgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgICAgIGxldCBzdG9wcGVkID0gc3RhY2sucC5zdG9wcGVkQXQ7XG4gICAgICAgIGlmICgoc3RhY2sucG9zID09IHN0YWNrLnAuc3RyZWFtLmVuZCB8fCBzdG9wcGVkICE9IG51bGwgJiYgc3RhY2sucG9zID4gc3RvcHBlZCkgJiZcbiAgICAgICAgICAgIHN0YWNrLnAucGFyc2VyLnN0YXRlRmxhZyhzdGFjay5zdGF0ZSwgMiAvKiBTdGF0ZUZsYWcuQWNjZXB0aW5nICovKSAmJlxuICAgICAgICAgICAgKCFiZXN0IHx8IGJlc3Quc2NvcmUgPCBzdGFjay5zY29yZSkpXG4gICAgICAgICAgICBiZXN0ID0gc3RhY2s7XG4gICAgfVxuICAgIHJldHVybiBiZXN0O1xufVxuZnVuY3Rpb24gZ2V0U3BlY2lhbGl6ZXIoc3BlYykge1xuICAgIGlmIChzcGVjLmV4dGVybmFsKSB7XG4gICAgICAgIGxldCBtYXNrID0gc3BlYy5leHRlbmQgPyAxIC8qIFNwZWNpYWxpemUuRXh0ZW5kICovIDogMCAvKiBTcGVjaWFsaXplLlNwZWNpYWxpemUgKi87XG4gICAgICAgIHJldHVybiAodmFsdWUsIHN0YWNrKSA9PiAoc3BlYy5leHRlcm5hbCh2YWx1ZSwgc3RhY2spIDw8IDEpIHwgbWFzaztcbiAgICB9XG4gICAgcmV0dXJuIHNwZWMuZ2V0O1xufVxuXG5leHBvcnQgeyBDb250ZXh0VHJhY2tlciwgRXh0ZXJuYWxUb2tlbml6ZXIsIElucHV0U3RyZWFtLCBMUlBhcnNlciwgTG9jYWxUb2tlbkdyb3VwLCBTdGFjayB9O1xuIiwgImltcG9ydCB7IExSTGFuZ3VhZ2UsIExhbmd1YWdlU3VwcG9ydCB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmd1YWdlJztcbmltcG9ydCB7IExSUGFyc2VyLCBMb2NhbFRva2VuR3JvdXAgfSBmcm9tICdAbGV6ZXIvbHInO1xuXG4vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBsZXplci1nZW5lcmF0b3IuIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgZWRpdCBpdC5cbmNvbnN0IHBhcnNlciA9IC8qQF9fUFVSRV9fKi9MUlBhcnNlci5kZXNlcmlhbGl6ZSh7XG4gIHZlcnNpb246IDE0LFxuICBzdGF0ZXM6IFwiKWBRUU9QT09PZk9RTycjQ15PcU9TTycjQ2BPfE9XTycjQ2JPIVhPYE8nI0NlTyFkT3BPJyNDZ09PT08nI0NrJyNDa09PT08nI0NpJyNDaVFRT1BPT09PT08sNTh4LDU4eE8hb09RTyw1OHhPIXdPUU8sNTh4T09PTyw1OHosNTh6TyNQT1NPLDU4ek8jWE9TTyw1OHpPI2FPV08sNTh8TyNpT1dPLDU4fE8jcU9XTyw1OHxPT09PLDU5UCw1OVBPI3lPYE8sNTlQTyRST2BPLDU5UE9PT08sNTlSLDU5Uk8kWk9wTyw1OVJPJGNPcE8sNTlST09PTy1FNmctRTZnT09PTzFHLmQxRy5kTyRrT1FPMUcuZE8kbk9RTzFHLmRPT09PMUcuZjFHLmZPJHNPU08xRy5mTyR2T1NPMUcuZk9PT08xRy5oMUcuaE8ke09XTzFHLmhPJVFPV08xRy5oTyVZT1dPMUcuaE8lYk9XTzFHLmhPT09PMUcuazFHLmtPJWdPYE8xRy5rTyVqT2BPMUcua09PT08xRy5tMUcubU8lb09wTzFHLm1PJXJPcE8xRy5tT09PTzcrJE83KyRPTyV3T1FPNyskT09PT083KyRRNyskUU8lfE9TTzcrJFFPT09PNyskUzcrJFNPJlJPV083KyRTTyZXT1dPNyskU08mYE9XTzcrJFNPT09PNyskVjcrJFZPJmVPYE83KyRWT09PTzcrJFg3KyRYTyZqT3BPNyskWE9PT088PEdqPDxHak9PT088PEdsPDxHbE9PT088PEduPDxHbk8mb09XTzw8R25PJnRPV088PEduT09PTzw8R3E8PEdxT09PTzw8R3M8PEdzT09PT0FOPVlBTj1ZTyZ8T1dPQU49WU9PT09HMjJ0RzIydFwiLFxuICBzdGF0ZURhdGE6IFwiJ1J+T2BQT2NRT2ZST2lTT2xUT29WT35PUlpPYVlPYlhPfk9UXk9kXU9lW09+T1ZhT1dfT2dgT35PWWRPamNPa2JPfk9bZ09tZk9uZU9+T1JqT2JpT35PYWtPYmlPfk9UbU9lbE9+T2RuT2VsT35PZ3BPaG9Pfk9Wck9XcU9+T1dxT2dzT35PWXVPa3RPfk9qdk9rdE9+T1t4T253T35PbXlPbndPfk9he09iek9+T2R9T2V8T35PaCFPT35PZyFQT2ghT09+T1chUU9nIVJPfk9XIVFPfk9qIVRPayFTT35PbSFWT24hVU9+T2IhV09+T2UhWE9+T2ghWU9+T2chWk9oIVlPfk9XIVtPfk9rIV1Pfk9uIV5Pfk9oIV9Pfk9nIWBPaCFfT35PaCFhT35PXCIsXG4gIGdvdG86IFwib2BQUGFQYVBhUFBhUGFQZVBrVFVPV1FXT1JoV1RWT1dcIixcbiAgbm9kZU5hbWVzOiBcIlx1MjZBMCBDcml0aWNNYXJrdXAgQWRkaXRpb24gTURTZXBBZGQgRGVsZXRpb24gTURTZXBEZWwgU3Vic3RpdHV0aW9uIE1EU2VwU3ViIE1TdWIgQ29tbWVudCBNRFNlcENvbSBIaWdobGlnaHQgTURTZXBIaWdcIixcbiAgbWF4VGVybTogMzEsXG4gIHNraXBwZWROb2RlczogWzBdLFxuICByZXBlYXROb2RlQ291bnQ6IDEsXG4gIHRva2VuRGF0YTogXCInb35SXVhZellael1eenBxenFyenJzenMjT3ojTyNQIVAjUCNveiNvI3AjcyNwOydTejsnUzs9YCdpPCVsT3p+IVBPb35+IVVYb35yc3ohUCFReiNPI1B6I1UjVnojWSNaeiNiI2N6I2YjZ3ojaCNpeiNpI2ohcX4hdFIhUSFbIX0hYyFpIX0jVCNaIX1+I1FSIVEhWyNaIWMhaSNaI1QjWiNafiNeUiFRIVsjZyFjIWkjZyNUI1ojZ34jalIhUSFbeiFjIWl6I1QjWnp+I3hWb352dyRfe3wlYH0hTyVrIV4hXyV2IV8hYCdWIWAhYSddI3IjcydjfiRiUCNaI1skZX4kaFAjaCNpJGt+JG5QIV0hXiRxfiR0UHZ3JHd+JHpQI1ojWyR9fiVRUCNoI2klVH4lV1AhXSFeJVp+JWBPaX5+JWNQe3wlZn4la09gfn4lblB9IU8lcX4ldk9jfn4leVEjVyNYJlAjYSNiJmh+JlNQI1gjWSZWfiZZUCNgI2EmXX4mYFAhYCFhJmN+JmhPZn5+JmtQI1QjVSZufiZxUCNmI2cmdH4md1AjXyNgJnp+Jn1QIWAhYSdRfidWT2x+fidZUCFfIWAnUX4nYFAhYCFhJVp+J2ZQI3IjcyZjfidsUDs9YDwlbHpcIixcbiAgdG9rZW5pemVyczogWzUsIC8qQF9fUFVSRV9fKi9uZXcgTG9jYWxUb2tlbkdyb3VwKFwidn5SUXt8WCFiIWNqfltQe3xffmJQI3EjcmV+ak9ifn5tUCFiIWNwfnVPUn5+XCIsIDM3LCAxNyksIC8qQF9fUFVSRV9fKi9uZXcgTG9jYWxUb2tlbkdyb3VwKFwidn5SUX0hT1ghYiFjan5bUH0hT19+YlAjcSNyZX5qT2V+fm1QIWIhY3B+dU9Ufn5cIiwgMzcsIDIwKSwgLypAX19QVVJFX18qL25ldyBMb2NhbFRva2VuR3JvdXAoXCIjV35SUiFeIV9bIWIhYyFWI3IjcyFifl9QIVAhUWJ+ZVAjVyNYaH5rUCNYI1lufnFQI2AjYXR+d1AhYCFhen59UCNxI3IhUX4hVk9ofn4hWVAhYiFjIV1+IWJPVn5+IWVSdnchbiFgIWEjUSNyI3N6fiFxUCNaI1shdH4hd1AjaCNpIXp+IX1QIV0hXiNRfiNWT1d+flwiLCA5OSwgMjMpLCAvKkBfX1BVUkVfXyovbmV3IExvY2FsVG9rZW5Hcm91cChcIiF1flJSdndbIV4hXyFjIWIhYyFpfl9QI2AjYWJ+ZVAjaCNpaH5rUCFdIV5ufnFQdnd0fndQI2AjYXp+fVAjaCNpIVF+IVRQIV0hXiFXfiFaUCNxI3IhXn4hY09rfn4hZlAhXiFfIVd+IWxQIWIhYyFvfiF0T1l+flwiLCA4MiwgMjYpLCAvKkBfX1BVUkVfXyovbmV3IExvY2FsVG9rZW5Hcm91cChcIiFvflJSIV4hX1shXyFgIV0hYiFjIWN+X1AhUCFRYn5lUCNhI2JofmtQI1QjVW5+cVAjZiNndH53UCNfI2B6fn1QIWAhYSFRfiFUUCNxI3IhV34hXU9ufn4hYFAhXyFgIVF+IWZQIWIhYyFpfiFuT1t+flwiLCA3NiwgMjkpXSxcbiAgdG9wUnVsZXM6IHtcIkNyaXRpY01hcmt1cFwiOlswLDFdfSxcbiAgdG9rZW5QcmVjOiAwXG59KTtcblxuY29uc3QgY3JpdGljbWFya3VwTGFuZ3VhZ2UgPSAvKkBfX1BVUkVfXyovTFJMYW5ndWFnZS5kZWZpbmUoe1xuICAgIG5hbWU6IFwiY3JpdGljbWFya3VwXCIsXG4gICAgcGFyc2VyOiAvKkBfX1BVUkVfXyovcGFyc2VyLmNvbmZpZ3VyZSh7fSksXG59KTtcbmZ1bmN0aW9uIGNyaXRpY21hcmt1cCgpIHtcbiAgICByZXR1cm4gbmV3IExhbmd1YWdlU3VwcG9ydChjcml0aWNtYXJrdXBMYW5ndWFnZSk7XG59XG5cbmV4cG9ydCB7IGNyaXRpY21hcmt1cCwgY3JpdGljbWFya3VwTGFuZ3VhZ2UgfTtcbiIsICJpbXBvcnQgeyBFZGl0b3JTdGF0ZSwgU3RhdGVGaWVsZCB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgSW50ZXJ2YWwsIE5vZGUgfSBmcm9tIFwiQGZsYXR0ZW4tanMvaW50ZXJ2YWwtdHJlZVwiO1xuaW1wb3J0IHsgdHlwZSBDaGFuZ2VkUmFuZ2UsIHR5cGUgU3ludGF4Tm9kZSwgdHlwZSBUcmVlLCBUcmVlRnJhZ21lbnQgfSBmcm9tIFwiQGxlemVyL2NvbW1vblwiO1xuXG5pbXBvcnQge1xuXHRBZGRpdGlvblJhbmdlLFxuXHRDb21tZW50UmFuZ2UsXG5cdENyaXRpY01hcmt1cFJhbmdlLFxuXHRDcml0aWNNYXJrdXBSYW5nZXMsXG5cdERlbGV0aW9uUmFuZ2UsXG5cdEhpZ2hsaWdodFJhbmdlLFxuXHRTdWJzdGl0dXRpb25SYW5nZSxcblx0U3VnZ2VzdGlvblR5cGUsXG59IGZyb20gXCIuLi9yYW5nZXNcIjtcblxuaW1wb3J0IHsgRG9jSW5wdXQgfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7IENPTU1FTlRBVE9SX0dMT0JBTCB9IGZyb20gXCIuLi8uLi8uLi9nbG9iYWxcIjtcbmltcG9ydCB7IGZ1bGxSZWxvYWRFZmZlY3QgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IGNyaXRpY21hcmt1cExhbmd1YWdlIH0gZnJvbSBcIi4uL3BhcnNlclwiO1xuXG5pbnRlcmZhY2UgUGFyc2VyRGF0YSB7XG5cdHRyZWU6IFRyZWU7XG5cdGZyYWdtZW50czogcmVhZG9ubHkgVHJlZUZyYWdtZW50W107XG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzO1xuXHRpbnNlcnRlZF9yYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW107XG5cdGRlbGV0ZWRfcmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZVtdO1xufVxuXG5leHBvcnQgY29uc3QgcmFuZ2VQYXJzZXI6IFN0YXRlRmllbGQ8UGFyc2VyRGF0YT4gPSBTdGF0ZUZpZWxkLmRlZmluZSh7XG5cdGNyZWF0ZShzdGF0ZSkge1xuXHRcdGNvbnN0IHRleHQgPSBzdGF0ZS5kb2MudG9TdHJpbmcoKTtcblx0XHRjb25zdCB0cmVlID0gY3JpdGljbWFya3VwTGFuZ3VhZ2UucGFyc2VyLnBhcnNlKHRleHQpO1xuXHRcdGNvbnN0IHJhbmdlcyA9IG5ldyBDcml0aWNNYXJrdXBSYW5nZXMoY3Vyc29yR2VuZXJhdGVSYW5nZXModHJlZSwgdGV4dCkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0cmVlLFxuXHRcdFx0ZnJhZ21lbnRzOiBUcmVlRnJhZ21lbnQuYWRkVHJlZSh0cmVlKSxcblx0XHRcdHJhbmdlczogcmFuZ2VzLFxuXHRcdFx0aW5zZXJ0ZWRfcmFuZ2VzOiByYW5nZXMucmFuZ2VzLFxuXHRcdFx0ZGVsZXRlZF9yYW5nZXM6IFtdLFxuXHRcdH07XG5cdH0sXG5cblx0dXBkYXRlKHZhbHVlOiBQYXJzZXJEYXRhLCB0cikge1xuXHRcdGlmICh0ci5lZmZlY3RzLnNvbWUoZWZmZWN0ID0+IGVmZmVjdC5pcyhmdWxsUmVsb2FkRWZmZWN0KSkpXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGUodHIuc3RhdGUpIGFzIFBhcnNlckRhdGE7XG5cblx0XHRpZiAoIXRyLmRvY0NoYW5nZWQpIHtcblx0XHRcdHZhbHVlLmluc2VydGVkX3JhbmdlcyA9IFtdO1xuXHRcdFx0dmFsdWUuZGVsZXRlZF9yYW5nZXMgPSBbXTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHQvLyBUaGUgYmVsb3cgdGltZXMgYXJlIGJhc2VkIG9uIHN0cmVzcy10ZXN0ICgyNTAuMDAwIHdvcmRzLCA1Ni4xNjcgcmFuZ2VzKVxuXHRcdC8vIGdldC1jaGFuZ2VzOiAwLjAxIC0gMC4wNSBtc1xuXHRcdGNvbnN0IGNoYW5nZWRfcmFuZ2VzOiBDaGFuZ2VkUmFuZ2VbXSA9IFtdO1xuXHRcdHRyLmNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb20sIHRvLCBmcm9tQiwgdG9CKSA9PlxuXHRcdFx0Y2hhbmdlZF9yYW5nZXMucHVzaCh7IGZyb21BOiBmcm9tLCB0b0E6IHRvLCBmcm9tQjogZnJvbUIsIHRvQjogdG9CIH0pXG5cdFx0KTtcblxuXHRcdC8vIGZyYWdtZW50LXVwZGF0ZTogMC4wMSAtIDAuMDggbXNcblx0XHRsZXQgZnJhZ21lbnRzID0gVHJlZUZyYWdtZW50LmFwcGx5Q2hhbmdlcyh2YWx1ZS5mcmFnbWVudHMsIGNoYW5nZWRfcmFuZ2VzKTtcblx0XHQvLyBzdHJpbmdpZnktZG9jOiAwLjk4IC0gOC45OSBtc1xuXHRcdGNvbnN0IHRleHQgPSB0ci5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcblx0XHQvLyBwYXJzZS1kb2M6IDAuNjggLSAxLjI0IG1zXG5cdFx0Y29uc3QgdHJlZSA9IGNyaXRpY21hcmt1cExhbmd1YWdlLnBhcnNlci5wYXJzZShuZXcgRG9jSW5wdXQodHIuc3RhdGUuZG9jKSwgZnJhZ21lbnRzKTtcblx0XHQvLyBhcHBseS1mcmFnbWVudHM6IDwwLjAxIG1zXG5cdFx0ZnJhZ21lbnRzID0gVHJlZUZyYWdtZW50LmFkZFRyZWUodHJlZSwgZnJhZ21lbnRzKTtcblxuXHRcdC8vIHJlZ2VuZXJhdGUtcmFuZ2VzOiAwLjIwIC0gMC41NSBtc1xuXHRcdGNvbnN0IGluc2VydGVkX3NldCA9IG5ldyBNYXA8bnVtYmVyLCBDcml0aWNNYXJrdXBSYW5nZT4oKTtcblx0XHRjb25zdCBvZmZzZXRzOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcblx0XHRjb25zdCBkYW5nbGluZ19jb21tZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBDb21tZW50UmFuZ2U+KCk7XG5cdFx0Y29uc3QgZGVsZXRlZF9yYW5nZXM6IFNldDxDcml0aWNNYXJrdXBSYW5nZT4gPSBuZXcgU2V0KCk7XG5cdFx0Zm9yIChjb25zdCBjaGFuZ2VkX3JhbmdlIG9mIGNoYW5nZWRfcmFuZ2VzKSB7XG5cdFx0XHR2YWx1ZS5yYW5nZXMudHJlZVxuXHRcdFx0XHQuc2VhcmNoKFtjaGFuZ2VkX3JhbmdlLmZyb21BLCBjaGFuZ2VkX3JhbmdlLnRvQV0sIChyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UsIGtleTogSW50ZXJ2YWwpID0+IHtcblx0XHRcdFx0XHR2YWx1ZS5yYW5nZXMudHJlZS5yZW1vdmUoa2V5LCByYW5nZSk7XG5cdFx0XHRcdFx0ZGVsZXRlZF9yYW5nZXMuYWRkKHJhbmdlKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHJlcGx5IG9mIHJhbmdlLmJhc2VfcmFuZ2UudGhyZWFkKVxuXHRcdFx0XHRcdFx0ZGFuZ2xpbmdfY29tbWVudHMuc2V0KHJlcGx5LmZyb20sIHJlcGx5KTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgY3Vyc29yR2VuZXJhdGVSYW5nZXModHJlZSwgdGV4dCwgY2hhbmdlZF9yYW5nZS5mcm9tQiwgY2hhbmdlZF9yYW5nZS50b0IpKVxuXHRcdFx0XHRpbnNlcnRlZF9zZXQuc2V0KHJhbmdlLmZyb20sIHJhbmdlKTtcblx0XHRcdG9mZnNldHMucHVzaChbXG5cdFx0XHRcdGNoYW5nZWRfcmFuZ2UudG9BLFxuXHRcdFx0XHRjaGFuZ2VkX3JhbmdlLnRvQiAtIGNoYW5nZWRfcmFuZ2UuZnJvbUIgLSAoY2hhbmdlZF9yYW5nZS50b0EgLSBjaGFuZ2VkX3JhbmdlLmZyb21BKSxcblx0XHRcdF0pO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGRlbGV0ZWRfcmFuZ2Ugb2YgZGVsZXRlZF9yYW5nZXMpIHtcblx0XHRcdGlmIChkZWxldGVkX3JhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQpXG5cdFx0XHRcdGRhbmdsaW5nX2NvbW1lbnRzLmRlbGV0ZShkZWxldGVkX3JhbmdlLmZyb20pO1xuXHRcdH1cblxuXHRcdGxldCBjdW11bGF0aXZlX29mZnNldCA9IDA7XG5cblx0XHQvLyBhcHBseS1vZmZzZXRzOiAyLjcyLTMuNzAgbXNcblx0XHRjb25zdCBuaWxfbm9kZSA9IHZhbHVlLnJhbmdlcy50cmVlLm5pbF9ub2RlO1xuXHRcdGZ1bmN0aW9uIHZpc2l0Tm9kZShub2RlOiBOb2RlPENyaXRpY01hcmt1cFJhbmdlPikge1xuXHRcdFx0aWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlICE9IG5pbF9ub2RlKSB7XG5cdFx0XHRcdHZpc2l0Tm9kZShub2RlLmxlZnQpO1xuXHRcdFx0XHR3aGlsZSAob2Zmc2V0cy5sZW5ndGggJiYgbm9kZS5pdGVtLmtleS5sb3cgPj0gb2Zmc2V0c1swXVswXSlcblx0XHRcdFx0XHRjdW11bGF0aXZlX29mZnNldCArPSBvZmZzZXRzLnNoaWZ0KCkhWzFdO1xuXHRcdFx0XHRub2RlLml0ZW0udmFsdWUuYXBwbHlfb2Zmc2V0KGN1bXVsYXRpdmVfb2Zmc2V0KTtcblx0XHRcdFx0bm9kZS5pdGVtLmtleS5sb3cgPSBub2RlLml0ZW0udmFsdWUuZnJvbTtcblx0XHRcdFx0bm9kZS5pdGVtLmtleS5oaWdoID0gbm9kZS5pdGVtLnZhbHVlLnRvO1xuXHRcdFx0XHR2aXNpdE5vZGUobm9kZS5yaWdodCk7XG5cdFx0XHRcdGlmIChub2RlLmxlZnQgIT0gbmlsX25vZGUpXG5cdFx0XHRcdFx0bm9kZS5tYXgubG93ID0gbm9kZS5sZWZ0Lm1heC5sb3c7XG5cdFx0XHRcdGlmIChub2RlLnJpZ2h0ICE9IG5pbF9ub2RlKVxuXHRcdFx0XHRcdG5vZGUubWF4LmhpZ2ggPSBub2RlLnJpZ2h0Lm1heC5oaWdoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2aXNpdE5vZGUodmFsdWUucmFuZ2VzLnRyZWUucm9vdCEpO1xuXHRcdGNvbnN0IGluc2VydGVkX3JhbmdlcyA9IEFycmF5LmZyb20oaW5zZXJ0ZWRfc2V0LnZhbHVlcygpKTtcblxuXHRcdC8vIGluc2VydC1uZXctcmFuZ2VzOiA8MC4wMSAtIDAuMDUgbXNcblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIGluc2VydGVkX3Jhbmdlcylcblx0XHRcdHZhbHVlLnJhbmdlcy50cmVlLmluc2VydChbcmFuZ2UuZnJvbSwgcmFuZ2UudG9dLCByYW5nZSk7XG5cblx0XHQvLyBjb21tZW50cy10aHJlYWQtcmVjb25zdHJ1Y3Rpb246IDwwLjAxIC0gMC4wNSBtc1xuXHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgaW5zZXJ0ZWRfcmFuZ2VzKSB7XG5cdFx0XHRpZiAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVClcblx0XHRcdFx0ZGFuZ2xpbmdfY29tbWVudHMuc2V0KHJhbmdlLmZyb20sIHJhbmdlIGFzIENvbW1lbnRSYW5nZSk7XG5cdFx0fVxuXG5cdFx0Ly8gRklYTUU6IFJhcmUgY2FzZXMgb2YgY29tbWVudCByYW5nZXMgaW4gdGhyZWFkcyBiZWluZyBkdXBsaWNhdGVkIGR1ZSB0byBlZGl0b3IgY2hhbmdlc1xuXHRcdGlmIChkYW5nbGluZ19jb21tZW50cy5zaXplKSB7XG5cdFx0XHRjb25zdCBjb21tZW50X3RocmVhZHM6IENvbW1lbnRSYW5nZVtdW10gPSBbXTtcblx0XHRcdGxldCBsYXN0X3JhbmdlOiBDb21tZW50UmFuZ2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRsZXQgY3VycmVudF90aHJlYWQ6IENvbW1lbnRSYW5nZVtdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIEFycmF5LmZyb20oZGFuZ2xpbmdfY29tbWVudHMudmFsdWVzKCkpLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSkpIHtcblx0XHRcdFx0cmFuZ2UuY2xlYXJfcmVmZXJlbmNlcygpO1xuXHRcdFx0XHRyYW5nZS5yZXBsaWVzLmxlbmd0aCA9IDA7XG5cblx0XHRcdFx0aWYgKCFsYXN0X3JhbmdlIHx8IGxhc3RfcmFuZ2U/LnJpZ2h0X2FkamFjZW50KHJhbmdlKSlcblx0XHRcdFx0XHRjdXJyZW50X3RocmVhZC5wdXNoKHJhbmdlKTtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Y29tbWVudF90aHJlYWRzLnB1c2goY3VycmVudF90aHJlYWQpO1xuXHRcdFx0XHRcdGN1cnJlbnRfdGhyZWFkID0gW3JhbmdlXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsYXN0X3JhbmdlID0gcmFuZ2U7XG5cdFx0XHR9XG5cdFx0XHRjb21tZW50X3RocmVhZHMucHVzaChjdXJyZW50X3RocmVhZCk7XG5cblx0XHRcdGZvciAoY29uc3QgdGhyZWFkIG9mIGNvbW1lbnRfdGhyZWFkcykge1xuXHRcdFx0XHRjb25zdCBoZWFkID0gdGhyZWFkWzBdO1xuXHRcdFx0XHRjb25zdCBhZGphY2VudF9yYW5nZSA9IHZhbHVlLnJhbmdlcy50cmVlLnNlYXJjaChbaGVhZC5mcm9tLCBoZWFkLmZyb21dKVswXSBhcyBDcml0aWNNYXJrdXBSYW5nZTtcblx0XHRcdFx0YWRqYWNlbnRfcmFuZ2UhLnJlcGxpZXMubGVuZ3RoID0gMDtcblx0XHRcdFx0Zm9yIChjb25zdCBjb21tZW50IG9mIHRocmVhZC5zbGljZShhZGphY2VudF9yYW5nZSA9PT0gaGVhZCA/IDEgOiAwKSlcblx0XHRcdFx0XHRjb21tZW50LmFkZF9yZXBseShhZGphY2VudF9yYW5nZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gZmluYWxpemU6IDEuODAgLSAxLjg1IG1zXG5cdFx0dmFsdWUucmFuZ2VzLnJhbmdlcyA9IHZhbHVlLnJhbmdlcy50cmVlLnZhbHVlcztcblxuXHRcdHJldHVybiB7IHRyZWUsIHJhbmdlczogdmFsdWUucmFuZ2VzLCBmcmFnbWVudHMsIGluc2VydGVkX3JhbmdlcywgZGVsZXRlZF9yYW5nZXM6IFsuLi5kZWxldGVkX3Jhbmdlc10gfTtcblx0fSxcbn0pO1xuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSYW5nZUZyb21TeW50YXhOb2RlKHJhbmdlOiBTeW50YXhOb2RlLCB0ZXh0OiBzdHJpbmcpIHtcblx0Y29uc3QgbWV0YWRhdGEgPVxuXHRcdChDT01NRU5UQVRPUl9HTE9CQUwuUExVR0lOX1NFVFRJTkdTLmVuYWJsZV9tZXRhZGF0YSAmJiByYW5nZS5maXJzdENoaWxkPy50eXBlLm5hbWUuc3RhcnRzV2l0aChcIk1EU2VwXCIpKSA/XG5cdFx0XHRyYW5nZS5maXJzdENoaWxkIS5mcm9tIDpcblx0XHRcdHVuZGVmaW5lZDtcblx0bGV0IG1pZGRsZSA9IHVuZGVmaW5lZDtcblx0aWYgKHJhbmdlLnR5cGUubmFtZSA9PT0gXCJTdWJzdGl0dXRpb25cIikge1xuXHRcdGNvbnN0IGNoaWxkID0gbWV0YWRhdGEgPyByYW5nZS5maXJzdENoaWxkPy5uZXh0U2libGluZyA6IHJhbmdlLmZpcnN0Q2hpbGQ7XG5cdFx0aWYgKCFjaGlsZCB8fCBjaGlsZC50eXBlLm5hbWUgIT09IFwiTVN1YlwiKSByZXR1cm47XG5cdFx0bWlkZGxlID0gY2hpbGQuZnJvbTtcblx0fVxuXG5cdHJldHVybiBjb25zdHJ1Y3RSYW5nZShyYW5nZS5mcm9tLCByYW5nZS50bywgcmFuZ2UudHlwZS5uYW1lLCB0ZXh0LnNsaWNlKHJhbmdlLmZyb20sIHJhbmdlLnRvKSwgbWlkZGxlLCBtZXRhZGF0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JHZW5lcmF0ZVJhbmdlcyh0cmVlOiBUcmVlLCB0ZXh0OiBzdHJpbmcsIHN0YXJ0ID0gMCwgdG8gPSB0ZXh0Lmxlbmd0aCkge1xuXHRjb25zdCByYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW10gPSBbXTtcblxuXHRsZXQgcHJldmlvdXNfcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5cdGNvbnN0IGN1cnNvciA9IHRyZWUuY3Vyc29yKCk7XG5cdC8vIE1vdmUgaW50byB0aGUgZmlyc3QgcmFuZ2UgaWYgaXQgZXhpc3RzIChvdGhlcndpc2Ugc3RheXMgaW4gQ3JpdGljTWFya3VwIG5vZGUpLCBuZWdhdGl2ZSBvZmZzZXQgdG8gYmUgbGVmdC1pbmNsdXNpdmVcblx0Y3Vyc29yLmNoaWxkQWZ0ZXIoc3RhcnQgLSAxKTtcblx0aWYgKGN1cnNvci5ub2RlLnR5cGUubmFtZSA9PT0gXCJDcml0aWNNYXJrdXBcIilcblx0XHRyZXR1cm4gcmFuZ2VzO1xuXHRpZiAoY3Vyc29yLm5vZGUuZnJvbSA+IHRvKVxuXHRcdHJldHVybiByYW5nZXM7XG5cblx0aWYgKGN1cnNvcikge1xuXHRcdGRvIHtcblx0XHRcdGNvbnN0IHJhbmdlID0gY3Vyc29yLm5vZGU7XG5cdFx0XHRpZiAocmFuZ2UudHlwZS5uYW1lID09PSBcIlx1MjZBMFwiKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IG5ld19yYW5nZSA9IGNvbnN0cnVjdFJhbmdlRnJvbVN5bnRheE5vZGUocmFuZ2UsIHRleHQpO1xuXHRcdFx0aWYgKG5ld19yYW5nZSkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bmV3X3JhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQgJiYgcHJldmlvdXNfcmFuZ2UgJiZcblx0XHRcdFx0XHRwcmV2aW91c19yYW5nZS5yaWdodF9hZGphY2VudChuZXdfcmFuZ2UpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdChuZXdfcmFuZ2UgYXMgQ29tbWVudFJhbmdlKS5hZGRfcmVwbHkocHJldmlvdXNfcmFuZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJhbmdlcy5wdXNoKG5ld19yYW5nZSk7XG5cdFx0XHRcdHByZXZpb3VzX3JhbmdlID0gbmV3X3JhbmdlO1xuXHRcdFx0fVxuXHRcdH0gd2hpbGUgKGN1cnNvci5uZXh0U2libGluZygpICYmIGN1cnNvci5ub2RlLmZyb20gPD0gdG8pO1xuXHR9XG5cblx0cmV0dXJuIHJhbmdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdGlvbkNvbnRhaW5zUmFuZ2VzKHN0YXRlOiBFZGl0b3JTdGF0ZSkge1xuXHRjb25zdCByYW5nZXMgPSBzdGF0ZS5maWVsZChyYW5nZVBhcnNlcikucmFuZ2VzO1xuXHRyZXR1cm4gcmFuZ2VzLnJhbmdlcy5sZW5ndGggP1xuXHRcdHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMuc29tZShyYW5nZSA9PiByYW5nZXMuY29udGFpbnNfcmFuZ2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKSA6XG5cdFx0ZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZXNJblRleHQodGV4dDogc3RyaW5nKSB7XG5cdGNvbnN0IHRyZWUgPSBjcml0aWNtYXJrdXBMYW5ndWFnZS5wYXJzZXIucGFyc2UodGV4dCk7XG5cdHJldHVybiBjdXJzb3JHZW5lcmF0ZVJhbmdlcyh0cmVlLCB0ZXh0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdFJhbmdlKFxuXHRmcm9tOiBudW1iZXIsXG5cdHRvOiBudW1iZXIsXG5cdHR5cGU6IHN0cmluZyxcblx0dGV4dDogc3RyaW5nLFxuXHRtaWRkbGU/OiBudW1iZXIsXG5cdG1ldGFkYXRhPzogbnVtYmVyLFxuKSB7XG5cdHN3aXRjaCAodHlwZSkge1xuXHRcdGNhc2UgXCJBZGRpdGlvblwiOlxuXHRcdFx0cmV0dXJuIG5ldyBBZGRpdGlvblJhbmdlKGZyb20sIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdFx0Y2FzZSBcIkRlbGV0aW9uXCI6XG5cdFx0XHRyZXR1cm4gbmV3IERlbGV0aW9uUmFuZ2UoZnJvbSwgdG8sIHRleHQsIG1ldGFkYXRhKTtcblx0XHRjYXNlIFwiU3Vic3RpdHV0aW9uXCI6XG5cdFx0XHRyZXR1cm4gbmV3IFN1YnN0aXR1dGlvblJhbmdlKGZyb20sIG1pZGRsZSEsIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdFx0Y2FzZSBcIkhpZ2hsaWdodFwiOlxuXHRcdFx0cmV0dXJuIG5ldyBIaWdobGlnaHRSYW5nZShmcm9tLCB0bywgdGV4dCwgbWV0YWRhdGEpO1xuXHRcdGNhc2UgXCJDb21tZW50XCI6XG5cdFx0XHRyZXR1cm4gbmV3IENvbW1lbnRSYW5nZShmcm9tLCB0bywgdGV4dCwgbWV0YWRhdGEpO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBXaWxsIG5ldmVyIGdldCBjYWxsZWRcblx0XHRcdHJldHVybiBuZXcgQWRkaXRpb25SYW5nZShmcm9tLCB0bywgdGV4dCwgbWV0YWRhdGEpO1xuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBSQU5HRV9QUk9UT1RZUEVfTUFQUEVSID0ge1xuXHRbU3VnZ2VzdGlvblR5cGUuQURESVRJT05dOiBBZGRpdGlvblJhbmdlLFxuXHRbU3VnZ2VzdGlvblR5cGUuREVMRVRJT05dOiBEZWxldGlvblJhbmdlLFxuXHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogSGlnaGxpZ2h0UmFuZ2UsXG5cdFtTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05dOiBTdWJzdGl0dXRpb25SYW5nZSxcblx0W1N1Z2dlc3Rpb25UeXBlLkNPTU1FTlRdOiBDb21tZW50UmFuZ2UsXG59O1xuIiwgImltcG9ydCB7IENPTU1FTlRBVE9SX0dMT0JBTCB9IGZyb20gXCIuLi8uLi8uLi9nbG9iYWxcIjtcbmltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlLCB0eXBlIE1FVEFEQVRBX1RZUEUsIHR5cGUgTWV0YWRhdGFGaWVsZHMgfSBmcm9tIFwiLi4vcmFuZ2VzXCI7XG5cbmV4cG9ydCB0eXBlIE1ldGFkYXRhQ29tcGF0aWJpbGl0eSA9IHtcblx0W2tleSBpbiBNRVRBREFUQV9UWVBFXT86IE1ldGFkYXRhTWVyZ2VBY3Rpb247XG59O1xuXG5leHBvcnQgZW51bSBNZXRhZGF0YU1lcmdlQWN0aW9uIHtcblx0Ly8gVE9ETzogQ2hlY2sgbmVjZXNzaXR5IG9mIFNLSVAgYWN0aW9uIChnaXZpbmcgd2FybmluZyBmb3IgaW5zZXJ0IGluIGRpZmYtYXV0aG9yIHJhbmdlIGNvdWxkIGFsc28gYmUgaGFuZGxlZCBvbiBTUExJVCBsZXZlbClcblx0Ly8gRGlzYWJsZSBhY3Rpb25cblx0Ly8gU0tJUCA9IFwic2tpcFwiLFxuXG5cdC8vIFNwbGl0IHJhbmdlIGludG8gdHdvIHJhbmdlcyAoYWxsb3cgb3ZlcndyaXRpbmcsIGRvZXMgbm90IGFsbG93IG1lcmdpbmcpXG5cdFNQTElUID0gXCJzcGxpdFwiLFxuXHQvLyBNb3ZlIG91dHNpZGUgb2YgcmFuZ2UgKGRvZXMgbm90IGFsbG93IG92ZXJ3cml0aW5nLCBkb2VzIG5vdCBhbGxvdyBtZXJnaW5nKVxuXHRNT1ZFX09VVFNJREUgPSBcIm1vdmVfb3V0c2lkZVwiLFxuXG5cdC8vIENob29zZSB2YWx1ZSBvZiBvbGQgcmFuZ2Vcblx0T0xEID0gXCJvbGRcIixcblx0Ly8gQ2hvb3NlIHZhbHVlIG9mIG5ldyByYW5nZVxuXHRORVcgPSBcIm5ld1wiLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVfbWV0YWRhdGEoKTogTWV0YWRhdGFGaWVsZHMgfCB1bmRlZmluZWQge1xuXHRsZXQgbWV0YWRhdGE6IE1ldGFkYXRhRmllbGRzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXHRpZiAoQ09NTUVOVEFUT1JfR0xPQkFMLlBMVUdJTl9TRVRUSU5HUy5hZGRfbWV0YWRhdGEpIHtcblx0XHRtZXRhZGF0YSA9IHt9O1xuXHRcdGlmIChDT01NRU5UQVRPUl9HTE9CQUwuUExVR0lOX1NFVFRJTkdTLmFkZF9hdXRob3JfbWV0YWRhdGEpXG5cdFx0XHRtZXRhZGF0YS5hdXRob3IgPSBDT01NRU5UQVRPUl9HTE9CQUwuUExVR0lOX1NFVFRJTkdTLmF1dGhvciB8fCB1bmRlZmluZWQ7XG5cdFx0aWYgKENPTU1FTlRBVE9SX0dMT0JBTC5QTFVHSU5fU0VUVElOR1MuYWRkX3RpbWVzdGFtcF9tZXRhZGF0YSlcblx0XHRcdG1ldGFkYXRhLnRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobWV0YWRhdGEpLmxlbmd0aCA9PT0gMClcblx0XHRcdG1ldGFkYXRhID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0cmV0dXJuIG1ldGFkYXRhO1xufVxuXG5jb25zdCBNRVRBREFUQV9JTkNPTVBBVElCSUxJVFk6IE1ldGFkYXRhQ29tcGF0aWJpbGl0eSA9IHtcblx0XCJhdXRob3JcIjogTWV0YWRhdGFNZXJnZUFjdGlvbi5TUExJVCxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByYW5nZV9tZXRhZGF0YV9jb21wYXRpYmxlKFxuXHRyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UsXG5cdG1ldGFkYXRhX2ZpZWxkcz86IE1ldGFkYXRhRmllbGRzLFxuXHRtZXRhZGF0YV9jb21wYXRpYmlsaXR5OiBNZXRhZGF0YUNvbXBhdGliaWxpdHkgPSBNRVRBREFUQV9JTkNPTVBBVElCSUxJVFksXG4pIHtcblx0Ly8gSWYgbm8gbWV0YWRhdGEgd2FzIHByb3ZpZGVkLCBhbGxvdyBtZXJnaW5nIG9mIHJhbmdlXG5cdGlmICghbWV0YWRhdGFfZmllbGRzKVxuXHRcdHJldHVybiB7IGNvbXBhdGlibGU6IHRydWUsIG1lcmdlZF9tZXRhZGF0YTogcmFuZ2UuZmllbGRzIH07XG5cblx0Ly8gSWYgbWV0YWRhdGEgd2FzIHByb3ZpZGVkIGJ1dCByYW5nZSBoYXMgbm8gbWV0YWRhdGEsIGRvIG5vdCBhbGxvdyBtZXJnaW5nXG5cdGlmICghcmFuZ2UuZmllbGRzKVxuXHRcdHJldHVybiB7IGNvbXBhdGlibGU6IGZhbHNlLCBtZXJnZWRfbWV0YWRhdGE6IHVuZGVmaW5lZCB9O1xuXG5cdGNvbnN0IG1lcmdlZF9tZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHJhbmdlLmZpZWxkcywgbWV0YWRhdGFfZmllbGRzKTtcblx0Zm9yIChjb25zdCB0eXBlIG9mIFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKG1ldGFkYXRhX2ZpZWxkcykuY29uY2F0KE9iamVjdC5rZXlzKHJhbmdlLmZpZWxkcykpKV0pIHtcblx0XHRpZiAobWV0YWRhdGFfZmllbGRzW3R5cGVdICE9PSByYW5nZS5maWVsZHNbdHlwZV0pIHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1ldGFkYXRhX2NvbXBhdGliaWxpdHlbdHlwZSBhcyBNRVRBREFUQV9UWVBFXTtcblx0XHRcdGlmIChNZXRhZGF0YU1lcmdlQWN0aW9uLlNQTElUID09PSBhY3Rpb24gfHwgTWV0YWRhdGFNZXJnZUFjdGlvbi5NT1ZFX09VVFNJREUgPT09IGFjdGlvbilcblx0XHRcdFx0cmV0dXJuIHsgY29tcGF0aWJsZTogZmFsc2UsIG1lcmdlZF9tZXRhZGF0YTogdW5kZWZpbmVkIH07XG5cdFx0XHRlbHNlIGlmIChNZXRhZGF0YU1lcmdlQWN0aW9uLk9MRCA9PT0gYWN0aW9uKVxuXHRcdFx0XHRtZXJnZWRfbWV0YWRhdGFbdHlwZSBhcyBNRVRBREFUQV9UWVBFXSA9IHJhbmdlLmZpZWxkc1t0eXBlXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgY29tcGF0aWJsZTogdHJ1ZSwgbWVyZ2VkX21ldGFkYXRhIH07XG59XG4iLCAiaW1wb3J0IHsgQ2hhckNhdGVnb3J5LCBFZGl0b3JTZWxlY3Rpb24sIHR5cGUgRWRpdG9yU3RhdGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7XG5cdHR5cGUgQnJhY2tldE9wdGlvbnNNYXAsXG5cdHR5cGUgQ3Vyc29yT3B0aW9uc01hcCxcblx0UkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04sXG5cdFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04sXG59IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgZmluZEJsb2NraW5nQ2hhciwgZ2V0Q2hhckNhdGVnb3J5IH0gZnJvbSBcIi4uL2VkaXQtdXRpbFwiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UsIENyaXRpY01hcmt1cFJhbmdlcywgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vcmFuZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IEVkaXRvclJhbmdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gY2F0X2lnbm9yZV93cyhjYXQ6IENoYXJDYXRlZ29yeSB8IG51bGwpIHtcblx0cmV0dXJuIGNhdCA9PT0gQ2hhckNhdGVnb3J5LlNwYWNlIHx8IGNhdCA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY2F0X2RpZmZlcmVudChvbGRfY2F0OiBDaGFyQ2F0ZWdvcnkgfCBudWxsLCBuZXdfY2F0OiBDaGFyQ2F0ZWdvcnkgfCBudWxsKSB7XG5cdHJldHVybiBvbGRfY2F0ICE9PSBudWxsICYmIG9sZF9jYXQgIT09IENoYXJDYXRlZ29yeS5TcGFjZSAmJiBvbGRfY2F0ICE9PSBuZXdfY2F0O1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gZWZmaWNpZW50bHkgZmluZCB0aGUgbmV3IHN1Z2dlc3Rpb24gcmFuZ2UgYWZ0ZXIgYSBjdXJzb3IgbW92ZW1lbnRcbiAqIEBwYXJhbSBjdXJzb3JfaGVhZCAtIEN1cnJlbnQgY3Vyc29yIGhlYWRcbiAqIEBwYXJhbSByYW5nZXMgLSBBbGwgc3VnZ2VzdGlvbiByYW5nZXMgaW4gdGhlIGRvY3VtZW50XG4gKiBAcGFyYW0gcmFuZ2UgLSBDdXJyZW50IHN1Z2dlc3Rpb24gcmFuZ2VcbiAqIEByZW1hcmsgVGhpcyBmdW5jdGlvbiBleGlzdHMgdG8gcHJldmVudCBoYXZpbmcgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBzdWdnZXN0aW9uIHJhbmdlcyB3aGVuIHRyeWluZyB0byBmaW5kIHRoZSBuZXcgcmFuZ2UgYWZ0ZXIgYSBjdXJzb3IgbW92ZW1lbnRcbiAqL1xuZnVuY3Rpb24gZmluZF9yYW5nZV9jdXJzb3IoY3Vyc29yX2hlYWQ6IG51bWJlciwgcmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZXMsIHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRpZiAocmFuZ2UuY3Vyc29yX2luc2lkZShjdXJzb3JfaGVhZCkpXG5cdFx0cmV0dXJuIHJhbmdlO1xuXHRlbHNlIHtcblx0XHRjb25zdCBjaGVja19kaXJlY3Rpb24gPSByYW5nZS5jdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcl9oZWFkKTtcblx0XHRsZXQgcmFuZ2VfaWR4ID0gcmFuZ2VzLnJhbmdlcy5pbmRleE9mKHJhbmdlKSArIChjaGVja19kaXJlY3Rpb24gPyAtMSA6IDEpO1xuXG5cdFx0d2hpbGUgKHJhbmdlX2lkeCA+PSAwICYmIHJhbmdlX2lkeCA8IHJhbmdlcy5yYW5nZXMubGVuZ3RoKSB7XG5cdFx0XHRyYW5nZSA9IHJhbmdlcy5yYW5nZXNbcmFuZ2VfaWR4XTtcblx0XHRcdGlmIChjaGVja19kaXJlY3Rpb24gPyByYW5nZS5jdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcl9oZWFkKSA6IHJhbmdlLmN1cnNvcl9hZnRlcl9yYW5nZShjdXJzb3JfaGVhZCkpXG5cdFx0XHRcdHJhbmdlX2lkeCArPSBjaGVja19kaXJlY3Rpb24gPyAtMSA6IDE7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiByYW5nZS5jdXJzb3JfaW5zaWRlKGN1cnNvcl9oZWFkKSA/IHJhbmdlIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQWR2YW5jZSB0aGUgY3Vyc29yIHRocm91Z2ggQ3JpdGljTWFya3VwIHN5bnRheCwgYmFzZWQgb24gdGhlIG1vdmVtZW50IG9wdGlvbnMgZm9yIHRoZSByYW5nZSB0eXBlXG4gKiBAcGFyYW0gY3Vyc29yX2hlYWQgLSBDdXJyZW50IGN1cnNvciBoZWFkXG4gKiBAcGFyYW0gbW92ZV9mb3J3YXJkcyAtIFdoZXRoZXIgdGhlIGN1cnNvciBtb3ZlbWVudCBpcyBmb3J3YXJkcyBvciBiYWNrd2FyZHNcbiAqIEBwYXJhbSByYW5nZXMgLSBBbGwgc3VnZ2VzdGlvbiByYW5nZXMgaW4gdGhlIGRvY3VtZW50XG4gKiBAcGFyYW0gcmFuZ2UgLSBDdXJyZW50IHN1Z2dlc3Rpb24gcmFuZ2VcbiAqIEBwYXJhbSBtb3ZlbWVudF9vcHRpb25zIC0gT3B0aW9ucyBmb3IgY3Vyc29yIG1vdmVtZW50IHRocm91Z2ggc3VnZ2VzdGlvbiByYW5nZXNcbiAqIEBwYXJhbSBicmFja2V0X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgYmV0d2VlbiBkaWZmZXJlbnQgc3VnZ2VzdGlvbiByYW5nZXNcbiAqL1xuZnVuY3Rpb24gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdGN1cnNvcl9oZWFkOiBudW1iZXIsXG5cdG1vdmVfZm9yd2FyZHM6IGJvb2xlYW4sXG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzLFxuXHRyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWQsXG5cdG1vdmVtZW50X29wdGlvbnM6IEN1cnNvck9wdGlvbnNNYXAsXG5cdGJyYWNrZXRfb3B0aW9uczogQnJhY2tldE9wdGlvbnNNYXAgfCBudWxsLFxuKTogW251bWJlciwgQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWRdIHtcblx0aWYgKCFyYW5nZSlcblx0XHRyYW5nZSA9IHJhbmdlcy5yYW5nZV9hZGphY2VudF90b19jdXJzb3IoY3Vyc29yX2hlYWQsICFtb3ZlX2ZvcndhcmRzLCB0cnVlLCB0cnVlKTtcblx0ZWxzZVxuXHRcdHJhbmdlID0gZmluZF9yYW5nZV9jdXJzb3IoY3Vyc29yX2hlYWQsIHJhbmdlcywgcmFuZ2UpO1xuXG5cdGxldCBjdXJzb3JfY2hhbmdlZCA9IHRydWU7XG5cdHdoaWxlIChjdXJzb3JfY2hhbmdlZCAmJiByYW5nZSkge1xuXHRcdGNvbnN0IG9sZF9jdXJzb3JfaGVhZCA9IGN1cnNvcl9oZWFkO1xuXHRcdGN1cnNvcl9oZWFkID0gcmFuZ2UhLmN1cnNvcl9tb3ZlX3Rocm91Z2goY3Vyc29yX2hlYWQsIG1vdmVfZm9yd2FyZHMsIG1vdmVtZW50X29wdGlvbnNbcmFuZ2UhLnR5cGVdKTtcblx0XHRjdXJzb3JfY2hhbmdlZCA9IGN1cnNvcl9oZWFkICE9PSBvbGRfY3Vyc29yX2hlYWQ7XG5cdFx0aWYgKGN1cnNvcl9jaGFuZ2VkICYmIGN1cnNvcl9oZWFkID09PSAobW92ZV9mb3J3YXJkcyA/IHJhbmdlLnRvIDogcmFuZ2UuZnJvbSkpIHtcblx0XHRcdHJhbmdlID0gcmFuZ2VzLmFkamFjZW50X3JhbmdlKHJhbmdlISwgIW1vdmVfZm9yd2FyZHMsIHRydWUpO1xuXHRcdFx0aWYgKHJhbmdlICYmIGJyYWNrZXRfb3B0aW9ucyAmJiBicmFja2V0X29wdGlvbnNbcmFuZ2UudHlwZV0gPT09IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfT1VUU0lERSlcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtjdXJzb3JfaGVhZCwgcmFuZ2VdO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvbGRfaGVhZCAtIE9yaWdpbmFsIGN1cnNvciBoZWFkXG4gKiBAcGFyYW0gbmV3X2hlYWQgLSBDdXJzb3IgaGVhZCBhZnRlciAqcmVndWxhciogY3Vyc29yIG1vdmVtZW50XG4gKiBAcGFyYW0gcmFuZ2VzIC0gQWxsIHN1Z2dlc3Rpb24gcmFuZ2VzIGluIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIG1vdmVfZm9yd2FyZHMgLSBXaGV0aGVyIHRoZSBjdXJzb3IgbW92ZW1lbnQgaXMgZm9yd2FyZHMgb3IgYmFja3dhcmRzXG4gKiBAcGFyYW0gYnlfd29yZF9ncm91cCAtIFdoZXRoZXIgdG8gbW92ZSBieSB3b3JkIGdyb3VwIChjdHJsL2FsdCArIGFycm93IGtleXMpXG4gKiBAcGFyYW0gaXNfc2VsZWN0aW9uIC0gV2hldGhlciB0byBleHRlbmQgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2VcbiAqIEBwYXJhbSBpc19ibG9ja19jdXJzb3IgLSBXaGV0aGVyIGN1cnNvciBpcyBjb25zaWRlcmVkIGFzIGEgYmxvY2sgY3Vyc29yICh2aW0gbW9kZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIEVkaXRvciBzdGF0ZVxuICogQHBhcmFtIG1vdmVtZW50X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaCBzdWdnZXN0aW9uIHJhbmdlc1xuICogQHBhcmFtIGJyYWNrZXRfb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZhbmNlX2N1cnNvcl9oZWFkKFxuXHRvbGRfaGVhZDogbnVtYmVyLFxuXHRuZXdfaGVhZDogbnVtYmVyLFxuXHRyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlcyxcblx0bW92ZV9mb3J3YXJkczogYm9vbGVhbixcblx0Ynlfd29yZF9ncm91cDogYm9vbGVhbixcblx0aXNfYmxvY2tfY3Vyc29yID0gZmFsc2UsXG5cdHN0YXRlOiBFZGl0b3JTdGF0ZSxcblx0bW92ZW1lbnRfb3B0aW9uczogQ3Vyc29yT3B0aW9uc01hcCxcblx0YnJhY2tldF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCxcbik6IG51bWJlciB7XG5cdC8vIE5PVEU6IFRoZSByZWFzb24gd2h5IGJvdGggb2xkIGFuZCBuZXcgY3Vyc29yIGhlYWQgYXJlIHVzZWQsIGlzIGJlY2F1c2UgaXQgaXMgbm90IHNpbXBsZSB0byBib3RoOlxuXHQvLyAgLSBSZWNyZWF0ZSB0aGUgZW50aXJlIG1vdmVtZW50IGFjdGlvbiBwYWxldHRlIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIGFuZCBhcHBseSBvbiBvcmlnaW5hbCByYW5nZSAoZS5nLiBtb3ZlIHRvIGJlZ2lubmluZyBvZiBub3RlLCAuLi4pXG5cdC8vICAgICAgICAgIC0+IFVzZSBuZXcgY3Vyc29yIGhlYWQgdG8gaGF2ZSBhIHN0YXJ0aW5nIHBvaW50XG5cdC8vICAtIFZlcmlmeSB0aGF0IG5vbmUgb2YgdGhlIHJhbmdlcyB0aGUgY3Vyc29yIHBhc3NlcyB0aHJvdWdoIHdpdGggdGhlIG9yaWdpbmFsIG1vdmVtZW50IGFyZSBibG9ja2luZyB1c2luZyBvbmx5IHRoZSBuZXcgY3Vyc29yIHJhbmdlXG5cdC8vICAgICAgICAgIC0+IE1vdmUgZnJvbSBvbGQgaGVhZCB0byB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZSByYW5nZXMgYXJlIGJsb2NraW5nXG5cblx0bGV0IHN1Z2dlc3Rpb25fcmFuZ2UgPSByYW5nZXMucmFuZ2VfYWRqYWNlbnRfdG9fY3Vyc29yKG9sZF9oZWFkLCAhbW92ZV9mb3J3YXJkcywgdHJ1ZSwgIWJ5X3dvcmRfZ3JvdXApO1xuXG5cdC8vIElmIG5vIHJhbmdlIGV4aXN0cyBpbiBtb3ZlbWVudCBkaXJlY3Rpb24gT1IgY3Vyc29yIGhhcyBub3QgcGFzc2VkIGEgcmFuZ2UgT1IgbW92ZW1lbnQgdGhyb3VnaCByYW5nZSBpcyBzZXQgdG8gYmUgdGhlIHNhbWUsXG5cdC8vIHRoZW4ganVzdCByZXR1cm4gdGhlIG5ldyByYW5nZSBhcy1pcyB3aXRob3V0IGFkZGl0aW9uYWwgcHJvY2Vzc2luZ1xuXHRpZiAoXG5cdFx0IXN1Z2dlc3Rpb25fcmFuZ2UgfHxcblx0XHQobW92ZV9mb3J3YXJkcyA/XG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLmN1cnNvcl9iZWZvcmVfcmFuZ2UobmV3X2hlYWQpIDpcblx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UuY3Vyc29yX2FmdGVyX3JhbmdlKG5ld19oZWFkKSkgfHxcblx0XHRtb3ZlbWVudF9vcHRpb25zW3N1Z2dlc3Rpb25fcmFuZ2UudHlwZV0gPT09IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uVU5DSEFOR0VEXG5cdCkge1xuXHRcdHJldHVybiBuZXdfaGVhZDtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGRpZmZlcmVuY2UgaW4gbW92ZW1lbnQgaXMgb25seSBvbmUgY2hhcmFjdGVyIChzaW5nbGUgY2hhcmFjdGVyIG1vdmVtZW50KVxuXHRpZiAoIWJ5X3dvcmRfZ3JvdXAgJiYgTWF0aC5hYnMob2xkX2hlYWQgLSBuZXdfaGVhZCkgPT09IDEpIHtcblx0XHRbbmV3X2hlYWQsIHN1Z2dlc3Rpb25fcmFuZ2VdID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRvbGRfaGVhZCxcblx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRyYW5nZXMsXG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLFxuXHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdGJyYWNrZXRfb3B0aW9ucyxcblx0XHQpO1xuXHRcdG5ld19oZWFkID0gbmV3X2hlYWQgKyAobW92ZV9mb3J3YXJkcyA/IDEgOiAtMSk7XG5cdH0gZWxzZSBpZiAoIWJ5X3dvcmRfZ3JvdXApIHtcblx0XHRbbmV3X2hlYWQsIHN1Z2dlc3Rpb25fcmFuZ2VdID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRuZXdfaGVhZCxcblx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRyYW5nZXMsXG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLFxuXHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdGJyYWNrZXRfb3B0aW9ucyxcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGxldCBwcmV2aW91c19yZWdfY2hhciA9IGN1cnNvcl9hZHZhbmNlX3Rocm91Z2hfc3ludGF4KFxuXHRcdFx0bmV3X2hlYWQsXG5cdFx0XHQhbW92ZV9mb3J3YXJkcyxcblx0XHRcdHJhbmdlcyxcblx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UsXG5cdFx0XHRtb3ZlbWVudF9vcHRpb25zLFxuXHRcdFx0bnVsbCxcblx0XHQpWzBdO1xuXHRcdGxldCBwcmV2aW91c19jYXQgPSBudWxsLFxuXHRcdFx0Y3VycmVudF9jYXQgPSAocHJldmlvdXNfcmVnX2NoYXIgPT09IG9sZF9oZWFkKSA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRnZXRDaGFyQ2F0ZWdvcnkocHJldmlvdXNfcmVnX2NoYXIsIHN0YXRlLCBtb3ZlX2ZvcndhcmRzKTtcblx0XHRsZXQgbmV4dF9jdXJzb3JfaGVhZCA9IG5ld19oZWFkO1xuXG5cdFx0d2hpbGUgKCFjYXRfZGlmZmVyZW50KHByZXZpb3VzX2NhdCwgY3VycmVudF9jYXQpKSB7XG5cdFx0XHRuZXdfaGVhZCA9IG5leHRfY3Vyc29yX2hlYWQ7XG5cdFx0XHRwcmV2aW91c19jYXQgPSBjdXJyZW50X2NhdDtcblx0XHRcdFtuZXdfaGVhZCwgc3VnZ2VzdGlvbl9yYW5nZV0gPSBjdXJzb3JfYWR2YW5jZV90aHJvdWdoX3N5bnRheChcblx0XHRcdFx0bmV3X2hlYWQsXG5cdFx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRcdHJhbmdlcyxcblx0XHRcdFx0c3VnZ2VzdGlvbl9yYW5nZSxcblx0XHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdFx0YnJhY2tldF9vcHRpb25zLFxuXHRcdFx0KTtcblx0XHRcdG5leHRfY3Vyc29yX2hlYWQgPVxuXHRcdFx0XHRmaW5kQmxvY2tpbmdDaGFyKG5ld19oZWFkLCBtb3ZlX2ZvcndhcmRzLCBzdGF0ZSwgY2F0X2lnbm9yZV93cyhwcmV2aW91c19jYXQpLCBwcmV2aW91c19jYXQpWzBdO1xuXHRcdFx0aWYgKG5leHRfY3Vyc29yX2hlYWQgPT09IG5ld19oZWFkKVxuXHRcdFx0XHRicmVhaztcblx0XHRcdHByZXZpb3VzX3JlZ19jaGFyID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRcdG5leHRfY3Vyc29yX2hlYWQsXG5cdFx0XHRcdCFtb3ZlX2ZvcndhcmRzLFxuXHRcdFx0XHRyYW5nZXMsXG5cdFx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UsXG5cdFx0XHRcdG1vdmVtZW50X29wdGlvbnMsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHQpWzBdO1xuXHRcdFx0Y3VycmVudF9jYXQgPSBnZXRDaGFyQ2F0ZWdvcnkocHJldmlvdXNfcmVnX2NoYXIsIHN0YXRlLCBtb3ZlX2ZvcndhcmRzKTtcblx0XHR9XG5cdH1cblxuXHQvLyBQb3N0LXByb2Nlc3Npbmcgc3RlcDogbW92ZSBjdXJzb3IgYmFjayB0byBpbnNpZGUgcmFuZ2UgaWYgbmVjZXNzYXJ5XG5cdGlmIChzdWdnZXN0aW9uX3JhbmdlICYmICEobmV3X2hlYWQgPT09IDAgfHwgbmV3X2hlYWQgPT09IHN0YXRlLmRvYy5sZW5ndGgpKSB7XG5cdFx0Y29uc3QgcmFuZ2VfYmFjayA9IG1vdmVfZm9yd2FyZHMgPyBzdWdnZXN0aW9uX3JhbmdlLnRvIDogc3VnZ2VzdGlvbl9yYW5nZS5mcm9tO1xuXHRcdGNvbnN0IG9mZnNldCA9IG1vdmVfZm9yd2FyZHMgPyAxIDogLTE7XG5cdFx0aWYgKG5ld19oZWFkID09PSByYW5nZV9iYWNrKSB7XG5cdFx0XHRpZiAoYnJhY2tldF9vcHRpb25zW3N1Z2dlc3Rpb25fcmFuZ2UudHlwZV0gPT09IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFKVxuXHRcdFx0XHRuZXdfaGVhZCA9IHJhbmdlX2JhY2sgLSAzICogb2Zmc2V0O1xuXHRcdH0gZWxzZSBpZiAoc3VnZ2VzdGlvbl9yYW5nZS50b3VjaGVzX2JyYWNrZXQobmV3X2hlYWQsIG1vdmVfZm9yd2FyZHMsIGZhbHNlLCB0cnVlKSkge1xuXHRcdFx0bmV3X2hlYWQgPSBtb3ZlX2ZvcndhcmRzID8gc3VnZ2VzdGlvbl9yYW5nZS5mcm9tIDogc3VnZ2VzdGlvbl9yYW5nZS50bztcblx0XHR9XG5cdH1cblxuXHQvLyBTYW5pdHkgY2hlY2s6IGNsYW1wIGN1cnNvciB0byBkb2N1bWVudCBsZW5ndGhcblx0cmV0dXJuIE1hdGguY2xhbXAobmV3X2hlYWQsIDAsIHN0YXRlLmRvYy5sZW5ndGgpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvbGRfY3Vyc29yX3JhbmdlIC0gT3JpZ2luYWwgY3Vyc29yIHJhbmdlXG4gKiBAcGFyYW0gbmV3X2N1cnNvcl9yYW5nZSAtIEN1cnNvciByYW5nZSBhZnRlciAqcmVndWxhciogY3Vyc29yIG1vdmVtZW50XG4gKiBAcGFyYW0gcmFuZ2VzIC0gQWxsIHN1Z2dlc3Rpb24gcmFuZ2VzIGluIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIG1vdmVfZm9yd2FyZHMgLSBXaGV0aGVyIHRoZSBjdXJzb3IgbW92ZW1lbnQgaXMgZm9yd2FyZHMgb3IgYmFja3dhcmRzXG4gKiBAcGFyYW0gYnlfd29yZF9ncm91cCAtIFdoZXRoZXIgdG8gbW92ZSBieSB3b3JkIGdyb3VwIChjdHJsL2FsdCArIGFycm93IGtleXMpXG4gKiBAcGFyYW0gaXNfc2VsZWN0aW9uIC0gV2hldGhlciB0byBleHRlbmQgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2VcbiAqIEBwYXJhbSBpc19ibG9ja19jdXJzb3IgLSBXaGV0aGVyIGN1cnNvciBpcyBjb25zaWRlcmVkIGFzIGEgYmxvY2sgY3Vyc29yICh2aW0gbW9kZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIEVkaXRvciBzdGF0ZVxuICogQHBhcmFtIG1vdmVtZW50X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaCBzdWdnZXN0aW9uIHJhbmdlc1xuICogQHBhcmFtIGJyYWNrZXRfb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JfbW92ZShcblx0b2xkX2N1cnNvcl9yYW5nZTogRWRpdG9yUmFuZ2UsXG5cdG5ld19jdXJzb3JfcmFuZ2U6IEVkaXRvclJhbmdlLFxuXHRyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlcyxcblx0bW92ZV9mb3J3YXJkczogYm9vbGVhbixcblx0Ynlfd29yZF9ncm91cDogYm9vbGVhbixcblx0aXNfc2VsZWN0aW9uOiBib29sZWFuLFxuXHRpc19ibG9ja19jdXJzb3IgPSBmYWxzZSxcblx0c3RhdGU6IEVkaXRvclN0YXRlLFxuXHRtb3ZlbWVudF9vcHRpb25zOiBDdXJzb3JPcHRpb25zTWFwLFxuXHRicmFja2V0X29wdGlvbnM6IEJyYWNrZXRPcHRpb25zTWFwLFxuKSB7XG5cdGNvbnN0IGN1cnNvcl9oZWFkID0gYWR2YW5jZV9jdXJzb3JfaGVhZChcblx0XHRvbGRfY3Vyc29yX3JhbmdlLmhlYWQhLFxuXHRcdG5ld19jdXJzb3JfcmFuZ2UuaGVhZCEsXG5cdFx0cmFuZ2VzLFxuXHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0Ynlfd29yZF9ncm91cCxcblx0XHRpc19ibG9ja19jdXJzb3IsXG5cdFx0c3RhdGUsXG5cdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRicmFja2V0X29wdGlvbnMsXG5cdCk7XG5cdGxldCBjdXJzb3JfYW5jaG9yID0gb2xkX2N1cnNvcl9yYW5nZS5hbmNob3IhO1xuXG5cdGlmICghaXNfc2VsZWN0aW9uKVxuXHRcdGN1cnNvcl9hbmNob3IgPSBjdXJzb3JfaGVhZDtcblxuXHRyZXR1cm4geyBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5yYW5nZShjdXJzb3JfYW5jaG9yLCBjdXJzb3JfaGVhZCkgfTtcbn1cblxuY29uc3QgZGVmYXVsdF9tb3ZlbWVudF9vcHRpb25zOiBDdXJzb3JPcHRpb25zTWFwID0ge1xuXHRbU3VnZ2VzdGlvblR5cGUuQURESVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfTUVUQURBVEEsXG5cdFtTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkNPTU1FTlRdOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkhJR0hMSUdIVF06IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uSUdOT1JFX01FVEFEQVRBLFxufTtcblxuY29uc3QgYnJhY2tldF9tb3ZlbWVudF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCA9IHtcblx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBSQU5HRV9CUkFDS0VUX01PVkVNRU5UX09QVElPTi5TVEFZX0lOU0lERSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JfbW92ZV9yYW5nZTxUIGV4dGVuZHMgRWRpdG9yUmFuZ2U+KFxuXHRjdXJzb3JfcmFuZ2U6IFQsXG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzLFxuXHRiYWNrd2FyZHNfZGVsZXRlOiBib29sZWFuLFxuXHRncm91cF9kZWxldGU6IGJvb2xlYW4sXG5cdHN0YXRlOiBFZGl0b3JTdGF0ZSxcblx0bW92ZW1lbnRfb3B0aW9uczogQ3Vyc29yT3B0aW9uc01hcCA9IGRlZmF1bHRfbW92ZW1lbnRfb3B0aW9ucyxcblx0YnJhY2tldF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCA9IGJyYWNrZXRfbW92ZW1lbnRfb3B0aW9ucyxcbik6IFQge1xuXHRpZiAoIWN1cnNvcl9yYW5nZS5zZWxlY3Rpb24pIHtcblx0XHRjb25zdCBjdXJzb3JfYW5jaG9yID0gY3Vyc29yX3JhbmdlLmFuY2hvciE7XG5cdFx0bGV0IGN1cnNvcl9oZWFkID0gYmFja3dhcmRzX2RlbGV0ZSA/IGN1cnNvcl9yYW5nZS5mcm9tIDogY3Vyc29yX3JhbmdlLnRvO1xuXHRcdGN1cnNvcl9oZWFkID0gYWR2YW5jZV9jdXJzb3JfaGVhZChcblx0XHRcdGN1cnNvcl9hbmNob3IsXG5cdFx0XHRjdXJzb3JfaGVhZCxcblx0XHRcdHJhbmdlcyxcblx0XHRcdCFiYWNrd2FyZHNfZGVsZXRlLFxuXHRcdFx0Z3JvdXBfZGVsZXRlLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRzdGF0ZSxcblx0XHRcdG1vdmVtZW50X29wdGlvbnMsXG5cdFx0XHRicmFja2V0X29wdGlvbnMsXG5cdFx0KTtcblx0XHRpZiAoYmFja3dhcmRzX2RlbGV0ZSlcblx0XHRcdGN1cnNvcl9yYW5nZS5mcm9tID0gY3Vyc29yX2hlYWQ7XG5cdFx0ZWxzZVxuXHRcdFx0Y3Vyc29yX3JhbmdlLnRvID0gY3Vyc29yX2hlYWQ7XG5cdH1cblx0cmV0dXJuIGN1cnNvcl9yYW5nZTtcbn1cbiIsICJpbXBvcnQgeyBDTV9BbGxfQnJhY2tldHMsIHR5cGUgTWV0YWRhdGFGaWVsZHMsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL3Jhbmdlc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVfbWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0X3N1Z2dlc3Rpb24oXG5cdGluc2VydGVkOiBzdHJpbmcsXG5cdGRlbGV0ZWQ6IHN0cmluZyxcblx0bWV0YWRhdGFfZmllbGRzPzogTWV0YWRhdGFGaWVsZHMsXG5cdHN0YXJ0X29mZnNldCA9IDAsXG5cdGVuZF9vZmZzZXQgPSAwLFxuKSB7XG5cdHJldHVybiBjb25zdHJ1Y3RfcmFuZ2UoXG5cdFx0aW5zZXJ0ZWQsXG5cdFx0ZGVsZXRlZCxcblx0XHRpbnNlcnRlZCAmJiBkZWxldGVkID9cblx0XHRcdFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTiA6XG5cdFx0XHQoaW5zZXJ0ZWQgPyBTdWdnZXN0aW9uVHlwZS5BRERJVElPTiA6IFN1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OKSxcblx0XHRtZXRhZGF0YV9maWVsZHMsXG5cdFx0c3RhcnRfb2Zmc2V0LFxuXHRcdGVuZF9vZmZzZXQsXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RfcmFuZ2UoXG5cdGluc2VydGVkOiBzdHJpbmcsXG5cdGRlbGV0ZWQ6IHN0cmluZyxcblx0dHlwZTogU3VnZ2VzdGlvblR5cGUsXG5cdG1ldGFkYXRhX2ZpZWxkcz86IE1ldGFkYXRhRmllbGRzLFxuXHRzdGFydF9vZmZzZXQgPSAwLFxuXHRlbmRfb2Zmc2V0ID0gMCxcbikge1xuXHRpZiAoIXR5cGUpXG5cdFx0cmV0dXJuIHsgaW5zZXJ0OiBkZWxldGVkICsgaW5zZXJ0ZWQsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCB9O1xuXG5cdGNvbnN0IGJyYWNrZXRzID0gQ01fQWxsX0JyYWNrZXRzW3R5cGVdO1xuXHRjb25zdCBtZXRhZGF0YSA9IG1ldGFkYXRhX2ZpZWxkcyAmJiBPYmplY3Qua2V5cyhtZXRhZGF0YV9maWVsZHMpLmxlbmd0aCA/XG5cdFx0SlNPTi5zdHJpbmdpZnkobWV0YWRhdGFfZmllbGRzKSArIFwiQEBcIiA6XG5cdFx0XCJcIjtcblx0Y29uc3Qgb3V0cHV0ID0gYnJhY2tldHNbMF0gKyBtZXRhZGF0YSArXG5cdFx0KHR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTiA/XG5cdFx0XHRkZWxldGVkICsgYnJhY2tldHNbMV0gKyBpbnNlcnRlZCArIGJyYWNrZXRzWzJdIDpcblx0XHRcdGRlbGV0ZWQgKyBpbnNlcnRlZCArIGJyYWNrZXRzWzFdKTtcblx0Y29uc3QgaW5pdGlhbF9vZmZzZXQgPSBicmFja2V0c1swXS5sZW5ndGggKyBtZXRhZGF0YS5sZW5ndGg7XG5cdHN0YXJ0X29mZnNldCArPSBpbml0aWFsX29mZnNldDtcblx0Ly8gRklYTUU6IGVuZCBtYXkgbm90IGJlIG9mZnNldCBpZiB0aGUgYnJhY2tldCBhcHBlYXJzIGFmdGVyIHRoZSBlbmRcblx0ZW5kX29mZnNldCArPSB0eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04gPyBicmFja2V0c1sxXS5sZW5ndGggOiAwO1xuXG5cdHJldHVybiB7IGluc2VydDogb3V0cHV0LCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZV9zdWdnZXN0aW9uKGluc2VydGVkOiBzdHJpbmcsIGRlbGV0ZWQ6IHN0cmluZyA9IFwiXCIpIHtcblx0cmV0dXJuIGNvbnN0cnVjdF9zdWdnZXN0aW9uKGluc2VydGVkLCBkZWxldGVkLCBnZW5lcmF0ZV9tZXRhZGF0YSgpKS5pbnNlcnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVfcmFuZ2UodHlwZTogU3VnZ2VzdGlvblR5cGUsIGluc2VydGVkOiBzdHJpbmcsIGRlbGV0ZWQ6IHN0cmluZyA9IFwiXCIpIHtcblx0cmV0dXJuIGNvbnN0cnVjdF9yYW5nZShpbnNlcnRlZCwgZGVsZXRlZCwgdHlwZSwgZ2VuZXJhdGVfbWV0YWRhdGEoKSkuaW5zZXJ0O1xufVxuIiwgIi8qKlxuICogVGhpcyBndXR0ZXIgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvbmUgZGVmaW5lZCBpbiBAY29kZW1pcnJvci92aWV3L2d1dHRlclxuICogVGhlIG1haW4gY2hhbmdlcyBhcmU6XG4gKiAgMS4gR3V0dGVyIGlzIGluc2VydGVkIG5leHQgdG8gdGhlIGNvbnRlbnRET00gKGluc3RlYWQgb2YgYmVmb3JlKVxuICogIDIuIEhlaWdodCBvZiBndXR0ZXJFbGVtZW50IGlzIG5vdCBzcGVjaWZpZWRcbiAqICAzLiBHdXR0ZXJFbGVtZW50IGNhbiBiZSBvZiBhcmJpdHJhcnkgaGVpZ2h0XG4gKiAgNC4gQWRkZWQgYW5ub3RhdGlvbiBsaXN0ZW5lcnMgZm9yIGZvY3VzaW5nIEd1dHRlck1hcmtlcnNcbiAqICA1LiBHdXR0ZXIgKmNhbiogYmUgemVyby13aWR0aCBpZiB0aGVyZSBhcmUgbm8gbWFya2VycyBpbiB0aGUgZG9jdW1lbnRcbiAqL1xuaW1wb3J0IHtBbm5vdGF0aW9uLCB0eXBlIEV4dGVuc2lvbiwgRmFjZXR9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgQmxvY2tJbmZvLCBFZGl0b3JWaWV3LCBHdXR0ZXJNYXJrZXIsIFZpZXdVcGRhdGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5pbXBvcnQgeyBkZWJvdW5jZSwgZWRpdG9ySW5mb0ZpZWxkLCBzZXRJY29uIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge1xuXHRjcmVhdGVHdXR0ZXIsXG5cdGNyZWF0ZUd1dHRlclZpZXdQbHVnaW4sXG5cdHR5cGUgR3V0dGVyQ29uZmlnLFxuXHRHdXR0ZXJFbGVtZW50LFxuXHRHdXR0ZXJWaWV3LFxuXHRzYW1lTWFya2Vycyxcblx0U2luZ2xlR3V0dGVyVmlldyxcblx0VXBkYXRlQ29udGV4dCxcbn0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IGFubm90YXRpb25HdXR0ZXJNYXJrZXJzLCBBbm5vdGF0aW9uTWFya2VyIH0gZnJvbSBcIi4vbWFya2VyXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uR3V0dGVyQ29tcGFydG1lbnQgfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgbWFya3VwRm9jdXNFZmZlY3QgfSBmcm9tIFwiLi4vLi4vbGl2ZS1wcmV2aWV3XCI7XG5cbmNvbnN0IEZPTERfQlVUVE9OX09GRlNFVCA9IDYwO1xuXG5jb25zdCB1bmZpeEd1dHRlcnMgPSBGYWNldC5kZWZpbmU8Ym9vbGVhbiwgYm9vbGVhbj4oe1xuXHRjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KSxcbn0pO1xuXG5jb25zdCBhY3RpdmVHdXR0ZXJzID0gRmFjZXQuZGVmaW5lPFJlcXVpcmVkPEFubm90YXRpb25HdXR0ZXJDb25maWc+PigpO1xuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckZvY3VzQW5ub3RhdGlvbiA9IEFubm90YXRpb24uZGVmaW5lPHsgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBpbmRleD86IG51bWJlciwgc2Nyb2xsPzogYm9vbGVhbiB9PigpO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJGb2xkQW5ub3RhdGlvbiA9IEFubm90YXRpb24uZGVmaW5lPGJvb2xlYW4gfCBudWxsPigpO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24gPSBBbm5vdGF0aW9uLmRlZmluZTx7IG1hcmtlcjogQW5ub3RhdGlvbk1hcmtlciwgaW5kZXg6IG51bWJlciwgc2Nyb2xsPzogYm9vbGVhbiwgZm9jdXNfbWFya3VwPzogYm9vbGVhbiB9PigpO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJXaWR0aEFubm90YXRpb24gPSBBbm5vdGF0aW9uLmRlZmluZTxudW1iZXI+KCk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckhpZGVFbXB0eUFubm90YXRpb24gPSBBbm5vdGF0aW9uLmRlZmluZTxib29sZWFuPigpO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJGb2xkQnV0dG9uQW5ub3RhdGlvbiA9IEFubm90YXRpb24uZGVmaW5lPGJvb2xlYW4+KCk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlclJlc2l6ZUhhbmRsZUFubm90YXRpb24gPSBBbm5vdGF0aW9uLmRlZmluZTxib29sZWFuPigpO1xuXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvbkd1dHRlclZpZXcgZXh0ZW5kcyBHdXR0ZXJWaWV3IHtcblx0ZGVjbGFyZSBndXR0ZXJzOiBBbm5vdGF0aW9uU2luZ2xlR3V0dGVyVmlld1tdO1xuXG5cdHByZXZpb3VzbHlfZm9jdXNlZDogQW5ub3RhdGlvbk1hcmtlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuXHRjb25zdHJ1Y3Rvcih2aWV3OiBFZGl0b3JWaWV3KSB7XG5cdFx0c3VwZXIodmlldywgdW5maXhHdXR0ZXJzLCBhY3RpdmVHdXR0ZXJzKTtcblx0XHQvLyBGSVhNRTogdGhpcyBzdGlsbCBjYXVzZXMgYSBsYXlvdXQgc2hpZnRcblx0XHRpZiAoIXZpZXcuZG9tLnBhcmVudEVsZW1lbnQhLmNsYXNzTGlzdC5jb250YWlucyhcIm1hcmtkb3duLXNvdXJjZS12aWV3XCIpKSB7XG5cdFx0XHQvLyBQcmV2ZW50IGd1dHRlciBmcm9tIGFwcGVhcmluZyBmb3IgYSBicmllZiBzZWNvbmQgKHVudGlsIHNldEltbWVkaWF0ZSBraWNrcyBpbilcblx0XHRcdHRoaXMuZG9tLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHQvLyBDb2RlbWlycm9yIGRvZXNuJ3QgYWxsb3cgc3RhdGUgY2hhbmdlcyBkdXJpbmcgdXBkYXRlcywgc28gcmVjb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlIGRlbGF5ZWRcblx0XHRcdHNldEltbWVkaWF0ZSgoKSA9PiB7XG5cdFx0XHRcdHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS51cGRhdGUoe1xuXHRcdFx0XHRcdGVmZmVjdHM6IFtcblx0XHRcdFx0XHRcdGFubm90YXRpb25HdXR0ZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShbXSlcblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8vIEVYUEw6IFdoZW4gbW92aW5nIGEgc2VsZWN0aW9uIGluc2lkZSB0aGUgZWRpdG9yLCBtdWx0aXBsZSBtb3ZlR3V0dGVyIGNhbGxzIGFyZSB0cmlnZ2VyZWQsXG5cdC8vICAgICAgIGNhdXNpbmcgd29ua3luZXNzIGFuZCBldmVyIGdyZWF0ZXIgdXAvZG93bndhcmRzIG1vdmVtZW50XG5cdGRlYm91bmNlZE1vdmVHdXR0ZXIgPSBkZWJvdW5jZSh0aGlzLm1vdmVHdXR0ZXIuYmluZCh0aGlzKSwgMjAwKTtcblxuXHRjcmVhdGVHdXR0ZXJzKHZpZXc6IEVkaXRvclZpZXcpIHtcblx0XHRyZXR1cm4gdmlldy5zdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKS5tYXAoY29uZiA9PiBuZXcgQW5ub3RhdGlvblNpbmdsZUd1dHRlclZpZXcodmlldywgY29uZiwgdGhpcy5kb20pKTtcblx0fVxuXG5cdGluc2VydEd1dHRlcnModmlldzogRWRpdG9yVmlldykge1xuXHRcdHZpZXcuY29udGVudERPTS5wYXJlbnROb2RlIS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHZpZXcuY29udGVudERPTS5uZXh0U2libGluZyk7XG5cdH1cblxuXHRpbnNlcnREZXRhY2hlZEd1dHRlcnMoYWZ0ZXI6IEhUTUxFbGVtZW50KSB7XG5cdFx0dGhpcy52aWV3LmNvbnRlbnRET00ucGFyZW50Tm9kZSEuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCB0aGlzLnZpZXcuY29udGVudERPTS5uZXh0U2libGluZyk7XG5cdH1cblxuXHRnZXRVcGRhdGVDb250ZXh0cygpOiBVcGRhdGVDb250ZXh0W10ge1xuXHRcdHJldHVybiAodGhpcy5ndXR0ZXJzIGFzIEFubm90YXRpb25TaW5nbGVHdXR0ZXJWaWV3W10pLm1hcChndXR0ZXIgPT5cblx0XHRcdG5ldyBBbm5vdGF0aW9uVXBkYXRlQ29udGV4dChndXR0ZXIsIHRoaXMudmlldy52aWV3cG9ydCwgLXRoaXMudmlldy5kb2N1bWVudFBhZGRpbmcudG9wKVxuXHRcdCk7XG5cdH1cblxuXHR1cGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlKSB7XG5cdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiB1cGRhdGUudHJhbnNhY3Rpb25zKSB7XG5cdFx0XHRjb25zdCB0aHJlYWRfZm9jdXMgPSB0cmFuc2FjdGlvbi5hbm5vdGF0aW9uKGFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24pO1xuXHRcdFx0aWYgKHRocmVhZF9mb2N1cykge1xuXHRcdFx0XHRjb25zdCB7IG1hcmtlciwgaW5kZXgsIHNjcm9sbCA9IGZhbHNlLCBmb2N1c19tYXJrdXAgPSBmYWxzZSB9ID0gdGhyZWFkX2ZvY3VzO1xuXHRcdFx0XHR0aGlzLnVuZm9jdXNBbm5vdGF0aW9uKCk7XG5cdFx0XHRcdHRoaXMuZm9jdXNBbm5vdGF0aW9uKG1hcmtlciwgaW5kZXgsIHNjcm9sbCwgZm9jdXNfbWFya3VwKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0c3VwZXIudXBkYXRlKHVwZGF0ZSk7XG5cdH1cblxuXHR1bmZvY3VzQW5ub3RhdGlvbigpIHtcblx0XHR0aGlzLnByZXZpb3VzbHlfZm9jdXNlZD8udW5mb2N1c19hbm5vdGF0aW9uKCk7XG5cdFx0dGhpcy5wcmV2aW91c2x5X2ZvY3VzZWQgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRmb2N1c0Fubm90YXRpb24obWFya2VyOiBBbm5vdGF0aW9uTWFya2VyLCBpbmRleDogbnVtYmVyLCBzY3JvbGw6IGJvb2xlYW4gPSBmYWxzZSwgZm9jdXNfbWFya3VwID0gZmFsc2UpIHtcblx0XHR0aGlzLnByZXZpb3VzbHlfZm9jdXNlZCA9IG1hcmtlcjtcblx0XHR0aGlzLmRlYm91bmNlZE1vdmVHdXR0ZXIobWFya2VyKTtcblx0XHRtYXJrZXIuZm9jdXNfYW5ub3RhdGlvbihpbmRleCwgc2Nyb2xsKTtcblxuXHRcdGlmIChmb2N1c19tYXJrdXApIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnZpZXcuZGlzcGF0Y2goXG5cdFx0XHRcdFx0dGhpcy52aWV3LnN0YXRlLnVwZGF0ZSh7XG5cdFx0XHRcdFx0XHRlZmZlY3RzOiBbXG5cdFx0XHRcdFx0XHRcdG1hcmt1cEZvY3VzRWZmZWN0Lm9mKHtcblx0XHRcdFx0XHRcdFx0XHRmcm9tOiBtYXJrZXIuYW5ub3RhdGlvbi5mcm9tLFxuXHRcdFx0XHRcdFx0XHRcdHRvOiBtYXJrZXIuYW5ub3RhdGlvbi5mdWxsX3JhbmdlX2JhY2tcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0dXBkYXRlR3V0dGVycyh1cGRhdGU6IFZpZXdVcGRhdGUpOiBib29sZWFuIHtcblx0XHQvLyBFWFBMOiBDaGVjayBhbGwgdHJhbnNhY3Rpb25zLCBmaWd1cmUgb3V0IGlmIHRoZXkgaGF2ZSBiZWVuIGFubm90YXRlZCB3aXRoIGEgZm9jdXMgc2hpZnQgYW5ub3RhdGlvblxuXHRcdC8vIFRPRE86IElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBjaGVjayB0aGUgYW5ub3RhdGlvbnMgb2YgYSBWaWV3VXBkYXRlP1xuXHRcdGNvbnN0IGFubm90YXRpb24gPSB1cGRhdGUudHJhbnNhY3Rpb25zLmZsYXRNYXAodHIgPT4gdHIuYW5ub3RhdGlvbihhbm5vdGF0aW9uR3V0dGVyRm9jdXNBbm5vdGF0aW9uKSkuZmluZChlID0+IGUpO1xuXHRcdGlmIChhbm5vdGF0aW9uIHx8IHVwZGF0ZS5zdGFydFN0YXRlLnNlbGVjdGlvbiAhPT0gdXBkYXRlLnN0YXRlLnNlbGVjdGlvbikge1xuXHRcdFx0dGhpcy51bmZvY3VzQW5ub3RhdGlvbigpO1xuXHRcdH1cblxuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRjb25zdCB7IGZyb20sIHRvLCBpbmRleCA9IC0xLCBzY3JvbGwgPSBmYWxzZSB9ID0gYW5ub3RhdGlvbjtcblxuXHRcdFx0Ly8gRVhQTDogRmluZCBhIEd1dHRlckVsZW1lbnQgYW5kIHRoZW4gR3V0dGVyTWFya2VyIHRoYXQgY29udGFpbnMgdGhlIGN1cnNvclxuXHRcdFx0Ly8gTk9URTogSW4gYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgY29kZSwgQW5ub3RhdGlvbkd1dHRlckVsZW1lbnQncyBgYmxvY2sudG9gIHdhcyB1c2VkXG5cdFx0XHQvLyAgICAgICBpbiBvcmRlciB0byBmaW5kIHRoZSBHdXR0ZXJNYXJrZXIgdGhhdCBjb250YWlucyB0aGUgY3Vyc29yLCBob3dldmVyLFxuXHRcdFx0Ly8gICAgICAgdGhlIGJsb2NrIG9ubHkgcmVwcmVzZW50cyB0aGUgc3RhcnRpbmcgbGluZSBvZiB0aGUgR3V0dGVyRWxlbWVudCwgYW5kIGRvZXMgbm90IHdvcmtcblx0XHRcdC8vICAgICAgIGZvciBtYXJrZXJzIHRoYXQgc3BhbiBtdWx0aXBsZSBsaW5lc1xuXHRcdFx0Ly8gVE9ETzogSW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhpcyBjb2RlLCBJIGFtIG5vdCBhIGJpZyBmYW4gb2YgbGluZWFybHkgc2VhcmNoaW5nIGxpa2UgdGhpc1xuXHRcdFx0Ly8gTk9URTogRGlkIHlvdSBrbm93IHlvdSBjYW4gbGFiZWwgbG9vcHM/IEkgZGlkbid0LiBOZWF0IGh1aD9cblx0XHRcdG91dGVyX2xvb3A6XG5cdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5ndXR0ZXJzWzBdLmVsZW1lbnRzIGFzIEFubm90YXRpb25HdXR0ZXJFbGVtZW50W10pIHtcblx0XHRcdFx0aWYgKGZyb20gPj0gZWxlbWVudC5ibG9jayEuZnJvbSkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgbWFya2VyIG9mIGVsZW1lbnQubWFya2VycyBhcyBBbm5vdGF0aW9uTWFya2VyW10pIHtcblx0XHRcdFx0XHRcdGlmIChmcm9tID49IG1hcmtlci5hbm5vdGF0aW9uLmZyb20gJiYgdG8gPD0gbWFya2VyLmFubm90YXRpb24uZnVsbF9yYW5nZV9iYWNrKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZm9jdXNBbm5vdGF0aW9uKG1hcmtlciwgaW5kZXgsIHNjcm9sbCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrIG91dGVyX2xvb3A7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGZyb20gPCBlbGVtZW50LmJsb2NrIS5mcm9tKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc3VwZXIudXBkYXRlR3V0dGVycyh1cGRhdGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1vdmVzIHRoZSBpbml0aWFsIEd1dHRlckVsZW1lbnQgb2YgdGhlIGd1dHRlciB1cCBvciBkb3duIHRvIGFsaWduIHByb3ZpZGVkIG1hcmtlciB3aXRoIGl0cyBibG9ja1xuXHQgKiBAcGFyYW0gbWFya2VyIC0gTWFya2VyIHRvIGFsaWduIHRoZSBndXR0ZXIgYnlcblx0ICovXG5cdHB1YmxpYyBtb3ZlR3V0dGVyKG1hcmtlcjogR3V0dGVyTWFya2VyKSB7XG5cdFx0Ly8gV2Ugb25seSBuZWVkIHRvIGNvbnNpZGVyIG9uZSBndXR0ZXIgZm9yIHRoZSBhbm5vdGF0aW9ucyBndXR0ZXJcblx0XHRjb25zdCBhY3RpdmVHdXR0ZXIgPSB0aGlzLmd1dHRlcnNbMF07XG5cblx0XHQvLyBHaXZlbiB0aGUgbWFya2VyLCBmZXRjaCB0aGUgZ3V0dGVyRWxlbWVudCBpdCBiZWxvbmdzIHRvXG5cdFx0Y29uc3QgZWxlbWVudCA9IGFjdGl2ZUd1dHRlci5lbGVtZW50cy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5tYXJrZXJzLmluY2x1ZGVzKG1hcmtlcikpIGFzIEFubm90YXRpb25HdXR0ZXJFbGVtZW50IHwgdW5kZWZpbmVkO1xuXHRcdGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgbWFya2VySW5kZXggPSBlbGVtZW50Lm1hcmtlcnMuaW5kZXhPZihtYXJrZXIpO1xuXG5cdFx0IC8vIFdoZXJlIHRoZSBndXR0ZXIgZWxlbWVudCBzaG91bGQgYmUgbG9jYXRlZCAoaS5lLiBmbHVzaCB3aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrKVxuXHRcdGNvbnN0IGRlc2lyZWRMb2NhdGlvbiA9IGVsZW1lbnQuYmxvY2shLnRvcDtcblx0XHQgLy8gV2hlcmUgdGhlIGd1dHRlciBlbGVtZW50IGlzIGN1cnJlbnRseSBsb2NhdGVkIChwb3NzaWJseSBwdXNoZWQgZG93biBieSBvdGhlciBndXR0ZXIgZWxlbWVudHMpXG5cdFx0Ly8gRklYTUU6IG9mZnNldFRvcCBub3QgZGVmaW5lZCBlcnJvciAocmVwcjogd2hlbiBpbnRlcmFjdGluZyBpbiBwaGFudG9tIGNvbW1lbnQgbm90ZSlcblx0XHRjb25zdCBjdXJyZW50TG9jYXRpb24gPSAoZWxlbWVudC5kb20uY2hpbGRyZW5bbWFya2VySW5kZXhdIGFzIEhUTUxFbGVtZW50KS5vZmZzZXRUb3A7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFuZCB0aGUgZGVzaXJlZCBsb2NhdGlvblxuXHRcdGxldCBvZmZzZXQgPSBkZXNpcmVkTG9jYXRpb24gLSBjdXJyZW50TG9jYXRpb247XG5cblx0XHQvLyBFWFBMOiBJdCBpcyBwcmVmZXJyZWQgbm90IHRvIG1ha2UgbWljcm8tYWRqdXN0bWVudHNcblx0XHRpZiAoTWF0aC5hYnMob2Zmc2V0KSA+PSAxMCAmJiBvZmZzZXQpIHtcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSBhY3RpdmVHdXR0ZXIuZWxlbWVudHNbMF07XG5cdFx0XHRlbGVtZW50LmRvbS5zdHlsZS5tYXJnaW5Ub3AgPSBwYXJzZUludChlbGVtZW50LmRvbS5zdHlsZS5tYXJnaW5Ub3AgfHwgXCIwXCIpICsgb2Zmc2V0ICsgXCJweFwiO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmb2xkR3V0dGVyKCkge1xuXHRcdCh0aGlzLmd1dHRlcnNbMF0gYXMgQW5ub3RhdGlvblNpbmdsZUd1dHRlclZpZXcpLmZvbGRHdXR0ZXIoKTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlclZpZXcgPSBjcmVhdGVHdXR0ZXJWaWV3UGx1Z2luKEFubm90YXRpb25HdXR0ZXJWaWV3KTtcblxuZXhwb3J0IGludGVyZmFjZSBBbm5vdGF0aW9uR3V0dGVyQ29uZmlnIGV4dGVuZHMgR3V0dGVyQ29uZmlnIHtcblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGd1dHRlciBzaG91bGQgYmUgZm9sZGVkIGJ5IGRlZmF1bHRcblx0ICovXG5cdGZvbGRTdGF0ZTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogVGhlIHdpZHRoIG9mIHRoZSBndXR0ZXIgaW4gcGl4ZWxzXG5cdCAqL1xuXHR3aWR0aDogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIHRoZSBndXR0ZXIgc2hvdWxkIGJlIGhpZGRlbiB3aGVuIGVtcHR5XG5cdCAqL1xuXHRoaWRlT25FbXB0eTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogV2hldGhlciB0aGUgZ3V0dGVyIHNob3VsZCBpbmNsdWRlIGEgZm9sZCBidXR0b25cblx0ICovXG5cdGluY2x1ZGVGb2xkQnV0dG9uOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIHRoZSBndXR0ZXIgc2hvdWxkIGluY2x1ZGUgYSByZXNpemUgaGFuZGxlXG5cdCAqL1xuXHRpbmNsdWRlUmVzaXplSGFuZGxlOiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uX2d1dHRlcihjb25maWc6IEFubm90YXRpb25HdXR0ZXJDb25maWcpOiBFeHRlbnNpb24ge1xuXHRyZXR1cm4gY3JlYXRlR3V0dGVyKGFubm90YXRpb25HdXR0ZXJWaWV3LCBjb25maWcsIGFjdGl2ZUd1dHRlcnMsIHVuZml4R3V0dGVycyk7XG59XG5cbmNsYXNzIEFubm90YXRpb25VcGRhdGVDb250ZXh0IGV4dGVuZHMgVXBkYXRlQ29udGV4dCB7XG5cdC8qKlxuXHQgKiBEZXNjcmliZXMgdGhlIHktcG9zaXRpb24gb2YgdGhlIGJvdHRvbSBvZiB0aGUgcHJldmlvdXMgZ3V0dGVyIGVsZW1lbnRcblx0ICovXG5cdHByZXZpb3VzX2VsZW1lbnRfZW5kOiBudW1iZXIgPSAwO1xuXHRuZXdfZ3V0dGVyX2VsZW1lbnRzOiBBbm5vdGF0aW9uR3V0dGVyRWxlbWVudFtdID0gW107XG5cdGFkZGVkX2VsZW1lbnRzOiBBbm5vdGF0aW9uR3V0dGVyRWxlbWVudFtdID0gW107XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cmVhZG9ubHkgZ3V0dGVyOiBBbm5vdGF0aW9uU2luZ2xlR3V0dGVyVmlldyxcblx0XHR2aWV3cG9ydDogeyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSxcblx0XHRwdWJsaWMgaGVpZ2h0OiBudW1iZXIsXG5cdCkge1xuXHRcdHN1cGVyKGd1dHRlciwgdmlld3BvcnQsIGhlaWdodCk7XG5cdFx0dGhpcy5wcmV2aW91c19lbGVtZW50X2VuZCA9IGhlaWdodDtcblx0fVxuXG5cdGFzeW5jIGFkZEVsZW1lbnQodmlldzogRWRpdG9yVmlldywgYmxvY2s6IEJsb2NrSW5mbywgbWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10pIHtcblx0XHQvKipcblx0XHQgKiBEZXNjcmliZXMgdGhlIGFtb3VudCBvZiBzcGFjZSBiZXR3ZWVuIHRoZSBwcmV2aW91cyBndXR0ZXIgZWxlbWVudCBhbmQgdGhlIHktcG9zdGlvbiBmb3IgdGhlIG9uZSB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrXG5cdFx0ICogQHJlbWFyayBUaGlzIHByZXZlbnRzIHRoZSBvdmVybGFwIG9mIHRoZSBndXR0ZXIgZWxlbWVudHNcblx0XHQgKi9cblx0XHRjb25zdCBhYm92ZSA9IE1hdGgubWF4KGJsb2NrLnRvcCAtIHRoaXMucHJldmlvdXNfZWxlbWVudF9lbmQsIDApO1xuXHRcdC8qKlxuXHRcdCAqIElmZiB0aGVyZSBpcyBvdmVybGFwIHdpdGggdGhlIHByZXZpb3VzIGJsb2NrIChpLmUuIHRoZSB0b3Agb2YgdGhlIGJsb2NrIGlzIGxvd2VyIHRoYW4gdGhlIGJvdHRvbSBvZiB0aGUgcHJldmlvdXMgZ3V0dGVyIGVsZW1lbnQpLFxuXHRcdCAqIHRoZW4gcGxhY2UgdGhlIGd1dHRlciBlbGVtZW50IGF0IHRoZSBib3R0b20gb2YgdGhlIHByZXZpb3VzIGd1dHRlciBlbGVtZW50IChhYm92ZSA9IDApXG5cdFx0ICovXG5cdFx0Y29uc3QgYmxvY2tfc3RhcnQgPSBhYm92ZSA8PSAwID8gdGhpcy5wcmV2aW91c19lbGVtZW50X2VuZCA6IGJsb2NrLnRvcDtcblxuXHRcdC8qKlxuXHRcdCAqIFNPTFVUSU9OOiBlbnN1cmVzIG9yZGVyaW5nIG9mIG1hcmtlcnMgb2Ygc2FtZSBibG9jayAoYml0IGluZWZmaWNpZW50IGJ1dCB2ZXJ5IGVhc3kgc29sdXRpb24pXG5cdFx0ICogV29ya3MgYnkgc29ydGluZyB0aGUgbWFya2VycyBpbi1wbGFjZVxuXHRcdCAqIEB0b2RvIEludmVzdGlnYXRlIHdoZXRoZXIgdGhlIG1hcmtlcnMgY2FuIGJlIHNvcnRlZCBlYXJsaWVyIGluIHRoZSBwaXBlbGluZVxuXHRcdCAqL1xuXHRcdC8vIEZJWE1FOiBNYXJrZXIgd2l0aG91dCBjb21tZW50X3JhbmdlIGlzc3VlXG5cdFx0Ly8gTk9URTogVGhpcyBtYXkgYmUgYWRkcmVzc2VzIGJ5IHVzaW5nIHRoZSBzdGFydFNpZGUgYmlhcyBpbiBndXR0ZXJNYXJrZXIgKHdhcm5pbmc6IHVwZGF0ZSBjb25jZXJuKVxuXHRcdChtYXJrZXJzIGFzIHVua25vd24gYXMgQW5ub3RhdGlvbk1hcmtlcltdKVxuXHRcdFx0LnNvcnQoKGEsIGIpID0+IGEuYW5ub3RhdGlvbi5mcm9tIC0gYi5hbm5vdGF0aW9uLmZyb20pO1xuXG5cdFx0Y29uc3QgVU5LTk9XTl9IRUlHSFQgPSAzNjtcblxuXHRcdC8qKlxuXHRcdCAqIENvbXBsZXRlIGhlaWdodCBvZiB0aGUgR3V0dGVyRWxlbWVudCwgaW5jbHVkaW5nIEJPVFRPTSBtYXJnaW4gKGkuZS4gc3BhY2luZyBiZXR3ZWVuIGd1dHRlciBlbGVtZW50cylcblx0XHQgKiBAcmVtYXJrIFRoZSByZWFzb24gKndoeSogdGhpcyBpcyBhbiBhYnNvbHV0ZWx5IGVzc2VudGlhbCB2YWx1ZSwgaXMgdGhhdCBpdCBlbnN1cmVzIHRoYXQgbm8gZWxlbWVudHMgY2FuIG92ZXJsYXAsXG5cdFx0ICogICAgIGlmIGVzdGltYXRlZCBoZWlnaHQgaXMgbG93ZXIgdGhhbiBhY3R1YWwgaGVpZ2h0LCB0aGVuIEd1dHRlckVsZW1lbnRzIG9mIHR3byBibG9ja3MgcmlzayBvdmVybGFwcGluZ1xuXHRcdCAqICAgICBpZiBlc3RpbWF0ZWQgaGVpZ2h0IGlzIGhpZ2hlciB0aGFuIGFjdHVhbCBoZWlnaHQsIHRoZW4gR3V0dGVyRWxlbWVudHMgd2lsbCBoYXZlIGFuIHVubmVjZXNzYXJpbHkgbGFyZ2UgZ2FwIGJldHdlZW4gdGhlbVxuXHRcdCAqICAgaG93ZXZlciwgd2UgY2Fubm90IGRpcmVjdGx5IGdyYWIgdGhlIGhlaWdodCBvZiB0aGUgZWxlbWVudCwgYXMgaXQgaXMgbm90IHlldCByZW5kZXJlZCwgc28gd2UgbmVlZCB0byBlaXRoZXI6XG5cdFx0ICogICBcdDEuIEVzdGltYXRlIHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgKGNsdW5reSwgYW5kIGVycm9yLXByb25lIHdpdGggZGlmZmVyZW50IHN0eWxlcylcblx0XHQgKiAgIFx0Mi4gV2FpdCB0aWxsIGVsZW1lbnQgaXMgcmVuZGVyZWQsIGdyYWIgaGVpZ2h0IGZyb20gcmVuZGVyZWQgZWxlbWVudFxuXHRcdCAqIEByZW1hcmsgQ3VycmVudCBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBDb2RlTWlycm9yIGRvZXMgYSBzZWNvbmQgcGFzcyB0aHJvdWdoIGFsbCBvZiB0aGUgZWxlbWVudHMsXG5cdFx0ICogICAgIGF0IHdoaWNoIHBvaW50IHRoZSBoZWlnaHQgb2YgdGhlIGd1dHRlciBlbGVtZW50IGlzIGtub3duIGR1ZSB0byB0aGUgRE9NIGJlaW5nIHJlbmRlcmVkXG5cdFx0ICogICAgIHdoZW4gU3luY0d1dHRlciBpcyBjYWxsZWQsIHRoZSBoZWlnaHQgaXMgYWdhaW4gcmVzZXQgdG8gMCwgd2hpY2ggY2F1c2VzIGRlc3luYyBpc3N1ZXMgYW5kIGFkZGl0aW9uYWwgZ3V0dGVyIG1vdmVtZW50XG5cdFx0ICogQHdhcm5pbmcgVGhpcyBpcyBUSEUgb25seSBwYXJ0IG9mIHRoZSBhbGdvcml0aG0gdGhhdCBuZWVkcyBhbiBpbXBsZW1lbnRhdGlvbiAoYS5rLmEuIHRoZSB1bnNldHRsZWQgaGVpZ2h0IHByb2JsZW0pLFxuXHRcdCAqIFx0ICAgaW4gc2hvcnQsIGEgYmV0dGVyIGFwcHJveGltYXRpb24gZm9yIFVOS05PV05fSEVJR0hUIHdoZW4gdGhlIGVsZW1lbnQgaXMgbm90IHJlbmRlcmVkIHlldCB3b3VsZCBiZSBmYW50YXN0aWNcblx0XHQgKiBcdCAgIHBsZWFzZSAtIGFuZCBJIG1lYW4gdGhpcyB3aXRoIGFsbCBzaW5jZXJpdHkgaW4gdGhlIHdvcmxkIC0gcGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSBhcmUgYWJsZSB0byBjb21lIHVwIHdpdGggYSBtb3JlIGVsZWdhbnQgc29sdXRpb25cblx0XHQgKi9cblx0XHRjb25zdCBoZWlnaHQgPSB0aGlzLmd1dHRlci5lbGVtZW50c1t0aGlzLmldPy5kb20uY2xpZW50SGVpZ2h0IHx8IFVOS05PV05fSEVJR0hUO1xuXG5cblx0XHQvLyBFWFBMOiBTZWFyY2ggZm9yIGFuIGV4aXN0aW5nIEd1dHRlckVsZW1lbnQgd2l0aCB0aGUgc2FtZSBtYXJrZXJzXG5cdFx0Y29uc3QgZWxlbWVudF9pZHggPSB0aGlzLmd1dHRlci5lbGVtZW50c1xuXHRcdFx0LmZpbmRJbmRleChlID0+IHNhbWVNYXJrZXJzKGUubWFya2VycywgbWFya2VycykpO1xuXG5cdFx0Ly8gRVhQTDogSWYgYSBHdXR0ZXJFbGVtZW50IGFscmVhZHkgZXhpc3RzLCBhbmQgaXQgaGFzIHRoZSBleGFjdCBzYW1lIG1hcmtlcnMsXG5cdFx0Ly8gICAgICByZW1vdmUgYWxsIHRoZSBHdXR0ZXJFbGVtZW50cyBiZWZvcmUgdGhpcyBlbGVtZW50XG5cdFx0Ly8gICAgXHRhbmQgcmUtaW5zZXJ0IGFsbCB0aGUgbmV3bHkgYWRkZWQgZWxlbWVudHMgYmVmb3JlIHRoaXMgZWxlbWVudFxuXHRcdGlmIChlbGVtZW50X2lkeCAhPT0gLTEpIHtcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLmd1dHRlci5lbGVtZW50c1tlbGVtZW50X2lkeF07XG5cdFx0XHRmb3IgKGxldCBpID0gdGhpcy5pOyBpIDwgZWxlbWVudF9pZHg7IGkrKykge1xuXHRcdFx0XHR0aGlzLmd1dHRlci5kb20ucmVtb3ZlQ2hpbGQodGhpcy5ndXR0ZXIuZWxlbWVudHNbaV0uZG9tKTtcblx0XHRcdFx0dGhpcy5ndXR0ZXIuZWxlbWVudHNbaV0uZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBhZGRlZF9lbGVtZW50IG9mIHRoaXMuYWRkZWRfZWxlbWVudHMpXG5cdFx0XHRcdHRoaXMuZ3V0dGVyLmRvbS5pbnNlcnRCZWZvcmUoYWRkZWRfZWxlbWVudC5kb20sIGVsZW1lbnQuZG9tKTtcblx0XHRcdHRoaXMubmV3X2d1dHRlcl9lbGVtZW50cy5wdXNoKC4uLnRoaXMuYWRkZWRfZWxlbWVudHMpO1xuXHRcdFx0dGhpcy5hZGRlZF9lbGVtZW50cyA9IFtdO1xuXG5cdFx0XHR0aGlzLmkgPSBlbGVtZW50X2lkeCArIDE7XG5cdFx0XHR0aGlzLm5ld19ndXR0ZXJfZWxlbWVudHMucHVzaChlbGVtZW50KTtcblx0XHRcdGVsZW1lbnQudXBkYXRlKHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMsIGJsb2NrKTtcblx0XHR9XG5cblx0XHQvLyBFWFBMOiBPdGhlcndpc2UsIGlmIHRoZSBHdXR0ZXJFbGVtZW50IGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcgb25lIGFuZCBpdCB0byB0aGUgZ3V0dGVyIGxhdGVyXG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLmFkZGVkX2VsZW1lbnRzLnB1c2gobmV3IEFubm90YXRpb25HdXR0ZXJFbGVtZW50KHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMsIGJsb2NrKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5wcmV2aW91c19lbGVtZW50X2VuZCA9IGJsb2NrX3N0YXJ0ICsgaGVpZ2h0O1xuXHR9XG5cblx0ZmluaXNoKCkge1xuXHRcdC8vIEVYUEw6IEZpbmFsbHksIGF0IHRoZSBlbmQgb2YgdGhlIHVwZGF0ZSwgcmVtb3ZlIGFsbCByZW1haW5pbmcgR3V0dGVyRWxlbWVudHNcblx0XHRmb3IgKGxldCBpID0gdGhpcy5pOyBpIDwgdGhpcy5ndXR0ZXIuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRoaXMuZ3V0dGVyLmRvbS5yZW1vdmVDaGlsZCh0aGlzLmd1dHRlci5lbGVtZW50c1tpXS5kb20pO1xuXHRcdFx0dGhpcy5ndXR0ZXIuZWxlbWVudHNbaV0uZGVzdHJveSgpO1xuXHRcdH1cblxuXHRcdC8vIEVYUEw6IEFkZCBhbGwgdGhlIHJlbWFpbmluZyBhZGRlZCBHdXR0ZXJFbGVtZW50cyB0byB0aGUgZ3V0dGVyXG5cdFx0Zm9yIChjb25zdCBhZGRlZF9lbGVtZW50IG9mIHRoaXMuYWRkZWRfZWxlbWVudHMpIHtcblx0XHRcdHRoaXMuZ3V0dGVyLmRvbS5hcHBlbmRDaGlsZChhZGRlZF9lbGVtZW50LmRvbSk7XG5cdFx0fVxuXHRcdHRoaXMuZ3V0dGVyLmVsZW1lbnRzID0gWy4uLnRoaXMubmV3X2d1dHRlcl9lbGVtZW50cywgLi4udGhpcy5hZGRlZF9lbGVtZW50c107XG5cdFx0dGhpcy5uZXdfZ3V0dGVyX2VsZW1lbnRzID0gW107XG5cdFx0dGhpcy5hZGRlZF9lbGVtZW50cyA9IFtdO1xuXHR9XG59XG5cbmNsYXNzIEFubm90YXRpb25TaW5nbGVHdXR0ZXJWaWV3IGV4dGVuZHMgU2luZ2xlR3V0dGVyVmlldyB7XG5cdGZvbGRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRoaWRlX29uX2VtcHR5OiBib29sZWFuID0gZmFsc2U7XG5cdHdpZHRoOiBudW1iZXIgPSAwO1xuXHRhZGRfZm9sZF9idXR0b246IGJvb2xlYW4gPSBmYWxzZTtcblx0YWRkX3Jlc2l6ZV9oYW5kbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRmb2xkX2J1dHRvbl9lbDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdHJlc2l6ZV9oYW5kbGVfZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXHRkZWNsYXJlIGVsZW1lbnRzOiBBbm5vdGF0aW9uR3V0dGVyRWxlbWVudFtdO1xuXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3OiBFZGl0b3JWaWV3LCBwdWJsaWMgY29uZmlnOiBSZXF1aXJlZDxBbm5vdGF0aW9uR3V0dGVyQ29uZmlnPiwgcHJpdmF0ZSBndXR0ZXJEb206IEhUTUxFbGVtZW50KSB7XG5cdFx0c3VwZXIodmlldywgY29uZmlnKTtcblxuXHRcdHRoaXMuZm9sZGVkID0gY29uZmlnLmZvbGRTdGF0ZTtcblx0XHR0aGlzLndpZHRoID0gY29uZmlnLndpZHRoO1xuXHRcdHRoaXMuaGlkZV9vbl9lbXB0eSA9IGNvbmZpZy5oaWRlT25FbXB0eTtcblx0XHR0aGlzLmFkZF9mb2xkX2J1dHRvbiA9IGNvbmZpZy5pbmNsdWRlRm9sZEJ1dHRvbjtcblx0XHR0aGlzLmFkZF9yZXNpemVfaGFuZGxlID0gY29uZmlnLmluY2x1ZGVSZXNpemVIYW5kbGU7XG5cblx0XHRpZiAoKHRoaXMuaGlkZV9vbl9lbXB0eSAmJiB2aWV3LnN0YXRlLmZpZWxkKGFubm90YXRpb25HdXR0ZXJNYXJrZXJzKS5zaXplID09PSAwKSB8fCB0aGlzLmZvbGRlZCkge1xuXHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSBcIjBcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmFkZF9mb2xkX2J1dHRvbikge1xuXHRcdFx0dGhpcy5jcmVhdGVGb2xkQnV0dG9uKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuYWRkX3Jlc2l6ZV9oYW5kbGUpIHtcblx0XHRcdHRoaXMuY3JlYXRlUmVzaXplSGFuZGxlKCk7XG5cdFx0fVxuXHR9XG5cblx0Y3JlYXRlRm9sZEJ1dHRvbigpIHtcblx0XHR0aGlzLmZvbGRfYnV0dG9uX2VsID0gY3JlYXRlRWwoXCJhXCIsIHsgY2xzOiBbXCJjbXRyLWFubm8tZ3V0dGVyLWJ1dHRvblwiLCBcInZpZXctYWN0aW9uXCJdIH0pO1xuXHRcdHNldEljb24odGhpcy5mb2xkX2J1dHRvbl9lbCwgXCJhcnJvdy1yaWdodC1mcm9tLWxpbmVcIik7XG5cdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRvb2x0aXAtcG9zaXRpb25cIiwgXCJsZWZ0XCIpO1xuXHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUuZGlzcGxheSA9IHRoaXMudmlldy5zdGF0ZS5maWVsZChhbm5vdGF0aW9uR3V0dGVyTWFya2Vycykuc2l6ZSA/IFwiXCIgOiBcIm5vbmVcIjtcblx0XHR0aGlzLmZvbGRfYnV0dG9uX2VsLm9uY2xpY2sgPSAoKSA9PiB7XG5cdFx0XHR0aGlzLmZvbGRlZCA9ICF0aGlzLmZvbGRlZDtcblx0XHRcdHRoaXMudmlldy5zdGF0ZS5maWVsZChlZGl0b3JJbmZvRmllbGQpLmFwcC53b3Jrc3BhY2UucmVxdWVzdFNhdmVMYXlvdXQoKTtcblx0XHRcdHRoaXMuZm9sZEd1dHRlcigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0Rm9sZEJ1dHRvblN0YXRlKCk7XG5cdFx0dGhpcy52aWV3LmRvbS5wcmVwZW5kKHRoaXMuZm9sZF9idXR0b25fZWwpO1xuXHR9XG5cblx0Y3JlYXRlUmVzaXplSGFuZGxlKCkge1xuXHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbCA9IGNyZWF0ZUVsKFwiaHJcIiwgeyBjbHM6IFtcImNtdHItYW5uby1ndXR0ZXItcmVzaXplLWhhbmRsZVwiXSB9KTtcblx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwuc3R5bGUuZGlzcGxheSA9ICh0aGlzLnZpZXcuc3RhdGUuZmllbGQoYW5ub3RhdGlvbkd1dHRlck1hcmtlcnMpLnNpemUgJiYgIXRoaXMuZm9sZGVkKSA/IFwiXCIgOiBcIm5vbmVcIjtcblx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZSkgPT4ge1xuXHRcdFx0bGV0IGluaXRpYWxQb3NpdGlvbiA9IGUuY2xpZW50WDtcblxuXHRcdFx0Ly8gRVhQTDogRGVib3VuY2UgdG8gcHJldmVudCBleGNlc3NpdmUgc3RhdGUgdXBkYXRlcyBhbmQgRE9NIHJlZHJhd3Mgd2hpbGUgZHJhZ2dpbmcgdGhlIGhhbmRsZVxuXHRcdFx0Y29uc3Qgc2V0V2lkdGggPSBkZWJvdW5jZSgod2lkdGg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdFx0XHRcdHRoaXMudmlldy5zdGF0ZS5maWVsZChlZGl0b3JJbmZvRmllbGQpLmFwcC53b3Jrc3BhY2UucmVxdWVzdFNhdmVMYXlvdXQoKTtcblx0XHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuXHRcdFx0XHRpZiAodGhpcy5mb2xkX2J1dHRvbl9lbCkge1xuXHRcdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUucmlnaHQgPSB0aGlzLndpZHRoICsgRk9MRF9CVVRUT05fT0ZGU0VUICsgXCJweFwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCAyNSk7XG5cblx0XHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbCEuY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItcmVzaXplLWhhbmRsZS1ob3ZlclwiLCB0cnVlKTtcblx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWw/LmNsYXNzTGlzdC50b2dnbGUoXCJjbXRyLWFubm8tZ3V0dGVyLW1vdmluZ1wiLCB0cnVlKTtcblx0XHRcdHRoaXMuZ3V0dGVyRG9tLmNsYXNzTGlzdC50b2dnbGUoXCJjbXRyLWFubm8tZ3V0dGVyLW1vdmluZ1wiLCB0cnVlKTtcblxuXHRcdFx0bGV0IGN1cnJlbnRXaWR0aCA9IHBhcnNlSW50KHRoaXMuZG9tLnN0eWxlLndpZHRoLnNsaWNlKDAsIC0yKSk7XG5cdFx0XHRjb25zdCBvbk1vdXNlTW92ZSA9IChldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdFx0Y29uc3QgZGVsdGFYID0gZXZ0LmNsaWVudFggLSBpbml0aWFsUG9zaXRpb247XG5cdFx0XHRcdGluaXRpYWxQb3NpdGlvbiA9IGV2dC5jbGllbnRYXG5cdFx0XHRcdGN1cnJlbnRXaWR0aCAtPSBkZWx0YVg7XG5cdFx0XHRcdHNldFdpZHRoKGN1cnJlbnRXaWR0aCk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvbk1vdXNlU3RvcCA9ICgpID0+IHtcblx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBvbk1vdXNlTW92ZSk7XG5cdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIG9uTW91c2VTdG9wKTtcblx0XHRcdFx0dGhpcy5yZXNpemVfaGFuZGxlX2VsIS5jbGFzc0xpc3QudG9nZ2xlKFwiY210ci1hbm5vLWd1dHRlci1yZXNpemUtaGFuZGxlLWhvdmVyXCIsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbD8uY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItbW92aW5nXCIsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5ndXR0ZXJEb20uY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItbW92aW5nXCIsIGZhbHNlKTtcblx0XHRcdH1cblxuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBvbk1vdXNlTW92ZSk7XG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBvbk1vdXNlU3RvcCk7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5ndXR0ZXJEb20uYXBwZW5kQ2hpbGQodGhpcy5yZXNpemVfaGFuZGxlX2VsKTtcblx0fVxuXG5cdHNldEZvbGRCdXR0b25TdGF0ZSgpIHtcblx0XHRpZiAodGhpcy5mb2xkX2J1dHRvbl9lbCkge1xuXHRcdFx0aWYgKHRoaXMuZm9sZGVkKSB7XG5cdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUucmlnaHQgPSBcIjIwcHhcIjtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5zdHlsZS5yb3RhdGUgPSBcIi0xODBkZWdcIjtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5hcmlhTGFiZWwgPSBcIlVuZm9sZCBndXR0ZXJcIjtcblx0XHRcdFx0aWYgKHRoaXMucmVzaXplX2hhbmRsZV9lbCkge1xuXHRcdFx0XHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmZvbGRfYnV0dG9uX2VsLnN0eWxlLnJpZ2h0ID0gdGhpcy53aWR0aCArIEZPTERfQlVUVE9OX09GRlNFVCArIFwicHhcIjtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5zdHlsZS5yb3RhdGUgPSBcIjBkZWdcIjtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5hcmlhTGFiZWwgPSBcIkZvbGQgZ3V0dGVyXCI7XG5cdFx0XHRcdGlmICh0aGlzLnJlc2l6ZV9oYW5kbGVfZWwpIHtcblx0XHRcdFx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Zm9sZEd1dHRlcigpIHtcblx0XHR0aGlzLnNldEZvbGRCdXR0b25TdGF0ZSgpO1xuXG5cdFx0Ly8gRVhQTDogU2V0IHRoZSBoZWlnaHQgZm9yIGV2ZXJ5IG1hcmtlciB0byBmaXhlZCBzbyB0aGF0IHRoZXkgd29uJ3QgcmVzaXplIHdoaWxlIHRoZSBndXR0ZXIgaXMgY2hhbmdpbmcgd2lkdGhcblx0XHRpZiAodGhpcy5mb2xkZWQpIHtcblx0XHRcdHRoaXMuZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcblx0XHRcdFx0QXJyYXkuZnJvbShlbGVtZW50LmRvbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uXCIpKS5mb3JFYWNoKGNvbW1lbnQgPT4ge1xuXHRcdFx0XHRcdGNvbW1lbnQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgYG1heC1oZWlnaHQ6ICR7Y29tbWVudC5jbGllbnRIZWlnaHR9cHg7IG92ZXJmbG93OiBoaWRkZW47YCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdEFycmF5LmZyb20oZWxlbWVudC5kb20uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvblwiKSkuZm9yRWFjaChjb21tZW50ID0+IHtcblx0XHRcdFx0XHRcdGNvbW1lbnQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgYGApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sIHsgb25jZTogdHJ1ZSB9KTtcblx0XHR9XG5cdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB0aGlzLmZvbGRlZCA/IFwiMFwiIDogdGhpcy53aWR0aCArIFwicHhcIjtcblx0fVxuXG5cdHVwZGF0ZSh1cGRhdGU6IFZpZXdVcGRhdGUpIHtcblx0XHRjb25zdCByZXN1bHQgPSBzdXBlci51cGRhdGUodXBkYXRlKTtcblx0XHRjb25zdCB3aWRnZXRzID0gdXBkYXRlLnN0YXRlLmZpZWxkKGFubm90YXRpb25HdXR0ZXJNYXJrZXJzKTtcblxuXHRcdGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgdXBkYXRlLnRyYW5zYWN0aW9ucykge1xuXHRcdFx0Y29uc3QgZm9sZF9zdGF0dXMgPSB0cmFuc2FjdGlvbi5hbm5vdGF0aW9uKGFubm90YXRpb25HdXR0ZXJGb2xkQW5ub3RhdGlvbik7XG5cdFx0XHRjb25zdCB3aWR0aCA9IHRyYW5zYWN0aW9uLmFubm90YXRpb24oYW5ub3RhdGlvbkd1dHRlcldpZHRoQW5ub3RhdGlvbik7XG5cdFx0XHRjb25zdCBoaWRlX2VtcHR5ID0gdHJhbnNhY3Rpb24uYW5ub3RhdGlvbihhbm5vdGF0aW9uR3V0dGVySGlkZUVtcHR5QW5ub3RhdGlvbik7XG5cdFx0XHRjb25zdCBmb2xkX2J1dHRvbiA9IHRyYW5zYWN0aW9uLmFubm90YXRpb24oYW5ub3RhdGlvbkd1dHRlckZvbGRCdXR0b25Bbm5vdGF0aW9uKTtcblx0XHRcdGNvbnN0IHJlc2l6ZV9oYW5kbGUgPSB0cmFuc2FjdGlvbi5hbm5vdGF0aW9uKGFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVBbm5vdGF0aW9uKTtcblx0XHRcdGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHRcdFx0aWYgKCF0aGlzLmhpZGVfb25fZW1wdHkgJiYgIXRoaXMuZm9sZGVkKSB7XG5cdFx0XHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB3aWR0aCArIFwicHhcIjtcblx0XHRcdFx0XHR0aGlzLnNldEZvbGRCdXR0b25TdGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9sZF9zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoZm9sZF9zdGF0dXMgPT09IG51bGwpIHtcblx0XHRcdFx0XHR0aGlzLmZvbGRlZCA9ICF0aGlzLmZvbGRlZDtcblx0XHRcdFx0XHR0aGlzLnZpZXcuc3RhdGUuZmllbGQoZWRpdG9ySW5mb0ZpZWxkKS5hcHAud29ya3NwYWNlLnJlcXVlc3RTYXZlTGF5b3V0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5mb2xkZWQgPSBmb2xkX3N0YXR1cztcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmZvbGRHdXR0ZXIoKTtcblx0XHRcdH1cblx0XHRcdGlmIChoaWRlX2VtcHR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5oaWRlX29uX2VtcHR5ID0gaGlkZV9lbXB0eTtcblx0XHRcdFx0aWYgKHRoaXMuaGlkZV9vbl9lbXB0eSAmJiB3aWRnZXRzLnNpemUgPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLmRvbS5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZG9tLnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGZvbGRfYnV0dG9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5hZGRfZm9sZF9idXR0b24gPSBmb2xkX2J1dHRvbjtcblx0XHRcdFx0aWYgKHRoaXMuYWRkX2ZvbGRfYnV0dG9uICYmICF0aGlzLmZvbGRfYnV0dG9uX2VsKSB7XG5cdFx0XHRcdFx0dGhpcy5jcmVhdGVGb2xkQnV0dG9uKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuYWRkX2ZvbGRfYnV0dG9uICYmIHRoaXMuZm9sZF9idXR0b25fZWwpIHtcblx0XHRcdFx0XHR0aGlzLmZvbGRfYnV0dG9uX2VsLnJlbW92ZSgpO1xuXHRcdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zZXRGb2xkQnV0dG9uU3RhdGUoKTtcblx0XHRcdH1cblx0XHRcdGlmIChyZXNpemVfaGFuZGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5hZGRfcmVzaXplX2hhbmRsZSA9IHJlc2l6ZV9oYW5kbGU7XG5cdFx0XHRcdGlmICh0aGlzLmFkZF9yZXNpemVfaGFuZGxlICYmICF0aGlzLnJlc2l6ZV9oYW5kbGVfZWwpIHtcblx0XHRcdFx0XHR0aGlzLmNyZWF0ZVJlc2l6ZUhhbmRsZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCF0aGlzLmFkZF9yZXNpemVfaGFuZGxlICYmIHRoaXMucmVzaXplX2hhbmRsZV9lbCkge1xuXHRcdFx0XHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbC5yZW1vdmUoKTtcblx0XHRcdFx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAod2lkZ2V0cy5zaXplICE9PSB1cGRhdGUuc3RhcnRTdGF0ZS5maWVsZChhbm5vdGF0aW9uR3V0dGVyTWFya2Vycykuc2l6ZSkge1xuXHRcdFx0aWYgKHdpZGdldHMuc2l6ZSA9PT0gMCkge1xuXHRcdFx0XHRpZiAodGhpcy5mb2xkX2J1dHRvbl9lbCkge1xuXHRcdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLnJlc2l6ZV9oYW5kbGVfZWwpIHtcblx0XHRcdFx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmhpZGVfb25fZW1wdHkpIHtcblx0XHRcdFx0XHR0aGlzLmRvbS5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodGhpcy5mb2xkX2J1dHRvbl9lbCkge1xuXHRcdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMucmVzaXplX2hhbmRsZV9lbCkge1xuXHRcdFx0XHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXRoaXMuZm9sZGVkKSB7XG5cdFx0XHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTk9URTogQm9vbGVhbiByZXR1cm5zIHRydWUgb25seSBpZiBtYXJrZXJzIGhhdmUgY2hhbmdlZCB3aXRoaW4gdGhlIHZpZXdwb3J0IChzbyBvdXRzaWRlIG1hcmtlcnMgZG9uJ3QgY291bnQpXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGRlc3Ryb3koKSB7XG5cdFx0dGhpcy5mb2xkX2J1dHRvbl9lbD8ucmVtb3ZlKCk7XG5cdFx0dGhpcy5yZXNpemVfaGFuZGxlX2VsPy5yZW1vdmUoKTtcblxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblx0fVxufVxuXG5jbGFzcyBBbm5vdGF0aW9uR3V0dGVyRWxlbWVudCBleHRlbmRzIEd1dHRlckVsZW1lbnQge1xuXHRjb25zdHJ1Y3Rvcihcblx0XHR2aWV3OiBFZGl0b3JWaWV3LFxuXHRcdGhlaWdodDogbnVtYmVyLFxuXHRcdGFib3ZlOiBudW1iZXIsXG5cdFx0bWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10sXG5cdFx0Ly8gSU1QT1JUQU5UOiBUaGUgYGJsb2NrYCB2YXJpYWJsZSByZXByZXNlbnRzIHRoZSBfc3RhcnRpbmdfIGxpbmUgdGhpcyBHdXR0ZXJFbGVtZW50IG1heSBiZWxvbmcgdG9cblx0XHQvL1x0XHR0aGUgYW5ub3RhdGlvbnMgX21heV8gY292ZXIgbXVsdGlwbGUgbGluZXMsIGJ1dCB0aGUgYmxvY2sgd2lsbCBPTkxZIGFjY291bnQgZm9yIHRoZSBmaXJzdCBsaW5lXG5cdFx0Ly9cdFx0SW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCBibG9jay50byBJUyBOT1QgdGhlIGVuZCBvZiB0aGUgbWFya2VyXG5cdFx0cHVibGljIGJsb2NrOiBCbG9ja0luZm8gfCBudWxsID0gbnVsbCxcblx0KSB7XG5cdFx0c3VwZXIodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29tbWVudCB1cGRhdGUgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBmb3JjaWJseSBzZXQgdGhlIGhlaWdodCBvZiB0aGUgZ3V0dGVyIGVsZW1lbnRcblx0ICovXG5cdHVwZGF0ZShcblx0XHR2aWV3OiBFZGl0b3JWaWV3LFxuXHRcdGhlaWdodDogbnVtYmVyLFxuXHRcdGFib3ZlOiBudW1iZXIsXG5cdFx0bWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10sXG5cdFx0YmxvY2s6IEJsb2NrSW5mbyB8IG51bGwgPSBudWxsLFxuXHQpIHtcblx0XHR0aGlzLmJsb2NrID0gYmxvY2s7XG5cdFx0aWYgKHRoaXMuYWJvdmUgIT0gYWJvdmUpXG5cdFx0XHR0aGlzLmRvbS5zdHlsZS5tYXJnaW5Ub3AgPSAodGhpcy5hYm92ZSA9IGFib3ZlKSA/IGFib3ZlICsgXCJweFwiIDogXCJcIjtcblx0XHRpZiAoIXNhbWVNYXJrZXJzKHRoaXMubWFya2VycywgbWFya2VycykpXG5cdFx0XHR0aGlzLnNldE1hcmtlcnModmlldywgbWFya2Vycyk7XG5cdH1cbn1cbiIsICIvKipcbiAqIFRoaXMgZmlsZSBpcyBsYXJnZWx5IGlkZW50aWNhbCB0byB0aGUgZ3V0dGVyIGRlZmluZWQgaW4gQGNvZGVtaXJyb3Ivdmlldy9ndXR0ZXJcbiAqIFRoZSBvbmx5IGNoYW5nZXMgYXJlOlxuICogICAxLiBFeHRyYWN0ZWQgY3JlYXRlR3V0dGVycy9pbnNlcnRHdXR0ZXJzL2dldFVwZGF0ZUNvbnRleHRzIG1ldGhvZHMgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlblxuICogICAyLiBBZGRlZCBjb25zdHMgd2VyZSBuZWNlc3NhcnkgYW5kIGZvcm1hdHRlZCBjb2RlXG4gKiAgIDMuIENoYW5nZWQgZGVmYXVsdCBpbnNlcnQgbG9jYXRpb24gb2YgdGhlIERPTSAodG8gYmUgc2ltaWxhciB0byBPYnNpZGlhbidzIGd1dHRlcilcbiAqICAgNC4gRXh0cmFjdGVkIGFjdGl2ZUd1dHRlcnMgYW5kIHVuZml4R3V0dGVycyBGYWNldHMgc28gbXVsdGlwbGUgaW5kZXBlbmRlbnQgZ3V0dGVycyBjYW4gYmUgZGVmaW5lZFxuICovXG5cbmltcG9ydCB7IHR5cGUgRXh0ZW5zaW9uLCBGYWNldCwgdHlwZSBSYW5nZUN1cnNvciwgUmFuZ2VTZXQgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7XG5cdEJsb2NrSW5mbyxcblx0QmxvY2tUeXBlLFxuXHREaXJlY3Rpb24sXG5cdEVkaXRvclZpZXcsXG5cdGd1dHRlckxpbmVDbGFzcyxcblx0R3V0dGVyTWFya2VyLFxuXHRWaWV3UGx1Z2luLFxuXHRWaWV3VXBkYXRlLFxuXHRXaWRnZXRUeXBlLFxufSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG4vLyBTZXQgRWRpdG9yVmlldyBjbGFzcyB0byBoYXZlIHNjYWxlWCBhbmQgc2NhbGVZIHByb3BlcnRpZXNcbi8vIFRPRE86IFJFTUlOREVSLCB1bmNvbW1lbnQgc2NhbGVYL3NjYWxlWSBmYWN0b3JzIHdoZW4gT2JzaWRpYW4gdXBkYXRlcyB0byB1cHN0cmVhbSBDb2RlTWlycm9yXG5kZWNsYXJlIG1vZHVsZSBcIkBjb2RlbWlycm9yL3ZpZXdcIiB7XG5cdGludGVyZmFjZSBFZGl0b3JWaWV3IHtcblx0XHRzY2FsZVg6IG51bWJlcjtcblx0XHRzY2FsZVk6IG51bWJlcjtcblx0fVxufVxuXG4vLyBEZWNsYXJlIHRoYXQgQmxvY2tJbmZvIGhhcyBXaWRnZXRUeXBlXG4vLyBUT0RPOiBVbmNvbW1lbnQgd2lkZ2V0IGNvZGUgd2hlbiBPYnNpZGlhbiB1cGRhdGVzIHRvIHVwc3RyZWFtIENvZGVNaXJyb3JcbmRlY2xhcmUgbW9kdWxlIFwiQGNvZGVtaXJyb3Ivdmlld1wiIHtcblx0aW50ZXJmYWNlIFdpZGdldFR5cGUge1xuXHRcdGxhbmc/OiBzdHJpbmc7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVNYXJrZXJzKGE6IHJlYWRvbmx5IEd1dHRlck1hcmtlcltdLCBiOiByZWFkb25seSBHdXR0ZXJNYXJrZXJbXSk6IGJvb2xlYW4ge1xuXHRpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblx0Ly8gQHRzLWlnbm9yZSAoY29tcGFyZSBkb2VzIGV4aXN0IG9uIG1hcmtlcilcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBpZiAoIWFbaV0uY29tcGFyZShiW2ldKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IHR5cGUgSGFuZGxlcnMgPSB7IFtldmVudDogc3RyaW5nXTogKHZpZXc6IEVkaXRvclZpZXcsIGxpbmU6IEJsb2NrSW5mbywgZXZlbnQ6IEV2ZW50KSA9PiBib29sZWFuIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3V0dGVyQ29uZmlnIHtcblx0LyoqIEFuIGV4dHJhIENTUyBjbGFzcyB0byBiZSBhZGRlZCB0byB0aGUgd3JhcHBlciAoYGNtLWd1dHRlcmApIGVsZW1lbnQuICovXG5cdGNsYXNzPzogc3RyaW5nO1xuXHQvKiogQ29udHJvbHMgd2hldGhlciBlbXB0eSBndXR0ZXIgZWxlbWVudHMgc2hvdWxkIGJlIHJlbmRlcmVkLlxuXHQgRGVmYXVsdHMgdG8gZmFsc2UuICovXG5cdHJlbmRlckVtcHR5RWxlbWVudHM/OiBib29sZWFuO1xuXHQvKiogUmV0cmlldmUgYSBzZXQgb2YgbWFya2VycyB0byB1c2UgaW4gdGhpcyBndXR0ZXIuICovXG5cdG1hcmtlcnM/OiAodmlldzogRWRpdG9yVmlldykgPT4gUmFuZ2VTZXQ8R3V0dGVyTWFya2VyPiB8IHJlYWRvbmx5IFJhbmdlU2V0PEd1dHRlck1hcmtlcj5bXTtcblx0LyoqIENhbiBiZSB1c2VkIHRvIG9wdGlvbmFsbHkgYWRkIGEgc2luZ2xlIG1hcmtlciB0byBldmVyeSBsaW5lLiAqL1xuXHRsaW5lTWFya2VyPzogKHZpZXc6IEVkaXRvclZpZXcsIGxpbmU6IEJsb2NrSW5mbywgb3RoZXJNYXJrZXJzOiByZWFkb25seSBHdXR0ZXJNYXJrZXJbXSkgPT4gR3V0dGVyTWFya2VyIHwgbnVsbDtcblx0LyoqIEFzc29jaWF0ZSBtYXJrZXJzIHdpdGggYmxvY2sgd2lkZ2V0cyBpbiB0aGUgZG9jdW1lbnQuICovXG5cdHdpZGdldE1hcmtlcj86ICh2aWV3OiBFZGl0b3JWaWV3LCB3aWRnZXQ6IFdpZGdldFR5cGUsIGJsb2NrOiBCbG9ja0luZm8pID0+IEd1dHRlck1hcmtlciB8IG51bGw7XG5cdC8qKiBJZiBsaW5lIG9yIHdpZGdldCBtYXJrZXJzIGRlcGVuZCBvbiBhZGRpdGlvbmFsIHN0YXRlLCBhbmQgc2hvdWxkXG5cdCAqIGJlIHVwZGF0ZWQgd2hlbiB0aGF0IGNoYW5nZXMsIHBhc3MgYSBwcmVkaWNhdGUgaGVyZSB0aGF0IGNoZWNrc1xuXHQgKiB3aGV0aGVyIGEgZ2l2ZW4gdmlldyB1cGRhdGUgbWlnaHQgY2hhbmdlIHRoZSBsaW5lIG1hcmtlcnMuICovXG5cdGxpbmVNYXJrZXJDaGFuZ2U/OiBudWxsIHwgKCh1cGRhdGU6IFZpZXdVcGRhdGUpID0+IGJvb2xlYW4pO1xuXHQvKiogQWRkIGEgaGlkZGVuIHNwYWNlciBlbGVtZW50IHRoYXQgZ2l2ZXMgdGhlIGd1dHRlciBpdHMgYmFzZSB3aWR0aC4gKi9cblx0aW5pdGlhbFNwYWNlcj86IG51bGwgfCAoKHZpZXc6IEVkaXRvclZpZXcpID0+IEd1dHRlck1hcmtlcik7XG5cdC8qKiBVcGRhdGUgdGhlIHNwYWNlciBlbGVtZW50IHdoZW4gdGhlIHZpZXcgaXMgdXBkYXRlZC4gKi9cblx0dXBkYXRlU3BhY2VyPzogbnVsbCB8ICgoc3BhY2VyOiBHdXR0ZXJNYXJrZXIsIHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4gR3V0dGVyTWFya2VyKTtcblx0LyoqIFN1cHBseSBldmVudCBoYW5kbGVycyBmb3IgRE9NIGV2ZW50cyBvbiB0aGlzIGd1dHRlci4gKi9cblx0ZG9tRXZlbnRIYW5kbGVycz86IEhhbmRsZXJzO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdHMgPSB7XG5cdGNsYXNzOiBcIlwiLFxuXHRyZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcblx0Ly8gZWxlbWVudFN0eWxlOiBcIlwiLFxuXHRtYXJrZXJzOiAoKSA9PiBSYW5nZVNldC5lbXB0eSxcblx0bGluZU1hcmtlcjogKCkgPT4gbnVsbCxcblx0d2lkZ2V0TWFya2VyOiAoKSA9PiBudWxsLFxuXHRsaW5lTWFya2VyQ2hhbmdlOiBudWxsLFxuXHRpbml0aWFsU3BhY2VyOiBudWxsLFxuXHR1cGRhdGVTcGFjZXI6IG51bGwsXG5cdGRvbUV2ZW50SGFuZGxlcnM6IHt9LFxufSBzYXRpc2ZpZXMgUmVxdWlyZWQ8R3V0dGVyQ29uZmlnPjtcblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGd1dHRlcihjb25maWc6IEd1dHRlckNvbmZpZyk6IEV4dGVuc2lvbiB7XG4vLyBcdHJldHVybiBbZ3V0dGVycygpLCBhY3RpdmVHdXR0ZXJzLm9mKHsgLi4uZGVmYXVsdHMsIC4uLmNvbmZpZyB9KV07XG4vLyB9XG4vL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIGd1dHRlcnMoKTogRXh0ZW5zaW9uIHtcbi8vIFx0cmV0dXJuIFtcbi8vIFx0XHRWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBHdXR0ZXJWaWV3KHZpZXcpKSxcbi8vIFx0XHRndXR0ZXJMaW5lQ2xhc3Mub2YoUmFuZ2VTZXQuZW1wdHkpLFxuLy8gXHRdO1xuLy8gfVxuXG4vKipcbiAqIEFkdmFuY2UgY3Vyc29yIHRvIHBvc2l0aW9uXG4gKiBAcGFyYW0gY3Vyc29yIC0gQ3Vyc29yIHRvIGFkdmFuY2VcbiAqIEBwYXJhbSBjb2xsZWN0IC0gQXJyYXkgdG8gY29sbGVjdCBlbmNvdW50ZXJlZCBtYXJrZXJzIGluXG4gKiBAcGFyYW0gcG9zIC0gUG9zaXRpb24gdG8gYWR2YW5jZSB0b1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWR2YW5jZUN1cnNvcihjdXJzb3I6IFJhbmdlQ3Vyc29yPEd1dHRlck1hcmtlcj4sIGNvbGxlY3Q6IEd1dHRlck1hcmtlcltdLCBwb3M6IG51bWJlcikge1xuXHR3aGlsZSAoY3Vyc29yLnZhbHVlICYmIGN1cnNvci5mcm9tIDw9IHBvcykge1xuXHRcdC8vIE5PVEU6IEV4cGVjdHMgcmFuZ2UgdG8gc3RhcnQgKnByZWNpc2VseSogYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIHNpbmNlIGFkdmFuY2VkQ3Vyc29yIGlzIGludm9rZWQgdXNpbmcgbGluZS5mcm9tXG5cdFx0Ly8gaWYgKGN1cnNvci5mcm9tID09IHBvcykgY29sbGVjdC5wdXNoKGN1cnNvci52YWx1ZSk7XG5cblx0XHQvLyBNT0RJRklDQVRJT046IEluc3RlYWQsIGFsbCBtYXJrZXJzIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFyZSBjb2xsZWN0ZWQgKHNvIG5vdCBsaW5lLWJvdW5kKVxuXHRcdGlmIChjdXJzb3IuZnJvbSA8PSBwb3MpIGNvbGxlY3QucHVzaChjdXJzb3IudmFsdWUpO1xuXHRcdGN1cnNvci5uZXh0KCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXk8VD4odmFsOiBUIHwgcmVhZG9ubHkgVFtdKSB7XG5cdHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF0pIGFzIHJlYWRvbmx5IFRbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEd1dHRlckVsZW1lbnQge1xuXHRkb206IEhUTUxFbGVtZW50O1xuXHRoZWlnaHQ6IG51bWJlciA9IC0xO1xuXHRhYm92ZTogbnVtYmVyID0gMDtcblx0bWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10gPSBbXTtcblxuXHRjb25zdHJ1Y3Rvcih2aWV3OiBFZGl0b3JWaWV3LCBoZWlnaHQ6IG51bWJlciwgYWJvdmU6IG51bWJlciwgbWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10pIHtcblx0XHR0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJFbGVtZW50XCI7XG5cdFx0dGhpcy51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG5cdH1cblxuXHR1cGRhdGUodmlldzogRWRpdG9yVmlldywgaGVpZ2h0OiBudW1iZXIsIGFib3ZlOiBudW1iZXIsIG1hcmtlcnM6IHJlYWRvbmx5IEd1dHRlck1hcmtlcltdKSB7XG5cdFx0aWYgKHRoaXMuaGVpZ2h0ICE9IGhlaWdodCkge1xuXHRcdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0XHR0aGlzLmRvbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmFib3ZlICE9IGFib3ZlKVxuXHRcdFx0dGhpcy5kb20uc3R5bGUubWFyZ2luVG9wID0gKHRoaXMuYWJvdmUgPSBhYm92ZSkgPyBhYm92ZSArIFwicHhcIiA6IFwiXCI7XG5cdFx0aWYgKCFzYW1lTWFya2Vycyh0aGlzLm1hcmtlcnMsIG1hcmtlcnMpKSB0aGlzLnNldE1hcmtlcnModmlldywgbWFya2Vycyk7XG5cdH1cblxuXHRzZXRNYXJrZXJzKHZpZXc6IEVkaXRvclZpZXcgfCBudWxsLCBtYXJrZXJzOiByZWFkb25seSBHdXR0ZXJNYXJrZXJbXSkge1xuXHRcdGxldCBjbHMgPSBcImNtLWd1dHRlckVsZW1lbnRcIiwgZG9tUG9zID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcblx0XHRmb3IgKGxldCBpTmV3ID0gMCwgaU9sZCA9IDA7Oykge1xuXHRcdFx0bGV0IHNraXBUbyA9IGlPbGQ7XG5cdFx0XHRjb25zdCBtYXJrZXIgPSBpTmV3IDwgbWFya2Vycy5sZW5ndGggPyBtYXJrZXJzW2lOZXcrK10gOiBudWxsO1xuXHRcdFx0bGV0IG1hdGNoZWQgPSBmYWxzZTtcblx0XHRcdGlmIChtYXJrZXIpIHtcblx0XHRcdFx0Y29uc3QgYyA9IG1hcmtlci5lbGVtZW50Q2xhc3M7XG5cdFx0XHRcdGlmIChjKSBjbHMgKz0gXCIgXCIgKyBjO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gaU9sZDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgKGNvbXBhcmUgZG9lcyBleGlzdCBvbiBtYXJrZXIpXG5cdFx0XHRcdFx0aWYgKHRoaXMubWFya2Vyc1tpXS5jb21wYXJlKG1hcmtlcikpIHtcblx0XHRcdFx0XHRcdHNraXBUbyA9IGk7XG5cdFx0XHRcdFx0XHRtYXRjaGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2tpcFRvID0gdGhpcy5tYXJrZXJzLmxlbmd0aDtcblx0XHRcdH1cblx0XHRcdHdoaWxlIChpT2xkIDwgc2tpcFRvKSB7XG5cdFx0XHRcdGNvbnN0IG5leHQgPSB0aGlzLm1hcmtlcnNbaU9sZCsrXTtcblx0XHRcdFx0aWYgKG5leHQudG9ET00pIHtcblx0XHRcdFx0XHRpZiAoZG9tUG9zKSB7XG5cdFx0XHRcdFx0XHQvLyBNT0RGOiBQcmV2ZW50cyB1bmxvYWRpbmcgb2YgYSBtYXJrZXIgaWYgaXQgdXNlZCBpbiBib3RoIG9sZCBhbmQgbmV3IEd1dHRlckVsZW1lbnRcblx0XHRcdFx0XHRcdC8vIEZJWE1FOiBUaGlzIGlmLWNoZWNrIHByZXZlbnRzIGEgcmUtdXNlZCBNYXJrZXIgKHNwZWNpZmljYWxseSwgYSBtYXJrZXIgdGhhdCBpcyB1c2VkXG5cdFx0XHRcdFx0XHQvLyAgXHQgXHRpbiBib3RoIGEgb2xkIF9hbmRfIGEgbmV3IEd1dHRlckVsZW1lbnQpIGZyb20gYmVpbmcgY29tcGxldGVseSByZW1vdmVkIGZyb20gdGhlIERPTVxuXHRcdFx0XHRcdFx0Ly9cdFx0ICAgIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSwgYXMgYEFubm90YXRpb25NYXJrZXJgcyBhcmUgcmV1c2VkIGFjcm9zcyBtdWx0aXBsZSBzdGF0ZSB1cGRhdGVzXG5cdFx0XHRcdFx0XHQvLyBcdFx0XHR2aWEgdGhlIGBhbm5vdGF0aW9uR3V0dGVyTWFya2Vyc2AgU3RhdGVGaWVsZC4gSWYgdGhlIHVzZXIgY2hhbmdlcyBhIGFubm90YXRpb24gaW5cblx0XHRcdFx0XHRcdC8vXHRcdFx0YSBzaW5nbGUgbGluZSAod2hpY2ggZW5jb21wYXNzZXMgYSBHdXR0ZXJFbGVtZW50KSwgYWxsIEFubm90YXRpb25NYXJrZXJzIGluIHRoaXNcblx0XHRcdFx0XHRcdC8vXHRcdFx0ZWxlbWVudCBnZXQgcmVtb3ZlZCwgYW5kIHRoZW4gcmUtYWRkZWQgdG8gdGhlIG5ldyBHdXR0ZXJFbGVtZW50LlxuXHRcdFx0XHRcdFx0Ly9cdFx0QSBtb3JlIHNhbmUgc29sdXRpb24gd291bGQgYmUgdG8gY2hhbmdlIHRoZSBTdGF0ZUZpZWxkIHRvIGNvbnN0cnVjdCBuZXcgTWFya2Vyc1xuXHRcdFx0XHRcdFx0Ly9cdFx0Zm9yIF9hbGxfIG1hcmtlcnMgaW4gYSBzaW5nbGUgbGluZSwgYnV0IHRoaXMgcmVxdWlyZXMgbXVjaCBtb3JlIGVmZm9ydC5cblx0XHRcdFx0XHRcdGlmICghKG5leHQgYXMgYW55KS5wcmV2ZW50VW5sb2FkKSB7XG5cdFx0XHRcdFx0XHRcdG5leHQuZGVzdHJveShkb21Qb3MhKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdChuZXh0IGFzIGFueSkucHJldmVudFVubG9hZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Ly8gT1JJR0lOQUw6IG5leHQuZGVzdHJveShkb21Qb3MhKVxuXHRcdFx0XHRcdFx0Y29uc3QgYWZ0ZXIgPSBkb21Qb3MubmV4dFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRkb21Qb3MucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRkb21Qb3MgPSBhZnRlcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghbWFya2VyKSBicmVhaztcblx0XHRcdGlmIChtYXJrZXIudG9ET00gJiYgdmlldykge1xuXHRcdFx0XHRpZiAobWF0Y2hlZCkgZG9tUG9zID0gZG9tUG9zIS5uZXh0U2libGluZztcblx0XHRcdFx0ZWxzZSB0aGlzLmRvbS5pbnNlcnRCZWZvcmUobWFya2VyLnRvRE9NKHZpZXcpLCBkb21Qb3MpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1hdGNoZWQpIGlPbGQrKztcblx0XHR9XG5cdFx0dGhpcy5kb20uY2xhc3NOYW1lID0gY2xzO1xuXHRcdHRoaXMubWFya2VycyA9IG1hcmtlcnM7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdHRoaXMuc2V0TWFya2VycyhudWxsLCBbXSk7IC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgdXNlZCBleGNlcHQgZm9yIGNyZWF0aW5nIG1hcmtlcnNcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlQ29udGV4dCB7XG5cdGN1cnNvcjogUmFuZ2VDdXJzb3I8R3V0dGVyTWFya2VyPjtcblx0aSA9IDA7XG5cblx0Y29uc3RydWN0b3IocmVhZG9ubHkgZ3V0dGVyOiBTaW5nbGVHdXR0ZXJWaWV3LCB2aWV3cG9ydDogeyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSwgcHVibGljIGhlaWdodDogbnVtYmVyKSB7XG5cdFx0dGhpcy5jdXJzb3IgPSBSYW5nZVNldC5pdGVyKGd1dHRlci5tYXJrZXJzLCB2aWV3cG9ydC5mcm9tKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgbWFya2VycyB0byBibG9ja1xuXHQgKiBAcGFyYW0gdmlldyAtIEN1cnJlbnQgRWRpdG9yVmlld1xuXHQgKiBAcGFyYW0gYmxvY2sgLSBJbmZvIG9mIGJsb2NrIHRvIHdoaWNoIG1hcmtlcnMgc2hvdWxkIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBtYXJrZXJzIC0gTWFya2VycyB0byBhZGRcblx0ICovXG5cdGFkZEVsZW1lbnQodmlldzogRWRpdG9yVmlldywgYmxvY2s6IEJsb2NrSW5mbywgbWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10pIHtcblx0XHRjb25zdCB7IGd1dHRlciB9ID0gdGhpcztcblx0XHRjb25zdCBhYm92ZSA9IGJsb2NrLnRvcCAtIHRoaXMuaGVpZ2h0IC8qKiAvIHZpZXcuc2NhbGVZICovO1xuXHRcdGNvbnN0IGhlaWdodCA9IGJsb2NrLmhlaWdodCAvKiogLyB2aWV3LnNjYWxlWSAqLztcblx0XHRpZiAodGhpcy5pID09IGd1dHRlci5lbGVtZW50cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IG5ld0VsdCA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuXHRcdFx0Z3V0dGVyLmVsZW1lbnRzLnB1c2gobmV3RWx0KTtcblx0XHRcdGd1dHRlci5kb20uYXBwZW5kQ2hpbGQobmV3RWx0LmRvbSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGd1dHRlci5lbGVtZW50c1t0aGlzLmldLnVwZGF0ZSh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKTtcblx0XHR9XG5cdFx0dGhpcy5oZWlnaHQgPSBibG9jay5ib3R0b207XG5cdFx0dGhpcy5pKys7XG5cdH1cblxuXHRsaW5lKHZpZXc6IEVkaXRvclZpZXcsIGxpbmU6IEJsb2NrSW5mbywgZXh0cmFNYXJrZXJzOiByZWFkb25seSBHdXR0ZXJNYXJrZXJbXSkge1xuXHRcdGxldCBsb2NhbE1hcmtlcnM6IEd1dHRlck1hcmtlcltdID0gW107XG5cblx0XHQvLyBhZHZhbmNlQ3Vyc29yIHdpbGwgcGxhY2UgYWxsIEd1dHRlck1hcmtlcnMgYmV0d2VlbiB0aGUgbGFzdCB0aGlzLmN1cnNvciBwb3NpdGlvbiBhbmQgbGluZS5mcm9tIGludG8gbG9jYWxNYXJrZXJzXG5cblx0XHQvLyBXaWRnZXRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzYW1lICd2aWV3cG9ydCcgYmxvY2sgYXMgdGhlIGRvY3VtZW50IGxpbmUgYmxvY2sgd2lsbCBiZSBza2lwcGVkXG5cdFx0Ly8gU2VlIGFubm90YXRpb24tZ3V0dGVyLnRzIGZvciBhIG1vcmUgZWxvcXVlbnQsIGFuYWx5dGljYWwgYW5kIGluLWRlcHRoIGV4cGxhbmF0aW9uXG5cdFx0Ly8gTU9ESUZJQ0FUSU9OOiBNYXJrZXJzIGFyZSBjb2xsZWN0ZWQgdXAgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmxvY2tcblx0XHRhZHZhbmNlQ3Vyc29yKHRoaXMuY3Vyc29yLCBsb2NhbE1hcmtlcnMsIGxpbmUudG8pO1xuXG5cdFx0Ly8gTU9ESUZJQ0FUSU9OOiBEaXNhYmxlZCBhZGRpbmcgZXh0cmFNYXJrZXJzLCB0aGlzIHBhcnRpY3VsYXJseSBicmVha3Mgd2hlbiB1c2luZyB0aGUgbGluZS1udW1iZXJzIGd1dHRlclxuXHRcdC8vIFRPRE86IFZlcmlmeSB3aGV0aGVyIGhhdmluZyBjbS1hY3RpdmUgaXMgZGVzaXJhYmxlIChhbmQgdG8gdXNlIGl0IHdpdGhvdXQgY2F1c2luZyBpc3N1ZXMgZm9yIHRoZSBndXR0ZXJzKVxuXHRcdC8vIGlmIChleHRyYU1hcmtlcnMubGVuZ3RoKSBsb2NhbE1hcmtlcnMgPSBsb2NhbE1hcmtlcnMuY29uY2F0KGV4dHJhTWFya2Vycyk7XG5cblx0XHQvLyBPbmx5IGhhcHBlbnMgd2hlbiB3ZSBzZXQgbGluZU1hcmtlciBpbiBjb25maWdcblx0XHRjb25zdCBmb3JMaW5lID0gdGhpcy5ndXR0ZXIuY29uZmlnLmxpbmVNYXJrZXIodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcblx0XHRpZiAoZm9yTGluZSkgbG9jYWxNYXJrZXJzLnVuc2hpZnQoZm9yTGluZSk7XG5cblx0XHRjb25zdCBndXR0ZXIgPSB0aGlzLmd1dHRlcjtcblx0XHRpZiAobG9jYWxNYXJrZXJzLmxlbmd0aCA9PSAwICYmICFndXR0ZXIuY29uZmlnLnJlbmRlckVtcHR5RWxlbWVudHMpIHJldHVybjtcblx0XHR0aGlzLmFkZEVsZW1lbnQodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcblx0fVxuXG5cdHdpZGdldCh2aWV3OiBFZGl0b3JWaWV3LCBibG9jazogQmxvY2tJbmZvKSB7XG5cdFx0Ly8gQHRzLWlnbm9yZSAoQmxvY2sgY29udGFpbnMgd2lkZ2V0KVxuXHRcdGNvbnN0IG1hcmtlciA9IHRoaXMuZ3V0dGVyLmNvbmZpZy53aWRnZXRNYXJrZXIodmlldywgYmxvY2sud2lkZ2V0ISwgYmxvY2spO1xuXHRcdGlmIChtYXJrZXIpIHRoaXMuYWRkRWxlbWVudCh2aWV3LCBibG9jaywgW21hcmtlcl0pO1xuXHR9XG5cblx0ZmluaXNoKCkge1xuXHRcdGNvbnN0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuXHRcdC8vIFJlbW92ZXMgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHZpZXdwb3J0IChmcm9tIHRoZSBib3R0b20sIG9uIHNjcm9sbC11cClcblx0XHR3aGlsZSAoZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCA+IHRoaXMuaSkge1xuXHRcdFx0Y29uc3QgbGFzdCA9IGd1dHRlci5lbGVtZW50cy5wb3AoKSE7XG5cdFx0XHRndXR0ZXIuZG9tLnJlbW92ZUNoaWxkKGxhc3QuZG9tKTtcblx0XHRcdGxhc3QuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFx0VGhpcyBjbGFzcyBpcyBqdXN0IGEgY29uc3RydWN0b3IvY29udGFpbmVyIG9mIHRoZSBndXR0ZXJFbGVtZW50cywgYWxsIHRoZSB1cGRhdGVzXG4gKiBcdG9jY3VyIGluIFVwZGF0ZUNvbnRleHQgaW5zdGVhZFxuICpcbiAqIFx0TWFuYWdlczpcbiAqIFx0IC0gTWFya2VyIGNyZWF0aW9uIHVzaW5nIGN1cnJlbnQgdmlld1xuICogXHQgLSBDaGVja2luZyB3aGV0aGVyIHVwZGF0ZSBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdmlld3BvcnQgY2hhbmdlXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVHdXR0ZXJWaWV3IHtcblx0ZG9tOiBIVE1MRWxlbWVudDtcblx0ZWxlbWVudHM6IEd1dHRlckVsZW1lbnRbXSA9IFtdO1xuXHRtYXJrZXJzOiByZWFkb25seSBSYW5nZVNldDxHdXR0ZXJNYXJrZXI+W107XG5cdHNwYWNlcjogR3V0dGVyRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3OiBFZGl0b3JWaWV3LCBwdWJsaWMgY29uZmlnOiBSZXF1aXJlZDxHdXR0ZXJDb25maWc+KSB7XG5cdFx0Ly8gSW5pdGlhbGlzZWQgZG9tIGZvciB0aGUgZ3V0dGVyXG5cdFx0dGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tZ3V0dGVyXCIgKyAodGhpcy5jb25maWcuY2xhc3MgPyBcIiBcIiArIHRoaXMuY29uZmlnLmNsYXNzIDogXCJcIik7XG5cdFx0Zm9yIChjb25zdCBwcm9wIGluIGNvbmZpZy5kb21FdmVudEhhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKHByb3AsIChldmVudDogRXZlbnQpID0+IHtcblx0XHRcdFx0bGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgeTtcblx0XHRcdFx0aWYgKHRhcmdldCAhPSB0aGlzLmRvbSAmJiB0aGlzLmRvbS5jb250YWlucyh0YXJnZXQpKSB7XG5cdFx0XHRcdFx0d2hpbGUgKHRhcmdldC5wYXJlbnROb2RlICE9IHRoaXMuZG9tKSB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcblx0XHRcdFx0XHRjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdHkgPSAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHkgPSAoZXZlbnQgYXMgTW91c2VFdmVudCkuY2xpZW50WTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBsaW5lID0gdmlldy5saW5lQmxvY2tBdEhlaWdodCh5IC0gdmlldy5kb2N1bWVudFRvcCk7XG5cdFx0XHRcdGlmIChjb25maWcuZG9tRXZlbnRIYW5kbGVyc1twcm9wXSh2aWV3LCBsaW5lLCBldmVudCkpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBDb25zdHJ1Y3RzIG1hcmtlcnMgYXMgcmFuZ2VTZXRcblx0XHR0aGlzLm1hcmtlcnMgPSBhc0FycmF5KGNvbmZpZy5tYXJrZXJzKHZpZXcpKTtcblx0XHRpZiAoY29uZmlnLmluaXRpYWxTcGFjZXIpIHtcblx0XHRcdHRoaXMuc3BhY2VyID0gbmV3IEd1dHRlckVsZW1lbnQodmlldywgMCwgMCwgW2NvbmZpZy5pbml0aWFsU3BhY2VyKHZpZXcpXSk7XG5cdFx0XHR0aGlzLmRvbS5hcHBlbmRDaGlsZCh0aGlzLnNwYWNlci5kb20pO1xuXHRcdFx0dGhpcy5zcGFjZXIuZG9tLnN0eWxlLmNzc1RleHQgKz0gXCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvaW50ZXItZXZlbnRzOiBub25lXCI7XG5cdFx0fVxuXHR9XG5cblx0dXBkYXRlKHVwZGF0ZTogVmlld1VwZGF0ZSkge1xuXHRcdGNvbnN0IHByZXZNYXJrZXJzID0gdGhpcy5tYXJrZXJzO1xuXHRcdHRoaXMubWFya2VycyA9IGFzQXJyYXkodGhpcy5jb25maWcubWFya2Vycyh1cGRhdGUudmlldykpO1xuXHRcdGlmICh0aGlzLnNwYWNlciAmJiB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIpIHtcblx0XHRcdGNvbnN0IHVwZGF0ZWQgPSB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIodGhpcy5zcGFjZXIubWFya2Vyc1swXSwgdXBkYXRlKTtcblx0XHRcdGlmICh1cGRhdGVkICE9IHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0pIHRoaXMuc3BhY2VyLnVwZGF0ZSh1cGRhdGUudmlldywgMCwgMCwgW3VwZGF0ZWRdKTtcblx0XHR9XG5cdFx0Y29uc3QgdnAgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcblx0XHRyZXR1cm4gIVJhbmdlU2V0LmVxKHRoaXMubWFya2VycywgcHJldk1hcmtlcnMsIHZwLmZyb20sIHZwLnRvKSB8fFxuXHRcdFx0KHRoaXMuY29uZmlnLmxpbmVNYXJrZXJDaGFuZ2UgPyB0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlKHVwZGF0ZSkgOiBmYWxzZSk7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdGZvciAoY29uc3QgZWx0IG9mIHRoaXMuZWxlbWVudHMpIGVsdC5kZXN0cm95KCk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIEd1dHRlclZpZXcge1xuXHRndXR0ZXJzOiBTaW5nbGVHdXR0ZXJWaWV3W107XG5cdGRvbTogSFRNTEVsZW1lbnQ7XG5cdGZpeGVkOiBib29sZWFuO1xuXHRwcmV2Vmlld3BvcnQ6IHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH07XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cmVhZG9ubHkgdmlldzogRWRpdG9yVmlldyxcblx0XHRwdWJsaWMgdW5maXhHdXR0ZXJzOiBGYWNldDxib29sZWFuLCBib29sZWFuPixcblx0XHRwdWJsaWMgYWN0aXZlR3V0dGVyczogRmFjZXQ8UmVxdWlyZWQ8R3V0dGVyQ29uZmlnPj4sXG5cdCkge1xuXHRcdHRoaXMucHJldlZpZXdwb3J0ID0gdmlldy52aWV3cG9ydDtcblx0XHR0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJzXCI7XG5cdFx0Ly8gVE9ETzogQ2hlY2sgaWYgdGhlcmUgaXMgYSB3YXkgdG8gcmVzcGVjdCB0aGlzIGF0dHJpYnV0ZVxuXHRcdC8vIE1PRElGSUNBVElPTjogUmVtb3ZlZCBhcmlhLWhpZGRlbiBhdHRyaWJ1dGUsIHNpbmNlIGFubm90YXRpb25zIGNhbiBjbGFpbSBmb2N1cyAob24gdGhlaXIgaW5wdXRzKVxuXHRcdC8vIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcblx0XHR0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSAodGhpcy52aWV3LmNvbnRlbnRIZWlnaHQgLyoqIC8gdGhpcy52aWV3LnNjYWxlWSovKSArIFwicHhcIjtcblx0XHR0aGlzLmd1dHRlcnMgPSB0aGlzLmNyZWF0ZUd1dHRlcnModmlldyk7XG5cdFx0Zm9yIChjb25zdCBndXR0ZXIgb2YgdGhpcy5ndXR0ZXJzKSB0aGlzLmRvbS5hcHBlbmRDaGlsZChndXR0ZXIuZG9tKTtcblx0XHR0aGlzLmZpeGVkID0gIXZpZXcuc3RhdGUuZmFjZXQodGhpcy51bmZpeEd1dHRlcnMpO1xuXHRcdGlmICh0aGlzLmZpeGVkKSB7XG5cdFx0XHQvLyBGSVhNRSBJRTExIGZhbGxiYWNrLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgcG9zaXRpb246IHN0aWNreSxcblx0XHRcdC8vIFx0YnkgdXNpbmcgcG9zaXRpb246IHJlbGF0aXZlICsgZXZlbnQgaGFuZGxlcnMgdGhhdCByZWFsaWduIHRoZVxuXHRcdFx0Ly8gXHRndXR0ZXIgKG9yIGp1c3QgZm9yY2UgZml4ZWQ9ZmFsc2Ugb24gSUUxMT8pXG5cdFx0XHR0aGlzLmRvbS5zdHlsZS5wb3NpdGlvbiA9IFwic3RpY2t5XCI7XG5cdFx0fVxuXHRcdHRoaXMuc3luY0d1dHRlcnMoZmFsc2UpO1xuXHRcdHRoaXMuaW5zZXJ0R3V0dGVycyh2aWV3KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNT0RJRklDQVRJT046IEV4dHJhY3RlZCBndXR0ZXJzIGNyZWF0aW9uIHNvIGl0IGNhbiBiZSBvdmVycmlkZGVuXG5cdCAqL1xuXHRjcmVhdGVHdXR0ZXJzKHZpZXc6IEVkaXRvclZpZXcpIHtcblx0XHRyZXR1cm4gdmlldy5zdGF0ZS5mYWNldCh0aGlzLmFjdGl2ZUd1dHRlcnMpLm1hcChjb25mID0+IG5ldyBTaW5nbGVHdXR0ZXJWaWV3KHZpZXcsIGNvbmYpKTtcblx0fVxuXG5cdC8vIFx0XHRjb25zdCBhZnRlciA9IHRoaXMuZG9tLm5leHRTaWJsaW5nO1xuXHQvLyBcdFx0XHRhZnRlciEucGFyZW50Tm9kZSEuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCBhZnRlcik7XG5cblx0LyoqXG5cdCAqIE1PRElGSUNBVElPTjogRXh0cmFjdGVkIGluc2VydCBtZXRob2Qgc28gaXQgY2FuIGJlIG92ZXJyaWRkZW5cblx0ICovXG5cdGluc2VydEd1dHRlcnModmlldzogRWRpdG9yVmlldykge1xuXHRcdHZpZXcuY29udGVudERPTS5wYXJlbnROb2RlIS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHZpZXcuY29udGVudERPTSk7XG5cdH1cblxuXHRpbnNlcnREZXRhY2hlZEd1dHRlcnMoYWZ0ZXI6IEhUTUxFbGVtZW50KSB7XG5cdFx0YWZ0ZXIhLnBhcmVudE5vZGUhLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgYWZ0ZXIpO1xuXHR9XG5cblx0Z2V0VXBkYXRlQ29udGV4dHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ3V0dGVycy5tYXAoZ3V0dGVyID0+XG5cdFx0XHRuZXcgVXBkYXRlQ29udGV4dChndXR0ZXIsIHRoaXMudmlldy52aWV3cG9ydCwgLXRoaXMudmlldy5kb2N1bWVudFBhZGRpbmcudG9wKVxuXHRcdCk7XG5cdH1cblxuXHR1cGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlKSB7XG5cdFx0Ly8gdXBkYXRlR3V0dGVycyBleGVjdXRlcyB0aGUgdmlld1VwZGF0ZSBvbiB0aGUgYWN0aXZlIGd1dHRlcnNcblx0XHRpZiAodGhpcy51cGRhdGVHdXR0ZXJzKHVwZGF0ZSkpIHtcblx0XHRcdC8vIElmIChhbmQgb25seSBpZikgdGhlIGd1dHRlcnMgaGF2ZSBjaGFuZ2VkIGluIGEgbWVhbmluZ2Z1bCB3YXkgLS0gaS5lLiBtYXJrZXJzIGdvdCByZW1vdmVkL2FkZGVkIHdpdGhpbiBTaW5nbGVHdXR0ZXJWaWV3XG5cdFx0XHQvLyBUaGVuIG5lZWQgdG8gcmVyZW5kZXIgdGhlc2UgcG9zaXRpb25zXG5cblx0XHRcdC8qKiBEZXRhY2ggZHVyaW5nIHN5bmMgd2hlbiB0aGUgdmlld3BvcnQgY2hhbmdlZCBzaWduaWZpY2FudGx5XG5cdFx0XHQgKiBcdChzdWNoIGFzIGR1cmluZyBzY3JvbGxpbmcpLCBzaW5jZSBmb3IgbGFyZ2UgdXBkYXRlcyB0aGF0IGlzIGZhc3Rlci5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgdnBBID0gdGhpcy5wcmV2Vmlld3BvcnQsIHZwQiA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuXHRcdFx0Y29uc3QgdnBPdmVybGFwID0gTWF0aC5taW4odnBBLnRvLCB2cEIudG8pIC0gTWF0aC5tYXgodnBBLmZyb20sIHZwQi5mcm9tKTtcblx0XHRcdHRoaXMuc3luY0d1dHRlcnModnBPdmVybGFwIDwgKHZwQi50byAtIHZwQi5mcm9tKSAqIDAuOCk7XG5cdFx0fVxuXHRcdGlmICh1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkKSB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLnZpZXcuY29udGVudEhlaWdodCArIFwicHhcIjtcblx0XHRpZiAodGhpcy52aWV3LnN0YXRlLmZhY2V0KHRoaXMudW5maXhHdXR0ZXJzKSAhPSAhdGhpcy5maXhlZCkge1xuXHRcdFx0dGhpcy5maXhlZCA9ICF0aGlzLmZpeGVkO1xuXHRcdFx0dGhpcy5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLmZpeGVkID8gXCJzdGlja3lcIiA6IFwiXCI7XG5cdFx0fVxuXHRcdHRoaXMucHJldlZpZXdwb3J0ID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG5cdH1cblxuXHRzeW5jR3V0dGVycyhkZXRhY2g6IGJvb2xlYW4pIHtcblx0XHQvLyBEZXRhY2ggaXMgYWxtb3N0IGFsd2F5cyB0cnVlIGV4Y2VwdCBmb3IgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgZnVuY3Rpb24gKD8pXG5cblx0XHQvLyBhZnRlciBpcyBhIGhpZGRlbiBlbGVtZW50IEFGVEVSIHRoZSBndXR0ZXIgY29udGFpbmluZyBub3RoaW5nXG5cdFx0Ly8gTm90IHN1cmUgd2hhdCB0aGUgdXNhZ2UgaXNcblx0XHRjb25zdCBhZnRlciA9IHRoaXMuZG9tLm5leHRTaWJsaW5nO1xuXG5cdFx0Ly8gQWx3YXlzIGRldGFjaCAtPiBBbHdheXMgZnVsbHkgcmVyZW5kZXIgYWxsIFNpbmdsZUd1dHRlclZpZXdzIGFuZCAnYmlnJyBndXR0ZXJcblx0XHRpZiAoZGV0YWNoKSB0aGlzLmRvbS5yZW1vdmUoKTtcblxuXHRcdGNvbnN0IGxpbmVDbGFzc2VzID0gUmFuZ2VTZXQuaXRlcih0aGlzLnZpZXcuc3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdGhpcy52aWV3LnZpZXdwb3J0LmZyb20pO1xuXHRcdGxldCBjbGFzc1NldDogR3V0dGVyTWFya2VyW10gPSBbXTtcblxuXHRcdC8vIFByZXBhcmVzIGNvbnRleHQgZm9yIGVhY2ggZ3V0dGVyICh3aXRoIGluZGl2aWR1YWwgY3Vyc29yLCBoZWlnaHQgYW5kIC4uLilcblx0XHRjb25zdCBjb250ZXh0cyA9IHRoaXMuZ2V0VXBkYXRlQ29udGV4dHMoKTtcblxuXHRcdC8vIExvb3Agb3ZlciBhbGwgYmxvY2tzIChsaW5lcykgaW4gdGhlIHZpZXdwb3J0XG5cdFx0Zm9yIChjb25zdCBsaW5lIG9mIHRoaXMudmlldy52aWV3cG9ydExpbmVCbG9ja3MpIHtcblx0XHRcdGlmIChjbGFzc1NldC5sZW5ndGgpIGNsYXNzU2V0ID0gW107XG5cblx0XHRcdC8vID8/PyBJZiBsaW5lIGNvbnNpc3RzIG9mIG11bHRpcGxlIGJsb2NrcywgZG9lcyBub3QgaGFwcGVuXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShsaW5lLnR5cGUpKSB7XG5cdFx0XHRcdGxldCBmaXJzdCA9IHRydWU7XG5cdFx0XHRcdGZvciAoY29uc3QgYiBvZiBsaW5lLnR5cGUpIHtcblx0XHRcdFx0XHRpZiAoYi50eXBlID09IEJsb2NrVHlwZS5UZXh0ICYmIGZpcnN0KSB7XG5cdFx0XHRcdFx0XHRhZHZhbmNlQ3Vyc29yKGxpbmVDbGFzc2VzLCBjbGFzc1NldCwgYi5mcm9tKTtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgY3ggb2YgY29udGV4dHMpXG5cdFx0XHRcdFx0XHRcdGN4LmxpbmUodGhpcy52aWV3LCBiLCBjbGFzc1NldCk7XG5cdFx0XHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYi53aWRnZXQpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgY3ggb2YgY29udGV4dHMpXG5cdFx0XHRcdFx0XHRcdGN4LndpZGdldCh0aGlzLnZpZXcsIGIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSAvLyBJZiBibG9jayBjb25zaXN0cyBvZiB0ZXh0XG5cdFx0XHRlbHNlIGlmIChsaW5lLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpIHtcblx0XHRcdFx0YWR2YW5jZUN1cnNvcihsaW5lQ2xhc3NlcywgY2xhc3NTZXQsIGxpbmUuZnJvbSk7XG5cdFx0XHRcdGZvciAoY29uc3QgY3ggb2YgY29udGV4dHMpXG5cdFx0XHRcdFx0Y3gubGluZSh0aGlzLnZpZXcsIGxpbmUsIGNsYXNzU2V0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZWxzZSBpZiAobGluZS53aWRnZXQpIHtcblx0XHRcdC8vIFx0Zm9yIChjb25zdCBjeCBvZiBjb250ZXh0cylcblx0XHRcdC8vIFx0XHRjeC53aWRnZXQodGhpcy52aWV3LCBsaW5lKTtcblx0XHRcdC8vIH1cblx0XHR9XG5cblx0XHQvLyA/Pz9cblx0XHRmb3IgKGNvbnN0IGN4IG9mIGNvbnRleHRzKVxuXHRcdFx0Y3guZmluaXNoKCk7XG5cblx0XHQvLyBSZS1pbnNlcnQgdGhlIERPTSBndXR0ZXJcblx0XHRpZiAoZGV0YWNoKVxuXHRcdFx0dGhpcy5pbnNlcnREZXRhY2hlZEd1dHRlcnMoYWZ0ZXIgYXMgSFRNTEVsZW1lbnQpO1xuXHR9XG5cblx0dXBkYXRlR3V0dGVycyh1cGRhdGU6IFZpZXdVcGRhdGUpIHtcblx0XHRjb25zdCBwcmV2ID0gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQodGhpcy5hY3RpdmVHdXR0ZXJzKTtcblx0XHRjb25zdCBjdXIgPSB1cGRhdGUuc3RhdGUuZmFjZXQodGhpcy5hY3RpdmVHdXR0ZXJzKTtcblx0XHRsZXQgY2hhbmdlID0gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLmhlaWdodENoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fFxuXHRcdFx0IVJhbmdlU2V0LmVxKFxuXHRcdFx0XHR1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLFxuXHRcdFx0XHR1cGRhdGUuc3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSxcblx0XHRcdFx0dXBkYXRlLnZpZXcudmlld3BvcnQuZnJvbSxcblx0XHRcdFx0dXBkYXRlLnZpZXcudmlld3BvcnQudG8sXG5cdFx0XHQpO1xuXHRcdGlmIChwcmV2ID09IGN1cikge1xuXHRcdFx0Ly8gVXBkYXRlcyBhbGwgZ3V0dGVycywgcmVzdWx0cyBpbiBzeW5jR3V0dGVycyBpZiBjaGFuZ2UgPT09IFRydWVcblx0XHRcdGZvciAoY29uc3QgZ3V0dGVyIG9mIHRoaXMuZ3V0dGVycykge1xuXHRcdFx0XHRpZiAoZ3V0dGVyLnVwZGF0ZSh1cGRhdGUpKVxuXHRcdFx0XHRcdGNoYW5nZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRoaXMgY29kZSBvbmx5IGV4ZWN1dGVzIG9uIGd1dHRlciBiZWluZyBhZGRlZCBvciByZW1vdmVkIChzcGVjaWZpY2FsbHk6IHN3aXRjaGluZyBzb3VyY2UvTFAgbW9kZT8pXG5cdFx0XHRjaGFuZ2UgPSB0cnVlO1xuXHRcdFx0Y29uc3QgZ3V0dGVycyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBjb25mIG9mIGN1cikge1xuXHRcdFx0XHRjb25zdCBrbm93biA9IHByZXYuaW5kZXhPZihjb25mKTtcblx0XHRcdFx0aWYgKGtub3duIDwgMClcblx0XHRcdFx0XHRndXR0ZXJzLnB1c2gobmV3IFNpbmdsZUd1dHRlclZpZXcodGhpcy52aWV3LCBjb25mKSk7XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZ3V0dGVyc1trbm93bl0udXBkYXRlKHVwZGF0ZSk7XG5cdFx0XHRcdFx0Z3V0dGVycy5wdXNoKHRoaXMuZ3V0dGVyc1trbm93bl0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IGcgb2YgdGhpcy5ndXR0ZXJzKSB7XG5cdFx0XHRcdGcuZG9tLnJlbW92ZSgpO1xuXHRcdFx0XHRpZiAoZ3V0dGVycy5pbmRleE9mKGcpIDwgMClcblx0XHRcdFx0XHRnLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3QgZyBvZiBndXR0ZXJzKVxuXHRcdFx0XHR0aGlzLmRvbS5hcHBlbmRDaGlsZChnLmRvbSk7XG5cdFx0XHR0aGlzLmd1dHRlcnMgPSBndXR0ZXJzO1xuXHRcdH1cblx0XHRyZXR1cm4gY2hhbmdlO1xuXHR9XG5cblx0ZGVzdHJveSgpIHtcblx0XHRmb3IgKGNvbnN0IHZpZXcgb2YgdGhpcy5ndXR0ZXJzKSB2aWV3LmRlc3Ryb3koKTtcblx0XHR0aGlzLmRvbS5yZW1vdmUoKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3V0dGVyVmlld1BsdWdpbjxUIGV4dGVuZHMgR3V0dGVyVmlldz4oY2xzOiB7IG5ldyh2aWV3OiBFZGl0b3JWaWV3KTogVCB9KSB7XG5cdHJldHVybiBWaWV3UGx1Z2luLmZyb21DbGFzcyhjbHMsIHtcblx0XHRwcm92aWRlOiBwbHVnaW4gPT5cblx0XHRcdEVkaXRvclZpZXcuc2Nyb2xsTWFyZ2lucy5vZih2aWV3ID0+IHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuXHRcdFx0XHRpZiAoIXZhbHVlIHx8IHZhbHVlLmd1dHRlcnMubGVuZ3RoID09IDAgfHwgIXZhbHVlLmZpeGVkKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0cmV0dXJuIHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSID9cblx0XHRcdFx0XHR7IGxlZnQ6IHZhbHVlLmRvbS5vZmZzZXRXaWR0aCAvKiogKiB2aWV3LnNjYWxlWCovIH0gOlxuXHRcdFx0XHRcdHsgcmlnaHQ6IHZhbHVlLmRvbS5vZmZzZXRXaWR0aCAvKiogKiB2aWV3LnNjYWxlWCovIH07XG5cdFx0XHR9KSxcblx0fSk7XG59XG5cbi8qKiBUaGUgZ3V0dGVyLWRyYXdpbmcgcGx1Z2luIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHlvdSBhZGQgYVxuIGd1dHRlciwgYnV0IHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZXhwbGljaXRseSBjb25maWd1cmUgaXQuXG5cbiBVbmxlc3MgYGZpeGVkYCBpcyBleHBsaWNpdGx5IHNldCB0byBgZmFsc2VgLCB0aGUgZ3V0dGVycyBhcmVcbiBmaXhlZCwgbWVhbmluZyB0aGV5IGRvbid0IHNjcm9sbCBhbG9uZyB3aXRoIHRoZSBjb250ZW50XG4gaG9yaXpvbnRhbGx5IChleGNlcHQgb24gSW50ZXJuZXQgRXhwbG9yZXIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydFxuIENTUyBbYHBvc2l0aW9uOlxuIHN0aWNreWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9wb3NpdGlvbiNzdGlja3kpKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUd1dHRlckV4dGVuc2lvbihcblx0dmlld3BsdWdpbjogVmlld1BsdWdpbjxHdXR0ZXJWaWV3Pixcblx0Y29uZmlnPzogeyBmaXhlZD86IGJvb2xlYW4gfSxcblx0dW5maXhHdXR0ZXJzPzogRmFjZXQ8Ym9vbGVhbiwgYm9vbGVhbj4sXG4pIHtcblx0Y29uc3QgcmVzdWx0OiBFeHRlbnNpb25bXSA9IFtcblx0XHR2aWV3cGx1Z2luLFxuXHRdO1xuXHRpZiAoY29uZmlnICYmIGNvbmZpZy5maXhlZCA9PT0gZmFsc2UpIHJlc3VsdC5wdXNoKHVuZml4R3V0dGVycyEub2YodHJ1ZSkpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogRGVmaW5lIGFuIGVkaXRvciBndXR0ZXIuIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZ3V0dGVycyBhcHBlYXIgaXNcbiBkZXRlcm1pbmVkIGJ5IHRoZWlyIGV4dGVuc2lvbiBwcmlvcml0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUd1dHRlcihcblx0dmlld3BsdWdpbjogVmlld1BsdWdpbjxHdXR0ZXJWaWV3Pixcblx0Y29uZmlnOiBHdXR0ZXJDb25maWcsXG5cdGFjdGl2ZUd1dHRlcnM6IEZhY2V0PFJlcXVpcmVkPEd1dHRlckNvbmZpZz4+LFxuXHR1bmZpeEd1dHRlcnM6IEZhY2V0PGJvb2xlYW4sIGJvb2xlYW4+LFxuKSB7XG5cdHJldHVybiBbY3JlYXRlR3V0dGVyRXh0ZW5zaW9uKHZpZXdwbHVnaW4sIHt9LCB1bmZpeEd1dHRlcnMpLCBhY3RpdmVHdXR0ZXJzLm9mKHsgLi4uZGVmYXVsdHMsIC4uLmNvbmZpZyB9KV07XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBFZGl0b3JTdGF0ZSwgUmFuZ2UsIFJhbmdlU2V0LCBTdGF0ZUZpZWxkIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBFZGl0b3JWaWV3LCBHdXR0ZXJNYXJrZXIgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIGVkaXRvckVkaXRvckZpZWxkLCBlZGl0b3JJbmZvRmllbGQsIE1hcmtkb3duUmVuZGVyZXIsIE1lbnUsIE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgeyBFbWJlZGRhYmxlTWFya2Rvd25FZGl0b3IgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdWkvZW1iZWRkYWJsZS1lZGl0b3JcIjtcblxuaW1wb3J0IHsgYWNjZXB0U3VnZ2VzdGlvbnMsIGFkZENvbW1lbnRUb1ZpZXcsIENyaXRpY01hcmt1cFJhbmdlLCByYW5nZVBhcnNlciwgcmVqZWN0U3VnZ2VzdGlvbnMsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uLy4uLy4uL2Jhc2VcIjtcbmltcG9ydCB7IGNyZWF0ZV9yYW5nZSB9IGZyb20gXCIuLi8uLi8uLi9iYXNlL2VkaXQtdXRpbC9yYW5nZS1jcmVhdGVcIjtcblxuaW1wb3J0IHsgQW5ub3RhdGlvbkluY2x1c2lvblR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlcywgYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkd1dHRlckZvY3VzVGhyZWFkQW5ub3RhdGlvbiwgYW5ub3RhdGlvbkd1dHRlckZvbGRBbm5vdGF0aW9uIH0gZnJvbSBcIi4vYW5ub3RhdGlvbi1ndXR0ZXJcIjtcblxuaW1wb3J0IHsgc3RpY2t5Q29udGV4dE1lbnVQYXRjaCB9IGZyb20gXCIuLi8uLi8uLi8uLi9wYXRjaGVzXCI7XG5cbmNsYXNzIEFubm90YXRpb25Ob2RlIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0dGV4dDogc3RyaW5nO1xuXHRuZXdfdGV4dDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdGFubm90YXRpb25fY29udGFpbmVyOiBIVE1MRWxlbWVudDtcblx0bWV0YWRhdGFfdmlldzogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblx0YW5ub3RhdGlvbl92aWV3OiBIVE1MRWxlbWVudDtcblxuXHRjdXJyZW50TW9kZTogXCJwcmV2aWV3XCIgfCBcInNvdXJjZVwiIHwgbnVsbCA9IG51bGw7XG5cdGVkaXRNb2RlOiBFbWJlZGRhYmxlTWFya2Rvd25FZGl0b3IgfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLCBwdWJsaWMgbWFya2VyOiBBbm5vdGF0aW9uTWFya2VyKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudGV4dCA9IHJhbmdlLnVud3JhcCgpO1xuXG5cdFx0dGhpcy5hbm5vdGF0aW9uX2NvbnRhaW5lciA9IHRoaXMubWFya2VyLmFubm90YXRpb25fdGhyZWFkLmNyZWF0ZURpdih7IGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb25cIiB9KTtcblx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMucmVuZGVyUHJldmlldy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCB0aGlzLnJlbmRlclNvdXJjZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLm9uQ29tbWVudENvbnRleHRtZW51LmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKHRoaXMucmFuZ2UubWV0YWRhdGEpXG5cdFx0XHR0aGlzLnJlbmRlck1ldGFkYXRhKCk7XG5cblx0XHR0aGlzLmFubm90YXRpb25fdmlldyA9IHRoaXMuYW5ub3RhdGlvbl9jb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiBcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvbi12aWV3XCIgfSk7XG5cdFx0dGhpcy5yZW5kZXJQcmV2aWV3KCk7XG5cdH1cblxuXHRvbmxvYWQoKSB7XG5cdFx0c3VwZXIub25sb2FkKCk7XG5cdH1cblxuXHRvbnVubG9hZCgpIHtcblx0XHRzdXBlci5vbnVubG9hZCgpO1xuXG5cdFx0dGhpcy5hbm5vdGF0aW9uX2NvbnRhaW5lci5yZW1vdmUoKTtcblx0XHR0aGlzLmVkaXRNb2RlID0gbnVsbDtcblx0fVxuXG5cdHJlbmRlck1ldGFkYXRhKCkge1xuXHRcdHRoaXMubWV0YWRhdGFfdmlldyA9IHRoaXMuYW5ub3RhdGlvbl9jb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiBcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvbi1tZXRhZGF0YVwiIH0pO1xuXHRcdGlmICh0aGlzLnJhbmdlLmZpZWxkcy5hdXRob3IpIHtcblx0XHRcdGNvbnN0IGF1dGhvckxhYmVsID0gY3JlYXRlU3Bhbih7XG5cdFx0XHRcdGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tYXV0aG9yLWxhYmVsXCIsXG5cdFx0XHRcdHRleHQ6IFwiQXV0aG9yOiBcIixcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5tZXRhZGF0YV92aWV3LmFwcGVuZENoaWxkKGF1dGhvckxhYmVsKTtcblxuXHRcdFx0Y29uc3QgYXV0aG9yID0gY3JlYXRlU3Bhbih7XG5cdFx0XHRcdGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tYXV0aG9yLW5hbWVcIixcblx0XHRcdFx0dGV4dDogdGhpcy5yYW5nZS5maWVsZHMuYXV0aG9yLFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLm1ldGFkYXRhX3ZpZXcuYXBwZW5kQ2hpbGQoYXV0aG9yKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5yYW5nZS5maWVsZHMudGltZSkge1xuXHRcdFx0aWYgKHRoaXMubWV0YWRhdGFfdmlldy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IHNlcGFyYXRvciA9IGNyZWF0ZVNwYW4oe1xuXHRcdFx0XHRcdGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tbWV0YWRhdGEtc2VwYXJhdG9yXCIsXG5cdFx0XHRcdFx0dGV4dDogXCIgXHUyMDIyIFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5tZXRhZGF0YV92aWV3LmFwcGVuZENoaWxkKHNlcGFyYXRvcik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHRpbWVMYWJlbCA9IGNyZWF0ZVNwYW4oe1xuXHRcdFx0XHRjbHM6IFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLXRpbWUtbGFiZWxcIixcblx0XHRcdFx0dGV4dDogXCJVcGRhdGVkIGF0OiBcIixcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5tZXRhZGF0YV92aWV3LmFwcGVuZENoaWxkKHRpbWVMYWJlbCk7XG5cblx0XHRcdGNvbnN0IHRpbWUgPSBjcmVhdGVTcGFuKHtcblx0XHRcdFx0Y2xzOiBcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvbi10aW1lXCIsXG5cdFx0XHRcdHRleHQ6IHdpbmRvdy5tb21lbnQudW5peCh0aGlzLnJhbmdlLmZpZWxkcy50aW1lISkuZm9ybWF0KFwiTU1NIEREIFlZWVksIEhIOm1tXCIpLFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLm1ldGFkYXRhX3ZpZXcuYXBwZW5kQ2hpbGQodGltZSk7XG5cdFx0fVxuXHR9XG5cblx0cmVuZGVyU291cmNlKGU/OiBNb3VzZUV2ZW50KSB7XG5cdFx0aWYgKHRoaXMucmFuZ2UudHlwZSAhPT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCkge1xuXHRcdFx0Ly8gVE9ETzogU2hvdWxkIGVkaXRpbmcgbm9uLWNvbW1lbnRzIHdpdGhpbiB0aGUgYW5ub3RhdGlvbiBndXR0ZXIgYmUgYWxsb3dlZD9cblx0XHRcdG5ldyBOb3RpY2UoXCJbQ29tbWVudGF0b3JdIFlvdSBjYW4gb25seSBlZGl0IGNvbW1lbnRzLlwiKVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRlPy5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRNb2RlID09PSBcInNvdXJjZVwiKSByZXR1cm47XG5cblx0XHRcdGNvbnN0IHsgYXBwIH0gPSB0aGlzLm1hcmtlci52aWV3LnN0YXRlLmZpZWxkKGVkaXRvckluZm9GaWVsZCk7XG5cdFx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLWVkaXRpbmdcIiwgdHJ1ZSk7XG5cdFx0XHRpZiAodGhpcy5yYW5nZS5maWVsZHMuYXV0aG9yICYmIHRoaXMucmFuZ2UuZmllbGRzLmF1dGhvciAhPT0gYXBwLnBsdWdpbnMucGx1Z2lucy5jb21tZW50YXRvci5zZXR0aW5ncy5hdXRob3IpIHtcblx0XHRcdFx0bmV3IE5vdGljZShcIltDb21tZW50YXRvcl0gWW91IGNhbm5vdCBlZGl0IGNvbW1lbnRzIGZyb20gb3RoZXIgYXV0aG9ycy5cIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hbm5vdGF0aW9uX3ZpZXcuZW1wdHkoKTtcblx0XHRcdHRoaXMuZWRpdE1vZGUgPSB0aGlzLmFkZENoaWxkKFxuXHRcdFx0XHRuZXcgRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yKGFwcCwgdGhpcy5hbm5vdGF0aW9uX3ZpZXcsIHtcblx0XHRcdFx0XHR2YWx1ZTogdGhpcy50ZXh0LFxuXHRcdFx0XHRcdGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tZWRpdG9yXCIsXG5cdFx0XHRcdFx0b25TdWJtaXQ6IChlZGl0b3IpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMubmV3X3RleHQgPSBlZGl0b3IuZ2V0KCk7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlclByZXZpZXcoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8vIFRPRE86IEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGx1Z2luIHNvbWVob3dcblx0XHRcdFx0XHRmaWx0ZXJlZEV4dGVuc2lvbnM6IFthcHAucGx1Z2lucy5wbHVnaW5zW1wiY29tbWVudGF0b3JcIl0uZWRpdG9yRXh0ZW5zaW9uc10sXG5cdFx0XHRcdFx0b25CbHVyOiB0aGlzLnJlbmRlclByZXZpZXcuYmluZCh0aGlzKSxcblx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5jdXJyZW50TW9kZSA9IFwic291cmNlXCI7XG5cdFx0fVxuXHR9XG5cblx0cmVuZGVyUHJldmlldygpIHtcblx0XHRpZiAodGhpcy5jdXJyZW50TW9kZSA9PT0gXCJwcmV2aWV3XCIpIHJldHVybjtcblxuXHRcdC8vIEZJWE1FOiBPbiBhY2NlcHRpbmcgYSBuZXcgY29tbWVudCAob24gbW9kK2VudGVyKSwgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB0d2ljZVxuXHRcdC8vICAgIE9uY2UgZm9yIHRoZSBpbW1lZGlhdGUgdXNlciBldmVudFxuXHRcdC8vICAgIEFuZCBhZ2FpbiB3aGVuIHRoZSBjb21tZW50cyBnZXQgdXBkYXRlZFxuXHRcdC8vICAgIC0+IFRoaXMgY2F1c2VkIGFuIGlzc3VlIHdoZXJlIHRoZSByYW5nZSBnZXRzIGFkZGVkIHR3aWNlLCB0ZW1wb3JhcmlseSBmaXhlZCBieSBzZXR0aW5nIHRleHQgdG8gbmV3IHRleHRcblx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLWVkaXRpbmdcIiwgZmFsc2UpO1xuXG5cdFx0Ly8gRVhQTDogUmVndWxhciAocmUtKXJlbmRlcmluZyBvZiB0aGUgYW5ub3RhdGlvblxuXHRcdGlmICh0aGlzLnRleHQgPT09IHRoaXMubmV3X3RleHQgfHwgdGhpcy5uZXdfdGV4dCA9PT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgeyBhcHAgfSA9IHRoaXMubWFya2VyLnZpZXcuc3RhdGUuZmllbGQoZWRpdG9ySW5mb0ZpZWxkKTtcblx0XHRcdHRoaXMubmV3X3RleHQgPSBudWxsO1xuXHRcdFx0aWYgKHRoaXMuZWRpdE1vZGUpIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVDaGlsZCh0aGlzLmVkaXRNb2RlKTtcblx0XHRcdFx0dGhpcy5lZGl0TW9kZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFubm90YXRpb25fdmlldy5lbXB0eSgpO1xuXHRcdFx0aWYgKHRoaXMucmFuZ2UudHlwZSAhPT0gU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OKSB7XG5cdFx0XHRcdE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKGFwcCwgdGhpcy50ZXh0IHx8IFwiJm5ic3A7XCIsIHRoaXMuYW5ub3RhdGlvbl92aWV3LCBcIlwiLCB0aGlzKTtcblx0XHRcdFx0c3dpdGNoICh0aGlzLnJhbmdlLnR5cGUpIHtcblx0XHRcdFx0XHRjYXNlIFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OOlxuXHRcdFx0XHRcdFx0dGhpcy5hbm5vdGF0aW9uX3ZpZXcuY2hpbGRyZW5bMF0ucHJlcGVuZChjcmVhdGVTcGFuKHsgY2xzOiBcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvbi1kZXNjXCIsIHRleHQ6IFwiQWRkZWQ6IFwiIH0pKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuREVMRVRJT046XG5cdFx0XHRcdFx0XHR0aGlzLmFubm90YXRpb25fdmlldy5jaGlsZHJlblswXS5wcmVwZW5kKGNyZWF0ZVNwYW4oeyBjbHM6IFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLWRlc2NcIiwgdGV4dDogXCJEZWxldGVkOiBcIiB9KSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFN1Z2dlc3Rpb25UeXBlLkhJR0hMSUdIVDpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuQ09NTUVOVDpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB0ZXh0X3NsaWNlcyA9IHRoaXMucmFuZ2UudW53cmFwX3BhcnRzKCk7XG5cdFx0XHRcdE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKGFwcCwgdGV4dF9zbGljZXNbMF0gfHwgXCImbmJzcDtcIiwgdGhpcy5hbm5vdGF0aW9uX3ZpZXcsIFwiXCIsIHRoaXMpO1xuXHRcdFx0XHR0aGlzLmFubm90YXRpb25fdmlldy5jaGlsZHJlblswXS5wcmVwZW5kKGNyZWF0ZVNwYW4oeyBjbHM6IFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLWRlc2NcIiwgdGV4dDogXCJDaGFuZ2VkOiBcIiB9KSk7XG5cdFx0XHRcdGNvbnN0IGNoaWxkSWR4ID0gdGhpcy5hbm5vdGF0aW9uX3ZpZXcuY2hpbGRyZW4ubGVuZ3RoO1xuXHRcdFx0XHRNYXJrZG93blJlbmRlcmVyLnJlbmRlcihhcHAsIHRleHRfc2xpY2VzWzFdIHx8IFwiJm5ic3A7XCIsIHRoaXMuYW5ub3RhdGlvbl92aWV3LCBcIlwiLCB0aGlzKTtcblx0XHRcdFx0dGhpcy5hbm5vdGF0aW9uX3ZpZXcuY2hpbGRyZW5bY2hpbGRJZHhdLnByZXBlbmQoY3JlYXRlU3Bhbih7IGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tZGVzY1wiLCB0ZXh0OiBcIlRvOiBcIiB9KSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYW5ub3RhdGlvbl92aWV3LmFkZENsYXNzKFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLVwiICsgdGhpcy5yYW5nZS50eXBlKTtcblx0XHRcdHRoaXMuY3VycmVudE1vZGUgPSBcInByZXZpZXdcIjtcblx0XHR9XG5cblx0XHQvLyBFWFBMOiBUaGUgYW5ub3RhdGlvbiBnZXRzIHVwZGF0ZWQgd2l0aCBuZXcgdGV4dFxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy50ZXh0ID0gdGhpcy5uZXdfdGV4dDtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT5cblx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0ZnJvbTogdGhpcy5yYW5nZS5mcm9tLFxuXHRcdFx0XHRcdFx0dG86IHRoaXMucmFuZ2UudG8sXG5cdFx0XHRcdFx0XHRpbnNlcnQ6IGNyZWF0ZV9yYW5nZShTdWdnZXN0aW9uVHlwZS5DT01NRU5ULCB0aGlzLm5ld190ZXh0ISksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0b25Db21tZW50Q29udGV4dG1lbnUoZTogTW91c2VFdmVudCkge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0c3RpY2t5Q29udGV4dE1lbnVQYXRjaCh0cnVlKTtcblxuXHRcdGNvbnN0IG1lbnUgPSBuZXcgTWVudSgpO1xuXHRcdGlmICh0aGlzLnJhbmdlLnR5cGUgIT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQgJiYgdGhpcy5yYW5nZS50eXBlICE9PSBTdWdnZXN0aW9uVHlwZS5ISUdITElHSFQpIHtcblx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRpdGVtLnNldFRpdGxlKFwiQWNjZXB0IGNoYW5nZXNcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcImNoZWNrXCIpXG5cdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjbG9zZS1hbm5vdGF0aW9uXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7IGNoYW5nZXM6IGFjY2VwdFN1Z2dlc3Rpb25zKHRoaXMubWFya2VyLnZpZXcuc3RhdGUsIHRoaXMucmFuZ2UuZnJvbSwgdGhpcy5yYW5nZS50bykgfSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRpdGVtLnNldFRpdGxlKFwiUmVqZWN0IGNoYW5nZXNcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcImNyb3NzXCIpXG5cdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjbG9zZS1hbm5vdGF0aW9uXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7IGNoYW5nZXM6IHJlamVjdFN1Z2dlc3Rpb25zKHRoaXMubWFya2VyLnZpZXcuc3RhdGUsIHRoaXMucmFuZ2UuZnJvbSwgdGhpcy5yYW5nZS50bykgfSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5yYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5DT01NRU5UKSB7XG5cdFx0XHRpZiAodGhpcy5yYW5nZS5yZXBsaWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG5cdFx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkNsb3NlIGNvbW1lbnQgdGhyZWFkXCIpXG5cdFx0XHRcdFx0XHQuc2V0SWNvbihcIm1lc3NhZ2Utc3F1YXJlLW9mZlwiKVxuXHRcdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjbG9zZS1hbm5vdGF0aW9uXCIpXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubWFya2VyLnZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGZyb206IHRoaXMucmFuZ2UuZnVsbF9yYW5nZV9mcm9udCxcblx0XHRcdFx0XHRcdFx0XHRcdHRvOiB0aGlzLnJhbmdlLmZ1bGxfcmFuZ2VfYmFjayxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogXCJcIixcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG5cdFx0XHRcdGl0ZW0uc2V0VGl0bGUoXCJBZGQgcmVwbHlcIilcblx0XHRcdFx0XHQuc2V0U2VjdGlvbihcImNvbW1lbnQtaGFuZGxpbmdcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcInJlcGx5XCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0YWRkQ29tbWVudFRvVmlldyh0aGlzLm1hcmtlci52aWV3LCB0aGlzLnJhbmdlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkVkaXQgY29tbWVudFwiKVxuXHRcdFx0XHRcdC5zZXRJY29uKFwicGVuY2lsXCIpXG5cdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjb21tZW50LWhhbmRsaW5nXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5yZW5kZXJTb3VyY2UoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBUT0RPOiBXaGVuIHJlbW92aW5nIGNvbW1lbnRzLCB1c2UgYSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IHNob3VsZCBiZSBhcmNoaXZlZCBvciBub3Rcblx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRpdGVtLnNldFRpdGxlKFwiUmVtb3ZlIGNvbW1lbnRcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcImNyb3NzXCIpXG5cdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjb21tZW50LWhhbmRsaW5nXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7IGNoYW5nZXM6IHsgZnJvbTogdGhpcy5yYW5nZS5mcm9tLCB0bzogdGhpcy5yYW5nZS50bywgaW5zZXJ0OiBcIlwiIH0gfSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKHRoaXMucmFuZ2UudHlwZSAhPT0gU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUKSB7XG5cdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkFkZCByZXBseVwiKVxuXHRcdFx0XHRcdC5zZXRTZWN0aW9uKFwiY29tbWVudC1oYW5kbGluZ1wiKVxuXHRcdFx0XHRcdC5zZXRJY29uKFwicmVwbHlcIilcblx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRhZGRDb21tZW50VG9WaWV3KHRoaXMubWFya2VyLnZpZXcsIHRoaXMucmFuZ2UpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmICh0aGlzLnJhbmdlLnJlcGxpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRpdGVtLnNldFRpdGxlKFwiUmVtb3ZlIGFsbCBjb21tZW50c1wiKVxuXHRcdFx0XHRcdFx0LnNldEljb24oXCJtZXNzYWdlLXNxdWFyZS14XCIpXG5cdFx0XHRcdFx0XHQuc2V0U2VjdGlvbihcImNvbW1lbnQtaGFuZGxpbmdcIilcblx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbTogdGhpcy5yYW5nZS5yZXBsaWVzWzBdLmZyb20sXG5cdFx0XHRcdFx0XHRcdFx0XHR0bzogdGhpcy5yYW5nZS5yZXBsaWVzW3RoaXMucmFuZ2UucmVwbGllcy5sZW5ndGggLSAxXS50byxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogXCJcIixcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG5cdFx0XHRcdGl0ZW0uc2V0VGl0bGUoXCJBZGQgcmVwbHlcIilcblx0XHRcdFx0XHQuc2V0U2VjdGlvbihcImNvbW1lbnQtaGFuZGxpbmdcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcInJlcGx5XCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0YWRkQ29tbWVudFRvVmlldyh0aGlzLm1hcmtlci52aWV3LCB0aGlzLnJhbmdlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXG5cblx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdGl0ZW0uc2V0VGl0bGUoXCJGb2xkIGd1dHRlclwiKVxuXHRcdFx0XHQuc2V0U2VjdGlvbihcImd1dHRlci1jb250cm9sc1wiKVxuXHRcdFx0XHQuc2V0SWNvbihcImFycm93LXJpZ2h0LWZyb20tbGluZVwiKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uczogWyBhbm5vdGF0aW9uR3V0dGVyRm9sZEFubm90YXRpb24ub2YobnVsbCkgXVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdGNvbnN0IHN1Ym1lbnUgPSBpdGVtLnNldFRpdGxlKFwiSW5jbHVkZWQgYW5ub3RhdGlvbnNcIilcblx0XHRcdFx0LnNldEljb24oXCJleWVcIilcblx0XHRcdFx0LnNldFNlY3Rpb24oXCJndXR0ZXItY29udHJvbHNcIilcblx0XHRcdFx0LnNldFN1Ym1lbnUoKTtcblxuXHRcdFx0bGV0IGN1cnJlbnRfc2V0dGluZ3MgPSB0aGlzLm1hcmtlci52aWV3LnN0YXRlLmZhY2V0KGFubm90YXRpb25HdXR0ZXJJbmNsdWRlZFR5cGVzU3RhdGUpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHsgdGl0bGUsIGljb24sIHZhbHVlIH0gb2YgW1xuXHRcdFx0XHR7IHRpdGxlOiBcIkFkZGl0aW9uc1wiLCBpY29uOiBcInBsdXMtY2lyY2xlXCIsIHZhbHVlOiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5BRERJVElPTiB9LFxuXHRcdFx0XHR7IHRpdGxlOiBcIkRlbGV0aW9uc1wiLCBpY29uOiBcIm1pbnVzLXNxdWFyZVwiLCB2YWx1ZTogQW5ub3RhdGlvbkluY2x1c2lvblR5cGUuREVMRVRJT04gfSxcblx0XHRcdFx0eyB0aXRsZTogXCJTdWJzdGl0dXRpb25zXCIsIGljb246IFwicmVwbGFjZVwiLCB2YWx1ZTogQW5ub3RhdGlvbkluY2x1c2lvblR5cGUuU1VCU1RJVFVUSU9OIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiSGlnaGxpZ2h0c1wiLCBpY29uOiBcImhpZ2hsaWdodGVyXCIsIHZhbHVlOiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5ISUdITElHSFQgfSxcblx0XHRcdFx0eyB0aXRsZTogXCJDb21tZW50c1wiLCBpY29uOiBcIm1lc3NhZ2Utc3F1YXJlXCIsIHZhbHVlOiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5DT01NRU5UIH0sXG5cdFx0XHRdKSB7XG5cdFx0XHRcdHN1Ym1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRcdGl0ZW0uc2V0VGl0bGUodGl0bGUpXG5cdFx0XHRcdFx0XHQuc2V0SWNvbihpY29uKVxuXHRcdFx0XHRcdFx0LnNldENoZWNrZWQoKGN1cnJlbnRfc2V0dGluZ3MgJiB2YWx1ZSkgIT09IDApXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRfc2V0dGluZ3MgXj0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGlzX2FjdGl2ZSA9IChjdXJyZW50X3NldHRpbmdzICYgdmFsdWUpICE9PSAwO1xuXHRcdFx0XHRcdFx0XHQvLyBGSVhNRTogQWZ0ZXIgY2FsbGluZyAuc2V0Q2hlY2tlZChmYWxzZSkgb25jZSwgdGhlIGljb24gd2lsbCBub3Qgc2hvdyB1cCBhZ2FpbiB3aGVuIGNhbGxpbmcgLnNldENoZWNrZWQodHJ1ZSlcblx0XHRcdFx0XHRcdFx0Ly8gXHRcdHRoZSBjb2RlIGJlbG93IGJ5cGFzc2VzIHRoaXMgaXNzdWUgYnkganVzdCBoaWRpbmcgaXQgdmlhIGRpc3BsYXkgc3R5bGVcblx0XHRcdFx0XHRcdFx0aWYgKGl0ZW0uY2hlY2tJY29uRWwpXG5cdFx0XHRcdFx0XHRcdFx0aXRlbS5jaGVja0ljb25FbC5zdHlsZS5kaXNwbGF5ID0gaXNfYWN0aXZlID8gXCJmbGV4XCIgOiBcIm5vbmVcIjtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGl0ZW0uc2V0Q2hlY2tlZChpc19hY3RpdmUpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1hcmtlci52aWV3LmRpc3BhdGNoKHRoaXMubWFya2VyLnZpZXcuc3RhdGUudXBkYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRlZmZlY3RzOiBbYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXMucmVjb25maWd1cmUoYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZS5vZihjdXJyZW50X3NldHRpbmdzKSldLFxuXHRcdFx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRtZW51LnNob3dBdFBvc2l0aW9uKGUpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBBbm5vdGF0aW9uTWFya2VyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcblx0YW5ub3RhdGlvbl90aHJlYWQhOiBIVE1MRWxlbWVudDtcblx0Y29tcG9uZW50OiBDb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7XG5cdHByZXZlbnRVbmxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgYW5ub3RhdGlvbjogQ3JpdGljTWFya3VwUmFuZ2UsIHB1YmxpYyBhbm5vdGF0aW9uczogQ3JpdGljTWFya3VwUmFuZ2VbXSwgcHVibGljIHZpZXc6IEVkaXRvclZpZXcsIHB1YmxpYyBpdHIgPSAwKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGVxKG90aGVyOiBBbm5vdGF0aW9uTWFya2VyKSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRyID09PSBvdGhlci5pdHIgJiYgdGhpcy5hbm5vdGF0aW9ucyA9PT0gb3RoZXIuYW5ub3RhdGlvbnMgJiYgdGhpcy5hbm5vdGF0aW9uc1swXS5lcXVhbHMob3RoZXIuYW5ub3RhdGlvbnNbMF0pO1xuXHR9XG5cblx0b25Db21tZW50VGhyZWFkQ2xpY2soKSB7XG5cdFx0Ly8gRVhQTDogV2hlbiB0aGUgYW5ub3RhdGlvbiBnZXRzIGZvY3VzZWQsIGVuc3VyZSB0aGF0IGl0IGlzIGFsaWduZWQgdG8gdGhlIGJsb2NrIGl0IGlzIGF0dGFjaGVkIHRvLFxuXHRcdC8vIFx0XHQgcHVzaGluZyBvdGhlciBhbm5vdGF0aW9ucyB1cC9kb3duXG5cdFx0dGhpcy52aWV3LmRpc3BhdGNoKHtcblx0XHRcdGFubm90YXRpb25zOiBbXG5cdFx0XHRcdGFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24ub2Yoe1xuXHRcdFx0XHRcdG1hcmtlcjogdGhpcyxcblx0XHRcdFx0XHRpbmRleDogLTEsXG5cdFx0XHRcdFx0c2Nyb2xsOiB0cnVlLFxuXHRcdFx0XHRcdGZvY3VzX21hcmt1cDogdHJ1ZSxcblx0XHRcdFx0fSksXG5cdFx0XHRdLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hbm5vdGF0aW9uX3RocmVhZC5jbGFzc0xpc3QudG9nZ2xlKFwiY210ci1hbm5vLWd1dHRlci10aHJlYWQtaGlnaGxpZ2h0XCIsIHRydWUpO1xuXHR9XG5cblx0dG9ET00oKSB7XG5cdFx0dGhpcy5hbm5vdGF0aW9uX3RocmVhZCA9IGNyZWF0ZURpdih7IGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLXRocmVhZFwiIH0pO1xuXHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub25Db21tZW50VGhyZWFkQ2xpY2suYmluZCh0aGlzKSk7XG5cblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIHRoaXMuYW5ub3RhdGlvbnMpXG5cdFx0XHR0aGlzLmNvbXBvbmVudC5hZGRDaGlsZChuZXcgQW5ub3RhdGlvbk5vZGUocmFuZ2UsIHRoaXMpKTtcblx0XHR0aGlzLmNvbXBvbmVudC5sb2FkKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5hbm5vdGF0aW9uX3RocmVhZDtcblx0fVxuXG5cdGZvY3VzKCkge1xuXHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuZm9jdXMoKTtcblx0fVxuXG5cdGZvY3VzX2Fubm90YXRpb24oaW5kZXg6IG51bWJlciA9IC0xLCBzY3JvbGw6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItdGhyZWFkLWhpZ2hsaWdodFwiLCB0cnVlKTtcblx0XHR9IGVsc2UgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmFubm90YXRpb25fdGhyZWFkLmNoaWxkcmVuLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5hbm5vdGF0aW9uX3RocmVhZC5jaGlsZHJlbi5pdGVtKGluZGV4KSEuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudChcImRibGNsaWNrXCIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIltDb21tZW50YXRvcl0gSW52YWxpZCBpbmRleCBmb3IgZm9jdXNpbmcgYW5ub3RhdGlvbjpcIiwgaW5kZXgpO1xuXHRcdH1cblxuXHRcdGlmIChzY3JvbGwpIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0b3AgPSB0aGlzLnZpZXcubGluZUJsb2NrQXQodGhpcy5hbm5vdGF0aW9uc1swXS5mcm9tKS50b3AgLSAxMDA7XG5cdFx0XHRcdHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsVG8oe3RvcCwgYmVoYXZpb3I6IFwic21vb3RoXCJ9KTtcblx0XHRcdH0sIDIwMCk7XG5cdFx0fVxuXHR9XG5cblx0dW5mb2N1c19hbm5vdGF0aW9uKGluZGV4OiBudW1iZXIgPSAtMSkge1xuXHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItdGhyZWFkLWhpZ2hsaWdodFwiLCBmYWxzZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuY2hpbGRyZW4uaXRlbShpbmRleCkhLmNsYXNzTGlzdC50b2dnbGUoXCJjbXRyLWFubm8tZ3V0dGVyLXRocmVhZC1oaWdobGlnaHRcIiwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdGRlc3Ryb3koZG9tOiBIVE1MRWxlbWVudCkge1xuXHRcdHRoaXMuY29tcG9uZW50LnVubG9hZCgpO1xuXHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQucmVtb3ZlKCk7XG5cdFx0c3VwZXIuZGVzdHJveShkb20pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcmtlcnMoc3RhdGU6IEVkaXRvclN0YXRlLCBjaGFuZ2VkX3JhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSwgdHlwZXM6IG51bWJlcikge1xuXHRjb25zdCB2aWV3ID0gc3RhdGUuZmllbGQoZWRpdG9yRWRpdG9yRmllbGQpO1xuXG5cdGNvbnN0IGluY2x1ZGVBZGRpdGlvbnMgPSAodHlwZXMgJiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5BRERJVElPTikgIT09IDA7XG5cdGNvbnN0IGluY2x1ZGVEZWxldGlvbnMgPSAodHlwZXMgJiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5ERUxFVElPTikgIT09IDA7XG5cdGNvbnN0IGluY2x1ZGVTdWJzdGl0dXRpb25zID0gKHR5cGVzICYgQW5ub3RhdGlvbkluY2x1c2lvblR5cGUuU1VCU1RJVFVUSU9OKSAhPT0gMDtcblx0Y29uc3QgaW5jbHVkZUhpZ2hsaWdodHMgPSAodHlwZXMgJiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5ISUdITElHSFQpICE9PSAwO1xuXHRjb25zdCBpbmNsdWRlQ29tbWVudHMgPSAodHlwZXMgJiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5DT01NRU5UKSAhPT0gMDtcblxuXHRjb25zdCBjbV9yYW5nZXM6IFJhbmdlPEFubm90YXRpb25NYXJrZXI+W10gPSBbXTtcblx0Zm9yIChjb25zdCByYW5nZSBvZiBjaGFuZ2VkX3Jhbmdlcykge1xuXHRcdGxldCBmdWxsX3RocmVhZCA9IHJhbmdlLmZ1bGxfdGhyZWFkO1xuXG5cdFx0aWYgKCFpbmNsdWRlQ29tbWVudHMpIHtcblx0XHRcdGZ1bGxfdGhyZWFkID0gZnVsbF90aHJlYWQuc2xpY2UoMCwgMSk7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChyYW5nZS50eXBlKSB7XG5cdFx0XHRjYXNlIFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OOlxuXHRcdFx0XHRpZiAoIWluY2x1ZGVBZGRpdGlvbnMpIGZ1bGxfdGhyZWFkLnNoaWZ0KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBTdWdnZXN0aW9uVHlwZS5ERUxFVElPTjpcblx0XHRcdFx0aWYgKCFpbmNsdWRlRGVsZXRpb25zKSBmdWxsX3RocmVhZC5zaGlmdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OOlxuXHRcdFx0XHRpZiAoIWluY2x1ZGVTdWJzdGl0dXRpb25zKSBmdWxsX3RocmVhZC5zaGlmdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUOlxuXHRcdFx0XHRpZiAoIWluY2x1ZGVIaWdobGlnaHRzKSBmdWxsX3RocmVhZC5zaGlmdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuQ09NTUVOVDpcblx0XHRcdFx0aWYgKCFpbmNsdWRlQ29tbWVudHMpIGZ1bGxfdGhyZWFkLnNoaWZ0KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGlmIChmdWxsX3RocmVhZC5sZW5ndGgpIHtcblx0XHRcdC8vIE1PRElGSUNBVElPTjogYWR2YW5jZUN1cnNvciBpbiBiYXNlLnRzIHJlcXVpcmVkIG1hcmtlcnMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgcmFuZ2VzZXQgYXQgZXhhY3RseVxuXHRcdFx0Ly8gICAgICB0aGUgcG9zaXRpb25zIHdoZXJlIGxpbmUgc3RhcnRzLCB0aGlzIGNhdXNlZCBzb21lIGlzc3VlcyB3aXRoIGNvcnJlY3QgYWRqdXN0bWVudCBvZiBwb3NpdGlvbnMgdGhyb3VnaCB1cGRhdGVzLFxuXHRcdFx0Ly8gICAgICBzbyBhZGp1c3RtZW50IGlzIHRoYXQgbWFya2VycyBjYW4gbm93IG9jY3VyIGF0IGFueSBwb3NpdGlvbiBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lXG5cdFx0XHRjb25zdCBtYXJrZXIgPSBuZXcgQW5ub3RhdGlvbk1hcmtlcihyYW5nZSwgZnVsbF90aHJlYWQsIHZpZXcsIGl0cik7XG5cdFx0XHRtYXJrZXIucHJldmVudFVubG9hZCA9IHRydWU7XG5cdFx0XHRjbV9yYW5nZXMucHVzaChtYXJrZXIucmFuZ2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY21fcmFuZ2VzO1xufVxuXG5sZXQgaXRyID0gMDtcbmV4cG9ydCBjb25zdCBhbm5vdGF0aW9uR3V0dGVyTWFya2VycyA9IFN0YXRlRmllbGQuZGVmaW5lPFJhbmdlU2V0PEFubm90YXRpb25NYXJrZXI+Pih7XG5cdGNyZWF0ZShzdGF0ZSkge1xuXHRcdGNvbnN0IHJhbmdlcyA9IHN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKS5yYW5nZXMucmFuZ2VzLnJlZHVjZSgoYWNjLCByYW5nZSkgPT4ge1xuXHRcdFx0Y29uc3QgYmFzZSA9IHJhbmdlLmJhc2VfcmFuZ2U7XG5cdFx0XHRpZiAoIWFjYy5pbmNsdWRlcyhiYXNlKSlcblx0XHRcdFx0YWNjLnB1c2goYmFzZSk7XG5cdFx0XHRyZXR1cm4gYWNjO1xuXHRcdH0sIFtdIGFzIENyaXRpY01hcmt1cFJhbmdlW10pO1xuXG5cdFx0cmV0dXJuIFJhbmdlU2V0Lm9mPEFubm90YXRpb25NYXJrZXI+KFxuXHRcdFx0Y3JlYXRlTWFya2Vycyhcblx0XHRcdFx0c3RhdGUsXG5cdFx0XHRcdHJhbmdlcyxcblx0XHRcdFx0c3RhdGUuZmFjZXQoYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSlcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdHVwZGF0ZShvbGRTZXQsIHRyKSB7XG5cdFx0Y29uc3QgaW5jbHVkZWRUeXBlcyA9IHRyLnN0YXRlLmZhY2V0KGFubm90YXRpb25HdXR0ZXJJbmNsdWRlZFR5cGVzU3RhdGUpO1xuXG5cdFx0Ly8gTk9URTogV2hpbGUgaXQgaXMgKnNsaWdodGx5KiBpbmVmZmljaWVudCB0byByZWNyZWF0ZSBhbGwgbWFya2VycyAoc2luY2UgdGhlIGV4aXN0aW5nIG1hcmtlcnMgY291bGQgYmUgcmUtdXNlZCksXG5cdFx0Ly8gICAgICAgdGhlIGluY2x1ZGVkIHR5cGVzIGFyZSBiYXJlbHkgZXZlciBjaGFuZ2VkLCBzbyB0aGUgaW1wYWN0IGlzIG5lZ2xpZ2libGVcblx0XHRpZiAodHIuc3RhcnRTdGF0ZS5mYWNldChhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlc1N0YXRlKSAhPT0gaW5jbHVkZWRUeXBlcykge1xuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlKHRyLnN0YXRlKTtcblx0XHR9XG5cblx0XHRpZiAoIXRyLmRvY0NoYW5nZWQpIHtcblx0XHRcdHJldHVybiBvbGRTZXQ7XG5cdFx0fVxuXG5cdFx0aXRyICs9IDE7XG5cblx0XHRjb25zdCBhZGRlZF9yYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIHRyLnN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKS5pbnNlcnRlZF9yYW5nZXMpIHtcblx0XHRcdGlmICghYWRkZWRfcmFuZ2VzLmluY2x1ZGVzKHJhbmdlLmJhc2VfcmFuZ2UpKVxuXHRcdFx0XHRhZGRlZF9yYW5nZXMucHVzaChyYW5nZS5iYXNlX3JhbmdlKTtcblx0XHR9XG5cdFx0Y29uc3QgZGVsZXRlZF9yYW5nZXMgPSB0ci5zdGF0ZS5maWVsZChyYW5nZVBhcnNlcikuZGVsZXRlZF9yYW5nZXNcblx0XHRcdC5tYXAocmFuZ2UgPT4gcmFuZ2UuYmFzZV9yYW5nZSk7XG5cblx0XHRyZXR1cm4gb2xkU2V0XG5cdFx0XHQubWFwKHRyLmNoYW5nZXMpXG5cdFx0XHQudXBkYXRlKHtcblx0XHRcdFx0ZmlsdGVyOiAoZnJvbSwgdG8sIHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0Ly8gRVhQTDogVGhpcyBjb2RlIHByZXZlbnRzIEFubm90YXRpb25NYXJrZXJzIGluIGV4aXN0aW5nIEd1dHRlck1hcmtlcnMgZnJvbSBiZWluZyB1bmxvYWRlZFxuXHRcdFx0XHRcdC8vICAgICAgIHdoZW4gdGhlIG1hcmtlciBpcyBtb3ZlZCBmcm9tIG9uZSBHdXR0ZXJFbGVtZW50IHRvIGFub3RoZXJcblx0XHRcdFx0XHRjb25zdCBrZWVwID0gIWRlbGV0ZWRfcmFuZ2VzLmluY2x1ZGVzKHZhbHVlLmFubm90YXRpb24pO1xuXHRcdFx0XHRcdHZhbHVlLnByZXZlbnRVbmxvYWQgPSBrZWVwO1xuXHRcdFx0XHRcdHJldHVybiBrZWVwO1xuXG5cdFx0XHRcdFx0Ly8gcmV0dXJuICFkZWxldGVkX3Jhbmdlcy5pbmNsdWRlcyh2YWx1ZS5hbm5vdGF0aW9uKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWRkOiBjcmVhdGVNYXJrZXJzKHRyLnN0YXRlLCBhZGRlZF9yYW5nZXMubWFwKHJhbmdlID0+IHJhbmdlLmZ1bGxfdGhyZWFkWzBdKSwgaW5jbHVkZWRUeXBlcyksXG5cdFx0XHR9KTtcblx0fSxcbn0pO1xuIiwgIi8qKlxuICogQWxsIGNyZWRpdHMgZ28gdG8gbWdtZXllcnMgZm9yIGZpZ3VyaW5nIG91dCBob3cgdG8gZ3JhYiB0aGUgcHJvcGVyIGVkaXRvciBwcm90b3R5cGVcbiAqIFx0IGFuZCBtYWtpbmcgaXQgZWFzaWx5IGRlcGxveWFibGVcbiAqIENoYW5nZXMgbWFkZSB0byB0aGUgb3JpZ2luYWwgY29kZTpcbiAqIFx0IC0gUmVmYWN0b3JlZCB0byBKUy1vbmx5IHN5bnRheCAob3JpZ2luYWwgY29kZSBtYWRlIHVzZSBvZiBSZWFjdClcbiAqIFx0IC0gQWRkZWQgYmx1ciBjb21wbGV0aW9uXG4gKiBcdCAtIEFkZGVkIHNvbWUgY29tbWVudHMgb24gaG93IHRoZSBjb2RlIGZ1bmN0aW9uc1xuICogXHQgLSBNYWRlIGVkaXRvciBzZXR0aW5ncyBmdWxseSBvcHRpb25hbFxuICogXHQgLSBBbGxvdyBhbGwgZWRpdG9yIGNvbW1hbmRzIHRvIGZ1bmN0aW9uIG9uIHRoaXMgZWRpdG9yXG4gKiBcdCAtIEFkZGVkIHR5cGluZ3MgZm9yIHRoZSBlZGl0b3IocykgKHdpbGwgYmUgYWRkZWQgdG8gb2JzaWRpYW4tdHlwaW5ncylcbiAqIE1ha2Ugc3VyZSB0byBhbHNvIGNoZWNrIG91dCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL21nbWV5ZXJzL29ic2lkaWFuLWthbmJhbi9ibG9iL21haW4vc3JjL2NvbXBvbmVudHMvRWRpdG9yL01hcmtkb3duRWRpdG9yLnRzeFxuICovXG5cbmltcG9ydCB7XG5cdEFwcCxcblx0dHlwZSBDb25zdHJ1Y3Rvcixcblx0U2NvcGUsXG5cdFRGaWxlLFxuXHRXb3Jrc3BhY2VMZWFmLFxufSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB0eXBlIHsgTWFya2Rvd25TY3JvbGxhYmxlRWRpdFZpZXcsIFdpZGdldEVkaXRvclZpZXcgfSBmcm9tIFwib2JzaWRpYW4tdHlwaW5nc1wiXG5cbmltcG9ydCB7IEVkaXRvclNlbGVjdGlvbiwgdHlwZSBFeHRlbnNpb24sIFByZWMgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7IEVkaXRvclZpZXcsIGtleW1hcCwgcGxhY2Vob2xkZXIsIFZpZXdVcGRhdGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5pbXBvcnQgeyBhcm91bmQgfSBmcm9tIFwibW9ua2V5LWFyb3VuZFwiO1xuXG5mdW5jdGlvbiByZXNvbHZlRWRpdG9yUHJvdG90eXBlKGFwcDogQXBwKSB7XG5cdC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBlZGl0b3IgdG8gcmVzb2x2ZSB0aGUgcHJvdG90eXBlIG9mIFNjcm9sbGFibGVNYXJrZG93bkVkaXRvclxuXHRjb25zdCB3aWRnZXRFZGl0b3JWaWV3ID0gYXBwLmVtYmVkUmVnaXN0cnkuZW1iZWRCeUV4dGVuc2lvbi5tZChcblx0XHR7IGFwcCwgY29udGFpbmVyRWw6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgfSxcblx0XHRudWxsIGFzIHVua25vd24gYXMgVEZpbGUsXG5cdFx0XCJcIixcblx0KSBhcyBXaWRnZXRFZGl0b3JWaWV3O1xuXG5cdC8vIE1hcmsgYXMgZWRpdGFibGUgdG8gaW5zdGFudGlhdGUgdGhlIGVkaXRvclxuXHR3aWRnZXRFZGl0b3JWaWV3LmVkaXRhYmxlID0gdHJ1ZTtcblx0d2lkZ2V0RWRpdG9yVmlldy5zaG93RWRpdG9yKCk7XG5cdGNvbnN0IE1hcmtkb3duRWRpdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih3aWRnZXRFZGl0b3JWaWV3LmVkaXRNb2RlISkpO1xuXG5cdC8vIFVubG9hZCB0byByZW1vdmUgdGhlIHRlbXBvcmFyeSBlZGl0b3Jcblx0d2lkZ2V0RWRpdG9yVmlldy51bmxvYWQoKTtcblxuXHRyZXR1cm4gTWFya2Rvd25FZGl0b3IuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TWFya2Rvd25TY3JvbGxhYmxlRWRpdFZpZXc+O1xufVxuXG5pbnRlcmZhY2UgTWFya2Rvd25FZGl0b3JQcm9wcyB7XG5cdGN1cnNvckxvY2F0aW9uOiB7IGFuY2hvcjogbnVtYmVyOyBoZWFkOiBudW1iZXIgfTtcblx0dmFsdWU6IHN0cmluZztcblx0Y2xzOiBzdHJpbmc7XG5cdHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cdGZvY3VzOiBib29sZWFuO1xuXG5cdGZpbHRlcmVkRXh0ZW5zaW9uczogRXh0ZW5zaW9uW107XG5cblx0b25FbnRlcjogKGVkaXRvcjogRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yLCBtb2Q6IGJvb2xlYW4sIHNoaWZ0OiBib29sZWFuKSA9PiBib29sZWFuO1xuXHRvbkVzY2FwZTogKGVkaXRvcjogRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yKSA9PiB2b2lkO1xuXHRvblN1Ym1pdDogKGVkaXRvcjogRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yKSA9PiB2b2lkO1xuXHRvbkJsdXI6IChlZGl0b3I6IEVtYmVkZGFibGVNYXJrZG93bkVkaXRvcikgPT4gdm9pZDtcblx0b25QYXN0ZTogKGU6IENsaXBib2FyZEV2ZW50LCBlZGl0b3I6IEVtYmVkZGFibGVNYXJrZG93bkVkaXRvcikgPT4gdm9pZDtcblx0b25DaGFuZ2U6ICh1cGRhdGU6IFZpZXdVcGRhdGUpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGRlZmF1bHRQcm9wZXJ0aWVzOiBNYXJrZG93bkVkaXRvclByb3BzID0ge1xuXHRjdXJzb3JMb2NhdGlvbjogeyBhbmNob3I6IDAsIGhlYWQ6IDAgfSxcblx0dmFsdWU6IFwiXCIsXG5cdGNsczogXCJcIixcblx0cGxhY2Vob2xkZXI6IFwiXCIsXG5cdGZvY3VzOiB0cnVlLFxuXHRmaWx0ZXJlZEV4dGVuc2lvbnM6IFtdLFxuXG5cdG9uRW50ZXI6IChlZGl0b3IsIG1vZCwgc2hpZnQpID0+IHtcblx0XHRpZiAobW9kKSBlZGl0b3Iub3B0aW9ucy5vblN1Ym1pdChlZGl0b3IpO1xuXHRcdHJldHVybiBtb2Q7XG5cdH0sXG5cdG9uRXNjYXBlOiAoZWRpdG9yKSA9PiB7XG5cdFx0ZWRpdG9yLm9wdGlvbnMub25CbHVyKGVkaXRvcik7XG5cdH0sXG5cdG9uU3VibWl0OiAoKSA9PiB7fSxcblx0Ly8gTk9URTogQmx1ciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgRXNjYXBlICh0aGlzIGNhbiBiZSBjaGFuZ2VkKVxuXHRvbkJsdXI6ICgpID0+IHt9LFxuXHRvblBhc3RlOiAoKSA9PiB7fSxcblx0b25DaGFuZ2U6ICgpID0+IHt9LFxufTtcblxuZXhwb3J0IGNsYXNzIEVtYmVkZGFibGVNYXJrZG93bkVkaXRvciBleHRlbmRzIHJlc29sdmVFZGl0b3JQcm90b3R5cGUoYXBwKSBpbXBsZW1lbnRzIE1hcmtkb3duU2Nyb2xsYWJsZUVkaXRWaWV3IHtcblx0b3B0aW9uczogTWFya2Rvd25FZGl0b3JQcm9wcztcblx0aW5pdGlhbF92YWx1ZTogc3RyaW5nO1xuXHRzY29wZTogU2NvcGU7XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdCB0aGUgZWRpdG9yXG5cdCAqIEByZW1hcmsgVGFrZXMgNW1zIHRvIGZ1bGx5IGNvbnN0cnVjdCBhbmQgYXR0YWNoXG5cdCAqIEBwYXJhbSBhcHAgLSBSZWZlcmVuY2UgdG8gQXBwIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250YWluZXIgLSBDb250YWluZXIgZWxlbWVudCB0byBhZGQgdGhlIGVkaXRvciB0b1xuXHQgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGNvbnRyb2xpbmcgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGVkaXRvclxuXHQgKi9cblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM6IFBhcnRpYWw8TWFya2Rvd25FZGl0b3JQcm9wcz4pIHtcblx0XHRzdXBlcihhcHAsIGNvbnRhaW5lciwge1xuXHRcdFx0YXBwLFxuXHRcdFx0Ly8gVGhpcyBtb2NrcyB0aGUgTWFya2Rvd25WaWV3IGZ1bmN0aW9ucywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHByb3BlciBmdW5jdGlvbmluZyBvZiBzY3JvbGxpbmdcblx0XHRcdG9uTWFya2Rvd25TY3JvbGw6ICgpID0+IHt9LFxuXHRcdFx0Z2V0TW9kZTogKCkgPT4gXCJzb3VyY2VcIixcblx0XHR9KTtcblx0XHR0aGlzLm9wdGlvbnMgPSB7IC4uLmRlZmF1bHRQcm9wZXJ0aWVzLCAuLi5vcHRpb25zIH07XG5cdFx0dGhpcy5pbml0aWFsX3ZhbHVlID0gdGhpcy5vcHRpb25zLnZhbHVlITtcblx0XHR0aGlzLnNjb3BlID0gbmV3IFNjb3BlKHRoaXMuYXBwLnNjb3BlKTtcblx0XHQvLyBOT1RFOiBDdXN0b20ga2V5cyBjYW4gYmUgYWRkZWQgdG8gdGhlIHNjb3BlIHRvIG92ZXJyaWRlIGRlZmF1bHQgYmVoYXZpb3VyLFxuXHRcdC8vIFx0XHQgcmVtZW1iZXIgdG8gcmV0dXJuIHRydWUgdG8gYWxzbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmcm9tIGV4ZWN1dGluZ1xuXG5cdFx0Ly8gTk9URTogU2luY2UgTW9kK0VudGVyIGlzIGxpbmtlZCB0byB0aGUgXCJPcGVuIGxpbmsgaW4gbmV3IGxlYWZcIiBjb21tYW5kLCBidXQgaXQgaXMgYWxzbyB0aGUgZGVmYXVsdCB1c2VyIGFjdGlvbiBmb3Igc3VibWl0dGluZyB0aGUgZWRpdG9yLFxuXHRcdC8vICAgICAgdGhlIGhvdGtleSBzaG91bGQgYmUgZGlzYWJsZWQgYnkgZWl0aGVyIG92ZXJ3cml0aW5nIGl0IGluIHRoZSBzY29wZSwgb3IgYXBwbHlpbmcgYSBwcmV2ZW50RGVmYXVsdCBpbiB0aGUga2V5bWFwXG5cdFx0Ly8gICAgICB0aGUgc2NvcGUgaXMgdXNlZCB0byBwcmV2ZW50IHRoZSBob3RrZXkgZnJvbSBleGVjdXRpbmcgKGJ5IHJldHVybmluZyBgdHJ1ZWApXG5cdFx0Ly8gVE9ETzogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhbGxvdyBib3RoIGJlaGF2aW91cnMgdG8gY29leGlzdDpcblx0XHQvLyAgICAgMSkgRmV0Y2ggdGhlIGNvbW1hbmQgdmlhIGhvdGtleU1hbmFnZXJcblx0XHQvLyAgICAgMikgRXhlY3V0ZSB0aGUgY29tbWFuZCBjYWxsYmFja1xuXHRcdC8vICAgICAzKSBSZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY2FsbGJhY2sgKGNhbGxiYWNrIHJldHVybnMgZmFsc2UgaWYgY2FsbGJhY2sgY291bGQgbm90IGV4ZWN1dGUpXG5cdFx0Ly8gICAgIFx0XHQoSW4gdGhpcyBjYXNlLCBpZiBjdXJzb3IgaXMgbm90IG9uIGEgbGluayB0b2tlbiwgdGhlIGNhbGxiYWNrIHdpbGwgcmV0dXJuIGZhbHNlLCBhbmQgb25FbnRlciB3aWxsIGJlIGFwcGxpZWQpXG5cdFx0dGhpcy5zY29wZS5yZWdpc3RlcihbXCJNb2RcIl0sIFwiRW50ZXJcIiwgKGUsIGN0eCkgPT4ge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSk7XG5cblx0XHQvLyBTaW5jZSB0aGUgY29tbWFuZHMgZXhwZWN0IHRoYXQgdGhpcyBpcyBhIE1hcmtkb3duVmlldyAod2l0aCBlZGl0TW9kZSBhcyB0aGUgRWRpdG9yIGl0c2VsZiksXG5cdFx0Ly8gICB3ZSBuZWVkIHRvIG1vY2sgdGhpcyBieSBzZXR0aW5nIGJvdGggdGhlIGVkaXRNb2RlIGFuZCBlZGl0b3IgdG8gdGhpcyBpbnN0YW5jZSBhbmQgaXRzIGNvbnRhaW5pbmcgdmlldyByZXNwZWN0aXZlbHlcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIChlZGl0TW9kZSBpcyBub3JtYWxseSBhIE1hcmtkb3duU3ViVmlldylcblx0XHR0aGlzLm93bmVyLmVkaXRNb2RlID0gdGhpcztcblx0XHR0aGlzLm93bmVyLmVkaXRvciA9IHRoaXMuZWRpdG9yO1xuXG5cdFx0dGhpcy5zZXQob3B0aW9ucy52YWx1ZSB8fCBcIlwiLCB0cnVlKTtcblx0XHR0aGlzLnJlZ2lzdGVyKFxuXHRcdFx0YXJvdW5kKHRoaXMuYXBwLndvcmtzcGFjZSwge1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIChJbmNvcnJlY3RseSBtYXRjaGVzIHRoZSBkZXByZWNhdGVkIHNldEFjdGl2ZUxlYWYgbWV0aG9kKVxuXHRcdFx0XHRzZXRBY3RpdmVMZWFmOlxuXHRcdFx0XHRcdChvbGRNZXRob2Q6IChsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwYXJhbXM/OiB7IGZvY3VzPzogYm9vbGVhbiB9KSA9PiB2b2lkKSA9PlxuXHRcdFx0XHRcdChsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwYXJhbXM6IHsgZm9jdXM/OiBib29sZWFuIH0pID0+IHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBlZGl0b3IgaXMgY3VycmVudGx5IGZvY3VzZWQsIHByZXZlbnQgdGhlIHdvcmtzcGFjZSBzZXR0aW5nIHRoZSBmb2N1cyB0byBhIHdvcmtzcGFjZUxlYWYgaW5zdGVhZFxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLmFjdGl2ZUNNLmhhc0ZvY3VzKVxuXHRcdFx0XHRcdFx0XHRvbGRNZXRob2QuY2FsbCh0aGlzLmFwcC53b3Jrc3BhY2UsIGxlYWYsIHBhcmFtcyk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdH0pLFxuXHRcdCk7XG5cblx0XHQvLyBFeGVjdXRlIG9uQmx1ciB3aGVuIHRoZSBlZGl0b3IgbG9zZXMgZm9jdXNcblx0XHQvLyBOT1RFOiBBcHBhcmVudGx5IENocm9tZSBkb2VzIGEgd2VpcmQgdGhpbmcgd2hlcmUgcmVtb3ZpbmcgYW4gZWxlbWVudCBmcm9tIHRoZSBET00gdHJpZ2dlcnMgYSBibHVyIGV2ZW50XG5cdFx0Ly8gXHRcdCAoSGVuY2Ugd2h5IHRoZSAuX2xvYWRlZCBjaGVjayBpcyBuZWNlc3NhcnkpXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5vbkJsdXIgIT09IGRlZmF1bHRQcm9wZXJ0aWVzLm9uQmx1cikge1xuXHRcdFx0dGhpcy5lZGl0b3I/LmNtLmNvbnRlbnRET00uYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5fbG9hZGVkKSB0aGlzLm9wdGlvbnMub25CbHVyKHRoaXMpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbmV2ZXIgdGhlIGVkaXRvciBpcyBmb2N1c2VkLCBzZXQgdGhlIGFjdGl2ZUVkaXRvciB0byB0aGUgbW9ja2VkIHZpZXcgKHRoaXMub3duZXIpXG5cdFx0Ly8gVGhpcyBhbGxvd3MgZm9yIHRoZSBlZGl0b3JDb21tYW5kcyB0byBhY3R1YWxseSB3b3JrXG5cdFx0dGhpcy5lZGl0b3I/LmNtLmNvbnRlbnRET00uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5hcHAua2V5bWFwLnB1c2hTY29wZSh0aGlzLnNjb3BlKTtcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVFZGl0b3IgPSB0aGlzLm93bmVyO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5lZGl0b3JFbC5jbGFzc0xpc3QucmVtb3ZlKFwibWFya2Rvd24tc291cmNlLXZpZXdcIik7XG5cblx0XHRpZiAob3B0aW9ucy5jbHMpIHRoaXMuZWRpdG9yRWwuY2xhc3NMaXN0LmFkZChvcHRpb25zLmNscyk7XG5cdFx0aWYgKG9wdGlvbnMuY3Vyc29yTG9jYXRpb24pIHtcblx0XHRcdHRoaXMuZWRpdG9yPy5jbS5kaXNwYXRjaCh7XG5cdFx0XHRcdHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKG9wdGlvbnMuY3Vyc29yTG9jYXRpb24uYW5jaG9yLCBvcHRpb25zLmN1cnNvckxvY2F0aW9uLmhlYWQpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0b25VcGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlLCBjaGFuZ2VkOiBib29sZWFuKSB7XG5cdFx0c3VwZXIub25VcGRhdGUodXBkYXRlLCBjaGFuZ2VkKTtcblx0XHRpZiAoY2hhbmdlZCkgdGhpcy5vcHRpb25zLm9uQ2hhbmdlKHVwZGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29uc3RydWN0cyBsb2NhbCAoYWx3YXlzIGFjdGl2ZSkgZXh0ZW5zaW9ucyBmb3IgdGhlIGVkaXRvclxuXHQgKiBAcmVtYXJrIE90aGVyIHBsdWdpbnMgd2lsbCBub3QgYmUgYWJsZSB0byBzZW5kIGRpcmVjdCB1cGRhdGVzIHRvIHRoZXNlIGV4dGVuc2lvbnMgdG8gY2hhbmdlIGNvbmZpZ3VyYXRpb25zXG5cdCAqIEB0dXRvcmlhbCBnZXREeW5hbWljRXh0ZW5zaW9ucyBpcyB1c2VkIHRvIGFkZCBleHRlbnNpb25zIHRoYXQgc2hvdWxkIGJlIGR5bmFtaWNhbGx5IHVwZGF0ZWRcblx0ICovXG5cdGJ1aWxkTG9jYWxFeHRlbnNpb25zKCk6IEV4dGVuc2lvbltdIHtcblx0XHRjb25zdCBleHRlbnNpb25zID0gc3VwZXIuYnVpbGRMb2NhbEV4dGVuc2lvbnMoKTtcblx0XHRpZiAodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSBleHRlbnNpb25zLnB1c2gocGxhY2Vob2xkZXIodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSk7XG5cblx0XHQvKiBFZGl0b3IgZXh0ZW5zaW9uIGZvciBoYW5kbGluZyBzcGVjaWZpYyB1c2VyIGlucHV0cyAqL1xuXHRcdGV4dGVuc2lvbnMucHVzaChFZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xuXHRcdFx0cGFzdGU6IChldmVudCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9wdGlvbnMub25QYXN0ZShldmVudCwgdGhpcyk7XG5cdFx0XHR9LFxuXHRcdH0pKTtcblx0XHRleHRlbnNpb25zLnB1c2goUHJlYy5oaWdoZXN0KGtleW1hcC5vZihbXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJFbnRlclwiLFxuXHRcdFx0XHRydW46IChjbSkgPT4gdGhpcy5vcHRpb25zLm9uRW50ZXIodGhpcywgZmFsc2UsIGZhbHNlKSxcblx0XHRcdFx0c2hpZnQ6IChjbSkgPT4gdGhpcy5vcHRpb25zLm9uRW50ZXIodGhpcywgZmFsc2UsIHRydWUpLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0a2V5OiBcIk1vZC1FbnRlclwiLFxuXHRcdFx0XHRydW46IChjbSkgPT4gdGhpcy5vcHRpb25zLm9uRW50ZXIodGhpcywgdHJ1ZSwgZmFsc2UpLFxuXHRcdFx0XHRzaGlmdDogKGNtKSA9PiB0aGlzLm9wdGlvbnMub25FbnRlcih0aGlzLCB0cnVlLCB0cnVlKSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJFc2NhcGVcIixcblx0XHRcdFx0cnVuOiAoY20pID0+IHtcblx0XHRcdFx0XHR0aGlzLm9wdGlvbnMub25Fc2NhcGUodGhpcyk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHByZXZlbnREZWZhdWx0OiB0cnVlLFxuXHRcdFx0fSxcblx0XHRdKSkpO1xuXG5cdFx0LyogQWRkaXRpb25hbCBFZGl0b3IgZXh0ZW5zaW9ucyAocmVuZGVyZXJzLCAuLi4pICovXG5cblx0XHRyZXR1cm4gZXh0ZW5zaW9ucztcblx0fVxuXG5cdGdldER5bmFtaWNFeHRlbnNpb25zKCk6IEV4dGVuc2lvbltdIHtcblx0XHRyZXR1cm4gc3VwZXIuZ2V0RHluYW1pY0V4dGVuc2lvbnMoKVxuXHRcdFx0LmZpbHRlcihleHQgPT4gIXRoaXMub3B0aW9ucy5maWx0ZXJlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0KSk7XG5cdH1cblxuXHQvKipcblx0ICogRm9yY2Ugbm8gcGFkZGluZyBvbiB0aGUgYm90dG9tIG9mIHRoZSBlZGl0b3Jcblx0ICovXG5cdHVwZGF0ZUJvdHRvbVBhZGRpbmcoaGVpZ2h0OiBudW1iZXIpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbnN1cmUgdGhhdCB0aGUgZWRpdG9yIGlzIHByb3Blcmx5IGRlc3Ryb3llZCB3aGVuIHRoZSB2aWV3IGlzIGNsb3NlZFxuXHQgKi9cblx0ZGVzdHJveSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fbG9hZGVkKVxuXHRcdFx0dGhpcy51bmxvYWQoKTtcblx0XHR0aGlzLmFwcC5rZXltYXAucG9wU2NvcGUodGhpcy5zY29wZSk7XG5cdFx0aWYgKHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVFZGl0b3IgPT09IHRoaXMub3duZXIpXG5cdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlRWRpdG9yID0gbnVsbDtcblx0XHR0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gcmVtb3ZpbmcgYXMgYSBjb21wb25lbnQsIGRlc3Ryb3kgd2lsbCBhbHNvIGdldCBpbnZva2VkXG5cdCAqL1xuXHRvbnVubG9hZCgpIHtcblx0XHRzdXBlci5vbnVubG9hZCgpO1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gZmluaXNoZWQgbG9hZGluZywgdGFrZSBmb2N1c1xuXHQgKi9cblx0b25sb2FkKCkge1xuXHRcdHN1cGVyLm9ubG9hZCgpO1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuZm9jdXMpIHRoaXMuZWRpdG9yPy5mb2N1cygpO1xuXHR9XG59XG4iLCAiZnVuY3Rpb24gYXJvdW5kKG9iaiwgZmFjdG9yaWVzKSB7XG4gIGNvbnN0IHJlbW92ZXJzID0gT2JqZWN0LmtleXMoZmFjdG9yaWVzKS5tYXAoKGtleSkgPT4gYXJvdW5kMShvYmosIGtleSwgZmFjdG9yaWVzW2tleV0pKTtcbiAgcmV0dXJuIHJlbW92ZXJzLmxlbmd0aCA9PT0gMSA/IHJlbW92ZXJzWzBdIDogZnVuY3Rpb24oKSB7XG4gICAgcmVtb3ZlcnMuZm9yRWFjaCgocikgPT4gcigpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGFyb3VuZDEob2JqLCBtZXRob2QsIGNyZWF0ZVdyYXBwZXIpIHtcbiAgY29uc3QgaW5oZXJpdGVkID0gb2JqW21ldGhvZF0sIGhhZE93biA9IG9iai5oYXNPd25Qcm9wZXJ0eShtZXRob2QpLCBvcmlnaW5hbCA9IGhhZE93biA/IGluaGVyaXRlZCA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKVttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG4gIGxldCBjdXJyZW50ID0gY3JlYXRlV3JhcHBlcihvcmlnaW5hbCk7XG4gIGlmIChpbmhlcml0ZWQpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGN1cnJlbnQsIGluaGVyaXRlZCk7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZih3cmFwcGVyLCBjdXJyZW50KTtcbiAgb2JqW21ldGhvZF0gPSB3cmFwcGVyO1xuICByZXR1cm4gcmVtb3ZlO1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gb3JpZ2luYWwgJiYgb2JqW21ldGhvZF0gPT09IHdyYXBwZXIpXG4gICAgICByZW1vdmUoKTtcbiAgICByZXR1cm4gY3VycmVudC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgaWYgKG9ialttZXRob2RdID09PSB3cmFwcGVyKSB7XG4gICAgICBpZiAoaGFkT3duKVxuICAgICAgICBvYmpbbWV0aG9kXSA9IG9yaWdpbmFsO1xuICAgICAgZWxzZVxuICAgICAgICBkZWxldGUgb2JqW21ldGhvZF07XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID09PSBvcmlnaW5hbClcbiAgICAgIHJldHVybjtcbiAgICBjdXJyZW50ID0gb3JpZ2luYWw7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHdyYXBwZXIsIGluaGVyaXRlZCB8fCBGdW5jdGlvbik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZHVwZShrZXksIG9sZEZuLCBuZXdGbikge1xuICBjaGVja1trZXldID0ga2V5O1xuICByZXR1cm4gY2hlY2s7XG4gIGZ1bmN0aW9uIGNoZWNrKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gKG9sZEZuW2tleV0gPT09IGtleSA/IG9sZEZuIDogbmV3Rm4pLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBhZnRlcihwcm9taXNlLCBjYikge1xuICByZXR1cm4gcHJvbWlzZS50aGVuKGNiLCBjYik7XG59XG5mdW5jdGlvbiBzZXJpYWxpemUoYXN5bmNGdW5jdGlvbikge1xuICBsZXQgbGFzdFJ1biA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbGFzdFJ1biA9IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgYWZ0ZXIobGFzdFJ1biwgKCkgPT4ge1xuICAgICAgICBhc3luY0Z1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4ocmVzLCByZWopO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgd3JhcHBlci5hZnRlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBsYXN0UnVuID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICBhZnRlcihsYXN0UnVuLCByZXMpO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZXhwb3J0IHsgYWZ0ZXIsIGFyb3VuZCwgZGVkdXBlLCBzZXJpYWxpemUgfTtcbiIsICJpbXBvcnQgeyBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuL2VkaXRvci9iYXNlXCI7XG5pbXBvcnQge1xuXHRFZGl0TW9kZSxcblx0dHlwZSBQbHVnaW5TZXR0aW5ncyxcblx0UHJldmlld01vZGUsXG5cdFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLFxuXHRSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgUExVR0lOX1ZFUlNJT04gPSBcIjAuMi4zXCI7XG5leHBvcnQgY29uc3QgREFUQUJBU0VfVkVSU0lPTiA9IDQ7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBQbHVnaW5TZXR0aW5ncyA9IHtcblx0dmVyc2lvbjogUExVR0lOX1ZFUlNJT04sXG5cblx0ZGVmYXVsdF9lZGl0X21vZGU6IEVkaXRNb2RlLkNPUlJFQ1RFRCxcblx0ZGVmYXVsdF9wcmV2aWV3X21vZGU6IFByZXZpZXdNb2RlLkFMTCxcblx0Y29tbWVudF9zdHlsZTogXCJpY29uXCIsXG5cdGVkaXRvcl9zdHlsaW5nOiBmYWxzZSxcblx0bWFya3VwX2ZvY3VzOiB7XG5cdFx0W0VkaXRNb2RlLk9GRl06IHtcblx0XHRcdHNob3dfc3R5bGluZzogdHJ1ZSxcblx0XHRcdHNob3dfc3ludGF4OiB0cnVlLFxuXHRcdFx0c2hvd19tZXRhZGF0YTogdHJ1ZSxcblx0XHRcdGZvY3VzX2Fubm90YXRpb246IHRydWUsXG5cdFx0XHRzaG93X2NvbW1lbnQ6IHRydWUsXG5cdFx0fSxcblx0XHRbRWRpdE1vZGUuQ09SUkVDVEVEXToge1xuXHRcdFx0c2hvd19zdHlsaW5nOiB0cnVlLFxuXHRcdFx0c2hvd19zeW50YXg6IGZhbHNlLFxuXHRcdFx0c2hvd19tZXRhZGF0YTogZmFsc2UsXG5cdFx0XHRmb2N1c19hbm5vdGF0aW9uOiB0cnVlLFxuXHRcdFx0c2hvd19jb21tZW50OiBmYWxzZSxcblx0XHR9LFxuXHRcdFtFZGl0TW9kZS5TVUdHRVNUXToge1xuXHRcdFx0c2hvd19zdHlsaW5nOiB0cnVlLFxuXHRcdFx0c2hvd19zeW50YXg6IGZhbHNlLFxuXHRcdFx0c2hvd19tZXRhZGF0YTogZmFsc2UsXG5cdFx0XHRmb2N1c19hbm5vdGF0aW9uOiB0cnVlLFxuXHRcdFx0c2hvd19jb21tZW50OiBmYWxzZSxcblx0XHR9LFxuXHR9LFxuXG5cdGRpZmZfZ3V0dGVyOiB0cnVlLFxuXHRkaWZmX2d1dHRlcl9oaWRlX2VtcHR5OiB0cnVlLFxuXG5cdGFubm90YXRpb25fZ3V0dGVyOiB0cnVlLFxuXHRhbm5vdGF0aW9uX2d1dHRlcl9pbmNsdWRlZF90eXBlczogMzEsXG5cdGFubm90YXRpb25fZ3V0dGVyX2hpZGVfZW1wdHk6IHRydWUsXG5cdGFubm90YXRpb25fZ3V0dGVyX2RlZmF1bHRfZm9sZF9zdGF0ZTogZmFsc2UsXG5cdGFubm90YXRpb25fZ3V0dGVyX2ZvbGRfYnV0dG9uOiB0cnVlLFxuXHRhbm5vdGF0aW9uX2d1dHRlcl9yZXNpemVfaGFuZGxlOiB0cnVlLFxuXHRhbm5vdGF0aW9uX2d1dHRlcl9mb2N1c19vbl9jbGljazogdHJ1ZSxcblx0YW5ub3RhdGlvbl9ndXR0ZXJfd2lkdGg6IDMwMCxcblxuXHR0YWdfY29tcGxldGlvbjogdHJ1ZSxcblx0dGFnX2NvcnJlY3RlcjogdHJ1ZSxcblx0Y2xpcGJvYXJkX3JlbW92ZV9zeW50YXg6IHRydWUsXG5cdGVkaXRfaW5mbzogdHJ1ZSxcblxuXHR0b29sYmFyX3ByZXZpZXdfYnV0dG9uOiB0cnVlLFxuXHR0b29sYmFyX2VkaXRfYnV0dG9uOiB0cnVlLFxuXHR0b29sYmFyX3Nob3dfYnV0dG9uc19sYWJlbHM6IHRydWUsXG5cblx0c3RhdHVzX2Jhcl9wcmV2aWV3X2J1dHRvbjogdHJ1ZSxcblx0c3RhdHVzX2Jhcl9lZGl0X2J1dHRvbjogdHJ1ZSxcblx0c3RhdHVzX2Jhcl9tZXRhZGF0YV9idXR0b246IHRydWUsXG5cblx0ZGF0YWJhc2Vfd29ya2VyczogMixcblxuXHRwb3N0X3Byb2Nlc3NvcjogdHJ1ZSxcblx0bGl2ZV9wcmV2aWV3OiB0cnVlLFxuXHRhbHRlcm5hdGl2ZV9jdXJzb3JfbW92ZW1lbnQ6IHRydWUsXG5cblx0ZW5hYmxlX21ldGFkYXRhOiBmYWxzZSxcblx0ZW5hYmxlX2F1dGhvcl9tZXRhZGF0YTogZmFsc2UsXG5cdGVuYWJsZV90aW1lc3RhbXBfbWV0YWRhdGE6IGZhbHNlLFxuXHRlbmFibGVfY29tcGxldGVkX21ldGFkYXRhOiBmYWxzZSxcblx0ZW5hYmxlX3N0eWxlX21ldGFkYXRhOiBmYWxzZSxcblx0ZW5hYmxlX2NvbG9yX21ldGFkYXRhOiBmYWxzZSxcblxuXHRhZGRfbWV0YWRhdGE6IGZhbHNlLFxuXHRhZGRfYXV0aG9yX21ldGFkYXRhOiBmYWxzZSxcblx0YWRkX3RpbWVzdGFtcF9tZXRhZGF0YTogZmFsc2UsXG5cdGFkZF9jb21wbGV0ZWRfbWV0YWRhdGE6IGZhbHNlLFxuXHRhZGRfc3R5bGVfbWV0YWRhdGE6IGZhbHNlLFxuXHRhZGRfY29sb3JfbWV0YWRhdGE6IGZhbHNlLFxuXG5cdGF1dGhvcjogXCJcIixcblxuXHRzdWdnZXN0aW9uX21vZGVfb3BlcmF0aW9uczoge1xuXHRcdGN1cnNvcl9tb3ZlbWVudDoge1xuXHRcdFx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfTUVUQURBVEEsXG5cdFx0XHRbU3VnZ2VzdGlvblR5cGUuREVMRVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0XHRcdFtTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0XHRcdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0XHRcdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfQ09NUExFVEVMWSxcblx0XHR9LFxuXHRcdGJyYWNrZXRfbW92ZW1lbnQ6IHtcblx0XHRcdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFLFxuXHRcdFx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFx0XHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFx0XHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFx0XHRbU3VnZ2VzdGlvblR5cGUuQ09NTUVOVF06IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFLFxuXHRcdH0sXG5cdH0sXG59O1xuXG5leHBvcnQgY29uc3QgUkVRVUlSRVNfRlVMTF9SRUxPQUQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldChbXG5cdFwibGl2ZV9wcmV2aWV3XCIsXG5cdFwiZGlmZl9ndXR0ZXJcIixcblx0XCJhbm5vdGF0aW9uX2d1dHRlclwiLFxuXHRcImFubm90YXRpb25fZ3V0dGVyX2ZvY3VzX29uX2NsaWNrXCIsXG5cdFwiY29tbWVudF9zdHlsZVwiLFxuXHRcInRhZ19jb21wbGV0aW9uXCIsXG5cdFwidGFnX2NvcnJlY3RlclwiLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBSRVFVSVJFU19FRElUT1JfUkVMT0FEOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuXHRcImVuYWJsZV9tZXRhZGF0YVwiLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBSRVFVSVJFU19EQVRBQkFTRV9SRUlOREVYOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuXHRcImVuYWJsZV9tZXRhZGF0YVwiLFxuXSk7XG5cbmV4cG9ydCBlbnVtIEFubm90YXRpb25JbmNsdXNpb25UeXBlIHtcblx0QURESVRJT04gPSAxIDw8IDAsXG5cdERFTEVUSU9OID0gMSA8PCAxLFxuXHRTVUJTVElUVVRJT04gPSAxIDw8IDIsXG5cdEhJR0hMSUdIVCA9IDEgPDwgMyxcblx0Q09NTUVOVCA9IDEgPDwgNCxcbn1cbiIsICJpbXBvcnQge01hcmtkb3duVmlldywgTWVudSwgTWVudUl0ZW0sIHR5cGUgUGx1Z2lufSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7YXJvdW5kfSBmcm9tIFwibW9ua2V5LWFyb3VuZFwiO1xuXG4vKipcbiAqIEtlZXAgdGhlIGNvbnRleHQgbWVudSBvcGVuIGFmdGVyIGNsaWNraW5nIG9uIGEgbWVudSBpdGVtLlxuICogQHBhcmFtIG9uU3VibWVudSAtIE9ubHkga2VlcCB0aGUgbWVudSBvcGVuIGlmIHRoZSBpdGVtIGlzIGEgc3VibWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0aWNreUNvbnRleHRNZW51UGF0Y2ggPSAob25TdWJtZW51ID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBwYXRjaCA9IGFyb3VuZChNZW51LnByb3RvdHlwZSwge1xuICAgICAgICBvbkVudGVyOiAob2xkTWV0aG9kKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogTWVudSwgZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuaXRlbXNbdGhpcy5zZWxlY3RlZF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSAmJiBzZWxlY3RlZEl0ZW0gaW5zdGFuY2VvZiBNZW51SXRlbSAmJiAoc2VsZWN0ZWRJdGVtLmhhbmRsZUV2ZW50KGUpKSB8fCB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25NZW51Q2xpY2s6IChvbGRNZXRob2QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBNZW51LCBlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvblN1Ym1lbnUgfHwgdGhpcy5jdXJyZW50U3VibWVudSAmJiB0aGlzLmN1cnJlbnRTdWJtZW51LmRvbS5jb250YWlucyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkTWV0aG9kICYmIG9sZE1ldGhvZC5hcHBseSh0aGlzLCBbZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyByZXR1cm4gKCkgPT4ge307XG4gICAgICAgIH0sXG4gICAgICAgIGhpZGU6IChvbGRNZXRob2QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBNZW51KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmVudE1lbnUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9sZE1ldGhvZCAmJiBvbGRNZXRob2QuYXBwbHkodGhpcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBwYXRjaDtcbn1cblxuLyoqXG4gKiBUaGlzIHBhdGNoIGV4dGVuZHMgdGhlIE1hcmtkb3duVmlldyB0byBzeW5jaHJvbml6ZSBjb25maWcgdmFsdWVzIGFkZGVkIGJ5IHlvdXIgcGx1Z2luIHRvIHRoZSBwZXJzaXN0ZW50IHN0YXRlLlxuICogSXQgYWxzbyBlbnN1cmVzIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBjb3JyZWN0bHkgc2V0IHRvIHRoZSBlZGl0b3IgX2JlZm9yZV8gaXQgaXMgKHJlKWluaXRpYWxpemVkLlxuICogQHBhcmFtIHNldFN0YXRlIC0gR2V0IHBlcnNpc3RlZCB2YWx1ZXMgZnJvbSB0aGUgc3RhdGUgYW5kIGxvYWQgdGhlbSBpbnRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gZ2V0U3RhdGUgLSBHZXQgY3VycmVudCB2YWx1ZXMgZnJvbSB0aGUgdmlldyBhbmQgc3RvcmUgaW4gdGhlIHN0YXRlXG4gKiBAcGFyYW0gYmVmb3JlRWRpdG9yUmVsb2FkIC0gU3luY2hyb25pemUgdmFsdWVzIGZyb20gc3RhdGUgYmVmb3JlIHRoZSBjb2RlbWlycm9yIGluc3RhbmNlIGlzIGluaXRpYWxpemVkXG4gKiBAcGFyYW0gYWZ0ZXJFZGl0b3JSZWxvYWQgLSBTeW5jaHJvbml6ZSB2YWx1ZXMgZnJvbSBzdGF0ZSBhZnRlciB0aGUgY29kZW1pcnJvciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZFxuICogQHJlbWFya3MgQW55IHN0YXRlIHZhbHVlcyBzZXQgYnkgdGhpcyBwYXRjaCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbmNlIHRoaXMgcGF0Y2ggaXMgdW5pbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jTWFya2Rvd25WaWV3Q3VzdG9tU3RhdGVQYXRjaCA9IChcbiAgICBzZXRTdGF0ZTogKHZpZXc6IE1hcmtkb3duVmlldywgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAgICBnZXRTdGF0ZTogKHZpZXc6IE1hcmtkb3duVmlldywgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkLFxuICAgIGJlZm9yZUVkaXRvclJlbG9hZDogKHZpZXc6IE1hcmtkb3duVmlldykgPT4gdm9pZCxcbiAgICBhZnRlckVkaXRvclJlbG9hZDogKHZpZXc6IE1hcmtkb3duVmlldykgPT4gdm9pZCA9ICgpID0+IHt9XG4pID0+IHtcbiAgICByZXR1cm4gYXJvdW5kKE1hcmtkb3duVmlldy5wcm90b3R5cGUsIHtcbiAgICAgICAgc2V0U3RhdGU6IChvbGRNZXRob2QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAodGhpczogTWFya2Rvd25WaWV3LCAuLi5hcmdzKXtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXRTdGF0ZSh0aGlzLCBhcmdzWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9sZE1ldGhvZCAmJiBvbGRNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0U3RhdGU6IChvbGRNZXRob2QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogTWFya2Rvd25WaWV3KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBvbGRNZXRob2QgJiYgb2xkTWV0aG9kLmFwcGx5KHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBnZXRTdGF0ZSh0aGlzLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvLyBFWFBMOiBDYWxsZWQgb24gZXZlcnkgZmlsZSBjaGFuZ2UsIHBhcnRpY3VsYXJseSBob3QgcGF0aCBjb2RlXG4gICAgICAgIC8vXHRcdCBJZiBjbGVhciBpcyBlbmFibGVkLCB0aGUgZXh0ZW5zaW9ucyB3aWxsIGJlIHJlbG9hZGVkIChndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzKVxuICAgICAgICBzZXREYXRhOiAob2xkTWV0aG9kKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1hcmtkb3duVmlldywgLi4uYXJncykge1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IENoZWNraW5nIHZpYSBhcmdzWzFdIChgY2xlYXJgKSB3aWxsIG9ubHkgZXhlY3V0ZSBzeW5jU3RhdGUgaWYgdGhlIGZpbGUgaXMgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGlmIChhcmdzWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUVkaXRvclJlbG9hZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb2xkTWV0aG9kICYmIG9sZE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBhZnRlckVkaXRvclJlbG9hZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gTk9URTogQWx0ZXJuYXRpdmUgdGhhdCBpcyBvbmx5IGNhbGxlZCB3aGVuIGZpbGUgaXMgY2hhbmdlZCwgYnV0IGlzIG5vdCBzeW5jaHJvbm91c1xuICAgICAgICAvLyBsb2FkRmlsZTogKG9sZE1ldGhvZCkgPT4ge1xuICAgICAgICAvLyBcdHJldHVybiBhc3luYyBmdW5jdGlvbiAodGhpczogTWFya2Rvd25WaWV3LCAuLi5hcmdzKSB7XG4gICAgICAgIC8vIFx0XHRpZiAocGx1Z2luLmFubm90YXRpb25fZ3V0dGVyX2NvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFx0XHRcdHBsdWdpbi5hbm5vdGF0aW9uX2d1dHRlcl9jb25maWcud2lkdGggPSB0aGlzLmVkaXRNb2RlLmFubm90YXRpb25HdXR0ZXJXaWR0aDtcbiAgICAgICAgLy8gXHRcdFx0cGx1Z2luLmFubm90YXRpb25fZ3V0dGVyX2NvbmZpZy5mb2xkU3RhdGUgPSB0aGlzLmVkaXRNb2RlLmFubm90YXRpb25HdXR0ZXJGb2xkZWQ7XG4gICAgICAgIC8vIFx0XHR9XG4gICAgICAgIC8vIFx0XHRjb25zdCBvdXRwdXQgPSBvbGRNZXRob2QgJiYgYXdhaXQgb2xkTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAvLyBcdFx0Ly8gRVhQTDogRW5zdXJlcyB0aGF0IGNvcnJlY3QgY29uZmlnIGlzIGFsd2F5cyBjb3JyZWN0bHkgY29tbXVuaWNhdGVkIHRvIHRoZSBndXR0ZXIsXG4gICAgICAgIC8vIFx0XHQvL1x0XHQgZXZlbiBpZiBzaGFyZWQgY29uZmlnIGFib3ZlIGlzIG92ZXJyaWRkZW5cbiAgICAgICAgLy8gXHRcdC8vIE5PVEU6IElmIHZpZXcgaXMgdmlzaWJsZSBhbmQgY29uZmlnIHZhbHVlIGRpZmZlcmVudCwgdGhlIGd1dHRlciBfd2lsbF8gYW5pbWF0ZSB0byBuZXcgc3RhdGVcbiAgICAgICAgLy8gXHRcdC8vICAgICAgIFJlYWxpc3RpY2FsbHksIHRoaXMgaXMgb25seSBhbiBpc3N1ZSB3aGVuIGxvYWRpbmcgYSBzcGVjaWZpYyB3b3Jrc3BhY2Ugd2hlbiBhcHAgaXMgbG9hZGVkXG4gICAgICAgIC8vIFx0XHR0aGlzLmVkaXRNb2RlLmNtLmRpc3BhdGNoKHtcbiAgICAgICAgLy8gXHRcdFx0YW5ub3RhdGlvbnM6IFtcbiAgICAgICAgLy8gXHRcdFx0XHRhbm5vdGF0aW9uR3V0dGVyV2lkdGhBbm5vdGF0aW9uLm9mKHRoaXMuZWRpdE1vZGUuYW5ub3RhdGlvbkd1dHRlcldpZHRoKSxcbiAgICAgICAgLy8gXHRcdFx0XHRhbm5vdGF0aW9uR3V0dGVyRm9sZEFubm90YXRpb24ub2YodGhpcy5lZGl0TW9kZS5hbm5vdGF0aW9uR3V0dGVyRm9sZGVkKSxcbiAgICAgICAgLy8gXHRcdFx0XVxuICAgICAgICAvLyBcdFx0fSk7XG4gICAgICAgIC8vIFx0XHRyZXR1cm4gb3V0cHV0O1xuICAgICAgICAvLyBcdH1cbiAgICAgICAgLy8gfSxcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUaGlzIHBhdGNoIGhvb2tzIGludG8gdGhlIFBsdWdpbnMgY2xhc3MsIGFuZCBleGVjdXRlcyBmdW5jdGlvbmFsaXR5IGJlZm9yZSB0aGUgcGx1Z2luIGlzIHVuaW5zdGFsbGVkIHZpYSB0aGUgVUkuXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIENvbW1lbnRhdG9yIHBsdWdpbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGJlIHVuaW5zdGFsbGVkLlxuICogQHBhcmFtIGNiIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgcGx1Z2luIGlzIHVuaW5zdGFsbGVkLlxuICogQHJlbWFya3MgSWYgdGhlIHBsdWdpbiBnZXRzIHVuaW5zdGFsbGVkIHZpYSBhbnkgb3RoZXIgd2F5IChlLmcuIGZpbGUgc3lzdGVtIGRlbGV0aW9uLCBjdXN0b20gcGx1Z2luIEFQSSwgLi4uKSxcbiAqICAgICAgICAgIG5vIGd1YXJhbnRlZXMgY2FuIGJlIG1hZGUgdGhhdCB0aGUgZnVuY3Rpb25hbGl0eSB3aWxsIGJlIGV4ZWN1dGVkLlxuICovXG5leHBvcnQgY29uc3QgYmVmb3JlUGx1Z2luVW5pbnN0YWxsUGF0Y2ggPSAocGx1Z2luOiBQbHVnaW4sIGlkOiBzdHJpbmcsIGNiOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgPT4ge1xuICAgIHJldHVybiBhcm91bmQocGx1Z2luLmFwcC5wbHVnaW5zLCB7XG4gICAgICAgIHVuaW5zdGFsbFBsdWdpbjogKG9sZE1ldGhvZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhIHNhZmUgY2hlY2ssIGlmIHNvbWV0aGluZyBjaGFuZ2VzIGluIHRoZSBmdXR1cmUsIHRoaXMgd2lsbCBqdXN0IGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGJlZm9yZVBsdWdpblVuaW5zdGFsbFBhdGNoIGNhbGxiYWNrOlwiLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2xkTWV0aG9kICYmIGF3YWl0IG9sZE1ldGhvZC5hcHBseShwbHVnaW4uYXBwLnBsdWdpbnMsIGFyZ3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuIiwgImltcG9ydCB7IEVkaXRvclZpZXcsIFdpZGdldFR5cGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIE1hcmtkb3duUmVuZGVyZXIsIE1lbnUsIHNldEljb24gfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgQ09NTUVOVEFUT1JfR0xPQkFMIH0gZnJvbSBcIi4uLy4uLy4uL2dsb2JhbFwiO1xuaW1wb3J0IHsgYWRkQ29tbWVudFRvVmlldywgQ01fQWxsX0JyYWNrZXRzLCBDb21tZW50UmFuZ2UsIENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCB7IGFubm90YXRpb25HdXR0ZXJGb2N1c0Fubm90YXRpb24gfSBmcm9tIFwiLi4vZ3V0dGVycy9hbm5vdGF0aW9ucy1ndXR0ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckNvbW1lbnRXaWRnZXQocmFuZ2U6IENvbW1lbnRSYW5nZSwgdGV4dD86IHN0cmluZywgdW53cmFwID0gZmFsc2UpIHtcblx0bGV0IHN0ciA9IHRleHQgPz8gcmFuZ2UudGV4dDtcblx0aWYgKCF0ZXh0ICYmIHVud3JhcCkge1xuXHRcdGlmIChyYW5nZS50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW3JhbmdlLnR5cGVdLmF0KC0xKSEpKVxuXHRcdFx0c3RyID0gcmFuZ2UudW53cmFwX2JyYWNrZXQodHJ1ZSk7XG5cdFx0ZWxzZVxuXHRcdFx0c3RyID0gcmFuZ2UudW53cmFwKCk7XG5cdH1cblxuXHRjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdGljb24uY2xhc3NMaXN0LmFkZChcImNtdHItY29tbWVudC1pY29uXCIpO1xuXHRzZXRJY29uKGljb24sIFwibWVzc2FnZS1zcXVhcmVcIik7XG5cdGxldCB0b29sdGlwOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXHRjb25zdCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7XG5cdGljb24ub25tb3VzZWVudGVyID0gKCkgPT4ge1xuXHRcdGlmICh0b29sdGlwKSByZXR1cm47XG5cblx0XHR0b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0b29sdGlwLmNsYXNzTGlzdC5hZGQoXCJjbXRyLWNvbW1lbnQtdG9vbHRpcFwiKTtcblx0XHRNYXJrZG93blJlbmRlcmVyLnJlbmRlcihDT01NRU5UQVRPUl9HTE9CQUwuYXBwLCBzdHIsIHRvb2x0aXAsIFwiXCIsIGNvbXBvbmVudCk7XG5cdFx0Y29tcG9uZW50LmxvYWQoKTtcblx0XHRpY29uIS5hcHBlbmRDaGlsZCh0b29sdGlwKTtcblxuXHRcdC8vIFNldCB0b29sdGlwIHBvc2l0aW9uXG5cdFx0Y29uc3QgaWNvbl9yZWN0ID0gaWNvbiEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgdG9vbHRpcF9yZWN0ID0gdG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR0b29sdGlwLnN0eWxlLmxlZnQgPSBpY29uX3JlY3QueCAtIHRvb2x0aXBfcmVjdC54ICsgMTIgKyBcInB4XCI7XG5cdH07XG5cblx0aWNvbi5vbm1vdXNlbGVhdmUgPSAoKSA9PiB7XG5cdFx0aWYgKHRvb2x0aXApIHtcblx0XHRcdGNvbXBvbmVudC51bmxvYWQoKTtcblx0XHRcdGljb24hLnJlbW92ZUNoaWxkKHRvb2x0aXAhKTtcblx0XHRcdHRvb2x0aXAgPSBudWxsO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gaWNvbjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1lbnRJY29uV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG5cdHRvb2x0aXA6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cdGljb246IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cblx0Y29tcG9uZW50OiBDb21wb25lbnQ7XG5cdGZvY3VzZWQgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLCBwdWJsaWMgYW5ub3RhdGlvbl9ndXR0ZXIgPSBmYWxzZSkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5jb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7XG5cdH1cblxuXHRyZW5kZXJUb29sdGlwKCkge1xuXHRcdGlmICghdGhpcy50b29sdGlwKSB7XG5cdFx0XHR0aGlzLnRvb2x0aXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0dGhpcy50b29sdGlwLmNsYXNzTGlzdC5hZGQoXCJjbXRyLWNvbW1lbnQtdG9vbHRpcFwiKTtcblx0XHRcdE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKENPTU1FTlRBVE9SX0dMT0JBTC5hcHAsIHRoaXMucmFuZ2UudGV4dCwgdGhpcy50b29sdGlwLCBcIlwiLCB0aGlzLmNvbXBvbmVudCk7XG5cdFx0XHR0aGlzLmNvbXBvbmVudC5sb2FkKCk7XG5cdFx0XHR0aGlzLmljb24hLmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcCk7XG5cblx0XHRcdC8vIFNldCB0b29sdGlwIHBvc2l0aW9uXG5cdFx0XHRjb25zdCBpY29uX3JlY3QgPSB0aGlzLmljb24hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0Y29uc3QgdG9vbHRpcF9yZWN0ID0gdGhpcy50b29sdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0dGhpcy50b29sdGlwLnN0eWxlLmxlZnQgPSBpY29uX3JlY3QueCAtIHRvb2x0aXBfcmVjdC54IC0gdG9vbHRpcF9yZWN0LndpZHRoIC8gMiArIDEyICsgXCJweFwiO1xuXHRcdH1cblx0fVxuXG5cdGZvY3VzQW5ub3RhdGlvbih2aWV3OiBFZGl0b3JWaWV3LCBlOiBFdmVudCkge1xuXHRcdC8vIFRPRE86IENoZWNrIGlmIHRoaXMgaXMgKG11Y2gpIHdvcnNlIHRoYW4gZGlyZWN0bHkgaW52b2tpbmcgdGhlIGZvY3VzIGFubm90YXRpb24gZnVuY3Rpb24gZnJvbSB0aGUgZ3V0dGVyIHBsdWdpbiBpbnN0YW5jZVxuXHRcdC8vICAgICAgVGhlIG90aGVyIG9wdGlvbnMgY2FuIHBpZ2d5LWJhY2sgb24gYWxyZWFkeSBleGlzdGluZyB0cmFuc2FjdGlvbnMsIGFuZCBqdXN0IGFubm90YXRpbmcgdGhlbVxuXHRcdC8vICAgICAgSG93ZXZlciwgdGhpcyBvbmUgZG9lc24ndCBoYXZlIG9uZSAoZXhjZXB0IGlmIGNsaWNraW5nIG9uIHRoZSB3aWRnZXQgX2lzXyBhIHRyYW5zYWN0aW9uKVxuXHRcdHZpZXcuZGlzcGF0Y2goeyBhbm5vdGF0aW9uczogWyBhbm5vdGF0aW9uR3V0dGVyRm9jdXNBbm5vdGF0aW9uLm9mKHsgZnJvbTogdGhpcy5yYW5nZS5mcm9tLCB0bzogdGhpcy5yYW5nZS50byB9KSBdIH0pO1xuXHR9XG5cblx0dW5yZW5kZXJUb29sdGlwKCkge1xuXHRcdGlmICghdGhpcy5mb2N1c2VkICYmIHRoaXMudG9vbHRpcCkge1xuXHRcdFx0dGhpcy5jb21wb25lbnQudW5sb2FkKCk7XG5cdFx0XHR0aGlzLmljb24hLnJlbW92ZUNoaWxkKHRoaXMudG9vbHRpcCEpO1xuXHRcdFx0dGhpcy50b29sdGlwID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHR0b0RPTSh2aWV3OiBFZGl0b3JWaWV3KTogSFRNTEVsZW1lbnQge1xuXHRcdHRoaXMuaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHRcdHRoaXMuaWNvbi5jbGFzc0xpc3QuYWRkKFwiY210ci1jb21tZW50LWljb25cIik7XG5cdFx0c2V0SWNvbih0aGlzLmljb24sIFwibWVzc2FnZS1zcXVhcmVcIik7XG5cblx0XHQvLyBERUJVRzogQWRkIGxpbmUgdW5kZXIgaWNvbiB0byBjaGVjayBhbGlnbm1lbnQgb2YgYW5ub3RhdGlvbiBndXR0ZXIgZWxlbWVudCB3aXRoIHdpZGdldFxuXHRcdC8vIGNvbnN0IGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHQvLyBsaW5lLmNsYXNzTGlzdC5hZGQoJ2NtdHItZGVidWctY29tbWVudC1saW5lJyk7XG5cdFx0Ly8gdGhpcy5pY29uLmFwcGVuZENoaWxkKGxpbmUpO1xuXG5cdFx0aWYgKHRoaXMuYW5ub3RhdGlvbl9ndXR0ZXIpIHtcblx0XHRcdHRoaXMuaWNvbi5vbmNsaWNrID0gKGUpID0+IHRoaXMuZm9jdXNBbm5vdGF0aW9uKHZpZXcsIGUpO1xuXG5cdFx0XHR0aGlzLmljb24ub25jb250ZXh0bWVudSA9IChlKSA9PiB7XG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcblx0XHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG5cdFx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkZvY3VzIGFubm90YXRpb25cIilcblx0XHRcdFx0XHRcdC5zZXRJY29uKFwiZXllXCIpXG5cdFx0XHRcdFx0XHQub25DbGljayh0aGlzLmZvY3VzQW5ub3RhdGlvbi5iaW5kKHRoaXMsIHZpZXcpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRcdGl0ZW0uc2V0VGl0bGUoXCJBZGQgY29tbWVudFwiKVxuXHRcdFx0XHRcdFx0LnNldEljb24oXCJtZXNzYWdlLXNxdWFyZVwiKVxuXHRcdFx0XHRcdFx0Lm9uQ2xpY2soKGUpID0+IHtcblx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRhZGRDb21tZW50VG9WaWV3KHZpZXcsIHRoaXMucmFuZ2UpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1lbnUuc2hvd0F0TW91c2VFdmVudChlKTtcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLnJhbmdlLmxlbmd0aCkge1xuXHRcdFx0XHR0aGlzLmljb24ub25tb3VzZWVudGVyID0gKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucmVuZGVyVG9vbHRpcCgpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHR0aGlzLmljb24ub25jbGljayA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnJlbmRlclRvb2x0aXAoKTtcblx0XHRcdFx0XHR0aGlzLmZvY3VzZWQgPSB0cnVlO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHRoaXMuaWNvbi5vbm1vdXNlbGVhdmUgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy51bnJlbmRlclRvb2x0aXAoKTtcblx0XHRcdFx0XHQvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byBjaGVjayBpZiB0aGUgdG9vbHRpcCBpcyBzdGlsbCBmb2N1c2VkIChyZXF1aXJlcyBhIGRvY3VtZW50LmNsaWNrIGxpc3RlbmVyIC0+IGV4cGVuc2l2ZT8pOyAub25ibHVyIGRvZXMgbm90IHdvcmtcblx0XHRcdFx0XHR0aGlzLmZvY3VzZWQgPSBmYWxzZTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0aGlzLmljb24ub25ibHVyID0gKCkgPT4ge1xuXHRcdC8vIFx0dGhpcy5mb2N1c2VkID0gZmFsc2U7XG5cdFx0Ly8gXHR0aGlzLnVucmVuZGVyVG9vbHRpcCgpO1xuXHRcdC8vIH1cblxuXHRcdHJldHVybiB0aGlzLmljb247XG5cdH1cbn1cbiIsICJpbXBvcnQge3R5cGUgRXh0ZW5zaW9uLCBSYW5nZVNldCwgU3RhdGVFZmZlY3QsIFN0YXRlRmllbGR9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHtEZWNvcmF0aW9uLCB0eXBlIERlY29yYXRpb25TZXQsIEVkaXRvclZpZXd9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQge3JhbmdlUGFyc2VyfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuXG50eXBlIE1hcmt1cEZvY3VzID0geyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXI7IHVuZm9jdXM/OiBib29sZWFuIH07XG5leHBvcnQgY29uc3QgbWFya3VwRm9jdXNFZmZlY3QgPSBTdGF0ZUVmZmVjdC5kZWZpbmU8TWFya3VwRm9jdXM+KCk7XG5leHBvcnQgY29uc3QgbWFya3VwRm9jdXNTdGF0ZSA9IFN0YXRlRmllbGQuZGVmaW5lPE1hcmt1cEZvY3VzPih7XG4gICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IHN0YXRlLnNlbGVjdGlvbi5tYWluLmZyb20sIHRvOiBzdGF0ZS5zZWxlY3Rpb24ubWFpbi50byB9O1xuICAgIH0sXG5cbiAgICB1cGRhdGUodmFsdWUsIHRyKSB7XG4gICAgICAgIGZvciAobGV0IGUgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgaWYgKGUuaXMobWFya3VwRm9jdXNFZmZlY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9jdXNSZW5kZXJlciA9IFN0YXRlRmllbGQuZGVmaW5lPERlY29yYXRpb25TZXQ+KHtcbiAgICBjcmVhdGUoc3RhdGUpOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICB9LFxuXG4gICAgdXBkYXRlKG9sZFNldDogRGVjb3JhdGlvblNldCwgdHIpIHtcbiAgICAgICAgY29uc3QgbWFya3VwU3RhcnRGb2N1cyA9IHRyLnN0YXJ0U3RhdGUuZmllbGQobWFya3VwRm9jdXNTdGF0ZSwgZmFsc2UpO1xuICAgICAgICBjb25zdCBtYXJrdXBFbmRGb2N1cyA9IHRyLnN0YXRlLmZpZWxkKG1hcmt1cEZvY3VzU3RhdGUpO1xuXG4gICAgICAgIGlmIChtYXJrdXBTdGFydEZvY3VzICE9PSBtYXJrdXBFbmRGb2N1cykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VzPSB0ci5zdGF0ZS5maWVsZChyYW5nZVBhcnNlcikucmFuZ2VzLnJhbmdlc19pbl9pbnRlcnZhbChtYXJrdXBFbmRGb2N1cy5mcm9tLCBtYXJrdXBFbmRGb2N1cy50byk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmFuZ2VzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIHJhbmdlc1swXS5iYXNlX3JhbmdlID09PSByYW5nZXMuYXQoLTEpPy5iYXNlX3JhbmdlICYmXG4gICAgICAgICAgICAgICAgbWFya3VwRW5kRm9jdXMuZnJvbSA+PSByYW5nZXNbMF0uZnJvbSAmJiBtYXJrdXBFbmRGb2N1cy50byA8PSByYW5nZXMuYXQoLTEpIS50b1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlU2V0Lm9mPERlY29yYXRpb24+KFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcmsoeyBhdHRyaWJ1dGVzOiB7IFwiY2xhc3NcIjogXCJjbXRyLWZvY3VzZWRcIiB9IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJhbmdlKHJhbmdlc1swXS5mdWxsX3JhbmdlX2Zyb250LCByYW5nZXNbMF0uZnVsbF9yYW5nZV9iYWNrKVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2xkU2V0O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHByb3ZpZGUoZmllbGQ6IFN0YXRlRmllbGQ8RGVjb3JhdGlvblNldD4pOiBFeHRlbnNpb24ge1xuICAgICAgICByZXR1cm4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGZpZWxkKTtcbiAgICB9LFxufSk7XG4iLCAiaW1wb3J0IHt0eXBlIEVkaXRvclNlbGVjdGlvbiwgdHlwZSBFeHRlbnNpb24sIFJhbmdlLCBSYW5nZVNldCwgU3RhdGVGaWVsZCwgVHJhbnNhY3Rpb259IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHtEZWNvcmF0aW9uLCB0eXBlIERlY29yYXRpb25TZXQsIEVkaXRvclZpZXd9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQge2VkaXRvckxpdmVQcmV2aWV3RmllbGR9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQge0NyaXRpY01hcmt1cFJhbmdlLCByYW5nZVBhcnNlciwgU3Vic3RpdHV0aW9uUmFuZ2UsIFN1Z2dlc3Rpb25UeXBlfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IHtlZGl0TW9kZVZhbHVlU3RhdGUsIGZ1bGxSZWxvYWRFZmZlY3QsIHByZXZpZXdNb2RlU3RhdGV9IGZyb20gXCIuLi8uLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHtFZGl0TW9kZSwgdHlwZSBQbHVnaW5TZXR0aW5ncywgUHJldmlld01vZGV9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHtDb21tZW50SWNvbldpZGdldH0gZnJvbSBcIi4vY29tbWVudC13aWRnZXRcIjtcblxuY29uc3QgaGlkZU1hcmt1cERlY29yYXRpb24gPSBEZWNvcmF0aW9uLnJlcGxhY2Uoe30pO1xuY29uc3QgcmFuZ2VNYXJrdXBEZWNvcmF0aW9uID0gKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSwgY2xzOiBzdHJpbmcgPSBcIlwiLCBzaG93X3N0eWxpbmc6IGJvb2xlYW4gPSBmYWxzZSkgPT4gRGVjb3JhdGlvbi5tYXJrKHtcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFwiZGF0YS1jb250ZW50c1wiOiBcInN0cmluZ1wiLFxuICAgICAgICBcImRhdGEtdHlwZVwiOiBcImNtdHItXCIgKyByYW5nZS5yZXByLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIFwiY2xhc3NcIjogY2xzLFxuICAgICAgICBcInN0eWxlXCI6IHNob3dfc3R5bGluZyAmJiByYW5nZS5maWVsZHMuY29sb3IgPyBgYmFja2dyb3VuZC1jb2xvcjogIyR7cmFuZ2UuZmllbGRzLmNvbG9yfTtgIDogXCJcIixcbiAgICB9LFxufSk7XG5cblxuZnVuY3Rpb24gaGlkZUJyYWNrZXQoXG4gICAgZGVjb3JhdGlvbnM6IFJhbmdlPERlY29yYXRpb24+W10sXG4gICAgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLFxuICAgIHNpZGU6IC0xIHwgMCB8IDEsXG4gICAgc2hvd19zeW50YXg6IGJvb2xlYW4gPSBmYWxzZSxcbikge1xuICAgIGlmIChzaG93X3N5bnRheCkgcmV0dXJuO1xuXG4gICAgaWYgKHNpZGUgPT09IC0xKVxuICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKGhpZGVNYXJrdXBEZWNvcmF0aW9uLnJhbmdlKHJhbmdlLmZyb20sIHJhbmdlLmZyb20gKyAzKSk7XG4gICAgZWxzZSBpZiAoc2lkZSA9PT0gMSlcbiAgICAgICAgZGVjb3JhdGlvbnMucHVzaChoaWRlTWFya3VwRGVjb3JhdGlvbi5yYW5nZShyYW5nZS50byAtIDMsIHJhbmdlLnRvKSk7XG4gICAgZWxzZVxuICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKGhpZGVNYXJrdXBEZWNvcmF0aW9uLnJhbmdlKChyYW5nZSBhcyBTdWJzdGl0dXRpb25SYW5nZSkubWlkZGxlLCAocmFuZ2UgYXMgU3Vic3RpdHV0aW9uUmFuZ2UpLm1pZGRsZSArIDIpKTtcbn1cblxuZnVuY3Rpb24gaGlkZU1ldGFkYXRhKFxuICAgIGRlY29yYXRpb25zOiBSYW5nZTxEZWNvcmF0aW9uPltdLFxuICAgIHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSxcbiAgICBzaG93X21ldGFkYXRhOiBib29sZWFuID0gZmFsc2Vcbikge1xuICAgIGlmICghcmFuZ2UubWV0YWRhdGEgfHwgc2hvd19tZXRhZGF0YSkgcmV0dXJuO1xuXG4gICAgZGVjb3JhdGlvbnMucHVzaChoaWRlTWFya3VwRGVjb3JhdGlvbi5yYW5nZShyYW5nZS5mcm9tICsgMywgcmFuZ2UubWV0YWRhdGEgKyAyKSk7XG59XG5cbmZ1bmN0aW9uIGhpZGVSYW5nZShkZWNvcmF0aW9uczogUmFuZ2U8RGVjb3JhdGlvbj5bXSwgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlKSB7XG4gICAgZGVjb3JhdGlvbnMucHVzaChoaWRlTWFya3VwRGVjb3JhdGlvbi5yYW5nZShyYW5nZS5mcm9tLCByYW5nZS50bykpO1xufVxuXG5mdW5jdGlvbiBtYXJrQ29udGVudHMoXG4gICAgZGVjb3JhdGlvbnM6IFJhbmdlPERlY29yYXRpb24+W10sXG4gICAgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLFxuICAgIGNsczogc3RyaW5nLFxuICAgIGxlZnQ6IG51bWJlciA9IDAsXG4gICAgaW5jbHVzaXZlID0gZmFsc2UsXG4gICAgc2hvd19zdHlsaW5nID0gdHJ1ZSxcbikge1xuICAgIGNvbnN0IG9mZnNldCA9IGluY2x1c2l2ZSA/IDAgOiAzO1xuXG4gICAgaWYgKGxlZnQgPT09IDApIHtcbiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSgpKSB7XG4gICAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKHJhbmdlTWFya3VwRGVjb3JhdGlvbihyYW5nZSwgY2xzLCBzaG93X3N0eWxpbmcpXG4gICAgICAgICAgICAgICAgLnJhbmdlKHJhbmdlLmZyb20gKyBvZmZzZXQsIHJhbmdlLnRvIC0gb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgICAgICAgIGlmICghcmFuZ2UucGFydF9pc19lbXB0eSh0cnVlKSkge1xuICAgICAgICAgICAgICAgIGRlY29yYXRpb25zLnB1c2gocmFuZ2VNYXJrdXBEZWNvcmF0aW9uKHJhbmdlLCBjbHMsIHNob3dfc3R5bGluZylcbiAgICAgICAgICAgICAgICAgICAgLnJhbmdlKHJhbmdlLmZyb20gKyBvZmZzZXQsIChyYW5nZSBhcyBTdWJzdGl0dXRpb25SYW5nZSkubWlkZGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobGVmdCA+IDApIHtcbiAgICAgICAgICAgIGlmICghcmFuZ2UucGFydF9pc19lbXB0eShmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKHJhbmdlTWFya3VwRGVjb3JhdGlvbihyYW5nZSwgY2xzLCBzaG93X3N0eWxpbmcpXG4gICAgICAgICAgICAgICAgICAgIC5yYW5nZSgocmFuZ2UgYXMgU3Vic3RpdHV0aW9uUmFuZ2UpLm1pZGRsZSArIDIsIHJhbmdlLnRvIC0gb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVTeW50YXgoXG4gICAgZGVjb3JhdGlvbnM6IFJhbmdlPERlY29yYXRpb24+W10sXG4gICAgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLFxuICAgIHN0eWxlOiBzdHJpbmcgPSBcIlwiXG4pIHtcbiAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIC0xKTtcbiAgICBoaWRlTWV0YWRhdGEoZGVjb3JhdGlvbnMsIHJhbmdlKTtcbiAgICBtYXJrQ29udGVudHMoZGVjb3JhdGlvbnMsIHJhbmdlLCBzdHlsZSk7XG4gICAgaGlkZUJyYWNrZXQoZGVjb3JhdGlvbnMsIHJhbmdlLCAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdERlY29yYXRpb25zKFxuICAgIHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSxcbiAgICBzZWxlY3Rpb25zOiBFZGl0b3JTZWxlY3Rpb24gfCBudWxsLFxuICAgIHByZXZpZXdfbW9kZTogUHJldmlld01vZGUsXG4gICAgZWRpdF9tb2RlOiBFZGl0TW9kZSxcbiAgICBzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MsXG4pIHtcblxuICAgIGNvbnN0IGRlY29yYXRpb25zOiBSYW5nZTxEZWNvcmF0aW9uPltdID0gW107XG4gICAgY29uc3QgeyBzaG93X3N0eWxpbmcsIHNob3dfc3ludGF4LCBzaG93X21ldGFkYXRhLCBzaG93X2NvbW1lbnQgfSA9IHNldHRpbmdzLm1hcmt1cF9mb2N1c1tlZGl0X21vZGVdO1xuXG4gICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcbiAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgJ2luIGZvY3VzJyBzdGF0dXMgc2hvdWxkIGFsc28gYmUgYXBwbGljYWJsZSB3aGVuIGluIHNvbWUga2luZCBvZiBwcmV2aWV3IG1vZGVcbiAgICAgICAgLy8gICAgICBDdXJyZW50bHksIHRoZSBhc3N1bXB0aW9uIGlzIG1hZGUgdGhhdCAncHJldmlldycgaXMgT05MWSBmb3Igdmlld2luZyB0aGUgZW5kIHJlc3VsdCxcbiAgICAgICAgLy8gICAgICBhbnkgY29tbWVudHMsIHN0eWxpbmdzLCBldGMsIHNob3VsZCBfbm90XyBiZSBzaG93bi5cblxuICAgICAgICBpZiAocHJldmlld19tb2RlID09PSBQcmV2aWV3TW9kZS5BTEwpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgY2hlY2sgbWlnaHQgYmUgYnlwYXNzZWQgaWYgYSBndWFyYW50ZWUgY2FuIGJlIG1hZGUgb24gd2hldGhlciB0aGUgcmFuZ2VzIHBhc3NlZFxuICAgICAgICAgICAgLy8gICAgICAgYXJlIGFsd2F5cyBpbiBhIHNlbGVjdGlvbiBpZiAnc2VsZWN0aW9ucycgaXMgbm90IG51bGxcbiAgICAgICAgICAgIGNvbnN0IGluX3JhbmdlID0gc2VsZWN0aW9ucyA/IHNlbGVjdGlvbnMucmFuZ2VzLnNvbWUoc2VsX3JhbmdlID0+XG4gICAgICAgICAgICAgICAgcmFuZ2UucGFydGlhbGx5X2luX2Z1bGxfcmFuZ2Uoc2VsX3JhbmdlLmZyb20sIHNlbF9yYW5nZS50bylcbiAgICAgICAgICAgICkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGxldCBzdHlsZSA9IGBjbXRyLWlubGluZSBjbXRyLSR7cmFuZ2UucmVwci50b0xvd2VyQ2FzZSgpfSBgICsgKHJhbmdlLmZpZWxkcy5zdHlsZSB8fCBcIlwiKVxuICAgICAgICAgICAgaWYgKHJhbmdlLnJlcGxpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUgKz0gXCIgY210ci1oYXMtcmVwbHlcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBiZXR0ZXIgKGJ1dCBJIGRpZG4ndCBuZWNlc3NhcmlseSB3YW50IHRvIGNyZWF0ZSB0d28gc2VwYXJhdGUgY29kZSBwYXRocylcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlX3Nob3dfc3ludGF4ID0gaW5fcmFuZ2UgPyBzaG93X3N5bnRheCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByYW5nZV9zaG93X21ldGFkYXRhID0gaW5fcmFuZ2UgPyBzaG93X21ldGFkYXRhIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJhbmdlX3Nob3dfc3R5bGluZyA9IGluX3JhbmdlID8gc2hvd19zdHlsaW5nIDogdW5kZWZpbmVkO1xuXG5cbiAgICAgICAgICAgIGlmICghKHNob3dfY29tbWVudCAmJiBpbl9yYW5nZSkgJiYgcmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCAmJiBzZXR0aW5ncy5jb21tZW50X3N0eWxlICE9PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmNvbW1lbnRfc3R5bGUgPT09IFwiaWNvblwiICYmIHJhbmdlLmJhc2VfcmFuZ2UgPT09IHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVYUEw6IENvbW1lbnQgcmFuZ2VzIGFyZSBvbmx5IHNob3duIGFzIGljb25zIGluIGxpdmUgcHJldmlldyBtb2RlXG4gICAgICAgICAgICAgICAgICAgIGRlY29yYXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IENvbW1lbnRJY29uV2lkZ2V0KHJhbmdlLCBzZXR0aW5ncy5hbm5vdGF0aW9uX2d1dHRlciksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yYW5nZShyYW5nZS5mcm9tLCByYW5nZS50byksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRVhQTDogRWl0aGVyIHRoZSBjb21tZW50IGlzIG5vdCB0aGUgdG9wIG9mIGEgcmFuZ2UsIG9yIGl0IGlzIGhpZGRlbiBieSBjb21tZW50X3N0eWxlID0gXCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRpb24ucmVwbGFjZSh7fSkucmFuZ2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGlkZUJyYWNrZXQoZGVjb3JhdGlvbnMsIHJhbmdlLCAtMSwgcmFuZ2Vfc2hvd19zeW50YXgpO1xuICAgICAgICAgICAgICAgIGhpZGVNZXRhZGF0YShkZWNvcmF0aW9ucywgcmFuZ2UsIHJhbmdlX3Nob3dfbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya0NvbnRlbnRzKGRlY29yYXRpb25zLCByYW5nZSwgc3R5bGUgKyBcIiBjbXRyLWRlbGV0aW9uXCIsIC0xLCBmYWxzZSwgcmFuZ2Vfc2hvd19zdHlsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUJyYWNrZXQoZGVjb3JhdGlvbnMsIHJhbmdlLCAwLCByYW5nZV9zaG93X3N5bnRheCk7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtDb250ZW50cyhkZWNvcmF0aW9ucywgcmFuZ2UsIHN0eWxlICsgXCIgY210ci1hZGRpdGlvblwiLCAxLCBmYWxzZSwgcmFuZ2Vfc2hvd19zdHlsaW5nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXJrQ29udGVudHMoZGVjb3JhdGlvbnMsIHJhbmdlLCBzdHlsZSwgMCwgZmFsc2UsIHJhbmdlX3Nob3dfc3R5bGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhpZGVCcmFja2V0KGRlY29yYXRpb25zLCByYW5nZSwgMSwgcmFuZ2Vfc2hvd19zeW50YXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWxzZSBpZiAocHJldmlld19tb2RlID09PSBQcmV2aWV3TW9kZS5BQ0NFUFQpIHtcbiAgICAgICAgICAgIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5BRERJVElPTilcbiAgICAgICAgICAgICAgICBoaWRlU3ludGF4KGRlY29yYXRpb25zLCByYW5nZSwgXCJjbXRyLWFjY2VwdGVkXCIpO1xuICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuREVMRVRJT04pXG4gICAgICAgICAgICAgICAgaGlkZVJhbmdlKGRlY29yYXRpb25zLCByYW5nZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04pIHtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIC0xKTtcbiAgICAgICAgICAgICAgICBoaWRlTWV0YWRhdGEoZGVjb3JhdGlvbnMsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIDApO1xuICAgICAgICAgICAgICAgIG1hcmtDb250ZW50cyhkZWNvcmF0aW9ucywgcmFuZ2UsIFwiY210ci1hY2NlcHRlZFwiLCAxKTtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5DT01NRU5UKSB7XG4gICAgICAgICAgICAgICAgaGlkZVJhbmdlKGRlY29yYXRpb25zLCByYW5nZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhpZGVTeW50YXgoZGVjb3JhdGlvbnMsIHJhbmdlLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVsc2UgaWYgKHByZXZpZXdfbW9kZSA9PT0gUHJldmlld01vZGUuUkVKRUNUKSB7XG4gICAgICAgICAgICBpZiAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQURESVRJT04pXG4gICAgICAgICAgICAgICAgaGlkZVJhbmdlKGRlY29yYXRpb25zLCByYW5nZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5ERUxFVElPTikge1xuICAgICAgICAgICAgICAgIGhpZGVCcmFja2V0KGRlY29yYXRpb25zLCByYW5nZSwgLTEpO1xuICAgICAgICAgICAgICAgIGhpZGVNZXRhZGF0YShkZWNvcmF0aW9ucywgcmFuZ2UpO1xuICAgICAgICAgICAgICAgIG1hcmtDb250ZW50cyhkZWNvcmF0aW9ucywgcmFuZ2UsIFwiY210ci1hY2NlcHRlZFwiKTtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04pIHtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIC0xKTtcbiAgICAgICAgICAgICAgICBoaWRlTWV0YWRhdGEoZGVjb3JhdGlvbnMsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICBtYXJrQ29udGVudHMoZGVjb3JhdGlvbnMsIHJhbmdlLCBcImNtdHItYWNjZXB0ZWRcIiwgLTEpO1xuICAgICAgICAgICAgICAgIGhpZGVCcmFja2V0KGRlY29yYXRpb25zLCByYW5nZSwgMCk7XG4gICAgICAgICAgICAgICAgaGlkZUJyYWNrZXQoZGVjb3JhdGlvbnMsIHJhbmdlLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCkge1xuICAgICAgICAgICAgICAgIGhpZGVSYW5nZShkZWNvcmF0aW9ucywgcmFuZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoaWRlU3ludGF4KGRlY29yYXRpb25zLCByYW5nZSwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGlvbnM7XG5cblxufVxuXG5leHBvcnQgY29uc3QgbGl2ZXByZXZpZXdSZW5kZXJlciA9IChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpID0+XG4gICAgU3RhdGVGaWVsZC5kZWZpbmU8RGVjb3JhdGlvblNldD4oe1xuICAgICAgICBjcmVhdGUoc3RhdGUpOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgICAgICAgIGNvbnN0IGxpdmVfcHJldmlldyA9IHN0YXRlLmZpZWxkKGVkaXRvckxpdmVQcmV2aWV3RmllbGQpO1xuXG4gICAgICAgICAgICAvLyBFWFBMOiBObyBsaXZlIHByZXZpZXcsIG5vIGRlY29yYXRpb25zXG4gICAgICAgICAgICBpZiAoIWxpdmVfcHJldmlldykge1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByZXZpZXdfbW9kZSA9IHN0YXRlLmZhY2V0KHByZXZpZXdNb2RlU3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgZWRpdF9tb2RlID0gc3RhdGUuZmFjZXQoZWRpdE1vZGVWYWx1ZVN0YXRlKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkX3JhbmdlcyA9IHN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKTtcblxuICAgICAgICAgICAgcmV0dXJuIFJhbmdlU2V0Lm9mPERlY29yYXRpb24+KFxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdERlY29yYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRfcmFuZ2VzLnJhbmdlcy5yYW5nZXMsXG4gICAgICAgICAgICAgICAgICAgIC8qc3RhdGUuc2VsZWN0aW9uKi8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlld19tb2RlLFxuICAgICAgICAgICAgICAgICAgICBlZGl0X21vZGUsXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZShvbGRTZXQ6IERlY29yYXRpb25TZXQsIHRyOiBUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbGl2ZV9wcmV2aWV3ID0gdHIuc3RhdGUuZmllbGQoZWRpdG9yTGl2ZVByZXZpZXdGaWVsZCk7XG5cbiAgICAgICAgICAgIC8vIEVYUEw6IE5PIExJVkUgUFJFVklFVyAoc291cmNlIG1vZGUgcmVuZGVyaW5nKVxuICAgICAgICAgICAgaWYgKCFsaXZlX3ByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcmV2aWV3X21vZGUgPSB0ci5zdGF0ZS5mYWNldChwcmV2aWV3TW9kZVN0YXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRfbW9kZSA9IHRyLnN0YXRlLmZhY2V0KGVkaXRNb2RlVmFsdWVTdGF0ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZF9jbV9yYW5nZXMgPSB0ci5zdGF0ZS5maWVsZChyYW5nZVBhcnNlcik7XG5cbiAgICAgICAgICAgIC8vIEVYUEw6IFNFVFRJTkcgQ0hBTkdFU1xuICAgICAgICAgICAgLy8gIEFsbCBkZWNvcmF0aW9ucyBuZWVkIHRvIGJlIHJlbG9hZGVkXG4gICAgICAgICAgICAvLyAgICAgLSBTd2l0Y2hpbmcgYmV0d2VlbiBsaXZlIHByZXZpZXcgYW5kIHNvdXJjZSByZW5kZXJpbmdcbiAgICAgICAgICAgIC8vICAgICAtIFN3aXRjaGluZyBhbm5vdGF0aW9uIHByZXZpZXcgbW9kZXNcbiAgICAgICAgICAgIC8vICAgICAtIFNldHRpbmdzIGNoYW5nZSAoaW5kaWNhdGVkIGJ5IGZ1bGxSZWxvYWRFZmZlY3QpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGl2ZV9wcmV2aWV3ICE9PSB0ci5zdGFydFN0YXRlLmZpZWxkKGVkaXRvckxpdmVQcmV2aWV3RmllbGQpIHx8XG4gICAgICAgICAgICAgICAgcHJldmlld19tb2RlICE9PSB0ci5zdGFydFN0YXRlLmZhY2V0KHByZXZpZXdNb2RlU3RhdGUpIHx8XG4gICAgICAgICAgICAgICAgdHIuZWZmZWN0cy5zb21lKGUgPT4gZS5pcyhmdWxsUmVsb2FkRWZmZWN0KSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZVNldC5vZjxEZWNvcmF0aW9uPihcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0RGVjb3JhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRfY21fcmFuZ2VzLnJhbmdlcy5yYW5nZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zdGF0ZS5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3X21vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0X21vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFWFBMOiBDT05URU5UIENIQU5HRVNcbiAgICAgICAgICAgIC8vICAgICAgICAgIE9ubHkgdXBkYXRlIGRlY29yYXRpb25zIHRoYXQgYXJlIGluIHRoZSBjaGFuZ2VkIHJhbmdlICh0eXBpbmcsIGRlbGV0aW5nLCBldGMuKVxuICAgICAgICAgICAgaWYgKHRyLmRvY0NoYW5nZWQgfHwgKCF0ci5kb2NDaGFuZ2VkICYmIHBhcnNlZF9jbV9yYW5nZXMuaW5zZXJ0ZWRfcmFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2VfZmlsdGVyX2lkeD0gMDtcblxuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIF9taWdodF8gYmUgYnJva2VuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9sZFNldC51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IChmcm9tLCB0bywgXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJhbmdlX2ZpbHRlcl9pZHggPCBwYXJzZWRfY21fcmFuZ2VzLmRlbGV0ZWRfcmFuZ2VzLmxlbmd0aCAmJiBwYXJzZWRfY21fcmFuZ2VzLmRlbGV0ZWRfcmFuZ2VzW3JhbmdlX2ZpbHRlcl9pZHhdLnRvIDw9IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9maWx0ZXJfaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHBhcnNlZF9jbV9yYW5nZXMuZGVsZXRlZF9yYW5nZXNbcmFuZ2VfZmlsdGVyX2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShyYW5nZSAmJiBmcm9tIDwgcmFuZ2UudG8gJiYgcmFuZ2UuZnJvbSA8IHRvKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KS5tYXAodHIuY2hhbmdlcykudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgYWRkOiBjb25zdHJ1Y3REZWNvcmF0aW9ucyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9jbV9yYW5nZXMuaW5zZXJ0ZWRfcmFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHIuc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld19tb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdF9tb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVYUEw6IFNFTEVDVElPTiBDSEFOR0VTXG4gICAgICAgICAgICAvLyAgICAgICAgICBPbmx5IHVwZGF0ZSBkZWNvcmF0aW9ucyB0aGF0IGFyZSBpbiB0aGUgb2xkIGFuZCBuZXcgc2VsZWN0aW9uXG4gICAgICAgICAgICAvLyBQRVJGOiAyLTZtcyBmb3IgZXZlcnkgc2VsZWN0aW9uY2hhbmdlIG9uIHN0cmVzc3Rlc3QgKHJlZHJhd2luZyBhbGwgZGVjb3JhdGlvbnMgdGFrZXMgMTJtcylcbiAgICAgICAgICAgIC8vXHRcdCAwLjAxLTAuMDVtcyBmb3IgcmVndWxhciBzbWFsbCBub3Rlc1xuICAgICAgICAgICAgLy8gICAgICAgTGFyZ2VzdCBwZXJmb3JtYW5jZSBpbXBhY3QgaXMgZnJvbSB0aGUgYHVwZGF0ZS5maWx0ZXJgIG1ldGhvZCwgd2hpY2ggdGFrZXMgOTAlIG9mIHRoZSB0aW1lXG4gICAgICAgICAgICBpZiAodHIubmV3U2VsZWN0aW9uICE9PSB0ci5zdGFydFN0YXRlLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIEVYUEw6IENvbWJpbmUgYWxsIG9sZCBhbmQgbmV3IHNlbGVjdGlvbnMgaW50byBvbmUgc2luZ2xlIHNlbGVjdGlvbiByYW5nZVxuICAgICAgICAgICAgICAgIGxldCBhbGxfc2VsZWN0aW9uX3JhbmdlcyA9IHRyLm5ld1NlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHRyLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgICAgICAgICBhbGxfc2VsZWN0aW9uX3JhbmdlcyA9IGFsbF9zZWxlY3Rpb25fcmFuZ2VzLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbV9yYW5nZXNfaW5fc2VsZWN0aW9ucyA9IHBhcnNlZF9jbV9yYW5nZXMucmFuZ2VzLnJhbmdlc19pbl9pbnRlcnZhbHMoYWxsX3NlbGVjdGlvbl9yYW5nZXMucmFuZ2VzIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHRvOiBudW1iZXJcbiAgICAgICAgICAgICAgICB9W10pO1xuXG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlX2ZpbHRlcl9pZHggPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBvbGRTZXQubWFwKHRyLmNoYW5nZXMpLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogKGZyb20sIHRvLCBfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmFuZ2VfZmlsdGVyX2lkeCA8IGNtX3Jhbmdlc19pbl9zZWxlY3Rpb25zLmxlbmd0aCAmJiBjbV9yYW5nZXNfaW5fc2VsZWN0aW9uc1tyYW5nZV9maWx0ZXJfaWR4XS50byA8PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfZmlsdGVyX2lkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBjbV9yYW5nZXNfaW5fc2VsZWN0aW9uc1tyYW5nZV9maWx0ZXJfaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKHJhbmdlICYmIGZyb20gPCByYW5nZS50byAmJiByYW5nZS5mcm9tIDwgdG8pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBhZGQ6IGNvbnN0cnVjdERlY29yYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgY21fcmFuZ2VzX2luX3NlbGVjdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5uZXdTZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3X21vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0X21vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRVhQTDogTk8gQ0hBTkdFU1xuICAgICAgICAgICAgcmV0dXJuIG9sZFNldDtcbiAgICAgICAgfSxcblxuICAgICAgICBwcm92aWRlKGZpZWxkOiBTdGF0ZUZpZWxkPERlY29yYXRpb25TZXQ+KTogRXh0ZW5zaW9uIHtcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLmZyb20oZmllbGQpO1xuICAgICAgICB9LFxuICAgIH0pO1xuIiwgImltcG9ydCB7IENvbXBhcnRtZW50IH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uX2d1dHRlciwgQW5ub3RhdGlvbkd1dHRlclZpZXcsIGFubm90YXRpb25HdXR0ZXJWaWV3LFxuXHRhbm5vdGF0aW9uR3V0dGVyRm9jdXNBbm5vdGF0aW9uLCBhbm5vdGF0aW9uR3V0dGVyRm9sZEFubm90YXRpb24sIGFubm90YXRpb25HdXR0ZXJXaWR0aEFubm90YXRpb24sIGFubm90YXRpb25HdXR0ZXJIaWRlRW1wdHlBbm5vdGF0aW9uLFxuXHRhbm5vdGF0aW9uR3V0dGVyUmVzaXplSGFuZGxlQW5ub3RhdGlvbiwgYW5ub3RhdGlvbkd1dHRlckZvbGRCdXR0b25Bbm5vdGF0aW9uLCBhbm5vdGF0aW9uR3V0dGVyRm9jdXNUaHJlYWRBbm5vdGF0aW9uXG4gfSBmcm9tIFwiLi9hbm5vdGF0aW9uLWd1dHRlclwiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkd1dHRlck1hcmtlcnMsIEFubm90YXRpb25NYXJrZXIgfSBmcm9tIFwiLi9tYXJrZXJcIjtcbmltcG9ydCB0eXBlIENvbW1lbnRhdG9yUGx1Z2luIGZyb20gXCIuLi8uLi8uLi8uLi9tYWluXCI7XG5cbmV4cG9ydCB7XG5cdEFubm90YXRpb25HdXR0ZXJWaWV3LCBhbm5vdGF0aW9uR3V0dGVyTWFya2VycywgQW5ub3RhdGlvbk1hcmtlciwgYW5ub3RhdGlvbkd1dHRlclZpZXcsXG5cdGFubm90YXRpb25HdXR0ZXJGb2N1c0Fubm90YXRpb24sIGFubm90YXRpb25HdXR0ZXJGb2xkQW5ub3RhdGlvbiwgYW5ub3RhdGlvbkd1dHRlcldpZHRoQW5ub3RhdGlvbiwgYW5ub3RhdGlvbkd1dHRlckhpZGVFbXB0eUFubm90YXRpb24sXG5cdGFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVBbm5vdGF0aW9uLCBhbm5vdGF0aW9uR3V0dGVyRm9sZEJ1dHRvbkFubm90YXRpb24sIGFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24sXG59O1xuXG4vLyBOT1RFOiBLZWVwIHRoZSBndXR0ZXIgaGVyZSwgYXMgT2JzaWRpYW4gKnJlYWxseSogZG9lcyBub3QgbGlrZSB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlXG4vLyBcdFx0IGJldHdlZW4gTWFya2VycyBhbmQgR3V0dGVycyAod2hpY2ggaXMgcmVxdWlyZWQgZm9yIGNhbGxpbmcgdGhlIG1vdmVHdXR0ZXIgZnVuY3Rpb24pXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlciA9IChwbHVnaW46IENvbW1lbnRhdG9yUGx1Z2luKSA9PiBbXG5cdGFubm90YXRpb25HdXR0ZXJNYXJrZXJzLFxuXHRhbm5vdGF0aW9uX2d1dHRlcih7XG5cdFx0Y2xhc3M6IFwiY210ci1hbm5vLWd1dHRlciBcIiArIChwbHVnaW4uYXBwLnZhdWx0LmdldENvbmZpZyhcImNzc1RoZW1lXCIpID09PSBcIk1pbmltYWxcIiA/IFwiIGlzLW1pbmltYWxcIiA6IFwiXCIpLFxuXHRcdG1hcmtlcnM6IHYgPT4gdi5zdGF0ZS5maWVsZChhbm5vdGF0aW9uR3V0dGVyTWFya2VycyksXG5cdFx0Zm9sZFN0YXRlOiBwbHVnaW4uc2V0dGluZ3MuYW5ub3RhdGlvbl9ndXR0ZXJfZGVmYXVsdF9mb2xkX3N0YXRlLFxuXHRcdHdpZHRoOiBwbHVnaW4uc2V0dGluZ3MuYW5ub3RhdGlvbl9ndXR0ZXJfd2lkdGgsXG5cdFx0aGlkZU9uRW1wdHk6IHBsdWdpbi5zZXR0aW5ncy5hbm5vdGF0aW9uX2d1dHRlcl9oaWRlX2VtcHR5LFxuXHRcdGluY2x1ZGVGb2xkQnV0dG9uOiBwbHVnaW4uc2V0dGluZ3MuYW5ub3RhdGlvbl9ndXR0ZXJfZm9sZF9idXR0b24sXG5cdFx0aW5jbHVkZVJlc2l6ZUhhbmRsZTogcGx1Z2luLnNldHRpbmdzLmFubm90YXRpb25fZ3V0dGVyX3Jlc2l6ZV9oYW5kbGUsXG5cdH0pLFxuXTtcblxuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5cbiIsICJpbXBvcnQge0VkaXRvclZpZXd9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQge0NyaXRpY01hcmt1cFJhbmdlLCBTdWdnZXN0aW9uVHlwZX0gZnJvbSBcIi4uL3Jhbmdlc1wiO1xuaW1wb3J0IHtjcmVhdGVfcmFuZ2V9IGZyb20gXCIuLi9lZGl0LXV0aWwvcmFuZ2UtY3JlYXRlXCI7XG5pbXBvcnQge0VkaXRvclNlbGVjdGlvbn0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQge2Fubm90YXRpb25HdXR0ZXJGb2N1c0Fubm90YXRpb259IGZyb20gXCIuLi8uLi9yZW5kZXJlcnMvZ3V0dGVycy9hbm5vdGF0aW9ucy1ndXR0ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbW1lbnRUb1ZpZXcoZWRpdG9yOiBFZGl0b3JWaWV3LCByYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWQsIHNjcm9sbDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgY3Vyc29yID0gcmFuZ2UgPyByYW5nZS5mdWxsX3JhbmdlX2JhY2sgOiBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZDtcbiAgICBjb25zdCByZXBseV9pZHggPSByYW5nZSA/IHJhbmdlLmZ1bGxfdGhyZWFkLmxlbmd0aCA6IC0xO1xuXG4gICAgZWRpdG9yLmRpc3BhdGNoKGVkaXRvci5zdGF0ZS51cGRhdGUoe1xuICAgICAgICBjaGFuZ2VzOiB7XG4gICAgICAgICAgICBmcm9tOiBjdXJzb3IsXG4gICAgICAgICAgICB0bzogY3Vyc29yLFxuICAgICAgICAgICAgaW5zZXJ0OiBjcmVhdGVfcmFuZ2UoU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCwgXCJcIiksXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihjdXJzb3IpLFxuICAgICAgICBzY3JvbGxJbnRvVmlldzogc2Nyb2xsLFxuICAgIH0pKTtcblxuXG4gICAgLy8gRVhQTDogVGhpcyBjb2RlIGVuc3VyZXMgdGhhdCB0aGUgaW5wdXQgb2YgYSBuZXcgY29tbWVudCBpcyBmb2N1c2VkIG9uIHdoZW4gY3JlYXRlZFxuICAgIC8vIEZJWE1FOiBBIG1vcmUgY2Fub25pY2FsIHdheSBpcyByZXF1aXJlZCB0byB3YWl0IHRpbGwgdGhlIENNIHN0YXRlIHVwZGF0ZSAodGhlIG5ldyBjb21tZW50IGVsZW1lbnQgbmVlZHMgdG8gYmUgcmVuZGVyZWQpXG4gICAgLy8gICBTb21lIGF0dGVtcHRzIHRoYXQgZGlkIG5vdCB3b3JrOlxuICAgIC8vICAgIC0gdXNpbmcgYHNlcXVlbnRpYWxgIGluIHRoZSBgdXBkYXRlYCBtZXRob2RcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgZWRpdG9yLmRpc3BhdGNoKGVkaXRvci5zdGF0ZS51cGRhdGUoe1xuICAgICAgICBhbm5vdGF0aW9uczogW1xuICAgICAgICAgICAgYW5ub3RhdGlvbkd1dHRlckZvY3VzQW5ub3RhdGlvbi5vZih7XG4gICAgICAgICAgICAgICAgZnJvbTogY3Vyc29yLFxuICAgICAgICAgICAgICAgIHRvOiBjdXJzb3IsXG4gICAgICAgICAgICAgICAgaW5kZXg6IHJlcGx5X2lkeCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdXG4gICAgfSkpfSk7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBDaGFuZ2VTcGVjLCBFZGl0b3JTdGF0ZSB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuXG5pbXBvcnQgdHlwZSB7IEFwcCwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgYXBwbHlUb1RleHQsIHJhbmdlUGFyc2VyIH0gZnJvbSBcIi4uL2VkaXQtdXRpbFwiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL3Jhbmdlc1wiO1xuXG4vLyBUT0RPOiBNb3JlIHNvcGhpc3RpY2F0ZWQgcmVtb3ZhbCBoYW5kbGluZ1xuZXhwb3J0IGZ1bmN0aW9uIGFjY2VwdFN1Z2dlc3Rpb25zKHN0YXRlOiBFZGl0b3JTdGF0ZSwgZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIsIHJlbW92ZV9hdHRhY2hlZF9jb21tZW50czogYm9vbGVhbiA9IHRydWUpOiBDaGFuZ2VTcGVjW10ge1xuXHRjb25zdCByYW5nZV9maWVsZCA9IHN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKS5yYW5nZXM7XG5cdHJldHVybiAoKGZyb20gfHwgdG8pID8gcmFuZ2VfZmllbGQucmFuZ2VzX2luX2ludGVydmFsKGZyb20gPz8gMCwgdG8gPz8gSW5maW5pdHkpIDogcmFuZ2VfZmllbGQucmFuZ2VzKVxuXHRcdC5maWx0ZXIocmFuZ2UgPT5cblx0XHRcdHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OIHx8IHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OIHx8XG5cdFx0XHRyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05cblx0XHQpXG5cdFx0Lm1hcChyYW5nZSA9PiAoeyBmcm9tOiByYW5nZS5mcm9tLCB0bzogcmVtb3ZlX2F0dGFjaGVkX2NvbW1lbnRzID8gcmFuZ2UuZnVsbF9yYW5nZV9iYWNrIDogcmFuZ2UudG8sIGluc2VydDogcmFuZ2UuYWNjZXB0KCkgfSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0U3VnZ2VzdGlvbnMoc3RhdGU6IEVkaXRvclN0YXRlLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgcmVtb3ZlX2F0dGFjaGVkX2NvbW1lbnRzOiBib29sZWFuID0gdHJ1ZSk6IENoYW5nZVNwZWNbXSB7XG5cdGNvbnN0IHJhbmdlX2ZpZWxkID0gc3RhdGUuZmllbGQocmFuZ2VQYXJzZXIpLnJhbmdlcztcblx0cmV0dXJuICgoZnJvbSB8fCB0bykgPyByYW5nZV9maWVsZC5yYW5nZXNfaW5faW50ZXJ2YWwoZnJvbSA/PyAwLCB0byA/PyBJbmZpbml0eSkgOiByYW5nZV9maWVsZC5yYW5nZXMpXG5cdFx0LmZpbHRlcihyYW5nZSA9PlxuXHRcdFx0cmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQURESVRJT04gfHwgcmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuREVMRVRJT04gfHxcblx0XHRcdHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTlxuXHRcdClcblx0XHQubWFwKHJhbmdlID0+ICh7IGZyb206IHJhbmdlLmZyb20sIHRvOiByZW1vdmVfYXR0YWNoZWRfY29tbWVudHMgPyByYW5nZS5mdWxsX3JhbmdlX2JhY2sgOiByYW5nZS50bywgaW5zZXJ0OiByYW5nZS5yZWplY3QoKSB9KSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVRvRmlsZShcblx0YXBwbHlGbjogKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSwgdGV4dDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdGFwcDogQXBwLFxuXHRmaWxlOiBURmlsZSxcblx0cmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZVtdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdHJhbmdlcy5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pO1xuXHRjb25zdCB0ZXh0ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG5cblx0Y29uc3Qgb3V0cHV0ID0gYXBwbHlUb1RleHQodGV4dCwgYXBwbHlGbiwgcmFuZ2VzKTtcblxuXHRhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG91dHB1dCk7XG59XG4iLCAiaW1wb3J0IERpZmZNYXRjaFBhdGNoIGZyb20gXCJkaWZmLW1hdGNoLXBhdGNoXCI7XG5pbXBvcnQgeyBjcmVhdGVfc3VnZ2VzdGlvbiB9IGZyb20gXCIuLi9lZGl0LXV0aWwvcmFuZ2UtY3JlYXRlXCI7XG5cbkRpZmZNYXRjaFBhdGNoLkRJRkZfREVMRVRFID0gLTE7XG5EaWZmTWF0Y2hQYXRjaC5ESUZGX0lOU0VSVCA9IDE7XG5EaWZmTWF0Y2hQYXRjaC5ESUZGX0VRVUFMID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVGV4dERpZmYob2xkVGV4dDogc3RyaW5nLCBuZXdUZXh0OiBzdHJpbmcpIHtcblx0Y29uc3QgZG1wID0gbmV3IERpZmZNYXRjaFBhdGNoKCk7XG5cdGNvbnN0IGRpZmYgPSBkbXAuZGlmZl9tYWluKG9sZFRleHQsIG5ld1RleHQpO1xuXHRkbXAuZGlmZl9jbGVhbnVwU2VtYW50aWMoZGlmZik7XG5cblx0bGV0IG9mZnNldCA9IDA7XG5cdGNvbnN0IGNoYW5nZXM6IHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyOyBpbnNlcnQ6IHN0cmluZyB9W10gPSBbXTtcblx0bGV0IGN1cnJlbnRfY2hhbmdlOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlcjsgaW5zZXJ0OiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuXG5cdGZvciAoY29uc3QgW3R5cGUsIHRleHRdIG9mIGRpZmYpIHtcblx0XHRpZiAodHlwZSA9PT0gRGlmZk1hdGNoUGF0Y2guRElGRl9FUVVBTCkge1xuXHRcdFx0aWYgKGN1cnJlbnRfY2hhbmdlKSB7XG5cdFx0XHRcdGNoYW5nZXMucHVzaChjdXJyZW50X2NoYW5nZSk7XG5cdFx0XHRcdGN1cnJlbnRfY2hhbmdlID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdG9mZnNldCArPSB0ZXh0Lmxlbmd0aDtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09IERpZmZNYXRjaFBhdGNoLkRJRkZfSU5TRVJUKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRfY2hhbmdlKVxuXHRcdFx0XHRjdXJyZW50X2NoYW5nZSA9IHsgZnJvbTogb2Zmc2V0LCB0bzogb2Zmc2V0LCBpbnNlcnQ6IHRleHQgfTtcblx0XHRcdGVsc2UgaWYgKCFjdXJyZW50X2NoYW5nZS5pbnNlcnQpXG5cdFx0XHRcdGN1cnJlbnRfY2hhbmdlLmluc2VydCArPSB0ZXh0O1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGNoYW5nZXMucHVzaChjdXJyZW50X2NoYW5nZSk7XG5cdFx0XHRcdGN1cnJlbnRfY2hhbmdlID0geyBmcm9tOiBvZmZzZXQsIHRvOiBvZmZzZXQsIGluc2VydDogdGV4dCB9O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gRGlmZk1hdGNoUGF0Y2guRElGRl9ERUxFVEUpIHtcblx0XHRcdGlmICghY3VycmVudF9jaGFuZ2UpXG5cdFx0XHRcdGN1cnJlbnRfY2hhbmdlID0geyBmcm9tOiBvZmZzZXQsIHRvOiBvZmZzZXQgKyB0ZXh0Lmxlbmd0aCwgaW5zZXJ0OiBcIlwiIH07XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y2hhbmdlcy5wdXNoKGN1cnJlbnRfY2hhbmdlKTtcblx0XHRcdFx0Y3VycmVudF9jaGFuZ2UgPSB7IGZyb206IG9mZnNldCwgdG86IG9mZnNldCArIHRleHQubGVuZ3RoLCBpbnNlcnQ6IFwiXCIgfTtcblx0XHRcdH1cblx0XHRcdG9mZnNldCArPSB0ZXh0Lmxlbmd0aDtcblx0XHR9XG5cdH1cblx0aWYgKGN1cnJlbnRfY2hhbmdlKVxuXHRcdGNoYW5nZXMucHVzaChjdXJyZW50X2NoYW5nZSk7XG5cblx0cmV0dXJuIGNoYW5nZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNyaXRpY01hcmt1cFBhdGNoRnJvbURpZmYob2xkVGV4dDogc3RyaW5nLCBuZXdUZXh0OiBzdHJpbmcpIHtcblx0Y29uc3QgZGlmZiA9IGdlbmVyYXRlVGV4dERpZmYob2xkVGV4dCwgbmV3VGV4dCk7XG5cdGxldCBvdXRwdXQgPSBcIlwiO1xuXHRsZXQgb2Zmc2V0ID0gMDtcblx0Zm9yIChjb25zdCBjaGFuZ2Ugb2YgZGlmZikge1xuXHRcdGlmIChjaGFuZ2UuZnJvbSA+IG9mZnNldClcblx0XHRcdG91dHB1dCArPSBvbGRUZXh0LnNsaWNlKG9mZnNldCwgY2hhbmdlLmZyb20pO1xuXHRcdGlmIChjaGFuZ2UuaW5zZXJ0KVxuXHRcdFx0b3V0cHV0ICs9IGNyZWF0ZV9zdWdnZXN0aW9uKGNoYW5nZS5pbnNlcnQsIG9sZFRleHQuc2xpY2UoY2hhbmdlLmZyb20sIGNoYW5nZS50bykpO1xuXHRcdG9mZnNldCA9IGNoYW5nZS50bztcblx0fVxuXHRpZiAob2Zmc2V0IDwgb2xkVGV4dC5sZW5ndGgpXG5cdFx0b3V0cHV0ICs9IG9sZFRleHQuc2xpY2Uob2Zmc2V0KTtcblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIiwgImltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlLCBnZXRSYW5nZXNJblRleHQgfSBmcm9tIFwiLi9lZGl0b3IvYmFzZVwiO1xuaW1wb3J0IHsgQ09NTUVOVEFUT1JfR0xPQkFMIH0gZnJvbSBcIi4vZ2xvYmFsXCI7XG5pbXBvcnQgeyB0eXBlIFBsdWdpblNldHRpbmdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluZGV4V29ya2VyKGZpbGVzOiBzdHJpbmdbXSwgc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxDcml0aWNNYXJrdXBSYW5nZVtdW10+IHtcblx0Q09NTUVOVEFUT1JfR0xPQkFMLlBMVUdJTl9TRVRUSU5HUyA9IHNldHRpbmdzO1xuXHRyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKGFzeW5jIChmaWxlOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gZ2V0UmFuZ2VzSW5UZXh0KGZpbGUpO1xuXHR9KSk7XG59XG4iLCAiLy8gRXhwb3J0IGEgaW5kZXhXb3JrZXIgZnVuY3Rpb24gaW4gQHJvb3QvaW5kZXgtd29ya2VyLnRzIGluIG9yZGVyIHRvIGRlZmluZSB0aGUgd29ya2VyXG5pbXBvcnQgeyBpbmRleFdvcmtlciB9IGZyb20gXCJpbmRleC13b3JrZXJcIjtcblxuc2VsZi5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcblx0c2VsZi5wb3N0TWVzc2FnZShhd2FpdCBpbmRleFdvcmtlcihldmVudC5kYXRhLmZpbGVzLCBldmVudC5kYXRhLnNldHRpbmdzKSk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogImszQkFBQSxJQUFBQSxHQUFBQyxHQUFBLENBQUFDLEdBQUFDLEtBQUEsQ0E0QkEsSUFBSUMsRUFBbUIsVUFBVyxDQU1oQyxLQUFLLGFBQWUsRUFFcEIsS0FBSyxjQUFnQixFQUVyQixLQUFLLGdCQUFrQixHQUl2QixLQUFLLGVBQWlCLElBS3RCLEtBQUssc0JBQXdCLEdBRTdCLEtBQUssYUFBZSxFQUdwQixLQUFLLGNBQWdCLEVBQ3ZCLEVBV0lDLEdBQWMsR0FDZEMsR0FBYyxFQUNkQyxFQUFhLEVBV2pCSCxFQUFpQixLQUFPLFNBQVNJLEVBQUlDLEVBQU0sQ0FDekMsTUFB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LFlBQ3pEQSxFQUFNLE9BQVMsY0FDaEIsRUFDQyxJQUFJQSxJQUFVLENBQUUsS0FBTUEsRUFBTSxLQUFNLEdBQUlILEVBQTJCRyxFQUFNLGdCQUFrQkEsRUFBTSxHQUFJLE9BQVFBLEVBQU0sT0FBTyxDQUFFLEVBQUUsQ0FDL0gsQ0MxQkEsSUFBQUUsR0FBMkIsV0FHM0IsR0FBQUMsUUFBZSxZQUFjLEdBQzdCLEdBQUFBLFFBQWUsWUFBYyxFQUM3QixHQUFBQSxRQUFlLFdBQWEsRUNENUIsZUFBc0JDLEdBQVlDLEVBQWlCQyxFQUEwRCxDQUM1RyxPQUFBQyxHQUFtQixnQkFBa0JELEVBQzlCLE1BQU0sUUFBUSxJQUFJRCxFQUFNLElBQUksTUFBT0csR0FDbENDLEdBQWdCRCxDQUFJLENBQzNCLENBQUMsQ0FDSCxDQ05BLEtBQUssVUFBWSxNQUFPRSxHQUFVLENBQ2pDLEtBQUssWUFBWSxNQUFNQyxHQUFZRCxFQUFNLEtBQUssTUFBT0EsRUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUMxRSIsCiAgIm5hbWVzIjogWyJyZXF1aXJlX2RpZmZfbWF0Y2hfcGF0Y2giLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJkaWZmX21hdGNoX3BhdGNoIiwgIkRJRkZfREVMRVRFIiwgIkRJRkZfSU5TRVJUIiwgIkRJRkZfRVFVQUwiLCAib3AiLCAidGV4dCIsICJ0ZXh0MSIsICJ0ZXh0MiIsICJvcHRfY2hlY2tsaW5lcyIsICJvcHRfZGVhZGxpbmUiLCAiZGVhZGxpbmUiLCAiY2hlY2tsaW5lcyIsICJjb21tb25sZW5ndGgiLCAiY29tbW9ucHJlZml4IiwgImNvbW1vbnN1ZmZpeCIsICJkaWZmcyIsICJsb25ndGV4dCIsICJzaG9ydHRleHQiLCAiaSIsICJobSIsICJ0ZXh0MV9hIiwgInRleHQxX2IiLCAidGV4dDJfYSIsICJ0ZXh0Ml9iIiwgIm1pZF9jb21tb24iLCAiZGlmZnNfYSIsICJkaWZmc19iIiwgImEiLCAibGluZWFycmF5IiwgInBvaW50ZXIiLCAiY291bnRfZGVsZXRlIiwgImNvdW50X2luc2VydCIsICJ0ZXh0X2RlbGV0ZSIsICJ0ZXh0X2luc2VydCIsICJzdWJEaWZmIiwgImoiLCAidGV4dDFfbGVuZ3RoIiwgInRleHQyX2xlbmd0aCIsICJtYXhfZCIsICJ2X29mZnNldCIsICJ2X2xlbmd0aCIsICJ2MSIsICJ2MiIsICJ4IiwgImRlbHRhIiwgImZyb250IiwgImsxc3RhcnQiLCAiazFlbmQiLCAiazJzdGFydCIsICJrMmVuZCIsICJkIiwgImsxIiwgImsxX29mZnNldCIsICJ4MSIsICJ5MSIsICJrMl9vZmZzZXQiLCAieDIiLCAiazIiLCAieTIiLCAieSIsICJ0ZXh0MWEiLCAidGV4dDJhIiwgInRleHQxYiIsICJ0ZXh0MmIiLCAiZGlmZnNiIiwgImxpbmVBcnJheSIsICJsaW5lSGFzaCIsICJkaWZmX2xpbmVzVG9DaGFyc011bmdlXyIsICJjaGFycyIsICJsaW5lU3RhcnQiLCAibGluZUVuZCIsICJsaW5lQXJyYXlMZW5ndGgiLCAibGluZSIsICJtYXhMaW5lcyIsICJjaGFyczEiLCAiY2hhcnMyIiwgInBvaW50ZXJtaW4iLCAicG9pbnRlcm1heCIsICJwb2ludGVybWlkIiwgInBvaW50ZXJzdGFydCIsICJwb2ludGVyZW5kIiwgInRleHRfbGVuZ3RoIiwgImJlc3QiLCAibGVuZ3RoIiwgInBhdHRlcm4iLCAiZm91bmQiLCAiZG1wIiwgImRpZmZfaGFsZk1hdGNoSV8iLCAic2VlZCIsICJiZXN0X2NvbW1vbiIsICJiZXN0X2xvbmd0ZXh0X2EiLCAiYmVzdF9sb25ndGV4dF9iIiwgImJlc3Rfc2hvcnR0ZXh0X2EiLCAiYmVzdF9zaG9ydHRleHRfYiIsICJwcmVmaXhMZW5ndGgiLCAic3VmZml4TGVuZ3RoIiwgImhtMSIsICJobTIiLCAiY2hhbmdlcyIsICJlcXVhbGl0aWVzIiwgImVxdWFsaXRpZXNMZW5ndGgiLCAibGFzdEVxdWFsaXR5IiwgImxlbmd0aF9pbnNlcnRpb25zMSIsICJsZW5ndGhfZGVsZXRpb25zMSIsICJsZW5ndGhfaW5zZXJ0aW9uczIiLCAibGVuZ3RoX2RlbGV0aW9uczIiLCAiZGVsZXRpb24iLCAiaW5zZXJ0aW9uIiwgIm92ZXJsYXBfbGVuZ3RoMSIsICJvdmVybGFwX2xlbmd0aDIiLCAiZGlmZl9jbGVhbnVwU2VtYW50aWNTY29yZV8iLCAib25lIiwgInR3byIsICJjaGFyMSIsICJjaGFyMiIsICJub25BbHBoYU51bWVyaWMxIiwgIm5vbkFscGhhTnVtZXJpYzIiLCAid2hpdGVzcGFjZTEiLCAid2hpdGVzcGFjZTIiLCAibGluZUJyZWFrMSIsICJsaW5lQnJlYWsyIiwgImJsYW5rTGluZTEiLCAiYmxhbmtMaW5lMiIsICJlcXVhbGl0eTEiLCAiZWRpdCIsICJlcXVhbGl0eTIiLCAiY29tbW9uT2Zmc2V0IiwgImNvbW1vblN0cmluZyIsICJiZXN0RXF1YWxpdHkxIiwgImJlc3RFZGl0IiwgImJlc3RFcXVhbGl0eTIiLCAiYmVzdFNjb3JlIiwgInNjb3JlIiwgInByZV9pbnMiLCAicHJlX2RlbCIsICJwb3N0X2lucyIsICJwb3N0X2RlbCIsICJsb2MiLCAibGFzdF9jaGFyczEiLCAibGFzdF9jaGFyczIiLCAiaHRtbCIsICJwYXR0ZXJuX2FtcCIsICJwYXR0ZXJuX2x0IiwgInBhdHRlcm5fZ3QiLCAicGF0dGVybl9wYXJhIiwgImRhdGEiLCAibGV2ZW5zaHRlaW4iLCAiaW5zZXJ0aW9ucyIsICJkZWxldGlvbnMiLCAiZGlmZnNMZW5ndGgiLCAidG9rZW5zIiwgInBhcmFtIiwgImV4IiwgIm4iLCAicyIsICJtYXRjaF9iaXRhcFNjb3JlXyIsICJlIiwgImFjY3VyYWN5IiwgInByb3hpbWl0eSIsICJzY29yZV90aHJlc2hvbGQiLCAiYmVzdF9sb2MiLCAibWF0Y2htYXNrIiwgImJpbl9taW4iLCAiYmluX21pZCIsICJiaW5fbWF4IiwgImxhc3RfcmQiLCAic3RhcnQiLCAiZmluaXNoIiwgInJkIiwgImNoYXJNYXRjaCIsICJwYXRjaCIsICJwYWRkaW5nIiwgInByZWZpeCIsICJzdWZmaXgiLCAib3B0X2IiLCAib3B0X2MiLCAicGF0Y2hlcyIsICJwYXRjaERpZmZMZW5ndGgiLCAiY2hhcl9jb3VudDEiLCAiY2hhcl9jb3VudDIiLCAicHJlcGF0Y2hfdGV4dCIsICJwb3N0cGF0Y2hfdGV4dCIsICJkaWZmX3R5cGUiLCAiZGlmZl90ZXh0IiwgInBhdGNoZXNDb3B5IiwgInBhdGNoQ29weSIsICJudWxsUGFkZGluZyIsICJyZXN1bHRzIiwgImV4cGVjdGVkX2xvYyIsICJzdGFydF9sb2MiLCAiZW5kX2xvYyIsICJpbmRleDEiLCAiaW5kZXgyIiwgIm1vZCIsICJwYWRkaW5nTGVuZ3RoIiwgImV4dHJhTGVuZ3RoIiwgInBhdGNoX3NpemUiLCAiYmlncGF0Y2giLCAic3RhcnQxIiwgInN0YXJ0MiIsICJwcmVjb250ZXh0IiwgImVtcHR5IiwgInBvc3Rjb250ZXh0IiwgInRleHRsaW5lIiwgInRleHRQb2ludGVyIiwgInBhdGNoSGVhZGVyIiwgIm0iLCAic2lnbiIsICJjb29yZHMxIiwgImNvb3JkczIiLCAiQ01fQWxsX0JyYWNrZXRzIiwgInNob3J0SGFuZE1hcHBpbmciLCAiQ3JpdGljTWFya3VwUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0eXBlIiwgInJlcHIiLCAidGV4dCIsICJtZXRhZGF0YSIsICJfX3B1YmxpY0ZpZWxkIiwgIm1ldGFkYXRhX3NlcGFyYXRvciIsICJtZXRhZGF0YV90ZXh0IiwgImtleSIsICJlIiwgInJlcGx5IiwgInZhbHVlIiwgImZpZWxkcyIsICJyYW5nZSIsICJvdGhlciIsICJsZWZ0IiwgInN0YXJ0IiwgImVuZCIsICJzdHJpY3QiLCAicmVtb3ZlQ29tbWVudHMiLCAiY3Vyc29yIiwgInNraXBfbWV0YWRhdGEiLCAicmlnaHQiLCAibW92ZW1lbnQiLCAib3V0c2lkZV9sb29zZSIsICJpbnNpZGVfbG9vc2UiLCAiaW5jbHVkZV9tZXRhZGF0YSIsICJsZWZ0X2xvb3NlIiwgInJpZ2h0X2xvb3NlIiwgInVud3JhcCIsICJwcmV2aWV3TW9kZSIsICJ0YWciLCAic3RyIiwgIkNNX0FsbF9CcmFja2V0cyIsICJvZmZzZXQiLCAiQWRkaXRpb25SYW5nZSIsICJDcml0aWNNYXJrdXBSYW5nZSIsICJmcm9tIiwgInRvIiwgInRleHQiLCAibWV0YWRhdGEiLCAidW53cmFwIiwgInByZXZpZXdNb2RlIiwgInRhZyIsICJsZWZ0IiwgInN0ciIsICJDTV9BbGxfQnJhY2tldHMiLCAiY2xzIiwgIkNvbW1lbnRSYW5nZSIsICJDcml0aWNNYXJrdXBSYW5nZSIsICJmcm9tIiwgInRvIiwgInRleHQiLCAibWV0YWRhdGEiLCAiX19wdWJsaWNGaWVsZCIsICJyZW1vdmVDb21tZW50cyIsICJyYW5nZSIsICJEZWxldGlvblJhbmdlIiwgIkNyaXRpY01hcmt1cFJhbmdlIiwgImZyb20iLCAidG8iLCAidGV4dCIsICJtZXRhZGF0YSIsICJ1bndyYXAiLCAicHJldmlld01vZGUiLCAidGFnIiwgImxlZnQiLCAic3RyIiwgIkNNX0FsbF9CcmFja2V0cyIsICJjbHMiLCAiSGlnaGxpZ2h0UmFuZ2UiLCAiQ3JpdGljTWFya3VwUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0ZXh0IiwgIm1ldGFkYXRhIiwgIlN1YnN0aXR1dGlvblJhbmdlIiwgIkNyaXRpY01hcmt1cFJhbmdlIiwgImZyb20iLCAibWlkZGxlIiwgInRvIiwgInRleHQiLCAibWV0YWRhdGEiLCAibGVmdCIsICJvZmZzZXQiLCAiY3Vyc29yIiwgImxlZnRfbG9vc2UiLCAicmlnaHRfbG9vc2UiLCAic3RyaWN0IiwgInJpZ2h0IiwgInNraXBfbWV0YWRhdGEiLCAic3RhcnQiLCAiZW5kIiwgInVud3JhcCIsICJwcmV2aWV3TW9kZSIsICJ0YWciLCAic3RyIiwgInBhcnRzIiwgIkNNX0FsbF9CcmFja2V0cyIsICJjbHMiLCAicmFuZ2UiLCAicmFuZ2VGcm9tIiwgInJhbmdlVG8iLCAibnVtYmVycyIsICJzIiwgImkiLCAibiIsICJpc0V4dGVuZGluZ0NoYXIiLCAiY29kZSIsICJmcm9tIiwgInRvIiwgIm1pZCIsICJpc1JlZ2lvbmFsSW5kaWNhdG9yIiwgIlpXSiIsICJmaW5kQ2x1c3RlckJyZWFrIiwgInN0ciIsICJwb3MiLCAiZm9yd2FyZCIsICJpbmNsdWRlRXh0ZW5kaW5nIiwgIm5leHRDbHVzdGVyQnJlYWsiLCAicHJldkNsdXN0ZXJCcmVhayIsICJzdXJyb2dhdGVMb3ciLCAic3Vycm9nYXRlSGlnaCIsICJwcmV2IiwgImNvZGVQb2ludEF0IiwgImNvZGVQb2ludFNpemUiLCAibmV4dCIsICJpc0V4dGVuZGluZ0NoYXIiLCAiaXNSZWdpb25hbEluZGljYXRvciIsICJjb3VudEJlZm9yZSIsICJpIiwgImZvdW5kIiwgImNvZGUwIiwgImNvZGUxIiwgImNoIiwgImNvZGUiLCAiVGV4dCIsICJfVGV4dCIsICJwb3MiLCAibiIsICJmcm9tIiwgInRvIiwgInRleHQiLCAiY2xpcCIsICJwYXJ0cyIsICJUZXh0Tm9kZSIsICJvdGhlciIsICJzdGFydCIsICJlbmQiLCAiYSIsICJSYXdUZXh0Q3Vyc29yIiwgImIiLCAic2tpcCIsICJkaXIiLCAiUGFydGlhbFRleHRDdXJzb3IiLCAiaW5uZXIiLCAiTGluZUN1cnNvciIsICJsaW5lcyIsICJUZXh0TGVhZiIsICJfVGV4dExlYWYiLCAibGVuZ3RoIiwgInRleHRMZW5ndGgiLCAidGFyZ2V0IiwgImlzTGluZSIsICJsaW5lIiwgIm9mZnNldCIsICJpIiwgInN0cmluZyIsICJMaW5lIiwgIm9wZW4iLCAic2xpY2VUZXh0IiwgInByZXYiLCAiam9pbmVkIiwgImFwcGVuZFRleHQiLCAibWlkIiwgIm5ld0xlbiIsICJsaW5lU2VwIiwgInJlc3VsdCIsICJwYXJ0IiwgImxlbiIsICJfVGV4dE5vZGUiLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAiZW5kTGluZSIsICJjaGlsZE9wZW4iLCAidXBkYXRlZCIsICJ0b3RhbExpbmVzIiwgImNvcHkiLCAiaUEiLCAiaUIiLCAiZUEiLCAiZUIiLCAiY2hBIiwgImNoQiIsICJsIiwgImNoIiwgImZsYXQiLCAiY2h1bmsiLCAibWF4Q2h1bmsiLCAibWluQ2h1bmsiLCAiY2h1bmtlZCIsICJjdXJyZW50TGluZXMiLCAiY3VycmVudExlbiIsICJjdXJyZW50Q2h1bmsiLCAiYWRkIiwgImxhc3QiLCAibm9kZSIsICJmbHVzaCIsICJmaXJzdCIsICJ0b3AiLCAib2Zmc2V0VmFsdWUiLCAic2l6ZSIsICJuZXh0IiwgImxpbWl0IiwgInZhbHVlIiwgImRvbmUiLCAibGluZUJyZWFrIiwgIm51bWJlciIsICJmaW5kQ2x1c3RlckJyZWFrIiwgInN0ciIsICJmb3J3YXJkIiwgImluY2x1ZGVFeHRlbmRpbmciLCAic3Vycm9nYXRlTG93IiwgInN1cnJvZ2F0ZUhpZ2giLCAiY29kZVBvaW50QXQiLCAiY29kZTAiLCAiY29kZTEiLCAiY29kZVBvaW50U2l6ZSIsICJjb2RlIiwgIkRlZmF1bHRTcGxpdCIsICJNYXBNb2RlIiwgIkNoYW5nZURlc2MiLCAiX0NoYW5nZURlc2MiLCAic2VjdGlvbnMiLCAicmVzdWx0IiwgImkiLCAiaW5zIiwgImYiLCAicG9zQSIsICJwb3NCIiwgImxlbiIsICJpbmRpdmlkdWFsIiwgIml0ZXJDaGFuZ2VzIiwgIm90aGVyIiwgImNvbXBvc2VTZXRzIiwgImJlZm9yZSIsICJtYXBTZXQiLCAicG9zIiwgImFzc29jIiwgIm1vZGUiLCAiZW5kQSIsICJmcm9tIiwgInRvIiwgImVuZCIsICJqc29uIiwgImEiLCAiQ2hhbmdlU2V0IiwgIl9DaGFuZ2VTZXQiLCAiaW5zZXJ0ZWQiLCAiZG9jIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJfdG9CIiwgInRleHQiLCAiaW5kZXgiLCAiVGV4dCIsICJyYW5nZXMiLCAicmVzdWx0U2VjdGlvbnMiLCAicmVzdWx0SW5zZXJ0ZWQiLCAiZmlsdGVyZWRTZWN0aW9ucyIsICJpdGVyIiwgIlNlY3Rpb25JdGVyIiwgImRvbmUiLCAibmV4dCIsICJhZGRTZWN0aW9uIiwgImFkZEluc2VydCIsICJwYXJ0cyIsICJjaGFuZ2VzIiwgImxlbmd0aCIsICJsaW5lU2VwIiwgInRvdGFsIiwgImZsdXNoIiwgImZvcmNlIiwgInNldCIsICJwcm9jZXNzIiwgInNwZWMiLCAic3ViIiwgImluc2VydCIsICJpbnNUZXh0IiwgImluc0xlbiIsICJwYXJ0IiwgImUiLCAiZm9yY2VKb2luIiwgImxhc3QiLCAidmFsdWVzIiwgInZhbHVlIiwgImRlc2MiLCAiZW5kQiIsICJzZXRBIiwgInNldEIiLCAibWtTZXQiLCAiYiIsICJwaWVjZSIsICJsZWZ0IiwgIm9wZW4iLCAic2VjdGlvbkxlbiIsICJpbnNCIiwgIlNlbGVjdGlvblJhbmdlIiwgIl9TZWxlY3Rpb25SYW5nZSIsICJmbGFncyIsICJsZXZlbCIsICJjaGFuZ2UiLCAiRWRpdG9yU2VsZWN0aW9uIiwgImhlYWQiLCAiaW5jbHVkZUFzc29jIiwgIl9FZGl0b3JTZWxlY3Rpb24iLCAibWFpbkluZGV4IiwgInIiLCAicmFuZ2UiLCAibWFpbiIsICJ3aGljaCIsICJhbmNob3IiLCAiYmlkaUxldmVsIiwgImdvYWxDb2x1bW4iLCAicHJldiIsICJjaGVja1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiZG9jTGVuZ3RoIiwgIm5leHRJRCIsICJGYWNldCIsICJfRmFjZXQiLCAiY29tYmluZSIsICJjb21wYXJlSW5wdXQiLCAiY29tcGFyZSIsICJpc1N0YXRpYyIsICJlbmFibGVzIiwgImNvbmZpZyIsICJzYW1lQXJyYXkiLCAiRmFjZXRQcm92aWRlciIsICJkZXBzIiwgImdldCIsICJmaWVsZCIsICJ4IiwgInN0YXRlIiwgImRlcGVuZGVuY2llcyIsICJmYWNldCIsICJ0eXBlIiwgImFkZHJlc3NlcyIsICJfYSIsICJnZXR0ZXIiLCAiaWQiLCAiaWR4IiwgIm11bHRpIiwgImRlcERvYyIsICJkZXBTZWwiLCAiZGVwQWRkcnMiLCAiZGVwIiwgInRyIiwgImVuc3VyZUFsbCIsICJuZXdWYWwiLCAiY29tcGFyZUFycmF5IiwgIm9sZFN0YXRlIiwgIm9sZEFkZHIiLCAib2xkVmFsIiwgImdldEFkZHIiLCAiU3RhdGVGaWVsZCIsICJhZGRycyIsICJjaGFuZ2VkIiwgImFkZHIiLCAiZW5zdXJlQWRkciIsICJkeW5hbWljRmFjZXRTbG90IiwgInByb3ZpZGVycyIsICJwcm92aWRlckFkZHJzIiwgInAiLCAicHJvdmlkZXJUeXBlcyIsICJkeW5hbWljIiwgInZhbCIsICJkZXBDaGFuZ2VkIiwgIm9sZFByb3ZpZGVycyIsICJvbGRWYWx1ZSIsICJpbml0RmllbGQiLCAiX1N0YXRlRmllbGQiLCAiY3JlYXRlRiIsICJ1cGRhdGVGIiwgImNvbXBhcmVGIiwgImluaXQiLCAib2xkSW5pdCIsICJyZUluaXQiLCAiY3JlYXRlIiwgIlByZWNfIiwgInByZWMiLCAiZXh0IiwgIlByZWNFeHRlbnNpb24iLCAiUHJlYyIsICJpbm5lciIsICJDb21wYXJ0bWVudCIsICJfQ29tcGFydG1lbnQiLCAiQ29tcGFydG1lbnRJbnN0YW5jZSIsICJjb250ZW50IiwgImNvbXBhcnRtZW50IiwgIkNvbmZpZ3VyYXRpb24iLCAiX0NvbmZpZ3VyYXRpb24iLCAiYmFzZSIsICJjb21wYXJ0bWVudHMiLCAiZHluYW1pY1Nsb3RzIiwgImFkZHJlc3MiLCAic3RhdGljVmFsdWVzIiwgImZhY2V0cyIsICJmaWVsZHMiLCAibmV3Q29tcGFydG1lbnRzIiwgImZsYXR0ZW4iLCAib2xkRmFjZXRzIiwgImV4dGVuc2lvbiIsICJzZWVuIiwgImtub3duIiwgImZvdW5kIiwgInN0YXR1cyIsICJsYW5ndWFnZURhdGEiLCAiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMiLCAidiIsICJsaW5lU2VwYXJhdG9yIiwgImNoYW5nZUZpbHRlciIsICJ0cmFuc2FjdGlvbkZpbHRlciIsICJ0cmFuc2FjdGlvbkV4dGVuZGVyIiwgInJlYWRPbmx5IiwgIkFubm90YXRpb24iLCAiQW5ub3RhdGlvblR5cGUiLCAiU3RhdGVFZmZlY3RUeXBlIiwgIm1hcCIsICJTdGF0ZUVmZmVjdCIsICJfU3RhdGVFZmZlY3QiLCAibWFwcGluZyIsICJtYXBwZWQiLCAiZWZmZWN0cyIsICJlZmZlY3QiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgInN0YXJ0U3RhdGUiLCAiYW5ub3RhdGlvbnMiLCAic2Nyb2xsSW50b1ZpZXciLCAiYW5uIiwgImV2ZW50IiwgImpvaW5SYW5nZXMiLCAiaUEiLCAiaUIiLCAibWVyZ2VUcmFuc2FjdGlvbiIsICJzZXF1ZW50aWFsIiwgIm1hcEZvckEiLCAibWFwRm9yQiIsICJyZXNvbHZlVHJhbnNhY3Rpb25Jbm5lciIsICJkb2NTaXplIiwgInNlbCIsICJhc0FycmF5IiwgInJlc29sdmVUcmFuc2FjdGlvbiIsICJzcGVjcyIsICJmaWx0ZXIiLCAicyIsICJzZXEiLCAiZXh0ZW5kVHJhbnNhY3Rpb24iLCAiZmlsdGVyVHJhbnNhY3Rpb24iLCAiYmFjayIsICJmaWx0ZXJlZCIsICJmaWx0ZXJzIiwgImV4dGVuZGVycyIsICJub25lIiwgIkNoYXJDYXRlZ29yeSIsICJub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciIsICJ3b3JkQ2hhciIsICJfIiwgImhhc1dvcmRDaGFyIiwgInN0ciIsICJjaCIsICJtYWtlQ2F0ZWdvcml6ZXIiLCAid29yZENoYXJzIiwgImNoYXIiLCAiRWRpdG9yU3RhdGUiLCAiX0VkaXRvclN0YXRlIiwgImNvbXB1dGVTbG90IiwgInJlcXVpcmUiLCAiY29uZiIsICJrZXkiLCAic3RhcnRWYWx1ZXMiLCAic2xvdCIsICJyZXN1bHQxIiwgIm5ld0NoYW5nZXMiLCAibmV3TWFwcGVkIiwgImoiLCAibWFwQnkiLCAic3RyaW5nIiwgInByb3AiLCAiZmllbGRJbml0IiwgImNvbmZpZ3VyYXRpb24iLCAicGhyYXNlIiwgIm0iLCAibiIsICJuYW1lIiwgInNpZGUiLCAicHJvdmlkZXIiLCAiYXQiLCAiY2F0IiwgInN0YXJ0IiwgImZpbmRDbHVzdGVyQnJlYWsiLCAia0EiLCAia0IiLCAiayIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImZyb20iLCAidG8iLCAiUmFuZ2UiLCAiTWFwTW9kZSIsICJfUmFuZ2UiLCAidmFsdWUiLCAiY21wUmFuZ2UiLCAiYSIsICJiIiwgIkNodW5rIiwgIl9DaHVuayIsICJtYXhQb2ludCIsICJwb3MiLCAic2lkZSIsICJlbmQiLCAic3RhcnRBdCIsICJhcnIiLCAibG8iLCAiaGkiLCAibWlkIiwgImRpZmYiLCAib2Zmc2V0IiwgImYiLCAiaSIsICJlIiwgImNoYW5nZXMiLCAibmV3UG9zIiwgInZhbCIsICJjdXJGcm9tIiwgImN1clRvIiwgIm5ld0Zyb20iLCAibmV3VG8iLCAibWFwcGVkIiwgIlJhbmdlU2V0IiwgIl9SYW5nZVNldCIsICJjaHVua1BvcyIsICJjaHVuayIsICJuZXh0TGF5ZXIiLCAibGFzdCIsICJzaXplIiwgImluZGV4IiwgInVwZGF0ZVNwZWMiLCAiYWRkIiwgInNvcnQiLCAiZmlsdGVyRnJvbSIsICJmaWx0ZXJUbyIsICJmaWx0ZXIiLCAiY3VyIiwgIkxheWVyQ3Vyc29yIiwgInNwaWxsIiwgImJ1aWxkZXIiLCAiUmFuZ2VTZXRCdWlsZGVyIiwgInJhbmdlIiwgImNodW5rcyIsICJzdGFydCIsICJ0b3VjaCIsICJuZXh0IiwgIkhlYXBDdXJzb3IiLCAic2V0cyIsICJvbGRTZXRzIiwgIm5ld1NldHMiLCAidGV4dERpZmYiLCAiY29tcGFyYXRvciIsICJtaW5Qb2ludFNpemUiLCAic2V0IiwgInNoYXJlZENodW5rcyIsICJmaW5kU2hhcmVkQ2h1bmtzIiwgInNpZGVBIiwgIlNwYW5DdXJzb3IiLCAic2lkZUIiLCAiZnJvbUEiLCAiZnJvbUIiLCAibGVuZ3RoIiwgImNvbXBhcmUiLCAic2FtZVZhbHVlcyIsICJpdGVyYXRvciIsICJjdXJzb3IiLCAib3BlblJhbmdlcyIsICJhY3RpdmUiLCAib3BlbkNvdW50IiwgInJhbmdlcyIsICJidWlsZCIsICJsYXp5U29ydCIsICJyZXN1bHQiLCAibGF5ZXIiLCAicHJldiIsICJfUmFuZ2VTZXRCdWlsZGVyIiwgIm5ld0FycmF5cyIsICJpbkEiLCAic2hhcmVkIiwgImtub3duIiwgInNraXAiLCAibWluUG9pbnQiLCAicmFuayIsICJmb3J3YXJkIiwgInJhbmdlSW5kZXgiLCAiX0hlYXBDdXJzb3IiLCAiaGVhcCIsICJoZWFwQnViYmxlIiwgInRvcCIsICJjaGlsZEluZGV4IiwgImNoaWxkIiwgInJlbW92ZSIsICJmaW5kTWluSW5kZXgiLCAidHJhY2tPcGVuIiwgImluc2VydCIsICJ3YXNQb2ludCIsICJuZXh0VmFsIiwgIm9wZW4iLCAic3RhcnRBIiwgInN0YXJ0QiIsICJlbmRCIiwgImRQb3MiLCAiZEVuZCIsICJjbGlwRW5kIiwgImFycmF5IiwgImZvdW5kIiwgImZvdW5kUG9zIiwgImZpbmRDb2x1bW4iLCAic3RyaW5nIiwgImNvbCIsICJ0YWJTaXplIiwgInN0cmljdCIsICJpIiwgIm4iLCAiZmluZENsdXN0ZXJCcmVhayIsICJJbnRlcnZhbCIsICJsb3ciLCAiaGlnaCIsICJvdGhlcl9pbnRlcnZhbCIsICJpbnRlcnZhbDEiLCAiaW50ZXJ2YWwyIiwgInZhbDEiLCAidmFsMiIsICJSQl9UUkVFX0NPTE9SX1JFRCIsICJSQl9UUkVFX0NPTE9SX0JMQUNLIiwgIk5vZGUiLCAia2V5IiwgInZhbHVlIiwgImxlZnQiLCAicmlnaHQiLCAicGFyZW50IiwgImNvbG9yIiwgIm90aGVyX25vZGUiLCAiY29tcGFyYWJsZV9tYXgiLCAic2VhcmNoX25vZGUiLCAiY29tcGFyYWJsZV9sZXNzX3RoYW4iLCAiSW50ZXJ2YWxUcmVlIiwgIl9JbnRlcnZhbFRyZWUiLCAiY291bnQiLCAicmVzIiwgIm5vZGUiLCAiaW5zZXJ0X25vZGUiLCAiZGVsZXRlX25vZGUiLCAiaW50ZXJ2YWwiLCAib3V0cHV0TWFwcGVyRm4iLCAicmVzcF9ub2RlcyIsICJ2aXNpdG9yIiwgImNhbGxiYWNrIiwgInRyZWUiLCAibm9kZV9jdXJyZW50IiwgImN1cnJlbnRfbm9kZSIsICJwYXJlbnRfbm9kZSIsICJ1bmNsZV9ub2RlIiwgImN1dF9ub2RlIiwgImZpeF9ub2RlIiwgImJyb3RoZXJfbm9kZSIsICJiZXN0IiwgImN1cnIiLCAiZm91bmQiLCAibm9kZV9taW4iLCAibm9kZV9tYXgiLCAibm9kZV9zdWNjZXNzb3IiLCAieCIsICJ5IiwgImFjdGlvbiIsICJoZWlnaHQiLCAiaGVpZ2h0TGVmdCIsICJoZWlnaHRSaWdodCIsICJDcml0aWNNYXJrdXBSYW5nZXMiLCAicmFuZ2VzIiwgIl9fcHVibGljRmllbGQiLCAiSW50ZXJ2YWxUcmVlIiwgInJhbmdlIiwgImluZGV4IiwgImN1cnNvciIsICJyaWdodCIsICJzZWFyY2giLCAiZnJvbSIsICJ0byIsICJsZWZ0IiwgImxvb3NlIiwgImluY2x1ZGVfZWRnZSIsICJkaXJlY3RseV9hZGphY2VudCIsICJyYW5nZV9pZHgiLCAibiIsICJhZGphY2VudCIsICJzdGFydCIsICJlbmQiLCAiaW50ZXJ2YWxzIiwgInVuaXF1ZV9yYW5nZXMiLCAiZm91bmRfcmFuZ2UiLCAicmVwbHkiLCAiYSIsICJiIiwgImRvYyIsICJmcm9udF9yYW5nZSIsICJiYWNrX3JhbmdlIiwgIm91dHB1dCIsICJwcmV2X3JhbmdlIiwgIm5ld19mcm9tIiwgIm5ld190byIsICJDIiwgIkNPVU5UIiwgIlNFVCIsICJ0b3AiLCAiU3R5bGVNb2R1bGUiLCAic3BlYyIsICJvcHRpb25zIiwgImZpbmlzaCIsICJzcGxpdFNlbGVjdG9yIiwgInNlbGVjdG9yIiwgInJlbmRlciIsICJzZWxlY3RvcnMiLCAidGFyZ2V0IiwgImlzS2V5ZnJhbWVzIiwgImxvY2FsIiwgImlzQXQiLCAia2V5ZnJhbWVzIiwgInByb3AiLCAidmFsdWUiLCAicGFydCIsICJzZWwiLCAiYSIsICJiIiwgImwiLCAiaWQiLCAicm9vdCIsICJtb2R1bGVzIiwgInNldCIsICJub25jZSIsICJTdHlsZVNldCIsICJhZG9wdGVkU2V0IiwgImRvYyIsICJ3aW4iLCAiYWRvcHRlZCIsICJzaGVldCIsICJwb3MiLCAiaiIsICJpIiwgIm1vZCIsICJpbmRleCIsICJrIiwgInRleHQiLCAiYmFzZSIsICJzaGlmdCIsICJtYWMiLCAiaWUiLCAiaSIsICJjb2RlIiwgImtleU5hbWUiLCAiZXZlbnQiLCAiaWdub3JlS2V5IiwgIm5hbWUiLCAiZ2V0U2VsZWN0aW9uIiwgInJvb3QiLCAidGFyZ2V0IiwgImNvbnRhaW5zIiwgImRvbSIsICJub2RlIiwgImhhc1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiXyIsICJjbGllbnRSZWN0c0ZvciIsICJ0ZXh0UmFuZ2UiLCAiaXNFcXVpdmFsZW50UG9zaXRpb24iLCAib2ZmIiwgInRhcmdldE5vZGUiLCAidGFyZ2V0T2ZmIiwgInNjYW5Gb3IiLCAiZG9tSW5kZXgiLCAiaW5kZXgiLCAiaXNCbG9ja0VsZW1lbnQiLCAiZGlyIiwgIm1heE9mZnNldCIsICJwYXJlbnQiLCAiZmxhdHRlblJlY3QiLCAicmVjdCIsICJsZWZ0IiwgIngiLCAid2luZG93UmVjdCIsICJ3aW4iLCAidnAiLCAiZ2V0U2NhbGUiLCAiZWx0IiwgInNjYWxlWCIsICJzY2FsZVkiLCAic2Nyb2xsUmVjdEludG9WaWV3IiwgInNpZGUiLCAieSIsICJ4TWFyZ2luIiwgInlNYXJnaW4iLCAibHRyIiwgImRvYyIsICJjdXIiLCAic3RvcCIsICJib3VuZGluZyIsICJ0b3AiLCAibW92ZVgiLCAibW92ZVkiLCAicmVjdEhlaWdodCIsICJib3VuZGluZ0hlaWdodCIsICJtb3ZlZFgiLCAibW92ZWRZIiwgInN0YXJ0IiwgInNjcm9sbGFibGVQYXJlbnRzIiwgIkRPTVNlbGVjdGlvblN0YXRlIiwgImRvbVNlbCIsICJyYW5nZSIsICJhbmNob3JOb2RlIiwgImZvY3VzTm9kZSIsICJhbmNob3JPZmZzZXQiLCAiZm9jdXNPZmZzZXQiLCAicHJldmVudFNjcm9sbFN1cHBvcnRlZCIsICJmb2N1c1ByZXZlbnRTY3JvbGwiLCAic3RhY2siLCAiaSIsICJzY3JhdGNoUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJkaXNwYXRjaEtleSIsICJuYW1lIiwgImNvZGUiLCAibW9kcyIsICJvcHRpb25zIiwgImRvd24iLCAidXAiLCAiZ2V0Um9vdCIsICJjbGVhckF0dHJpYnV0ZXMiLCAiYXRFbGVtZW50U3RhcnQiLCAib2Zmc2V0IiwgInByZXYiLCAiaXNTY3JvbGxlZFRvQm90dG9tIiwgInRleHROb2RlQmVmb3JlIiwgInN0YXJ0Tm9kZSIsICJzdGFydE9mZnNldCIsICJ0ZXh0Tm9kZUFmdGVyIiwgIkRPTVBvcyIsICJfRE9NUG9zIiwgInByZWNpc2UiLCAibm9DaGlsZHJlbiIsICJDb250ZW50VmlldyIsICJfQ29udGVudFZpZXciLCAidmlldyIsICJwb3MiLCAiY2hpbGQiLCAidHJhY2siLCAibmV4dCIsICJjb250ZW50VmlldyIsICJybSQxIiwgIl9kb20iLCAiYWZ0ZXIiLCAiYmlhcyIsICJmcm9tSSIsICJmcm9tU3RhcnQiLCAidG9JIiwgInRvRW5kIiwgInByZXZFbmQiLCAiZW5kIiwgImFuZFBhcmVudCIsICJjaGlsZExpc3QiLCAidiIsICJjaGlsZHJlbiIsICJfcmVjIiwgIl9ldmVudCIsICJDaGlsZEN1cnNvciIsICJzb3VyY2UiLCAiaGFzU3RhcnQiLCAib3BlblN0YXJ0IiwgIm9wZW5FbmQiLCAib3RoZXIiLCAicmVwbGFjZVJhbmdlIiwgImZyb21PZmYiLCAidG9PZmYiLCAiaW5zZXJ0IiwgImJyZWFrQXRTdGFydCIsICJiZWZvcmUiLCAibGFzdCIsICJicmVha0F0RW5kIiwgIm1lcmdlQ2hpbGRyZW5JbnRvIiwgImRMZW4iLCAibmF2IiwgImllX2VkZ2UiLCAiaWVfdXB0bzEwIiwgImllXzExdXAiLCAiaWUiLCAiZ2Vja28iLCAiY2hyb21lIiwgIndlYmtpdCIsICJzYWZhcmkiLCAiaW9zIiwgImJyb3dzZXIiLCAiTWF4Sm9pbkxlbiIsICJUZXh0VmlldyIsICJfVGV4dFZpZXciLCAidGV4dCIsICJ0ZXh0RE9NIiwgInJlc3VsdCIsICJfZnJvbSIsICJfdG8iLCAidGV4dENvb3JkcyIsICJNYXJrVmlldyIsICJfTWFya1ZpZXciLCAibWFyayIsICJsZW5ndGgiLCAiY2giLCAiX2hhc1N0YXJ0IiwgImRldGFjaEZyb20iLCAiaW5saW5lRE9NQXRQb3MiLCAiY29vcmRzSW5DaGlsZHJlbiIsICJmbGF0dGVuIiwgInJlY3RzIiwgInIiLCAiV2lkZ2V0VmlldyIsICJfV2lkZ2V0VmlldyIsICJ3aWRnZXQiLCAiZXZlbnQiLCAiVGV4dCIsICJjdXN0b20iLCAiZnJvbUJhY2siLCAiV2lkZ2V0QnVmZmVyVmlldyIsICJfV2lkZ2V0QnVmZmVyVmlldyIsICJqIiwgImpvaW5JbmxpbmVJbnRvIiwgIm9wZW4iLCAiYmVmb3JlUG9zIiwgImFmdGVyUG9zIiwgInNjYW4iLCAib25TYW1lTGluZSIsICJmYWxsYmFja1JlY3QiLCAiYSIsICJiIiwgInBvc0EiLCAicG9zQiIsICJjb21iaW5lQXR0cnMiLCAibm9BdHRycyIsICJhdHRyc0VxIiwgImlnbm9yZSIsICJrZXlzQSIsICJrZXlzQiIsICJrZXkiLCAidXBkYXRlQXR0cnMiLCAiYXR0cnMiLCAiY2hhbmdlZCIsICJnZXRBdHRycyIsICJhdHRyIiwgIldpZGdldFR5cGUiLCAiQmxvY2tUeXBlIiwgIkRlY29yYXRpb24iLCAiUmFuZ2VWYWx1ZSIsICJzdGFydFNpZGUiLCAiZW5kU2lkZSIsICJzcGVjIiwgIk1hcmtEZWNvcmF0aW9uIiwgImJsb2NrIiwgIlBvaW50RGVjb3JhdGlvbiIsICJnZXRJbmNsdXNpdmUiLCAiTGluZURlY29yYXRpb24iLCAib2YiLCAic29ydCIsICJSYW5nZVNldCIsICJfTWFya0RlY29yYXRpb24iLCAiX2EiLCAiX2IiLCAiX0xpbmVEZWNvcmF0aW9uIiwgIk1hcE1vZGUiLCAiX1BvaW50RGVjb3JhdGlvbiIsICJpc1JlcGxhY2UiLCAid2lkZ2V0c0VxIiwgImFkZFJhbmdlIiwgInJhbmdlcyIsICJtYXJnaW4iLCAiTGluZVZpZXciLCAiX0xpbmVWaWV3IiwgImF0IiwgImRlY28iLCAiY2xzIiwgImhhY2siLCAidG90YWxXaWR0aCIsICJ0ZXh0SGVpZ2h0IiwgImhlaWdodE9yYWNsZSIsICJoZWlnaHQiLCAiZGlzdCIsICJkb2NWaWV3IiwgIkJsb2NrV2lkZ2V0VmlldyIsICJfQmxvY2tXaWRnZXRWaWV3IiwgIl90YWtlRGVjbyIsICJsZW4iLCAiQmxvY2tHYXBXaWRnZXQiLCAiQ29udGVudEJ1aWxkZXIiLCAiX0NvbnRlbnRCdWlsZGVyIiwgImRpc2FsbG93QmxvY2tFZmZlY3RzRm9yIiwgImFjdGl2ZSIsICJ3cmFwTWFya3MiLCAidmFsdWUiLCAibGluZUJyZWFrIiwgImRvbmUiLCAidGFrZSIsICJOdWxsV2lkZ2V0IiwgImN1cnNvckJlZm9yZSIsICJjdXJzb3JBZnRlciIsICJsaW5lIiwgImRlY29yYXRpb25zIiwgImR5bmFtaWNEZWNvcmF0aW9uTWFwIiwgImJ1aWxkZXIiLCAidGFnIiwgIkRpcmVjdGlvbiIsICJMVFIiLCAiUlRMIiwgImRlYyIsICJzdHIiLCAiTG93VHlwZXMiLCAiQXJhYmljVHlwZXMiLCAiQnJhY2tldHMiLCAiQnJhY2tldFN0YWNrIiwgInAiLCAibCIsICJjaGFyVHlwZSIsICJCaWRpUkUiLCAiQmlkaVNwYW4iLCAibGV2ZWwiLCAiZm9yd2FyZCIsICJvcmRlciIsICJhc3NvYyIsICJtYXliZSIsICJzcGFuIiwgImlzb2xhdGVzRXEiLCAiaUEiLCAiaUIiLCAidHlwZXMiLCAiY29tcHV0ZUNoYXJUeXBlcyIsICJyRnJvbSIsICJyVG8iLCAiaXNvbGF0ZXMiLCAib3V0ZXJUeXBlIiwgImlJIiwgInByZXZUeXBlIiwgInByZXZTdHJvbmciLCAidHlwZSIsICJyZXBsYWNlIiwgInByb2Nlc3NCcmFja2V0UGFpcnMiLCAib3Bwb3NpdGVUeXBlIiwgInNJIiwgImNvbnRleHQiLCAiYnIiLCAic0oiLCAiZmxhZ3MiLCAiZW1iZWQiLCAicHJvY2Vzc05ldXRyYWxzIiwgImJlZm9yZUwiLCAiYWZ0ZXJMIiwgImpJIiwgImZyb21KIiwgImVtaXRTcGFucyIsICJiYXNlTGV2ZWwiLCAib3VyVHlwZSIsICJpQ2giLCAic2FtZURpciIsICJpc051bSIsICJyZWN1cnNlIiwgImxvY2FsTGV2ZWwiLCAiaVNjYW4iLCAicnVuIiwgImlzbyIsICJ1cHRvIiwgImRpclN3YXAiLCAiY29tcHV0ZVNlY3Rpb25PcmRlciIsICJjb21wdXRlT3JkZXIiLCAiZGlyZWN0aW9uIiwgInRyaXZpYWxPcmRlciIsICJtb3ZlZE92ZXIiLCAibW92ZVZpc3VhbGx5IiwgInN0YXJ0SW5kZXgiLCAic3BhbkkiLCAic3BhbkVuZCIsICJuZXh0SSIsICJuZXh0SW5kZXgiLCAiZmluZENsdXN0ZXJCcmVhayIsICJuZXh0U3BhbiIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYXV0b0RpcmVjdGlvbiIsICJjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSIsICJGYWNldCIsICJkcmFnTW92ZXNTZWxlY3Rpb24kMSIsICJtb3VzZVNlbGVjdGlvblN0eWxlIiwgImV4Y2VwdGlvblNpbmsiLCAidXBkYXRlTGlzdGVuZXIiLCAiaW5wdXRIYW5kbGVyIiwgImZvY3VzQ2hhbmdlRWZmZWN0IiwgImNsaXBib2FyZElucHV0RmlsdGVyIiwgImNsaXBib2FyZE91dHB1dEZpbHRlciIsICJwZXJMaW5lVGV4dERpcmVjdGlvbiIsICJ2YWx1ZXMiLCAibmF0aXZlU2VsZWN0aW9uSGlkZGVuIiwgInNjcm9sbEhhbmRsZXIiLCAiU2Nyb2xsVGFyZ2V0IiwgIl9TY3JvbGxUYXJnZXQiLCAiaXNTbmFwc2hvdCIsICJjaGFuZ2VzIiwgInN0YXRlIiwgInNjcm9sbEludG9WaWV3IiwgIlN0YXRlRWZmZWN0IiwgInQiLCAic2V0RWRpdENvbnRleHRGb3JtYXR0aW5nIiwgImxvZ0V4Y2VwdGlvbiIsICJleGNlcHRpb24iLCAiaGFuZGxlciIsICJlZGl0YWJsZSIsICJuZXh0UGx1Z2luSUQiLCAidmlld1BsdWdpbiIsICJWaWV3UGx1Z2luIiwgIl9WaWV3UGx1Z2luIiwgImlkIiwgImNyZWF0ZSIsICJkb21FdmVudEhhbmRsZXJzIiwgImRvbUV2ZW50T2JzZXJ2ZXJzIiwgImJ1aWxkRXh0ZW5zaW9ucyIsICJldmVudEhhbmRsZXJzIiwgImV2ZW50T2JzZXJ2ZXJzIiwgInByb3ZpZGUiLCAicGx1Z2luIiwgImV4dCIsICJwbHVnaW5JbnN0IiwgIlBsdWdpbkluc3RhbmNlIiwgInVwZGF0ZSIsICJlIiwgImVkaXRvckF0dHJpYnV0ZXMiLCAiY29udGVudEF0dHJpYnV0ZXMiLCAib3V0ZXJEZWNvcmF0aW9ucyIsICJhdG9taWNSYW5nZXMiLCAiYmlkaUlzb2xhdGVkUmFuZ2VzIiwgImdldElzb2xhdGVkUmFuZ2VzIiwgInNldHMiLCAiZnJvbURvYyIsICJ0b0RvYyIsICJhZGQiLCAic2Nyb2xsTWFyZ2lucyIsICJnZXRTY3JvbGxNYXJnaW5zIiwgInJpZ2h0IiwgImJvdHRvbSIsICJtIiwgInN0eWxlTW9kdWxlIiwgIkNoYW5nZWRSYW5nZSIsICJfQ2hhbmdlZFJhbmdlIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic2V0IiwgIm1lIiwgImRpZmYiLCAiZEkiLCAickkiLCAiVmlld1VwZGF0ZSIsICJfVmlld1VwZGF0ZSIsICJ0cmFuc2FjdGlvbnMiLCAiQ2hhbmdlU2V0IiwgInRyIiwgImNoYW5nZWRSYW5nZXMiLCAiRG9jVmlldyIsICJyZWFkQ29tcG9zaXRpb25BdCIsICJ0b3VjaGVzQ29tcG9zaXRpb24iLCAiY29tcG9zaXRpb24iLCAiZmluZENvbXBvc2l0aW9uUmFuZ2UiLCAicHJldkRlY28iLCAiZGVjb0RpZmYiLCAiZmluZENoYW5nZWREZWNvIiwgIm9sZExlbmd0aCIsICJvYnNlcnZlciIsICJjVmlldyIsICJnYXBzIiwgImN1cnNvciIsICJjb250ZW50IiwgImNvbXBMaW5lIiwgImVmZmVjdCIsICJmaXgiLCAiYyIsICJtdXN0UmVhZCIsICJmcm9tUG9pbnRlciIsICJhY3RpdmVFbHQiLCAiZm9jdXNlZCIsICJzZWxlY3Rpb25Ob3RGb2N1cyIsICJmb3JjZSIsICJtYWluIiwgImFuY2hvciIsICJoZWFkIiwgImJldHdlZW5VbmVkaXRhYmxlIiwgImR1bW15IiwgImluVW5lZGl0YWJsZSIsICJyYXdTZWwiLCAibmV4dFRvIiwgIm5leHRUb1VuZWRpdGFibGUiLCAic2VsIiwgImxpbmVTdGFydCIsICJuZXdSYW5nZSIsICJuZXdQb3MiLCAiZG9tVmlldyIsICJiZXN0IiwgImJlc3RQb3MiLCAiY2hpbGRPZmYiLCAidmlld3BvcnQiLCAiY29udGVudFdpZHRoIiwgImlzV2lkZXIiLCAid2lkZXN0IiwgImNoaWxkUmVjdCIsICJ3aWR0aCIsICJtZWFzdXJlIiwgImxpbmVIZWlnaHQiLCAiY2hhcldpZHRoIiwgInZzIiwgImFsbERlY28iLCAiZCIsICJkeW5hbWljT3V0ZXIiLCAib3V0ZXJEZWNvIiwgImR5bmFtaWMiLCAicmVmIiwgIm1hcmdpbnMiLCAidGFyZ2V0UmVjdCIsICJvZmZzZXRXaWR0aCIsICJvZmZzZXRIZWlnaHQiLCAiZmluZENvbXBvc2l0aW9uTm9kZSIsICJoZWFkUG9zIiwgInRleHRCZWZvcmUiLCAidGV4dEFmdGVyIiwgInRleHROb2RlIiwgImRlc2NBZnRlciIsICJkZXNjQmVmb3JlIiwgImZvdW5kIiwgImludiIsICJtYXJrcyIsICJwYXJlbnRWaWV3IiwgIkRlY29yYXRpb25Db21wYXJhdG9yJDEiLCAiY29tcCIsICJpbnNpZGUiLCAidG91Y2hlZCIsICJncm91cEF0IiwgImNhdGVnb3JpemUiLCAibGluZVBvcyIsICJjYXQiLCAiZ2V0ZHgiLCAiZ2V0ZHkiLCAieU92ZXJsYXAiLCAidXBUb3AiLCAidXBCb3QiLCAiZG9tUG9zQXRDb29yZHMiLCAiY2xvc2VzdCIsICJjbG9zZXN0UmVjdCIsICJjbG9zZXN0WCIsICJjbG9zZXN0WSIsICJjbG9zZXN0T3ZlcmxhcCIsICJhYm92ZSIsICJiZWxvdyIsICJhYm92ZVJlY3QiLCAiYmVsb3dSZWN0IiwgImR4IiwgImR5IiwgImRvbVBvc0luVGV4dCIsICJjbGlwWCIsICJjbG9zZXN0T2Zmc2V0IiwgImNsb3Nlc3REWSIsICJnZW5lcmFsU2lkZSIsICJwb3NBdENvb3JkcyIsICJjb29yZHMiLCAiZG9jVG9wIiwgImRvY0hlaWdodCIsICJ5T2Zmc2V0IiwgImhhbGZMaW5lIiwgImJvdW5jZWQiLCAicG9zQXRDb29yZHNJbXByZWNpc2UiLCAiZWxlbWVudCIsICJpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdCIsICJpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdCIsICJuZWFyZXN0IiwgImNvbnRlbnRSZWN0IiwgImludG8iLCAiZmluZENvbHVtbiIsICJibG9ja0F0IiwgIm1vdmVUb0xpbmVCb3VuZGFyeSIsICJpbmNsdWRlV3JhcCIsICJlZGl0b3JSZWN0IiwgIm1vdmVCeUNoYXIiLCAiYnkiLCAic3BhbnMiLCAiY2hlY2siLCAiY2hhciIsICJieUdyb3VwIiwgIm5leHRDYXQiLCAiQ2hhckNhdGVnb3J5IiwgIm1vdmVWZXJ0aWNhbGx5IiwgImRpc3RhbmNlIiwgInN0YXJ0UG9zIiwgImdvYWwiLCAic3RhcnRZIiwgInN0YXJ0Q29vcmRzIiwgInJlc29sdmVkR29hbCIsICJleHRyYSIsICJjdXJZIiwgImNoYXJSZWN0IiwgInNraXBBdG9taWNSYW5nZXMiLCAiYXRvbXMiLCAibW92ZWQiLCAic2tpcEF0b21zIiwgIm9sZFBvcyIsICJmIiwgIkxpbmVCcmVha1BsYWNlaG9sZGVyIiwgIkRPTVJlYWRlciIsICJwb2ludHMiLCAiRWRpdG9yU3RhdGUiLCAib2xkTGVuIiwgIm5leHRWaWV3IiwgInBvaW50IiwgInJlIiwgIm5leHRCcmVhayIsICJicmVha1NpemUiLCAiZnJvbVZpZXciLCAiaXNBdEVuZCIsICJET01Qb2ludCIsICJET01DaGFuZ2UiLCAidHlwZU92ZXIiLCAiaUhlYWQiLCAiaUFuY2hvciIsICJzZWxQb2ludHMiLCAic2VsZWN0aW9uUG9pbnRzIiwgInJlYWRlciIsICJzZWxlY3Rpb25Gcm9tUG9pbnRzIiwgIm9mZkZyb20iLCAib2ZmVG8iLCAiYXBwbHlET01DaGFuZ2UiLCAiZG9tQ2hhbmdlIiwgImNoYW5nZSIsICJuZXdTZWwiLCAibGFzdEtleSIsICJwcmVmZXJyZWRQb3MiLCAicHJlZmVycmVkU2lkZSIsICJmaW5kRGlmZiIsICJhcHBseURPTUNoYW5nZUlubmVyIiwgInVzZXJFdmVudCIsICJkZWZhdWx0VHIiLCAiZGVmYXVsdEluc2VydCIsICJhcHBseURlZmF1bHRJbnNlcnQiLCAiaCIsICJzdGFydFN0YXRlIiwgIm1haW5TZWwiLCAicmVwbGFjZWQiLCAiY29tcG9zaXRpb25SYW5nZSIsICJzaXplIiwgInJhbmdlQ2hhbmdlcyIsICJzZWxPZmYiLCAibWluTGVuIiwgImFkanVzdCIsICJtb3ZlIiwgImJhc2UiLCAiSW5wdXRTdGF0ZSIsICJvcmlnaW4iLCAiZmlyZWZveENvcHlDdXRIYWNrIiwgImV2ZW50QmVsb25nc1RvRWRpdG9yIiwgImhhbmRsZXJzIiwgInBsdWdpbnMiLCAiY29tcHV0ZUhhbmRsZXJzIiwgInBhc3NpdmUiLCAiZXhpc3RzIiwgIm1vZGlmaWVyQ29kZXMiLCAicGVuZGluZyIsICJQZW5kaW5nS2V5cyIsICJFbWFjc3lQZW5kaW5nS2V5cyIsICJtb3VzZVNlbGVjdGlvbiIsICJiaW5kSGFuZGxlciIsICJyZWNvcmQiLCAib2JzZXJ2ZXJzIiwgImRyYWdTY3JvbGxNYXJnaW4iLCAiZHJhZ1Njcm9sbFNwZWVkIiwgIk1vdXNlU2VsZWN0aW9uIiwgInN0YXJ0RXZlbnQiLCAic3R5bGUiLCAibXVzdFNlbGVjdCIsICJhZGRzU2VsZWN0aW9uUmFuZ2UiLCAiaXNJblByaW1hcnlTZWxlY3Rpb24iLCAiZ2V0Q2xpY2tUeXBlIiwgInN4IiwgInN5IiwgInVwZGF0ZWQiLCAiZmFjZXQiLCAiZHJhZ01vdmVzU2VsZWN0aW9uIiwgImJyb2tlbkNsaXBib2FyZEFQSSIsICJjYXB0dXJlUGFzdGUiLCAiZG9QYXN0ZSIsICJ0ZXh0RmlsdGVyIiwgImZpbHRlciIsICJpbnB1dCIsICJieUxpbmUiLCAibGFzdExpbmV3aXNlQ29weSIsICJsYXN0TGluZSIsICJtYWtlU3R5bGUiLCAiYmFzaWNNb3VzZVNlbGVjdGlvbiIsICJtdXN0Rm9jdXMiLCAibW91c2VTZWwiLCAicmFuZ2VGb3JDbGljayIsICJ2aXN1YWwiLCAiZmluZFBvc2l0aW9uU2lkZSIsICJxdWVyeVBvcyIsICJCYWRNb3VzZURldGFpbCIsICJsYXN0TW91c2VEb3duIiwgImxhc3RNb3VzZURvd25Db3VudCIsICJsYXN0TW91c2VEb3duVGltZSIsICJsYXN0VGltZSIsICJzdGFydFNlbCIsICJleHRlbmQiLCAibXVsdGlwbGUiLCAicmVtb3ZlZCIsICJzdGFydFJhbmdlIiwgInJlbW92ZVJhbmdlQXJvdW5kIiwgImlucHV0U3RhdGUiLCAiZHJvcFRleHQiLCAiZGlyZWN0IiwgImRyb3BQb3MiLCAiZHJhZ2dlZENvbnRlbnQiLCAiZGVsIiwgImlucyIsICJmaWxlcyIsICJyZWFkIiwgImZpbmlzaEZpbGUiLCAicyIsICJkYXRhIiwgImNhcHR1cmVDb3B5IiwgImNvcGllZFJhbmdlIiwgImxpbmV3aXNlIiwgImlzRm9jdXNDaGFuZ2UiLCAiQW5ub3RhdGlvbiIsICJmb2N1c0NoYW5nZVRyYW5zYWN0aW9uIiwgImZvY3VzIiwgImVmZmVjdHMiLCAiZ2V0RWZmZWN0IiwgInVwZGF0ZUZvckZvY3VzQ2hhbmdlIiwgInN0YXJ0Vmlld0hlaWdodCIsICJhcHBsaWVkRmlyZWZveEhhY2siLCAid3JhcHBpbmdXaGl0ZVNwYWNlIiwgImhlaWdodENoYW5nZUZsYWciLCAiY2xlYXJIZWlnaHRDaGFuZ2VGbGFnIiwgIkhlaWdodE9yYWNsZSIsICJsaW5lV3JhcHBpbmciLCAibGluZXMiLCAid2hpdGVTcGFjZSIsICJsaW5lSGVpZ2h0cyIsICJuZXdIZWlnaHQiLCAibGluZUxlbmd0aCIsICJrbm93bkhlaWdodHMiLCAiTWVhc3VyZWRIZWlnaHRzIiwgImhlaWdodHMiLCAiQmxvY2tJbmZvIiwgIl9CbG9ja0luZm8iLCAiX2NvbnRlbnQiLCAiUXVlcnlUeXBlIiwgIkVwc2lsb24iLCAiSGVpZ2h0TWFwIiwgIl9IZWlnaHRNYXAiLCAibm9kZXMiLCAib2xkRG9jIiwgIm9yYWNsZSIsICJOb2RlQnVpbGRlciIsICJIZWlnaHRNYXBUZXh0IiwgInNwbGl0IiwgImJyayIsICJIZWlnaHRNYXBCcmFuY2giLCAib2xkIiwgInZhbCIsICJIZWlnaHRNYXBCbG9jayIsICJfaGVpZ2h0IiwgIl9vcmFjbGUiLCAiX3ZhbHVlIiwgIl90eXBlIiwgIl9mb3JjZSIsICJtZWFzdXJlZCIsICJfSGVpZ2h0TWFwVGV4dCIsICJIZWlnaHRNYXBHYXAiLCAiX0hlaWdodE1hcEdhcCIsICJmaXJzdExpbmUiLCAicGVyTGluZSIsICJwZXJDaGFyIiwgInRvdGFsUGVyTGluZSIsICJndWVzcyIsICJsaW5lVG9wIiwgImxpbmVzQWJvdmUiLCAiZmlyc3QiLCAic2luZ2xlSGVpZ2h0IiwgIm1pZCIsICJyaWdodFRvcCIsICJyaWdodE9mZnNldCIsICJzdWJRdWVyeSIsICJyaWdodFN0YXJ0IiwgIm1lcmdlR2FwcyIsICJyZWJhbGFuY2UiLCAiYXJvdW5kIiwgInJlbGV2YW50V2lkZ2V0SGVpZ2h0IiwgIl9Ob2RlQnVpbGRlciIsICJicmVha3MiLCAiZ2FwIiwgImhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMiLCAiRGVjb3JhdGlvbkNvbXBhcmF0b3IiLCAidmlzaWJsZVBpeGVsUmFuZ2UiLCAicGFkZGluZ1RvcCIsICJwYXJlbnRSZWN0IiwgImluV2luZG93IiwgImZ1bGxQaXhlbFJhbmdlIiwgIkxpbmVHYXAiLCAiZGlzcGxheVNpemUiLCAiZ0EiLCAiZ0IiLCAidmlld1N0YXRlIiwgIndyYXBwaW5nIiwgIkxpbmVHYXBXaWRnZXQiLCAidmVydGljYWwiLCAiVmlld1N0YXRlIiwgIklkU2NhbGVyIiwgImd1ZXNzV3JhcHBpbmciLCAidmlld3BvcnRzIiwgIlZpZXdwb3J0IiwgInNjYWxlciIsICJCaWdTY2FsZXIiLCAic2NhbGVCbG9jayIsICJzY3JvbGxUYXJnZXQiLCAiY29udGVudENoYW5nZXMiLCAiaGVpZ2h0Q2hhbmdlcyIsICJwcmV2SGVpZ2h0IiwgInNjcm9sbEFuY2hvciIsICJ2aWV3cG9ydENoYW5nZSIsICJyZWZyZXNoIiwgImRvbVJlY3QiLCAibWVhc3VyZUNvbnRlbnQiLCAicGFkZGluZ0JvdHRvbSIsICJzY3JvbGxUb3AiLCAicGl4ZWxWaWV3cG9ydCIsICJkVG9wIiwgImRCb3R0b20iLCAiaW5WaWV3IiwgIm1hcmdpblRvcCIsICJtYXAiLCAidmlzaWJsZVRvcCIsICJ2aXNpYmxlQm90dG9tIiwgInZpZXdIZWlnaHQiLCAidG9wUG9zIiwgIm1hcHBlZCIsICJjdXJyZW50IiwgIm1heU1lYXN1cmUiLCAiaGFsZk1hcmdpbiIsICJkb3VibGVNYXJnaW4iLCAiYWRkR2FwIiwgInN0cnVjdHVyZSIsICJhdm9pZCIsICJmaW5kIiwgImNoZWNrTGluZSIsICJsaW5lU3RydWN0dXJlIiwgInZpZXdGcm9tIiwgInZpZXdUbyIsICJtYXJnaW5IZWlnaHQiLCAiYm90IiwgInRhcmdldEZyYWMiLCAiZmluZEZyYWN0aW9uIiwgInNwYWNlRnJhYyIsICJmaW5kUG9zaXRpb24iLCAibWFyZ2luV2lkdGgiLCAiaG9yaXpPZmZzZXQiLCAicHhMZWZ0IiwgInB4UmlnaHQiLCAiZnJhY3Rpb24iLCAibnciLCAic3RhdGVEZWNvIiwgInRvdGFsIiwgInJhdGlvIiwgImNvdW50ZWQiLCAiYXJyYXkiLCAibiIsICJfQmlnU2NhbGVyIiwgImhlaWdodE1hcCIsICJ2cEhlaWdodCIsICJkb21CYXNlIiwgIm9iaiIsICJiVG9wIiwgImJCb3R0b20iLCAidGhlbWUiLCAic3RycyIsICJkYXJrVGhlbWUiLCAiYmFzZVRoZW1lSUQiLCAiU3R5bGVNb2R1bGUiLCAiYmFzZUxpZ2h0SUQiLCAiYmFzZURhcmtJRCIsICJsaWdodERhcmtJRHMiLCAiYnVpbGRUaGVtZSIsICJzY29wZXMiLCAiYmFzZVRoZW1lJDEiLCAib2JzZXJ2ZU9wdGlvbnMiLCAidXNlQ2hhckRhdGEiLCAiRE9NT2JzZXJ2ZXIiLCAibXV0YXRpb25zIiwgIm11dCIsICJFZGl0Q29udGV4dE1hbmFnZXIiLCAiZW50cmllcyIsICJnIiwgIndhc0NoYW5nZWQiLCAic2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrIiwgImxvY2FsIiwgImtleUNvZGUiLCAiZmx1c2giLCAicmVjb3JkcyIsICJyZWFkU2VsZWN0aW9uIiwgImhhbmRsZWQiLCAicmVjIiwgImNoaWxkQmVmb3JlIiwgImZpbmRDaGlsZCIsICJjaGlsZEFmdGVyIiwgIl9jIiwgImN1clZpZXciLCAiYnVpbGRTZWxlY3Rpb25SYW5nZUZyb21SYW5nZSIsICJjdXJBbmNob3IiLCAibmV3TGVuIiwgImZvcm1hdCIsICJsaW5lU3R5bGUiLCAidGhpY2tuZXNzIiwgImRyaWZ0ZWQiLCAiYWJvcnQiLCAiX2Zyb21CIiwgIl90b0IiLCAicmV2ZXJ0ZWQiLCAiY29udGV4dFBvcyIsICJjbGlwTGVuIiwgImVkaXRvclBvcyIsICJFZGl0b3JWaWV3IiwgIl9FZGl0b3JWaWV3IiwgImNvbmZpZyIsICJkaXNwYXRjaCIsICJ0cnMiLCAiVHJhbnNhY3Rpb24iLCAicmVkcmF3biIsICJhdHRyc0NoYW5nZWQiLCAiZm9jdXNGbGFnIiwgImRpc3BhdGNoRm9jdXMiLCAicGVuZGluZ0tleSIsICJDYWNoZWRPcmRlciIsICJsaXN0ZW5lciIsICJuZXdTdGF0ZSIsICJoYWRGb2N1cyIsICJwcmV2U3BlY3MiLCAic3BlY3MiLCAibmV3UGx1Z2lucyIsICJzRE9NIiwgInNjcm9sbEFuY2hvclBvcyIsICJzY3JvbGxBbmNob3JIZWlnaHQiLCAibWVhc3VyaW5nIiwgIkJhZE1lYXN1cmUiLCAiZWRpdG9yQXR0cnMiLCAiYXR0cnNGcm9tRmFjZXQiLCAiY29udGVudEF0dHJzIiwgImNoYW5nZWRDb250ZW50IiwgImNoYW5nZWRFZGl0b3IiLCAiZGl2IiwgIm5vbmNlIiwgInJlcXVlc3QiLCAia25vd24iLCAiaW5pdGlhbCIsICJNYXhCaWRpTGluZSIsICJlbnRyeSIsICJzY3JvbGxMZWZ0IiwgInByZWZpeCIsICJQcmVjIiwgIl9DYWNoZWRPcmRlciIsICJmcmVzaCIsICJjYWNoZSIsICJsYXN0RGlyIiwgInNvdXJjZXMiLCAiY3VycmVudFBsYXRmb3JtIiwgIm5vcm1hbGl6ZUtleU5hbWUiLCAicGxhdGZvcm0iLCAicGFydHMiLCAiYWx0IiwgImN0cmwiLCAic2hpZnQiLCAibWV0YSIsICJtb2QiLCAibW9kaWZpZXJzIiwgImhhbmRsZUtleUV2ZW50cyIsICJydW5IYW5kbGVycyIsICJnZXRLZXltYXAiLCAia2V5bWFwIiwgIktleW1hcHMiLCAiYmluZGluZ3MiLCAiYnVpbGRLZXltYXAiLCAic3RvcmVkUHJlZml4IiwgIlByZWZpeFRpbWVvdXQiLCAiYnVpbGRLZXltYXAiLCAiYmluZGluZ3MiLCAicGxhdGZvcm0iLCAiY3VycmVudFBsYXRmb3JtIiwgImJvdW5kIiwgImlzUHJlZml4IiwgImNoZWNrUHJlZml4IiwgIm5hbWUiLCAiaXMiLCAiY3VycmVudCIsICJhZGQiLCAic2NvcGUiLCAia2V5IiwgImNvbW1hbmQiLCAicHJldmVudERlZmF1bHQiLCAic3RvcFByb3BhZ2F0aW9uIiwgIl9hIiwgIl9iIiwgInNjb3BlT2JqIiwgInBhcnRzIiwgImsiLCAibm9ybWFsaXplS2V5TmFtZSIsICJpIiwgInByZWZpeCIsICJ2aWV3IiwgIm91ck9iaiIsICJmdWxsIiwgImJpbmRpbmciLCAiYiIsICJzY29wZXMiLCAiYW55IiwgImN1cnJlbnRLZXlFdmVudCIsICJydW5IYW5kbGVycyIsICJtYXAiLCAiZXZlbnQiLCAia2V5TmFtZSIsICJjaGFyQ29kZSIsICJjb2RlUG9pbnRBdCIsICJpc0NoYXIiLCAiY29kZVBvaW50U2l6ZSIsICJoYW5kbGVkIiwgInByZXZlbnRlZCIsICJtb2RpZmllckNvZGVzIiwgInJhbiIsICJydW5Gb3IiLCAiY21kIiwgImJhc2VOYW1lIiwgInNoaWZ0TmFtZSIsICJtb2RpZmllcnMiLCAiYnJvd3NlciIsICJiYXNlIiwgInNoaWZ0IiwgIlVuaWNvZGVSZWdleHBTdXBwb3J0IiwgIlBsYWNlaG9sZGVyIiwgIldpZGdldFR5cGUiLCAiY29udGVudCIsICJ2aWV3IiwgIndyYXAiLCAiZG9tIiwgInJlY3RzIiwgImNsaWVudFJlY3RzRm9yIiwgInN0eWxlIiwgInJlY3QiLCAiZmxhdHRlblJlY3QiLCAibGluZUhlaWdodCIsICJwbGFjZWhvbGRlciIsICJwbHVnaW4iLCAiVmlld1BsdWdpbiIsICJEZWNvcmF0aW9uIiwgInYiLCAiRWRpdG9yVmlldyIsICJiYXNlVGhlbWUiLCAiRWRpdG9yVmlldyIsICJHdXR0ZXJNYXJrZXIiLCAiUmFuZ2VWYWx1ZSIsICJvdGhlciIsICJkb20iLCAiTWFwTW9kZSIsICJndXR0ZXJMaW5lQ2xhc3MiLCAiRmFjZXQiLCAibmV4dFByb3BJRCIsICJSYW5nZSIsICJmcm9tIiwgInRvIiwgIk5vZGVQcm9wIiwgImNvbmZpZyIsICJtYXRjaCIsICJOb2RlVHlwZSIsICJ0eXBlIiwgInJlc3VsdCIsICJzdHIiLCAidmFsdWUiLCAiTW91bnRlZFRyZWUiLCAidHJlZSIsICJvdmVybGF5IiwgInBhcnNlciIsICJub1Byb3BzIiwgIl9Ob2RlVHlwZSIsICJuYW1lIiwgInByb3BzIiwgImlkIiwgImZsYWdzIiwgInNwZWMiLCAic3JjIiwgInByb3AiLCAiZ3JvdXAiLCAibWFwIiwgImRpcmVjdCIsICJub2RlIiwgImdyb3VwcyIsICJpIiwgImZvdW5kIiwgIkNhY2hlZE5vZGUiLCAiQ2FjaGVkSW5uZXJOb2RlIiwgIkl0ZXJNb2RlIiwgIlRyZWUiLCAiX1RyZWUiLCAidHlwZSIsICJjaGlsZHJlbiIsICJwb3NpdGlvbnMiLCAibGVuZ3RoIiwgInByb3BzIiwgInByb3AiLCAidmFsdWUiLCAibW91bnRlZCIsICJNb3VudGVkVHJlZSIsICJjaCIsICJzdHIiLCAibW9kZSIsICJUcmVlQ3Vyc29yIiwgInBvcyIsICJzaWRlIiwgInNjb3BlIiwgImN1cnNvciIsICJUcmVlTm9kZSIsICJub2RlIiwgInJlc29sdmVOb2RlIiwgInN0YWNrSXRlcmF0b3IiLCAic3BlYyIsICJlbnRlciIsICJsZWF2ZSIsICJmcm9tIiwgInRvIiwgImFub24iLCAiYyIsICJlbnRlcmVkIiwgInJlc3VsdCIsICJpZCIsICJjb25maWciLCAiYmFsYW5jZVJhbmdlIiwgIk5vZGVUeXBlIiwgImRhdGEiLCAiYnVpbGRUcmVlIiwgIkZsYXRCdWZmZXJDdXJzb3IiLCAiX0ZsYXRCdWZmZXJDdXJzb3IiLCAiYnVmZmVyIiwgImluZGV4IiwgIlRyZWVCdWZmZXIiLCAiX1RyZWVCdWZmZXIiLCAic2V0IiwgImVuZEluZGV4IiwgInN0YXJ0SW5kZXgiLCAiZGlyIiwgInBpY2siLCAiaSIsICJjaGVja1NpZGUiLCAic3RhcnRJIiwgImVuZEkiLCAiYiIsICJjb3B5IiwgImxlbiIsICJqIiwgIm92ZXJsYXlzIiwgIl9hIiwgInBhcmVudCIsICJzY2FuIiwgImlubmVyIiwgIkJhc2VOb2RlIiwgImJlZm9yZSIsICJhZnRlciIsICJyIiwgImdldENoaWxkcmVuIiwgImNvbnRleHQiLCAibWF0Y2hOb2RlQ29udGV4dCIsICJsYXN0IiwgIl9UcmVlTm9kZSIsICJfdHJlZSIsICJfcGFyZW50IiwgImUiLCAibmV4dCIsICJzdGFydCIsICJCdWZmZXJOb2RlIiwgIkJ1ZmZlckNvbnRleHQiLCAiaGFzQ2hpbGQiLCAiclBvcyIsICJ2YWwiLCAiY3VyIiwgImZvdW5kIiwgInAiLCAiX0J1ZmZlck5vZGUiLCAicGFyZW50U3RhcnQiLCAiaXRlclN0YWNrIiwgImhlYWRzIiwgInBpY2tlZCIsICJuZXdIZWFkcyIsICJTdGFja0l0ZXJhdG9yIiwgInRyZWUiLCAibGF5ZXJzIiwgIm1vdW50IiwgInJvb3QiLCAibiIsICJkIiwgImNoaWxkIiwgImNhY2hlIiwgImRlcHRoIiwgIm11c3RMZWF2ZSIsICJ0eXBlcyIsICJub2RlU2V0IiwgIm1heEJ1ZmZlckxlbmd0aCIsICJyZXVzZWQiLCAibWluUmVwZWF0VHlwZSIsICJjb250ZXh0SGFzaCIsICJsb29rQWhlYWQiLCAidGFrZU5vZGUiLCAibWluUG9zIiwgImluUmVwZWF0IiwgImVuZCIsICJzaXplIiwgImxvb2tBaGVhZEF0U3RhcnQiLCAiY29udGV4dEF0U3RhcnQiLCAic3RhcnRQb3MiLCAiZmluZEJ1ZmZlclNpemUiLCAiZW5kUG9zIiwgImNvcHlUb0J1ZmZlciIsICJsb2NhbENoaWxkcmVuIiwgImxvY2FsUG9zaXRpb25zIiwgImxvY2FsSW5SZXBlYXQiLCAibGFzdEdyb3VwIiwgImxhc3RFbmQiLCAibWFrZVJlcGVhdExlYWYiLCAidGFrZUZsYXROb2RlIiwgIm1ha2UiLCAibWFrZUJhbGFuY2VkIiwgIm1ha2VUcmVlIiwgIm5vZGVzIiwgIm5vZGVDb3VudCIsICJzdG9wQXQiLCAibGFzdEkiLCAibG9va0FoZWFkUHJvcCIsICJOb2RlUHJvcCIsICJiYXNlIiwgInBhaXIiLCAibWF4U2l6ZSIsICJmb3JrIiwgInNraXAiLCAibWluU3RhcnQiLCAibm9kZVNpemUiLCAibG9jYWxTa2lwcGVkIiwgIm5vZGVTdGFydCIsICJidWZmZXJTdGFydCIsICJub2RlU2l6ZUNhY2hlIiwgImJhbGFuY2VUeXBlIiwgIm1rVG9wIiwgIm1rVHJlZSIsICJ0b3RhbCIsICJtYXhDaGlsZCIsICJkaXZpZGUiLCAib2Zmc2V0IiwgImdyb3VwRnJvbSIsICJncm91cFN0YXJ0IiwgImdyb3VwU2l6ZSIsICJuZXh0U2l6ZSIsICJvbmx5IiwgIlRyZWVGcmFnbWVudCIsICJfVHJlZUZyYWdtZW50IiwgImZyb20iLCAidG8iLCAidHJlZSIsICJvZmZzZXQiLCAib3BlblN0YXJ0IiwgIm9wZW5FbmQiLCAiZnJhZ21lbnRzIiwgInBhcnRpYWwiLCAicmVzdWx0IiwgImYiLCAiY2hhbmdlcyIsICJtaW5HYXAiLCAiZkkiLCAibmV4dEYiLCAiY0kiLCAicG9zIiwgIm9mZiIsICJuZXh0QyIsICJuZXh0UG9zIiwgImN1dCIsICJmRnJvbSIsICJmVG8iLCAiUGFyc2VyIiwgImlucHV0IiwgInJhbmdlcyIsICJTdHJpbmdJbnB1dCIsICJyIiwgIlJhbmdlIiwgInBhcnNlIiwgImRvbmUiLCAic3RyaW5nIiwgInN0b3BwZWRJbm5lciIsICJOb2RlUHJvcCIsICJuZXh0VGFnSUQiLCAiVGFnIiwgIl9UYWciLCAibmFtZSIsICJzZXQiLCAiYmFzZSIsICJtb2RpZmllZCIsICJtb2QiLCAibmFtZU9yUGFyZW50IiwgInBhcmVudCIsICJ0YWciLCAidCIsICJNb2RpZmllciIsICJhIiwgImIiLCAibmV4dE1vZGlmaWVySUQiLCAiX01vZGlmaWVyIiwgIm1vZHMiLCAiZXhpc3RzIiwgInNhbWVBcnJheSIsICJtIiwgImNvbmZpZ3MiLCAicG93ZXJTZXQiLCAiY29uZmlnIiwgIngiLCAiYXJyYXkiLCAic2V0cyIsICJpIiwgImoiLCAiZSIsICJydWxlTm9kZVByb3AiLCAiTm9kZVByb3AiLCAiUnVsZSIsICJ0YWdzIiwgIm1vZGUiLCAiY29udGV4dCIsICJuZXh0IiwgIm90aGVyIiwgInRhZ0hpZ2hsaWdodGVyIiwgIm9wdGlvbnMiLCAibWFwIiwgInN0eWxlIiwgInRhZyIsICJzY29wZSIsICJhbGwiLCAiY2xzIiwgInN1YiIsICJ0YWdDbGFzcyIsICJ0IiwgIlRhZyIsICJjb21tZW50IiwgIm5hbWUiLCAidHlwZU5hbWUiLCAicHJvcGVydHlOYW1lIiwgImxpdGVyYWwiLCAic3RyaW5nIiwgIm51bWJlciIsICJjb250ZW50IiwgImhlYWRpbmciLCAia2V5d29yZCIsICJvcGVyYXRvciIsICJwdW5jdHVhdGlvbiIsICJicmFja2V0IiwgIm1ldGEiLCAidGFncyIsICJ2YWwiLCAiY2xhc3NIaWdobGlnaHRlciIsICJ0YWdIaWdobGlnaHRlciIsICJfYSIsICJsYW5ndWFnZURhdGFQcm9wIiwgIk5vZGVQcm9wIiwgInN1Ymxhbmd1YWdlUHJvcCIsICJOb2RlUHJvcCIsICJMYW5ndWFnZSIsICJkYXRhIiwgInBhcnNlciIsICJleHRyYUV4dGVuc2lvbnMiLCAibmFtZSIsICJFZGl0b3JTdGF0ZSIsICJzeW50YXhUcmVlIiwgImxhbmd1YWdlIiwgInN0YXRlIiwgInBvcyIsICJzaWRlIiwgInRvcCIsICJ0b3BOb2RlQXQiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJiYXNlIiwgInN1YiIsICJpbm5lck5vZGUiLCAic3VibGFuZyIsICJsYW5nIiwgInJlc3VsdCIsICJleHBsb3JlIiwgInRyZWUiLCAiZnJvbSIsICJtb3VudCIsICJyIiwgInNpemUiLCAiaSIsICJjaCIsICJUcmVlIiwgIlN0YXRlRWZmZWN0IiwgInRvcExhbmciLCAibm9kZSIsICJJdGVyTW9kZSIsICJzeW50YXhUcmVlIiwgInN0YXRlIiwgImZpZWxkIiwgIkxhbmd1YWdlIiwgIlRyZWUiLCAiRG9jSW5wdXQiLCAiZG9jIiwgInBvcyIsICJmcm9tIiwgInRvIiwgInN0cmluZ1N0YXJ0IiwgImN1cnJlbnRDb250ZXh0IiwgIlBhcnNlQ29udGV4dCIsICJfUGFyc2VDb250ZXh0IiwgInBhcnNlciIsICJzdGF0ZSIsICJmcmFnbWVudHMiLCAidHJlZSIsICJ0cmVlTGVuIiwgInZpZXdwb3J0IiwgInNraXBwZWQiLCAic2NoZWR1bGVPbiIsICJUcmVlIiwgInVudGlsIiwgInVwdG8iLCAiX2EiLCAiZW5kVGltZSIsICJkb25lIiwgIlRyZWVGcmFnbWVudCIsICJmIiwgInByZXYiLCAiciIsICJjdXRGcmFnbWVudHMiLCAiY2hhbmdlcyIsICJuZXdTdGF0ZSIsICJyYW5nZXMiLCAiZnJvbUEiLCAidG9BIiwgImZyb21CIiwgInRvQiIsICJzdGFydExlbiIsICJQYXJzZXIiLCAiaW5wdXQiLCAiY3giLCAiTm9kZVR5cGUiLCAiZnJhZ3MiLCAiTGFuZ3VhZ2VTdGF0ZSIsICJfTGFuZ3VhZ2VTdGF0ZSIsICJjb250ZXh0IiwgInRyIiwgIm5ld0N4IiwgInZwVG8iLCAicGFyc2VTdGF0ZSIsICJsYW5ndWFnZSIsICJMYW5ndWFnZSIsICJTdGF0ZUZpZWxkIiwgInZhbHVlIiwgInJlcXVlc3RJZGxlIiwgImNhbGxiYWNrIiwgInRpbWVvdXQiLCAiaWRsZSIsICJpc0lucHV0UGVuZGluZyIsICJwYXJzZVdvcmtlciIsICJWaWV3UGx1Z2luIiwgInZpZXciLCAidXBkYXRlIiwgImZpZWxkIiwgImRlYWRsaW5lIiwgIm5vdyIsICJ2aWV3cG9ydEZpcnN0IiwgImVyciIsICJsb2dFeGNlcHRpb24iLCAiRmFjZXQiLCAibGFuZ3VhZ2VzIiwgIkVkaXRvclZpZXciLCAibGFuZyIsICJIaWdobGlnaHRTdHlsZSIsICJfSGlnaGxpZ2h0U3R5bGUiLCAic3BlY3MiLCAib3B0aW9ucyIsICJtb2RTcGVjIiwgImRlZiIsICJzcGVjIiwgImNscyIsICJTdHlsZU1vZHVsZSIsICJhbGwiLCAic2NvcGVPcHQiLCAiTGFuZ3VhZ2UiLCAidHlwZSIsICJsYW5ndWFnZURhdGFQcm9wIiwgInRhZ0hpZ2hsaWdodGVyIiwgInN0eWxlIiwgImRlZmF1bHRIaWdobGlnaHRTdHlsZSIsICJIaWdobGlnaHRTdHlsZSIsICJ0YWdzIiwgInR5cGVBcnJheSIsICJOb2RlVHlwZSIsICJtYXJrcyIsICJEZWNvcmF0aW9uIiwgIkRpcmVjdGlvbiIsICJDT01NRU5UQVRPUl9HTE9CQUwiLCAiYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSIsICJGYWNldCIsICJ2YWx1ZXMiLCAiYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXMiLCAiQ29tcGFydG1lbnQiLCAiaGlkZUVtcHR5RGlmZkd1dHRlclN0YXRlIiwgImhpZGVFbXB0eURpZmZHdXR0ZXIiLCAicHJldmlld01vZGVTdGF0ZSIsICJwcmV2aWV3TW9kZSIsICJlZGl0TW9kZVZhbHVlU3RhdGUiLCAiZWRpdE1vZGVWYWx1ZSIsICJlZGl0TW9kZSIsICJmdWxsUmVsb2FkRWZmZWN0IiwgIlN0YXRlRWZmZWN0IiwgIm5leHRQcm9wSUQiLCAiUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJOb2RlUHJvcCIsICJjb25maWciLCAibWF0Y2giLCAiTm9kZVR5cGUiLCAidHlwZSIsICJyZXN1bHQiLCAic3RyIiwgInZhbHVlIiwgIk1vdW50ZWRUcmVlIiwgInRyZWUiLCAib3ZlcmxheSIsICJwYXJzZXIiLCAibm9Qcm9wcyIsICJfTm9kZVR5cGUiLCAibmFtZSIsICJwcm9wcyIsICJpZCIsICJmbGFncyIsICJzcGVjIiwgInNyYyIsICJwcm9wIiwgImdyb3VwIiwgIm1hcCIsICJkaXJlY3QiLCAibm9kZSIsICJncm91cHMiLCAiaSIsICJmb3VuZCIsICJOb2RlU2V0IiwgIl9Ob2RlU2V0IiwgInR5cGVzIiwgIm5ld1R5cGVzIiwgIm5ld1Byb3BzIiwgInNvdXJjZSIsICJhZGQiLCAiQ2FjaGVkTm9kZSIsICJDYWNoZWRJbm5lck5vZGUiLCAiSXRlck1vZGUiLCAiVHJlZSIsICJfVHJlZSIsICJjaGlsZHJlbiIsICJwb3NpdGlvbnMiLCAibGVuZ3RoIiwgIm1vdW50ZWQiLCAiY2giLCAibW9kZSIsICJUcmVlQ3Vyc29yIiwgInBvcyIsICJzaWRlIiwgInNjb3BlIiwgImN1cnNvciIsICJUcmVlTm9kZSIsICJyZXNvbHZlTm9kZSIsICJzdGFja0l0ZXJhdG9yIiwgImVudGVyIiwgImxlYXZlIiwgImFub24iLCAiYyIsICJlbnRlcmVkIiwgImJhbGFuY2VSYW5nZSIsICJkYXRhIiwgImJ1aWxkVHJlZSIsICJGbGF0QnVmZmVyQ3Vyc29yIiwgIl9GbGF0QnVmZmVyQ3Vyc29yIiwgImJ1ZmZlciIsICJpbmRleCIsICJUcmVlQnVmZmVyIiwgIl9UcmVlQnVmZmVyIiwgInNldCIsICJlbmRJbmRleCIsICJzdGFydEluZGV4IiwgImRpciIsICJwaWNrIiwgImNoZWNrU2lkZSIsICJzdGFydEkiLCAiZW5kSSIsICJiIiwgImNvcHkiLCAibGVuIiwgImoiLCAib3ZlcmxheXMiLCAiX2EiLCAicGFyZW50IiwgInNjYW4iLCAiaW5uZXIiLCAiQmFzZU5vZGUiLCAiYmVmb3JlIiwgImFmdGVyIiwgInIiLCAiZ2V0Q2hpbGRyZW4iLCAiY29udGV4dCIsICJtYXRjaE5vZGVDb250ZXh0IiwgImxhc3QiLCAiX1RyZWVOb2RlIiwgIl90cmVlIiwgIl9wYXJlbnQiLCAiZSIsICJuZXh0IiwgInN0YXJ0IiwgIkJ1ZmZlck5vZGUiLCAiQnVmZmVyQ29udGV4dCIsICJoYXNDaGlsZCIsICJyUG9zIiwgInZhbCIsICJjdXIiLCAicCIsICJfQnVmZmVyTm9kZSIsICJwYXJlbnRTdGFydCIsICJpdGVyU3RhY2siLCAiaGVhZHMiLCAicGlja2VkIiwgIm5ld0hlYWRzIiwgIlN0YWNrSXRlcmF0b3IiLCAibGF5ZXJzIiwgIm1vdW50IiwgInJvb3QiLCAibiIsICJkIiwgImNoaWxkIiwgImNhY2hlIiwgImRlcHRoIiwgIm11c3RMZWF2ZSIsICJub2RlU2V0IiwgIm1heEJ1ZmZlckxlbmd0aCIsICJyZXVzZWQiLCAibWluUmVwZWF0VHlwZSIsICJjb250ZXh0SGFzaCIsICJsb29rQWhlYWQiLCAidGFrZU5vZGUiLCAibWluUG9zIiwgImluUmVwZWF0IiwgImVuZCIsICJzaXplIiwgImxvb2tBaGVhZEF0U3RhcnQiLCAiY29udGV4dEF0U3RhcnQiLCAic3RhcnRQb3MiLCAiZmluZEJ1ZmZlclNpemUiLCAiZW5kUG9zIiwgImNvcHlUb0J1ZmZlciIsICJsb2NhbENoaWxkcmVuIiwgImxvY2FsUG9zaXRpb25zIiwgImxvY2FsSW5SZXBlYXQiLCAibGFzdEdyb3VwIiwgImxhc3RFbmQiLCAibWFrZVJlcGVhdExlYWYiLCAidGFrZUZsYXROb2RlIiwgIm1ha2UiLCAibWFrZUJhbGFuY2VkIiwgIm1ha2VUcmVlIiwgIm5vZGVzIiwgIm5vZGVDb3VudCIsICJzdG9wQXQiLCAibGFzdEkiLCAibG9va0FoZWFkUHJvcCIsICJiYXNlIiwgInBhaXIiLCAibWF4U2l6ZSIsICJmb3JrIiwgInNraXAiLCAibWluU3RhcnQiLCAibm9kZVNpemUiLCAibG9jYWxTa2lwcGVkIiwgIm5vZGVTdGFydCIsICJidWZmZXJTdGFydCIsICJub2RlU2l6ZUNhY2hlIiwgImJhbGFuY2VUeXBlIiwgIm1rVG9wIiwgIm1rVHJlZSIsICJ0b3RhbCIsICJtYXhDaGlsZCIsICJkaXZpZGUiLCAib2Zmc2V0IiwgImdyb3VwRnJvbSIsICJncm91cFN0YXJ0IiwgImdyb3VwU2l6ZSIsICJuZXh0U2l6ZSIsICJvbmx5IiwgIlRyZWVGcmFnbWVudCIsICJfVHJlZUZyYWdtZW50IiwgImZyb20iLCAidG8iLCAidHJlZSIsICJvZmZzZXQiLCAib3BlblN0YXJ0IiwgIm9wZW5FbmQiLCAiZnJhZ21lbnRzIiwgInBhcnRpYWwiLCAicmVzdWx0IiwgImYiLCAiY2hhbmdlcyIsICJtaW5HYXAiLCAiZkkiLCAibmV4dEYiLCAiY0kiLCAicG9zIiwgIm9mZiIsICJuZXh0QyIsICJuZXh0UG9zIiwgImN1dCIsICJmRnJvbSIsICJmVG8iLCAiUGFyc2VyIiwgImlucHV0IiwgInJhbmdlcyIsICJTdHJpbmdJbnB1dCIsICJyIiwgIlJhbmdlIiwgInBhcnNlIiwgImRvbmUiLCAic3RyaW5nIiwgInN0b3BwZWRJbm5lciIsICJOb2RlUHJvcCIsICJUZXh0IiwgIl9UZXh0IiwgInBvcyIsICJuIiwgImZyb20iLCAidG8iLCAidGV4dCIsICJjbGlwIiwgInBhcnRzIiwgIlRleHROb2RlIiwgIm90aGVyIiwgInN0YXJ0IiwgImVuZCIsICJhIiwgIlJhd1RleHRDdXJzb3IiLCAiYiIsICJza2lwIiwgImRpciIsICJQYXJ0aWFsVGV4dEN1cnNvciIsICJpbm5lciIsICJMaW5lQ3Vyc29yIiwgImxpbmVzIiwgIlRleHRMZWFmIiwgIl9UZXh0TGVhZiIsICJsZW5ndGgiLCAidGV4dExlbmd0aCIsICJ0YXJnZXQiLCAiaXNMaW5lIiwgImxpbmUiLCAib2Zmc2V0IiwgImkiLCAic3RyaW5nIiwgIkxpbmUiLCAib3BlbiIsICJzbGljZVRleHQiLCAicHJldiIsICJqb2luZWQiLCAiYXBwZW5kVGV4dCIsICJtaWQiLCAibmV3TGVuIiwgImxpbmVTZXAiLCAicmVzdWx0IiwgInBhcnQiLCAibGVuIiwgIl9UZXh0Tm9kZSIsICJjaGlsZHJlbiIsICJjaGlsZCIsICJlbmRMaW5lIiwgImNoaWxkT3BlbiIsICJ1cGRhdGVkIiwgInRvdGFsTGluZXMiLCAiY29weSIsICJpQSIsICJpQiIsICJlQSIsICJlQiIsICJjaEEiLCAiY2hCIiwgImwiLCAiY2giLCAiZmxhdCIsICJjaHVuayIsICJtYXhDaHVuayIsICJtaW5DaHVuayIsICJjaHVua2VkIiwgImN1cnJlbnRMaW5lcyIsICJjdXJyZW50TGVuIiwgImN1cnJlbnRDaHVuayIsICJhZGQiLCAibGFzdCIsICJub2RlIiwgImZsdXNoIiwgImZpcnN0IiwgInRvcCIsICJvZmZzZXRWYWx1ZSIsICJzaXplIiwgIm5leHQiLCAibGltaXQiLCAidmFsdWUiLCAiZG9uZSIsICJsaW5lQnJlYWsiLCAibnVtYmVyIiwgImV4dGVuZCIsICJpc0V4dGVuZGluZ0NoYXIiLCAiY29kZSIsICJpc1JlZ2lvbmFsSW5kaWNhdG9yIiwgIlpXSiIsICJmaW5kQ2x1c3RlckJyZWFrIiwgInN0ciIsICJmb3J3YXJkIiwgImluY2x1ZGVFeHRlbmRpbmciLCAibmV4dENsdXN0ZXJCcmVhayIsICJwcmV2Q2x1c3RlckJyZWFrIiwgInN1cnJvZ2F0ZUxvdyIsICJzdXJyb2dhdGVIaWdoIiwgImNvZGVQb2ludEF0IiwgImNvZGVQb2ludFNpemUiLCAiY291bnRCZWZvcmUiLCAiZm91bmQiLCAiY29kZTAiLCAiY29kZTEiLCAiY29kZVBvaW50U2l6ZSIsICJjb2RlIiwgIkRlZmF1bHRTcGxpdCIsICJNYXBNb2RlIiwgIkNoYW5nZURlc2MiLCAiX0NoYW5nZURlc2MiLCAic2VjdGlvbnMiLCAicmVzdWx0IiwgImkiLCAiaW5zIiwgImYiLCAicG9zQSIsICJwb3NCIiwgImxlbiIsICJpbmRpdmlkdWFsIiwgIml0ZXJDaGFuZ2VzIiwgIm90aGVyIiwgImNvbXBvc2VTZXRzIiwgImJlZm9yZSIsICJtYXBTZXQiLCAicG9zIiwgImFzc29jIiwgIm1vZGUiLCAiZW5kQSIsICJmcm9tIiwgInRvIiwgImVuZCIsICJqc29uIiwgImEiLCAiQ2hhbmdlU2V0IiwgIl9DaGFuZ2VTZXQiLCAiaW5zZXJ0ZWQiLCAiZG9jIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJfdG9CIiwgInRleHQiLCAiaW5kZXgiLCAiVGV4dCIsICJyYW5nZXMiLCAicmVzdWx0U2VjdGlvbnMiLCAicmVzdWx0SW5zZXJ0ZWQiLCAiZmlsdGVyZWRTZWN0aW9ucyIsICJpdGVyIiwgIlNlY3Rpb25JdGVyIiwgImRvbmUiLCAibmV4dCIsICJhZGRTZWN0aW9uIiwgImFkZEluc2VydCIsICJwYXJ0cyIsICJjaGFuZ2VzIiwgImxlbmd0aCIsICJsaW5lU2VwIiwgInRvdGFsIiwgImZsdXNoIiwgImZvcmNlIiwgInNldCIsICJwcm9jZXNzIiwgInNwZWMiLCAic3ViIiwgImluc2VydCIsICJpbnNUZXh0IiwgImluc0xlbiIsICJwYXJ0IiwgImUiLCAiZm9yY2VKb2luIiwgImxhc3QiLCAidmFsdWVzIiwgInZhbHVlIiwgImRlc2MiLCAiZW5kQiIsICJzZXRBIiwgInNldEIiLCAibWtTZXQiLCAiYiIsICJwaWVjZSIsICJsZWZ0IiwgIm9wZW4iLCAic2VjdGlvbkxlbiIsICJpbnNCIiwgIlNlbGVjdGlvblJhbmdlIiwgIl9TZWxlY3Rpb25SYW5nZSIsICJmbGFncyIsICJsZXZlbCIsICJjaGFuZ2UiLCAiRWRpdG9yU2VsZWN0aW9uIiwgImhlYWQiLCAiaW5jbHVkZUFzc29jIiwgIl9FZGl0b3JTZWxlY3Rpb24iLCAibWFpbkluZGV4IiwgInIiLCAicmFuZ2UiLCAibWFpbiIsICJ3aGljaCIsICJhbmNob3IiLCAiYmlkaUxldmVsIiwgImdvYWxDb2x1bW4iLCAicHJldiIsICJjaGVja1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiZG9jTGVuZ3RoIiwgIm5leHRJRCIsICJGYWNldCIsICJfRmFjZXQiLCAiY29tYmluZSIsICJjb21wYXJlSW5wdXQiLCAiY29tcGFyZSIsICJpc1N0YXRpYyIsICJlbmFibGVzIiwgImNvbmZpZyIsICJzYW1lQXJyYXkiLCAiRmFjZXRQcm92aWRlciIsICJkZXBzIiwgImdldCIsICJmaWVsZCIsICJ4IiwgInN0YXRlIiwgImRlcGVuZGVuY2llcyIsICJmYWNldCIsICJ0eXBlIiwgImFkZHJlc3NlcyIsICJfYSIsICJnZXR0ZXIiLCAiaWQiLCAiaWR4IiwgIm11bHRpIiwgImRlcERvYyIsICJkZXBTZWwiLCAiZGVwQWRkcnMiLCAiZGVwIiwgInRyIiwgImVuc3VyZUFsbCIsICJuZXdWYWwiLCAiY29tcGFyZUFycmF5IiwgIm9sZFN0YXRlIiwgIm9sZEFkZHIiLCAib2xkVmFsIiwgImdldEFkZHIiLCAiU3RhdGVGaWVsZCIsICJhZGRycyIsICJjaGFuZ2VkIiwgImFkZHIiLCAiZW5zdXJlQWRkciIsICJkeW5hbWljRmFjZXRTbG90IiwgInByb3ZpZGVycyIsICJwcm92aWRlckFkZHJzIiwgInAiLCAicHJvdmlkZXJUeXBlcyIsICJkeW5hbWljIiwgInZhbCIsICJkZXBDaGFuZ2VkIiwgIm9sZFByb3ZpZGVycyIsICJvbGRWYWx1ZSIsICJpbml0RmllbGQiLCAiX1N0YXRlRmllbGQiLCAiY3JlYXRlRiIsICJ1cGRhdGVGIiwgImNvbXBhcmVGIiwgImluaXQiLCAiY3JlYXRlIiwgIlByZWNfIiwgInByZWMiLCAiZXh0IiwgIlByZWNFeHRlbnNpb24iLCAiUHJlYyIsICJpbm5lciIsICJDb21wYXJ0bWVudCIsICJfQ29tcGFydG1lbnQiLCAiQ29tcGFydG1lbnRJbnN0YW5jZSIsICJjb250ZW50IiwgImNvbXBhcnRtZW50IiwgIkNvbmZpZ3VyYXRpb24iLCAiX0NvbmZpZ3VyYXRpb24iLCAiYmFzZSIsICJjb21wYXJ0bWVudHMiLCAiZHluYW1pY1Nsb3RzIiwgImFkZHJlc3MiLCAic3RhdGljVmFsdWVzIiwgImZhY2V0cyIsICJmaWVsZHMiLCAibmV3Q29tcGFydG1lbnRzIiwgImZsYXR0ZW4iLCAib2xkRmFjZXRzIiwgImV4dGVuc2lvbiIsICJzZWVuIiwgImtub3duIiwgImZvdW5kIiwgInN0YXR1cyIsICJsYW5ndWFnZURhdGEiLCAiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMiLCAidiIsICJsaW5lU2VwYXJhdG9yIiwgImNoYW5nZUZpbHRlciIsICJ0cmFuc2FjdGlvbkZpbHRlciIsICJ0cmFuc2FjdGlvbkV4dGVuZGVyIiwgInJlYWRPbmx5IiwgIkFubm90YXRpb24iLCAiQW5ub3RhdGlvblR5cGUiLCAiU3RhdGVFZmZlY3RUeXBlIiwgIm1hcCIsICJTdGF0ZUVmZmVjdCIsICJfU3RhdGVFZmZlY3QiLCAibWFwcGluZyIsICJtYXBwZWQiLCAiZWZmZWN0cyIsICJlZmZlY3QiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgInN0YXJ0U3RhdGUiLCAiYW5ub3RhdGlvbnMiLCAic2Nyb2xsSW50b1ZpZXciLCAiYW5uIiwgImV2ZW50IiwgImpvaW5SYW5nZXMiLCAiaUEiLCAiaUIiLCAibWVyZ2VUcmFuc2FjdGlvbiIsICJzZXF1ZW50aWFsIiwgIm1hcEZvckEiLCAibWFwRm9yQiIsICJyZXNvbHZlVHJhbnNhY3Rpb25Jbm5lciIsICJkb2NTaXplIiwgInNlbCIsICJhc0FycmF5IiwgInJlc29sdmVUcmFuc2FjdGlvbiIsICJzcGVjcyIsICJmaWx0ZXIiLCAicyIsICJzZXEiLCAiZXh0ZW5kVHJhbnNhY3Rpb24iLCAiZmlsdGVyVHJhbnNhY3Rpb24iLCAiYmFjayIsICJmaWx0ZXJlZCIsICJmaWx0ZXJzIiwgImV4dGVuZGVycyIsICJub25lIiwgIkNoYXJDYXRlZ29yeSIsICJub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciIsICJ3b3JkQ2hhciIsICJfIiwgImhhc1dvcmRDaGFyIiwgInN0ciIsICJjaCIsICJtYWtlQ2F0ZWdvcml6ZXIiLCAid29yZENoYXJzIiwgImNoYXIiLCAiRWRpdG9yU3RhdGUiLCAiX0VkaXRvclN0YXRlIiwgImNvbXB1dGVTbG90IiwgInJlcXVpcmUiLCAiY29uZiIsICJrZXkiLCAic3RhcnRWYWx1ZXMiLCAic2xvdCIsICJyZXN1bHQxIiwgIm5ld0NoYW5nZXMiLCAibmV3TWFwcGVkIiwgImoiLCAibWFwQnkiLCAic3RyaW5nIiwgInByb3AiLCAiZmllbGRJbml0IiwgImNvbmZpZ3VyYXRpb24iLCAicGhyYXNlIiwgIm0iLCAibiIsICJuYW1lIiwgInNpZGUiLCAicHJvdmlkZXIiLCAiYXQiLCAiY2F0IiwgInN0YXJ0IiwgImZpbmRDbHVzdGVyQnJlYWsiLCAia0EiLCAia0IiLCAiayIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImZyb20iLCAidG8iLCAiUmFuZ2UiLCAiTWFwTW9kZSIsICJfUmFuZ2UiLCAidmFsdWUiLCAiY21wUmFuZ2UiLCAiYSIsICJiIiwgIkNodW5rIiwgIl9DaHVuayIsICJtYXhQb2ludCIsICJwb3MiLCAic2lkZSIsICJlbmQiLCAic3RhcnRBdCIsICJhcnIiLCAibG8iLCAiaGkiLCAibWlkIiwgImRpZmYiLCAib2Zmc2V0IiwgImYiLCAiaSIsICJlIiwgImNoYW5nZXMiLCAibmV3UG9zIiwgInZhbCIsICJjdXJGcm9tIiwgImN1clRvIiwgIm5ld0Zyb20iLCAibmV3VG8iLCAibWFwcGVkIiwgIlJhbmdlU2V0IiwgIl9SYW5nZVNldCIsICJjaHVua1BvcyIsICJjaHVuayIsICJuZXh0TGF5ZXIiLCAibGFzdCIsICJzaXplIiwgImluZGV4IiwgInVwZGF0ZVNwZWMiLCAiYWRkIiwgInNvcnQiLCAiZmlsdGVyRnJvbSIsICJmaWx0ZXJUbyIsICJmaWx0ZXIiLCAiY3VyIiwgIkxheWVyQ3Vyc29yIiwgInNwaWxsIiwgImJ1aWxkZXIiLCAiUmFuZ2VTZXRCdWlsZGVyIiwgInJhbmdlIiwgImNodW5rcyIsICJzdGFydCIsICJ0b3VjaCIsICJuZXh0IiwgIkhlYXBDdXJzb3IiLCAic2V0cyIsICJvbGRTZXRzIiwgIm5ld1NldHMiLCAidGV4dERpZmYiLCAiY29tcGFyYXRvciIsICJtaW5Qb2ludFNpemUiLCAic2V0IiwgInNoYXJlZENodW5rcyIsICJmaW5kU2hhcmVkQ2h1bmtzIiwgInNpZGVBIiwgIlNwYW5DdXJzb3IiLCAic2lkZUIiLCAiZnJvbUEiLCAiZnJvbUIiLCAibGVuZ3RoIiwgImNvbXBhcmUiLCAic2FtZVZhbHVlcyIsICJpdGVyYXRvciIsICJjdXJzb3IiLCAib3BlblJhbmdlcyIsICJhY3RpdmUiLCAib3BlbkNvdW50IiwgInJhbmdlcyIsICJidWlsZCIsICJsYXp5U29ydCIsICJyZXN1bHQiLCAibGF5ZXIiLCAicHJldiIsICJfUmFuZ2VTZXRCdWlsZGVyIiwgIm5ld0FycmF5cyIsICJpbkEiLCAic2hhcmVkIiwgImtub3duIiwgInNraXAiLCAibWluUG9pbnQiLCAicmFuayIsICJmb3J3YXJkIiwgInJhbmdlSW5kZXgiLCAiX0hlYXBDdXJzb3IiLCAiaGVhcCIsICJoZWFwQnViYmxlIiwgInRvcCIsICJjaGlsZEluZGV4IiwgImNoaWxkIiwgInJlbW92ZSIsICJmaW5kTWluSW5kZXgiLCAidHJhY2tPcGVuIiwgImluc2VydCIsICJ3YXNQb2ludCIsICJuZXh0VmFsIiwgIm9wZW4iLCAic3RhcnRBIiwgInN0YXJ0QiIsICJlbmRCIiwgImRQb3MiLCAiY2xpcEVuZCIsICJhcnJheSIsICJmb3VuZCIsICJmb3VuZFBvcyIsICJmaW5kQ29sdW1uIiwgInN0cmluZyIsICJjb2wiLCAidGFiU2l6ZSIsICJzdHJpY3QiLCAiaSIsICJuIiwgImZpbmRDbHVzdGVyQnJlYWsiLCAiQyIsICJDT1VOVCIsICJTRVQiLCAidG9wIiwgIlN0eWxlTW9kdWxlIiwgInNwZWMiLCAib3B0aW9ucyIsICJmaW5pc2giLCAic3BsaXRTZWxlY3RvciIsICJzZWxlY3RvciIsICJyZW5kZXIiLCAic2VsZWN0b3JzIiwgInRhcmdldCIsICJpc0tleWZyYW1lcyIsICJsb2NhbCIsICJpc0F0IiwgImtleWZyYW1lcyIsICJwcm9wIiwgInZhbHVlIiwgInBhcnQiLCAic2VsIiwgImEiLCAiYiIsICJsIiwgImlkIiwgInJvb3QiLCAibW9kdWxlcyIsICJzZXQiLCAibm9uY2UiLCAiU3R5bGVTZXQiLCAiYWRvcHRlZFNldCIsICJkb2MiLCAid2luIiwgImFkb3B0ZWQiLCAic2hlZXQiLCAicG9zIiwgImoiLCAiaSIsICJtb2QiLCAiaW5kZXgiLCAiayIsICJ0ZXh0IiwgImJhc2UiLCAic2hpZnQiLCAibWFjIiwgImllIiwgImkiLCAiY29kZSIsICJnZXRTZWxlY3Rpb24iLCAicm9vdCIsICJ0YXJnZXQiLCAiY29udGFpbnMiLCAiZG9tIiwgIm5vZGUiLCAiZGVlcEFjdGl2ZUVsZW1lbnQiLCAiZG9jIiwgImVsdCIsICJoYXNTZWxlY3Rpb24iLCAic2VsZWN0aW9uIiwgIl8iLCAiY2xpZW50UmVjdHNGb3IiLCAidGV4dFJhbmdlIiwgImlzRXF1aXZhbGVudFBvc2l0aW9uIiwgIm9mZiIsICJ0YXJnZXROb2RlIiwgInRhcmdldE9mZiIsICJzY2FuRm9yIiwgImRvbUluZGV4IiwgImluZGV4IiwgImRpciIsICJtYXhPZmZzZXQiLCAicGFyZW50IiwgImZsYXR0ZW5SZWN0IiwgInJlY3QiLCAibGVmdCIsICJ4IiwgIndpbmRvd1JlY3QiLCAid2luIiwgImdldFNjYWxlIiwgInNjYWxlWCIsICJzY2FsZVkiLCAic2Nyb2xsUmVjdEludG9WaWV3IiwgInNpZGUiLCAieSIsICJ4TWFyZ2luIiwgInlNYXJnaW4iLCAibHRyIiwgImN1ciIsICJzdG9wIiwgImJvdW5kaW5nIiwgInRvcCIsICJtb3ZlWCIsICJtb3ZlWSIsICJyZWN0SGVpZ2h0IiwgImJvdW5kaW5nSGVpZ2h0IiwgIm1vdmVkWCIsICJtb3ZlZFkiLCAic3RhcnQiLCAic2Nyb2xsYWJsZVBhcmVudCIsICJET01TZWxlY3Rpb25TdGF0ZSIsICJkb21TZWwiLCAicmFuZ2UiLCAiYW5jaG9yTm9kZSIsICJmb2N1c05vZGUiLCAiYW5jaG9yT2Zmc2V0IiwgImZvY3VzT2Zmc2V0IiwgInByZXZlbnRTY3JvbGxTdXBwb3J0ZWQiLCAiZm9jdXNQcmV2ZW50U2Nyb2xsIiwgInN0YWNrIiwgImkiLCAic2NyYXRjaFJhbmdlIiwgImZyb20iLCAidG8iLCAiZGlzcGF0Y2hLZXkiLCAibmFtZSIsICJjb2RlIiwgIm9wdGlvbnMiLCAiZG93biIsICJ1cCIsICJnZXRSb290IiwgImNsZWFyQXR0cmlidXRlcyIsICJhdEVsZW1lbnRTdGFydCIsICJvZmZzZXQiLCAicHJldiIsICJpc1Njcm9sbGVkVG9Cb3R0b20iLCAiRE9NUG9zIiwgIl9ET01Qb3MiLCAicHJlY2lzZSIsICJub0NoaWxkcmVuIiwgIkNvbnRlbnRWaWV3IiwgIl9Db250ZW50VmlldyIsICJ2aWV3IiwgInBvcyIsICJjaGlsZCIsICJ0cmFjayIsICJuZXh0IiwgImNvbnRlbnRWaWV3IiwgInJtJDEiLCAiX2RvbSIsICJhZnRlciIsICJiaWFzIiwgImZyb21JIiwgImZyb21TdGFydCIsICJ0b0kiLCAidG9FbmQiLCAicHJldkVuZCIsICJlbmQiLCAiYW5kUGFyZW50IiwgImNoaWxkTGlzdCIsICJ2IiwgImNoaWxkcmVuIiwgIl9yZWMiLCAiX2V2ZW50IiwgIkNoaWxkQ3Vyc29yIiwgInNvdXJjZSIsICJoYXNTdGFydCIsICJvcGVuU3RhcnQiLCAib3BlbkVuZCIsICJvdGhlciIsICJyZXBsYWNlUmFuZ2UiLCAiZnJvbU9mZiIsICJ0b09mZiIsICJpbnNlcnQiLCAiYnJlYWtBdFN0YXJ0IiwgImJlZm9yZSIsICJsYXN0IiwgImJyZWFrQXRFbmQiLCAibWVyZ2VDaGlsZHJlbkludG8iLCAiZExlbiIsICJuYXYiLCAiaWVfZWRnZSIsICJpZV91cHRvMTAiLCAiaWVfMTF1cCIsICJpZSIsICJnZWNrbyIsICJjaHJvbWUiLCAid2Via2l0IiwgInNhZmFyaSIsICJpb3MiLCAiYnJvd3NlciIsICJNYXhKb2luTGVuIiwgIlRleHRWaWV3IiwgIl9UZXh0VmlldyIsICJ0ZXh0IiwgInRleHRET00iLCAicmVzdWx0IiwgIl9mcm9tIiwgIl90byIsICJ0ZXh0Q29vcmRzIiwgIk1hcmtWaWV3IiwgIl9NYXJrVmlldyIsICJtYXJrIiwgImxlbmd0aCIsICJjaCIsICJfaGFzU3RhcnQiLCAiZGV0YWNoRnJvbSIsICJpbmxpbmVET01BdFBvcyIsICJjb29yZHNJbkNoaWxkcmVuIiwgImZsYXR0ZW4iLCAicmVjdHMiLCAiciIsICJXaWRnZXRWaWV3IiwgIl9XaWRnZXRWaWV3IiwgIndpZGdldCIsICJldmVudCIsICJUZXh0IiwgImN1c3RvbSIsICJmcm9tQmFjayIsICJXaWRnZXRCdWZmZXJWaWV3IiwgIl9XaWRnZXRCdWZmZXJWaWV3IiwgImoiLCAiam9pbklubGluZUludG8iLCAib3BlbiIsICJiZWZvcmVQb3MiLCAiYWZ0ZXJQb3MiLCAic2NhbiIsICJmYWxsYmFja1JlY3QiLCAiY29tYmluZUF0dHJzIiwgIm5vQXR0cnMiLCAiYXR0cnNFcSIsICJhIiwgImIiLCAiaWdub3JlIiwgImtleXNBIiwgImtleXNCIiwgImtleSIsICJ1cGRhdGVBdHRycyIsICJhdHRycyIsICJjaGFuZ2VkIiwgImdldEF0dHJzIiwgImF0dHIiLCAiTGluZVZpZXciLCAiX0xpbmVWaWV3IiwgImF0IiwgImRlY28iLCAiY2xzIiwgIl9hIiwgImhhY2siLCAidG90YWxXaWR0aCIsICJ0ZXh0SGVpZ2h0IiwgImhlaWdodE9yYWNsZSIsICJoZWlnaHQiLCAiZGlzdCIsICJfb3RoZXIiLCAiZG9jVmlldyIsICJibG9jayIsICJCbG9ja1dpZGdldFZpZXciLCAiX0Jsb2NrV2lkZ2V0VmlldyIsICJfdGFrZURlY28iLCAibGVuIiwgInN0YXJ0U2lkZSIsICJlbmRTaWRlIiwgIldpZGdldFR5cGUiLCAiQmxvY2tUeXBlIiwgIkRlY29yYXRpb24iLCAiUmFuZ2VWYWx1ZSIsICJzcGVjIiwgIk1hcmtEZWNvcmF0aW9uIiwgIlBvaW50RGVjb3JhdGlvbiIsICJnZXRJbmNsdXNpdmUiLCAiTGluZURlY29yYXRpb24iLCAib2YiLCAic29ydCIsICJSYW5nZVNldCIsICJfTWFya0RlY29yYXRpb24iLCAiX2IiLCAiX0xpbmVEZWNvcmF0aW9uIiwgIk1hcE1vZGUiLCAiX1BvaW50RGVjb3JhdGlvbiIsICJpc1JlcGxhY2UiLCAid2lkZ2V0c0VxIiwgImFkZFJhbmdlIiwgInJhbmdlcyIsICJtYXJnaW4iLCAiQ29udGVudEJ1aWxkZXIiLCAiX0NvbnRlbnRCdWlsZGVyIiwgImRpc2FsbG93QmxvY2tFZmZlY3RzRm9yIiwgImFjdGl2ZSIsICJ3cmFwTWFya3MiLCAidmFsdWUiLCAibGluZUJyZWFrIiwgImRvbmUiLCAidGFrZSIsICJOdWxsV2lkZ2V0IiwgImN1cnNvckJlZm9yZSIsICJjdXJzb3JBZnRlciIsICJsaW5lIiwgImRlY29yYXRpb25zIiwgImR5bmFtaWNEZWNvcmF0aW9uTWFwIiwgImJ1aWxkZXIiLCAidGFnIiwgIkRpcmVjdGlvbiIsICJMVFIiLCAiUlRMIiwgImRlYyIsICJzdHIiLCAiTG93VHlwZXMiLCAiQXJhYmljVHlwZXMiLCAiQnJhY2tldHMiLCAiQnJhY2tldFN0YWNrIiwgInAiLCAibCIsICJjaGFyVHlwZSIsICJCaWRpUkUiLCAiQmlkaVNwYW4iLCAibGV2ZWwiLCAiZm9yd2FyZCIsICJvcmRlciIsICJhc3NvYyIsICJtYXliZSIsICJzcGFuIiwgImlzb2xhdGVzRXEiLCAiaUEiLCAiaUIiLCAidHlwZXMiLCAiY29tcHV0ZUNoYXJUeXBlcyIsICJyRnJvbSIsICJyVG8iLCAiaXNvbGF0ZXMiLCAib3V0ZXJUeXBlIiwgImlJIiwgInByZXZUeXBlIiwgInByZXZTdHJvbmciLCAidHlwZSIsICJyZXBsYWNlIiwgInByb2Nlc3NCcmFja2V0UGFpcnMiLCAib3Bwb3NpdGVUeXBlIiwgInNJIiwgImNvbnRleHQiLCAiYnIiLCAic0oiLCAiZmxhZ3MiLCAiZW1iZWQiLCAicHJvY2Vzc05ldXRyYWxzIiwgImJlZm9yZUwiLCAiYWZ0ZXJMIiwgImpJIiwgImZyb21KIiwgImVtaXRTcGFucyIsICJiYXNlTGV2ZWwiLCAib3VyVHlwZSIsICJpQ2giLCAic2FtZURpciIsICJpc051bSIsICJyZWN1cnNlIiwgImxvY2FsTGV2ZWwiLCAiaVNjYW4iLCAicnVuIiwgImlzbyIsICJ1cHRvIiwgImRpclN3YXAiLCAiY29tcHV0ZVNlY3Rpb25PcmRlciIsICJjb21wdXRlT3JkZXIiLCAiZGlyZWN0aW9uIiwgInRyaXZpYWxPcmRlciIsICJtb3ZlZE92ZXIiLCAibW92ZVZpc3VhbGx5IiwgInN0YXJ0SW5kZXgiLCAic3BhbkkiLCAic3BhbkVuZCIsICJuZXh0SSIsICJuZXh0SW5kZXgiLCAiZmluZENsdXN0ZXJCcmVhayIsICJuZXh0U3BhbiIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYXV0b0RpcmVjdGlvbiIsICJjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSIsICJGYWNldCIsICJkcmFnTW92ZXNTZWxlY3Rpb24kMSIsICJtb3VzZVNlbGVjdGlvblN0eWxlIiwgImV4Y2VwdGlvblNpbmsiLCAidXBkYXRlTGlzdGVuZXIiLCAiaW5wdXRIYW5kbGVyIiwgImZvY3VzQ2hhbmdlRWZmZWN0IiwgInBlckxpbmVUZXh0RGlyZWN0aW9uIiwgInZhbHVlcyIsICJuYXRpdmVTZWxlY3Rpb25IaWRkZW4iLCAiU2Nyb2xsVGFyZ2V0IiwgIl9TY3JvbGxUYXJnZXQiLCAiaXNTbmFwc2hvdCIsICJjaGFuZ2VzIiwgInN0YXRlIiwgInNjcm9sbEludG9WaWV3IiwgIlN0YXRlRWZmZWN0IiwgInQiLCAibG9nRXhjZXB0aW9uIiwgImV4Y2VwdGlvbiIsICJoYW5kbGVyIiwgImVkaXRhYmxlIiwgIm5leHRQbHVnaW5JRCIsICJ2aWV3UGx1Z2luIiwgIlZpZXdQbHVnaW4iLCAiX1ZpZXdQbHVnaW4iLCAiaWQiLCAiY3JlYXRlIiwgImRvbUV2ZW50SGFuZGxlcnMiLCAiZG9tRXZlbnRPYnNlcnZlcnMiLCAiYnVpbGRFeHRlbnNpb25zIiwgImV2ZW50SGFuZGxlcnMiLCAiZXZlbnRPYnNlcnZlcnMiLCAicHJvdmlkZSIsICJwbHVnaW4iLCAiZXh0IiwgInBsdWdpbkluc3QiLCAiUGx1Z2luSW5zdGFuY2UiLCAidXBkYXRlIiwgImUiLCAiZWRpdG9yQXR0cmlidXRlcyIsICJjb250ZW50QXR0cmlidXRlcyIsICJvdXRlckRlY29yYXRpb25zIiwgImF0b21pY1JhbmdlcyIsICJiaWRpSXNvbGF0ZWRSYW5nZXMiLCAiZ2V0SXNvbGF0ZWRSYW5nZXMiLCAic2V0cyIsICJmcm9tRG9jIiwgInRvRG9jIiwgImFkZCIsICJzY3JvbGxNYXJnaW5zIiwgImdldFNjcm9sbE1hcmdpbnMiLCAicmlnaHQiLCAiYm90dG9tIiwgIm0iLCAic3R5bGVNb2R1bGUiLCAiQ2hhbmdlZFJhbmdlIiwgIl9DaGFuZ2VkUmFuZ2UiLCAiZnJvbUEiLCAidG9BIiwgImZyb21CIiwgInRvQiIsICJzZXQiLCAibWUiLCAiZGlmZiIsICJkSSIsICJySSIsICJwb3NBIiwgInBvc0IiLCAiVmlld1VwZGF0ZSIsICJfVmlld1VwZGF0ZSIsICJ0cmFuc2FjdGlvbnMiLCAiQ2hhbmdlU2V0IiwgInRyIiwgImNoYW5nZWRSYW5nZXMiLCAiRG9jVmlldyIsICJyZWFkQ29tcG9zaXRpb25BdCIsICJ0b3VjaGVzQ29tcG9zaXRpb24iLCAiY29tcG9zaXRpb24iLCAiZmluZENvbXBvc2l0aW9uUmFuZ2UiLCAicHJldkRlY28iLCAiZGVjb0RpZmYiLCAiZmluZENoYW5nZWREZWNvIiwgIm9sZExlbmd0aCIsICJvYnNlcnZlciIsICJjVmlldyIsICJnYXBzIiwgIkJsb2NrR2FwV2lkZ2V0IiwgImN1cnNvciIsICJjb250ZW50IiwgImNvbXBMaW5lIiwgImZpeCIsICJjIiwgIm11c3RSZWFkIiwgImZyb21Qb2ludGVyIiwgImFjdGl2ZUVsdCIsICJmb2N1c2VkIiwgInNlbGVjdGlvbk5vdEZvY3VzIiwgImZvcmNlIiwgIm1haW4iLCAiYW5jaG9yIiwgImhlYWQiLCAiYmV0d2VlblVuZWRpdGFibGUiLCAiZHVtbXkiLCAiaW5VbmVkaXRhYmxlIiwgInJhd1NlbCIsICJuZXh0VG8iLCAibmV4dFRvVW5lZGl0YWJsZSIsICJuZWFyYnlUZXh0Tm9kZSIsICJzZWwiLCAibGluZVN0YXJ0IiwgIm5ld1JhbmdlIiwgIm5ld1BvcyIsICJkb21WaWV3IiwgImJlc3QiLCAiYmVzdFBvcyIsICJjaGlsZE9mZiIsICJ2aWV3cG9ydCIsICJjb250ZW50V2lkdGgiLCAiaXNXaWRlciIsICJ3aWRlc3QiLCAiY2hpbGRSZWN0IiwgIndpZHRoIiwgIm1lYXN1cmUiLCAibGluZUhlaWdodCIsICJjaGFyV2lkdGgiLCAidnMiLCAiYWxsRGVjbyIsICJkIiwgImR5bmFtaWNPdXRlciIsICJvdXRlckRlY28iLCAiZHluYW1pYyIsICJyZWYiLCAibWFyZ2lucyIsICJ0YXJnZXRSZWN0IiwgIm9mZnNldFdpZHRoIiwgIm9mZnNldEhlaWdodCIsICJmaW5kQ29tcG9zaXRpb25Ob2RlIiwgImhlYWRQb3MiLCAidGV4dE5vZGUiLCAiZm91bmQiLCAiaW52IiwgIm1hcmtzIiwgInBhcmVudFZpZXciLCAic3RhcnROb2RlIiwgInN0YXJ0T2Zmc2V0IiwgIkRlY29yYXRpb25Db21wYXJhdG9yJDEiLCAiY29tcCIsICJpbnNpZGUiLCAidG91Y2hlZCIsICJncm91cEF0IiwgImNhdGVnb3JpemUiLCAibGluZVBvcyIsICJjYXQiLCAiZ2V0ZHgiLCAiZ2V0ZHkiLCAieU92ZXJsYXAiLCAidXBUb3AiLCAidXBCb3QiLCAiZG9tUG9zQXRDb29yZHMiLCAiY2xvc2VzdCIsICJjbG9zZXN0UmVjdCIsICJjbG9zZXN0WCIsICJjbG9zZXN0WSIsICJjbG9zZXN0T3ZlcmxhcCIsICJhYm92ZSIsICJiZWxvdyIsICJhYm92ZVJlY3QiLCAiYmVsb3dSZWN0IiwgImR4IiwgImR5IiwgImRvbVBvc0luVGV4dCIsICJjbGlwWCIsICJjbG9zZXN0T2Zmc2V0IiwgImNsb3Nlc3REWSIsICJnZW5lcmFsU2lkZSIsICJwb3NBdENvb3JkcyIsICJjb29yZHMiLCAiZG9jVG9wIiwgImRvY0hlaWdodCIsICJ5T2Zmc2V0IiwgImhhbGZMaW5lIiwgImJvdW5jZWQiLCAicG9zQXRDb29yZHNJbXByZWNpc2UiLCAiZWxlbWVudCIsICJpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdCIsICJpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdCIsICJuZWFyZXN0IiwgImNvbnRlbnRSZWN0IiwgImludG8iLCAiZmluZENvbHVtbiIsICJibG9ja0F0IiwgIm1vdmVUb0xpbmVCb3VuZGFyeSIsICJpbmNsdWRlV3JhcCIsICJlZGl0b3JSZWN0IiwgIm1vdmVCeUNoYXIiLCAiYnkiLCAic3BhbnMiLCAiY2hlY2siLCAiY2hhciIsICJieUdyb3VwIiwgIm5leHRDYXQiLCAiQ2hhckNhdGVnb3J5IiwgIm1vdmVWZXJ0aWNhbGx5IiwgImRpc3RhbmNlIiwgInN0YXJ0UG9zIiwgImdvYWwiLCAic3RhcnRZIiwgInN0YXJ0Q29vcmRzIiwgInJlc29sdmVkR29hbCIsICJleHRyYSIsICJjdXJZIiwgImNoYXJSZWN0IiwgInNraXBBdG9taWNSYW5nZXMiLCAiYXRvbXMiLCAibW92ZWQiLCAic2tpcEF0b21zIiwgIm9sZFBvcyIsICJmIiwgIklucHV0U3RhdGUiLCAib3JpZ2luIiwgImZpcmVmb3hDb3B5Q3V0SGFjayIsICJldmVudEJlbG9uZ3NUb0VkaXRvciIsICJoYW5kbGVycyIsICJwbHVnaW5zIiwgImNvbXB1dGVIYW5kbGVycyIsICJwYXNzaXZlIiwgImV4aXN0cyIsICJtb2RpZmllckNvZGVzIiwgInBlbmRpbmciLCAiUGVuZGluZ0tleXMiLCAiRW1hY3N5UGVuZGluZ0tleXMiLCAibW91c2VTZWxlY3Rpb24iLCAiYmluZEhhbmRsZXIiLCAicmVjb3JkIiwgIm9ic2VydmVycyIsICJkcmFnU2Nyb2xsTWFyZ2luIiwgImRyYWdTY3JvbGxTcGVlZCIsICJNb3VzZVNlbGVjdGlvbiIsICJzdGFydEV2ZW50IiwgInN0eWxlIiwgIm11c3RTZWxlY3QiLCAiRWRpdG9yU3RhdGUiLCAiYWRkc1NlbGVjdGlvblJhbmdlIiwgImlzSW5QcmltYXJ5U2VsZWN0aW9uIiwgImdldENsaWNrVHlwZSIsICJzeCIsICJzeSIsICJ1cGRhdGVkIiwgImZhY2V0IiwgImRyYWdNb3Zlc1NlbGVjdGlvbiIsICJicm9rZW5DbGlwYm9hcmRBUEkiLCAiY2FwdHVyZVBhc3RlIiwgImRvUGFzdGUiLCAiaW5wdXQiLCAiYnlMaW5lIiwgImxhc3RMaW5ld2lzZUNvcHkiLCAibGFzdExpbmUiLCAibWFrZVN0eWxlIiwgImJhc2ljTW91c2VTZWxlY3Rpb24iLCAibXVzdEZvY3VzIiwgIm1vdXNlU2VsIiwgInJhbmdlRm9yQ2xpY2siLCAidmlzdWFsIiwgImluc2lkZVkiLCAiZmluZFBvc2l0aW9uU2lkZSIsICJxdWVyeVBvcyIsICJCYWRNb3VzZURldGFpbCIsICJsYXN0TW91c2VEb3duIiwgImxhc3RNb3VzZURvd25Db3VudCIsICJsYXN0TW91c2VEb3duVGltZSIsICJsYXN0VGltZSIsICJzdGFydFNlbCIsICJleHRlbmQiLCAibXVsdGlwbGUiLCAicmVtb3ZlZCIsICJzdGFydFJhbmdlIiwgInJlbW92ZVJhbmdlQXJvdW5kIiwgImlucHV0U3RhdGUiLCAiZHJvcFRleHQiLCAiZGlyZWN0IiwgImRyb3BQb3MiLCAiZHJhZ2dlZENvbnRlbnQiLCAiZGVsIiwgImlucyIsICJmaWxlcyIsICJyZWFkIiwgImZpbmlzaEZpbGUiLCAicyIsICJyZWFkZXIiLCAiZGF0YSIsICJjYXB0dXJlQ29weSIsICJjb3BpZWRSYW5nZSIsICJsaW5ld2lzZSIsICJpc0ZvY3VzQ2hhbmdlIiwgIkFubm90YXRpb24iLCAiZm9jdXNDaGFuZ2VUcmFuc2FjdGlvbiIsICJmb2N1cyIsICJlZmZlY3RzIiwgImdldEVmZmVjdCIsICJlZmZlY3QiLCAidXBkYXRlRm9yRm9jdXNDaGFuZ2UiLCAic3RhcnRWaWV3SGVpZ2h0IiwgImFwcGxpZWRGaXJlZm94SGFjayIsICJ3cmFwcGluZ1doaXRlU3BhY2UiLCAiSGVpZ2h0T3JhY2xlIiwgImxpbmVXcmFwcGluZyIsICJsaW5lcyIsICJ3aGl0ZVNwYWNlIiwgImxpbmVIZWlnaHRzIiwgIm5ld0hlaWdodCIsICJoIiwgImxpbmVMZW5ndGgiLCAia25vd25IZWlnaHRzIiwgIk1lYXN1cmVkSGVpZ2h0cyIsICJoZWlnaHRzIiwgIkJsb2NrSW5mbyIsICJfQmxvY2tJbmZvIiwgIl9jb250ZW50IiwgIlF1ZXJ5VHlwZSIsICJFcHNpbG9uIiwgIkhlaWdodE1hcCIsICJfSGVpZ2h0TWFwIiwgIm9yYWNsZSIsICJub2RlcyIsICJvbGREb2MiLCAiTm9kZUJ1aWxkZXIiLCAiSGVpZ2h0TWFwVGV4dCIsICJzcGxpdCIsICJicmsiLCAiSGVpZ2h0TWFwQnJhbmNoIiwgIkhlaWdodE1hcEJsb2NrIiwgIl9oZWlnaHQiLCAiX29yYWNsZSIsICJfdmFsdWUiLCAiX3R5cGUiLCAiX2ZvcmNlIiwgIm1lYXN1cmVkIiwgIl9IZWlnaHRNYXBUZXh0IiwgIkhlaWdodE1hcEdhcCIsICJfSGVpZ2h0TWFwR2FwIiwgImZpcnN0TGluZSIsICJwZXJMaW5lIiwgInBlckNoYXIiLCAidG90YWxQZXJMaW5lIiwgImd1ZXNzIiwgImxpbmVUb3AiLCAibGluZXNBYm92ZSIsICJmaXJzdCIsICJzaW5nbGVIZWlnaHQiLCAibWlkIiwgInJpZ2h0VG9wIiwgInJpZ2h0T2Zmc2V0IiwgImJhc2UiLCAic3ViUXVlcnkiLCAicmlnaHRTdGFydCIsICJtZXJnZUdhcHMiLCAicmViYWxhbmNlIiwgImFyb3VuZCIsICJyZWxldmFudFdpZGdldEhlaWdodCIsICJfTm9kZUJ1aWxkZXIiLCAiYnJlYWtzIiwgImdhcCIsICJoZWlnaHRSZWxldmFudERlY29DaGFuZ2VzIiwgIkRlY29yYXRpb25Db21wYXJhdG9yIiwgInZpc2libGVQaXhlbFJhbmdlIiwgInBhZGRpbmdUb3AiLCAicGFyZW50UmVjdCIsICJmdWxsUGl4ZWxSYW5nZSIsICJMaW5lR2FwIiwgInNpemUiLCAiZ0EiLCAiZ0IiLCAidmlld1N0YXRlIiwgIndyYXBwaW5nIiwgIkxpbmVHYXBXaWRnZXQiLCAidmVydGljYWwiLCAiVmlld1N0YXRlIiwgIklkU2NhbGVyIiwgImd1ZXNzV3JhcHBpbmciLCAidmlld3BvcnRzIiwgIlZpZXdwb3J0IiwgIkJpZ1NjYWxlciIsICJzY2FsZUJsb2NrIiwgInNjcm9sbFRhcmdldCIsICJjb250ZW50Q2hhbmdlcyIsICJoZWlnaHRDaGFuZ2VzIiwgInByZXZIZWlnaHQiLCAic2Nyb2xsQW5jaG9yIiwgInVwZGF0ZUxpbmVzIiwgInJlZnJlc2giLCAiZG9tUmVjdCIsICJtZWFzdXJlQ29udGVudCIsICJwYWRkaW5nQm90dG9tIiwgInNjcm9sbFRvcCIsICJwaXhlbFZpZXdwb3J0IiwgImRUb3AiLCAiZEJvdHRvbSIsICJpblZpZXciLCAidnAiLCAidmlld3BvcnRDaGFuZ2UiLCAibWFyZ2luVG9wIiwgIm1hcCIsICJ2aXNpYmxlVG9wIiwgInZpc2libGVCb3R0b20iLCAidmlld0hlaWdodCIsICJ0b3BQb3MiLCAibWFwcGVkIiwgImN1cnJlbnQiLCAibWF5TWVhc3VyZSIsICJoYWxmTWFyZ2luIiwgImRvdWJsZU1hcmdpbiIsICJhZGRHYXAiLCAic3RydWN0dXJlIiwgImF2b2lkIiwgImZpbmQiLCAibGluZVN0cnVjdHVyZSIsICJ2aWV3RnJvbSIsICJ2aWV3VG8iLCAibWFyZ2luSGVpZ2h0IiwgImJvdCIsICJ0YXJnZXRGcmFjIiwgImZpbmRGcmFjdGlvbiIsICJzcGFjZUZyYWMiLCAiZmluZFBvc2l0aW9uIiwgIm1hcmdpbldpZHRoIiwgImZyYWN0aW9uIiwgInN0YXRlRGVjbyIsICJ0b3RhbCIsICJyYXRpbyIsICJjb3VudGVkIiwgImFycmF5IiwgInZhbCIsICJuIiwgImhlaWdodE1hcCIsICJ2cEhlaWdodCIsICJkb21CYXNlIiwgIm9iaiIsICJzY2FsZXIiLCAiYlRvcCIsICJiQm90dG9tIiwgInRoZW1lIiwgInN0cnMiLCAiZGFya1RoZW1lIiwgImJhc2VUaGVtZUlEIiwgIlN0eWxlTW9kdWxlIiwgImJhc2VMaWdodElEIiwgImJhc2VEYXJrSUQiLCAibGlnaHREYXJrSURzIiwgImJ1aWxkVGhlbWUiLCAic2NvcGVzIiwgImJhc2VUaGVtZSQxIiwgIkxpbmVCcmVha1BsYWNlaG9sZGVyIiwgIkRPTVJlYWRlciIsICJwb2ludHMiLCAib2xkTGVuIiwgIm5leHRWaWV3IiwgImlzQmxvY2tFbGVtZW50IiwgInBvaW50IiwgInJlIiwgIm5leHRCcmVhayIsICJicmVha1NpemUiLCAiZnJvbVZpZXciLCAiaXNBdEVuZCIsICJET01Qb2ludCIsICJET01DaGFuZ2UiLCAidHlwZU92ZXIiLCAiaUhlYWQiLCAiaUFuY2hvciIsICJzZWxQb2ludHMiLCAic2VsZWN0aW9uUG9pbnRzIiwgInNlbGVjdGlvbkZyb21Qb2ludHMiLCAib2ZmRnJvbSIsICJvZmZUbyIsICJhcHBseURPTUNoYW5nZSIsICJkb21DaGFuZ2UiLCAiY2hhbmdlIiwgIm5ld1NlbCIsICJsYXN0S2V5IiwgInByZWZlcnJlZFBvcyIsICJwcmVmZXJyZWRTaWRlIiwgImZpbmREaWZmIiwgImRlZmF1bHRUciIsICJkZWZhdWx0SW5zZXJ0IiwgImFwcGx5RGVmYXVsdEluc2VydCIsICJ1c2VyRXZlbnQiLCAic3RhcnRTdGF0ZSIsICJtYWluU2VsIiwgInJlcGxhY2VkIiwgImNvbXBvc2l0aW9uUmFuZ2UiLCAicmFuZ2VDaGFuZ2VzIiwgInNlbE9mZiIsICJtaW5MZW4iLCAiYWRqdXN0IiwgIm1vdmUiLCAib2JzZXJ2ZU9wdGlvbnMiLCAidXNlQ2hhckRhdGEiLCAiRE9NT2JzZXJ2ZXIiLCAibXV0YXRpb25zIiwgIm11dCIsICJlbnRyaWVzIiwgImciLCAid2FzQ2hhbmdlZCIsICJzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2siLCAibG9jYWwiLCAia2V5Q29kZSIsICJmbHVzaCIsICJyZWNvcmRzIiwgInJlYWRTZWxlY3Rpb24iLCAiaGFuZGxlZCIsICJyZWMiLCAiY2hpbGRCZWZvcmUiLCAiZmluZENoaWxkIiwgImNoaWxkQWZ0ZXIiLCAiX2MiLCAiY3VyVmlldyIsICJjdXJBbmNob3IiLCAiRWRpdG9yVmlldyIsICJfRWRpdG9yVmlldyIsICJjb25maWciLCAiZGlzcGF0Y2giLCAidHJzIiwgIlRyYW5zYWN0aW9uIiwgInJlZHJhd24iLCAiYXR0cnNDaGFuZ2VkIiwgImZvY3VzRmxhZyIsICJkaXNwYXRjaEZvY3VzIiwgInBlbmRpbmdLZXkiLCAiQ2FjaGVkT3JkZXIiLCAibGlzdGVuZXIiLCAibmV3U3RhdGUiLCAiaGFkRm9jdXMiLCAicHJldlNwZWNzIiwgInNwZWNzIiwgIm5ld1BsdWdpbnMiLCAic0RPTSIsICJzY3JvbGxBbmNob3JQb3MiLCAic2Nyb2xsQW5jaG9ySGVpZ2h0IiwgIm1lYXN1cmluZyIsICJCYWRNZWFzdXJlIiwgImVkaXRvckF0dHJzIiwgImF0dHJzRnJvbUZhY2V0IiwgImNvbnRlbnRBdHRycyIsICJjaGFuZ2VkQ29udGVudCIsICJjaGFuZ2VkRWRpdG9yIiwgImRpdiIsICJub25jZSIsICJyZXF1ZXN0IiwgImtub3duIiwgImluaXRpYWwiLCAiTWF4QmlkaUxpbmUiLCAiZW50cnkiLCAic2Nyb2xsTGVmdCIsICJwcmVmaXgiLCAiUHJlYyIsICJfQ2FjaGVkT3JkZXIiLCAiZnJlc2giLCAiY2FjaGUiLCAibGFzdERpciIsICJzb3VyY2VzIiwgImN1cnJlbnRQbGF0Zm9ybSIsICJDYW5IaWRlUHJpbWFyeSIsICJicm93c2VyIiwgInRoZW1lU3BlYyIsICJDYW5IaWRlUHJpbWFyeSIsICJVbmljb2RlUmVnZXhwU3VwcG9ydCIsICJiYXNlVGhlbWUiLCAiRWRpdG9yVmlldyIsICJHdXR0ZXJNYXJrZXIiLCAiUmFuZ2VWYWx1ZSIsICJvdGhlciIsICJkb20iLCAiTWFwTW9kZSIsICJuZXh0VGFnSUQiLCAiVGFnIiwgIl9UYWciLCAic2V0IiwgImJhc2UiLCAibW9kaWZpZWQiLCAicGFyZW50IiwgInRhZyIsICJ0IiwgIm1vZCIsICJNb2RpZmllciIsICJhIiwgImIiLCAibmV4dE1vZGlmaWVySUQiLCAiX01vZGlmaWVyIiwgIm1vZHMiLCAiZXhpc3RzIiwgInNhbWVBcnJheSIsICJtIiwgImNvbmZpZ3MiLCAicG93ZXJTZXQiLCAiY29uZmlnIiwgIngiLCAiYXJyYXkiLCAic2V0cyIsICJpIiwgImoiLCAiZSIsICJzdHlsZVRhZ3MiLCAic3BlYyIsICJieU5hbWUiLCAicHJvcCIsICJ0YWdzIiwgInBhcnQiLCAicGllY2VzIiwgIm1vZGUiLCAicmVzdCIsICJwb3MiLCAibmV4dCIsICJsYXN0IiwgImlubmVyIiwgInJ1bGUiLCAiUnVsZSIsICJydWxlTm9kZVByb3AiLCAiTm9kZVByb3AiLCAiY29udGV4dCIsICJvdGhlciIsICJ0YWdIaWdobGlnaHRlciIsICJvcHRpb25zIiwgIm1hcCIsICJzdHlsZSIsICJzY29wZSIsICJhbGwiLCAiY2xzIiwgInN1YiIsICJ0YWdDbGFzcyIsICJ0IiwgIlRhZyIsICJjb21tZW50IiwgIm5hbWUiLCAidHlwZU5hbWUiLCAicHJvcGVydHlOYW1lIiwgImxpdGVyYWwiLCAic3RyaW5nIiwgIm51bWJlciIsICJjb250ZW50IiwgImhlYWRpbmciLCAia2V5d29yZCIsICJvcGVyYXRvciIsICJwdW5jdHVhdGlvbiIsICJicmFja2V0IiwgIm1ldGEiLCAidGFncyIsICJjbGFzc0hpZ2hsaWdodGVyIiwgInRhZ0hpZ2hsaWdodGVyIiwgIl9hIiwgImxhbmd1YWdlRGF0YVByb3AiLCAiTm9kZVByb3AiLCAiZGVmaW5lTGFuZ3VhZ2VGYWNldCIsICJiYXNlRGF0YSIsICJGYWNldCIsICJ2YWx1ZXMiLCAic3VibGFuZ3VhZ2VQcm9wIiwgIkxhbmd1YWdlIiwgImRhdGEiLCAicGFyc2VyIiwgImV4dHJhRXh0ZW5zaW9ucyIsICJuYW1lIiwgIkVkaXRvclN0YXRlIiwgInN5bnRheFRyZWUiLCAibGFuZ3VhZ2UiLCAic3RhdGUiLCAicG9zIiwgInNpZGUiLCAidG9wIiwgInRvcE5vZGVBdCIsICJiYXNlIiwgInN1YiIsICJpbm5lck5vZGUiLCAic3VibGFuZyIsICJsYW5nIiwgInJlc3VsdCIsICJleHBsb3JlIiwgInRyZWUiLCAiZnJvbSIsICJtb3VudCIsICJyIiwgInNpemUiLCAiaSIsICJjaCIsICJUcmVlIiwgIlN0YXRlRWZmZWN0IiwgInRvcExhbmciLCAibm9kZSIsICJJdGVyTW9kZSIsICJMUkxhbmd1YWdlIiwgIl9MUkxhbmd1YWdlIiwgInNwZWMiLCAidHlwZSIsICJvcHRpb25zIiwgImZpZWxkIiwgIkRvY0lucHV0IiwgImRvYyIsICJwb3MiLCAiZnJvbSIsICJ0byIsICJzdHJpbmdTdGFydCIsICJjdXJyZW50Q29udGV4dCIsICJQYXJzZUNvbnRleHQiLCAiX1BhcnNlQ29udGV4dCIsICJwYXJzZXIiLCAic3RhdGUiLCAiZnJhZ21lbnRzIiwgInRyZWUiLCAidHJlZUxlbiIsICJ2aWV3cG9ydCIsICJza2lwcGVkIiwgInNjaGVkdWxlT24iLCAiVHJlZSIsICJ1bnRpbCIsICJ1cHRvIiwgIl9hIiwgImVuZFRpbWUiLCAiZG9uZSIsICJUcmVlRnJhZ21lbnQiLCAiZiIsICJwcmV2IiwgInIiLCAiY3V0RnJhZ21lbnRzIiwgImNoYW5nZXMiLCAibmV3U3RhdGUiLCAicmFuZ2VzIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic3RhcnRMZW4iLCAiUGFyc2VyIiwgImlucHV0IiwgImN4IiwgIk5vZGVUeXBlIiwgImZyYWdzIiwgIkxhbmd1YWdlU3RhdGUiLCAiX0xhbmd1YWdlU3RhdGUiLCAiY29udGV4dCIsICJ0ciIsICJuZXdDeCIsICJ2cFRvIiwgInBhcnNlU3RhdGUiLCAibGFuZ3VhZ2UiLCAiTGFuZ3VhZ2UiLCAiU3RhdGVGaWVsZCIsICJ2YWx1ZSIsICJyZXF1ZXN0SWRsZSIsICJjYWxsYmFjayIsICJ0aW1lb3V0IiwgImlkbGUiLCAiaXNJbnB1dFBlbmRpbmciLCAicGFyc2VXb3JrZXIiLCAiVmlld1BsdWdpbiIsICJ2aWV3IiwgInVwZGF0ZSIsICJmaWVsZCIsICJkZWFkbGluZSIsICJub3ciLCAidmlld3BvcnRGaXJzdCIsICJlcnIiLCAibG9nRXhjZXB0aW9uIiwgIkZhY2V0IiwgImxhbmd1YWdlcyIsICJFZGl0b3JWaWV3IiwgImxhbmciLCAiSGlnaGxpZ2h0U3R5bGUiLCAiX0hpZ2hsaWdodFN0eWxlIiwgInNwZWNzIiwgIm9wdGlvbnMiLCAibW9kU3BlYyIsICJkZWYiLCAic3BlYyIsICJjbHMiLCAiU3R5bGVNb2R1bGUiLCAiYWxsIiwgInNjb3BlT3B0IiwgIkxhbmd1YWdlIiwgInR5cGUiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJ0YWdIaWdobGlnaHRlciIsICJzdHlsZSIsICJkZWZhdWx0SGlnaGxpZ2h0U3R5bGUiLCAiSGlnaGxpZ2h0U3R5bGUiLCAidGFncyIsICJub1Rva2VucyIsICJ0eXBlQXJyYXkiLCAiTm9kZVR5cGUiLCAid2FybmVkIiwgImJ5VGFnIiwgImRlZmF1bHRUYWJsZSIsICJsZWdhY3lOYW1lIiwgIm5hbWUiLCAiY3JlYXRlVG9rZW5UeXBlIiwgIm5vVG9rZW5zIiwgIndhcm5Gb3JQYXJ0IiwgInBhcnQiLCAibXNnIiwgIndhcm5lZCIsICJjcmVhdGVUb2tlblR5cGUiLCAiZXh0cmEiLCAidGFnU3RyIiwgInRhZ3MkMSIsICJuYW1lIiwgImZvdW5kIiwgInZhbHVlIiwgInRhZ3MiLCAidGFnIiwgImtleSIsICJ0IiwgImtub3duIiwgImJ5VGFnIiwgInR5cGUiLCAiTm9kZVR5cGUiLCAidHlwZUFycmF5IiwgInN0eWxlVGFncyIsICJtYXJrcyIsICJEZWNvcmF0aW9uIiwgIkRpcmVjdGlvbiIsICJTdGFjayIsICJfU3RhY2siLCAicCIsICJzdGFjayIsICJzdGF0ZSIsICJyZWR1Y2VQb3MiLCAicG9zIiwgInNjb3JlIiwgImJ1ZmZlciIsICJidWZmZXJCYXNlIiwgImN1ckNvbnRleHQiLCAibG9va0FoZWFkIiwgInBhcmVudCIsICJfIiwgImkiLCAiY3giLCAiU3RhY2tDb250ZXh0IiwgInN0YXJ0IiwgImFjdGlvbiIsICJfYSIsICJkZXB0aCIsICJ0eXBlIiwgInBhcnNlciIsICJkUHJlYyIsICJiYXNlIiwgInNpemUiLCAiY291bnQiLCAiYmFzZVN0YXRlSUQiLCAidGVybSIsICJlbmQiLCAiaXNSZWR1Y2UiLCAiY3VyIiwgInRvcCIsICJpbmRleCIsICJuZXh0U3RhdGUiLCAibmV4dCIsICJuZXh0U3RhcnQiLCAibmV4dEVuZCIsICJ2YWx1ZSIsICJvZmYiLCAiaXNOb2RlIiwgInNpbSIsICJTaW11bGF0ZWRTdGFjayIsICJuZXh0U3RhdGVzIiwgImJlc3QiLCAicyIsICJ2IiwgInJlc3VsdCIsICJyZWR1Y2UiLCAidGFyZ2V0IiwgImJhY2t1cCIsICJzZWVuIiwgImV4cGxvcmUiLCAickRlcHRoIiwgImZvdW5kIiwgIm90aGVyIiwgImRpYWxlY3RJRCIsICJsYXN0IiwgImNvbnRleHQiLCAibmV3Q3giLCAidHJhY2tlciIsICJnb3RvIiwgIlN0YWNrQnVmZmVyQ3Vyc29yIiwgIl9TdGFja0J1ZmZlckN1cnNvciIsICJkZWNvZGVBcnJheSIsICJpbnB1dCIsICJUeXBlIiwgImFycmF5IiwgIm91dCIsICJzdG9wIiwgImRpZ2l0IiwgIkNhY2hlZFRva2VuIiwgIm51bGxUb2tlbiIsICJJbnB1dFN0cmVhbSIsICJyYW5nZXMiLCAib2Zmc2V0IiwgImFzc29jIiwgInJhbmdlIiwgImlkeCIsICJyZXNvbHZlZCIsICJ0b2tlbiIsICJlbmRPZmZzZXQiLCAiY2h1bmsiLCAiY2h1bmtQb3MiLCAibmV4dENodW5rIiwgIm4iLCAiZnJvbSIsICJ0byIsICJyIiwgIlRva2VuR3JvdXAiLCAiZGF0YSIsICJpZCIsICJyZWFkVG9rZW4iLCAiTG9jYWxUb2tlbkdyb3VwIiwgInByZWNUYWJsZSIsICJlbHNlVG9rZW4iLCAic2tpcHBlZCIsICJhdEVvZiIsICJuZXh0UG9zIiwgInJlYWRUb2tlbiIsICJkYXRhIiwgImlucHV0IiwgInN0YWNrIiwgImdyb3VwIiwgInByZWNUYWJsZSIsICJwcmVjT2Zmc2V0IiwgInN0YXRlIiwgImdyb3VwTWFzayIsICJkaWFsZWN0IiwgInNjYW4iLCAiYWNjRW5kIiwgImkiLCAidGVybSIsICJvdmVycmlkZXMiLCAibmV4dCIsICJsb3ciLCAiaGlnaCIsICJtaWQiLCAiaW5kZXgiLCAiZnJvbSIsICJ0byIsICJmaW5kT2Zmc2V0IiwgInN0YXJ0IiwgInRva2VuIiwgInByZXYiLCAidGFibGVEYXRhIiwgInRhYmxlT2Zmc2V0IiwgImlQcmV2IiwgInZlcmJvc2UiLCAic3RhY2tJRHMiLCAiY3V0QXQiLCAidHJlZSIsICJwb3MiLCAic2lkZSIsICJjdXJzb3IiLCAiSXRlck1vZGUiLCAiRnJhZ21lbnRDdXJzb3IiLCAiZnJhZ21lbnRzIiwgIm5vZGVTZXQiLCAiZnIiLCAibGFzdCIsICJ0b3AiLCAiVHJlZSIsICJlbmQiLCAibG9va0FoZWFkIiwgIk5vZGVQcm9wIiwgIlRva2VuQ2FjaGUiLCAicGFyc2VyIiwgInN0cmVhbSIsICJfIiwgIkNhY2hlZFRva2VuIiwgImFjdGlvbkluZGV4IiwgIm1haW4iLCAidG9rZW5pemVycyIsICJtYXNrIiwgImNvbnRleHQiLCAidG9rZW5pemVyIiwgInN0YXJ0SW5kZXgiLCAicCIsICJyZXN1bHQiLCAiYWN0aW9uIiwgInNldCIsICJwYWlyIiwgIlBhcnNlIiwgInJhbmdlcyIsICJJbnB1dFN0cmVhbSIsICJTdGFjayIsICJzdGFja3MiLCAibmV3U3RhY2tzIiwgInN0b3BwZWQiLCAic3RvcHBlZFRva2VucyIsICJzIiwgInRvayIsICJmaW5pc2hlZCIsICJmaW5kRmluaXNoZWQiLCAibWF4UmVtYWluaW5nIiwgImEiLCAiYiIsICJvdXRlciIsICJqIiwgIm90aGVyIiwgInNwbGl0IiwgImJhc2UiLCAic3RyaWN0Q3giLCAiY3hIYXNoIiwgImNhY2hlZCIsICJtYXRjaCIsICJpbm5lciIsICJkZWZhdWx0UmVkdWNlIiwgImFjdGlvbnMiLCAibG9jYWxTdGFjayIsICJwdXNoU3RhY2tEZWR1cCIsICJ0b2tlbnMiLCAicmVzdGFydGVkIiwgInRva2VuRW5kIiwgImZvcmNlIiwgImZvcmNlQmFzZSIsICJpbnNlcnQiLCAiU3RhY2tCdWZmZXJDdXJzb3IiLCAiaWQiLCAiRGlhbGVjdCIsICJzb3VyY2UiLCAiZmxhZ3MiLCAiZGlzYWJsZWQiLCAiTFJQYXJzZXIiLCAiX0xSUGFyc2VyIiwgIlBhcnNlciIsICJzcGVjIiwgIm5vZGVOYW1lcyIsICJpIiwgInRvcFRlcm1zIiwgInIiLCAibm9kZVByb3BzIiwgInNldFByb3AiLCAibm9kZUlEIiwgInByb3AiLCAidmFsdWUiLCAicHJvcFNwZWMiLCAiTm9kZVByb3AiLCAibmV4dCIsICJqIiwgIk5vZGVTZXQiLCAibmFtZSIsICJOb2RlVHlwZSIsICJ0b2tlbkFycmF5IiwgImRlY29kZUFycmF5IiwgImdldFNwZWNpYWxpemVyIiwgIlRva2VuR3JvdXAiLCAiaW5wdXQiLCAiZnJhZ21lbnRzIiwgInJhbmdlcyIsICJwYXJzZSIsICJQYXJzZSIsICJ3IiwgInN0YXRlIiwgInRlcm0iLCAibG9vc2UiLCAidGFibGUiLCAicG9zIiwgImdyb3VwVGFnIiwgImxhc3QiLCAidGFyZ2V0IiwgImVuZCIsICJ0ZXJtaW5hbCIsICJkYXRhIiwgInNldCIsICJwYWlyIiwgInNsb3QiLCAiZmxhZyIsICJhY3Rpb24iLCAiYSIsICJkZWZsdCIsICJyZXN1bHQiLCAidiIsICJjb25maWciLCAiY29weSIsICJpbmZvIiwgInQiLCAiZm91bmQiLCAicyIsICJwcmVjIiwgImRpYWxlY3QiLCAidmFsdWVzIiwgImZsYWdzIiwgInBhcnQiLCAiaWQiLCAiZGlzYWJsZWQiLCAiRGlhbGVjdCIsICJvZmYiLCAiZmluZEZpbmlzaGVkIiwgInN0YWNrcyIsICJiZXN0IiwgInN0YWNrIiwgInN0b3BwZWQiLCAibWFzayIsICJwYXJzZXIiLCAiTFJQYXJzZXIiLCAiTG9jYWxUb2tlbkdyb3VwIiwgImNyaXRpY21hcmt1cExhbmd1YWdlIiwgIkxSTGFuZ3VhZ2UiLCAicmFuZ2VQYXJzZXIiLCAiU3RhdGVGaWVsZCIsICJzdGF0ZSIsICJ0ZXh0IiwgInRyZWUiLCAiY3JpdGljbWFya3VwTGFuZ3VhZ2UiLCAicmFuZ2VzIiwgIkNyaXRpY01hcmt1cFJhbmdlcyIsICJjdXJzb3JHZW5lcmF0ZVJhbmdlcyIsICJUcmVlRnJhZ21lbnQiLCAidmFsdWUiLCAidHIiLCAiZWZmZWN0IiwgImZ1bGxSZWxvYWRFZmZlY3QiLCAiY2hhbmdlZF9yYW5nZXMiLCAiZnJvbSIsICJ0byIsICJmcm9tQiIsICJ0b0IiLCAiZnJhZ21lbnRzIiwgIkRvY0lucHV0IiwgImluc2VydGVkX3NldCIsICJvZmZzZXRzIiwgImRhbmdsaW5nX2NvbW1lbnRzIiwgImRlbGV0ZWRfcmFuZ2VzIiwgImNoYW5nZWRfcmFuZ2UiLCAicmFuZ2UiLCAia2V5IiwgInJlcGx5IiwgImRlbGV0ZWRfcmFuZ2UiLCAiY3VtdWxhdGl2ZV9vZmZzZXQiLCAibmlsX25vZGUiLCAidmlzaXROb2RlIiwgIm5vZGUiLCAiaW5zZXJ0ZWRfcmFuZ2VzIiwgImNvbW1lbnRfdGhyZWFkcyIsICJsYXN0X3JhbmdlIiwgImN1cnJlbnRfdGhyZWFkIiwgImEiLCAiYiIsICJ0aHJlYWQiLCAiaGVhZCIsICJhZGphY2VudF9yYW5nZSIsICJjb21tZW50IiwgImNvbnN0cnVjdFJhbmdlRnJvbVN5bnRheE5vZGUiLCAiX2EiLCAiX2IiLCAibWV0YWRhdGEiLCAiQ09NTUVOVEFUT1JfR0xPQkFMIiwgIm1pZGRsZSIsICJjaGlsZCIsICJjb25zdHJ1Y3RSYW5nZSIsICJzdGFydCIsICJwcmV2aW91c19yYW5nZSIsICJjdXJzb3IiLCAibmV3X3JhbmdlIiwgImdldFJhbmdlc0luVGV4dCIsICJ0ZXh0IiwgInRyZWUiLCAiY3JpdGljbWFya3VwTGFuZ3VhZ2UiLCAiY3Vyc29yR2VuZXJhdGVSYW5nZXMiLCAiY29uc3RydWN0UmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0eXBlIiwgIm1pZGRsZSIsICJtZXRhZGF0YSIsICJBZGRpdGlvblJhbmdlIiwgIkRlbGV0aW9uUmFuZ2UiLCAiU3Vic3RpdHV0aW9uUmFuZ2UiLCAiSGlnaGxpZ2h0UmFuZ2UiLCAiQ29tbWVudFJhbmdlIiwgIlJBTkdFX1BST1RPVFlQRV9NQVBQRVIiLCAiZ2VuZXJhdGVfbWV0YWRhdGEiLCAibWV0YWRhdGEiLCAiQ09NTUVOVEFUT1JfR0xPQkFMIiwgImRlZmF1bHRfbW92ZW1lbnRfb3B0aW9ucyIsICJicmFja2V0X21vdmVtZW50X29wdGlvbnMiLCAiY29uc3RydWN0X3JhbmdlIiwgImluc2VydGVkIiwgImRlbGV0ZWQiLCAidHlwZSIsICJtZXRhZGF0YV9maWVsZHMiLCAic3RhcnRfb2Zmc2V0IiwgImVuZF9vZmZzZXQiLCAiYnJhY2tldHMiLCAiQ01fQWxsX0JyYWNrZXRzIiwgIm1ldGFkYXRhIiwgIm91dHB1dCIsICJpbml0aWFsX29mZnNldCIsICJjcmVhdGVfcmFuZ2UiLCAidHlwZSIsICJpbnNlcnRlZCIsICJkZWxldGVkIiwgImNvbnN0cnVjdF9yYW5nZSIsICJnZW5lcmF0ZV9tZXRhZGF0YSIsICJpbXBvcnRfb2JzaWRpYW4iLCAic2FtZU1hcmtlcnMiLCAiYSIsICJiIiwgImkiLCAiYWR2YW5jZUN1cnNvciIsICJjdXJzb3IiLCAiY29sbGVjdCIsICJwb3MiLCAiYXNBcnJheSIsICJ2YWwiLCAiR3V0dGVyRWxlbWVudCIsICJ2aWV3IiwgImhlaWdodCIsICJhYm92ZSIsICJtYXJrZXJzIiwgIl9fcHVibGljRmllbGQiLCAic2FtZU1hcmtlcnMiLCAiY2xzIiwgImRvbVBvcyIsICJpTmV3IiwgImlPbGQiLCAic2tpcFRvIiwgIm1hcmtlciIsICJtYXRjaGVkIiwgImMiLCAiaSIsICJuZXh0IiwgImFmdGVyIiwgIlVwZGF0ZUNvbnRleHQiLCAiZ3V0dGVyIiwgInZpZXdwb3J0IiwgIlJhbmdlU2V0IiwgImJsb2NrIiwgIm5ld0VsdCIsICJsaW5lIiwgImV4dHJhTWFya2VycyIsICJsb2NhbE1hcmtlcnMiLCAiZm9yTGluZSIsICJsYXN0IiwgIlNpbmdsZUd1dHRlclZpZXciLCAiY29uZmlnIiwgInByb3AiLCAiZXZlbnQiLCAidGFyZ2V0IiwgInkiLCAicmVjdCIsICJ1cGRhdGUiLCAicHJldk1hcmtlcnMiLCAidXBkYXRlZCIsICJ2cCIsICJlbHQiLCAiR3V0dGVyVmlldyIsICJ1bmZpeEd1dHRlcnMiLCAiYWN0aXZlR3V0dGVycyIsICJjb25mIiwgInZwQSIsICJ2cEIiLCAidnBPdmVybGFwIiwgImRldGFjaCIsICJsaW5lQ2xhc3NlcyIsICJndXR0ZXJMaW5lQ2xhc3MiLCAiY2xhc3NTZXQiLCAiY29udGV4dHMiLCAiZmlyc3QiLCAiYiIsICJCbG9ja1R5cGUiLCAiY3giLCAicHJldiIsICJjdXIiLCAiY2hhbmdlIiwgImd1dHRlcnMiLCAia25vd24iLCAiZyIsICJjcmVhdGVHdXR0ZXJWaWV3UGx1Z2luIiwgIlZpZXdQbHVnaW4iLCAicGx1Z2luIiwgIkVkaXRvclZpZXciLCAidmFsdWUiLCAiRGlyZWN0aW9uIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiYXJvdW5kIiwgIm9iaiIsICJmYWN0b3JpZXMiLCAicmVtb3ZlcnMiLCAia2V5IiwgImFyb3VuZDEiLCAiciIsICJtZXRob2QiLCAiY3JlYXRlV3JhcHBlciIsICJpbmhlcml0ZWQiLCAiaGFkT3duIiwgIm9yaWdpbmFsIiwgImN1cnJlbnQiLCAid3JhcHBlciIsICJyZW1vdmUiLCAiYXJncyIsICJyZXNvbHZlRWRpdG9yUHJvdG90eXBlIiwgImFwcCIsICJ3aWRnZXRFZGl0b3JWaWV3IiwgIk1hcmtkb3duRWRpdG9yIiwgImRlZmF1bHRQcm9wZXJ0aWVzIiwgImVkaXRvciIsICJtb2QiLCAic2hpZnQiLCAiRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yIiwgImNvbnRhaW5lciIsICJvcHRpb25zIiwgIl9hIiwgIl9iIiwgIl9jIiwgIl9fcHVibGljRmllbGQiLCAiX19zcHJlYWRWYWx1ZXMiLCAiZSIsICJjdHgiLCAiYXJvdW5kIiwgIm9sZE1ldGhvZCIsICJsZWFmIiwgInBhcmFtcyIsICJFZGl0b3JTZWxlY3Rpb24iLCAidXBkYXRlIiwgImNoYW5nZWQiLCAiZXh0ZW5zaW9ucyIsICJwbGFjZWhvbGRlciIsICJFZGl0b3JWaWV3IiwgImV2ZW50IiwgIlByZWMiLCAia2V5bWFwIiwgImNtIiwgImV4dCIsICJoZWlnaHQiLCAiUExVR0lOX1ZFUlNJT04iLCAiREVGQVVMVF9TRVRUSU5HUyIsICJQTFVHSU5fVkVSU0lPTiIsICJpbXBvcnRfb2JzaWRpYW4iLCAic3RpY2t5Q29udGV4dE1lbnVQYXRjaCIsICJvblN1Ym1lbnUiLCAicGF0Y2giLCAiYXJvdW5kIiwgIm9sZE1ldGhvZCIsICJlIiwgInNlbGVjdGVkSXRlbSIsICJBbm5vdGF0aW9uTm9kZSIsICJyYW5nZSIsICJtYXJrZXIiLCAiX19wdWJsaWNGaWVsZCIsICJhdXRob3JMYWJlbCIsICJhdXRob3IiLCAic2VwYXJhdG9yIiwgInRpbWVMYWJlbCIsICJ0aW1lIiwgImFwcCIsICJFbWJlZGRhYmxlTWFya2Rvd25FZGl0b3IiLCAiZWRpdG9yIiwgInRleHRfc2xpY2VzIiwgImNoaWxkSWR4IiwgImNyZWF0ZV9yYW5nZSIsICJzdGlja3lDb250ZXh0TWVudVBhdGNoIiwgIm1lbnUiLCAiaXRlbSIsICJhY2NlcHRTdWdnZXN0aW9ucyIsICJyZWplY3RTdWdnZXN0aW9ucyIsICJhZGRDb21tZW50VG9WaWV3IiwgImFubm90YXRpb25HdXR0ZXJGb2xkQW5ub3RhdGlvbiIsICJzdWJtZW51IiwgImN1cnJlbnRfc2V0dGluZ3MiLCAiYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSIsICJ0aXRsZSIsICJpY29uIiwgInZhbHVlIiwgImlzX2FjdGl2ZSIsICJhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlcyIsICJBbm5vdGF0aW9uTWFya2VyIiwgIkd1dHRlck1hcmtlciIsICJhbm5vdGF0aW9uIiwgImFubm90YXRpb25zIiwgInZpZXciLCAiaXRyIiwgIm90aGVyIiwgImFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24iLCAiaW5kZXgiLCAic2Nyb2xsIiwgInRvcCIsICJkb20iLCAiY3JlYXRlTWFya2VycyIsICJzdGF0ZSIsICJjaGFuZ2VkX3JhbmdlcyIsICJ0eXBlcyIsICJpbmNsdWRlQWRkaXRpb25zIiwgImluY2x1ZGVEZWxldGlvbnMiLCAiaW5jbHVkZVN1YnN0aXR1dGlvbnMiLCAiaW5jbHVkZUhpZ2hsaWdodHMiLCAiaW5jbHVkZUNvbW1lbnRzIiwgImNtX3JhbmdlcyIsICJmdWxsX3RocmVhZCIsICJhbm5vdGF0aW9uR3V0dGVyTWFya2VycyIsICJTdGF0ZUZpZWxkIiwgInJhbmdlcyIsICJyYW5nZVBhcnNlciIsICJhY2MiLCAiYmFzZSIsICJSYW5nZVNldCIsICJvbGRTZXQiLCAidHIiLCAiaW5jbHVkZWRUeXBlcyIsICJhZGRlZF9yYW5nZXMiLCAiZGVsZXRlZF9yYW5nZXMiLCAiZnJvbSIsICJ0byIsICJrZWVwIiwgImltcG9ydF9vYnNpZGlhbiIsICJtYXJrdXBGb2N1c0VmZmVjdCIsICJTdGF0ZUVmZmVjdCIsICJtYXJrdXBGb2N1c1N0YXRlIiwgIlN0YXRlRmllbGQiLCAic3RhdGUiLCAidmFsdWUiLCAidHIiLCAiZm9jdXNSZW5kZXJlciIsICJEZWNvcmF0aW9uIiwgIm9sZFNldCIsICJfYSIsICJtYXJrdXBTdGFydEZvY3VzIiwgIm1hcmt1cEVuZEZvY3VzIiwgInJhbmdlcyIsICJyYW5nZVBhcnNlciIsICJSYW5nZVNldCIsICJmaWVsZCIsICJFZGl0b3JWaWV3IiwgImltcG9ydF9vYnNpZGlhbiIsICJoaWRlTWFya3VwRGVjb3JhdGlvbiIsICJEZWNvcmF0aW9uIiwgIkZPTERfQlVUVE9OX09GRlNFVCIsICJ1bmZpeEd1dHRlcnMiLCAiRmFjZXQiLCAidmFsdWVzIiwgIngiLCAiYWN0aXZlR3V0dGVycyIsICJhbm5vdGF0aW9uR3V0dGVyRm9jdXNBbm5vdGF0aW9uIiwgIkFubm90YXRpb24iLCAiYW5ub3RhdGlvbkd1dHRlckZvbGRBbm5vdGF0aW9uIiwgImFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24iLCAiYW5ub3RhdGlvbkd1dHRlcldpZHRoQW5ub3RhdGlvbiIsICJhbm5vdGF0aW9uR3V0dGVySGlkZUVtcHR5QW5ub3RhdGlvbiIsICJhbm5vdGF0aW9uR3V0dGVyRm9sZEJ1dHRvbkFubm90YXRpb24iLCAiYW5ub3RhdGlvbkd1dHRlclJlc2l6ZUhhbmRsZUFubm90YXRpb24iLCAiQW5ub3RhdGlvbkd1dHRlclZpZXciLCAiR3V0dGVyVmlldyIsICJ2aWV3IiwgIl9fcHVibGljRmllbGQiLCAiYW5ub3RhdGlvbkd1dHRlckNvbXBhcnRtZW50IiwgImNvbmYiLCAiQW5ub3RhdGlvblNpbmdsZUd1dHRlclZpZXciLCAiYWZ0ZXIiLCAiZ3V0dGVyIiwgIkFubm90YXRpb25VcGRhdGVDb250ZXh0IiwgInVwZGF0ZSIsICJ0cmFuc2FjdGlvbiIsICJ0aHJlYWRfZm9jdXMiLCAibWFya2VyIiwgImluZGV4IiwgInNjcm9sbCIsICJmb2N1c19tYXJrdXAiLCAiX2EiLCAibWFya3VwRm9jdXNFZmZlY3QiLCAiYW5ub3RhdGlvbiIsICJ0ciIsICJlIiwgImZyb20iLCAidG8iLCAib3V0ZXJfbG9vcCIsICJlbGVtZW50IiwgImFjdGl2ZUd1dHRlciIsICJtYXJrZXJJbmRleCIsICJkZXNpcmVkTG9jYXRpb24iLCAiY3VycmVudExvY2F0aW9uIiwgIm9mZnNldCIsICJhbm5vdGF0aW9uR3V0dGVyVmlldyIsICJjcmVhdGVHdXR0ZXJWaWV3UGx1Z2luIiwgIkFubm90YXRpb25VcGRhdGVDb250ZXh0IiwgIlVwZGF0ZUNvbnRleHQiLCAiZ3V0dGVyIiwgInZpZXdwb3J0IiwgImhlaWdodCIsICJfX3B1YmxpY0ZpZWxkIiwgInZpZXciLCAiYmxvY2siLCAibWFya2VycyIsICJfYSIsICJhYm92ZSIsICJibG9ja19zdGFydCIsICJhIiwgImIiLCAiZWxlbWVudF9pZHgiLCAiZSIsICJzYW1lTWFya2VycyIsICJlbGVtZW50IiwgImkiLCAiYWRkZWRfZWxlbWVudCIsICJBbm5vdGF0aW9uR3V0dGVyRWxlbWVudCIsICJBbm5vdGF0aW9uU2luZ2xlR3V0dGVyVmlldyIsICJTaW5nbGVHdXR0ZXJWaWV3IiwgImNvbmZpZyIsICJndXR0ZXJEb20iLCAiYW5ub3RhdGlvbkd1dHRlck1hcmtlcnMiLCAiaW5pdGlhbFBvc2l0aW9uIiwgInNldFdpZHRoIiwgIndpZHRoIiwgIkZPTERfQlVUVE9OX09GRlNFVCIsICJjdXJyZW50V2lkdGgiLCAib25Nb3VzZU1vdmUiLCAiZXZ0IiwgImRlbHRhWCIsICJvbk1vdXNlU3RvcCIsICJjb21tZW50IiwgInVwZGF0ZSIsICJyZXN1bHQiLCAid2lkZ2V0cyIsICJ0cmFuc2FjdGlvbiIsICJmb2xkX3N0YXR1cyIsICJhbm5vdGF0aW9uR3V0dGVyRm9sZEFubm90YXRpb24iLCAiYW5ub3RhdGlvbkd1dHRlcldpZHRoQW5ub3RhdGlvbiIsICJoaWRlX2VtcHR5IiwgImFubm90YXRpb25HdXR0ZXJIaWRlRW1wdHlBbm5vdGF0aW9uIiwgImZvbGRfYnV0dG9uIiwgImFubm90YXRpb25HdXR0ZXJGb2xkQnV0dG9uQW5ub3RhdGlvbiIsICJyZXNpemVfaGFuZGxlIiwgImFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVBbm5vdGF0aW9uIiwgIl9iIiwgIkd1dHRlckVsZW1lbnQiLCAiYW5ub3RhdGlvbkd1dHRlckNvbXBhcnRtZW50IiwgIkNvbXBhcnRtZW50IiwgImFkZENvbW1lbnRUb1ZpZXciLCAiZWRpdG9yIiwgInJhbmdlIiwgInNjcm9sbCIsICJjdXJzb3IiLCAicmVwbHlfaWR4IiwgImNyZWF0ZV9yYW5nZSIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYW5ub3RhdGlvbkd1dHRlckZvY3VzQW5ub3RhdGlvbiIsICJhY2NlcHRTdWdnZXN0aW9ucyIsICJzdGF0ZSIsICJmcm9tIiwgInRvIiwgInJlbW92ZV9hdHRhY2hlZF9jb21tZW50cyIsICJyYW5nZV9maWVsZCIsICJyYW5nZVBhcnNlciIsICJyYW5nZSIsICJyZWplY3RTdWdnZXN0aW9ucyIsICJpbXBvcnRfZGlmZl9tYXRjaF9wYXRjaCIsICJEaWZmTWF0Y2hQYXRjaCIsICJpbmRleFdvcmtlciIsICJmaWxlcyIsICJzZXR0aW5ncyIsICJDT01NRU5UQVRPUl9HTE9CQUwiLCAiZmlsZSIsICJnZXRSYW5nZXNJblRleHQiLCAiZXZlbnQiLCAiaW5kZXhXb3JrZXIiXQp9Cg==\n')}(0,si.extendPrototype)(bF.default);(0,ti.extendPrototype)(bF.default);var Rt=class extends mB.Events{_events=[];onunload(){}unload(){for(;this._events.length>0;)this._events.pop()()}register(I){this._events.push(I)}registerEvent(I){this.register(()=>I.e.offref(I))}},EA=class extends Rt{constructor(g,B,F,Q,A,U,l,s=2,G=d=>d,t=()=>this.plugin.settings,c=!0){super();this.plugin=g;this.name=B;this.title=F;this.version=Q;this.description=A;this.defaultValue=U;this.extractValue=l;this.workers=s;this.loadValue=G;this.getSettings=t;this.old_version=parseInt(this.plugin.app.loadLocalStorage(B+"-version"))||null,this.persist=bF.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:bF.default.INDEXEDDB,description:A,version:Q}),c&&this.startDatabase()}memory=new Map;persist;old_version=null;deleted_keys=new Set;databaseUpdate=(0,mB.debounce)(()=>{this.trigger("database-update",this.allEntries()),this.flushChanges()},100,!0);flushChanges=(0,mB.debounce)(async()=>{await this.persistMemory(),this.trigger("database-update",this.allEntries())},1e3,!0);on(g,B,F){return super.on(g,B,F)}async startDatabase(){this.plugin.app.workspace.onLayoutReady(async()=>{await this.persist.ready(async()=>{this.old_version===null?(await this.rebuildDatabase(),this.trigger("database-create")):this.old_version{if(g instanceof mB.TFile&&g.extension==="md"){let B=this.plugin.app.workspace.activeEditor,F=B&&B.file?.path===g.path&&B.editor?B.editor.cm.state:void 0;this.storeKey(g.path,await this.extractValue(g,F),g.stat.mtime)}})),this.registerEvent(this.plugin.app.vault.on("delete",async g=>{g instanceof mB.TFile&&g.extension==="md"&&this.deleteKey(g.path)})),this.registerEvent(this.plugin.app.vault.on("rename",async(g,B)=>{g instanceof mB.TFile&&g.extension==="md"&&this.renameKey(B,g.path,g.stat.mtime)})),this.registerEvent(this.plugin.app.vault.on("create",async g=>{g instanceof mB.TFile&&g.extension==="md"&&this.storeKey(g.path,this.defaultValue(),g.stat.mtime)}))})})}async loadDatabase(){this.memory=new Map(Object.entries(await this.persist.getItems()).map(([g,B])=>(B.data=this.loadValue(B.data),[g,B])))}async regularParseFiles(g){for(let B=0;Bawait this.plugin.app.vault.cachedRead(Q))),F=Math.ceil(g.length/this.workers);for(let Q=0;Q{for(let G=0;G{g.some(Q=>Q.path===F)||this.deleteKey(F)});let B=g.filter(F=>!this.memory.has(F.path)||this.memory.get(F.path).mtimeawait this.persist.removeItem(B))),this.deleted_keys.clear()}storeKey(g,B,F,Q=!0){this.memory.set(g,{data:B,mtime:F??Date.now(),dirty:Q}),this.databaseUpdate()}deleteKey(g){if(this.getItem(g)==null)throw new Error("Key does not exist");this.memory.delete(g),this.deleted_keys.add(g),this.databaseUpdate()}renameKey(g,B,F){let Q=this.getItem(g);if(Q==null)throw new Error("Key does not exist");this.storeKey(B,Q.data,F),this.deleteKey(g),this.databaseUpdate()}allKeys(){return Array.from(this.memory.keys())}getValue(g){return this.memory.get(g)?.data??null}allValues(){return Array.from(this.memory.values()).map(g=>g.data)}getItem(g){return this.memory.get(g)??null}allItems(){return Array.from(this.memory.values())}allEntries(){return Array.from(this.memory.entries())}async dropDatabase(){this.memory.clear(),await bF.default.dropInstance({name:this.name+`/${this.plugin.app.appId}`}),localStorage.removeItem(this.plugin.app.appId+"-"+this.name+"-version")}async reinitializeDatabase(){await this.dropDatabase(),this.persist=bF.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:bF.default.INDEXEDDB,version:this.version,description:this.description}),await this.rebuildDatabase(),this.trigger("database-update",this.allEntries())}async clearDatabase(){this.memory.clear(),await this.persist.clear()}isEmpty(){return this.memory.size===0}};var xi=require("obsidian");var DF=require("@codemirror/state");var ci=require("@codemirror/view"),gC=null,nt=ci.EditorView.domEventHandlers({keydown:(C,I)=>{gC=C},contextmenu:(C,I)=>{gC=C}});var Gi=require("@codemirror/state");function xl(C,I,g,B,F){if(I.includes("select.pointer")||gC&&F.key==="a"&&(gC.ctrlKey||gC.metaKey))return;let Q=I.includes("select.backward"),A=I.includes("select.group"),U=I.includes("select.extend");!g&&F&&(Q=F.key==="ArrowLeft",F.key==="ArrowLeft"?Q=!0:F.key==="ArrowRight"?Q=!1:Q=!tG(C.startState.selection,C.selection),U=F.shiftKey,A=F.ctrlKey||F.metaKey);let l=C.startState.field(JI).ranges,s=C.selection.ranges.map((G,t)=>EG(C.startState.selection.ranges[t],G,l,!Q,A,U,g,C.startState,B.suggestion_mode_operations.cursor_movement,B.suggestion_mode_operations.bracket_movement).selection);return{selection:Gi.EditorSelection.create(s),filter:!1}}function r0(C,I){return I.some(g=>g.startsWith(C))}var at=C=>DF.EditorState.transactionFilter.of(I=>p0(I,C));function p0(C,I){let g=PU(C),B=sg.app.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!C.docChanged&&B&&bQ(C)&&g.push(C.startState.selection.ranges[0].fromc[0].to?t.to:c[0].touches_right_bracket(t.to,!1,!0)?c[0].to:void 0;if(Z!==void 0&&e!==void 0){A.push({from:Z,to:e,insert:""}),U.push(DF.EditorSelection.cursor(Z+G)),G-=e-Z;continue}}let d=WA(Q,C.startState.doc,t.from,t.to,t.inserted,"regular"),b=d.slice(0,-1).reduce((Z,e)=>Z-(e.to-e.from)+e.insert.length,0);d&&(A.push(d),U.push(DF.EditorSelection.cursor((l?d[0].start:d[d.length-1].end+b)+G)),G+=b-(d[d.length-1].to-d[d.length-1].from)+d[d.length-1].insert.length)}return C.startState.update(A.length?{changes:A,selection:DF.EditorSelection.create(U)}:{})}else if(r0("select",g)&&bQ(C)&&I.alternative_cursor_movement&&gC instanceof KeyboardEvent){let F=xl(C,g,B,I,gC);if(F)return C.startState.update(F)}return C}var NA=require("@codemirror/state");var H0={moveByCharacters:{group:!1}};function Y0(C,I){return I.some(g=>g.startsWith(C))}var mt=C=>NA.EditorState.transactionFilter.of(I=>J0(I,C));function J0(C,I){let g=PU(C),B=sg.app.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!C.docChanged&&C.selection&&B&&(bQ(C)&&g.push(C.startState.selection.ranges[0].fromx-(a.to-a.from)+a.insert.length,0);Z&&(U.push(Z),l.push(NA.EditorSelection.cursor((G?Z[0].start:Z[Z.length-1].end+e)+c)),c+=e-(Z[Z.length-1].to-Z[Z.length-1].from)+Z[Z.length-1].insert.length)}return C.startState.update(U.length?{changes:U,selection:NA.EditorSelection.create(l)}:{})}else if(Y0("select",g)&&bQ(C)&&I.alternative_cursor_movement&&gC instanceof KeyboardEvent){let F=xl(C,g,B,I,gC);if(F)return C.startState.update(F)}return C}var pa=require("@codemirror/state");function ZF(C,I){return C===0?[]:C===1?[at(I)]:C===2?[mt(I)]:[]}var hB=require("obsidian");async function v0(C){let I;if(hB.Platform.isMobileApp){let g=await Capacitor.nativePromise("App","getInfo");g&&(I=g.version+" ("+g.build+")")}else I=navigator.userAgent.match(/obsidian\/([\d.]+\d+)/)?.[1]||"unknown";return{plugin_version:C.plugins.plugins.commentator.manifest.version,platform:hB.Platform.isMobileApp?hB.Platform.isAndroidApp?"Android":hB.Platform.isIosApp?"iOS":"mobile":hB.Platform.isMacOS?"macOS":"Desktop",framework_version:I,obsidian_version:hB.apiVersion}}async function k0(C,I,g={}){let B=I?`[BUG] ${I} \u2013 ADD A TITLE HERE`:"[BUG] ADD A TITLE HERE";try{let Q={...await v0(C),...g},A=Object.entries(Q).map(([U,l])=>`**${U}**: ${JSON.stringify(l)}`).join(` -`);return"https://github.com/Fevol/obsidian-criticmarkup/issues/new?"+new URLSearchParams({title:B,body:`# User report -**Description:** ADD A SHORT DESCRIPTION HERE - - - ---- -# Debugger data (do not alter) -${A}`,labels:"bug"})}catch(F){return"https://github.com/Fevol/obsidian-criticmarkup/issues/new?"+new URLSearchParams({title:B,body:`# User report -**Description:** ADD A SHORT DESCRIPTION HERE - - - ---- -# Debugger data (do not alter) -**Error while generating debugger data:** ${F}`,labels:"bug"})}}async function ii(C,I="",g={}){window.open(await k0(C,I,g),"_blank")}function ul(C,I,g=100,B=3e3,F){let Q=new hB.Notice("",0);Q.messageEl.appendChild(createEl("span",{text:C})),F&&(Q.messageEl.appendChild(createEl("br")),Q.messageEl.appendChild(createEl("span",{cls:"u-small",text:F})));let A=createEl("progress");return A.value=0,A.max=g,Q.messageEl.appendChild(A),U=>{U>=g?(Q.setMessage(I),Q.noticeEl.addClass("mod-success"),setTimeout(()=>{Q.hide()},B)):A.value=Math.round(U)}}function Ll(C,I,g,B){for(let{icon:F,tooltip:Q,value:A}of g)C.addItem(U=>{U.setTitle(Q).setIcon(F).setChecked(I===A).onClick(()=>{B(A);for(let l of C.items){let s=l===U;l.dom.classList.toggle("mod-checked",s),l.checkIconEl?l.checkIconEl.style.display=s?"flex":"none":l.setChecked(s)}})})}var Zi=require("obsidian"),ei=require("@codemirror/state");var yt=require("@codemirror/state"),wa=require("@codemirror/view");var di=yt.Facet.define({combine:C=>C.some(I=>I)}),ht=yt.Facet.define(),Xt=class extends XQ{constructor(I){super(I,di,ht),I.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{I.dispatch(I.state.update({effects:[Rl.reconfigure([])]}))}))}createGutters(I){return I.state.facet(ht).map(g=>new ot(I,g))}},ot=class extends cF{constructor(g,B){super(g,B);this.view=g;this.config=B;g.state.facet(HF)&&(this.hide_on_empty=!0)}hide_on_empty=!1;showing=!0;update(g){let B=super.update(g),F=g.state.facet(HF);return F!==g.startState.facet(HF)&&(this.hide_on_empty=F),this.showing&&this.hide_on_empty&&g.state.field(JI).ranges.empty()?(this.dom.parentElement.classList.add("gutter-hidden"),this.showing=!1):!this.showing&&(!this.hide_on_empty||!g.state.field(JI).ranges.empty())&&(this.dom.parentElement.classList.remove("gutter-hidden"),this.showing=!0),B}},D0=$U(Xt);function bi(C){return Il(D0,C,ht,di)}var nl=require("@codemirror/state"),al=require("@codemirror/view");var St=class extends al.GutterMarker{constructor(g,B,F){super();this.type=g;this.top=B;this.bottom=F}toDOM(){let g="";return this.type.has("addition")&&(g+="cmtr-diff-gutter-addition "),this.type.has("deletion")&&(g+="cmtr-diff-gutter-deletion "),this.type.has("substitution")&&(g+="cmtr-diff-gutter-substitution "),this.top&&(g+="cmtr-diff-gutter-top "),this.bottom&&(g+="cmtr-diff-gutter-bottom "),createDiv({cls:g})}},Wt=al.ViewPlugin.fromClass(class{markers=nl.RangeSet.empty;constructMarkers(I){let g=I.state.field(JI).ranges,B=new nl.RangeSetBuilder,F={};for(let Q of g.ranges_in_interval(I.viewport.from,I.viewport.to)){let A=I.state.doc.lineAt(Q.from).number,U=I.state.doc.lineAt(Q.to).number,l=Array.from({length:U-A+1},(s,G)=>A+G);F[A]?F[A].isStart=!0:F[A]={isStart:!0,isEnd:!1,types:new Set};for(let s of l)F[s]?(F[s].isEnd=!1,F[s].types.add(Q.type)):F[s]={isStart:!1,isEnd:!1,types:new Set([Q.type])};F[U]&&(F[U].isEnd=!0)}for(let[Q,A]of Object.entries(F)){let U=I.state.doc.line(Number(Q));B.add(U.from,U.to,new St(A.types,A.isStart,A.isEnd))}this.markers=B.finish()}constructor(I){this.constructMarkers(I)}update(I){(I.docChanged||I.viewportChanged||I.heightChanged)&&this.constructMarkers(I.view)}});var Vi=[Wt,bi({class:"cmtr-diff-gutter",markers:C=>C.plugin(Wt).markers,domEventHandlers:{click:(C,I,g)=>{let B=new Zi.Menu;return B.addItem(F=>{F.setTitle("Accept changes").setIcon("check").onClick(()=>{C.dispatch({changes:wB(C.state,I.from,I.to)})})}),B.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").onClick(()=>{C.dispatch({changes:fB(C.state,I.from,I.to)})})}),B.showAtMouseEvent(g),!1}}})],Rl=new ei.Compartment;var T0=C=>Object.entries(FG).map(([I,g])=>({id:`toggle-${I.toLowerCase()}`,name:`Mark as ${I}`,icon:I.toLowerCase(),editor_context:!0,regular_callback:(B,F)=>{gi(B,g,C.settings)}})),w0=C=>[{id:"accept-all-suggestions",name:"Accept all suggestions",icon:"check-check",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch(I.cm.state.update({changes:wB(I.cm.state)}))}},{id:"reject-all-suggestions",name:"Reject all suggestions",icon:"cross",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch(I.cm.state.update({changes:fB(I.cm.state)}))}},{id:"accept-selected-suggestions",name:"Accept suggestions in selection",icon:"check",editor_context:!0,check_callback:(I,g,B)=>{let F=Bt(g.cm.state);if(I||!F)return F;let A=g.cm.state.selection.ranges.map(U=>wB(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:A}))}},{id:"reject-selected-suggestions",name:"Reject suggestions in selection",icon:"cross",editor_context:!0,check_callback:(I,g,B)=>{let F=Bt(g.cm.state);if(I||!F)return F;let A=g.cm.state.selection.ranges.map(U=>fB(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:A}))}},{id:"comment",name:"Add comment",icon:"message-square",editor_context:!0,regular_callback:(I,g)=>{jC(I.cm,I.cm.state.field(JI).ranges.at_cursor(I.cm.state.selection.main.head))}},{id:"fold-gutter",name:"Fold annotation gutter",icon:"arrow-right-from-line",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch({annotations:[iF.of(null)]})}},{id:"toggle-preview-mode",name:"Cycle preview mode",icon:"comment",editor_context:!0,regular_callback:(I,g)=>{let B=(I.cm.state.facet(Mg)+1)%3;I.cm.dispatch(I.cm.state.update({effects:xQ.reconfigure(Mg.of(B))})),C.setPreviewMode(g,B)}},{id:"suggest-mode",name:"Toggle suggestion mode",icon:"file-edit",editor_context:!0,regular_callback:(I,g)=>{let F=I.cm.state.facet(nC)===2?1:2;I.cm.dispatch(I.cm.state.update({effects:[uQ.reconfigure(nC.of(F)),LQ.reconfigure(ZF(F,C.settings))]})),C.setEditMode(g,F)}},{id:"generate-text-diff",name:"Generate text diff from clipboard",icon:"diff",editor_context:!0,regular_callback:async(I,g)=>{let B=await navigator.clipboard.readText(),F=I.cm.state.field(JI).ranges,Q=I.cm.state.selection.main,A=F.unwrap_in_range(I.cm.state.doc,Q.from,Q.to).output,U=Bi(A,B);I.cm.dispatch(I.cm.state.update({changes:[{from:Q.from,to:Q.to,insert:U}]}))}}],f0=C=>[{id:"view",name:"Open global annotation view",icon:"comment",regular_callback:async()=>{await C.activateView()}}],ui=C=>z0([...T0(C),...w0(C),...f0(C)]);function z0(C){for(let I of C)xi.Platform.isMobile||I.editor_context?I.regular_callback?(I.editorCallback=I.regular_callback,delete I.regular_callback):(I.editorCheckCallback=I.check_callback,delete I.check_callback):I.regular_callback?(I.callback=I.regular_callback,delete I.regular_callback):(I.checkCallback=I.check_callback,delete I.check_callback);return C}var Li=C=>C.workspace.on("editor-menu",(I,g)=>{let B=g.cm.state.field(JI).ranges;if(I.addItem(F=>{F.setTitle("Add comment").setIcon("message-square").setSection("commentator").onClick(()=>{jC(g.cm,B.at_cursor(g.cm.state.selection.main.head))})}),B.contains_range(g.cm.state.selection.main.from,g.cm.state.selection.main.to)&&(I.addItem(F=>{F.setTitle("Accept changes").setIcon("check").setSection("commentator").onClick(()=>{let A=g.cm.state.selection.ranges.map(U=>wB(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:A}))})}),I.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").setSection("commentator").onClick(()=>{let A=g.cm.state.selection.ranges.map(U=>fB(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:A}))})}),lG(g.cm.state.selection))){let F=g.cm.state.field(JI).ranges.at_cursor(g.cm.state.selection.ranges[0].head);I.addItem(Q=>{let A=Q.setTitle("Set metadata").setIcon("tags").setSection("commentator").setSubmenu();A.addItem(U=>{U.setTitle("Set author").setIcon("lucide-user").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("author",sg.PLUGIN_SETTINGS.author)}))})}),A.addItem(U=>{U.setTitle("Set time").setIcon("lucide-calendar").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("time",Math.round(Date.now()/1e3))}))})}),A.addItem(U=>{U.setTitle("Set completed").setIcon("lucide-check").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("done",!0)}))})})})}}),Ri=C=>C.workspace.on("markdown-viewport-menu",(I,g,B,F)=>{if(C.plugins.plugins.commentator.settings.annotation_gutter){let Q=g.editor.cm,A=Q.state.field(QB);GF(!0),I.addItem(U=>{U.setTitle("Fold gutter").setIcon("arrow-right-from-line").setSection("commentator").onClick(()=>{Q.dispatch(Q.state.update({annotations:[iF.of(null)]}))})}),I.addItem(U=>{let l=U.setTitle("Included annotations").setIcon("eye").setSection("commentator").setSubmenu();for(let{title:s,icon:G,value:t}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])l.addItem(c=>{c.setTitle(s).setIcon(G).setChecked((A&t)!==0).onClick(()=>{A^=t;let d=(A&t)!==0;c.checkIconEl?c.checkIconEl.style.display=d?"flex":"none":c.setChecked(d),Q.dispatch(Q.state.update({effects:[VQ.reconfigure(QB.of(A))]}))})})})}});function pQ(C,I){C.scrollIntoView({from:C.offsetToPos(I.from),to:C.offsetToPos(I.to)},!0)}var ml=require("@codemirror/state"),ni=require("@codemirror/view");var Et=ml.Prec.high(ni.EditorView.inputHandler.of((C,I,g,B)=>{let F=C.state.doc.sliceString(I-2,I)+B,Q;if((Q=QG[F])!==void 0){let A=[{from:I,to:g+1,insert:B+Q.join("")}];return C.dispatch({changes:A,selection:ml.EditorSelection.cursor(g+1)}),!0}return!1}));var hl=require("@codemirror/state");var Nt=hl.EditorState.transactionFilter.of(C=>{if(C.isUserEvent("select")){let I=C.startState.selection.main,g=C.selection.main;if(g.anchor===g.head){let B=C.startState.field(JI).ranges,F=B.at_cursor(I.head),Q=B.at_cursor(g.head);if(F&&F!==Q&&(F.type==="substitution"||F.type==="highlight")){let A=F.unwrap(),U=!1,l=0,s=A.search(/\S/);s>=1&&(U=!0,A=A.slice(s),l+=s);let G=A.match(/\n\s*\n/g);if(G&&(U=!0,A=A.replace(/\n\s*\n/g,` -`),l+=G.reduce((t,c)=>t+c.length,0)),U)return{changes:[{from:F.from+3,to:F.to-3,insert:A}],selection:hl.EditorSelection.cursor(g.head-l)}}}}return C});var ai=require("@codemirror/state");var rt=C=>ai.EditorState.transactionExtender.of(I=>{if(I.selection&&I.newSelection.main!==I.startState.selection.main){let g=[],B=[];return C.annotation_gutter_focus_on_click&&B.push(aB.of({from:I.selection.main.from,to:I.selection.main.to})),g.push(NQ.of({from:I.selection.main.from,to:I.selection.main.to})),{effects:g,annotations:B}}return{}});var TF=require("obsidian");async function sB(C,I,g,B=!0){let F=MU(I),Q={},A=()=>{};Object.keys(F).length>=100&&(A=ul("Applying operations...","Operations applied.",Object.keys(F).length,3e3,"Please do not apply other operations until this progress bar has completed."));let U=0;for(let[l,s]of Object.entries(F)){let G=C.app.vault.getAbstractFileByPath(l);!G||!(G instanceof TF.TFile)||(Q[l]=await C.app.vault.cachedRead(G),B&&(s=s.flatMap(t=>[t,...t.replies])),s.sort((t,c)=>t.from-c.from),await g(C.app,G,s),A(++U))}C.file_history.push({changes:Q,mtime:Date.now()})}async function pt(C){if(C.file_history.length===0){new TF.Notice("No changes to undo.",3e3);return}let I=C.file_history.pop();if(!I)return;let{changes:g,mtime:B}=I,F=()=>{};Object.keys(g).length>=100&&(F=ul("Undoing changes...","Changes undone.",Object.keys(g).length,3e3,"Please do not apply other operations until this progress bar has completed."));let Q=0;for(let[A,U]of Object.entries(g)){let l=C.app.vault.getAbstractFileByPath(A);if(!(!l||!(l instanceof TF.TFile))){if(l.stat.mtime>B){new TF.Notice("File has been modified since the changes were made, skipping: "+A,3e3);continue}await C.app.vault.modify(l,U),F(++Q)}}}async function Xl(C,I){let g=C.app.workspace.getLeavesOfType("markdown");if(!g.length)return;let B=g.reduce((A,U)=>(A.activeTime??0)>(U.activeTime??0)?A:U),F=C.app.vault.getAbstractFileByPath(I.path);if(!F||!(F instanceof TF.TFile))return;await C.app.workspace.revealLeaf(B);let Q=B.view;F!==Q.file&&await B.openFile(F),pQ(Q.editor,I.range)}var Ht=new Uint16Array('\u1D41<\xD5\u0131\u028A\u049D\u057B\u05D0\u0675\u06DE\u07A2\u07D6\u080F\u0A4A\u0A91\u0DA1\u0E6D\u0F09\u0F26\u10CA\u1228\u12E1\u1415\u149D\u14C3\u14DF\u1525\0\0\0\0\0\0\u156B\u16CD\u198D\u1C12\u1DDD\u1F7E\u2060\u21B0\u228D\u23C0\u23FB\u2442\u2824\u2912\u2D08\u2E48\u2FCE\u3016\u32BA\u3639\u37AC\u38FE\u3A28\u3A71\u3AE0\u3B2E\u0800EMabcfglmnoprstu\\bfms\x7F\x84\x8B\x90\x95\x98\xA6\xB3\xB9\xC8\xCFlig\u803B\xC6\u40C6P\u803B&\u4026cute\u803B\xC1\u40C1reve;\u4102\u0100iyx}rc\u803B\xC2\u40C2;\u4410r;\uC000\u{1D504}rave\u803B\xC0\u40C0pha;\u4391acr;\u4100d;\u6A53\u0100gp\x9D\xA1on;\u4104f;\uC000\u{1D538}plyFunction;\u6061ing\u803B\xC5\u40C5\u0100cs\xBE\xC3r;\uC000\u{1D49C}ign;\u6254ilde\u803B\xC3\u40C3ml\u803B\xC4\u40C4\u0400aceforsu\xE5\xFB\xFE\u0117\u011C\u0122\u0127\u012A\u0100cr\xEA\xF2kslash;\u6216\u0176\xF6\xF8;\u6AE7ed;\u6306y;\u4411\u0180crt\u0105\u010B\u0114ause;\u6235noullis;\u612Ca;\u4392r;\uC000\u{1D505}pf;\uC000\u{1D539}eve;\u42D8c\xF2\u0113mpeq;\u624E\u0700HOacdefhilorsu\u014D\u0151\u0156\u0180\u019E\u01A2\u01B5\u01B7\u01BA\u01DC\u0215\u0273\u0278\u027Ecy;\u4427PY\u803B\xA9\u40A9\u0180cpy\u015D\u0162\u017Aute;\u4106\u0100;i\u0167\u0168\u62D2talDifferentialD;\u6145leys;\u612D\u0200aeio\u0189\u018E\u0194\u0198ron;\u410Cdil\u803B\xC7\u40C7rc;\u4108nint;\u6230ot;\u410A\u0100dn\u01A7\u01ADilla;\u40B8terDot;\u40B7\xF2\u017Fi;\u43A7rcle\u0200DMPT\u01C7\u01CB\u01D1\u01D6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01E2\u01F8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020FoubleQuote;\u601Duote;\u6019\u0200lnpu\u021E\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6A74\u0180git\u022F\u0236\u023Aruent;\u6261nt;\u622FourIntegral;\u622E\u0100fr\u024C\u024E;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6A2Fcr;\uC000\u{1D49E}p\u0100;C\u0284\u0285\u62D3ap;\u624D\u0580DJSZacefios\u02A0\u02AC\u02B0\u02B4\u02B8\u02CB\u02D7\u02E1\u02E6\u0333\u048D\u0100;o\u0179\u02A5trahd;\u6911cy;\u4402cy;\u4405cy;\u440F\u0180grs\u02BF\u02C4\u02C7ger;\u6021r;\u61A1hv;\u6AE4\u0100ay\u02D0\u02D5ron;\u410E;\u4414l\u0100;t\u02DD\u02DE\u6207a;\u4394r;\uC000\u{1D507}\u0100af\u02EB\u0327\u0100cm\u02F0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031Ccute;\u40B4o\u0174\u030B\u030D;\u42D9bleAcute;\u42DDrave;\u4060ilde;\u42DCond;\u62C4ferentialD;\u6146\u0470\u033D\0\0\0\u0342\u0354\0\u0405f;\uC000\u{1D53B}\u0180;DE\u0348\u0349\u034D\u40A8ot;\u60DCqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03CF\u03E2\u03F8ontourIntegra\xEC\u0239o\u0274\u0379\0\0\u037B\xBB\u0349nArrow;\u61D3\u0100eo\u0387\u03A4ft\u0180ART\u0390\u0396\u03A1rrow;\u61D0ightArrow;\u61D4e\xE5\u02CAng\u0100LR\u03AB\u03C4eft\u0100AR\u03B3\u03B9rrow;\u67F8ightArrow;\u67FAightArrow;\u67F9ight\u0100AT\u03D8\u03DErrow;\u61D2ee;\u62A8p\u0241\u03E9\0\0\u03EFrrow;\u61D1ownArrow;\u61D5erticalBar;\u6225n\u0300ABLRTa\u0412\u042A\u0430\u045E\u047F\u037Crrow\u0180;BU\u041D\u041E\u0422\u6193ar;\u6913pArrow;\u61F5reve;\u4311eft\u02D2\u043A\0\u0446\0\u0450ightVector;\u6950eeVector;\u695Eector\u0100;B\u0459\u045A\u61BDar;\u6956ight\u01D4\u0467\0\u0471eeVector;\u695Fector\u0100;B\u047A\u047B\u61C1ar;\u6957ee\u0100;A\u0486\u0487\u62A4rrow;\u61A7\u0100ct\u0492\u0497r;\uC000\u{1D49F}rok;\u4110\u0800NTacdfglmopqstux\u04BD\u04C0\u04C4\u04CB\u04DE\u04E2\u04E7\u04EE\u04F5\u0521\u052F\u0536\u0552\u055D\u0560\u0565G;\u414AH\u803B\xD0\u40D0cute\u803B\xC9\u40C9\u0180aiy\u04D2\u04D7\u04DCron;\u411Arc\u803B\xCA\u40CA;\u442Dot;\u4116r;\uC000\u{1D508}rave\u803B\xC8\u40C8ement;\u6208\u0100ap\u04FA\u04FEcr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65FBerySmallSquare;\u65AB\u0100gp\u0526\u052Aon;\u4118f;\uC000\u{1D53C}silon;\u4395u\u0100ai\u053C\u0549l\u0100;T\u0542\u0543\u6A75ilde;\u6242librium;\u61CC\u0100ci\u0557\u055Ar;\u6130m;\u6A73a;\u4397ml\u803B\xCB\u40CB\u0100ip\u056A\u056Fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058D\u05B2\u05CCy;\u4424r;\uC000\u{1D509}lled\u0253\u0597\0\0\u05A3mallSquare;\u65FCerySmallSquare;\u65AA\u0370\u05BA\0\u05BF\0\0\u05C4f;\uC000\u{1D53D}All;\u6200riertrf;\u6131c\xF2\u05CB\u0600JTabcdfgorst\u05E8\u05EC\u05EF\u05FA\u0600\u0612\u0616\u061B\u061D\u0623\u066C\u0672cy;\u4403\u803B>\u403Emma\u0100;d\u05F7\u05F8\u4393;\u43DCreve;\u411E\u0180eiy\u0607\u060C\u0610dil;\u4122rc;\u411C;\u4413ot;\u4120r;\uC000\u{1D50A};\u62D9pf;\uC000\u{1D53E}eater\u0300EFGLST\u0635\u0644\u064E\u0656\u065B\u0666qual\u0100;L\u063E\u063F\u6265ess;\u62DBullEqual;\u6267reater;\u6AA2ess;\u6277lantEqual;\u6A7Eilde;\u6273cr;\uC000\u{1D4A2};\u626B\u0400Aacfiosu\u0685\u068B\u0696\u069B\u069E\u06AA\u06BE\u06CARDcy;\u442A\u0100ct\u0690\u0694ek;\u42C7;\u405Eirc;\u4124r;\u610ClbertSpace;\u610B\u01F0\u06AF\0\u06B2f;\u610DizontalLine;\u6500\u0100ct\u06C3\u06C5\xF2\u06A9rok;\u4126mp\u0144\u06D0\u06D8ownHum\xF0\u012Fqual;\u624F\u0700EJOacdfgmnostu\u06FA\u06FE\u0703\u0707\u070E\u071A\u071E\u0721\u0728\u0744\u0778\u078B\u078F\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803B\xCD\u40CD\u0100iy\u0713\u0718rc\u803B\xCE\u40CE;\u4418ot;\u4130r;\u6111rave\u803B\xCC\u40CC\u0180;ap\u0720\u072F\u073F\u0100cg\u0734\u0737r;\u412AinaryI;\u6148lie\xF3\u03DD\u01F4\u0749\0\u0762\u0100;e\u074D\u074E\u622C\u0100gr\u0753\u0758ral;\u622Bsection;\u62C2isible\u0100CT\u076C\u0772omma;\u6063imes;\u6062\u0180gpt\u077F\u0783\u0788on;\u412Ef;\uC000\u{1D540}a;\u4399cr;\u6110ilde;\u4128\u01EB\u079A\0\u079Ecy;\u4406l\u803B\xCF\u40CF\u0280cfosu\u07AC\u07B7\u07BC\u07C2\u07D0\u0100iy\u07B1\u07B5rc;\u4134;\u4419r;\uC000\u{1D50D}pf;\uC000\u{1D541}\u01E3\u07C7\0\u07CCr;\uC000\u{1D4A5}rcy;\u4408kcy;\u4404\u0380HJacfos\u07E4\u07E8\u07EC\u07F1\u07FD\u0802\u0808cy;\u4425cy;\u440Cppa;\u439A\u0100ey\u07F6\u07FBdil;\u4136;\u441Ar;\uC000\u{1D50E}pf;\uC000\u{1D542}cr;\uC000\u{1D4A6}\u0580JTaceflmost\u0825\u0829\u082C\u0850\u0863\u09B3\u09B8\u09C7\u09CD\u0A37\u0A47cy;\u4409\u803B<\u403C\u0280cmnpr\u0837\u083C\u0841\u0844\u084Dute;\u4139bda;\u439Bg;\u67EAlacetrf;\u6112r;\u619E\u0180aey\u0857\u085C\u0861ron;\u413Ddil;\u413B;\u441B\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087E\u08A9\u08B1\u08E0\u08E6\u08FC\u092F\u095B\u0390\u096A\u0100nr\u0883\u088FgleBracket;\u67E8row\u0180;BR\u0899\u089A\u089E\u6190ar;\u61E4ightArrow;\u61C6eiling;\u6308o\u01F5\u08B7\0\u08C3bleBracket;\u67E6n\u01D4\u08C8\0\u08D2eeVector;\u6961ector\u0100;B\u08DB\u08DC\u61C3ar;\u6959loor;\u630Aight\u0100AV\u08EF\u08F5rrow;\u6194ector;\u694E\u0100er\u0901\u0917e\u0180;AV\u0909\u090A\u0910\u62A3rrow;\u61A4ector;\u695Aiangle\u0180;BE\u0924\u0925\u0929\u62B2ar;\u69CFqual;\u62B4p\u0180DTV\u0937\u0942\u094CownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61BFar;\u6958ector\u0100;B\u0965\u0966\u61BCar;\u6952ight\xE1\u039Cs\u0300EFGLST\u097E\u098B\u0995\u099D\u09A2\u09ADqualGreater;\u62DAullEqual;\u6266reater;\u6276ess;\u6AA1lantEqual;\u6A7Dilde;\u6272r;\uC000\u{1D50F}\u0100;e\u09BD\u09BE\u62D8ftarrow;\u61DAidot;\u413F\u0180npw\u09D4\u0A16\u0A1Bg\u0200LRlr\u09DE\u09F7\u0A02\u0A10eft\u0100AR\u09E6\u09ECrrow;\u67F5ightArrow;\u67F7ightArrow;\u67F6eft\u0100ar\u03B3\u0A0Aight\xE1\u03BFight\xE1\u03CAf;\uC000\u{1D543}er\u0100LR\u0A22\u0A2CeftArrow;\u6199ightArrow;\u6198\u0180cht\u0A3E\u0A40\u0A42\xF2\u084C;\u61B0rok;\u4141;\u626A\u0400acefiosu\u0A5A\u0A5D\u0A60\u0A77\u0A7C\u0A85\u0A8B\u0A8Ep;\u6905y;\u441C\u0100dl\u0A65\u0A6FiumSpace;\u605Flintrf;\u6133r;\uC000\u{1D510}nusPlus;\u6213pf;\uC000\u{1D544}c\xF2\u0A76;\u439C\u0480Jacefostu\u0AA3\u0AA7\u0AAD\u0AC0\u0B14\u0B19\u0D91\u0D97\u0D9Ecy;\u440Acute;\u4143\u0180aey\u0AB4\u0AB9\u0ABEron;\u4147dil;\u4145;\u441D\u0180gsw\u0AC7\u0AF0\u0B0Eative\u0180MTV\u0AD3\u0ADF\u0AE8ediumSpace;\u600Bhi\u0100cn\u0AE6\u0AD8\xEB\u0AD9eryThi\xEE\u0AD9ted\u0100GL\u0AF8\u0B06reaterGreate\xF2\u0673essLes\xF3\u0A48Line;\u400Ar;\uC000\u{1D511}\u0200Bnpt\u0B22\u0B28\u0B37\u0B3Areak;\u6060BreakingSpace;\u40A0f;\u6115\u0680;CDEGHLNPRSTV\u0B55\u0B56\u0B6A\u0B7C\u0BA1\u0BEB\u0C04\u0C5E\u0C84\u0CA6\u0CD8\u0D61\u0D85\u6AEC\u0100ou\u0B5B\u0B64ngruent;\u6262pCap;\u626DoubleVerticalBar;\u6226\u0180lqx\u0B83\u0B8A\u0B9Bement;\u6209ual\u0100;T\u0B92\u0B93\u6260ilde;\uC000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0BB6\u0BB7\u0BBD\u0BC9\u0BD3\u0BD8\u0BE5\u626Fqual;\u6271ullEqual;\uC000\u2267\u0338reater;\uC000\u226B\u0338ess;\u6279lantEqual;\uC000\u2A7E\u0338ilde;\u6275ump\u0144\u0BF2\u0BFDownHump;\uC000\u224E\u0338qual;\uC000\u224F\u0338e\u0100fs\u0C0A\u0C27tTriangle\u0180;BE\u0C1A\u0C1B\u0C21\u62EAar;\uC000\u29CF\u0338qual;\u62ECs\u0300;EGLST\u0C35\u0C36\u0C3C\u0C44\u0C4B\u0C58\u626Equal;\u6270reater;\u6278ess;\uC000\u226A\u0338lantEqual;\uC000\u2A7D\u0338ilde;\u6274ested\u0100GL\u0C68\u0C79reaterGreater;\uC000\u2AA2\u0338essLess;\uC000\u2AA1\u0338recedes\u0180;ES\u0C92\u0C93\u0C9B\u6280qual;\uC000\u2AAF\u0338lantEqual;\u62E0\u0100ei\u0CAB\u0CB9verseElement;\u620CghtTriangle\u0180;BE\u0CCB\u0CCC\u0CD2\u62EBar;\uC000\u29D0\u0338qual;\u62ED\u0100qu\u0CDD\u0D0CuareSu\u0100bp\u0CE8\u0CF9set\u0100;E\u0CF0\u0CF3\uC000\u228F\u0338qual;\u62E2erset\u0100;E\u0D03\u0D06\uC000\u2290\u0338qual;\u62E3\u0180bcp\u0D13\u0D24\u0D4Eset\u0100;E\u0D1B\u0D1E\uC000\u2282\u20D2qual;\u6288ceeds\u0200;EST\u0D32\u0D33\u0D3B\u0D46\u6281qual;\uC000\u2AB0\u0338lantEqual;\u62E1ilde;\uC000\u227F\u0338erset\u0100;E\u0D58\u0D5B\uC000\u2283\u20D2qual;\u6289ilde\u0200;EFT\u0D6E\u0D6F\u0D75\u0D7F\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uC000\u{1D4A9}ilde\u803B\xD1\u40D1;\u439D\u0700Eacdfgmoprstuv\u0DBD\u0DC2\u0DC9\u0DD5\u0DDB\u0DE0\u0DE7\u0DFC\u0E02\u0E20\u0E22\u0E32\u0E3F\u0E44lig;\u4152cute\u803B\xD3\u40D3\u0100iy\u0DCE\u0DD3rc\u803B\xD4\u40D4;\u441Eblac;\u4150r;\uC000\u{1D512}rave\u803B\xD2\u40D2\u0180aei\u0DEE\u0DF2\u0DF6cr;\u414Cga;\u43A9cron;\u439Fpf;\uC000\u{1D546}enCurly\u0100DQ\u0E0E\u0E1AoubleQuote;\u601Cuote;\u6018;\u6A54\u0100cl\u0E27\u0E2Cr;\uC000\u{1D4AA}ash\u803B\xD8\u40D8i\u016C\u0E37\u0E3Cde\u803B\xD5\u40D5es;\u6A37ml\u803B\xD6\u40D6er\u0100BP\u0E4B\u0E60\u0100ar\u0E50\u0E53r;\u603Eac\u0100ek\u0E5A\u0E5C;\u63DEet;\u63B4arenthesis;\u63DC\u0480acfhilors\u0E7F\u0E87\u0E8A\u0E8F\u0E92\u0E94\u0E9D\u0EB0\u0EFCrtialD;\u6202y;\u441Fr;\uC000\u{1D513}i;\u43A6;\u43A0usMinus;\u40B1\u0100ip\u0EA2\u0EADncareplan\xE5\u069Df;\u6119\u0200;eio\u0EB9\u0EBA\u0EE0\u0EE4\u6ABBcedes\u0200;EST\u0EC8\u0EC9\u0ECF\u0EDA\u627Aqual;\u6AAFlantEqual;\u627Cilde;\u627Eme;\u6033\u0100dp\u0EE9\u0EEEuct;\u620Fortion\u0100;a\u0225\u0EF9l;\u621D\u0100ci\u0F01\u0F06r;\uC000\u{1D4AB};\u43A8\u0200Ufos\u0F11\u0F16\u0F1B\u0F1FOT\u803B"\u4022r;\uC000\u{1D514}pf;\u611Acr;\uC000\u{1D4AC}\u0600BEacefhiorsu\u0F3E\u0F43\u0F47\u0F60\u0F73\u0FA7\u0FAA\u0FAD\u1096\u10A9\u10B4\u10BEarr;\u6910G\u803B\xAE\u40AE\u0180cnr\u0F4E\u0F53\u0F56ute;\u4154g;\u67EBr\u0100;t\u0F5C\u0F5D\u61A0l;\u6916\u0180aey\u0F67\u0F6C\u0F71ron;\u4158dil;\u4156;\u4420\u0100;v\u0F78\u0F79\u611Cerse\u0100EU\u0F82\u0F99\u0100lq\u0F87\u0F8Eement;\u620Builibrium;\u61CBpEquilibrium;\u696Fr\xBB\u0F79o;\u43A1ght\u0400ACDFTUVa\u0FC1\u0FEB\u0FF3\u1022\u1028\u105B\u1087\u03D8\u0100nr\u0FC6\u0FD2gleBracket;\u67E9row\u0180;BL\u0FDC\u0FDD\u0FE1\u6192ar;\u61E5eftArrow;\u61C4eiling;\u6309o\u01F5\u0FF9\0\u1005bleBracket;\u67E7n\u01D4\u100A\0\u1014eeVector;\u695Dector\u0100;B\u101D\u101E\u61C2ar;\u6955loor;\u630B\u0100er\u102D\u1043e\u0180;AV\u1035\u1036\u103C\u62A2rrow;\u61A6ector;\u695Biangle\u0180;BE\u1050\u1051\u1055\u62B3ar;\u69D0qual;\u62B5p\u0180DTV\u1063\u106E\u1078ownVector;\u694FeeVector;\u695Cector\u0100;B\u1082\u1083\u61BEar;\u6954ector\u0100;B\u1091\u1092\u61C0ar;\u6953\u0100pu\u109B\u109Ef;\u611DndImplies;\u6970ightarrow;\u61DB\u0100ch\u10B9\u10BCr;\u611B;\u61B1leDelayed;\u69F4\u0680HOacfhimoqstu\u10E4\u10F1\u10F7\u10FD\u1119\u111E\u1151\u1156\u1161\u1167\u11B5\u11BB\u11BF\u0100Cc\u10E9\u10EEHcy;\u4429y;\u4428FTcy;\u442Ccute;\u415A\u0280;aeiy\u1108\u1109\u110E\u1113\u1117\u6ABCron;\u4160dil;\u415Erc;\u415C;\u4421r;\uC000\u{1D516}ort\u0200DLRU\u112A\u1134\u113E\u1149ownArrow\xBB\u041EeftArrow\xBB\u089AightArrow\xBB\u0FDDpArrow;\u6191gma;\u43A3allCircle;\u6218pf;\uC000\u{1D54A}\u0272\u116D\0\0\u1170t;\u621Aare\u0200;ISU\u117B\u117C\u1189\u11AF\u65A1ntersection;\u6293u\u0100bp\u118F\u119Eset\u0100;E\u1197\u1198\u628Fqual;\u6291erset\u0100;E\u11A8\u11A9\u6290qual;\u6292nion;\u6294cr;\uC000\u{1D4AE}ar;\u62C6\u0200bcmp\u11C8\u11DB\u1209\u120B\u0100;s\u11CD\u11CE\u62D0et\u0100;E\u11CD\u11D5qual;\u6286\u0100ch\u11E0\u1205eeds\u0200;EST\u11ED\u11EE\u11F4\u11FF\u627Bqual;\u6AB0lantEqual;\u627Dilde;\u627FTh\xE1\u0F8C;\u6211\u0180;es\u1212\u1213\u1223\u62D1rset\u0100;E\u121C\u121D\u6283qual;\u6287et\xBB\u1213\u0580HRSacfhiors\u123E\u1244\u1249\u1255\u125E\u1271\u1276\u129F\u12C2\u12C8\u12D1ORN\u803B\xDE\u40DEADE;\u6122\u0100Hc\u124E\u1252cy;\u440By;\u4426\u0100bu\u125A\u125C;\u4009;\u43A4\u0180aey\u1265\u126A\u126Fron;\u4164dil;\u4162;\u4422r;\uC000\u{1D517}\u0100ei\u127B\u1289\u01F2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128E\u1298kSpace;\uC000\u205F\u200ASpace;\u6009lde\u0200;EFT\u12AB\u12AC\u12B2\u12BC\u623Cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uC000\u{1D54B}ipleDot;\u60DB\u0100ct\u12D6\u12DBr;\uC000\u{1D4AF}rok;\u4166\u0AE1\u12F7\u130E\u131A\u1326\0\u132C\u1331\0\0\0\0\0\u1338\u133D\u1377\u1385\0\u13FF\u1404\u140A\u1410\u0100cr\u12FB\u1301ute\u803B\xDA\u40DAr\u0100;o\u1307\u1308\u619Fcir;\u6949r\u01E3\u1313\0\u1316y;\u440Eve;\u416C\u0100iy\u131E\u1323rc\u803B\xDB\u40DB;\u4423blac;\u4170r;\uC000\u{1D518}rave\u803B\xD9\u40D9acr;\u416A\u0100di\u1341\u1369er\u0100BP\u1348\u135D\u0100ar\u134D\u1350r;\u405Fac\u0100ek\u1357\u1359;\u63DFet;\u63B5arenthesis;\u63DDon\u0100;P\u1370\u1371\u62C3lus;\u628E\u0100gp\u137B\u137Fon;\u4172f;\uC000\u{1D54C}\u0400ADETadps\u1395\u13AE\u13B8\u13C4\u03E8\u13D2\u13D7\u13F3rrow\u0180;BD\u1150\u13A0\u13A4ar;\u6912ownArrow;\u61C5ownArrow;\u6195quilibrium;\u696Eee\u0100;A\u13CB\u13CC\u62A5rrow;\u61A5own\xE1\u03F3er\u0100LR\u13DE\u13E8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13F9\u13FA\u43D2on;\u43A5ing;\u416Ecr;\uC000\u{1D4B0}ilde;\u4168ml\u803B\xDC\u40DC\u0480Dbcdefosv\u1427\u142C\u1430\u1433\u143E\u1485\u148A\u1490\u1496ash;\u62ABar;\u6AEBy;\u4412ash\u0100;l\u143B\u143C\u62A9;\u6AE6\u0100er\u1443\u1445;\u62C1\u0180bty\u144C\u1450\u147Aar;\u6016\u0100;i\u144F\u1455cal\u0200BLST\u1461\u1465\u146A\u1474ar;\u6223ine;\u407Ceparator;\u6758ilde;\u6240ThinSpace;\u600Ar;\uC000\u{1D519}pf;\uC000\u{1D54D}cr;\uC000\u{1D4B1}dash;\u62AA\u0280cefos\u14A7\u14AC\u14B1\u14B6\u14BCirc;\u4174dge;\u62C0r;\uC000\u{1D51A}pf;\uC000\u{1D54E}cr;\uC000\u{1D4B2}\u0200fios\u14CB\u14D0\u14D2\u14D8r;\uC000\u{1D51B};\u439Epf;\uC000\u{1D54F}cr;\uC000\u{1D4B3}\u0480AIUacfosu\u14F1\u14F5\u14F9\u14FD\u1504\u150F\u1514\u151A\u1520cy;\u442Fcy;\u4407cy;\u442Ecute\u803B\xDD\u40DD\u0100iy\u1509\u150Drc;\u4176;\u442Br;\uC000\u{1D51C}pf;\uC000\u{1D550}cr;\uC000\u{1D4B4}ml;\u4178\u0400Hacdefos\u1535\u1539\u153F\u154B\u154F\u155D\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417D;\u4417ot;\u417B\u01F2\u1554\0\u155BoWidt\xE8\u0AD9a;\u4396r;\u6128pf;\u6124cr;\uC000\u{1D4B5}\u0BE1\u1583\u158A\u1590\0\u15B0\u15B6\u15BF\0\0\0\0\u15C6\u15DB\u15EB\u165F\u166D\0\u1695\u169B\u16B2\u16B9\0\u16BEcute\u803B\xE1\u40E1reve;\u4103\u0300;Ediuy\u159C\u159D\u15A1\u15A3\u15A8\u15AD\u623E;\uC000\u223E\u0333;\u623Frc\u803B\xE2\u40E2te\u80BB\xB4\u0306;\u4430lig\u803B\xE6\u40E6\u0100;r\xB2\u15BA;\uC000\u{1D51E}rave\u803B\xE0\u40E0\u0100ep\u15CA\u15D6\u0100fp\u15CF\u15D4sym;\u6135\xE8\u15D3ha;\u43B1\u0100ap\u15DFc\u0100cl\u15E4\u15E7r;\u4101g;\u6A3F\u0264\u15F0\0\0\u160A\u0280;adsv\u15FA\u15FB\u15FF\u1601\u1607\u6227nd;\u6A55;\u6A5Clope;\u6A58;\u6A5A\u0380;elmrsz\u1618\u1619\u161B\u161E\u163F\u164F\u1659\u6220;\u69A4e\xBB\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163A\u163C\u163E;\u69A8;\u69A9;\u69AA;\u69AB;\u69AC;\u69AD;\u69AE;\u69AFt\u0100;v\u1645\u1646\u621Fb\u0100;d\u164C\u164D\u62BE;\u699D\u0100pt\u1654\u1657h;\u6222\xBB\xB9arr;\u637C\u0100gp\u1663\u1667on;\u4105f;\uC000\u{1D552}\u0380;Eaeiop\u12C1\u167B\u167D\u1682\u1684\u1687\u168A;\u6A70cir;\u6A6F;\u624Ad;\u624Bs;\u4027rox\u0100;e\u12C1\u1692\xF1\u1683ing\u803B\xE5\u40E5\u0180cty\u16A1\u16A6\u16A8r;\uC000\u{1D4B6};\u402Amp\u0100;e\u12C1\u16AF\xF1\u0288ilde\u803B\xE3\u40E3ml\u803B\xE4\u40E4\u0100ci\u16C2\u16C8onin\xF4\u0272nt;\u6A11\u0800Nabcdefiklnoprsu\u16ED\u16F1\u1730\u173C\u1743\u1748\u1778\u177D\u17E0\u17E6\u1839\u1850\u170D\u193D\u1948\u1970ot;\u6AED\u0100cr\u16F6\u171Ek\u0200ceps\u1700\u1705\u170D\u1713ong;\u624Cpsilon;\u43F6rime;\u6035im\u0100;e\u171A\u171B\u623Dq;\u62CD\u0176\u1722\u1726ee;\u62BDed\u0100;g\u172C\u172D\u6305e\xBB\u172Drk\u0100;t\u135C\u1737brk;\u63B6\u0100oy\u1701\u1741;\u4431quo;\u601E\u0280cmprt\u1753\u175B\u1761\u1764\u1768aus\u0100;e\u010A\u0109ptyv;\u69B0s\xE9\u170Cno\xF5\u0113\u0180ahw\u176F\u1771\u1773;\u43B2;\u6136een;\u626Cr;\uC000\u{1D51F}g\u0380costuvw\u178D\u179D\u17B3\u17C1\u17D5\u17DB\u17DE\u0180aiu\u1794\u1796\u179A\xF0\u0760rc;\u65EFp\xBB\u1371\u0180dpt\u17A4\u17A8\u17ADot;\u6A00lus;\u6A01imes;\u6A02\u0271\u17B9\0\0\u17BEcup;\u6A06ar;\u6605riangle\u0100du\u17CD\u17D2own;\u65BDp;\u65B3plus;\u6A04e\xE5\u1444\xE5\u14ADarow;\u690D\u0180ako\u17ED\u1826\u1835\u0100cn\u17F2\u1823k\u0180lst\u17FA\u05AB\u1802ozenge;\u69EBriangle\u0200;dlr\u1812\u1813\u1818\u181D\u65B4own;\u65BEeft;\u65C2ight;\u65B8k;\u6423\u01B1\u182B\0\u1833\u01B2\u182F\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183E\u184D\u0100;q\u1843\u1846\uC000=\u20E5uiv;\uC000\u2261\u20E5t;\u6310\u0200ptwx\u1859\u185E\u1867\u186Cf;\uC000\u{1D553}\u0100;t\u13CB\u1863om\xBB\u13CCtie;\u62C8\u0600DHUVbdhmptuv\u1885\u1896\u18AA\u18BB\u18D7\u18DB\u18EC\u18FF\u1905\u190A\u1910\u1921\u0200LRlr\u188E\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18A1\u18A2\u18A4\u18A6\u18A8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18B3\u18B5\u18B7\u18B9;\u655D;\u655A;\u655C;\u6559\u0380;HLRhlr\u18CA\u18CB\u18CD\u18CF\u18D1\u18D3\u18D5\u6551;\u656C;\u6563;\u6560;\u656B;\u6562;\u655Fox;\u69C9\u0200LRlr\u18E4\u18E6\u18E8\u18EA;\u6555;\u6552;\u6510;\u650C\u0280;DUdu\u06BD\u18F7\u18F9\u18FB\u18FD;\u6565;\u6568;\u652C;\u6534inus;\u629Flus;\u629Eimes;\u62A0\u0200LRlr\u1919\u191B\u191D\u191F;\u655B;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193B\u6502;\u656A;\u6561;\u655E;\u653C;\u6524;\u651C\u0100ev\u0123\u1942bar\u803B\xA6\u40A6\u0200ceio\u1951\u1956\u195A\u1960r;\uC000\u{1D4B7}mi;\u604Fm\u0100;e\u171A\u171Cl\u0180;bh\u1968\u1969\u196B\u405C;\u69C5sub;\u67C8\u016C\u1974\u197El\u0100;e\u1979\u197A\u6022t\xBB\u197Ap\u0180;Ee\u012F\u1985\u1987;\u6AAE\u0100;q\u06DC\u06DB\u0CE1\u19A7\0\u19E8\u1A11\u1A15\u1A32\0\u1A37\u1A50\0\0\u1AB4\0\0\u1AC1\0\0\u1B21\u1B2E\u1B4D\u1B52\0\u1BFD\0\u1C0C\u0180cpr\u19AD\u19B2\u19DDute;\u4107\u0300;abcds\u19BF\u19C0\u19C4\u19CA\u19D5\u19D9\u6229nd;\u6A44rcup;\u6A49\u0100au\u19CF\u19D2p;\u6A4Bp;\u6A47ot;\u6A40;\uC000\u2229\uFE00\u0100eo\u19E2\u19E5t;\u6041\xEE\u0693\u0200aeiu\u19F0\u19FB\u1A01\u1A05\u01F0\u19F5\0\u19F8s;\u6A4Don;\u410Ddil\u803B\xE7\u40E7rc;\u4109ps\u0100;s\u1A0C\u1A0D\u6A4Cm;\u6A50ot;\u410B\u0180dmn\u1A1B\u1A20\u1A26il\u80BB\xB8\u01ADptyv;\u69B2t\u8100\xA2;e\u1A2D\u1A2E\u40A2r\xE4\u01B2r;\uC000\u{1D520}\u0180cei\u1A3D\u1A40\u1A4Dy;\u4447ck\u0100;m\u1A47\u1A48\u6713ark\xBB\u1A48;\u43C7r\u0380;Ecefms\u1A5F\u1A60\u1A62\u1A6B\u1AA4\u1AAA\u1AAE\u65CB;\u69C3\u0180;el\u1A69\u1A6A\u1A6D\u42C6q;\u6257e\u0261\u1A74\0\0\u1A88rrow\u0100lr\u1A7C\u1A81eft;\u61BAight;\u61BB\u0280RSacd\u1A92\u1A94\u1A96\u1A9A\u1A9F\xBB\u0F47;\u64C8st;\u629Birc;\u629Aash;\u629Dnint;\u6A10id;\u6AEFcir;\u69C2ubs\u0100;u\u1ABB\u1ABC\u6663it\xBB\u1ABC\u02EC\u1AC7\u1AD4\u1AFA\0\u1B0Aon\u0100;e\u1ACD\u1ACE\u403A\u0100;q\xC7\xC6\u026D\u1AD9\0\0\u1AE2a\u0100;t\u1ADE\u1ADF\u402C;\u4040\u0180;fl\u1AE8\u1AE9\u1AEB\u6201\xEE\u1160e\u0100mx\u1AF1\u1AF6ent\xBB\u1AE9e\xF3\u024D\u01E7\u1AFE\0\u1B07\u0100;d\u12BB\u1B02ot;\u6A6Dn\xF4\u0246\u0180fry\u1B10\u1B14\u1B17;\uC000\u{1D554}o\xE4\u0254\u8100\xA9;s\u0155\u1B1Dr;\u6117\u0100ao\u1B25\u1B29rr;\u61B5ss;\u6717\u0100cu\u1B32\u1B37r;\uC000\u{1D4B8}\u0100bp\u1B3C\u1B44\u0100;e\u1B41\u1B42\u6ACF;\u6AD1\u0100;e\u1B49\u1B4A\u6AD0;\u6AD2dot;\u62EF\u0380delprvw\u1B60\u1B6C\u1B77\u1B82\u1BAC\u1BD4\u1BF9arr\u0100lr\u1B68\u1B6A;\u6938;\u6935\u0270\u1B72\0\0\u1B75r;\u62DEc;\u62DFarr\u0100;p\u1B7F\u1B80\u61B6;\u693D\u0300;bcdos\u1B8F\u1B90\u1B96\u1BA1\u1BA5\u1BA8\u622Arcap;\u6A48\u0100au\u1B9B\u1B9Ep;\u6A46p;\u6A4Aot;\u628Dr;\u6A45;\uC000\u222A\uFE00\u0200alrv\u1BB5\u1BBF\u1BDE\u1BE3rr\u0100;m\u1BBC\u1BBD\u61B7;\u693Cy\u0180evw\u1BC7\u1BD4\u1BD8q\u0270\u1BCE\0\0\u1BD2re\xE3\u1B73u\xE3\u1B75ee;\u62CEedge;\u62CFen\u803B\xA4\u40A4earrow\u0100lr\u1BEE\u1BF3eft\xBB\u1B80ight\xBB\u1BBDe\xE4\u1BDD\u0100ci\u1C01\u1C07onin\xF4\u01F7nt;\u6231lcty;\u632D\u0980AHabcdefhijlorstuwz\u1C38\u1C3B\u1C3F\u1C5D\u1C69\u1C75\u1C8A\u1C9E\u1CAC\u1CB7\u1CFB\u1CFF\u1D0D\u1D7B\u1D91\u1DAB\u1DBB\u1DC6\u1DCDr\xF2\u0381ar;\u6965\u0200glrs\u1C48\u1C4D\u1C52\u1C54ger;\u6020eth;\u6138\xF2\u1133h\u0100;v\u1C5A\u1C5B\u6010\xBB\u090A\u016B\u1C61\u1C67arow;\u690Fa\xE3\u0315\u0100ay\u1C6E\u1C73ron;\u410F;\u4434\u0180;ao\u0332\u1C7C\u1C84\u0100gr\u02BF\u1C81r;\u61CAtseq;\u6A77\u0180glm\u1C91\u1C94\u1C98\u803B\xB0\u40B0ta;\u43B4ptyv;\u69B1\u0100ir\u1CA3\u1CA8sht;\u697F;\uC000\u{1D521}ar\u0100lr\u1CB3\u1CB5\xBB\u08DC\xBB\u101E\u0280aegsv\u1CC2\u0378\u1CD6\u1CDC\u1CE0m\u0180;os\u0326\u1CCA\u1CD4nd\u0100;s\u0326\u1CD1uit;\u6666amma;\u43DDin;\u62F2\u0180;io\u1CE7\u1CE8\u1CF8\u40F7de\u8100\xF7;o\u1CE7\u1CF0ntimes;\u62C7n\xF8\u1CF7cy;\u4452c\u026F\u1D06\0\0\u1D0Arn;\u631Eop;\u630D\u0280lptuw\u1D18\u1D1D\u1D22\u1D49\u1D55lar;\u4024f;\uC000\u{1D555}\u0280;emps\u030B\u1D2D\u1D37\u1D3D\u1D42q\u0100;d\u0352\u1D33ot;\u6251inus;\u6238lus;\u6214quare;\u62A1blebarwedg\xE5\xFAn\u0180adh\u112E\u1D5D\u1D67ownarrow\xF3\u1C83arpoon\u0100lr\u1D72\u1D76ef\xF4\u1CB4igh\xF4\u1CB6\u0162\u1D7F\u1D85karo\xF7\u0F42\u026F\u1D8A\0\0\u1D8Ern;\u631Fop;\u630C\u0180cot\u1D98\u1DA3\u1DA6\u0100ry\u1D9D\u1DA1;\uC000\u{1D4B9};\u4455l;\u69F6rok;\u4111\u0100dr\u1DB0\u1DB4ot;\u62F1i\u0100;f\u1DBA\u1816\u65BF\u0100ah\u1DC0\u1DC3r\xF2\u0429a\xF2\u0FA6angle;\u69A6\u0100ci\u1DD2\u1DD5y;\u445Fgrarr;\u67FF\u0900Dacdefglmnopqrstux\u1E01\u1E09\u1E19\u1E38\u0578\u1E3C\u1E49\u1E61\u1E7E\u1EA5\u1EAF\u1EBD\u1EE1\u1F2A\u1F37\u1F44\u1F4E\u1F5A\u0100Do\u1E06\u1D34o\xF4\u1C89\u0100cs\u1E0E\u1E14ute\u803B\xE9\u40E9ter;\u6A6E\u0200aioy\u1E22\u1E27\u1E31\u1E36ron;\u411Br\u0100;c\u1E2D\u1E2E\u6256\u803B\xEA\u40EAlon;\u6255;\u444Dot;\u4117\u0100Dr\u1E41\u1E45ot;\u6252;\uC000\u{1D522}\u0180;rs\u1E50\u1E51\u1E57\u6A9Aave\u803B\xE8\u40E8\u0100;d\u1E5C\u1E5D\u6A96ot;\u6A98\u0200;ils\u1E6A\u1E6B\u1E72\u1E74\u6A99nters;\u63E7;\u6113\u0100;d\u1E79\u1E7A\u6A95ot;\u6A97\u0180aps\u1E85\u1E89\u1E97cr;\u4113ty\u0180;sv\u1E92\u1E93\u1E95\u6205et\xBB\u1E93p\u01001;\u1E9D\u1EA4\u0133\u1EA1\u1EA3;\u6004;\u6005\u6003\u0100gs\u1EAA\u1EAC;\u414Bp;\u6002\u0100gp\u1EB4\u1EB8on;\u4119f;\uC000\u{1D556}\u0180als\u1EC4\u1ECE\u1ED2r\u0100;s\u1ECA\u1ECB\u62D5l;\u69E3us;\u6A71i\u0180;lv\u1EDA\u1EDB\u1EDF\u43B5on\xBB\u1EDB;\u43F5\u0200csuv\u1EEA\u1EF3\u1F0B\u1F23\u0100io\u1EEF\u1E31rc\xBB\u1E2E\u0269\u1EF9\0\0\u1EFB\xED\u0548ant\u0100gl\u1F02\u1F06tr\xBB\u1E5Dess\xBB\u1E7A\u0180aei\u1F12\u1F16\u1F1Als;\u403Dst;\u625Fv\u0100;D\u0235\u1F20D;\u6A78parsl;\u69E5\u0100Da\u1F2F\u1F33ot;\u6253rr;\u6971\u0180cdi\u1F3E\u1F41\u1EF8r;\u612Fo\xF4\u0352\u0100ah\u1F49\u1F4B;\u43B7\u803B\xF0\u40F0\u0100mr\u1F53\u1F57l\u803B\xEB\u40EBo;\u60AC\u0180cip\u1F61\u1F64\u1F67l;\u4021s\xF4\u056E\u0100eo\u1F6C\u1F74ctatio\xEE\u0559nential\xE5\u0579\u09E1\u1F92\0\u1F9E\0\u1FA1\u1FA7\0\0\u1FC6\u1FCC\0\u1FD3\0\u1FE6\u1FEA\u2000\0\u2008\u205Allingdotse\xF1\u1E44y;\u4444male;\u6640\u0180ilr\u1FAD\u1FB3\u1FC1lig;\u8000\uFB03\u0269\u1FB9\0\0\u1FBDg;\u8000\uFB00ig;\u8000\uFB04;\uC000\u{1D523}lig;\u8000\uFB01lig;\uC000fj\u0180alt\u1FD9\u1FDC\u1FE1t;\u666Dig;\u8000\uFB02ns;\u65B1of;\u4192\u01F0\u1FEE\0\u1FF3f;\uC000\u{1D557}\u0100ak\u05BF\u1FF7\u0100;v\u1FFC\u1FFD\u62D4;\u6AD9artint;\u6A0D\u0100ao\u200C\u2055\u0100cs\u2011\u2052\u03B1\u201A\u2030\u2038\u2045\u2048\0\u2050\u03B2\u2022\u2025\u2027\u202A\u202C\0\u202E\u803B\xBD\u40BD;\u6153\u803B\xBC\u40BC;\u6155;\u6159;\u615B\u01B3\u2034\0\u2036;\u6154;\u6156\u02B4\u203E\u2041\0\0\u2043\u803B\xBE\u40BE;\u6157;\u615C5;\u6158\u01B6\u204C\0\u204E;\u615A;\u615D8;\u615El;\u6044wn;\u6322cr;\uC000\u{1D4BB}\u0880Eabcdefgijlnorstv\u2082\u2089\u209F\u20A5\u20B0\u20B4\u20F0\u20F5\u20FA\u20FF\u2103\u2112\u2138\u0317\u213E\u2152\u219E\u0100;l\u064D\u2087;\u6A8C\u0180cmp\u2090\u2095\u209Dute;\u41F5ma\u0100;d\u209C\u1CDA\u43B3;\u6A86reve;\u411F\u0100iy\u20AA\u20AErc;\u411D;\u4433ot;\u4121\u0200;lqs\u063E\u0642\u20BD\u20C9\u0180;qs\u063E\u064C\u20C4lan\xF4\u0665\u0200;cdl\u0665\u20D2\u20D5\u20E5c;\u6AA9ot\u0100;o\u20DC\u20DD\u6A80\u0100;l\u20E2\u20E3\u6A82;\u6A84\u0100;e\u20EA\u20ED\uC000\u22DB\uFE00s;\u6A94r;\uC000\u{1D524}\u0100;g\u0673\u061Bmel;\u6137cy;\u4453\u0200;Eaj\u065A\u210C\u210E\u2110;\u6A92;\u6AA5;\u6AA4\u0200Eaes\u211B\u211D\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6A8Arox\xBB\u2124\u0100;q\u212E\u212F\u6A88\u0100;q\u212E\u211Bim;\u62E7pf;\uC000\u{1D558}\u0100ci\u2143\u2146r;\u610Am\u0180;el\u066B\u214E\u2150;\u6A8E;\u6A90\u8300>;cdlqr\u05EE\u2160\u216A\u216E\u2173\u2179\u0100ci\u2165\u2167;\u6AA7r;\u6A7Aot;\u62D7Par;\u6995uest;\u6A7C\u0280adels\u2184\u216A\u2190\u0656\u219B\u01F0\u2189\0\u218Epro\xF8\u209Er;\u6978q\u0100lq\u063F\u2196les\xF3\u2088i\xED\u066B\u0100en\u21A3\u21ADrtneqq;\uC000\u2269\uFE00\xC5\u21AA\u0500Aabcefkosy\u21C4\u21C7\u21F1\u21F5\u21FA\u2218\u221D\u222F\u2268\u227Dr\xF2\u03A0\u0200ilmr\u21D0\u21D4\u21D7\u21DBrs\xF0\u1484f\xBB\u2024il\xF4\u06A9\u0100dr\u21E0\u21E4cy;\u444A\u0180;cw\u08F4\u21EB\u21EFir;\u6948;\u61ADar;\u610Firc;\u4125\u0180alr\u2201\u220E\u2213rts\u0100;u\u2209\u220A\u6665it\xBB\u220Alip;\u6026con;\u62B9r;\uC000\u{1D525}s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223A\u223E\u2243\u225E\u2263rr;\u61FFtht;\u623Bk\u0100lr\u2249\u2253eftarrow;\u61A9ightarrow;\u61AAf;\uC000\u{1D559}bar;\u6015\u0180clt\u226F\u2274\u2278r;\uC000\u{1D4BD}as\xE8\u21F4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xBB\u1C5B\u0AE1\u22A3\0\u22AA\0\u22B8\u22C5\u22CE\0\u22D5\u22F3\0\0\u22F8\u2322\u2367\u2362\u237F\0\u2386\u23AA\u23B4cute\u803B\xED\u40ED\u0180;iy\u0771\u22B0\u22B5rc\u803B\xEE\u40EE;\u4438\u0100cx\u22BC\u22BFy;\u4435cl\u803B\xA1\u40A1\u0100fr\u039F\u22C9;\uC000\u{1D526}rave\u803B\xEC\u40EC\u0200;ino\u073E\u22DD\u22E9\u22EE\u0100in\u22E2\u22E6nt;\u6A0Ct;\u622Dfin;\u69DCta;\u6129lig;\u4133\u0180aop\u22FE\u231A\u231D\u0180cgt\u2305\u2308\u2317r;\u412B\u0180elp\u071F\u230F\u2313in\xE5\u078Ear\xF4\u0720h;\u4131f;\u62B7ed;\u41B5\u0280;cfot\u04F4\u232C\u2331\u233D\u2341are;\u6105in\u0100;t\u2338\u2339\u621Eie;\u69DDdo\xF4\u2319\u0280;celp\u0757\u234C\u2350\u235B\u2361al;\u62BA\u0100gr\u2355\u2359er\xF3\u1563\xE3\u234Darhk;\u6A17rod;\u6A3C\u0200cgpt\u236F\u2372\u2376\u237By;\u4451on;\u412Ff;\uC000\u{1D55A}a;\u43B9uest\u803B\xBF\u40BF\u0100ci\u238A\u238Fr;\uC000\u{1D4BE}n\u0280;Edsv\u04F4\u239B\u239D\u23A1\u04F3;\u62F9ot;\u62F5\u0100;v\u23A6\u23A7\u62F4;\u62F3\u0100;i\u0777\u23AElde;\u4129\u01EB\u23B8\0\u23BCcy;\u4456l\u803B\xEF\u40EF\u0300cfmosu\u23CC\u23D7\u23DC\u23E1\u23E7\u23F5\u0100iy\u23D1\u23D5rc;\u4135;\u4439r;\uC000\u{1D527}ath;\u4237pf;\uC000\u{1D55B}\u01E3\u23EC\0\u23F1r;\uC000\u{1D4BF}rcy;\u4458kcy;\u4454\u0400acfghjos\u240B\u2416\u2422\u2427\u242D\u2431\u2435\u243Bppa\u0100;v\u2413\u2414\u43BA;\u43F0\u0100ey\u241B\u2420dil;\u4137;\u443Ar;\uC000\u{1D528}reen;\u4138cy;\u4445cy;\u445Cpf;\uC000\u{1D55C}cr;\uC000\u{1D4C0}\u0B80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248D\u2491\u250E\u253D\u255A\u2580\u264E\u265E\u2665\u2679\u267D\u269A\u26B2\u26D8\u275D\u2768\u278B\u27C0\u2801\u2812\u0180art\u2477\u247A\u247Cr\xF2\u09C6\xF2\u0395ail;\u691Barr;\u690E\u0100;g\u0994\u248B;\u6A8Bar;\u6962\u0963\u24A5\0\u24AA\0\u24B1\0\0\0\0\0\u24B5\u24BA\0\u24C6\u24C8\u24CD\0\u24F9ute;\u413Amptyv;\u69B4ra\xEE\u084Cbda;\u43BBg\u0180;dl\u088E\u24C1\u24C3;\u6991\xE5\u088E;\u6A85uo\u803B\xAB\u40ABr\u0400;bfhlpst\u0899\u24DE\u24E6\u24E9\u24EB\u24EE\u24F1\u24F5\u0100;f\u089D\u24E3s;\u691Fs;\u691D\xEB\u2252p;\u61ABl;\u6939im;\u6973l;\u61A2\u0180;ae\u24FF\u2500\u2504\u6AABil;\u6919\u0100;s\u2509\u250A\u6AAD;\uC000\u2AAD\uFE00\u0180abr\u2515\u2519\u251Drr;\u690Crk;\u6772\u0100ak\u2522\u252Cc\u0100ek\u2528\u252A;\u407B;\u405B\u0100es\u2531\u2533;\u698Bl\u0100du\u2539\u253B;\u698F;\u698D\u0200aeuy\u2546\u254B\u2556\u2558ron;\u413E\u0100di\u2550\u2554il;\u413C\xEC\u08B0\xE2\u2529;\u443B\u0200cqrs\u2563\u2566\u256D\u257Da;\u6936uo\u0100;r\u0E19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694Bh;\u61B2\u0280;fgqs\u258B\u258C\u0989\u25F3\u25FF\u6264t\u0280ahlrt\u2598\u25A4\u25B7\u25C2\u25E8rrow\u0100;t\u0899\u25A1a\xE9\u24F6arpoon\u0100du\u25AF\u25B4own\xBB\u045Ap\xBB\u0966eftarrows;\u61C7ight\u0180ahs\u25CD\u25D6\u25DErrow\u0100;s\u08F4\u08A7arpoon\xF3\u0F98quigarro\xF7\u21F0hreetimes;\u62CB\u0180;qs\u258B\u0993\u25FAlan\xF4\u09AC\u0280;cdgs\u09AC\u260A\u260D\u261D\u2628c;\u6AA8ot\u0100;o\u2614\u2615\u6A7F\u0100;r\u261A\u261B\u6A81;\u6A83\u0100;e\u2622\u2625\uC000\u22DA\uFE00s;\u6A93\u0280adegs\u2633\u2639\u263D\u2649\u264Bppro\xF8\u24C6ot;\u62D6q\u0100gq\u2643\u2645\xF4\u0989gt\xF2\u248C\xF4\u099Bi\xED\u09B2\u0180ilr\u2655\u08E1\u265Asht;\u697C;\uC000\u{1D529}\u0100;E\u099C\u2663;\u6A91\u0161\u2669\u2676r\u0100du\u25B2\u266E\u0100;l\u0965\u2673;\u696Alk;\u6584cy;\u4459\u0280;acht\u0A48\u2688\u268B\u2691\u2696r\xF2\u25C1orne\xF2\u1D08ard;\u696Bri;\u65FA\u0100io\u269F\u26A4dot;\u4140ust\u0100;a\u26AC\u26AD\u63B0che\xBB\u26AD\u0200Eaes\u26BB\u26BD\u26C9\u26D4;\u6268p\u0100;p\u26C3\u26C4\u6A89rox\xBB\u26C4\u0100;q\u26CE\u26CF\u6A87\u0100;q\u26CE\u26BBim;\u62E6\u0400abnoptwz\u26E9\u26F4\u26F7\u271A\u272F\u2741\u2747\u2750\u0100nr\u26EE\u26F1g;\u67ECr;\u61FDr\xEB\u08C1g\u0180lmr\u26FF\u270D\u2714eft\u0100ar\u09E6\u2707ight\xE1\u09F2apsto;\u67FCight\xE1\u09FDparrow\u0100lr\u2725\u2729ef\xF4\u24EDight;\u61AC\u0180afl\u2736\u2739\u273Dr;\u6985;\uC000\u{1D55D}us;\u6A2Dimes;\u6A34\u0161\u274B\u274Fst;\u6217\xE1\u134E\u0180;ef\u2757\u2758\u1800\u65CAnge\xBB\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277C\u2785\u2787r\xF2\u08A8orne\xF2\u1D8Car\u0100;d\u0F98\u2783;\u696D;\u600Eri;\u62BF\u0300achiqt\u2798\u279D\u0A40\u27A2\u27AE\u27BBquo;\u6039r;\uC000\u{1D4C1}m\u0180;eg\u09B2\u27AA\u27AC;\u6A8D;\u6A8F\u0100bu\u252A\u27B3o\u0100;r\u0E1F\u27B9;\u601Arok;\u4142\u8400<;cdhilqr\u082B\u27D2\u2639\u27DC\u27E0\u27E5\u27EA\u27F0\u0100ci\u27D7\u27D9;\u6AA6r;\u6A79re\xE5\u25F2mes;\u62C9arr;\u6976uest;\u6A7B\u0100Pi\u27F5\u27F9ar;\u6996\u0180;ef\u2800\u092D\u181B\u65C3r\u0100du\u2807\u280Dshar;\u694Ahar;\u6966\u0100en\u2817\u2821rtneqq;\uC000\u2268\uFE00\xC5\u281E\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288E\u2893\u28A0\u28A5\u28A8\u28DA\u28E2\u28E4\u0A83\u28F3\u2902Dot;\u623A\u0200clpr\u284E\u2852\u2863\u287Dr\u803B\xAF\u40AF\u0100et\u2857\u2859;\u6642\u0100;e\u285E\u285F\u6720se\xBB\u285F\u0100;s\u103B\u2868to\u0200;dlu\u103B\u2873\u2877\u287Bow\xEE\u048Cef\xF4\u090F\xF0\u13D1ker;\u65AE\u0100oy\u2887\u288Cmma;\u6A29;\u443Cash;\u6014asuredangle\xBB\u1626r;\uC000\u{1D52A}o;\u6127\u0180cdn\u28AF\u28B4\u28C9ro\u803B\xB5\u40B5\u0200;acd\u1464\u28BD\u28C0\u28C4s\xF4\u16A7ir;\u6AF0ot\u80BB\xB7\u01B5us\u0180;bd\u28D2\u1903\u28D3\u6212\u0100;u\u1D3C\u28D8;\u6A2A\u0163\u28DE\u28E1p;\u6ADB\xF2\u2212\xF0\u0A81\u0100dp\u28E9\u28EEels;\u62A7f;\uC000\u{1D55E}\u0100ct\u28F8\u28FDr;\uC000\u{1D4C2}pos\xBB\u159D\u0180;lm\u2909\u290A\u290D\u43BCtimap;\u62B8\u0C00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297E\u2989\u2998\u29DA\u29E9\u2A15\u2A1A\u2A58\u2A5D\u2A83\u2A95\u2AA4\u2AA8\u2B04\u2B07\u2B44\u2B7F\u2BAE\u2C34\u2C67\u2C7C\u2CE9\u0100gt\u2947\u294B;\uC000\u22D9\u0338\u0100;v\u2950\u0BCF\uC000\u226B\u20D2\u0180elt\u295A\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61CDightarrow;\u61CE;\uC000\u22D8\u0338\u0100;v\u297B\u0C47\uC000\u226A\u20D2ightarrow;\u61CF\u0100Dd\u298E\u2993ash;\u62AFash;\u62AE\u0280bcnpt\u29A3\u29A7\u29AC\u29B1\u29CCla\xBB\u02DEute;\u4144g;\uC000\u2220\u20D2\u0280;Eiop\u0D84\u29BC\u29C0\u29C5\u29C8;\uC000\u2A70\u0338d;\uC000\u224B\u0338s;\u4149ro\xF8\u0D84ur\u0100;a\u29D3\u29D4\u666El\u0100;s\u29D3\u0B38\u01F3\u29DF\0\u29E3p\u80BB\xA0\u0B37mp\u0100;e\u0BF9\u0C00\u0280aeouy\u29F4\u29FE\u2A03\u2A10\u2A13\u01F0\u29F9\0\u29FB;\u6A43on;\u4148dil;\u4146ng\u0100;d\u0D7E\u2A0Aot;\uC000\u2A6D\u0338p;\u6A42;\u443Dash;\u6013\u0380;Aadqsx\u0B92\u2A29\u2A2D\u2A3B\u2A41\u2A45\u2A50rr;\u61D7r\u0100hr\u2A33\u2A36k;\u6924\u0100;o\u13F2\u13F0ot;\uC000\u2250\u0338ui\xF6\u0B63\u0100ei\u2A4A\u2A4Ear;\u6928\xED\u0B98ist\u0100;s\u0BA0\u0B9Fr;\uC000\u{1D52B}\u0200Eest\u0BC5\u2A66\u2A79\u2A7C\u0180;qs\u0BBC\u2A6D\u0BE1\u0180;qs\u0BBC\u0BC5\u2A74lan\xF4\u0BE2i\xED\u0BEA\u0100;r\u0BB6\u2A81\xBB\u0BB7\u0180Aap\u2A8A\u2A8D\u2A91r\xF2\u2971rr;\u61AEar;\u6AF2\u0180;sv\u0F8D\u2A9C\u0F8C\u0100;d\u2AA1\u2AA2\u62FC;\u62FAcy;\u445A\u0380AEadest\u2AB7\u2ABA\u2ABE\u2AC2\u2AC5\u2AF6\u2AF9r\xF2\u2966;\uC000\u2266\u0338rr;\u619Ar;\u6025\u0200;fqs\u0C3B\u2ACE\u2AE3\u2AEFt\u0100ar\u2AD4\u2AD9rro\xF7\u2AC1ightarro\xF7\u2A90\u0180;qs\u0C3B\u2ABA\u2AEAlan\xF4\u0C55\u0100;s\u0C55\u2AF4\xBB\u0C36i\xED\u0C5D\u0100;r\u0C35\u2AFEi\u0100;e\u0C1A\u0C25i\xE4\u0D90\u0100pt\u2B0C\u2B11f;\uC000\u{1D55F}\u8180\xAC;in\u2B19\u2B1A\u2B36\u40ACn\u0200;Edv\u0B89\u2B24\u2B28\u2B2E;\uC000\u22F9\u0338ot;\uC000\u22F5\u0338\u01E1\u0B89\u2B33\u2B35;\u62F7;\u62F6i\u0100;v\u0CB8\u2B3C\u01E1\u0CB8\u2B41\u2B43;\u62FE;\u62FD\u0180aor\u2B4B\u2B63\u2B69r\u0200;ast\u0B7B\u2B55\u2B5A\u2B5Flle\xEC\u0B7Bl;\uC000\u2AFD\u20E5;\uC000\u2202\u0338lint;\u6A14\u0180;ce\u0C92\u2B70\u2B73u\xE5\u0CA5\u0100;c\u0C98\u2B78\u0100;e\u0C92\u2B7D\xF1\u0C98\u0200Aait\u2B88\u2B8B\u2B9D\u2BA7r\xF2\u2988rr\u0180;cw\u2B94\u2B95\u2B99\u619B;\uC000\u2933\u0338;\uC000\u219D\u0338ghtarrow\xBB\u2B95ri\u0100;e\u0CCB\u0CD6\u0380chimpqu\u2BBD\u2BCD\u2BD9\u2B04\u0B78\u2BE4\u2BEF\u0200;cer\u0D32\u2BC6\u0D37\u2BC9u\xE5\u0D45;\uC000\u{1D4C3}ort\u026D\u2B05\0\0\u2BD6ar\xE1\u2B56m\u0100;e\u0D6E\u2BDF\u0100;q\u0D74\u0D73su\u0100bp\u2BEB\u2BED\xE5\u0CF8\xE5\u0D0B\u0180bcp\u2BF6\u2C11\u2C19\u0200;Ees\u2BFF\u2C00\u0D22\u2C04\u6284;\uC000\u2AC5\u0338et\u0100;e\u0D1B\u2C0Bq\u0100;q\u0D23\u2C00c\u0100;e\u0D32\u2C17\xF1\u0D38\u0200;Ees\u2C22\u2C23\u0D5F\u2C27\u6285;\uC000\u2AC6\u0338et\u0100;e\u0D58\u2C2Eq\u0100;q\u0D60\u2C23\u0200gilr\u2C3D\u2C3F\u2C45\u2C47\xEC\u0BD7lde\u803B\xF1\u40F1\xE7\u0C43iangle\u0100lr\u2C52\u2C5Ceft\u0100;e\u0C1A\u2C5A\xF1\u0C26ight\u0100;e\u0CCB\u2C65\xF1\u0CD7\u0100;m\u2C6C\u2C6D\u43BD\u0180;es\u2C74\u2C75\u2C79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2C8F\u2C94\u2C99\u2C9E\u2CA3\u2CB0\u2CB6\u2CD3\u2CE3ash;\u62ADarr;\u6904p;\uC000\u224D\u20D2ash;\u62AC\u0100et\u2CA8\u2CAC;\uC000\u2265\u20D2;\uC000>\u20D2nfin;\u69DE\u0180Aet\u2CBD\u2CC1\u2CC5rr;\u6902;\uC000\u2264\u20D2\u0100;r\u2CCA\u2CCD\uC000<\u20D2ie;\uC000\u22B4\u20D2\u0100At\u2CD8\u2CDCrr;\u6903rie;\uC000\u22B5\u20D2im;\uC000\u223C\u20D2\u0180Aan\u2CF0\u2CF4\u2D02rr;\u61D6r\u0100hr\u2CFA\u2CFDk;\u6923\u0100;o\u13E7\u13E5ear;\u6927\u1253\u1A95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2D2D\0\u2D38\u2D48\u2D60\u2D65\u2D72\u2D84\u1B07\0\0\u2D8D\u2DAB\0\u2DC8\u2DCE\0\u2DDC\u2E19\u2E2B\u2E3E\u2E43\u0100cs\u2D31\u1A97ute\u803B\xF3\u40F3\u0100iy\u2D3C\u2D45r\u0100;c\u1A9E\u2D42\u803B\xF4\u40F4;\u443E\u0280abios\u1AA0\u2D52\u2D57\u01C8\u2D5Alac;\u4151v;\u6A38old;\u69BClig;\u4153\u0100cr\u2D69\u2D6Dir;\u69BF;\uC000\u{1D52C}\u036F\u2D79\0\0\u2D7C\0\u2D82n;\u42DBave\u803B\xF2\u40F2;\u69C1\u0100bm\u2D88\u0DF4ar;\u69B5\u0200acit\u2D95\u2D98\u2DA5\u2DA8r\xF2\u1A80\u0100ir\u2D9D\u2DA0r;\u69BEoss;\u69BBn\xE5\u0E52;\u69C0\u0180aei\u2DB1\u2DB5\u2DB9cr;\u414Dga;\u43C9\u0180cdn\u2DC0\u2DC5\u01CDron;\u43BF;\u69B6pf;\uC000\u{1D560}\u0180ael\u2DD4\u2DD7\u01D2r;\u69B7rp;\u69B9\u0380;adiosv\u2DEA\u2DEB\u2DEE\u2E08\u2E0D\u2E10\u2E16\u6228r\xF2\u1A86\u0200;efm\u2DF7\u2DF8\u2E02\u2E05\u6A5Dr\u0100;o\u2DFE\u2DFF\u6134f\xBB\u2DFF\u803B\xAA\u40AA\u803B\xBA\u40BAgof;\u62B6r;\u6A56lope;\u6A57;\u6A5B\u0180clo\u2E1F\u2E21\u2E27\xF2\u2E01ash\u803B\xF8\u40F8l;\u6298i\u016C\u2E2F\u2E34de\u803B\xF5\u40F5es\u0100;a\u01DB\u2E3As;\u6A36ml\u803B\xF6\u40F6bar;\u633D\u0AE1\u2E5E\0\u2E7D\0\u2E80\u2E9D\0\u2EA2\u2EB9\0\0\u2ECB\u0E9C\0\u2F13\0\0\u2F2B\u2FBC\0\u2FC8r\u0200;ast\u0403\u2E67\u2E72\u0E85\u8100\xB6;l\u2E6D\u2E6E\u40B6le\xEC\u0403\u0269\u2E78\0\0\u2E7Bm;\u6AF3;\u6AFDy;\u443Fr\u0280cimpt\u2E8B\u2E8F\u2E93\u1865\u2E97nt;\u4025od;\u402Eil;\u6030enk;\u6031r;\uC000\u{1D52D}\u0180imo\u2EA8\u2EB0\u2EB4\u0100;v\u2EAD\u2EAE\u43C6;\u43D5ma\xF4\u0A76ne;\u660E\u0180;tv\u2EBF\u2EC0\u2EC8\u43C0chfork\xBB\u1FFD;\u43D6\u0100au\u2ECF\u2EDFn\u0100ck\u2ED5\u2EDDk\u0100;h\u21F4\u2EDB;\u610E\xF6\u21F4s\u0480;abcdemst\u2EF3\u2EF4\u1908\u2EF9\u2EFD\u2F04\u2F06\u2F0A\u2F0E\u402Bcir;\u6A23ir;\u6A22\u0100ou\u1D40\u2F02;\u6A25;\u6A72n\u80BB\xB1\u0E9Dim;\u6A26wo;\u6A27\u0180ipu\u2F19\u2F20\u2F25ntint;\u6A15f;\uC000\u{1D561}nd\u803B\xA3\u40A3\u0500;Eaceinosu\u0EC8\u2F3F\u2F41\u2F44\u2F47\u2F81\u2F89\u2F92\u2F7E\u2FB6;\u6AB3p;\u6AB7u\xE5\u0ED9\u0100;c\u0ECE\u2F4C\u0300;acens\u0EC8\u2F59\u2F5F\u2F66\u2F68\u2F7Eppro\xF8\u2F43urlye\xF1\u0ED9\xF1\u0ECE\u0180aes\u2F6F\u2F76\u2F7Approx;\u6AB9qq;\u6AB5im;\u62E8i\xED\u0EDFme\u0100;s\u2F88\u0EAE\u6032\u0180Eas\u2F78\u2F90\u2F7A\xF0\u2F75\u0180dfp\u0EEC\u2F99\u2FAF\u0180als\u2FA0\u2FA5\u2FAAlar;\u632Eine;\u6312urf;\u6313\u0100;t\u0EFB\u2FB4\xEF\u0EFBrel;\u62B0\u0100ci\u2FC0\u2FC5r;\uC000\u{1D4C5};\u43C8ncsp;\u6008\u0300fiopsu\u2FDA\u22E2\u2FDF\u2FE5\u2FEB\u2FF1r;\uC000\u{1D52E}pf;\uC000\u{1D562}rime;\u6057cr;\uC000\u{1D4C6}\u0180aeo\u2FF8\u3009\u3013t\u0100ei\u2FFE\u3005rnion\xF3\u06B0nt;\u6A16st\u0100;e\u3010\u3011\u403F\xF1\u1F19\xF4\u0F14\u0A80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30E0\u310E\u312B\u3147\u3162\u3172\u318E\u3206\u3215\u3224\u3229\u3258\u326E\u3272\u3290\u32B0\u32B7\u0180art\u3047\u304A\u304Cr\xF2\u10B3\xF2\u03DDail;\u691Car\xF2\u1C65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307F\u308F\u3094\u30CC\u0100eu\u306D\u3071;\uC000\u223D\u0331te;\u4155i\xE3\u116Emptyv;\u69B3g\u0200;del\u0FD1\u3089\u308B\u308D;\u6992;\u69A5\xE5\u0FD1uo\u803B\xBB\u40BBr\u0580;abcfhlpstw\u0FDC\u30AC\u30AF\u30B7\u30B9\u30BC\u30BE\u30C0\u30C3\u30C7\u30CAp;\u6975\u0100;f\u0FE0\u30B4s;\u6920;\u6933s;\u691E\xEB\u225D\xF0\u272El;\u6945im;\u6974l;\u61A3;\u619D\u0100ai\u30D1\u30D5il;\u691Ao\u0100;n\u30DB\u30DC\u6236al\xF3\u0F1E\u0180abr\u30E7\u30EA\u30EEr\xF2\u17E5rk;\u6773\u0100ak\u30F3\u30FDc\u0100ek\u30F9\u30FB;\u407D;\u405D\u0100es\u3102\u3104;\u698Cl\u0100du\u310A\u310C;\u698E;\u6990\u0200aeuy\u3117\u311C\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xEC\u0FF2\xE2\u30FA;\u4440\u0200clqs\u3134\u3137\u313D\u3144a;\u6937dhar;\u6969uo\u0100;r\u020E\u020Dh;\u61B3\u0180acg\u314E\u315F\u0F44l\u0200;ips\u0F78\u3158\u315B\u109Cn\xE5\u10BBar\xF4\u0FA9t;\u65AD\u0180ilr\u3169\u1023\u316Esht;\u697D;\uC000\u{1D52F}\u0100ao\u3177\u3186r\u0100du\u317D\u317F\xBB\u047B\u0100;l\u1091\u3184;\u696C\u0100;v\u318B\u318C\u43C1;\u43F1\u0180gns\u3195\u31F9\u31FCht\u0300ahlrst\u31A4\u31B0\u31C2\u31D8\u31E4\u31EErrow\u0100;t\u0FDC\u31ADa\xE9\u30C8arpoon\u0100du\u31BB\u31BFow\xEE\u317Ep\xBB\u1092eft\u0100ah\u31CA\u31D0rrow\xF3\u0FEAarpoon\xF3\u0551ightarrows;\u61C9quigarro\xF7\u30CBhreetimes;\u62CCg;\u42DAingdotse\xF1\u1F32\u0180ahm\u320D\u3210\u3213r\xF2\u0FEAa\xF2\u0551;\u600Foust\u0100;a\u321E\u321F\u63B1che\xBB\u321Fmid;\u6AEE\u0200abpt\u3232\u323D\u3240\u3252\u0100nr\u3237\u323Ag;\u67EDr;\u61FEr\xEB\u1003\u0180afl\u3247\u324A\u324Er;\u6986;\uC000\u{1D563}us;\u6A2Eimes;\u6A35\u0100ap\u325D\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6A12ar\xF2\u31E3\u0200achq\u327B\u3280\u10BC\u3285quo;\u603Ar;\uC000\u{1D4C7}\u0100bu\u30FB\u328Ao\u0100;r\u0214\u0213\u0180hir\u3297\u329B\u32A0re\xE5\u31F8mes;\u62CAi\u0200;efl\u32AA\u1059\u1821\u32AB\u65B9tri;\u69CEluhar;\u6968;\u611E\u0D61\u32D5\u32DB\u32DF\u332C\u3338\u3371\0\u337A\u33A4\0\0\u33EC\u33F0\0\u3428\u3448\u345A\u34AD\u34B1\u34CA\u34F1\0\u3616\0\0\u3633cute;\u415Bqu\xEF\u27BA\u0500;Eaceinpsy\u11ED\u32F3\u32F5\u32FF\u3302\u330B\u330F\u331F\u3326\u3329;\u6AB4\u01F0\u32FA\0\u32FC;\u6AB8on;\u4161u\xE5\u11FE\u0100;d\u11F3\u3307il;\u415Frc;\u415D\u0180Eas\u3316\u3318\u331B;\u6AB6p;\u6ABAim;\u62E9olint;\u6A13i\xED\u1204;\u4441ot\u0180;be\u3334\u1D47\u3335\u62C5;\u6A66\u0380Aacmstx\u3346\u334A\u3357\u335B\u335E\u3363\u336Drr;\u61D8r\u0100hr\u3350\u3352\xEB\u2228\u0100;o\u0A36\u0A34t\u803B\xA7\u40A7i;\u403Bwar;\u6929m\u0100in\u3369\xF0nu\xF3\xF1t;\u6736r\u0100;o\u3376\u2055\uC000\u{1D530}\u0200acoy\u3382\u3386\u3391\u33A0rp;\u666F\u0100hy\u338B\u338Fcy;\u4449;\u4448rt\u026D\u3399\0\0\u339Ci\xE4\u1464ara\xEC\u2E6F\u803B\xAD\u40AD\u0100gm\u33A8\u33B4ma\u0180;fv\u33B1\u33B2\u33B2\u43C3;\u43C2\u0400;deglnpr\u12AB\u33C5\u33C9\u33CE\u33D6\u33DE\u33E1\u33E6ot;\u6A6A\u0100;q\u12B1\u12B0\u0100;E\u33D3\u33D4\u6A9E;\u6AA0\u0100;E\u33DB\u33DC\u6A9D;\u6A9Fe;\u6246lus;\u6A24arr;\u6972ar\xF2\u113D\u0200aeit\u33F8\u3408\u340F\u3417\u0100ls\u33FD\u3404lsetm\xE9\u336Ahp;\u6A33parsl;\u69E4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341C\u341D\u6AAA\u0100;s\u3422\u3423\u6AAC;\uC000\u2AAC\uFE00\u0180flp\u342E\u3433\u3442tcy;\u444C\u0100;b\u3438\u3439\u402F\u0100;a\u343E\u343F\u69C4r;\u633Ff;\uC000\u{1D564}a\u0100dr\u344D\u0402es\u0100;u\u3454\u3455\u6660it\xBB\u3455\u0180csu\u3460\u3479\u349F\u0100au\u3465\u346Fp\u0100;s\u1188\u346B;\uC000\u2293\uFE00p\u0100;s\u11B4\u3475;\uC000\u2294\uFE00u\u0100bp\u347F\u348F\u0180;es\u1197\u119C\u3486et\u0100;e\u1197\u348D\xF1\u119D\u0180;es\u11A8\u11AD\u3496et\u0100;e\u11A8\u349D\xF1\u11AE\u0180;af\u117B\u34A6\u05B0r\u0165\u34AB\u05B1\xBB\u117Car\xF2\u1148\u0200cemt\u34B9\u34BE\u34C2\u34C5r;\uC000\u{1D4C8}tm\xEE\xF1i\xEC\u3415ar\xE6\u11BE\u0100ar\u34CE\u34D5r\u0100;f\u34D4\u17BF\u6606\u0100an\u34DA\u34EDight\u0100ep\u34E3\u34EApsilo\xEE\u1EE0h\xE9\u2EAFs\xBB\u2852\u0280bcmnp\u34FB\u355E\u1209\u358B\u358E\u0480;Edemnprs\u350E\u350F\u3511\u3515\u351E\u3523\u352C\u3531\u3536\u6282;\u6AC5ot;\u6ABD\u0100;d\u11DA\u351Aot;\u6AC3ult;\u6AC1\u0100Ee\u3528\u352A;\u6ACB;\u628Alus;\u6ABFarr;\u6979\u0180eiu\u353D\u3552\u3555t\u0180;en\u350E\u3545\u354Bq\u0100;q\u11DA\u350Feq\u0100;q\u352B\u3528m;\u6AC7\u0100bp\u355A\u355C;\u6AD5;\u6AD3c\u0300;acens\u11ED\u356C\u3572\u3579\u357B\u3326ppro\xF8\u32FAurlye\xF1\u11FE\xF1\u11F3\u0180aes\u3582\u3588\u331Bppro\xF8\u331Aq\xF1\u3317g;\u666A\u0680123;Edehlmnps\u35A9\u35AC\u35AF\u121C\u35B2\u35B4\u35C0\u35C9\u35D5\u35DA\u35DF\u35E8\u35ED\u803B\xB9\u40B9\u803B\xB2\u40B2\u803B\xB3\u40B3;\u6AC6\u0100os\u35B9\u35BCt;\u6ABEub;\u6AD8\u0100;d\u1222\u35C5ot;\u6AC4s\u0100ou\u35CF\u35D2l;\u67C9b;\u6AD7arr;\u697Bult;\u6AC2\u0100Ee\u35E4\u35E6;\u6ACC;\u628Blus;\u6AC0\u0180eiu\u35F4\u3609\u360Ct\u0180;en\u121C\u35FC\u3602q\u0100;q\u1222\u35B2eq\u0100;q\u35E7\u35E4m;\u6AC8\u0100bp\u3611\u3613;\u6AD4;\u6AD6\u0180Aan\u361C\u3620\u362Drr;\u61D9r\u0100hr\u3626\u3628\xEB\u222E\u0100;o\u0A2B\u0A29war;\u692Alig\u803B\xDF\u40DF\u0BE1\u3651\u365D\u3660\u12CE\u3673\u3679\0\u367E\u36C2\0\0\0\0\0\u36DB\u3703\0\u3709\u376C\0\0\0\u3787\u0272\u3656\0\0\u365Bget;\u6316;\u43C4r\xEB\u0E5F\u0180aey\u3666\u366B\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uC000\u{1D531}\u0200eiko\u3686\u369D\u36B5\u36BC\u01F2\u368B\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369B\u43B8ym;\u43D1\u0100cn\u36A2\u36B2k\u0100as\u36A8\u36AEppro\xF8\u12C1im\xBB\u12ACs\xF0\u129E\u0100as\u36BA\u36AE\xF0\u12C1rn\u803B\xFE\u40FE\u01EC\u031F\u36C6\u22E7es\u8180\xD7;bd\u36CF\u36D0\u36D8\u40D7\u0100;a\u190F\u36D5r;\u6A31;\u6A30\u0180eps\u36E1\u36E3\u3700\xE1\u2A4D\u0200;bcf\u0486\u36EC\u36F0\u36F4ot;\u6336ir;\u6AF1\u0100;o\u36F9\u36FC\uC000\u{1D565}rk;\u6ADA\xE1\u3362rime;\u6034\u0180aip\u370F\u3712\u3764d\xE5\u1248\u0380adempst\u3721\u374D\u3740\u3751\u3757\u375C\u375Fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65B5own\xBB\u1DBBeft\u0100;e\u2800\u373E\xF1\u092E;\u625Cight\u0100;e\u32AA\u374B\xF1\u105Aot;\u65ECinus;\u6A3Alus;\u6A39b;\u69CDime;\u6A3Bezium;\u63E2\u0180cht\u3772\u377D\u3781\u0100ry\u3777\u377B;\uC000\u{1D4C9};\u4446cy;\u445Brok;\u4167\u0100io\u378B\u378Ex\xF4\u1777head\u0100lr\u3797\u37A0eftarro\xF7\u084Fightarrow\xBB\u0F5D\u0900AHabcdfghlmoprstuw\u37D0\u37D3\u37D7\u37E4\u37F0\u37FC\u380E\u381C\u3823\u3834\u3851\u385D\u386B\u38A9\u38CC\u38D2\u38EA\u38F6r\xF2\u03EDar;\u6963\u0100cr\u37DC\u37E2ute\u803B\xFA\u40FA\xF2\u1150r\u01E3\u37EA\0\u37EDy;\u445Eve;\u416D\u0100iy\u37F5\u37FArc\u803B\xFB\u40FB;\u4443\u0180abh\u3803\u3806\u380Br\xF2\u13ADlac;\u4171a\xF2\u13C3\u0100ir\u3813\u3818sht;\u697E;\uC000\u{1D532}rave\u803B\xF9\u40F9\u0161\u3827\u3831r\u0100lr\u382C\u382E\xBB\u0957\xBB\u1083lk;\u6580\u0100ct\u3839\u384D\u026F\u383F\0\0\u384Arn\u0100;e\u3845\u3846\u631Cr\xBB\u3846op;\u630Fri;\u65F8\u0100al\u3856\u385Acr;\u416B\u80BB\xA8\u0349\u0100gp\u3862\u3866on;\u4173f;\uC000\u{1D566}\u0300adhlsu\u114B\u3878\u387D\u1372\u3891\u38A0own\xE1\u13B3arpoon\u0100lr\u3888\u388Cef\xF4\u382Digh\xF4\u382Fi\u0180;hl\u3899\u389A\u389C\u43C5\xBB\u13FAon\xBB\u389Aparrows;\u61C8\u0180cit\u38B0\u38C4\u38C8\u026F\u38B6\0\0\u38C1rn\u0100;e\u38BC\u38BD\u631Dr\xBB\u38BDop;\u630Eng;\u416Fri;\u65F9cr;\uC000\u{1D4CA}\u0180dir\u38D9\u38DD\u38E2ot;\u62F0lde;\u4169i\u0100;f\u3730\u38E8\xBB\u1813\u0100am\u38EF\u38F2r\xF2\u38A8l\u803B\xFC\u40FCangle;\u69A7\u0780ABDacdeflnoprsz\u391C\u391F\u3929\u392D\u39B5\u39B8\u39BD\u39DF\u39E4\u39E8\u39F3\u39F9\u39FD\u3A01\u3A20r\xF2\u03F7ar\u0100;v\u3926\u3927\u6AE8;\u6AE9as\xE8\u03E1\u0100nr\u3932\u3937grt;\u699C\u0380eknprst\u34E3\u3946\u394B\u3952\u395D\u3964\u3996app\xE1\u2415othin\xE7\u1E96\u0180hir\u34EB\u2EC8\u3959op\xF4\u2FB5\u0100;h\u13B7\u3962\xEF\u318D\u0100iu\u3969\u396Dgm\xE1\u33B3\u0100bp\u3972\u3984setneq\u0100;q\u397D\u3980\uC000\u228A\uFE00;\uC000\u2ACB\uFE00setneq\u0100;q\u398F\u3992\uC000\u228B\uFE00;\uC000\u2ACC\uFE00\u0100hr\u399B\u399Fet\xE1\u369Ciangle\u0100lr\u39AA\u39AFeft\xBB\u0925ight\xBB\u1051y;\u4432ash\xBB\u1036\u0180elr\u39C4\u39D2\u39D7\u0180;be\u2DEA\u39CB\u39CFar;\u62BBq;\u625Alip;\u62EE\u0100bt\u39DC\u1468a\xF2\u1469r;\uC000\u{1D533}tr\xE9\u39AEsu\u0100bp\u39EF\u39F1\xBB\u0D1C\xBB\u0D59pf;\uC000\u{1D567}ro\xF0\u0EFBtr\xE9\u39B4\u0100cu\u3A06\u3A0Br;\uC000\u{1D4CB}\u0100bp\u3A10\u3A18n\u0100Ee\u3980\u3A16\xBB\u397En\u0100Ee\u3992\u3A1E\xBB\u3990igzag;\u699A\u0380cefoprs\u3A36\u3A3B\u3A56\u3A5B\u3A54\u3A61\u3A6Airc;\u4175\u0100di\u3A40\u3A51\u0100bg\u3A45\u3A49ar;\u6A5Fe\u0100;q\u15FA\u3A4F;\u6259erp;\u6118r;\uC000\u{1D534}pf;\uC000\u{1D568}\u0100;e\u1479\u3A66at\xE8\u1479cr;\uC000\u{1D4CC}\u0AE3\u178E\u3A87\0\u3A8B\0\u3A90\u3A9B\0\0\u3A9D\u3AA8\u3AAB\u3AAF\0\0\u3AC3\u3ACE\0\u3AD8\u17DC\u17DFtr\xE9\u17D1r;\uC000\u{1D535}\u0100Aa\u3A94\u3A97r\xF2\u03C3r\xF2\u09F6;\u43BE\u0100Aa\u3AA1\u3AA4r\xF2\u03B8r\xF2\u09EBa\xF0\u2713is;\u62FB\u0180dpt\u17A4\u3AB5\u3ABE\u0100fl\u3ABA\u17A9;\uC000\u{1D569}im\xE5\u17B2\u0100Aa\u3AC7\u3ACAr\xF2\u03CEr\xF2\u0A01\u0100cq\u3AD2\u17B8r;\uC000\u{1D4CD}\u0100pt\u17D6\u3ADCr\xE9\u17D4\u0400acefiosu\u3AF0\u3AFD\u3B08\u3B0C\u3B11\u3B15\u3B1B\u3B21c\u0100uy\u3AF6\u3AFBte\u803B\xFD\u40FD;\u444F\u0100iy\u3B02\u3B06rc;\u4177;\u444Bn\u803B\xA5\u40A5r;\uC000\u{1D536}cy;\u4457pf;\uC000\u{1D56A}cr;\uC000\u{1D4CE}\u0100cm\u3B26\u3B29y;\u444El\u803B\xFF\u40FF\u0500acdefhiosw\u3B42\u3B48\u3B54\u3B58\u3B64\u3B69\u3B6D\u3B74\u3B7A\u3B80cute;\u417A\u0100ay\u3B4D\u3B52ron;\u417E;\u4437ot;\u417C\u0100et\u3B5D\u3B61tr\xE6\u155Fa;\u43B6r;\uC000\u{1D537}cy;\u4436grarr;\u61DDpf;\uC000\u{1D56B}cr;\uC000\u{1D4CF}\u0100jn\u3B85\u3B87;\u600Dj;\u600C'.split("").map(C=>C.charCodeAt(0)));var Yt,M0=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),Jt=(Yt=String.fromCodePoint)!==null&&Yt!==void 0?Yt:function(C){let I="";return C>65535&&(C-=65536,I+=String.fromCharCode(C>>>10&1023|55296),C=56320|C&1023),I+=String.fromCharCode(C),I};function vt(C){var I;return C>=55296&&C<=57343||C>1114111?65533:(I=M0.get(C))!==null&&I!==void 0?I:C}var Yg;(function(C){C[C.NUM=35]="NUM",C[C.SEMI=59]="SEMI",C[C.EQUALS=61]="EQUALS",C[C.ZERO=48]="ZERO",C[C.NINE=57]="NINE",C[C.LOWER_A=97]="LOWER_A",C[C.LOWER_F=102]="LOWER_F",C[C.LOWER_X=120]="LOWER_X",C[C.LOWER_Z=122]="LOWER_Z",C[C.UPPER_A=65]="UPPER_A",C[C.UPPER_F=70]="UPPER_F",C[C.UPPER_Z=90]="UPPER_Z"})(Yg||(Yg={}));var P0=32,eF;(function(C){C[C.VALUE_LENGTH=49152]="VALUE_LENGTH",C[C.BRANCH_LENGTH=16256]="BRANCH_LENGTH",C[C.JUMP_TABLE=127]="JUMP_TABLE"})(eF||(eF={}));function kt(C){return C>=Yg.ZERO&&C<=Yg.NINE}function j0(C){return C>=Yg.UPPER_A&&C<=Yg.UPPER_F||C>=Yg.LOWER_A&&C<=Yg.LOWER_F}function O0(C){return C>=Yg.UPPER_A&&C<=Yg.UPPER_Z||C>=Yg.LOWER_A&&C<=Yg.LOWER_Z||kt(C)}function _0(C){return C===Yg.EQUALS||O0(C)}var Hg;(function(C){C[C.EntityStart=0]="EntityStart",C[C.NumericStart=1]="NumericStart",C[C.NumericDecimal=2]="NumericDecimal",C[C.NumericHex=3]="NumericHex",C[C.NamedEntity=4]="NamedEntity"})(Hg||(Hg={}));var OC;(function(C){C[C.Legacy=0]="Legacy",C[C.Strict=1]="Strict",C[C.Attribute=2]="Attribute"})(OC||(OC={}));var ol=class{constructor(I,g,B){this.decodeTree=I,this.emitCodePoint=g,this.errors=B,this.state=Hg.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=OC.Strict}startEntity(I){this.decodeMode=I,this.state=Hg.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(I,g){switch(this.state){case Hg.EntityStart:return I.charCodeAt(g)===Yg.NUM?(this.state=Hg.NumericStart,this.consumed+=1,this.stateNumericStart(I,g+1)):(this.state=Hg.NamedEntity,this.stateNamedEntity(I,g));case Hg.NumericStart:return this.stateNumericStart(I,g);case Hg.NumericDecimal:return this.stateNumericDecimal(I,g);case Hg.NumericHex:return this.stateNumericHex(I,g);case Hg.NamedEntity:return this.stateNamedEntity(I,g)}}stateNumericStart(I,g){return g>=I.length?-1:(I.charCodeAt(g)|P0)===Yg.LOWER_X?(this.state=Hg.NumericHex,this.consumed+=1,this.stateNumericHex(I,g+1)):(this.state=Hg.NumericDecimal,this.stateNumericDecimal(I,g))}addToNumericResult(I,g,B,F){if(g!==B){let Q=B-g;this.result=this.result*Math.pow(F,Q)+Number.parseInt(I.substr(g,Q),F),this.consumed+=Q}}stateNumericHex(I,g){let B=g;for(;g>14;for(;g>14,Q!==0){if(A===Yg.SEMI)return this.emitNamedEntityData(this.treeIndex,Q,this.consumed+this.excess);this.decodeMode!==OC.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var I;let{result:g,decodeTree:B}=this,F=(B[g]&eF.VALUE_LENGTH)>>14;return this.emitNamedEntityData(g,F,this.consumed),(I=this.errors)===null||I===void 0||I.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(I,g,B){let{decodeTree:F}=this;return this.emitCodePoint(g===1?F[I]&~eF.VALUE_LENGTH:F[I+1],B),g===3&&this.emitCodePoint(F[I+2],B),B}end(){var I;switch(this.state){case Hg.NamedEntity:return this.result!==0&&(this.decodeMode!==OC.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case Hg.NumericDecimal:return this.emitNumericEntity(0,2);case Hg.NumericHex:return this.emitNumericEntity(0,3);case Hg.NumericStart:return(I=this.errors)===null||I===void 0||I.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case Hg.EntityStart:return 0}}};function q0(C){let I="",g=new ol(C,B=>I+=Jt(B));return function(F,Q){let A=0,U=0;for(;(U=F.indexOf("&",U))>=0;){I+=F.slice(A,U),g.startEntity(Q);let s=g.write(F,U+1);if(s<0){A=U+g.end();break}A=U+s,U=s===0?A+1:A}let l=I+F.slice(A);return I="",l}}function $0(C,I,g,B){let F=(I&eF.BRANCH_LENGTH)>>7,Q=I&eF.JUMP_TABLE;if(F===0)return Q!==0&&B===Q?g:-1;if(Q){let l=B-Q;return l<0||l>=F?-1:C[g+l]-1}let A=g,U=A+F-1;for(;A<=U;){let l=A+U>>>1,s=C[l];if(sB)U=l-1;else return C[l+F]}return-1}var IZ=q0(Ht);function HQ(C,I=OC.Legacy){return IZ(C,I)}var gZ=String.prototype.codePointAt==null?(C,I)=>(C.charCodeAt(I)&64512)===55296?(C.charCodeAt(I)-55296)*1024+C.charCodeAt(I+1)-56320+65536:C.charCodeAt(I):(C,I)=>C.codePointAt(I);var mi;(function(C){C[C.XML=0]="XML",C[C.HTML=1]="HTML"})(mi||(mi={}));var hi;(function(C){C[C.UTF8=0]="UTF8",C[C.ASCII=1]="ASCII",C[C.Extensive=2]="Extensive",C[C.Attribute=3]="Attribute",C[C.Text=4]="Text"})(hi||(hi={}));var yi=require("obsidian");function rA(C,I=!0,g=0,B="div",F=null,Q){return C.type==="comment"?lt(C,Q,I):C.postprocess(I,g,B,F,Q)}async function yl(C,I,g){let B=null,F=null,Q=null,A=HQ(C.innerHTML,OC.Strict),U=g.default_preview_mode;if(I){if(sg.app.workspace.activeLeaf?.view instanceof yi.MarkdownView){let x=sg.app.workspace.activeLeaf.view;x.previewMode.docId===I.docId&&(U=x.editor.cm.state.field(Mg))}let e=I.getSectionInfo(C);if(e){let x=uA(e.text),a=[...e.text.matchAll(/\n/g)].map(n=>n.index);if(F=e.lineStart?a[e.lineStart-1]+1:0,Q=a[e.lineEnd]??e.text.length,B=x.filter(n=>n.partially_in_range(F,Q)),!B.length)return;if(B.length===1){let n=B[0],h=!1,m=null;if(n.type==="substitution"?n.part_encloses_range(F,Q,!0)&&(h=!0,m=!0)||n.part_encloses_range(F,Q,!1)&&(h=!0,m=!1):h=n.encloses_range(F,Q),h){n.type==="substitution"&&(A=A.replace(/~>/g,""));let L=F===n.from;if(Q===n.to){let y=A.lastIndexOf(eg[n.type].at(-1));A=A.substring(0,y)+A.substring(y+3)}if(L){let y=A.indexOf(eg[n.type][0]);A=A.substring(0,y)+A.substring(y+3)}let o=rA(n,!1,U,"div",m,A);o instanceof HTMLElement?(C.innerHTML="",C.appendChild(o)):C.innerHTML=o;return}}}}A=A.replaceAll(/{|{<\/del>/g,"{~~").replaceAll(/}|<\/del>}/g,"~~}").replaceAll(/{|{<\/mark>/g,"{==").replaceAll(/}|<\/mark>}/g,"==}").replaceAll(/{==}|{=<\/mark>=}/g,"{====}");let l=uA(A);for(let e=0;eB[0].from,d=Q",b.push(e));C.innerHTML=Z,C.querySelectorAll("placeholder").forEach((e,x)=>{e.replaceWith(b[x])})}var UZ=require("@codemirror/state"),Tt=require("obsidian");function wt(C){for(let I of C.workspace.getLeavesOfType("markdown"))if(I.view instanceof Tt.MarkdownView){for(let g of I.view.previewMode.renderer.sections.filter(B=>B.el.querySelector(".cmtr-preview")))g.rendered=!1,g.html="";I.view.previewMode.renderer.queueRender()}}function Sl(C){for(let I of C.workspace.getLeavesOfType("markdown"))I.view instanceof Tt.MarkdownView&&I.view.previewMode.rerender(!0)}var El=require("obsidian");var Wl=class{constructor(I,g=!1){this.plugin=I;this.setRendering(g)}button=null;index=0;metadata_settings_toggles=[{icon:"lucide-user",text:"Author",attribute:"author"},{icon:"lucide-calendar",text:"Time",attribute:"timestamp"},{icon:"lucide-check",text:"Completed",attribute:"completed"},{icon:"brush",text:"Style",attribute:"style"},{icon:"paintbrush",text:"Color",attribute:"color"}];showMenu(I){GF();let g=new El.Menu;g.addItem(B=>{B.setTitle("Add metadata"),B.setIcon("tags"),B.setChecked(this.plugin.settings.add_metadata),B.onClick(async()=>{await this.plugin.setSetting("add_metadata",!this.plugin.settings.add_metadata),B.setChecked(this.plugin.settings.add_metadata),g.items.slice(1).forEach(F=>{F.setDisabled(!this.plugin.settings.add_metadata)})})});for(let{icon:B,text:F,attribute:Q}of this.metadata_settings_toggles){let A=`add_${Q}_metadata`;g.addItem(U=>{U.setTitle(F),U.setIcon(B),U.setChecked(this.plugin.settings[A]),U.setDisabled(!this.plugin.settings.add_metadata),U.onClick(async()=>{await this.plugin.setSetting(A,!this.plugin.settings[A]),U.checkIconEl?U.checkIconEl.style.display=this.plugin.settings[A]?"flex":"none":U.setChecked(this.plugin.settings[A])}),U.dom.addClass("cmtr-submenu-nested")})}g.showAtMouseEvent(I)}setRendering(I){I===void 0||I===!!this.button||(I?this.renderButton():this.detachButton())}renderButton(){this.button=this.plugin.addStatusBarItem();let I=this.button.createSpan({cls:"status-bar-item-icon"});(0,El.setIcon)(I,"tags"),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label","Metadata"),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",g=>this.showMenu(g)),this.button.addEventListener("contextmenu",g=>this.showMenu(g))}detachButton(){this.button&&(this.button.detach(),this.button=null)}};var wF=require("obsidian"),pA=class{constructor(I,g,B,F,Q=!1){this.states=I;this.onchange=g;this.getvalue=B;this.plugin=F;this.setRendering(Q),this.plugin.app.workspace.onLayoutReady(()=>this.currentView=this.plugin.app.workspace.activeEditor)}button=null;value=0;changeEvent=null;currentView=null;showMenu(I){let g=new wF.Menu;for(let[B,F]of this.states.entries())g.addItem(Q=>{Q.setTitle(F.text),Q.setIcon(F.icon),Q.setChecked(B===this.value),Q.onClick(()=>this.onchange(this.currentView,B))});g.showAtMouseEvent(I),I.preventDefault()}setRendering(I){I===void 0||I===!!this.button||(I?this.renderButton():this.detachButton())}updateButton(I){if(!this.button||I===void 0)return;this.value=I;let{icon:g,text:B}=this.states[I];(0,wF.setIcon)(this.button,g),this.button.setAttribute("aria-label",B)}renderButton(){let{icon:I,text:g}=this.states[this.value];this.changeEvent=this.plugin.app.workspace.on("active-leaf-change",F=>{F&&F.view instanceof wF.MarkdownView?(this.currentView=F.view,this.updateButton(this.getvalue(F.view.editor)),this.button.style.display=""):(this.currentView=null,this.button.style.display="none")}),this.button=this.plugin.addStatusBarItem();let B=this.button.createSpan({cls:"status-bar-item-icon"});(0,wF.setIcon)(B,I),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label",g),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",F=>this.showMenu(F)),this.button.addEventListener("contextmenu",F=>this.showMenu(F))}detachButton(){this.button&&(this.button.detach(),this.button=null,this.plugin.app.workspace.offref(this.changeEvent))}};var Si=(C,I)=>new pA([{icon:"message-square",text:"Showing all suggestions"},{icon:"check",text:'Previewing "accept all"'},{icon:"cross",text:'Previewing "reject all"'}],C.setPreviewMode.bind(C),g=>g.cm.state.facet(Mg),C,I),Wi=(C,I)=>new pA([{icon:"pencil",text:"Editing (Regular)"},{icon:"edit",text:"Editing (Corrected)"},{icon:"file-edit",text:"Suggesting"}],C.setEditMode.bind(C),g=>g.cm.state.facet(nC),C,I),Ei=(C,I)=>new Wl(C,I);var VF=require("obsidian"),HA=class{constructor(I,g,B,F,Q,A,U=!1){this.states=I;this.has_label=g;this.cls=B;this.onchange=F;this.getvalue=Q;this.plugin=A;this.setRendering(U)}active_mapping=new WeakMap;changeEvent=null;setRendering(I){I===void 0||I===!!this.changeEvent||(I?this.attachButtons():this.detachButtons())}setLabelRendering(I){if(!(I===void 0||!this.changeEvent||I===this.has_label)){this.has_label=I;for(let g of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(g.view instanceof VF.MarkdownView))continue;let{view:B}=g,{text:F}=this.states[this.getvalue(B)],Q=this.active_mapping.get(B);if(Q)if(Q.status)Q.status.detach(),Q.status=null;else{let A=Q.button.createSpan({text:F,cls:this.cls});Q.button.parentElement.insertBefore(A,Q.button),Q.status=A}}}}updateButton(I,g){let B=this.active_mapping.get(I);if(B)if(this.states[g]){let{tooltip:F,text:Q}=this.states[g];(0,VF.setIcon)(B.button,this.states[(g+1)%this.states.length].icon),B.button.setAttribute("aria-label",F),B.button.style.display="",this.has_label&&(B.status.innerText=Q)}else B.button.style.display="none"}attachButtons(){this.changeEvent||(this.changeEvent=this.plugin.app.workspace.on("layout-change",this.attachButtons.bind(this)));for(let I of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(I.view instanceof VF.MarkdownView))continue;let{view:g}=I;if(this.active_mapping.has(g))continue;let B=I.on("history-change",()=>{this.updateButton(g,this.getvalue(g))}),F=this.getvalue(g);if(F===void 0)return;let{tooltip:Q,text:A}=this.states[F],U=g.addAction(this.states[(F+1)%this.states.length].icon,Q,async()=>{let s=(this.getvalue(g)+1)%this.states.length;this.onchange(g,s)}),l=this.has_label?U.createSpan({text:A,cls:this.cls}):null;this.has_label&&U.parentElement.insertBefore(l,U),U.oncontextmenu=s=>{let G=new VF.Menu,t=this.getvalue(g);for(let[c,{icon:d,text:b}]of this.states.entries())G.addItem(Z=>{Z.setIcon(d).setTitle(b).setChecked(c===t).onClick(()=>{this.onchange(g,c)})});G.showAtMouseEvent(s)},this.active_mapping.set(g,{button:U,status:l,event:B})}}detachButton(I){let g=I.view,B=this.active_mapping.get(g);B&&(I.offref(B.event),B.button.detach(),B.status?.detach(),this.active_mapping.delete(g))}detachButtons(){if(this.changeEvent){for(let I of this.plugin.app.workspace.getLeavesOfType("markdown"))I.view instanceof VF.MarkdownView&&this.detachButton(I);this.plugin.app.workspace.offref(this.changeEvent),this.changeEvent=null}}};var Ni=(C,I)=>new HA([{icon:"message-square",tooltip:`Current mode: show all suggestions +"use strict";var am=Object.create;var Na=Object.defineProperty;var lm=Object.getOwnPropertyDescriptor;var um=Object.getOwnPropertyNames;var hm=Object.getPrototypeOf,cm=Object.prototype.hasOwnProperty;var La=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),fm=(i,t)=>{for(var e in t)Na(i,e,{get:t[e],enumerable:!0})},pf=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of um(t))!cm.call(i,r)&&r!==e&&Na(i,r,{get:()=>t[r],enumerable:!(n=lm(t,r))||n.enumerable});return i};var Ba=(i,t,e)=>(e=i!=null?am(hm(i)):{},pf(t||!i||!i.__esModule?Na(e,"default",{value:i,enumerable:!0}):e,i)),dm=i=>pf(Na({},"__esModule",{value:!0}),i);var Od=La((Kk,Fs)=>{var X=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},re=-1,le=1,$t=0;X.Diff=function(i,t){return[i,t]};X.prototype.diff_main=function(i,t,e,n){typeof n>"u"&&(this.Diff_Timeout<=0?n=Number.MAX_VALUE:n=new Date().getTime()+this.Diff_Timeout*1e3);var r=n;if(i==null||t==null)throw new Error("Null input. (diff_main)");if(i==t)return i?[new X.Diff($t,i)]:[];typeof e>"u"&&(e=!0);var s=e,o=this.diff_commonPrefix(i,t),a=i.substring(0,o);i=i.substring(o),t=t.substring(o),o=this.diff_commonSuffix(i,t);var l=i.substring(i.length-o);i=i.substring(0,i.length-o),t=t.substring(0,t.length-o);var u=this.diff_compute_(i,t,s,r);return a&&u.unshift(new X.Diff($t,a)),l&&u.push(new X.Diff($t,l)),this.diff_cleanupMerge(u),u};X.prototype.diff_compute_=function(i,t,e,n){var r;if(!i)return[new X.Diff(le,t)];if(!t)return[new X.Diff(re,i)];var s=i.length>t.length?i:t,o=i.length>t.length?t:i,a=s.indexOf(o);if(a!=-1)return r=[new X.Diff(le,s.substring(0,a)),new X.Diff($t,o),new X.Diff(le,s.substring(a+o.length))],i.length>t.length&&(r[0][0]=r[2][0]=re),r;if(o.length==1)return[new X.Diff(re,i),new X.Diff(le,t)];var l=this.diff_halfMatch_(i,t);if(l){var u=l[0],f=l[1],h=l[2],c=l[3],p=l[4],g=this.diff_main(u,h,e,n),m=this.diff_main(f,c,e,n);return g.concat([new X.Diff($t,p)],m)}return e&&i.length>100&&t.length>100?this.diff_lineMode_(i,t,n):this.diff_bisect_(i,t,n)};X.prototype.diff_lineMode_=function(i,t,e){var n=this.diff_linesToChars_(i,t);i=n.chars1,t=n.chars2;var r=n.lineArray,s=this.diff_main(i,t,!1,e);this.diff_charsToLines_(s,r),this.diff_cleanupSemantic(s),s.push(new X.Diff($t,""));for(var o=0,a=0,l=0,u="",f="";o=1&&l>=1){s.splice(o-a-l,a+l),o=o-a-l;for(var h=this.diff_main(u,f,!1,e),c=h.length-1;c>=0;c--)s.splice(o,0,h[c]);o=o+h.length}l=0,a=0,u="",f="";break}o++}return s.pop(),s};X.prototype.diff_bisect_=function(i,t,e){for(var n=i.length,r=t.length,s=Math.ceil((n+r)/2),o=s,a=2*s,l=new Array(a),u=new Array(a),f=0;fe);_++){for(var S=-_+p;S<=_-g;S+=2){var k=o+S,E;S==-_||S!=_&&l[k-1]n)g+=2;else if(M>r)p+=2;else if(c){var w=o+h-S;if(w>=0&&w=x)return this.diff_bisectSplit_(i,t,E,M,e)}}}for(var A=-_+m;A<=_-v;A+=2){var w=o+A,x;A==-_||A!=_&&u[w-1]n)v+=2;else if(D>r)m+=2;else if(!c){var k=o+h-A;if(k>=0&&k=x)return this.diff_bisectSplit_(i,t,E,M,e)}}}}return[new X.Diff(re,i),new X.Diff(le,t)]};X.prototype.diff_bisectSplit_=function(i,t,e,n,r){var s=i.substring(0,e),o=t.substring(0,n),a=i.substring(e),l=t.substring(n),u=this.diff_main(s,o,!1,r),f=this.diff_main(a,l,!1,r);return u.concat(f)};X.prototype.diff_linesToChars_=function(i,t){var e=[],n={};e[0]="";function r(l){for(var u="",f=0,h=-1,c=e.length;hn?i=i.substring(e-n):et.length?i:t,n=i.length>t.length?t:i;if(e.length<4||n.length*2=g.length?[E,M,w,x,k]:null}var o=s(e,n,Math.ceil(e.length/4)),a=s(e,n,Math.ceil(e.length/2)),l;if(!o&&!a)return null;a?o?l=o[4].length>a[4].length?o:a:l=a:l=o;var u,f,h,c;i.length>t.length?(u=l[0],f=l[1],h=l[2],c=l[3]):(h=l[0],c=l[1],u=l[2],f=l[3]);var p=l[4];return[u,f,h,c,p]};X.prototype.diff_cleanupSemantic=function(i){for(var t=!1,e=[],n=0,r=null,s=0,o=0,a=0,l=0,u=0;s0?e[n-1]:-1,o=0,a=0,l=0,u=0,r=null,t=!0)),s++;for(t&&this.diff_cleanupMerge(i),this.diff_cleanupSemanticLossless(i),s=1;s=p?(c>=f.length/2||c>=h.length/2)&&(i.splice(s,0,new X.Diff($t,h.substring(0,c))),i[s-1][1]=f.substring(0,f.length-c),i[s+1][1]=h.substring(c),s++):(p>=f.length/2||p>=h.length/2)&&(i.splice(s,0,new X.Diff($t,f.substring(0,p))),i[s-1][0]=le,i[s-1][1]=h.substring(0,h.length-p),i[s+1][0]=re,i[s+1][1]=f.substring(p),s++),s++}s++}};X.prototype.diff_cleanupSemanticLossless=function(i){function t(p,g){if(!p||!g)return 6;var m=p.charAt(p.length-1),v=g.charAt(0),_=m.match(X.nonAlphaNumericRegex_),S=v.match(X.nonAlphaNumericRegex_),k=_&&m.match(X.whitespaceRegex_),E=S&&v.match(X.whitespaceRegex_),M=k&&m.match(X.linebreakRegex_),w=E&&v.match(X.linebreakRegex_),x=M&&p.match(X.blanklineEndRegex_),A=w&&g.match(X.blanklineStartRegex_);return x||A?5:M||w?4:_&&!k&&E?3:k||E?2:_||S?1:0}for(var e=1;e=h&&(h=c,l=n,u=r,f=s)}i[e-1][1]!=l&&(l?i[e-1][1]=l:(i.splice(e-1,1),e--),i[e][1]=u,f?i[e+1][1]=f:(i.splice(e+1,1),e--))}e++}};X.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;X.whitespaceRegex_=/\s/;X.linebreakRegex_=/[\r\n]/;X.blanklineEndRegex_=/\n\r?\n$/;X.blanklineStartRegex_=/^\r?\n\r?\n/;X.prototype.diff_cleanupEfficiency=function(i){for(var t=!1,e=[],n=0,r=null,s=0,o=!1,a=!1,l=!1,u=!1;s0?e[n-1]:-1,l=u=!1),t=!0)),s++;t&&this.diff_cleanupMerge(i)};X.prototype.diff_cleanupMerge=function(i){i.push(new X.Diff($t,""));for(var t=0,e=0,n=0,r="",s="",o;t1?(e!==0&&n!==0&&(o=this.diff_commonPrefix(s,r),o!==0&&(t-e-n>0&&i[t-e-n-1][0]==$t?i[t-e-n-1][1]+=s.substring(0,o):(i.splice(0,0,new X.Diff($t,s.substring(0,o))),t++),s=s.substring(o),r=r.substring(o)),o=this.diff_commonSuffix(s,r),o!==0&&(i[t][1]=s.substring(s.length-o)+i[t][1],s=s.substring(0,s.length-o),r=r.substring(0,r.length-o))),t-=e+n,i.splice(t,e+n),r.length&&(i.splice(t,0,new X.Diff(re,r)),t++),s.length&&(i.splice(t,0,new X.Diff(le,s)),t++),t++):t!==0&&i[t-1][0]==$t?(i[t-1][1]+=i[t][1],i.splice(t,1)):t++,n=0,e=0,r="",s="";break}i[i.length-1][1]===""&&i.pop();var a=!1;for(t=1;tt));o++)r=e,s=n;return i.length!=o&&i[o][0]===re?s:s+(t-r)};X.prototype.diff_prettyHtml=function(i){for(var t=[],e=/&/g,n=//g,s=/\n/g,o=0;o");switch(a){case le:t[o]=''+u+"";break;case re:t[o]=''+u+"";break;case $t:t[o]=""+u+"";break}}return t.join("")};X.prototype.diff_text1=function(i){for(var t=[],e=0;ethis.Match_MaxBits)throw new Error("Pattern too long for this browser.");var n=this.match_alphabet_(t),r=this;function s(E,M){var w=E/t.length,x=Math.abs(e-M);return r.Match_Distance?w+x/r.Match_Distance:x?1:w}var o=this.Match_Threshold,a=i.indexOf(t,e);a!=-1&&(o=Math.min(s(0,a),o),a=i.lastIndexOf(t,e+t.length),a!=-1&&(o=Math.min(s(0,a),o)));var l=1<=g;_--){var S=n[i.charAt(_-1)];if(p===0?v[_]=(v[_+1]<<1|1)&S:v[_]=(v[_+1]<<1|1)&S|((c[_+1]|c[_])<<1|1)|c[_+1],v[_]&l){var k=s(p,_-1);if(k<=o)if(o=k,a=_-1,a>e)g=Math.max(1,2*e-a);else break}}if(s(p+1,e)>o)break;c=v}return a};X.prototype.match_alphabet_=function(i){for(var t={},e=0;e"u")n=i,r=this.diff_main(n,t,!0),r.length>2&&(this.diff_cleanupSemantic(r),this.diff_cleanupEfficiency(r));else if(i&&typeof i=="object"&&typeof t>"u"&&typeof e>"u")r=i,n=this.diff_text1(r);else if(typeof i=="string"&&t&&typeof t=="object"&&typeof e>"u")n=i,r=t;else if(typeof i=="string"&&typeof t=="string"&&e&&typeof e=="object")n=i,r=e;else throw new Error("Unknown call format to patch_make.");if(r.length===0)return[];for(var s=[],o=new X.patch_obj,a=0,l=0,u=0,f=n,h=n,c=0;c=2*this.Patch_Margin&&a&&(this.patch_addContext_(o,f),s.push(o),o=new X.patch_obj,a=0,f=h,l=u);break}p!==le&&(l+=g.length),p!==re&&(u+=g.length)}return a&&(this.patch_addContext_(o,f),s.push(o)),s};X.prototype.patch_deepCopy=function(i){for(var t=[],e=0;ethis.Match_MaxBits?(l=this.match_main(t,a.substring(0,this.Match_MaxBits),o),l!=-1&&(u=this.match_main(t,a.substring(a.length-this.Match_MaxBits),o+a.length-this.Match_MaxBits),(u==-1||l>=u)&&(l=-1))):l=this.match_main(t,a,o),l==-1)r[s]=!1,n-=i[s].length2-i[s].length1;else{r[s]=!0,n=l-o;var f;if(u==-1?f=t.substring(l,l+a.length):f=t.substring(l,u+this.Match_MaxBits),a==f)t=t.substring(0,l)+this.diff_text2(i[s].diffs)+t.substring(l+a.length);else{var h=this.diff_main(a,f,!1);if(a.length>this.Match_MaxBits&&this.diff_levenshtein(h)/a.length>this.Patch_DeleteThreshold)r[s]=!1;else{this.diff_cleanupSemanticLossless(h);for(var c=0,p,g=0;gs[0][1].length){var o=t-s[0][1].length;s[0][1]=e.substring(s[0][1].length)+s[0][1],r.start1-=o,r.start2-=o,r.length1+=o,r.length2+=o}if(r=i[i.length-1],s=r.diffs,s.length==0||s[s.length-1][0]!=$t)s.push(new X.Diff($t,e)),r.length1+=t,r.length2+=t;else if(t>s[s.length-1][1].length){var o=t-s[s.length-1][1].length;s[s.length-1][1]+=e.substring(0,o),r.length1+=o,r.length2+=o}return e};X.prototype.patch_splitMax=function(i){for(var t=this.Match_MaxBits,e=0;e2*t?(a.length1+=f.length,r+=f.length,l=!1,a.diffs.push(new X.Diff(u,f)),n.diffs.shift()):(f=f.substring(0,t-a.length1-this.Patch_Margin),a.length1+=f.length,r+=f.length,u===$t?(a.length2+=f.length,s+=f.length):l=!1,a.diffs.push(new X.Diff(u,f)),f==n.diffs[0][1]?n.diffs.shift():n.diffs[0][1]=n.diffs[0][1].substring(f.length))}o=this.diff_text2(a.diffs),o=o.substring(o.length-this.Patch_Margin);var h=this.diff_text1(n.diffs).substring(0,this.Patch_Margin);h!==""&&(a.length1+=h.length,a.length2+=h.length,a.diffs.length!==0&&a.diffs[a.diffs.length-1][0]===$t?a.diffs[a.diffs.length-1][1]+=h:a.diffs.push(new X.Diff($t,h))),l||i.splice(++e,0,a)}}};X.prototype.patch_toText=function(i){for(var t=[],e=0;e{(function(i){if(typeof Dd=="object"&&typeof Gh<"u")Gh.exports=i();else if(typeof define=="function"&&define.amd)define([],i);else{var t;typeof window<"u"?t=window:typeof global<"u"?t=global:typeof self<"u"?t=self:t=this,t.localforage=i()}})(function(){var i,t,e;return function n(r,s,o){function a(f,h){if(!s[f]){if(!r[f]){var c=typeof require=="function"&&require;if(!h&&c)return c(f,!0);if(l)return l(f,!0);var p=new Error("Cannot find module '"+f+"'");throw p.code="MODULE_NOT_FOUND",p}var g=s[f]={exports:{}};r[f][0].call(g.exports,function(m){var v=r[f][1][m];return a(v||m)},g,g.exports,n,r,s,o)}return s[f].exports}for(var l=typeof require=="function"&&require,u=0;u"u"&&n(3);var c=Promise;function p(b,T){T&&b.then(function(y){T(null,y)},function(y){T(y)})}function g(b,T,y){typeof T=="function"&&b.then(T),typeof y=="function"&&b.catch(y)}function m(b){return typeof b!="string"&&(b=String(b)),b}function v(){if(arguments.length&&typeof arguments[arguments.length-1]=="function")return arguments[arguments.length-1]}var _="local-forage-detect-blob-support",S=void 0,k={},E=Object.prototype.toString,M="readonly",w="readwrite";function x(b){for(var T=b.length,y=new ArrayBuffer(T),O=new Uint8Array(y),$=0;$=43)}}).catch(function(){return!1})}function D(b){return typeof S=="boolean"?c.resolve(S):A(b).then(function(T){return S=T,S})}function N(b){var T=k[b.name],y={};y.promise=new c(function(O,$){y.resolve=O,y.reject=$}),T.deferredOperations.push(y),T.dbReady?T.dbReady=T.dbReady.then(function(){return y.promise}):T.dbReady=y.promise}function I(b){var T=k[b.name],y=T.deferredOperations.pop();if(y)return y.resolve(),y.promise}function R(b,T){var y=k[b.name],O=y.deferredOperations.pop();if(O)return O.reject(T),O.promise}function z(b,T){return new c(function(y,O){if(k[b.name]=k[b.name]||qt(),b.db)if(T)N(b),b.db.close();else return y(b.db);var $=[b.name];T&&$.push(b.version);var C=u.open.apply(u,$);T&&(C.onupgradeneeded=function(H){var j=C.result;try{j.createObjectStore(b.storeName),H.oldVersion<=1&&j.createObjectStore(_)}catch(K){if(K.name!=="ConstraintError")throw K}}),C.onerror=function(H){H.preventDefault(),O(C.error)},C.onsuccess=function(){var H=C.result;H.onversionchange=function(j){j.target.close()},y(H),I(b)}})}function U(b){return z(b,!1)}function tt(b){return z(b,!0)}function rt(b,T){if(!b.db)return!0;var y=!b.db.objectStoreNames.contains(b.storeName),O=b.versionb.db.version;if(O&&(b.version,b.version=b.db.version),$||y){if(y){var C=b.db.version+1;C>b.version&&(b.version=C)}return!0}return!1}function At(b){return new c(function(T,y){var O=new FileReader;O.onerror=y,O.onloadend=function($){var C=btoa($.target.result||"");T({__local_forage_encoded_blob:!0,data:C,type:b.type})},O.readAsBinaryString(b)})}function St(b){var T=x(atob(b.data));return h([T],{type:b.type})}function mt(b){return b&&b.__local_forage_encoded_blob}function Dt(b){var T=this,y=T._initReady().then(function(){var O=k[T._dbInfo.name];if(O&&O.dbReady)return O.dbReady});return g(y,b,b),y}function Bt(b){N(b);for(var T=k[b.name],y=T.forages,O=0;O0&&(!b.db||C.name==="InvalidStateError"||C.name==="NotFoundError"))return c.resolve().then(function(){if(!b.db||C.name==="NotFoundError"&&!b.db.objectStoreNames.contains(b.storeName)&&b.version<=b.db.version)return b.db&&(b.version=b.db.version+1),tt(b)}).then(function(){return Bt(b).then(function(){wt(b,T,y,O-1)})}).catch(y);y(C)}}function qt(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function ee(b){var T=this,y={db:null};if(b)for(var O in b)y[O]=b[O];var $=k[y.name];$||($=qt(),k[y.name]=$),$.forages.push(T),T._initReady||(T._initReady=T.ready,T.ready=Dt);var C=[];function H(){return c.resolve()}for(var j=0;j<$.forages.length;j++){var K=$.forages[j];K!==T&&C.push(K._initReady().catch(H))}var Y=$.forages.slice(0);return c.all(C).then(function(){return y.db=$.db,U(y)}).then(function(Z){return y.db=Z,rt(y,T._defaultConfig.version)?tt(y):Z}).then(function(Z){y.db=$.db=Z,T._dbInfo=y;for(var ht=0;ht>4,Z[$++]=(H&15)<<4|j>>2,Z[$++]=(j&3)<<6|K&63;return Y}function He(b){var T=new Uint8Array(b),y="",O;for(O=0;O>2],y+=vt[(T[O]&3)<<4|T[O+1]>>4],y+=vt[(T[O+1]&15)<<2|T[O+2]>>6],y+=vt[T[O+2]&63];return T.length%3===2?y=y.substring(0,y.length-1)+"=":T.length%3===1&&(y=y.substring(0,y.length-2)+"=="),y}function ve(b,T){var y="";if(b&&(y=ye.call(b)),b&&(y==="[object ArrayBuffer]"||b.buffer&&ye.call(b.buffer)==="[object ArrayBuffer]")){var O,$=Yt;b instanceof ArrayBuffer?(O=b,$+=pe):(O=b.buffer,y==="[object Int8Array]"?$+=dt:y==="[object Uint8Array]"?$+=ot:y==="[object Uint8ClampedArray]"?$+=Ft:y==="[object Int16Array]"?$+=ae:y==="[object Uint16Array]"?$+=mi:y==="[object Int32Array]"?$+=gi:y==="[object Uint32Array]"?$+=Ae:y==="[object Float32Array]"?$+=vi:y==="[object Float64Array]"?$+=bi:T(new Error("Failed to get type for BinaryArray"))),T($+He(O))}else if(y==="[object Blob]"){var C=new FileReader;C.onload=function(){var H=Ut+b.type+"~"+He(this.result);T(Yt+Q+H)},C.readAsArrayBuffer(b)}else try{T(JSON.stringify(b))}catch(H){T(null,H)}}function Qe(b){if(b.substring(0,Lt)!==Yt)return JSON.parse(b);var T=b.substring(Be),y=b.substring(Lt,Be),O;if(y===Q&&oe.test(T)){var $=T.match(oe);O=$[1],T=T.substring($[0].length)}var C=Fe(T);switch(y){case pe:return C;case Q:return h([C],{type:O});case dt:return new Int8Array(C);case ot:return new Uint8Array(C);case Ft:return new Uint8ClampedArray(C);case ae:return new Int16Array(C);case mi:return new Uint16Array(C);case gi:return new Int32Array(C);case Ae:return new Uint32Array(C);case vi:return new Float32Array(C);case bi:return new Float64Array(C);default:throw new Error("Unkown type: "+y)}}var _i={serialize:ve,deserialize:Qe,stringToBuffer:Fe,bufferToString:He};function kn(b,T,y,O){b.executeSql("CREATE TABLE IF NOT EXISTS "+T.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],y,O)}function Oi(b){var T=this,y={db:null};if(b)for(var O in b)y[O]=typeof b[O]!="string"?b[O].toString():b[O];var $=new c(function(C,H){try{y.db=openDatabase(y.name,String(y.version),y.description,y.size)}catch(j){return H(j)}y.db.transaction(function(j){kn(j,y,function(){T._dbInfo=y,C()},function(K,Y){H(Y)})},H)});return y.serializer=_i,$}function xe(b,T,y,O,$,C){b.executeSql(y,O,$,function(H,j){j.code===j.SYNTAX_ERR?H.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[T.storeName],function(K,Y){Y.rows.length?C(K,j):kn(K,T,function(){K.executeSql(y,O,$,C)},C)},C):C(H,j)},C)}function Pr(b,T){var y=this;b=m(b);var O=new c(function($,C){y.ready().then(function(){var H=y._dbInfo;H.db.transaction(function(j){xe(j,H,"SELECT * FROM "+H.storeName+" WHERE key = ? LIMIT 1",[b],function(K,Y){var Z=Y.rows.length?Y.rows.item(0).value:null;Z&&(Z=H.serializer.deserialize(Z)),$(Z)},function(K,Y){C(Y)})})}).catch(C)});return p(O,T),O}function on(b,T){var y=this,O=new c(function($,C){y.ready().then(function(){var H=y._dbInfo;H.db.transaction(function(j){xe(j,H,"SELECT * FROM "+H.storeName,[],function(K,Y){for(var Z=Y.rows,ht=Z.length,Ht=0;Ht0){H(Nr.apply($,[b,K,y,O-1]));return}j(Ht)}})})}).catch(j)});return p(C,y),C}function ps(b,T,y){return Nr.apply(this,[b,T,y,1])}function fo(b,T){var y=this;b=m(b);var O=new c(function($,C){y.ready().then(function(){var H=y._dbInfo;H.db.transaction(function(j){xe(j,H,"DELETE FROM "+H.storeName+" WHERE key = ?",[b],function(){$()},function(K,Y){C(Y)})})}).catch(C)});return p(O,T),O}function Oa(b){var T=this,y=new c(function(O,$){T.ready().then(function(){var C=T._dbInfo;C.db.transaction(function(H){xe(H,C,"DELETE FROM "+C.storeName,[],function(){O()},function(j,K){$(K)})})}).catch($)});return p(y,b),y}function po(b){var T=this,y=new c(function(O,$){T.ready().then(function(){var C=T._dbInfo;C.db.transaction(function(H){xe(H,C,"SELECT COUNT(key) as c FROM "+C.storeName,[],function(j,K){var Y=K.rows.item(0).c;O(Y)},function(j,K){$(K)})})}).catch($)});return p(y,b),y}function Da(b,T){var y=this,O=new c(function($,C){y.ready().then(function(){var H=y._dbInfo;H.db.transaction(function(j){xe(j,H,"SELECT key FROM "+H.storeName+" WHERE id = ? LIMIT 1",[b+1],function(K,Y){var Z=Y.rows.length?Y.rows.item(0).key:null;$(Z)},function(K,Y){C(Y)})})}).catch(C)});return p(O,T),O}function gs(b){var T=this,y=new c(function(O,$){T.ready().then(function(){var C=T._dbInfo;C.db.transaction(function(H){xe(H,C,"SELECT key FROM "+C.storeName,[],function(j,K){for(var Y=[],Z=0;Z '__WebKitDatabaseInfoTable__'",[],function($,C){for(var H=[],j=0;j0}function vs(b){var T=this,y={};if(b)for(var O in b)y[O]=b[O];return y.keyPrefix=Ra(b,T._defaultConfig),Ia()?(T._dbInfo=y,y.serializer=_i,c.resolve()):c.reject()}function Pa(b){var T=this,y=T.ready().then(function(){for(var O=T._dbInfo.keyPrefix,$=localStorage.length-1;$>=0;$--){var C=localStorage.key($);C.indexOf(O)===0&&localStorage.removeItem(C)}});return p(y,b),y}function Pu(b,T){var y=this;b=m(b);var O=y.ready().then(function(){var $=y._dbInfo,C=localStorage.getItem($.keyPrefix+b);return C&&(C=$.serializer.deserialize(C)),C});return p(O,T),O}function Nu(b,T){var y=this,O=y.ready().then(function(){for(var $=y._dbInfo,C=$.keyPrefix,H=C.length,j=localStorage.length,K=1,Y=0;Y=0;H--){var j=localStorage.key(H);j.indexOf(C)===0&&localStorage.removeItem(j)}}):$=c.reject("Invalid arguments"),p($,T),$}var wi={_driver:"localStorageWrapper",_initStorage:vs,_support:Iu(),iterate:Nu,getItem:Pu,setItem:be,removeItem:gt,clear:Pa,length:et,key:Lu,keys:Bu,dropInstance:Ve},Di=function(T,y){return T===y||typeof T=="number"&&typeof y=="number"&&isNaN(T)&&isNaN(y)},ge=function(T,y){for(var O=T.length,$=0;$"u"?"undefined":o(y))==="object"){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var O in y){if(O==="storeName"&&(y[O]=y[O].replace(/\W/g,"_")),O==="version"&&typeof y[O]!="number")return new Error("Database version must be a number.");this._config[O]=y[O]}return"driver"in y&&y.driver?this.setDriver(this._config.driver):!0}else return typeof y=="string"?this._config[y]:this._config},b.prototype.defineDriver=function(y,O,$){var C=new c(function(H,j){try{var K=y._driver,Y=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!y._driver){j(Y);return}for(var Z=Nn.concat("_initStorage"),ht=0,Ht=Z.length;ht{(function(i,t){typeof Pl=="object"&&typeof $d<"u"?t(Pl,Il()):typeof define=="function"&&define.amd?define(["exports","localforage"],t):t(i.localforageSetItems=i.localforageSetItems||{},i.localforage)})(Pl,function(i,t){"use strict";t="default"in t?t.default:t;function e(h){return e.result?e.result:!h||typeof h.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(e.result=h.getSerializer(),e.result)}function n(h,c){c&&h.then(function(p){c(null,p)},function(p){c(p)})}function r(h,c,p,g){function m(M,w){var x=M||w;return(!M||typeof M!="function")&&typeof x=="string"&&(M=function(D){return D[x]}),M}var v=[];if(Object.prototype.toString.call(h)==="[object Array]"){c=m(c,"key"),p=m(p,"value");for(var _=0,S=h.length;_{(function(i,t){typeof Nl=="object"&&typeof Id<"u"?t(Nl,Il()):typeof define=="function"&&define.amd?define(["exports","localforage"],t):t(i.localforageGetItems=i.localforageGetItems||{},i.localforage)})(Nl,function(i,t){"use strict";t="default"in t?t.default:t;function e(g){return e.result?e.result:!g||typeof g.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(e.result=g.getSerializer(),e.result)}function n(g,m){return m&&g.then(function(v){m(null,v)},function(v){m(v)}),g}function r(g,m){var v=this,_=v.getItem(g).then(function(S){return{key:g,value:S}});return n(_,m),_}function s(g){var m=this,v=new Promise(function(_,S){for(var k=[],E=0,M=g.length;Ek?1:0}var _=new Promise(function(S,k){m.ready().then(function(){var E=m._dbInfo,M=E.db.transaction(E.storeName,"readonly").objectStore(E.storeName),w=g.sort(v),x=l.bound(g[0],g[g.length-1],!1,!1),A;if("getAll"in M)A=M.getAll(x),A.onsuccess=function(){var I=A.result;I===void 0&&(I=null),S(I)};else{A=M.openCursor(x);var D={},N=0;A.onsuccess=function(){var I=A.result;if(!I){S(D);return}for(var R=I.key;R>w[N];)if(N++,N===w.length){S(D);return}if(R===w[N]){var z=I.value;z===void 0&&(z=null),D[R]=z,I.continue()}else I.continue(w[N])}}A.onerror=function(){k(A.error)}}).catch(k)});return _}function f(g){var m=this,v=new Promise(function(_,S){m.ready().then(function(){return e(m)}).then(function(k){var E=m._dbInfo;E.db.transaction(function(M){for(var w=new Array(g.length),x=0,A=g.length;xDu});module.exports=dm(Kb);var xn=require("obsidian"),co=require("@codemirror/state"),nm=require("@codemirror/view");var he=(s=>(s.ADDITION="addition",s.DELETION="deletion",s.SUBSTITUTION="substitution",s.HIGHLIGHT="highlight",s.COMMENT="comment",s))(he||{}),gf={Addition:"addition",Deletion:"deletion",Substitution:"substitution",Highlight:"highlight",Comment:"comment"};var me={addition:["{++","++}"],deletion:["{--","--}"],substitution:["{~~","~>","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]},mf={"{++":["++}"],"{--":["--}"],"{~~":["~>","~~}"],"{==":["==}"],"{>>":["<<}"]},vf={addition:"plus-circle",deletion:"minus-square",substitution:"replace",highlight:"highlighter",comment:"message-square"};var Fa={a:"author",t:"time",d:"done",s:"style",c:"color"},ji=class{constructor(t,e,n,r,s,o){this.from=t;this.to=e;this.type=n;this.repr=r;this.text=s;this.metadata=o;if(o!==void 0){let a=o-t,l=s.slice(3,a);this.text=s.slice(0,3)+s.slice(a+2);try{this.fields=JSON.parse(l);for(let u in this.fields)u in Fa&&(this.fields[Fa[u]]=this.fields[u],delete this.fields[u])}catch{this.fields={}}}}fields={};replies=[];get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(t=>t.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(t,e){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(t){return t in Fa&&(t=Fa[t]),t in this.fields&&(delete this.fields[t],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(t,e){return this.fields[t]=e,this.set_metadata(this.fields)}set_metadata(t){return this.fields=t,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(t)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(t)+"@@"}]}has_comment(t){return this.thread.includes(t)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(t){return this.type===t.type&&this.from===t.from&&this.to===t.to&&this.replies.length===t.replies.length&&this.full_text===t.full_text}left_adjacent(t){return this.from===t.to}right_adjacent(t){return this.to===t.from}part_is_empty(t){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(t=!1){return t?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(t,e){return t-=this.range_front,e-=this.range_front,e<=0||t===e?"":this.text.slice(Math.max(3,t),Math.min(this.text.length-3,e))}partially_in_range(t,e){return!(t>this.to||ethis.full_range_back||ee:this.from<=t&&this.to>=e}part_encloses_range(t,e,n){return this.encloses_range(t,e)}accept(t=!0){return this.text}reject(t=!0){return this.text}touches(t){return this.from===t||this.to===t}cursor_inside(t){return this.from<=t&&t<=this.to}cursor_before_range(t){return tthis.to}cursor_move_inside(t,e=!1){return Math.min(Math.max(e&&this.metadata?this.metadata+2:this.from+3,t),this.to-3)}cursor_pass_syntax(t,e,n=!1){return e?(this.touches_left_bracket(t,!0,!1,n)&&(t=n&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(t,!1,!0)&&(t=this.to)):(this.touches_right_bracket(t,!0,!1)&&(t=this.to-3),this.touches_left_bracket(t,!1,!0,n)&&(t=this.from)),t}cursor_move_through(t,e,n){return n=="unchanged"||!this.cursor_inside(t)||(n=="ignore_completely"?t=e?this.to:this.from:t=this.cursor_pass_syntax(t,e,n=="ignore_metadata")),t}touches_left_bracket(t,e=!1,n=!1,r=!1){return t+(e?0:1)>=this.from&&t+(n?0:1)<=(r&&this.metadata?this.metadata+2:this.from+3)}touches_separator(t,e=!1,n=!1){return!1}touches_right_bracket(t,e=!1,n=!1){return t-(n?0:1)>=this.to-3&&t-(e?0:1)<=this.to}touches_bracket(t,e,n=!1,r=!1){return e?this.touches_left_bracket(t,n,r):this.touches_right_bracket(t,n,r)}postprocess(t=!0,e=0,n="div",r=null,s){let o=s??this.text;return!s&&t&&(this.to>=o.length&&!o.endsWith(me[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap()),`<${n} class='cmtr-${this.repr.toLowerCase()}'>${o}`}apply_offset(t){this.from+=t,this.to+=t,this.metadata!==void 0&&(this.metadata+=t)}split_range(t){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var Fr=class extends ji{constructor(t,e,n,r){super(t,e,"addition","Addition",n,r)}accept(){return this.unwrap()}reject(){return""}postprocess(t=!0,e=0,n="div",r=null,s){let o=s??this.text;!s&&t&&(this.to>=o.length&&!o.endsWith(me[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let a="cmtr-preview";return e===0?a+=" cmtr-addition":e===2&&(o=""),`<${n} class='${a}'>${o}`}};var bs=class extends ji{reply_depth=0;attached_comment=null;get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}accept(t=!0){return t?"":this.unwrap()}reject(t=!0){return t?"":this.unwrap()}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(t){this.attach_to_range(t.type==="comment"?t.base_range:t)}attach_to_range(t){t.replies.push(this),this.reply_depth=t.replies.length-(t.type==="comment"?0:1),this.attached_comment=t}constructor(t,e,n,r){super(t,e,"comment","Comment",n,r)}};var _s=class extends ji{constructor(t,e,n,r){super(t,e,"deletion","Deletion",n,r)}accept(){return""}reject(){return this.unwrap()}postprocess(t=!0,e=0,n="div",r=null,s){let o=s??this.text;!s&&t&&(this.to>=o.length&&!o.endsWith(me[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let a="cmtr-preview";return e===0?a+=" cmtr-deletion":e===1&&(o=""),`<${n} class='${a}'>${o}`}};var ws=class extends ji{constructor(t,e,n,r){super(t,e,"highlight","Highlight",n,r)}};var Sn=class extends ji{constructor(e,n,r,s,o){super(e,r,"substitution","Substitution",s,o);this.middle=n}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(e,n){return n<=this.middle+2?"deletion":e>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(e,n){return e-=this.range_front,n-=this.range_front,e=Math.max(0,e),n<=0?this.unwrap_parts():n<=this.char_middle?[this.text.slice(3,e)+this.text.slice(n,this.char_middle),this.text.slice(this.char_middle+2,-3)]:e>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,e)+this.text.slice(n,-3)]:[this.text.slice(3,e),this.text.slice(n,-3)]}unwrap_parts_bracket(e,n=0){return e?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(e,n){return e-=this.range_front,n-=this.range_front,n<=0||e===n?"":e>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,e),Math.min(this.text.length-3,n)):n<=this.char_middle?this.text.slice(Math.max(3,e),Math.min(this.char_middle,n)):this.text.slice(Math.max(3,e),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,n))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(e,n=!1,r=!1){return e+(n?1:0)>=this.middle&&e-(r?0:1)<=this.middle+2}contains_separator(e,n){return e<=this.middle+2&&n>=this.middle}contains_part(e,n,r=!0){return r?nthis.middle+2?!1:void 0:n<=this.middle?!0:e>=this.middle+2?!1:void 0}cursor_pass_syntax(e,n,r=!1){return n?(this.touches_left_bracket(e,!0,!1,r)&&(e=r&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(e,!1,!0)&&(e=this.middle+2),this.touches_right_bracket(e,!1,!0)&&(e=this.to)):(this.touches_right_bracket(e,!0,!1)&&(e=this.to-3),this.touches_separator(e,!1,!0)&&(e=this.middle),this.touches_left_bracket(e,!1,!0,r)&&(e=this.from)),e}part_encloses_range(e,n,r){return r?this.from<=e&&n<=this.middle+2:this.middle<=e&&n<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(e){return e?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(e=!0,n=0,r="div",s=null,o){let a=o??this.text,l=[a];!o&&e&&(this.to>=a.length&&!a.endsWith(me.substitution[2])?l=this.unwrap_parts_bracket(!0):this.from<=0&&!a.startsWith(me.substitution[0])?l=this.unwrap_parts_bracket(!1):l=this.unwrap_parts());let u="cmtr-preview";return l.length===1&&(l[+s]=l[0],l[+!s]=""),a="",n===0?(l[0].length&&(a+=`<${r} class='${u} cmtr-deletion'>${l[0]}`),l[1].length&&(a+=`<${r} class='${u} cmtr-addition'>${l[1]}`)):n===1?l[1].length&&(a+=`<${r} class='${u}'>${l[1]}`):l[0].length&&(a+=`<${r} class='${u}'>${l[0]}`),a}apply_offset(e){this.from+=e,this.middle+=e,this.to+=e,this.metadata!==void 0&&(this.metadata+=e)}split_range(e){let n=super.split_range(e);return e<=this.middle?n[0]=me.substitution[1]+n[0]:n[1]=n[1]+me.substitution[1],n}cursor_move_inside(e,n=!1){return e=super.cursor_move_inside(e,n),e==this.middle+1&&(e=this.middle+2),e}};var A_=require("@codemirror/state");var pm=class Vu{constructor(t,e){this.low=t,this.high=e}clone(){return new Vu(this.low,this.high)}get max(){return this.clone()}less_than(t){return this.lowt.high?this.high:t.high)}output(){return[this.low,this.high]}static comparable_max(t,e){return t.merge(e)}static comparable_less_than(t,e){return tl&&([a,l]=[l,a]),this.item.key=new pm(a,l)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===te}_value_less_than(t){return this.item.value&&t.item.value&&this.item.value.less_than?this.item.value.less_than(t.item.value):this.item.valuet++),t}get keys(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.key.output?e.item.key.output():e.item.key)),t}get values(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.value)),t}get items(){let t=[];return this.tree_walk(this.root,e=>t.push({key:e.item.key.output?e.item.key.output():e.item.key,value:e.item.value})),t}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(t,e=t){if(t===void 0)return;let n=new Fn(t,e,this.nil_node,this.nil_node,null,Ge);return this.tree_insert(n),this.recalc_max(n),n}exist(t,e=t){let n=new Fn(t,e);return!!this.tree_search(this.root,n)}remove(t,e=t){let n=new Fn(t,e),r=this.tree_search(this.root,n);return r&&this.tree_delete(r),r}search(t,e=(n,r)=>n===r?r.output():n){let n=new Fn(t),r=[];return this.tree_search_interval(this.root,n,r),r.map(s=>e(s.item.value,s.item.key))}intersect_any(t){let e=new Fn(t);return this.tree_find_any_interval(this.root,e)}forEach(t){this.tree_walk(this.root,e=>t(e.item.key,e.item.value))}map(t){let e=new i;return this.tree_walk(this.root,n=>e.insert(n.item.key,t(n.item.value,n.item.key))),e}*iterate(t,e=(n,r)=>n===r?r.output():n){let n;for(t?n=this.tree_search_nearest_forward(this.root,new Fn(t)):this.root&&(n=this.local_minimum(this.root));n;)yield e(n.item.value,n.item.key),n=this.tree_successor(n)}recalc_max(t){let e=t;for(;e.parent!=null;)e.parent.update_max(),e=e.parent}tree_insert(t){let e=this.root,n=null;if(this.root==null||this.root===this.nil_node)this.root=t;else{for(;e!==this.nil_node;)n=e,t.less_than(e)?e=e.left:e=e.right;t.parent=n,t.less_than(n)?n.left=t:n.right=t}this.insert_fixup(t)}insert_fixup(t){let e,n;for(e=t;e!==this.root&&e.parent.color===Ge;)e.parent===e.parent.parent.left?(n=e.parent.parent.right,n.color===Ge?(e.parent.color=te,n.color=te,e.parent.parent.color=Ge,e=e.parent.parent):(e===e.parent.right&&(e=e.parent,this.rotate_left(e)),e.parent.color=te,e.parent.parent.color=Ge,this.rotate_right(e.parent.parent))):(n=e.parent.parent.left,n.color===Ge?(e.parent.color=te,n.color=te,e.parent.parent.color=Ge,e=e.parent.parent):(e===e.parent.left&&(e=e.parent,this.rotate_right(e)),e.parent.color=te,e.parent.parent.color=Ge,this.rotate_left(e.parent.parent)));this.root.color=te}tree_delete(t){let e,n;t.left===this.nil_node||t.right===this.nil_node?e=t:e=this.tree_successor(t),e.left!==this.nil_node?n=e.left:n=e.right,n.parent=e.parent,e===this.root?this.root=n:(e===e.parent.left?e.parent.left=n:e.parent.right=n,e.parent.update_max()),this.recalc_max(n),e!==t&&(t.copy_data(e),t.update_max(),this.recalc_max(t)),e.color===te&&this.delete_fixup(n)}delete_fixup(t){let e=t,n;for(;e!==this.root&&e.parent!=null&&e.color===te;)e===e.parent.left?(n=e.parent.right,n.color===Ge&&(n.color=te,e.parent.color=Ge,this.rotate_left(e.parent),n=e.parent.right),n.left.color===te&&n.right.color===te?(n.color=Ge,e=e.parent):(n.right.color===te&&(n.color=Ge,n.left.color=te,this.rotate_right(n),n=e.parent.right),n.color=e.parent.color,e.parent.color=te,n.right.color=te,this.rotate_left(e.parent),e=this.root)):(n=e.parent.left,n.color===Ge&&(n.color=te,e.parent.color=Ge,this.rotate_right(e.parent),n=e.parent.left),n.left.color===te&&n.right.color===te?(n.color=Ge,e=e.parent):(n.left.color===te&&(n.color=Ge,n.right.color=te,this.rotate_left(n),n=e.parent.left),n.color=e.parent.color,e.parent.color=te,n.left.color=te,this.rotate_right(e.parent),e=this.root));e.color=te}tree_search(t,e){if(!(t==null||t===this.nil_node))return e.equal_to(t)?t:e.less_than(t)?this.tree_search(t.left,e):this.tree_search(t.right,e)}tree_search_nearest_forward(t,e){let n,r=t;for(;r&&r!==this.nil_node;)r.less_than(e)?r.intersect(e)?(n=r,r=r.left):r=r.right:((!n||r.less_than(n))&&(n=r),r=r.left);return n||null}tree_search_interval(t,e,n){t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&this.tree_search_interval(t.left,e,n),t.intersect(e)&&n.push(t),t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&this.tree_search_interval(t.right,e,n))}tree_find_any_interval(t,e){let n=!1;return t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&(n=this.tree_find_any_interval(t.left,e)),n||(n=t.intersect(e)),!n&&t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&(n=this.tree_find_any_interval(t.right,e))),n}local_minimum(t){let e=t;for(;e.left!=null&&e.left!==this.nil_node;)e=e.left;return e}local_maximum(t){let e=t;for(;e.right!=null&&e.right!==this.nil_node;)e=e.right;return e}tree_successor(t){let e,n,r;if(t.right!==this.nil_node)e=this.local_minimum(t.right);else{for(n=t,r=t.parent;r!=null&&r.right===n;)n=r,r=r.parent;e=r}return e}rotate_left(t){let e=t.right;t.right=e.left,e.left!==this.nil_node&&(e.left.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e,t!=null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}rotate_right(t){let e=t.left;t.left=e.right,e.right!==this.nil_node&&(e.right.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.right=t,t.parent=e,t!==null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}tree_walk(t,e){t!=null&&t!==this.nil_node&&(this.tree_walk(t.left,e),e(t),this.tree_walk(t.right,e))}testRedBlackProperty(){let t=!0;return this.tree_walk(this.root,function(e){e.color===Ge&&(e.left.color===te&&e.right.color===te||(t=!1))}),t}testBlackHeightProperty(t){let e=0,n=0,r=0;if(t.color===te&&e++,t.left!==this.nil_node?n=this.testBlackHeightProperty(t.left):n=1,t.right!==this.nil_node?r=this.testBlackHeightProperty(t.right):r=1,n!==r)throw new Error("Red-black height property violated");return e+=n,e}};var Va=class{ranges;tree;constructor(t){this.ranges=t,this.tree=new Ha;for(let e of t)this.tree.insert([e.from,e.to],e)}empty(){return this.ranges.length===0}get(t){return t<0?this.ranges[this.ranges.length+t]:this.ranges[t]}at_cursor(t,e=!1){let n=this.tree.search([t,t]);return n.length?e&&n.length>1?n[1]:n[0]:void 0}contains_range(t,e){return this.tree.intersect_any([t,e])}range_adjacent_to_cursor(t,e,n=!1,r=!1){let s=e?this.ranges.slice().reverse():this.ranges;return r?s.find(o=>e?(n?o.from:o.to)e?(n?o.from:o.to)<=t:t<=(n?o.to:o.from))}adjacent_range(t,e,n=!1){let r=this.ranges.findIndex(o=>o===t);if(r===-1)return;let s=e?this.ranges[r-1]:this.ranges[r+1];if(s)if(n){if(e?s.to===t.from:t.to===s.from)return s}else return s}ranges_in_interval(t,e){return this.tree.search([t,e])}ranges_in_intervals(t){let e=new Set;for(let n of t)for(let r of this.tree.search([n.from,n.to]))if(e.add(r),r.base_range){e.add(r.base_range);for(let s of r.base_range.replies)e.add(s)}return Array.from(e).sort((n,r)=>n.from-r.from)}unwrap_in_range(t,e=0,n=t.length,r=null){let s,o;if(r||(r=this.ranges_in_interval(e,n)),r.length===0)return{output:t.sliceString(e,n),from:e,to:n};let a="";e=r.at(-1).to?a+=t.sliceString(r.at(-1).to,n):o=r.at(-1);let u=s?s.cursor_pass_syntax(e,!1):e,f=o?o.cursor_pass_syntax(n,!0):n;return(u!==e||e===s?.from)&&(s=void 0),(f!==n||n===o?.to)&&(o=void 0),{output:a,from:u,to:f,front_range:s,back_range:o}}};var nk=require("@codemirror/view");var U_=require("@codemirror/state");var B_=require("@codemirror/state");function _f(i){return i.ranges.length===1&&i.ranges[0].anchor===i.ranges[0].head}function ys(i){return i.startState.selection.ranges[0].from!==i.selection.ranges[0].from||i.startState.selection.ranges[0].to!==i.selection.ranges[0].to}function bo(i,t,e){let n=[],r=0;return t.iterChanges((s,o,a,l,u)=>{n.push({from:s,to:o,anchor:i.ranges[r].anchor,offset:{removed:o-s,added:l-a},inserted:u.toString(),deleted:o-s?e.sliceString(s,o):"",selection:i.ranges[r].anchor!==i.ranges[r].head}),r{throw new Error("This node type doesn't define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof t!="function"&&(t=Vn.match(t)),e=>{let n=t(e);return n===void 0?null:[this,n]}}};de.closedBy=new de({deserialize:i=>i.split(" ")});de.openedBy=new de({deserialize:i=>i.split(" ")});de.group=new de({deserialize:i=>i.split(" ")});de.isolate=new de({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}});de.contextHash=new de({perNode:!0});de.lookAhead=new de({perNode:!0});de.mounted=new de({perNode:!0});var xs=class{constructor(t,e,n){this.tree=t,this.overlay=e,this.parser=n}static get(t){return t&&t.props&&t.props[de.mounted.id]}},mm=Object.create(null),Vn=class i{constructor(t,e,n,r=0){this.name=t,this.props=e,this.id=n,this.flags=r}static define(t){let e=t.props&&t.props.length?Object.create(null):mm,n=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),r=new i(t.name||"",e,t.id,n);if(t.props){for(let s of t.props)if(Array.isArray(s)||(s=s(r)),s){if(s[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");e[s[0].id]=s[1]}}return r}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(de.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let n in t)for(let r of n.split(" "))e[r]=t[n];return n=>{for(let r=n.prop(de.group),s=-1;s<(r?r.length:0);s++){let o=e[s<0?n.name:r[s]];if(o)return o}}}};Vn.none=new Vn("",Object.create(null),0,8);var Ga=new WeakMap,yf=new WeakMap,Ze;(function(i){i[i.ExcludeBuffers=1]="ExcludeBuffers",i[i.IncludeAnonymous=2]="IncludeAnonymous",i[i.IgnoreMounts=4]="IgnoreMounts",i[i.IgnoreOverlays=8]="IgnoreOverlays"})(Ze||(Ze={}));var Hn=class i{constructor(t,e,n,r,s){if(this.type=t,this.children=e,this.positions=n,this.length=r,this.props=null,s&&s.length){this.props=Object.create(null);for(let[o,a]of s)this.props[typeof o=="number"?o:o.id]=a}}toString(){let t=xs.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let n of this.children){let r=n.toString();r&&(e&&(e+=","),e+=r)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new yo(this.topNode,t)}cursorAt(t,e=0,n=0){let r=Ga.get(this)||this.topNode,s=new yo(r);return s.moveTo(t,e),Ga.set(this,s._tree),s}get topNode(){return new Mn(this,0,0,null)}resolve(t,e=0){let n=_o(Ga.get(this)||this.topNode,t,e,!1);return Ga.set(this,n),n}resolveInner(t,e=0){let n=_o(yf.get(this)||this.topNode,t,e,!0);return yf.set(this,n),n}resolveStack(t,e=0){return vm(this,t,e)}iterate(t){let{enter:e,leave:n,from:r=0,to:s=this.length}=t,o=t.mode||0,a=(o&Ze.IncludeAnonymous)>0;for(let l=this.cursor(o|Ze.IncludeAnonymous);;){let u=!1;if(l.from<=s&&l.to>=r&&(!a&&l.type.isAnonymous||e(l)!==!1)){if(l.firstChild())continue;u=!0}for(;u&&n&&(a||!l.type.isAnonymous)&&n(l),!l.nextSibling();){if(!l.parent())return;u=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:ju(Vn.none,this.children,this.positions,0,this.children.length,0,this.length,(e,n,r)=>new i(this.type,e,n,r,this.propValues),t.makeTree||((e,n,r)=>new i(Vn.none,e,n,r)))}static build(t){return bm(t)}};Hn.empty=new Hn(Vn.none,[],[],0);var zu=class i{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new i(this.buffer,this.index)}},hr=class i{constructor(t,e,n){this.buffer=t,this.length=e,this.set=n}get type(){return Vn.none}toString(){let t=[];for(let e=0;e0));l=o[l+3]);return a}slice(t,e,n){let r=this.buffer,s=new Uint16Array(e-t),o=0;for(let a=t,l=0;a=t&&et;case 1:return e<=t&&n>t;case 2:return n>t;case 4:return!0}}function _o(i,t,e,n){for(var r;i.from==i.to||(e<1?i.from>=t:i.from>t)||(e>-1?i.to<=t:i.to0?a.length:-1;t!=u;t+=e){let f=a[t],h=l[t]+o.from;if(Sf(r,n,h,h+f.length)){if(f instanceof hr){if(s&Ze.ExcludeBuffers)continue;let c=f.findChild(0,f.buffer.length,e,n-h,r);if(c>-1)return new wo(new qu(o,f,t,h),null,c)}else if(s&Ze.IncludeAnonymous||!f.type.isAnonymous||Uu(f)){let c;if(!(s&Ze.IgnoreMounts)&&(c=xs.get(f))&&!c.overlay)return new i(c.tree,h,t,o);let p=new i(f,h,t,o);return s&Ze.IncludeAnonymous||!p.type.isAnonymous?p:p.nextChild(e<0?f.children.length-1:0,e,n,r)}}}if(s&Ze.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,n=0){let r;if(!(n&Ze.IgnoreOverlays)&&(r=xs.get(this._tree))&&r.overlay){let s=t-this.from;for(let{from:o,to:a}of r.overlay)if((e>0?o<=s:o=s:a>s))return new i(r.tree,r.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,n)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function xf(i,t,e,n){let r=i.cursor(),s=[];if(!r.firstChild())return s;if(e!=null){for(let o=!1;!o;)if(o=r.type.is(e),!r.nextSibling())return s}for(;;){if(n!=null&&r.type.is(n))return s;if(r.type.is(t)&&s.push(r.node),!r.nextSibling())return n==null?s:[]}}function Gu(i,t,e=t.length-1){for(let n=i;e>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(t[e]&&t[e]!=n.name)return!1;e--}}return!0}var qu=class{constructor(t,e,n,r){this.parent=t,this.buffer=e,this.index=n,this.start=r}},wo=class i extends Wa{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,n){super(),this.context=t,this._parent=e,this.index=n,this.type=t.buffer.set.types[t.buffer.buffer[n]]}child(t,e,n){let{buffer:r}=this.context,s=r.findChild(this.index+4,r.buffer[this.index+3],t,e-this.context.start,n);return s<0?null:new i(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,n=0){if(n&Ze.ExcludeBuffers)return null;let{buffer:r}=this.context,s=r.findChild(this.index+4,r.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return s<0?null:new i(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new i(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new i(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:n}=this.context,r=this.index+4,s=n.buffer[this.index+3];if(s>r){let o=n.buffer[this.index+1];t.push(n.slice(r,s,o)),e.push(0)}return new Hn(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Mf(i){if(!i.length)return null;let t=0,e=i[0];for(let s=1;se.from||o.to=t){let a=new Mn(o.tree,o.overlay[0].from+s.from,-1,s);(r||(r=[n])).push(_o(a,t,e,!1))}}return r?Mf(r):n}var yo=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof Mn)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let n=t._parent;n;n=n._parent)this.stack.unshift(n.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:n,buffer:r}=this.buffer;return this.type=e||r.set.types[r.buffer[t]],this.from=n+r.buffer[t+1],this.to=n+r.buffer[t+2],!0}yield(t){return t?t instanceof Mn?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,n){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,n,this.mode));let{buffer:r}=this.buffer,s=r.findChild(this.index+4,r.buffer[this.index+3],t,e-this.buffer.start,n);return s<0?!1:(this.stack.push(this.index),this.yieldBuf(s))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,n=this.mode){return this.buffer?n&Ze.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,n))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Ze.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&Ze.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,n=this.stack.length-1;if(t<0){let r=n<0?0:this.stack[n]+4;if(this.index!=r)return this.yieldBuf(e.findChild(r,this.index,-1,0,4))}else{let r=e.buffer[this.index+3];if(r<(n<0?e.buffer.length:e.buffer[this.stack[n]+3]))return this.yieldBuf(r)}return n<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,n,{buffer:r}=this;if(r){if(t>0){if(this.index-1)for(let s=e+t,o=t<0?-1:n._tree.children.length;s!=o;s+=t){let a=n._tree.children[s];if(this.mode&Ze.IncludeAnonymous||a instanceof hr||!a.type.isAnonymous||Uu(a))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==r){if(r==this.index)return o;e=o,n=s+1;break t}r=this.stack[--s]}for(let r=n;r=0;s--){if(s<0)return Gu(this._tree,t,r);let o=n[e.buffer[this.stack[s]]];if(!o.isAnonymous){if(t[r]&&t[r]!=o.name)return!1;r--}}return!0}};function Uu(i){return i.children.some(t=>t instanceof hr||!t.type.isAnonymous||Uu(t))}function bm(i){var t;let{buffer:e,nodeSet:n,maxBufferLength:r=1024,reused:s=[],minRepeatType:o=n.types.length}=i,a=Array.isArray(e)?new zu(e,e.length):e,l=n.types,u=0,f=0;function h(M,w,x,A,D,N){let{id:I,start:R,end:z,size:U}=a,tt=f,rt=u;for(;U<0;)if(a.next(),U==-1){let Bt=s[I];x.push(Bt),A.push(R-M);return}else if(U==-3){u=I;return}else if(U==-4){f=I;return}else throw new RangeError(`Unrecognized record size: ${U}`);let At=l[I],St,mt,Dt=R-M;if(z-R<=r&&(mt=v(a.pos-w,D))){let Bt=new Uint16Array(mt.size-mt.skip),wt=a.pos-mt.size,qt=Bt.length;for(;a.pos>wt;)qt=_(mt.start,Bt,qt);St=new hr(Bt,z-mt.start,n),Dt=mt.start-M}else{let Bt=a.pos-U;a.next();let wt=[],qt=[],ee=I>=o?I:-1,Vt=0,Tt=z;for(;a.pos>Bt;)ee>=0&&a.id==ee&&a.size>=0?(a.end<=Tt-r&&(g(wt,qt,R,Vt,a.end,Tt,ee,tt,rt),Vt=wt.length,Tt=a.end),a.next()):N>2500?c(R,Bt,wt,qt):h(R,Bt,wt,qt,ee,N+1);if(ee>=0&&Vt>0&&Vt-1&&Vt>0){let Nt=p(At,rt);St=ju(At,wt,qt,0,wt.length,0,z-R,Nt,Nt)}else St=m(At,wt,qt,z-R,tt-z,rt)}x.push(St),A.push(Dt)}function c(M,w,x,A){let D=[],N=0,I=-1;for(;a.pos>w;){let{id:R,start:z,end:U,size:tt}=a;if(tt>4)a.next();else{if(I>-1&&z=0;U-=3)R[tt++]=D[U],R[tt++]=D[U+1]-z,R[tt++]=D[U+2]-z,R[tt++]=tt;x.push(new hr(R,D[2]-z,n)),A.push(z-M)}}function p(M,w){return(x,A,D)=>{let N=0,I=x.length-1,R,z;if(I>=0&&(R=x[I])instanceof Hn){if(!I&&R.type==M&&R.length==D)return R;(z=R.prop(de.lookAhead))&&(N=A[I]+R.length+z)}return m(M,x,A,D,N,w)}}function g(M,w,x,A,D,N,I,R,z){let U=[],tt=[];for(;M.length>A;)U.push(M.pop()),tt.push(w.pop()+x-D);M.push(m(n.types[I],U,tt,N-D,R-N,z)),w.push(D-x)}function m(M,w,x,A,D,N,I){if(N){let R=[de.contextHash,N];I=I?[R].concat(I):[R]}if(D>25){let R=[de.lookAhead,D];I=I?[R].concat(I):[R]}return new Hn(M,w,x,A,I)}function v(M,w){let x=a.fork(),A=0,D=0,N=0,I=x.end-r,R={size:0,start:0,skip:0};t:for(let z=x.pos-M;x.pos>z;){let U=x.size;if(x.id==w&&U>=0){R.size=A,R.start=D,R.skip=N,N+=4,A+=4,x.next();continue}let tt=x.pos-U;if(U<0||tt=o?4:0,At=x.start;for(x.next();x.pos>tt;){if(x.size<0)if(x.size==-3)rt+=4;else break t;else x.id>=o&&(rt+=4);x.next()}D=At,A+=U,N+=rt}return(w<0||A==M)&&(R.size=A,R.start=D,R.skip=N),R.size>4?R:void 0}function _(M,w,x){let{id:A,start:D,end:N,size:I}=a;if(a.next(),I>=0&&A4){let z=a.pos-(I-4);for(;a.pos>z;)x=_(M,w,x)}w[--x]=R,w[--x]=N-M,w[--x]=D-M,w[--x]=A}else I==-3?u=A:I==-4&&(f=A);return x}let S=[],k=[];for(;a.pos>0;)h(i.start||0,i.bufferStart||0,S,k,-1,0);let E=(t=i.length)!==null&&t!==void 0?t:S.length?k[0]+S[0].length:0;return new Hn(l[i.topID],S.reverse(),k.reverse(),E)}var kf=new WeakMap;function qa(i,t){if(!i.isAnonymous||t instanceof hr||t.type!=i)return 1;let e=kf.get(t);if(e==null){e=1;for(let n of t.children){if(n.type!=i||!(n instanceof Hn)){e=1;break}e+=qa(i,n)}kf.set(t,e)}return e}function ju(i,t,e,n,r,s,o,a,l){let u=0;for(let g=n;g=f)break;w+=x}if(k==E+1){if(w>f){let x=g[E];p(x.children,x.positions,0,x.children.length,m[E]+S);continue}h.push(g[E])}else{let x=m[k-1]+g[k-1].length-M;h.push(ju(i,g,m,E,k,M,x,null,l))}c.push(M+S-s)}}return p(t,e,n,r,0),(a||l)(h,c,o)}var ks=class i{constructor(t,e,n,r,s=!1,o=!1){this.from=t,this.to=e,this.tree=n,this.offset=r,this.open=(s?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],n=!1){let r=[new i(0,t.length,t,0,!1,n)];for(let s of e)s.to>t.length&&r.push(s);return r}static applyChanges(t,e,n=128){if(!e.length)return t;let r=[],s=1,o=t.length?t[0]:null;for(let a=0,l=0,u=0;;a++){let f=a=n)for(;o&&o.from=c.from||h<=c.to||u){let p=Math.max(c.from,l)-u,g=Math.min(c.to,h)-u;c=p>=g?null:new i(p,g,c.tree,c.offset+u,a>0,!!f)}if(c&&r.push(c),o.to>h)break;o=si[0]}),Ss=new Yi.Compartment,qe=Yi.Facet.define({combine:i=>i[0]}),Ms=new Yi.Compartment,xi=Yi.Facet.define({combine:i=>i[0]}),Es=new Yi.Compartment,Ts=new Yi.Compartment,As=Yi.StateEffect.define();var hh=require("@codemirror/language");var _m=0,xo=class{constructor(t,e){this.from=t,this.to=e}},ne=class{constructor(t={}){this.id=_m++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof t!="function"&&(t=Ki.match(t)),e=>{let n=t(e);return n===void 0?null:[this,n]}}};ne.closedBy=new ne({deserialize:i=>i.split(" ")});ne.openedBy=new ne({deserialize:i=>i.split(" ")});ne.group=new ne({deserialize:i=>i.split(" ")});ne.isolate=new ne({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}});ne.contextHash=new ne({perNode:!0});ne.lookAhead=new ne({perNode:!0});ne.mounted=new ne({perNode:!0});var Cs=class{constructor(t,e,n){this.tree=t,this.overlay=e,this.parser=n}static get(t){return t&&t.props&&t.props[ne.mounted.id]}},wm=Object.create(null),Ki=class i{constructor(t,e,n,r=0){this.name=t,this.props=e,this.id=n,this.flags=r}static define(t){let e=t.props&&t.props.length?Object.create(null):wm,n=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),r=new i(t.name||"",e,t.id,n);if(t.props){for(let s of t.props)if(Array.isArray(s)||(s=s(r)),s){if(s[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");e[s[0].id]=s[1]}}return r}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(ne.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let n in t)for(let r of n.split(" "))e[r]=t[n];return n=>{for(let r=n.prop(ne.group),s=-1;s<(r?r.length:0);s++){let o=e[s<0?n.name:r[s]];if(o)return o}}}};Ki.none=new Ki("",Object.create(null),0,8);var Ya=class i{constructor(t){this.types=t;for(let e=0;e0;for(let l=this.cursor(o|Re.IncludeAnonymous);;){let u=!1;if(l.from<=s&&l.to>=r&&(!a&&l.type.isAnonymous||e(l)!==!1)){if(l.firstChild())continue;u=!0}for(;u&&n&&(a||!l.type.isAnonymous)&&n(l),!l.nextSibling();){if(!l.parent())return;u=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:th(Ki.none,this.children,this.positions,0,this.children.length,0,this.length,(e,n,r)=>new i(this.type,e,n,r,this.propValues),t.makeTree||((e,n,r)=>new i(Ki.none,e,n,r)))}static build(t){return xm(t)}};ki.empty=new ki(Ki.none,[],[],0);var Yu=class i{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new i(this.buffer,this.index)}},cr=class i{constructor(t,e,n){this.buffer=t,this.length=e,this.set=n}get type(){return Ki.none}toString(){let t=[];for(let e=0;e0));l=o[l+3]);return a}slice(t,e,n){let r=this.buffer,s=new Uint16Array(e-t),o=0;for(let a=t,l=0;a=t&&et;case 1:return e<=t&&n>t;case 2:return n>t;case 4:return!0}}function ko(i,t,e,n){for(var r;i.from==i.to||(e<1?i.from>=t:i.from>t)||(e>-1?i.to<=t:i.to0?a.length:-1;t!=u;t+=e){let f=a[t],h=l[t]+o.from;if(Cf(r,n,h,h+f.length)){if(f instanceof cr){if(s&Re.ExcludeBuffers)continue;let c=f.findChild(0,f.buffer.length,e,n-h,r);if(c>-1)return new So(new Ju(o,f,t,h),null,c)}else if(s&Re.IncludeAnonymous||!f.type.isAnonymous||Zu(f)){let c;if(!(s&Re.IgnoreMounts)&&(c=Cs.get(f))&&!c.overlay)return new i(c.tree,h,t,o);let p=new i(f,h,t,o);return s&Re.IncludeAnonymous||!p.type.isAnonymous?p:p.nextChild(e<0?f.children.length-1:0,e,n,r)}}}if(s&Re.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,n=0){let r;if(!(n&Re.IgnoreOverlays)&&(r=Cs.get(this._tree))&&r.overlay){let s=t-this.from;for(let{from:o,to:a}of r.overlay)if((e>0?o<=s:o=s:a>s))return new i(r.tree,r.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,n)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Tf(i,t,e,n){let r=i.cursor(),s=[];if(!r.firstChild())return s;if(e!=null){for(let o=!1;!o;)if(o=r.type.is(e),!r.nextSibling())return s}for(;;){if(n!=null&&r.type.is(n))return s;if(r.type.is(t)&&s.push(r.node),!r.nextSibling())return n==null?s:[]}}function Ku(i,t,e=t.length-1){for(let n=i;e>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(t[e]&&t[e]!=n.name)return!1;e--}}return!0}var Ju=class{constructor(t,e,n,r){this.parent=t,this.buffer=e,this.index=n,this.start=r}},So=class i extends Ka{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,n){super(),this.context=t,this._parent=e,this.index=n,this.type=t.buffer.set.types[t.buffer.buffer[n]]}child(t,e,n){let{buffer:r}=this.context,s=r.findChild(this.index+4,r.buffer[this.index+3],t,e-this.context.start,n);return s<0?null:new i(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,n=0){if(n&Re.ExcludeBuffers)return null;let{buffer:r}=this.context,s=r.findChild(this.index+4,r.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return s<0?null:new i(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new i(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new i(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:n}=this.context,r=this.index+4,s=n.buffer[this.index+3];if(s>r){let o=n.buffer[this.index+1];t.push(n.slice(r,s,o)),e.push(0)}return new ki(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Of(i){if(!i.length)return null;let t=0,e=i[0];for(let s=1;se.from||o.to=t){let a=new En(o.tree,o.overlay[0].from+s.from,-1,s);(r||(r=[n])).push(ko(a,t,e,!1))}}return r?Of(r):n}var Mo=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof En)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let n=t._parent;n;n=n._parent)this.stack.unshift(n.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:n,buffer:r}=this.buffer;return this.type=e||r.set.types[r.buffer[t]],this.from=n+r.buffer[t+1],this.to=n+r.buffer[t+2],!0}yield(t){return t?t instanceof En?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,n){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,n,this.mode));let{buffer:r}=this.buffer,s=r.findChild(this.index+4,r.buffer[this.index+3],t,e-this.buffer.start,n);return s<0?!1:(this.stack.push(this.index),this.yieldBuf(s))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,n=this.mode){return this.buffer?n&Re.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,n))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Re.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&Re.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,n=this.stack.length-1;if(t<0){let r=n<0?0:this.stack[n]+4;if(this.index!=r)return this.yieldBuf(e.findChild(r,this.index,-1,0,4))}else{let r=e.buffer[this.index+3];if(r<(n<0?e.buffer.length:e.buffer[this.stack[n]+3]))return this.yieldBuf(r)}return n<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,n,{buffer:r}=this;if(r){if(t>0){if(this.index-1)for(let s=e+t,o=t<0?-1:n._tree.children.length;s!=o;s+=t){let a=n._tree.children[s];if(this.mode&Re.IncludeAnonymous||a instanceof cr||!a.type.isAnonymous||Zu(a))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==r){if(r==this.index)return o;e=o,n=s+1;break t}r=this.stack[--s]}for(let r=n;r=0;s--){if(s<0)return Ku(this._tree,t,r);let o=n[e.buffer[this.stack[s]]];if(!o.isAnonymous){if(t[r]&&t[r]!=o.name)return!1;r--}}return!0}};function Zu(i){return i.children.some(t=>t instanceof cr||!t.type.isAnonymous||Zu(t))}function xm(i){var t;let{buffer:e,nodeSet:n,maxBufferLength:r=1024,reused:s=[],minRepeatType:o=n.types.length}=i,a=Array.isArray(e)?new Yu(e,e.length):e,l=n.types,u=0,f=0;function h(M,w,x,A,D,N){let{id:I,start:R,end:z,size:U}=a,tt=f,rt=u;for(;U<0;)if(a.next(),U==-1){let Bt=s[I];x.push(Bt),A.push(R-M);return}else if(U==-3){u=I;return}else if(U==-4){f=I;return}else throw new RangeError(`Unrecognized record size: ${U}`);let At=l[I],St,mt,Dt=R-M;if(z-R<=r&&(mt=v(a.pos-w,D))){let Bt=new Uint16Array(mt.size-mt.skip),wt=a.pos-mt.size,qt=Bt.length;for(;a.pos>wt;)qt=_(mt.start,Bt,qt);St=new cr(Bt,z-mt.start,n),Dt=mt.start-M}else{let Bt=a.pos-U;a.next();let wt=[],qt=[],ee=I>=o?I:-1,Vt=0,Tt=z;for(;a.pos>Bt;)ee>=0&&a.id==ee&&a.size>=0?(a.end<=Tt-r&&(g(wt,qt,R,Vt,a.end,Tt,ee,tt,rt),Vt=wt.length,Tt=a.end),a.next()):N>2500?c(R,Bt,wt,qt):h(R,Bt,wt,qt,ee,N+1);if(ee>=0&&Vt>0&&Vt-1&&Vt>0){let Nt=p(At,rt);St=th(At,wt,qt,0,wt.length,0,z-R,Nt,Nt)}else St=m(At,wt,qt,z-R,tt-z,rt)}x.push(St),A.push(Dt)}function c(M,w,x,A){let D=[],N=0,I=-1;for(;a.pos>w;){let{id:R,start:z,end:U,size:tt}=a;if(tt>4)a.next();else{if(I>-1&&z=0;U-=3)R[tt++]=D[U],R[tt++]=D[U+1]-z,R[tt++]=D[U+2]-z,R[tt++]=tt;x.push(new cr(R,D[2]-z,n)),A.push(z-M)}}function p(M,w){return(x,A,D)=>{let N=0,I=x.length-1,R,z;if(I>=0&&(R=x[I])instanceof ki){if(!I&&R.type==M&&R.length==D)return R;(z=R.prop(ne.lookAhead))&&(N=A[I]+R.length+z)}return m(M,x,A,D,N,w)}}function g(M,w,x,A,D,N,I,R,z){let U=[],tt=[];for(;M.length>A;)U.push(M.pop()),tt.push(w.pop()+x-D);M.push(m(n.types[I],U,tt,N-D,R-N,z)),w.push(D-x)}function m(M,w,x,A,D,N,I){if(N){let R=[ne.contextHash,N];I=I?[R].concat(I):[R]}if(D>25){let R=[ne.lookAhead,D];I=I?[R].concat(I):[R]}return new ki(M,w,x,A,I)}function v(M,w){let x=a.fork(),A=0,D=0,N=0,I=x.end-r,R={size:0,start:0,skip:0};t:for(let z=x.pos-M;x.pos>z;){let U=x.size;if(x.id==w&&U>=0){R.size=A,R.start=D,R.skip=N,N+=4,A+=4,x.next();continue}let tt=x.pos-U;if(U<0||tt=o?4:0,At=x.start;for(x.next();x.pos>tt;){if(x.size<0)if(x.size==-3)rt+=4;else break t;else x.id>=o&&(rt+=4);x.next()}D=At,A+=U,N+=rt}return(w<0||A==M)&&(R.size=A,R.start=D,R.skip=N),R.size>4?R:void 0}function _(M,w,x){let{id:A,start:D,end:N,size:I}=a;if(a.next(),I>=0&&A4){let z=a.pos-(I-4);for(;a.pos>z;)x=_(M,w,x)}w[--x]=R,w[--x]=N-M,w[--x]=D-M,w[--x]=A}else I==-3?u=A:I==-4&&(f=A);return x}let S=[],k=[];for(;a.pos>0;)h(i.start||0,i.bufferStart||0,S,k,-1,0);let E=(t=i.length)!==null&&t!==void 0?t:S.length?k[0]+S[0].length:0;return new ki(l[i.topID],S.reverse(),k.reverse(),E)}var Af=new WeakMap;function ja(i,t){if(!i.isAnonymous||t instanceof cr||t.type!=i)return 1;let e=Af.get(t);if(e==null){e=1;for(let n of t.children){if(n.type!=i||!(n instanceof ki)){e=1;break}e+=ja(i,n)}Af.set(t,e)}return e}function th(i,t,e,n,r,s,o,a,l){let u=0;for(let g=n;g=f)break;w+=x}if(k==E+1){if(w>f){let x=g[E];p(x.children,x.positions,0,x.children.length,m[E]+S);continue}h.push(g[E])}else{let x=m[k-1]+g[k-1].length-M;h.push(th(i,g,m,E,k,M,x,null,l))}c.push(M+S-s)}}return p(t,e,n,r,0),(a||l)(h,c,o)}var Ja=class{startParse(t,e,n){return typeof t=="string"&&(t=new Qu(t)),n=n?n.length?n.map(r=>new xo(r.from,r.to)):[new xo(0,0)]:[new xo(0,t.length)],this.createParse(t,e||[],n)}parse(t,e,n){let r=this.startParse(t,e,n);for(;;){let s=r.advance();if(s)return s}}},Qu=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var ow=new ne({perNode:!0});var ih=class i{constructor(t,e,n,r,s,o,a,l,u,f=0,h){this.p=t,this.stack=e,this.state=n,this.reducePos=r,this.pos=s,this.score=o,this.buffer=a,this.bufferBase=l,this.curContext=u,this.lookAhead=f,this.parent=h}toString(){return`[${this.stack.filter((t,e)=>e%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,n=0){let r=t.parser.context;return new i(t,[],e,n,n,0,[],0,r?new Xa(r,r.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let n=t>>19,r=t&65535,{parser:s}=this.p,o=s.dynamicPrecedence(r);if(o&&(this.score+=o),n==0){this.pushState(s.getGoto(this.state,r,!0),this.reducePos),r=2e3&&!(!((e=this.p.parser.nodeSet.types[r])===null||e===void 0)&&e.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=u):this.p.lastBigReductionSizea;)this.stack.pop();this.reduceContext(r,l)}storeNode(t,e,n,r=4,s=!1){if(t==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&o.buffer[a-4]==0&&o.buffer[a-1]>-1){if(e==n)return;if(o.buffer[a-2]>=e){o.buffer[a-2]=n;return}}}if(!s||this.pos==n)this.buffer.push(t,e,n,r);else{let o=this.buffer.length;if(o>0&&this.buffer[o-4]!=0)for(;o>0&&this.buffer[o-2]>n;)this.buffer[o]=this.buffer[o-4],this.buffer[o+1]=this.buffer[o-3],this.buffer[o+2]=this.buffer[o-2],this.buffer[o+3]=this.buffer[o-1],o-=4,r>4&&(r-=4);this.buffer[o]=t,this.buffer[o+1]=e,this.buffer[o+2]=n,this.buffer[o+3]=r}}shift(t,e,n,r){if(t&131072)this.pushState(t&65535,this.pos);else if((t&262144)==0){let s=t,{parser:o}=this.p;(r>this.pos||e<=o.maxNode)&&(this.pos=r,o.stateFlag(s,1)||(this.reducePos=r)),this.pushState(s,n),this.shiftContext(e,n),e<=o.maxNode&&this.buffer.push(e,n,r,4)}else this.pos=r,this.shiftContext(e,n),e<=this.p.parser.maxNode&&this.buffer.push(e,n,r,4)}apply(t,e,n,r){t&65536?this.reduce(t):this.shift(t,e,n,r)}useNode(t,e){let n=this.p.reused.length-1;(n<0||this.p.reused[n]!=t)&&(this.p.reused.push(t),n++);let r=this.pos;this.reducePos=this.pos=r+t.length,this.pushState(e,r),this.buffer.push(n,r,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let n=t.buffer.slice(e),r=t.bufferBase+e;for(;t&&r==t.bufferBase;)t=t.parent;return new i(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,n,r,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let n=t<=this.p.parser.maxNode;n&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,n?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new nh(this);;){let n=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(n==0)return!1;if((n&65536)==0)return!0;e.reduce(n)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let r=[];for(let s=0,o;sl&1&&a==o)||r.push(e[s],o)}e=r}let n=[];for(let r=0;r>19,r=e&65535,s=this.stack.length-n*3;if(s<0||t.getGoto(this.stack[s],r,!1)<0){let o=this.findForcedReduction();if(o==null)return!1;e=o}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],n=(r,s)=>{if(!e.includes(r))return e.push(r),t.allActions(r,o=>{if(!(o&393216))if(o&65536){let a=(o>>19)-s;if(a>1){let l=o&65535,u=this.stack.length-a*3;if(u>=0&&t.getGoto(this.stack[u],l,!1)>=0)return a<<19|65536|l}}else{let a=n(o,s+1);if(a!=null)return a}})};return n(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:t}=this.p;return t.data[t.stateSlot(this.state,1)]==65535&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;ethis.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},Xa=class{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}},nh=class{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=t&65535,n=t>>19;n==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(n-1)*3;let r=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=r}},rh=class i{constructor(t,e,n){this.stack=t,this.pos=e,this.index=n,this.buffer=t.buffer,this.index==0&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new i(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;t!=null&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new i(this.stack,this.pos,this.index)}};function Eo(i,t=Uint16Array){if(typeof i!="string")return i;let e=null;for(let n=0,r=0;n=92&&o--,o>=34&&o--;let l=o-32;if(l>=46&&(l-=46,a=!0),s+=l,a)break;s*=46}e?e[r++]=s:e=new t(s)}return e}var Os=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},Df=new Os,sh=class{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Df,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let n=this.range,r=this.rangeIndex,s=this.pos+t;for(;sn.to:s>=n.to;){if(r==this.ranges.length-1)return null;let o=this.ranges[++r];s+=o.from-n.to,n=o}return s}clipPos(t){if(t>=this.range.from&&tt)return Math.max(t,e.from);return this.end}peek(t){let e=this.chunkOff+t,n,r;if(e>=0&&e=this.chunk2Pos&&na.to&&(this.chunk2=this.chunk2.slice(0,a.to-n)),r=this.chunk2.charCodeAt(0)}}return n>=this.token.lookAhead&&(this.token.lookAhead=n+1),r}acceptToken(t,e=0){let n=e?this.resolveOffset(e,-1):this.pos;if(n==null||n=this.chunk2Pos&&this.posthis.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=Df,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let n="";for(let r of this.ranges){if(r.from>=e)break;r.to>t&&(n+=this.input.read(Math.max(r.from,t),Math.min(r.to,e)))}return n}},fr=class{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:n}=e.p;Nf(this.data,t,e,this.id,n.data,n.tokenPrecTable)}};fr.prototype.contextual=fr.prototype.fallback=fr.prototype.extend=!1;var Gn=class{constructor(t,e,n){this.precTable=e,this.elseToken=n,this.data=typeof t=="string"?Eo(t):t}token(t,e){let n=t.pos,r=0;for(;;){let s=t.next<0,o=t.resolveOffset(1,1);if(Nf(this.data,t,e,0,this.data,this.precTable),t.token.value>-1)break;if(this.elseToken==null)return;if(s||r++,o==null)break;t.reset(o,t.token)}r&&(t.reset(n,t.token),t.acceptToken(this.elseToken,r))}};Gn.prototype.contextual=fr.prototype.fallback=fr.prototype.extend=!1;function Nf(i,t,e,n,r,s){let o=0,a=1<0){let g=i[p];if(l.allows(g)&&(t.token.value==-1||t.token.value==g||Sm(g,t.token.value,r,s))){t.acceptToken(g);break}}let f=t.next,h=0,c=i[o+2];if(t.next<0&&c>h&&i[u+c*3-3]==65535){o=i[u+c*3-1];continue t}for(;h>1,g=u+p+(p<<1),m=i[g],v=i[g+1]||65536;if(f=v)h=p+1;else{o=i[g+2],t.advance();continue t}}break}}function $f(i,t,e){for(let n=t,r;(r=i[n])!=65535;n++)if(r==e)return n-t;return-1}function Sm(i,t,e,n){let r=$f(e,n,t);return r<0||$f(e,n,i)t)&&!n.type.isError)return e<0?Math.max(0,Math.min(n.to-1,t-25)):Math.min(i.length,Math.max(n.from+1,t+25));if(e<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return e<0?0:i.length}}var oh=class{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?Rf(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?Rf(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(tt)return this.nextStart=o,null;if(s instanceof ki){if(o==t){if(o=Math.max(this.safeFrom,t)&&(this.trees.push(s),this.start.push(o),this.index.push(0))}else this.index[e]++,this.nextStart=o+s.length}}},ah=class{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map(n=>new Os)}getActions(t){let e=0,n=null,{parser:r}=t.p,{tokenizers:s}=r,o=r.stateSlot(t.state,3),a=t.curContext?t.curContext.hash:0,l=0;for(let u=0;uh.end+25&&(l=Math.max(h.lookAhead,l)),h.value!=0)){let c=e;if(h.extended>-1&&(e=this.addActions(t,h.extended,h.end,e)),e=this.addActions(t,h.value,h.end,e),!f.extend&&(n=h,e>c))break}}for(;this.actions.length>e;)this.actions.pop();return l&&t.setLookAhead(l),!n&&t.pos==this.stream.end&&(n=new Os,n.value=t.p.parser.eofTerm,n.start=n.end=t.pos,e=this.addActions(t,n.value,n.end,e)),this.mainToken=n,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new Os,{pos:n,p:r}=t;return e.start=n,e.end=Math.min(n+1,r.stream.end),e.value=n==r.stream.end?r.parser.eofTerm:0,e}updateCachedToken(t,e,n){let r=this.stream.clipPos(n.pos);if(e.token(this.stream.reset(r,t),n),t.value>-1){let{parser:s}=n.p;for(let o=0;o=0&&n.p.parser.dialect.allows(a>>1)){(a&1)==0?t.value=a>>1:t.extended=a>>1;break}}}else t.value=0,t.end=this.stream.clipPos(r+1)}putAction(t,e,n,r){for(let s=0;st.bufferLength*4?new oh(n,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t=this.stacks,e=this.minStackPos,n=this.stacks=[],r,s;if(this.bigReductionCount>300&&t.length==1){let[o]=t;for(;o.forceReduce()&&o.stack.length&&o.stack[o.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let o=0;oe)n.push(a);else{if(this.advanceStack(a,n,t))continue;{r||(r=[],s=[]),r.push(a);let l=this.tokens.getMainToken(a);s.push(l.value,l.end)}}break}}if(!n.length){let o=r&&Mm(r);if(o)return this.stackToTree(o);if(this.parser.strict)throw new SyntaxError("No parse at "+e);this.recovering||(this.recovering=5)}if(this.recovering&&r){let o=this.stoppedAt!=null&&r[0].pos>this.stoppedAt?r[0]:this.runRecovery(r,s,n);if(o)return this.stackToTree(o.forceAll())}if(this.recovering){let o=this.recovering==1?1:this.recovering*3;if(n.length>o)for(n.sort((a,l)=>l.score-a.score);n.length>o;)n.pop();n.some(a=>a.reducePos>e)&&this.recovering--}else if(n.length>1){t:for(let o=0;o500&&u.buffer.length>500)if((a.score-u.score||a.buffer.length-u.buffer.length)>0)n.splice(l--,1);else{n.splice(o--,1);continue t}}}n.length>12&&n.splice(12,n.length-12)}this.minStackPos=n[0].pos;for(let o=1;o ":"";if(this.stoppedAt!=null&&r>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let u=t.curContext&&t.curContext.tracker.strict,f=u?t.curContext.hash:0;for(let h=this.fragments.nodeAt(r);h;){let c=this.parser.nodeSet.types[h.type.id]==h.type?s.getGoto(t.state,h.type.id):-1;if(c>-1&&h.length&&(!u||(h.prop(ne.contextHash)||0)==f))return t.useNode(h,c),!0;if(!(h instanceof ki)||h.children.length==0||h.positions[0]>0)break;let p=h.children[0];if(p instanceof ki&&h.positions[0]==0)h=p;else break}}let a=s.stateSlot(t.state,4);if(a>0)return t.reduce(a),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let l=this.tokens.getActions(t);for(let u=0;ur?e.push(g):n.push(g)}return!1}advanceFully(t,e){let n=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>n)return If(t,e),!0}}runRecovery(t,e,n){let r=null,s=!1;for(let o=0;o ":"";if(a.deadEnd&&(s||(s=!0,a.restart(),this.advanceFully(a,n))))continue;let h=a.split(),c=f;for(let p=0;h.forceReduce()&&p<10&&!this.advanceFully(h,n);p++)Ri&&(c=this.stackID(h)+" -> ");for(let p of a.recoverByInsert(l))this.advanceFully(p,n);this.stream.end>a.pos?(u==a.pos&&(u++,l=0),a.recoverByDelete(l,u),If(a,n)):(!r||r.scoret.topRules[a][1]),r=[];for(let a=0;a=0)s(f,l,a[u++]);else{let h=a[u+-f];for(let c=-f;c>0;c--)s(a[u++],l,h);u++}}}this.nodeSet=new Ya(e.map((a,l)=>Ki.define({name:l>=this.minRepeatTerm?void 0:a,id:l,props:r[l],top:n.indexOf(l)>-1,error:l==0,skipped:t.skippedNodes&&t.skippedNodes.indexOf(l)>-1}))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=1024;let o=Eo(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let a=0;atypeof a=="number"?new fr(o,a):a),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,n){let r=new lh(this,t,e,n);for(let s of this.wrappers)r=s(r,t,e,n);return r}getGoto(t,e,n=!1){let r=this.goto;if(e>=r[0])return-1;for(let s=r[e+1];;){let o=r[s++],a=o&1,l=r[s++];if(a&&n)return l;for(let u=s+(o>>1);s0}validAction(t,e){return!!this.allActions(t,n=>n==e?!0:null)}allActions(t,e){let n=this.stateSlot(t,4),r=n?e(n):void 0;for(let s=this.stateSlot(t,1);r==null;s+=3){if(this.data[s]==65535)if(this.data[s+1]==1)s=zn(this.data,s+2);else break;r=e(zn(this.data,s+1))}return r}nextStates(t){let e=[];for(let n=this.stateSlot(t,1);;n+=3){if(this.data[n]==65535)if(this.data[n+1]==1)n=zn(this.data,n+2);else break;if((this.data[n+2]&1)==0){let r=this.data[n+1];e.some((s,o)=>o&1&&s==r)||e.push(this.data[n],r)}}return e}configure(t){let e=Object.assign(Object.create(i.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let n=this.topRules[t.top];if(!n)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=n}return t.tokenizers&&(e.tokenizers=this.tokenizers.map(n=>{let r=t.tokenizers.find(s=>s.from==n);return r?r.to:n})),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map((n,r)=>{let s=t.specializers.find(a=>a.from==n.external);if(!s)return n;let o=Object.assign(Object.assign({},n),{external:s.to});return e.specializers[r]=Pf(o),o})),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),t.strict!=null&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),t.bufferLength!=null&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return e==null?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),n=e.map(()=>!1);if(t)for(let s of t.split(" ")){let o=e.indexOf(s);o>=0&&(n[o]=!0)}let r=null;for(let s=0;sn)&&e.p.parser.stateFlag(e.state,2)&&(!t||t.scorei.external(e,n)<<1|t}return i.get}var Em=Qa.deserialize({version:14,states:")`QQOPOOOfOQO'#C^OqOSO'#C`O|OWO'#CbO!XO`O'#CeO!dOpO'#CgOOOO'#Ck'#CkOOOO'#Ci'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<{ti=i},contextmenu:(i,t)=>{ti=i}});var Bf=require("@codemirror/state");function tl(i,t,e,n,r){if(t.includes("select.pointer")||ti&&r.key==="a"&&(ti.ctrlKey||ti.metaKey))return;let s=t.includes("select.backward"),o=t.includes("select.group"),a=t.includes("select.extend");!e&&r&&(s=r.key==="ArrowLeft",r.key==="ArrowLeft"?s=!0:r.key==="ArrowRight"?s=!1:s=!wf(i.startState.selection,i.selection),a=r.shiftKey,o=r.ctrlKey||r.metaKey);let l=i.startState.field(Pt).ranges,u=i.selection.ranges.map((f,h)=>Ff(i.startState.selection.ranges[h],f,l,!s,o,a,e,i.startState,n.suggestion_mode_operations.cursor_movement,n.suggestion_mode_operations.bracket_movement).selection);return{selection:Bf.EditorSelection.create(u),filter:!1}}function Tm(i,t){return t.some(e=>e.startsWith(i))}var fh=i=>Hr.EditorState.transactionFilter.of(t=>Am(t,i));function Am(i,t){let e=el(i),{app:n}=i.startState.field(Hf.editorInfoField),r=n.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!i.docChanged&&r&&ys(i)&&e.push(i.startState.selection.ranges[0].fromp[0].to?c.to:p[0].touches_right_bracket(c.to,!1,!0)?p[0].to:void 0;if(v!==void 0&&_!==void 0){a.push({from:v,to:_,insert:""}),l.push(Hr.EditorSelection.cursor(v+h)),h-=_-v;continue}}let g=To(o,i.startState.doc,c.from,c.to,c.inserted,"regular"),m=g.slice(0,-1).reduce((v,_)=>v-(_.to-_.from)+_.insert.length,0);g&&(a.push(g),l.push(Hr.EditorSelection.cursor((u?g[0].start:g[g.length-1].end+m)+h)),h+=m-(g[g.length-1].to-g[g.length-1].from)+g[g.length-1].insert.length)}return i.startState.update(a.length?{changes:a,selection:Hr.EditorSelection.create(l)}:{})}else if(Tm("select",e)&&ys(i)&&t.alternative_cursor_movement&&ti instanceof KeyboardEvent){let s=tl(i,e,r,t,ti);if(s)return i.startState.update(s)}return i}var Vf=require("obsidian"),Ao=require("@codemirror/state"),Aw=require("@codemirror/view");var Om={moveByCharacters:{group:!1}};function Dm(i,t){return t.some(e=>e.startsWith(i))}var dh=i=>Ao.EditorState.transactionFilter.of(t=>$m(t,i));function $m(i,t){let e=i.startState.field(Vf.editorEditorField),n=el(i),r=e.cm!==void 0;if(r&&!i.docChanged&&i.selection&&(ys(i)&&n.push(i.startState.selection.ranges[0].fromS-(k.to-k.from)+k.insert.length,0);v&&(l.push(v),u.push(Ao.EditorSelection.cursor((h?v[0].start:v[v.length-1].end+_)+p)),p+=_-(v[v.length-1].to-v[v.length-1].from)+v[v.length-1].insert.length)}return i.startState.update(l.length?{changes:l,selection:Ao.EditorSelection.create(u)}:{})}else if(Dm("select",n)&&ys(i)&&t.alternative_cursor_movement&&ti instanceof KeyboardEvent){let s=tl(i,n,r,t,ti);if(s)return i.startState.update(s)}return i}var Bw=require("@codemirror/state");function dr(i,t){return i===0?[]:i===1?[fh(t)]:i===2?[dh(t)]:[]}var ln=require("obsidian");async function Rm(i){let t,e;if(ln.Platform.isMobileApp){let r=await window.Capacitor.nativePromise("App","getInfo");r&&(t=r.version+" ("+r.build+")");let s=await window.Capacitor.nativePromise("Device","getInfo");s?e=`${s.platform} ${s.osVersion} (${s.manufacturer} ${s.model})`:e=navigator.userAgent.match(/(Android|iOS) ([\d.]+)/)?.[0]||"unknown"}else if(ln.Platform.isDesktopApp){let r=require("os");e=r.version()+" "+r.release(),t=navigator.userAgent.match(/obsidian\/([\d.]+\d+)/)?.[1]||"unknown"}else e=navigator.userAgent.match(/(Windows|Mac OS X|Linux) ([\d.]+)/)?.[0]||"unknown",t=navigator.userAgent.match(/obsidian\/([\d.]+\d+)/)?.[1]||"unknown";let n=Object.values(i.plugins.plugins).filter(r=>r.manifest.id!=="commentator").map(r=>r.manifest.id+(r.manifest.version?` (v${r.manifest.version})`:""));return{plugin_version:i.plugins.plugins.commentator.manifest.version,other_plugins:n,operating_system:e,platform:ln.Platform.isMobileApp?ln.Platform.isAndroidApp?"Android":ln.Platform.isIosApp?"iOS":"mobile":ln.Platform.isMacOS?"macOS":"Desktop",framework_version:t,obsidian_version:ln.apiVersion}}async function Im(i,t,e={}){let r={...await Rm(i),...e};return"https://github.com/Fevol/obsidian-criticmarkup/issues/new?"+new URLSearchParams({title:t,template:"bug-report.yml","installer-version":r.framework_version,"app-version":r.obsidian_version,"commentator-version":r.plugin_version,"operating-systems":r.operating_system,"installed-plugins":r.other_plugins.join(", ")})}async function zf(i,t="",e={}){window.open(await Im(i,t,e),"_blank")}function rl(i,t,e=100,n=3e3,r){let s=new ln.Notice("",0);s.messageEl.appendChild(createEl("span",{text:i})),r&&(s.messageEl.appendChild(createEl("br")),s.messageEl.appendChild(createEl("span",{cls:"u-small",text:r})));let o=createEl("progress");return o.value=0,o.max=e,s.messageEl.appendChild(o),a=>{a>=e?(s.setMessage(t),s.noticeEl.addClass("mod-success"),window.setTimeout(()=>{s.hide()},n)):o.value=Math.round(a)}}function sl(i,t,e,n){for(let{icon:r,tooltip:s,value:o}of e)i.addItem(a=>{a.setTitle(s).setIcon(r).setChecked(t===o).onClick(()=>{n(o);for(let l of i.items){let u=l===a;l.dom.classList.toggle("mod-checked",u),l.setChecked(u)}})})}var nd=require("@codemirror/state");var hn=require("@codemirror/state"),nx=require("@codemirror/view"),un=require("obsidian");var Ds=require("@codemirror/state"),Ii=require("@codemirror/view");function ol(i,t){if(i.length!=t.length)return!1;for(let e=0;eDs.RangeSet.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}};function gh(i,t,e){for(;i.value&&i.from<=e;)i.from<=e&&t.push(i.value),i.next()}function Gf(i){return Array.isArray(i)?i:[i]}var $s=class{dom;height=-1;above=0;markers=[];constructor(t,e,n,r){this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(t,e,n,r)}update(t,e,n,r){this.height!=e&&(this.height=e,this.dom.style.height=e+"px"),this.above!=n&&(this.dom.style.marginTop=(this.above=n)?n+"px":""),ol(this.markers,r)||this.setMarkers(t,r)}setMarkers(t,e){let n="cm-gutterElement",r=this.dom.firstChild;for(let s=0,o=0;;){let a=o,l=sthis.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}},pr=class{constructor(t,e){this.view=t;this.config=e;this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let n in e.domEventHandlers)this.dom.addEventListener(n,r=>{let s=r.target,o;if(s!=this.dom&&this.dom.contains(s)){for(;s.parentNode!=this.dom;)s=s.parentNode;let l=s.getBoundingClientRect();o=(l.top+l.bottom)/2}else o=r.clientY;let a=t.lineBlockAtHeight(o-t.documentTop);e.domEventHandlers[n](t,a,r)&&r.preventDefault()});this.markers=Gf(e.markers(t)),e.initialSpacer&&(this.spacer=new $s(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}dom;elements=[];markers;spacer=null;update(t){let e=this.markers;if(this.markers=Gf(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let r=this.config.updateSpacer(this.spacer.markers[0],t);r!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[r])}let n=t.view.viewport;return!Ds.RangeSet.eq(this.markers,e,n.from,n.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(t):!1)}destroy(){for(let t of this.elements)t.destroy()}},Rs=class{constructor(t,e,n){this.view=t;this.unfixGutters=e;this.activeGutters=n;this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.style.minHeight=this.view.contentHeight+"px",this.gutters=this.createGutters(t);for(let r of this.gutters)this.dom.appendChild(r.dom);this.fixed=!t.state.facet(this.unfixGutters),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),this.insertGutters(t)}gutters;dom;fixed;prevViewport;createGutters(t){return t.state.facet(this.activeGutters).map(e=>new pr(t,e))}insertGutters(t){t.contentDOM.parentNode.insertBefore(this.dom,t.contentDOM)}insertDetachedGutters(t){t.parentNode.insertBefore(this.dom,t)}getUpdateContexts(){return this.gutters.map(t=>new Co(t,this.view.viewport,-this.view.documentPadding.top))}update(t){if(this.updateGutters(t)){let e=this.prevViewport,n=t.view.viewport,r=Math.min(e.to,n.to)-Math.max(e.from,n.from);this.syncGutters(r<(n.to-n.from)*.8)}t.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(this.unfixGutters)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&this.dom.remove();let n=Ds.RangeSet.iter(this.view.state.facet(Ii.gutterLineClass),this.view.viewport.from),r=[],s=this.getUpdateContexts();for(let o of this.view.viewportLineBlocks)if(r.length&&(r=[]),Array.isArray(o.type)){let a=!0;for(let l of o.type)if(l.type==Ii.BlockType.Text&&a){gh(n,r,l.from);for(let u of s)u.line(this.view,l,r);a=!1}else if(l.widget)for(let u of s)u.widget(this.view,l)}else if(o.type==Ii.BlockType.Text){gh(n,r,o.from);for(let a of s)a.line(this.view,o,r)}for(let o of s)o.finish();t&&this.insertDetachedGutters(e)}updateGutters(t){let e=t.startState.facet(this.activeGutters),n=t.state.facet(this.activeGutters),r=t.docChanged||t.heightChanged||t.viewportChanged||!Ds.RangeSet.eq(t.startState.facet(Ii.gutterLineClass),t.state.facet(Ii.gutterLineClass),t.view.viewport.from,t.view.viewport.to);if(e==n)for(let s of this.gutters)s.update(t)&&(r=!0);else{r=!0;let s=[];for(let o of n){let a=e.indexOf(o);a<0?s.push(new pr(this.view,o)):(this.gutters[a].update(t),s.push(this.gutters[a]))}for(let o of this.gutters)o.dom.remove(),s.indexOf(o)<0&&o.destroy();for(let o of s)this.dom.appendChild(o.dom);this.gutters=s}return r}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove()}};function al(i){return Ii.ViewPlugin.fromClass(i,{provide:t=>Ii.EditorView.scrollMargins.of(e=>{let n=e.plugin(t);return!n||n.gutters.length==0||!n.fixed?null:e.textDirection==Ii.Direction.LTR?{left:n.dom.offsetWidth}:{right:n.dom.offsetWidth}})})}function Nm(i,t,e){let n=[i];return t&&t.fixed===!1&&n.push(e.of(!0)),n}function ll(i,t,e,n){return[Nm(i,{},n),e.of({...Pm,...t})]}var fl=require("@codemirror/state"),Qf=require("@codemirror/view"),We=require("obsidian");var qf=require("obsidian"),hl=require("@codemirror/state"),Is=require("@codemirror/view");function zr(i,t){let e=Object.keys(t).map(n=>Lm(i,n,t[n]));return e.length===1?e[0]:function(){e.forEach(n=>n())}}function Lm(i,t,e){let n=i[t],r=i.hasOwnProperty(t),s=r?n:function(){return Object.getPrototypeOf(i)[t].apply(this,arguments)},o=e(s);return n&&Object.setPrototypeOf(o,n),Object.setPrototypeOf(a,o),i[t]=a,l;function a(...u){return o===s&&i[t]===a&&l(),o.apply(this,u)}function l(){i[t]===a&&(r?i[t]=s:delete i[t]),o!==s&&(o=s,Object.setPrototypeOf(a,n||Function))}}function Bm(i){let t=i.embedRegistry.embedByExtension.md({app:i,containerEl:createDiv()},null,"");t.editable=!0,t.showEditor();let e=Object.getPrototypeOf(Object.getPrototypeOf(t.editMode));return t.unload(),e.constructor}var ul={cursorLocation:{anchor:0,head:0},value:"",cls:"",placeholder:"",focus:!0,filteredExtensions:[],onEnter:(i,t,e)=>(t&&i.options.onSubmit(i),t),onEscape:i=>{i.options.onBlur(i)},onSubmit:()=>{},onBlur:()=>{},onPaste:()=>{},onChange:()=>{}},gr=class extends Bm(app){options;initial_value;scope;constructor(t,e,n){super(t,e,{app:t,onMarkdownScroll:()=>{},getMode:()=>"source"}),this.options={...ul,...n},this.initial_value=this.options.value,this.scope=new qf.Scope(this.app.scope),this.scope.register(["Mod"],"Enter",(r,s)=>!0),this.owner.editMode=this,this.owner.editor=this.editor,this.set(n.value||"",!0),this.register(zr(this.app.workspace,{setActiveLeaf:r=>(s,o)=>{this.activeCM.hasFocus||r.call(this.app.workspace,s,o)}})),this.options.onBlur!==ul.onBlur&&this.editor?.cm.contentDOM.addEventListener("blur",()=>{this._loaded&&this.options.onBlur(this)}),this.editor?.cm.contentDOM.addEventListener("focusin",()=>{this.app.keymap.pushScope(this.scope),this.app.workspace.activeEditor=this.owner}),this.editorEl.classList.remove("markdown-source-view"),n.cls&&this.editorEl.classList.add(...[].concat(n.cls)),n.cursorLocation&&this.editor?.cm.dispatch({selection:hl.EditorSelection.range(n.cursorLocation.anchor,n.cursorLocation.head)})}onUpdate(t,e){super.onUpdate(t,e),e&&this.options.onChange(t)}buildLocalExtensions(){let t=super.buildLocalExtensions();return this.options.placeholder&&t.push((0,Is.placeholder)(this.options.placeholder)),t.push(Is.EditorView.domEventHandlers({paste:e=>{this.options.onPaste(e,this)}})),t.push(hl.Prec.highest(Is.keymap.of([{key:"Enter",run:e=>this.options.onEnter(this,!1,!1),shift:e=>this.options.onEnter(this,!1,!0)},{key:"Mod-Enter",run:e=>this.options.onEnter(this,!0,!1),shift:e=>this.options.onEnter(this,!0,!0)},{key:"Escape",run:e=>(this.options.onEscape(this),!0),preventDefault:!0}]))),t}getDynamicExtensions(){return super.getDynamicExtensions().filter(t=>!this.options.filteredExtensions.includes(t))}updateBottomPadding(t){return 0}destroy(){this._loaded&&this.unload(),this.app.keymap.popScope(this.scope),this.app.workspace.activeEditor===this.owner&&(this.app.workspace.activeEditor=null),this.containerEl.empty(),super.destroy()}onunload(){super.onunload(),this.destroy()}onload(){super.onload(),this.options.focus&&this.editor?.focus()}};var Fm="0.2.3",Wf=4,Ps={version:Fm,default_edit_mode:1,default_preview_mode:0,comment_style:"icon",editor_styling:!1,markup_focus:{0:{show_styling:!0,show_syntax:!0,show_metadata:!0,focus_annotation:!0,show_comment:!0},1:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1},2:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1}},diff_gutter:!0,diff_gutter_hide_empty:!0,annotation_gutter:!0,annotation_gutter_included_types:31,annotation_gutter_hide_empty:!0,annotation_gutter_default_fold_state:!1,annotation_gutter_fold_button:!0,annotation_gutter_resize_handle:!0,annotation_gutter_focus_on_click:!0,annotation_gutter_width:300,tag_completion:!0,tag_correcter:!0,clipboard_remove_syntax:!0,edit_info:!0,toolbar_preview_button:!0,toolbar_edit_button:!0,toolbar_show_buttons_labels:!0,status_bar_preview_button:!0,status_bar_edit_button:!0,status_bar_metadata_button:!0,database_workers:2,post_processor:!0,live_preview:!0,alternative_cursor_movement:!0,enable_metadata:!1,enable_author_metadata:!1,enable_timestamp_metadata:!1,enable_completed_metadata:!1,enable_style_metadata:!1,enable_color_metadata:!1,add_metadata:!1,add_author_metadata:!1,add_timestamp_metadata:!1,add_completed_metadata:!1,add_style_metadata:!1,add_color_metadata:!1,author:"",suggestion_mode_operations:{cursor_movement:{addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",highlight:"ignore_metadata",comment:"ignore_completely"},bracket_movement:{addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",highlight:"stay_inside",comment:"stay_inside"}}},Uf=new Set(["live_preview","diff_gutter","annotation_gutter","annotation_gutter_focus_on_click","comment_style","tag_completion","tag_correcter"]),jf=new Set(["enable_metadata"]),Yf=new Set(["enable_metadata"]),Gr=(s=>(s[s.ADDITION=1]="ADDITION",s[s.DELETION=2]="DELETION",s[s.SUBSTITUTION=4]="SUBSTITUTION",s[s.HIGHLIGHT=8]="HIGHLIGHT",s[s.COMMENT=16]="COMMENT",s))(Gr||{});var qr=require("obsidian");var mr=(i=!1)=>{let t=zr(qr.Menu.prototype,{onEnter:r=>function(s){let o=this.items[this.selected];return o&&o instanceof qr.MenuItem&&o.handleEvent(s)||!0},onMenuClick:r=>function(s){if(!i||this.currentSubmenu&&this.currentSubmenu.dom.contains(s.target))s.stopImmediatePropagation();else return r&&r.apply(this,[s])},hide:r=>function(){return this.parentMenu||n(),r&&r.apply(this)}}),e=zr(qr.MenuItem.prototype,{setChecked:r=>function(...s){return this.checkIconEl&&(this.checkIconEl.remove(),this.checkIconEl=void 0),r&&r.apply(this,s)}}),n=()=>{t(),e()};return n},Kf=(i,t,e,n=()=>{})=>zr(qr.MarkdownView.prototype,{setState:r=>async function(...s){return s[0]&&await i(this,s[0]),r&&r.apply(this,s)},getState:r=>function(){let s=r&&r.apply(this);return s&&t(this,s),s},setData:r=>async function(...s){s[1]&&e(this);let o=r&&r.apply(this,s);return s[1]&&n(this),o}}),Jf=(i,t,e)=>zr(i.app.plugins,{uninstallPlugin:n=>async(...r)=>{try{r[0]===t&&await e()}catch{}n&&await n.apply(i.app.plugins,r)}});var mh=require("obsidian");function Vm(i){if(i.children.length>0){let t=createSpan({cls:"cmtr-metadata-info-separator",text:" \u2022 "});i.appendChild(t)}}function vr(i,t,e="icon"){let n=createDiv({cls:["cmtr-metadata-info"].concat(t??[])});if(i.fields.author){let r=createSpan({cls:"cmtr-metadata-info-field"});if(e==="label"){let o=createSpan({cls:"cmtr-metadata-info-label",text:"Author: "});r.appendChild(o)}else if(e==="icon"){let o=createSpan({cls:"cmtr-metadata-info-icon"});(0,mh.setIcon)(o,"user"),r.appendChild(o)}let s=createSpan({cls:"cmtr-metadata-info-author-data",text:i.fields.author});r.appendChild(s),n.appendChild(r)}if(i.fields.time){e!=="icon"&&Vm(n);let r=createSpan({cls:"cmtr-metadata-info-field"});if(e==="label"){let o=createSpan({cls:"cmtr-metadata-info-label",text:"Updated at: "});r.appendChild(o)}else if(e==="icon"){let o=createSpan({cls:"cmtr-metadata-info-icon"});(0,mh.setIcon)(o,"clock"),r.appendChild(o)}let s=createSpan({cls:"cmtr-metadata-info-time-data",text:window.moment.unix(i.fields.time).format("MMM DD YYYY, HH:mm")});r.appendChild(s),n.appendChild(r)}return n}var vh=class extends We.Component{constructor(e,n){super();this.range=e;this.marker=n;this.text=e.unwrap(),this.annotation_container=this.marker.annotation_thread.createDiv({cls:"cmtr-anno-gutter-annotation"}),this.annotation_container.addEventListener("blur",this.renderPreview.bind(this)),this.annotation_container.addEventListener("dblclick",this.renderSource.bind(this)),this.annotation_container.addEventListener("contextmenu",this.onCommentContextmenu.bind(this)),this.range.metadata&&(this.metadata_view=vr(this.range),this.annotation_container.appendChild(this.metadata_view)),this.annotation_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-view"}),this.renderPreview()}text;new_text=null;annotation_container;metadata_view=null;annotation_view;currentMode=null;editMode=null;onload(){super.onload()}onunload(){super.onunload(),this.annotation_container.remove(),this.editMode=null}renderSource(e){if(this.range.type!=="comment")new We.Notice("[Commentator] You can only edit comments.");else{if(e?.stopPropagation(),this.currentMode==="source")return;let{app:n}=this.marker.view.state.field(We.editorInfoField);if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!0),this.range.fields.author&&this.range.fields.author!==n.plugins.plugins.commentator.settings.author){new We.Notice("[Commentator] You cannot edit comments from other authors.");return}this.annotation_view.empty(),this.editMode=this.addChild(new gr(n,this.annotation_view,{value:this.text,cls:"cmtr-anno-gutter-annotation-editor",onSubmit:r=>{this.new_text=r.get(),this.renderPreview()},filteredExtensions:[n.plugins.plugins.commentator.editorExtensions],onBlur:this.renderPreview.bind(this)})),this.currentMode="source"}}renderPreview(){if(this.currentMode!=="preview")if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!1),this.text===this.new_text||this.new_text===null){let{app:e}=this.marker.view.state.field(We.editorInfoField);if(this.new_text=null,this.editMode&&(this.removeChild(this.editMode),this.editMode=null),this.annotation_view.empty(),this.range.type!=="substitution"){let n="";switch(this.range.type){case"addition":n="Added: ";break;case"deletion":n="Deleted: ";break;case"highlight":break;case"comment":break}let r=createDiv({cls:"cmtr-anno-gutter-annotation-content"});We.MarkdownRenderer.render(e,this.text||" ",r,"",this).then(()=>{(r.children[0]??r).prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:n})),this.annotation_view.append(...r.childNodes),r.remove()})}else{let n=this.range.unwrap_parts(),r=createDiv(),s=createDiv();We.MarkdownRenderer.render(e,n[0]||" ",r,"",this).then(()=>{(r.children[0]??r).prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Changed: "})),this.annotation_view.append(...r.childNodes),We.MarkdownRenderer.render(e,n[1]||" ",s,"",this).then(()=>{(s.children[0]??s).prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"To: "})),this.annotation_view.append(...s.childNodes),r.remove(),s.remove()})})}this.annotation_view.addClass("cmtr-anno-gutter-annotation-"+this.range.type),this.currentMode="preview"}else{let e=this.marker.view.state.field(Pi);this.text=this.new_text,window.setTimeout(()=>{this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:Wr(e,"comment",this.new_text)}})})}}onCommentContextmenu(e){e.preventDefault(),e.stopPropagation(),mr(!0);let n=new We.Menu;this.range.type!=="comment"&&this.range.type!=="highlight"&&(n.addItem(r=>{r.setTitle("Accept changes").setIcon("check").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:Wn(this.marker.view.state,this.range.from,this.range.to)})})}),n.addItem(r=>{r.setTitle("Reject changes").setIcon("cross").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:Un(this.marker.view.state,this.range.from,this.range.to)})})})),this.range.type==="comment"?(this.range.replies.length>0&&n.addItem(r=>{r.setTitle("Close comment thread").setIcon("message-square-off").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.full_range_front,to:this.range.full_range_back,insert:""}})})}),n.addItem(r=>{r.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ji(this.marker.view,this.range)})}),n.addItem(r=>{r.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(()=>{this.renderSource()})}),n.addItem(r=>{r.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:""}})})})):this.range.type!=="highlight"?(n.addItem(r=>{r.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ji(this.marker.view,this.range)})}),this.range.replies.length>0&&n.addItem(r=>{r.setTitle("Remove all comments").setIcon("message-square-x").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.replies[0].from,to:this.range.replies[this.range.replies.length-1].to,insert:""}})})})):n.addItem(r=>{r.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ji(this.marker.view,this.range)})}),n.addItem(r=>{r.setTitle("Fold gutter").setSection("gutter-controls").setIcon("arrow-right-from-line").onClick(()=>{this.marker.view.dispatch({annotations:[br.of(null)]})})}),n.addItem(r=>{let s=r.setTitle("Included annotations").setIcon("eye").setSection("gutter-controls").setSubmenu(),o=this.marker.view.state.facet(an);for(let{title:a,icon:l,value:u}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])s.addItem(f=>{f.setTitle(a).setIcon(l).setChecked((o&u)!==0).onClick(()=>{o^=u,f.setChecked((o&u)!==0),this.marker.view.dispatch(this.marker.view.state.update({effects:[Ss.reconfigure(an.of(o))]}))})})}),n.showAtPosition(e)}},cl=class extends Qf.GutterMarker{constructor(e,n,r,s=0){super();this.annotation=e;this.annotations=n;this.view=r;this.itr=s}annotation_thread;component=new We.Component;preventUnload=!1;eq(e){return this.itr===e.itr&&this.annotations===e.annotations&&this.annotations[0].equals(e.annotations[0])}onCommentThreadClick(){this.view.dispatch({annotations:[dl.of({marker:this,index:-1,scroll:!0,focus_markup:!0})]}),this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0)}toDOM(){this.annotation_thread=createDiv({cls:"cmtr-anno-gutter-thread"}),this.annotation_thread.addEventListener("click",this.onCommentThreadClick.bind(this));for(let e of this.annotations)this.component.addChild(new vh(e,this));return this.component.load(),this.annotation_thread}focus(){this.annotation_thread.focus()}focus_annotation(e=-1,n=!1){e===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0):e>=0&&e{let r=this.view.lineBlockAt(this.annotations[0].from).top-100;this.view.scrollDOM.scrollTo({top:r,behavior:"smooth"})},200)}unfocus_annotation(e=-1){e===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!1):this.annotation_thread.children.item(e).classList.toggle("cmtr-anno-gutter-thread-highlight",!1)}destroy(e){this.component.unload(),this.annotation_thread.remove(),super.destroy(e)}};function Xf(i,t,e){let n=i.field(We.editorEditorField),r=(e&1)!==0,s=(e&2)!==0,o=(e&4)!==0,a=(e&8)!==0,l=(e&16)!==0,u=[];for(let f of t){let h=f.full_thread;switch(l||(h=h.slice(0,1)),f.type){case"addition":r||h.shift();break;case"deletion":s||h.shift();break;case"substitution":o||h.shift();break;case"highlight":a||h.shift();break;case"comment":l||h.shift();break}if(h.length){let c=new cl(f,h,n,Zf);c.preventUnload=!0,u.push(c.range(f.from,f.to))}}return u}var Zf=0,qn=fl.StateField.define({create(i){let t=i.field(Pt).ranges.ranges.reduce((e,n)=>{let r=n.base_range;return e.includes(r)||e.push(r),e},[]);return fl.RangeSet.of(Xf(i,t,i.facet(an)))},update(i,t){let e=t.state.facet(an);if(t.startState.facet(an)!==e)return this.create(t.state);if(!t.docChanged)return i;Zf+=1;let n=[];for(let s of t.state.field(Pt).inserted_ranges)n.includes(s.base_range)||n.push(s.base_range);let r=t.state.field(Pt).deleted_ranges.map(s=>s.base_range);return i.map(t.changes).update({filter:(s,o,a)=>{let l=!r.includes(a.annotation);return a.preventUnload=l,l},add:Xf(t.state,n.map(s=>s.full_thread[0]),e)})}});var td=require("@codemirror/view"),li=require("obsidian");var gl=require("obsidian");var zm={mode:"preview",focus_mode:"click",onViewSwitch:()=>{},isEditable:()=>!0},pl=class extends gl.Component{constructor(e,n,r={}){super();this.app=e;this.container=n;this.options={...ul,...zm,...r},this.clickContainer=this.options.click_container??this.container,this.options.mode==="edit"?this.renderEdit():this.renderPreview()}options;currentMode;clickContainer;cleanup(){if(this.container.children.length!==0){this.container.className="";for(let e of this._children)e.unload();this._children=[],this.container.empty()}}unload(){this.container.remove(),super.unload()}getMode(){return this.currentMode}switchMode(){this.currentMode==="edit"?this.renderPreview():this.renderEdit(),this.options.onViewSwitch(this)}setMode(e){e==="edit"?this.renderEdit():this.renderPreview(),this.options.onViewSwitch(this)}renderEdit(){this.currentMode==="edit"||!this.options.isEditable(this)||(this.currentMode="edit",this.cleanup(),this.options.editor_cls&&this.container.addClass(...[].concat(this.options.editor_cls)),this.addChild(new gr(this.app,this.container,{...this.options,onSubmit:e=>{this.options.onSubmit(e),this.switchMode()},onBlur:e=>{this.options.onBlur(e),this.switchMode()},onEscape:e=>{this.options.onEscape(e),this.switchMode()}})))}renderPreview(){if(this.currentMode==="preview")return;this.currentMode="preview",this.cleanup(),this.options.preview_cls&&this.container.addClass(...[].concat(this.options.preview_cls)),gl.MarkdownRenderer.render(this.app,this.options.value,this.container,"",this);let e=()=>{this.clickContainer.removeEventListener(this.options.focus_mode,e),setImmediate(()=>{this.switchMode()})};this.clickContainer.addEventListener(this.options.focus_mode,e)}};function bh(i,t,e,n=!1){let r=e??t.text;!e&&n&&(t.to>=r.length&&!r.endsWith(me[t.type].at(-1))?r=t.unwrap_bracket(!0):r=t.unwrap());let s=createSpan({cls:"cmtr-comment-icon"});(0,li.setIcon)(s,"message-square");let o=null,a=new li.Component;return s.onmouseenter=()=>{if(o)return;o=createDiv({cls:"cmtr-comment-tooltip"}),li.MarkdownRenderer.render(i,r,o,"",a),a.load(),s.appendChild(o);let l=s.getBoundingClientRect(),u=o.getBoundingClientRect();o.style.left=l.x-u.x+12+"px"},s.onmouseleave=()=>{o&&(a.unload(),s.removeChild(o),o=null)},s}var Oo=class extends td.WidgetType{constructor(e,n,r=!1){super();this.view=e;this.range=n;this.annotation_gutter=r;this.component=new li.Component}tooltip=null;icon=null;component;focused=!1;context_menu=null;setFocused(e){this.icon.classList.toggle("cmtr-comment-icon-focused",e),this.focused=e}renderRange(e,n,r=[]){let s=createDiv({cls:r});n.metadata&&s.appendChild(vr(n,"cmtr-comment-tooltip-metadata"));let o=s.appendChild(createDiv()),a=this.component.addChild(new pl(e,o,{value:n.unwrap(),editor_cls:["markdown-source-view","mod-cm6","cmtr-comment-tooltip-editor"],preview_cls:["cmtr-comment-tooltip-preview"],click_container:s,filteredExtensions:[e.plugins.plugins.commentator.editorExtensions],onSubmit:l=>{this.view.dispatch(this.view.state.update({changes:{from:n.from,to:n.to,insert:Wr(this.view.state.field(Pi),n.type,l.get())}}))},isEditable:l=>n.fields.author&&n.fields.author!==e.plugins.plugins.commentator.settings.author?(new li.Notice("[Commentator] You cannot edit comments from other authors."),!1):!0}));return s.addEventListener("contextmenu",l=>{l.preventDefault(),l.stopPropagation();let u=new li.Menu;this.context_menu=u,u.dom.addEventListener("click",()=>{this.setFocused(!0)}),u.onHide(()=>{this.context_menu=null}),n.replies.length>0&&u.addItem(f=>{f.setTitle("Close comment thread").setIcon("message-square-off").setSection("close-annotation").onClick(()=>{this.view.dispatch({changes:{from:n.full_range_front,to:n.full_range_back,insert:""}}),this.unrenderTooltip()})}),u.addItem(f=>{f.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{let h=this.tooltip.appendChild(createDiv({cls:"cmtr-comment-tooltip-range cmtr-comment-tooltip-reply"})),c=this.component.addChild(new gr(e,h,{value:"",cls:["markdown-source-view","mod-cm6","cmtr-comment-tooltip-editor"],filteredExtensions:[e.plugins.plugins.commentator.editorExtensions],onSubmit:p=>{this.view.dispatch(this.view.state.update({changes:{from:n.full_range_back,to:n.full_range_back,insert:Wr(this.view.state.field(Pi),n.type,p.get())}})),this.unrenderTooltip()},onEscape:()=>{c.unload(),h.remove()},onBlur:()=>{c.unload(),h.remove()}}))})}),u.addItem(f=>{f.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(()=>{a.setMode("edit")})}),u.addItem(f=>{f.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(h=>{this.tooltip.removeChild(s),this.view.dispatch({changes:{from:n.from,to:n.to,insert:""}}),a.unload()})}),u.showAtMouseEvent(l)}),s}renderTooltip(){if(!this.tooltip){let{app:e}=this.view.state.field(li.editorInfoField);this.tooltip=createDiv({cls:"cmtr-comment-tooltip popover hover-popover"}),this.component.registerDomEvent(document,"click",l=>{this.tooltip&&!(this.context_menu&&this.context_menu.dom.contains(l.target))&&(this.tooltip.contains(l.target)?(this.setFocused(!0),l.stopPropagation()):(this.unrenderTooltip(),this.setFocused(!1)))}),this.tooltip.addEventListener("mouseleave",l=>{!this.focused&&!this.context_menu&&!this.tooltip.contains(l.relatedTarget)&&this.unrenderTooltip()}),this.tooltip.appendChild(this.renderRange(e,this.range,["cmtr-comment-tooltip-range cmtr-comment-tooltip-base"]));for(let l of this.range.replies)this.tooltip.appendChild(this.renderRange(e,l,["cmtr-comment-tooltip-range","cmtr-comment-tooltip-reply"]));this.component.load(),document.body.appendChild(this.tooltip);let n=this.icon.getBoundingClientRect(),r=this.tooltip.getBoundingClientRect(),s=this.view.contentDOM.getBoundingClientRect(),o=Math.clamp(n.x-r.x-r.width/2+12,e.vault.getConfig("readableLineLength")?0:s.x,s.x+s.width-r.width-12),a=n.y+(n.height+r.height>this.view.scrollDOM.clientHeight?-r.height:n.height)+4;this.tooltip.style.left=o+"px",this.tooltip.style.top=a+"px"}}focusAnnotation(e){this.view.dispatch({annotations:[Tn.of({from:this.range.from,to:this.range.to})]})}unrenderTooltip(){this.component.unload(),this.tooltip&&(this.tooltip.remove(),this.tooltip=null),this.setFocused(!1)}toDOM(e){return this.icon=createSpan({cls:"cmtr-comment-icon"}),(0,li.setIcon)(this.icon,"message-square"),this.annotation_gutter&&(this.icon.onclick=n=>this.focusAnnotation(n),this.icon.oncontextmenu=n=>{n.preventDefault();let r=new li.Menu;r.addItem(s=>{s.setTitle("Close comment thread").setIcon("message-square-off").setSection("close-annotation").onClick(()=>{this.view.dispatch({changes:{from:this.range.full_range_front,to:this.range.full_range_back,insert:""}})})}),r.addItem(s=>{s.setTitle("Focus annotation").setSection("comment-handling").setIcon("eye").onClick(o=>this.focusAnnotation(o))}),r.addItem(s=>{s.setTitle("Add comment").setSection("comment-handling").setIcon("message-square").onClick(o=>{o.preventDefault(),Ji(e,this.range)})}),r.showAtMouseEvent(n)}),this.range.length&&(this.icon.onmouseenter=()=>{this.renderTooltip()},this.icon.onclick=n=>{this.renderTooltip(),this.setFocused(!0),this.focusAnnotation(n),n.stopPropagation()},this.icon.onmouseleave=n=>{!this.focused&&!this.context_menu&&this.tooltip&&!(this.tooltip.contains(n.relatedTarget)||this.icon.getBoundingClientRect().bottom-n.clientY<6)&&(this.unrenderTooltip(),this.focused=!1)}),this.icon}destroy(e){this.unrenderTooltip(),super.destroy(e)}};var Ur=require("@codemirror/state"),Ns=require("@codemirror/view");var Ls=Ur.StateEffect.define(),Do=Ur.StateField.define({create(i){return{from:i.selection.main.from,to:i.selection.main.to}},update(i,t){for(let e of t.effects)if(e.is(Ls))return e.value;return i}}),_h=Ur.StateField.define({create(i){return Ns.Decoration.none},update(i,t){let e=t.startState.field(Do,!1),n=t.state.field(Do);if(e!==n){let r=t.state.field(Pt).ranges.ranges_in_interval(n.from,n.to);return r.length&&r[0].base_range===r.at(-1)?.base_range&&n.from>=r[0].from&&n.to<=r.at(-1).to?Ur.RangeSet.of([Ns.Decoration.mark({attributes:{class:"cmtr-focused"}}).range(r[0].full_range_front,r[0].full_range_back)]):Ns.Decoration.none}else return i},provide(i){return Ns.EditorView.decorations.from(i)}});var Io=require("@codemirror/state"),jn=require("@codemirror/view"),Yr=require("obsidian");var Ro=jn.Decoration.replace({}),wh=(i,t="",e=!1)=>jn.Decoration.mark({attributes:{"data-contents":"string","data-type":"cmtr-"+i.repr.toLowerCase(),class:t,style:e&&i.fields.color?`background-color: #${i.fields.color};`:""}});function Ni(i,t,e,n=!1){n||(e===-1?i.push(Ro.range(t.from,t.from+3)):e===1?i.push(Ro.range(t.to-3,t.to)):i.push(Ro.range(t.middle,t.middle+2)))}function $o(i,t,e=!1){!t.metadata||e||i.push(Ro.range(t.from+3,t.metadata+2))}function ml(i,t){i.push(Ro.range(t.from,t.to))}function jr(i,t,e,n=0,r=!1,s=!0){let o=r?0:3;n===0?t.empty()||i.push(wh(t,e,s).range(t.from+o,t.to-o)):n<0?t.part_is_empty(!0)||i.push(wh(t,e,s).range(t.from+o,t.middle)):n>0&&(t.part_is_empty(!1)||i.push(wh(t,e,s).range(t.middle+2,t.to-o)))}function yh(i,t,e=""){Ni(i,t,-1),$o(i,t),jr(i,t,e),Ni(i,t,1)}function vl(i,t,e,n,r,s){let o=[],{show_styling:a,show_syntax:l,show_metadata:u,show_comment:f}=s.markup_focus[r];for(let h of t)if(n===0){let c=e?e.ranges.some(_=>h.partially_in_full_range(_.from,_.to)):void 0,p=`cmtr-inline cmtr-${h.repr.toLowerCase()} `+(h.fields.style||"");h.replies.length&&(p+=" cmtr-has-reply");let g=c?l:void 0,m=c?u:void 0,v=c?a:void 0;!(f&&c)&&h.type==="comment"&&s.comment_style!=="inline"?s.comment_style==="icon"&&h.base_range===h?o.push(jn.Decoration.replace({widget:new Oo(i,h,s.annotation_gutter)}).range(h.from,h.to)):o.push(jn.Decoration.replace({}).range(h.from,h.to)):(Ni(o,h,-1,g),$o(o,h,m),h.type==="substitution"?(jr(o,h,p+" cmtr-deletion",-1,!1,v),Ni(o,h,0,g),jr(o,h,p+" cmtr-addition",1,!1,v)):jr(o,h,p,0,!1,v),Ni(o,h,1,g))}else n===1?h.type==="addition"?yh(o,h,"cmtr-accepted"):h.type==="deletion"?ml(o,h):h.type==="substitution"?(Ni(o,h,-1),$o(o,h),Ni(o,h,0),jr(o,h,"cmtr-accepted",1),Ni(o,h,1)):h.type==="comment"?ml(o,h):yh(o,h,""):n===2&&(h.type==="addition"?ml(o,h):h.type==="deletion"?(Ni(o,h,-1),$o(o,h),jr(o,h,"cmtr-accepted"),Ni(o,h,1)):h.type==="substitution"?(Ni(o,h,-1),$o(o,h),jr(o,h,"cmtr-accepted",-1),Ni(o,h,0),Ni(o,h,1)):h.type==="comment"?ml(o,h):yh(o,h,""));return o}var xh=i=>Io.StateField.define({create(t){if(!t.field(Yr.editorLivePreviewField))return jn.Decoration.none;let n=t.facet(qe),r=t.facet(xi),s=t.field(Pt),o=t.field(Yr.editorEditorField);return Io.RangeSet.of(vl(o,s.ranges.ranges,null,n,r,i))},update(t,e){let n=e.state.field(Yr.editorLivePreviewField);if(!n)return jn.Decoration.none;let r=e.state.facet(qe),s=e.state.facet(xi),o=e.state.field(Pt),a=e.state.field(Yr.editorEditorField);if(n!==e.startState.field(Yr.editorLivePreviewField)||r!==e.startState.facet(qe)||e.effects.some(l=>l.is(As)))return Io.RangeSet.of(vl(a,o.ranges.ranges,e.state.selection,r,s,i));if(e.docChanged||!e.docChanged&&o.inserted_ranges.length){let l=0;return t.update({filter:(u,f,h)=>{for(;l{for(;fi.some(t=>t)}),kh=hn.Facet.define(),Tn=hn.Annotation.define(),br=hn.Annotation.define(),dl=hn.Annotation.define(),_l=hn.Annotation.define(),wl=hn.Annotation.define(),yl=hn.Annotation.define(),xl=hn.Annotation.define(),bl=class extends Rs{previously_focused=void 0;constructor(t){super(t,ed,kh),t.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{t.dispatch(t.state.update({effects:[Sl.reconfigure([])]}))}))}debouncedMoveGutter=(0,un.debounce)(this.moveGutter.bind(this),200);createGutters(t){return t.state.facet(kh).map(e=>new Mh(t,e,this.dom))}insertGutters(t){t.contentDOM.parentNode.insertBefore(this.dom,t.contentDOM.nextSibling)}insertDetachedGutters(t){this.view.contentDOM.parentNode.insertBefore(this.dom,this.view.contentDOM.nextSibling)}getUpdateContexts(){return this.gutters.map(t=>new Sh(t,this.view.viewport,-this.view.documentPadding.top))}update(t){for(let e of t.transactions){let n=e.annotation(dl);if(n){let{marker:r,index:s,scroll:o=!1,focus_markup:a=!1}=n;this.unfocusAnnotation(),this.focusAnnotation(r,s,o,a)}}super.update(t)}unfocusAnnotation(){this.previously_focused?.unfocus_annotation(),this.previously_focused=void 0}focusAnnotation(t,e,n=!1,r=!1){this.previously_focused=t,this.debouncedMoveGutter(t),t.focus_annotation(e,n),r&&window.setTimeout(()=>{this.view.dispatch(this.view.state.update({effects:[Ls.of({from:t.annotation.from,to:t.annotation.full_range_back})]}))})}updateGutters(t){let e=t.transactions.flatMap(n=>n.annotation(Tn)).find(n=>n);if((e||t.startState.selection!==t.state.selection)&&this.unfocusAnnotation(),e){let{from:n,to:r,index:s=-1,scroll:o=!1}=e;t:for(let a of this.gutters[0].elements)if(n>=a.block.from){for(let l of a.markers)if(n>=l.annotation.from&&r<=l.annotation.full_range_back){this.focusAnnotation(l,s,o);break t}}else if(nl.markers.includes(t));if(!n)return;let r=n.markers.indexOf(t),s=n.block.top,o=n.dom.children[r].offsetTop,a=s-o;if(Math.abs(a)>=10&&a){let l=e.elements[0];l.dom.style.marginTop=parseInt(l.dom.style.marginTop||"0")+a+"px"}}foldGutter(){this.gutters[0].foldGutter()}},kl=al(bl);function id(i){return ll(kl,i,kh,ed)}var Sh=class extends Co{constructor(e,n,r){super(e,n,r);this.gutter=e;this.height=r;this.previous_element_end=r}previous_element_end=0;new_gutter_elements=[];added_elements=[];async addElement(e,n,r){let s=Math.max(n.top-this.previous_element_end,0),o=s<=0?this.previous_element_end:n.top;r.sort((f,h)=>f.annotation.from-h.annotation.from);let l=this.gutter.elements[this.i]?.dom.clientHeight||36,u=this.gutter.elements.findIndex(f=>ol(f.markers,r));if(u!==-1){let f=this.gutter.elements[u];for(let h=this.i;h{this.folded=!this.folded,this.view.state.field(un.editorInfoField).app.workspace.requestSaveLayout(),this.foldGutter()},this.setFoldButtonState(),this.fold_button_el=createDiv({cls:["cmtr-anno-gutter-button"]}),this.fold_button_el.appendChild(e),this.gutterDom.appendChild(this.fold_button_el)}createResizeHandle(){this.resize_handle_el=createEl("hr",{cls:["cmtr-anno-gutter-resize-handle"]}),this.resize_handle_el.style.display=this.view.state.field(qn).size&&!this.folded?"":"none",this.resize_handle_el.addEventListener("mousedown",e=>{let n=e.clientX,r=this.view.state.field(un.editorInfoField).app.vault.getConfig("readableLineLength"),s=document.styleSheets[0],o=(0,un.debounce)(f=>{this.width=Math.round(Math.max(0,f)),this.view.state.field(un.editorInfoField).app.workspace.requestSaveLayout(),this.dom.style.width=this.width+"px",this.view.dom.style.setProperty("--cmtr-anno-gutter-width",this.width+"px"),r&&(s.deleteRule(s.cssRules.length-1),s.insertRule(`.cmtr-anno-gutter-resizing .cm-line { width: ${this.view.contentDOM.clientWidth}px !important; }`,s.cssRules.length),this.gutter_position=this.view.scrollDOM.getBoundingClientRect().right-this.view.contentDOM.getBoundingClientRect().right+Po)},25);this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!0),this.view.scrollDOM.classList.toggle("cmtr-anno-gutter-resizing",!0);let a=parseInt(this.dom.style.width.slice(0,-2)),l=f=>{let h=f.clientX-n;return n=f.clientX,a-=h,o(a),!0},u=()=>{document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",u),this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!1),this.view.scrollDOM.classList.toggle("cmtr-anno-gutter-resizing",!1),r&&s.deleteRule(s.cssRules.length-1)};return document.addEventListener("mousemove",l),document.addEventListener("mouseup",u),!0}),this.gutterDom.appendChild(this.resize_handle_el)}setFoldButtonState(){this.fold_button_el&&(this.folded?(this.fold_button_el.children[0].setAttribute("style","rotate: -180deg;"),this.fold_button_el.children[0].ariaLabel="Unfold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="none")):(this.fold_button_el.children[0].setAttribute("style","rotate: 0deg;"),this.fold_button_el.children[0].ariaLabel="Fold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="")))}foldGutter(){if(this.setFoldButtonState(),this.folded?this.elements.forEach(e=>{Array.from(e.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(n=>{n.setAttribute("style",`max-height: ${n.clientHeight}px; overflow: hidden;`)})}):this.dom.addEventListener("transitionend",()=>{this.elements.forEach(e=>{Array.from(e.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(n=>{n.removeAttribute("style")})})},{once:!0}),this.dom.style.width=this.folded?"0":this.width+"px",this.gutterDom.style.marginInlineStart=this.folded?"0":Po+"px",this.view.state.field(un.editorInfoField).app.vault.getConfig("readableLineLength")){let e=parseInt(getComputedStyle(this.view.scrollDOM).getPropertyValue("--file-line-width").trim()),n=Math.max(0,this.view.scrollDOM.innerWidth-e),r=Math.max(0,n-this.width),s=(this.folded?n:r)/2,o=(this.folded?r:n)/2;this.view.contentDOM.style.width=this.view.contentDOM.clientWidth+(this.folded?Po:0)+"px !important",this.view.scrollDOM.children[0].setAttribute("style",`margin: 0 ${o}px; transition: margin 0.4s ease-in-out, max-width 0.4s ease-in-out;`),this.folded||this.view.dom.style.setProperty("--cmtr-anno-gutter-width",this.width+"px"),setTimeout(()=>{this.view.scrollDOM.children[0].setAttribute("style",`margin: 0 ${s}px; transition: margin 0.4s ease-in-out, max-width 0.4s ease-in-out;`),this.dom.addEventListener("transitionend",()=>{this.view.contentDOM.removeAttribute("style"),this.view.scrollDOM.children[0].removeAttribute("style"),this.folded&&this.view.dom.style.setProperty("--cmtr-anno-gutter-width","0px")},{once:!0})})}}update(e){let n=super.update(e),r=e.state.field(qn);for(let s of e.transactions){let o=s.annotation(br),a=s.annotation(_l),l=s.annotation(wl),u=s.annotation(yl),f=s.annotation(xl);a!==void 0&&(this.width=a,!this.hide_on_empty&&!this.folded&&(this.dom.style.width=a+"px",this.setFoldButtonState()),this.view.dom.style.setProperty("--cmtr-anno-gutter-width",this.width+"px")),o!==void 0&&(o===null?(this.folded=!this.folded,this.view.state.field(un.editorInfoField).app.workspace.requestSaveLayout()):this.folded=o,this.foldGutter()),l!==void 0&&(this.hide_on_empty=l,this.hide_on_empty&&r.size===0?this.dom.style.width="0":this.dom.style.width=this.width+"px",this.view.dom.style.setProperty("--cmtr-anno-gutter-width",this.width+"px")),u!==void 0&&(this.add_fold_button=u,this.add_fold_button&&!this.fold_button_el?this.createFoldButton():!this.add_fold_button&&this.fold_button_el&&(this.fold_button_el.remove(),this.fold_button_el=void 0),this.setFoldButtonState()),f!==void 0&&(this.add_resize_handle=f,this.add_resize_handle&&!this.resize_handle_el?this.createResizeHandle():!this.add_resize_handle&&this.resize_handle_el&&(this.resize_handle_el.remove(),this.resize_handle_el=void 0))}return r.size!==e.startState.field(qn).size&&(r.size===0?(this.fold_button_el&&(this.fold_button_el.style.display="none"),this.resize_handle_el&&(this.resize_handle_el.style.display="none"),this.hide_on_empty&&(this.dom.style.width="0")):(this.fold_button_el&&(this.fold_button_el.style.display=""),this.resize_handle_el&&(this.resize_handle_el.style.display=""),this.folded||(this.dom.style.width=this.width+"px"))),n}destroy(){this.fold_button_el?.remove(),this.resize_handle_el?.remove(),super.destroy()}},Eh=class extends $s{constructor(e,n,r,s,o=null){super(e,n,r,s);this.block=o}update(e,n,r,s,o=null){this.block=o,this.above!=r&&(this.dom.style.marginTop=(this.above=r)?r+"px":""),ol(this.markers,s)||this.setMarkers(e,s)}};var rd=i=>[qn,id({class:"cmtr-anno-gutter "+(i.app.vault.getConfig("cssTheme")==="Minimal"?" is-minimal":""),markers:t=>t.state.field(qn),foldState:i.settings.annotation_gutter_default_fold_state,width:i.settings.annotation_gutter_width,hideOnEmpty:i.settings.annotation_gutter_hide_empty,includeFoldButton:i.settings.annotation_gutter_fold_button,includeResizeHandle:i.settings.annotation_gutter_resize_handle})],Sl=new nd.Compartment;var ad=require("obsidian"),ld=require("@codemirror/state");var No=require("@codemirror/state"),vx=require("@codemirror/view");var sd=No.Facet.define({combine:i=>i.some(t=>t)}),Th=No.Facet.define(),Ml=No.Annotation.define(),Ah=class extends Rs{constructor(t){super(t,sd,Th),t.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{t.dispatch(t.state.update({effects:[El.reconfigure([])]}))}))}createGutters(t){return t.state.facet(Th).map(e=>new Ch(t,e))}},Ch=class extends pr{constructor(e,n){super(e,n);this.view=e;this.config=n;this.hide_on_empty=n.hideOnEmpty}hide_on_empty=!1;showing=!0;update(e){let n=super.update(e);for(let r of e.transactions){let s=r.annotation(Ml);s!==void 0&&(this.hide_on_empty=s)}return this.showing&&this.hide_on_empty&&e.state.field(Pt).ranges.empty()?(this.dom.parentElement.classList.add("gutter-hidden"),this.showing=!1):!this.showing&&(!this.hide_on_empty||!e.state.field(Pt).ranges.empty())&&(this.dom.parentElement.classList.remove("gutter-hidden"),this.showing=!0),n}},Gm=al(Ah);function od(i){return ll(Gm,i,Th,sd)}var Tl=require("@codemirror/state"),Al=require("@codemirror/view");var Oh=class extends Al.GutterMarker{constructor(e,n,r){super();this.type=e;this.top=n;this.bottom=r}toDOM(){let e="";return this.type.has("addition")&&(e+="cmtr-diff-gutter-addition "),this.type.has("deletion")&&(e+="cmtr-diff-gutter-deletion "),this.type.has("substitution")&&(e+="cmtr-diff-gutter-substitution "),this.top&&(e+="cmtr-diff-gutter-top "),this.bottom&&(e+="cmtr-diff-gutter-bottom "),createDiv({cls:e})}},Dh=Al.ViewPlugin.fromClass(class{markers=Tl.RangeSet.empty;constructMarkers(t){let e=t.state.field(Pt).ranges,n=new Tl.RangeSetBuilder,r={};for(let s of e.ranges_in_interval(t.viewport.from,t.viewport.to)){let o=t.state.doc.lineAt(s.from).number,a=t.state.doc.lineAt(s.to).number,l=Array.from({length:a-o+1},(u,f)=>o+f);r[o]?r[o].isStart=!0:r[o]={isStart:!0,isEnd:!1,types:new Set};for(let u of l)r[u]?(r[u].isEnd=!1,r[u].types.add(s.type)):r[u]={isStart:!1,isEnd:!1,types:new Set([s.type])};r[a]&&(r[a].isEnd=!0)}for(let[s,o]of Object.entries(r)){let a=t.state.doc.line(Number(s));n.add(a.from,a.to,new Oh(o.types,o.isStart,o.isEnd))}this.markers=n.finish()}constructor(t){this.constructMarkers(t)}update(t){(t.docChanged||t.viewportChanged||t.heightChanged)&&this.constructMarkers(t.view)}});var ud=[Dh,od({class:"cmtr-diff-gutter",markers:i=>i.plugin(Dh).markers,domEventHandlers:{click:(i,t,e)=>{let n=new ad.Menu;return n.addItem(r=>{r.setTitle("Accept changes").setIcon("check").onClick(()=>{i.dispatch({changes:Wn(i.state,t.from,t.to)})})}),n.addItem(r=>{r.setTitle("Reject changes").setIcon("cross").onClick(()=>{i.dispatch({changes:Un(i.state,t.from,t.to)})})}),n.showAtMouseEvent(e),!1}}})],El=new ld.Compartment;function hd(i,t){let e={};for(let n in i)i[n]!==t[n]&&(e[n]=i[n]);return e}function cd(i){let t=i.lastIndexOf(".");return t===-1||t===i.length-1||t===0?i:i.slice(0,t)}var qm=i=>Object.entries(gf).map(([t,e])=>({id:`toggle-${t.toLowerCase()}`,name:`Mark as ${t}`,icon:t.toLowerCase(),editor_context:!0,regular_callback:(n,r)=>{dd(n,e,i.settings)}})),Wm=i=>[{id:"accept-all-suggestions",name:"Accept all suggestions",icon:"check-check",editor_context:!0,regular_callback:(t,e)=>{t.cm.dispatch(t.cm.state.update({changes:Wn(t.cm.state)}))}},{id:"reject-all-suggestions",name:"Reject all suggestions",icon:"cross",editor_context:!0,regular_callback:(t,e)=>{t.cm.dispatch(t.cm.state.update({changes:Un(t.cm.state)}))}},{id:"accept-selected-suggestions",name:"Accept suggestions in selection",icon:"check",editor_context:!0,check_callback:(t,e,n)=>{let r=$h(e.cm.state);if(t||!r)return r;let o=e.cm.state.selection.ranges.map(a=>Wn(e.cm.state,a.from,a.to));e.cm.dispatch(e.cm.state.update({changes:o}))}},{id:"reject-selected-suggestions",name:"Reject suggestions in selection",icon:"cross",editor_context:!0,check_callback:(t,e,n)=>{let r=$h(e.cm.state);if(t||!r)return r;let o=e.cm.state.selection.ranges.map(a=>Un(e.cm.state,a.from,a.to));e.cm.dispatch(e.cm.state.update({changes:o}))}},{id:"comment",name:"Add comment",icon:"message-square",editor_context:!0,regular_callback:(t,e)=>{Ji(t.cm,t.cm.state.field(Pt).ranges.at_cursor(t.cm.state.selection.main.head))}},{id:"fold-gutter",name:"Fold annotation gutter",icon:"arrow-right-from-line",editor_context:!0,regular_callback:(t,e)=>{t.cm.dispatch({annotations:[br.of(null)]})}},{id:"toggle-preview-mode",name:"Cycle preview mode",icon:"comment",editor_context:!0,regular_callback:(t,e)=>{let n=(t.cm.state.facet(qe)+1)%3;t.cm.dispatch(t.cm.state.update({effects:Ms.reconfigure(qe.of(n))})),i.setPreviewMode(e,n)}},{id:"suggest-mode",name:"Toggle suggestion mode",icon:"file-edit",editor_context:!0,regular_callback:(t,e)=>{let r=t.cm.state.facet(xi)===2?1:2;t.cm.dispatch(t.cm.state.update({effects:[Es.reconfigure(xi.of(r)),Ts.reconfigure(dr(r,i.settings))]})),i.setEditMode(e,r)}},{id:"generate-text-diff",name:"Generate text diff from clipboard",icon:"diff",editor_context:!0,regular_callback:async(t,e)=>{let n=await navigator.clipboard.readText(),r=t.cm.state.field(Pt).ranges,s=t.cm.state.selection.main,o=r.unwrap_in_range(t.cm.state.doc,s.from,s.to).output,a=pd(i.settings,o,n);t.cm.dispatch(t.cm.state.update({changes:[{from:s.from,to:s.to,insert:a}]}))}},{id:"save-clean-copy",name:Rh.Platform.isMacOS?"Duplicate current file without markup":"Make a copy of the current file without markup",icon:"copy",editor_context:!0,regular_callback:async(t,e)=>{if(e.file){let n=i.app.vault.getAvailablePath(cd(e.file.path),e.file.extension),r=await i.app.vault.read(e.file),s=await i.app.vault.copy(e.file,n),o=za(r,(a,l)=>a.unwrap(),t.cm.state.field(Pt).ranges.ranges);await i.app.vault.modify(s,o),await i.app.workspace.getLeaf("tab").openFile(s,{active:!0,eState:{rename:"all"}})}}}],Um=i=>[{id:"view",name:"Open global annotation view",icon:"comment",regular_callback:async()=>{await i.activateView()}}],fd=i=>jm([...qm(i),...Wm(i),...Um(i)]);function jm(i){for(let t of i)Rh.Platform.isMobile||t.editor_context?t.regular_callback?(t.editorCallback=t.regular_callback,delete t.regular_callback):(t.editorCheckCallback=t.check_callback,delete t.check_callback):t.regular_callback?(t.callback=t.regular_callback,delete t.regular_callback):(t.checkCallback=t.check_callback,delete t.check_callback);return i}var gd=i=>i.app.workspace.on("editor-menu",(t,e)=>{let n=e.cm.state.field(Pt).ranges;if(t.addItem(r=>{r.setTitle("Add comment").setIcon("message-square").setSection("commentator").onClick(()=>{Ji(e.cm,n.at_cursor(e.cm.state.selection.main.head))})}),n.contains_range(e.cm.state.selection.main.from,e.cm.state.selection.main.to)&&(t.addItem(r=>{r.setTitle("Accept changes").setIcon("check").setSection("commentator").onClick(()=>{let o=e.cm.state.selection.ranges.map(a=>Wn(e.cm.state,a.from,a.to));e.cm.dispatch(e.cm.state.update({changes:o}))})}),t.addItem(r=>{r.setTitle("Reject changes").setIcon("cross").setSection("commentator").onClick(()=>{let o=e.cm.state.selection.ranges.map(a=>Un(e.cm.state,a.from,a.to));e.cm.dispatch(e.cm.state.update({changes:o}))})}),_f(e.cm.state.selection))){let r=e.cm.state.field(Pt).ranges.at_cursor(e.cm.state.selection.ranges[0].head);t.addItem(s=>{let o=s.setTitle("Set metadata").setIcon("tags").setSection("commentator").setSubmenu();o.addItem(a=>{a.setTitle("Set author").setIcon("lucide-user").onClick(()=>{e.cm.dispatch(e.cm.state.update({changes:r.add_metadata("author",i.settings.author)}))})}),o.addItem(a=>{a.setTitle("Set time").setIcon("lucide-calendar").onClick(()=>{e.cm.dispatch(e.cm.state.update({changes:r.add_metadata("time",Math.round(Date.now()/1e3))}))})}),o.addItem(a=>{a.setTitle("Set completed").setIcon("lucide-check").onClick(()=>{e.cm.dispatch(e.cm.state.update({changes:r.add_metadata("done",!0)}))})})})}}),md=i=>i.app.workspace.on("markdown-viewport-menu",(t,e,n,r)=>{if(i.settings.annotation_gutter){let s=e.editor.cm,o=s.state.field(an);mr(!0),t.addItem(a=>{a.setTitle("Fold gutter").setIcon("arrow-right-from-line").setSection("commentator").onClick(()=>{s.dispatch(s.state.update({annotations:[br.of(null)]}))})}),t.addItem(a=>{let l=a.setTitle("Included annotations").setIcon("eye").setSection("commentator").setSubmenu();for(let{title:u,icon:f,value:h}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])l.addItem(c=>{c.setTitle(u).setIcon(f).setChecked((o&h)!==0).onClick(()=>{o^=h,c.setChecked((o&h)!==0),s.dispatch(s.state.update({effects:[Ss.reconfigure(an.of(o))]}))})})})}});function Bs(i,t){i.scrollIntoView({from:i.offsetToPos(t.from),to:i.offsetToPos(t.to)},!0)}var Cl=require("@codemirror/state"),vd=require("@codemirror/view");var Ih=Cl.Prec.high(vd.EditorView.inputHandler.of((i,t,e,n)=>{let r=i.state.doc.sliceString(t-2,t)+n,s;if((s=mf[r])!==void 0){let o=[{from:t,to:e+1,insert:n+s.join("")}];return i.dispatch({changes:o,selection:Cl.EditorSelection.cursor(e+1)}),!0}return!1}));var Ol=require("@codemirror/state");var Ph=Ol.EditorState.transactionFilter.of(i=>{if(i.isUserEvent("select")){let t=i.startState.selection.main,e=i.selection.main;if(e.anchor===e.head){let n=i.startState.field(Pt).ranges,r=n.at_cursor(t.head),s=n.at_cursor(e.head);if(r&&r!==s&&(r.type==="substitution"||r.type==="highlight")){let o=r.unwrap(),a=!1,l=0,u=o.search(/\S/);u>=1&&(a=!0,o=o.slice(u),l+=u);let f=o.match(/\n\s*\n/g);if(f&&(a=!0,o=o.replace(/\n\s*\n/g,` +`),l+=f.reduce((h,c)=>h+c.length,0)),a)return{changes:[{from:r.from+3,to:r.to-3,insert:o}],selection:Ol.EditorSelection.cursor(e.head-l)}}}}return i});var bd=require("@codemirror/state");var Nh=i=>bd.EditorState.transactionExtender.of(t=>{if(t.selection&&t.newSelection.main!==t.startState.selection.main){let e=[],n=[];return i.annotation_gutter_focus_on_click&&n.push(Tn.of({from:t.selection.main.from,to:t.selection.main.to})),e.push(Ls.of({from:t.selection.main.from,to:t.selection.main.to})),{effects:e,annotations:n}}return{}});var _d=require("@codemirror/state"),Pi;function Lh(i){return Pi=wd(i),Pi}var wd=i=>_d.StateField.define({create(){return i.settings},update(){return i.settings}});var Kr=require("obsidian");async function cn(i,t,e,n=!0){let r=$l(t),s={},o=()=>{};Object.keys(r).length>=100&&(o=rl("Applying operations...","Operations applied.",Object.keys(r).length,3e3,"Please do not apply other operations until this progress bar has completed."));let a=0;for(let[l,u]of Object.entries(r)){let f=i.app.vault.getAbstractFileByPath(l);!f||!(f instanceof Kr.TFile)||(s[l]=await i.app.vault.cachedRead(f),n&&(u=u.flatMap(h=>[h,...h.replies])),u.sort((h,c)=>h.from-c.from),await e(i.app,f,u),o(++a))}i.file_history.push({changes:s,mtime:Date.now()})}async function Bh(i){if(i.file_history.length===0){new Kr.Notice("No changes to undo.",3e3);return}let t=i.file_history.pop();if(!t)return;let{changes:e,mtime:n}=t,r=()=>{};Object.keys(e).length>=100&&(r=rl("Undoing changes...","Changes undone.",Object.keys(e).length,3e3,"Please do not apply other operations until this progress bar has completed."));let s=0;for(let[o,a]of Object.entries(e)){let l=i.app.vault.getAbstractFileByPath(o);if(!(!l||!(l instanceof Kr.TFile))){if(l.stat.mtime>n){new Kr.Notice("File has been modified since the changes were made, skipping: "+o,3e3);continue}await i.app.vault.modify(l,a),r(++s)}}}async function Dl(i,t){let e=i.app.workspace.getLeavesOfType("markdown");if(!e.length)return;let n=e.reduce((o,a)=>(o.activeTime??0)>(a.activeTime??0)?o:a),r=i.app.vault.getAbstractFileByPath(t.path);if(!r||!(r instanceof Kr.TFile))return;await i.app.workspace.revealLeaf(n);let s=n.view;r!==s.file&&await n.openFile(r),Bs(s.editor,t.range)}var Pt=yd.StateField.define({create(i){let t=i.doc.toString(),e=Za.parser.parse(t),n=i.field(Pi),r=new Va(Fh(e,t,n));return{tree:e,fragments:ks.addTree(e),ranges:r,inserted_ranges:r.ranges,deleted_ranges:[]}},update(i,t){let e=t.state.field(Pi);if(t.effects.some(m=>m.is(As)))return this.create(t.state);if(!t.docChanged)return i.inserted_ranges=[],i.deleted_ranges=[],i;let n=[];t.changes.iterChangedRanges((m,v,_,S)=>n.push({fromA:m,toA:v,fromB:_,toB:S}));let r=ks.applyChanges(i.fragments,n),s=t.state.doc.toString(),o=Za.parser.parse(new xd.DocInput(t.state.doc),r);r=ks.addTree(o,r);let a=new Map,l=[],u=new Map,f=new Set;for(let m of n){i.ranges.tree.search([m.fromA,m.toA],(v,_)=>{i.ranges.tree.remove(_,v),f.add(v);for(let S of v.base_range.thread)u.set(S.from,S);return!0});for(let v of Fh(o,s,e,m.fromB,m.toB))a.set(v.from,v);l.push([m.toA,m.toB-m.fromB-(m.toA-m.fromA)])}for(let m of f)m.type==="comment"&&u.delete(m.from);let h=0,c=i.ranges.tree.nil_node;function p(m){if(m!=null&&m!=c){for(p(m.left);l.length&&m.item.key.low>=l[0][0];)h+=l.shift()[1];m.item.value.apply_offset(h),m.item.key.low=m.item.value.from,m.item.key.high=m.item.value.to,p(m.right),m.left!=c&&(m.max.low=m.left.max.low),m.right!=c&&(m.max.high=m.right.max.high)}}p(i.ranges.tree.root);let g=Array.from(a.values());for(let m of g)i.ranges.tree.insert([m.from,m.to],m);for(let m of g)m.type==="comment"&&u.set(m.from,m);if(u.size){let m=[],v,_=[];for(let S of Array.from(u.values()).sort((k,E)=>k.from-E.from))S.clear_references(),S.replies.length=0,!v||v?.right_adjacent(S)?_.push(S):(m.push(_),_=[S]),v=S;m.push(_);for(let S of m){let k=S[0],E=i.ranges.tree.search([k.from,k.from])[0];E.replies.length=0;for(let M of S.slice(E===k?1:0))M.add_reply(E)}}return i.ranges.ranges=i.ranges.tree.values,{tree:o,ranges:i.ranges,fragments:r,inserted_ranges:g,deleted_ranges:[...f]}}});function Ym(i,t,e){let n=i.enable_metadata&&t.firstChild?.type.name.startsWith("MDSep")?t.firstChild.from:void 0,r;if(t.type.name==="Substitution"){let s=n?t.firstChild?.nextSibling:t.firstChild;if(!s||s.type.name!=="MSub")return;r=s.from}return Km(t.from,t.to,t.type.name,e.slice(t.from,t.to),r,n)}function Fh(i,t,e,n=0,r=t.length){let s=[],o,a=i.cursor();if(a.childAfter(n-1),a.node.type.name==="CriticMarkup"||a.node.from>r)return s;if(a)do{let l=a.node;if(l.type.name==="\u26A0")continue;let u=Ym(e,l,t);u&&(u.type==="comment"&&o&&o.right_adjacent(u)&&u.add_reply(o),s.push(u),o=u)}while(a.nextSibling()&&a.node.from<=r);return s}function $h(i){let t=i.field(Pt).ranges;return t.ranges.length?i.selection.ranges.some(e=>t.contains_range(e.from,e.to)):!1}function Lo(i,t){let e=Za.parser.parse(i);return Fh(e,i,t)}function Km(i,t,e,n,r,s){switch(e){case"Addition":return new Fr(i,t,n,s);case"Deletion":return new _s(i,t,n,s);case"Substitution":return new Sn(i,r,t,n,s);case"Highlight":return new ws(i,t,n,s);case"Comment":return new bs(i,t,n,s);default:return new Fr(i,t,n,s)}}var Bo={addition:Fr,deletion:_s,highlight:ws,substitution:Sn,comment:bs};function $l(i){let t={};for(let{path:e,range:n}of i)t[e]||(t[e]=[]),t[e].push(n);return t}function Vr(i){let t;return i.add_metadata&&(t={},i.add_author_metadata&&(t.author=i.author||void 0),i.add_timestamp_metadata&&(t.time=Math.floor(Date.now()/1e3)),Object.keys(t).length===0&&(t=void 0)),t}var Jm={author:"split"};function nl(i,t,e=Jm){if(!t)return{compatible:!0,merged_metadata:i.fields};if(!i.fields)return{compatible:!1,merged_metadata:void 0};let n=Object.assign({},i.fields,t);for(let r of[...new Set(Object.keys(t).concat(Object.keys(i.fields)))])if(t[r]!==i.fields[r]){let s=e[r];if(s==="split"||s==="move_outside")return{compatible:!1,merged_metadata:void 0};s==="old"&&(n[r]=i.fields[r])}return{compatible:!0,merged_metadata:n}}function Fo(i,t,e,n=0,r=0){return Yn(i,t,i&&t?"substitution":i?"addition":"deletion",e,n,r)}function Yn(i,t,e,n,r=0,s=0){if(!e)return{insert:t+i,start_offset:r,end_offset:s};let o=me[e],a=n&&Object.keys(n).length?JSON.stringify(n)+"@@":"",l=o[0]+a+(e==="substitution"?t+o[1]+i+o[2]:t+i+o[1]),u=o[0].length+a.length;return r+=u,s+=e==="substitution"?o[1].length:0,{insert:l,start_offset:r,end_offset:s}}function kd(i,t,e=""){return Fo(t,e,Vr(i)).insert}function Wr(i,t,e,n=""){return Yn(e,n,t,Vr(i)).insert}var Rl=require("@codemirror/state");function Sd(i,t,e,n=!1,r=null){let s=i,o=e.doc.lineAt(s),a=e.charCategorizer(s);r===Rl.CharCategory.Space&&(r=null);let l=null;for(r;;){if(s==(t?o.to:o.from)){s==i&&o.number!=(t?e.doc.lines:1)&&(s+=t?1:-1);break}let u=(0,Rl.findClusterBreak)(o.text,s-o.from,t)+o.from,f=o.text.slice(Math.min(s,u)-o.from,Math.max(s,u)-o.from);if(l=a(f),r!=null&&l!=r)if(r==1&&n)n=!1;else break;(f!=" "||s!=i)&&(r=l),s=u}return[s,r]}function Hh(i,t,e=!1){let n=t.doc.lineAt(i),r=t.charCategorizer(i);return e&&(i-=1),r(n.text.slice(i-n.from,i-n.from+1))}var W2=require("@codemirror/state");function el(i){return i.annotations.map(t=>t.value).filter(t=>typeof t=="string")}function Md(i,t,e){if(t.clipboardData&&i.clipboard_remove_syntax){let n=e.state.selection.main,s=e.state.field(Pt).ranges.unwrap_in_range(e.state.doc,n.from,n.to).output;t.clipboardData.setData("text/plain",s),t.preventDefault()}}var Vo=require("@codemirror/state");function Xm(i){return i===Vo.CharCategory.Space||i===null}function Qm(i,t){return i!==null&&i!==Vo.CharCategory.Space&&i!==t}function Zm(i,t,e){if(e.cursor_inside(i))return e;{let n=e.cursor_before_range(i),r=t.ranges.indexOf(e)+(n?-1:1);for(;r>=0&&r{i.dispatch(i.state.update({annotations:[Tn.of({from:r,to:r,index:s})]}))})}var Ck=require("@codemirror/state");function Wn(i,t,e,n=!0){let r=i.field(Pt).ranges;return(t||e?r.ranges_in_interval(t??0,e??1/0):r.ranges).filter(s=>s.type==="addition"||s.type==="deletion"||s.type==="substitution").map(s=>({from:s.from,to:n?s.full_range_back:s.to,insert:s.accept()}))}function Un(i,t,e,n=!0){let r=i.field(Pt).ranges;return(t||e?r.ranges_in_interval(t??0,e??1/0):r.ranges).filter(s=>s.type==="addition"||s.type==="deletion"||s.type==="substitution").map(s=>({from:s.from,to:n?s.full_range_back:s.to,insert:s.reject()}))}async function fn(i,t,e,n){n.sort((o,a)=>o.from-a.from);let r=await t.vault.read(e),s=za(r,i,n);await t.vault.modify(e,s)}var zh=require("@codemirror/state");function Cd(i,t){return t==="regular"||t==="clear"?!0:!((i.type==="comment"||i.type==="highlight")&&i.type!==t)}function i0(i,t,e,n={}){return Cd(i,t)?!e||!i.fields?!1:[...new Set(Object.keys(e).concat(Object.keys(i.fields)))].some(r=>e[r]!==i.fields[r]&&(n[r]==="move_outside"||r==="author"&&i.type==="comment")):!0}function n0(i,t){if(i!=="substitution"&&i===t)return i;if(i==="deletion"&&t==="addition")return"substitution";if(i==="substitution"&&t==="addition")return"substitution";if(i==="deletion"&&t==="substitution")return"substitution"}function Vh(i,t,e,n,r=!1,s=!1){if(!t||!e||!Cd(t,e))return{};if(!s&&(r&&t.touches_left_bracket(i,!1,!0,!0)||!r&&t.touches_right_bracket(i,!1,!0)))return{};let{compatible:o,merged_metadata:a}=nl(t,n);if(!o)return{};let l,u;return r?(l=t.range_type(-1/0,i),u=e):(l=e,u=t.range_type(i,1/0)),e=n0(l,u),{type:e,merged_metadata:e?a:void 0}}function Ad(i,t,e,n,r,s,o){let a=i.ranges_in_interval(e,n),l=i.at_cursor(e,!1),u=i.at_cursor(n,!0),f=["",""],h=!1,c=r,p=0,g=0;function m(_=!1){l?.type&&(l.touches_left_bracket(e,!1,!0,!0)?e=l.from:l.touches_right_bracket(e,!1,!0)?e=l.to:l.type==="substitution"&&(_||l.contains_separator(e,n))?(f[0]=Yn("",l.unwrap_slice(0,e),"deletion",l.fields).insert,e=l.from):f[0]=l.split_range(e)[0])}function v(_=!1){if(u?.type)if(u.touches_right_bracket(n,!1,!0))n=u.to;else if(u.touches_left_bracket(n,!1,!0,!0))n=u.from;else if(u.type==="substitution"&&(_||u.contains_separator(e,n))){let S=u.unwrap_slice(n,1/0);f[1]=Yn(S,"","addition",u.fields).insert,n=u.to,h=!0}else f[1]=u.split_range(n)[1]}if(s==="none")n=e,c="";else if(s==="regular")if(l!==void 0&&l===u){let _=e===n?"":l.unwrap_slice(e,n);if(_){if(e=l.cursor_move_inside(e,!0),n=l.cursor_move_inside(n,!1),l.type==="substitution"){let S=l.contains_part(e,n),k=l.unwrap_parts();if(S){let E=l.unwrap_slice(0,e);p+=E.length,g+=r.length-2;let M=l.unwrap_slice(n,l.middle);_=E+r+M,c=k[1]}else if(S===!1){_=k[0];let E=l.unwrap_slice(l.middle+2,e);p=_.length+E.length;let M=l.unwrap_slice(n,1/0);c=E+r+M}else{let[E,M]=l.unwrap_slice_parts_inverted(e,n);p=E.length,_=E,c=r+M}e=l.from,n=l.to,{insert:c,start_offset:p,end_offset:g}=Fo(c,_,l.fields,p,g)}}else{let S=l.cursor_move_inside(e,!0);e=S,n=S,c=r}}else if(e===n?"":i.unwrap_in_range(t,e,n,a).output)m(),v(),p+=f[0].length,h?c=f[0]+r+f[1]:(g=f[1].length,c=f[0]+f[1]+r);else{let S=l||u,k=S?S.cursor_move_inside(e,!0):e;e=k,n=k,c=r}else if(s==="clear"){m(),v();let _=e===n?"":i.unwrap_in_range(t,e,n,a).output;p+=f[0].length,g+=_.length,c=f[0]+_+f[1]}else if(l!==void 0&&l===u&&l.type==="substitution"){let _=l.contains_part(e,n),S=_?e:n,k=Vh(S,l,s,o,_,!0);if(k.type){let E="",M=l.unwrap_parts();if(k.type==="addition"){E=M[0];let w=Math.clamp(S-l.middle-2,0,M[1].length);p=M[0].length+w,c=M[1].slice(0,w)+r+M[1].slice(w),{insert:c,start_offset:p,end_offset:g}=Fo(c,E,k.merged_metadata,p,g),e=l.from,n=l.to}else if(k.type==="deletion")g=n-e,n=e,c="";else if(_){let w=l.unwrap_slice(0,e),x=l.unwrap_slice(e,n);v(),p=w.length,g=x.length,{insert:c,start_offset:p,end_offset:g}=Yn(r,w+x,k.type,k.merged_metadata,p,g),e=l.from}else if(_===!1)E=l.unwrap_slice(e,n),g=E.length,c=r+l.unwrap_slice(n,1/0),r.length||(g-=2),m(),{insert:c,start_offset:p,end_offset:g}=Yn(c,E,k.type,k.merged_metadata,p,g),n=l.to;else{let w=Math.clamp(n-l.middle-2,0,M[1].length);E=M[0]+M[1].slice(0,w),p=e-l.range_start,g=w+(M[0].length-e+l.range_start),c=r+M[1].slice(w),c.length&&!r.length&&(g-=2),{insert:c,start_offset:p,end_offset:g}=Fo(c,E,k.merged_metadata,p,g),e=l.from,n=l.to}}else{let E=l.unwrap_slice(e,n);m(nl.middle+2),{insert:c,start_offset:p,end_offset:g}=Yn(r,E,s,o,p,g+r.length+E.length)}}else{let _=e===n?"":i.unwrap_in_range(t,e,n,a).output;if(!_){if(s==="substitution")s="addition";else if(s==="deletion")return{from:e,to:e,insert:"",start:e,end:e}}g=_.length;let S=Vh(e,l,s,o,!0),k=S.merged_metadata;if(c=r,S.type){if(l.type==="substitution"){let M=l.unwrap_parts();p=M[0].length,g+=M[1].length,_=M[0]+_,c=M[1]+r}else{let M=l.unwrap_slice(0,e);p=M.length,_=M+_}e=l.from,o=k}else m();let E=Vh(n,u,s,o,!1);if(k=E.merged_metadata,E.type){if(u.type==="substitution"){let M=u.unwrap_slice_parts_inverted(e,n);c=r+M[1],_+=M[0]}else c+=u.unwrap_slice(n,1/0);n=u.to,o=k}else v();(S.type==="substitution"||E.type==="substitution")&&(s="substitution"),{insert:c,start_offset:p,end_offset:g}=Yn(c,_,s,o,p,g)}return p+=f[0].length,c=f[0]+c+f[1],{from:e,to:n,insert:c,start:e+p,end:e+p+g+r.length}}function To(i,t,e,n,r,s,o,a=!1){let l=i.ranges_in_interval(e,n),u=l.at(0),f=l.at(-1);u?.touches_left_bracket(e,!0,!0,!0)&&(e=u.from),f?.touches_right_bracket(n,!0,!0)&&(n=f.to);let h=e,c=[];if(!a){for(let g of l)if(i0(g,s,o)){if(hn&&(n=h);let p=Ad(i,t,h,n,r,s,o);return p&&c.push(p),c}function dd(i,t,e){let n=i.cm.state.field(Pt).ranges,r=i.cm.state.selection.ranges,s=[],o=[];for(let a of r){let l=To(n,i.cm.state.doc,a.from,a.to,"",t,Vr(e));o.push(...l),s.push(zh.EditorSelection.range(l[0].start,l[l.length-1].end))}i.cm.dispatch(i.cm.state.update({changes:o,selection:zh.EditorSelection.create(s)}))}var _r=Ba(Od(),1);_r.default.DIFF_DELETE=-1;_r.default.DIFF_INSERT=1;_r.default.DIFF_EQUAL=0;function r0(i,t){let e=new _r.default,n=e.diff_main(i,t);e.diff_cleanupSemantic(n);let r=0,s=[],o=null;for(let[a,l]of n)a===_r.default.DIFF_EQUAL?(o&&(s.push(o),o=null),r+=l.length):a===_r.default.DIFF_INSERT?o?o.insert?(s.push(o),o={from:r,to:r,insert:l}):o.insert+=l:o={from:r,to:r,insert:l}:a===_r.default.DIFF_DELETE&&(o?(s.push(o),o={from:r,to:r+l.length,insert:""}):o={from:r,to:r+l.length,insert:""},r+=l.length);return o&&s.push(o),s}function pd(i,t,e){let n=r0(t,e),r="",s=0;for(let o of n)o.from>s&&(r+=t.slice(s,o.from)),o.insert&&(r+=kd(i,o.insert,t.slice(o.from,o.to))),s=o.to;return st in s?ol(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e,ai=(s,t)=>{for(var e in t||(t={}))Pf.call(t,e)&&rl(s,e,t[e]);if(Df)for(var e of Df(t))Rg.call(t,e)&&rl(s,e,t[e]);return s};var Ig=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports);var Bg=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Dg(t))!Pf.call(s,n)&&n!==e&&ol(s,n,{get:()=>t[n],enumerable:!(i=Eg(t,n))||i.enumerable});return s};var Ng=(s,t,e)=>(e=s!=null?_g(Pg(s)):{},Bg(t||!s||!s.__esModule?ol(e,"default",{value:s,enumerable:!0}):e,s));var I=(s,t,e)=>rl(s,typeof t!="symbol"?t+"":t,e);var Ag=Ig((WM,qn)=>{var C=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},it=-1,st=1,G=0;C.Diff=function(s,t){return[s,t]};C.prototype.diff_main=function(s,t,e,i){typeof i=="undefined"&&(this.Diff_Timeout<=0?i=Number.MAX_VALUE:i=new Date().getTime()+this.Diff_Timeout*1e3);var n=i;if(s==null||t==null)throw new Error("Null input. (diff_main)");if(s==t)return s?[new C.Diff(G,s)]:[];typeof e=="undefined"&&(e=!0);var r=e,o=this.diff_commonPrefix(s,t),l=s.substring(0,o);s=s.substring(o),t=t.substring(o),o=this.diff_commonSuffix(s,t);var a=s.substring(s.length-o);s=s.substring(0,s.length-o),t=t.substring(0,t.length-o);var h=this.diff_compute_(s,t,r,n);return l&&h.unshift(new C.Diff(G,l)),a&&h.push(new C.Diff(G,a)),this.diff_cleanupMerge(h),h};C.prototype.diff_compute_=function(s,t,e,i){var n;if(!s)return[new C.Diff(st,t)];if(!t)return[new C.Diff(it,s)];var r=s.length>t.length?s:t,o=s.length>t.length?t:s,l=r.indexOf(o);if(l!=-1)return n=[new C.Diff(st,r.substring(0,l)),new C.Diff(G,o),new C.Diff(st,r.substring(l+o.length))],s.length>t.length&&(n[0][0]=n[2][0]=it),n;if(o.length==1)return[new C.Diff(it,s),new C.Diff(st,t)];var a=this.diff_halfMatch_(s,t);if(a){var h=a[0],f=a[1],c=a[2],u=a[3],d=a[4],p=this.diff_main(h,c,e,i),g=this.diff_main(f,u,e,i);return p.concat([new C.Diff(G,d)],g)}return e&&s.length>100&&t.length>100?this.diff_lineMode_(s,t,i):this.diff_bisect_(s,t,i)};C.prototype.diff_lineMode_=function(s,t,e){var i=this.diff_linesToChars_(s,t);s=i.chars1,t=i.chars2;var n=i.lineArray,r=this.diff_main(s,t,!1,e);this.diff_charsToLines_(r,n),this.diff_cleanupSemantic(r),r.push(new C.Diff(G,""));for(var o=0,l=0,a=0,h="",f="";o=1&&a>=1){r.splice(o-l-a,l+a),o=o-l-a;for(var c=this.diff_main(h,f,!1,e),u=c.length-1;u>=0;u--)r.splice(o,0,c[u]);o=o+c.length}a=0,l=0,h="",f="";break}o++}return r.pop(),r};C.prototype.diff_bisect_=function(s,t,e){for(var i=s.length,n=t.length,r=Math.ceil((i+n)/2),o=r,l=2*r,a=new Array(l),h=new Array(l),f=0;fe);b++){for(var w=-b+d;w<=b-p;w+=2){var y=o+w,v;w==-b||w!=b&&a[y-1]i)p+=2;else if(x>n)d+=2;else if(u){var S=o+c-w;if(S>=0&&S=k)return this.diff_bisectSplit_(s,t,v,x,e)}}}for(var R=-b+g;R<=b-m;R+=2){var S=o+R,k;R==-b||R!=b&&h[S-1]i)m+=2;else if(P>n)g+=2;else if(!u){var y=o+c-R;if(y>=0&&y=k)return this.diff_bisectSplit_(s,t,v,x,e)}}}}return[new C.Diff(it,s),new C.Diff(st,t)]};C.prototype.diff_bisectSplit_=function(s,t,e,i,n){var r=s.substring(0,e),o=t.substring(0,i),l=s.substring(e),a=t.substring(i),h=this.diff_main(r,o,!1,n),f=this.diff_main(l,a,!1,n);return h.concat(f)};C.prototype.diff_linesToChars_=function(s,t){var e=[],i={};e[0]="";function n(a){for(var h="",f=0,c=-1,u=e.length;ci?s=s.substring(e-i):et.length?s:t,i=s.length>t.length?t:s;if(e.length<4||i.length*2=p.length?[v,x,S,k,y]:null}var o=r(e,i,Math.ceil(e.length/4)),l=r(e,i,Math.ceil(e.length/2)),a;if(!o&&!l)return null;l?o?a=o[4].length>l[4].length?o:l:a=l:a=o;var h,f,c,u;s.length>t.length?(h=a[0],f=a[1],c=a[2],u=a[3]):(c=a[0],u=a[1],h=a[2],f=a[3]);var d=a[4];return[h,f,c,u,d]};C.prototype.diff_cleanupSemantic=function(s){for(var t=!1,e=[],i=0,n=null,r=0,o=0,l=0,a=0,h=0;r0?e[i-1]:-1,o=0,l=0,a=0,h=0,n=null,t=!0)),r++;for(t&&this.diff_cleanupMerge(s),this.diff_cleanupSemanticLossless(s),r=1;r=d?(u>=f.length/2||u>=c.length/2)&&(s.splice(r,0,new C.Diff(G,c.substring(0,u))),s[r-1][1]=f.substring(0,f.length-u),s[r+1][1]=c.substring(u),r++):(d>=f.length/2||d>=c.length/2)&&(s.splice(r,0,new C.Diff(G,f.substring(0,d))),s[r-1][0]=st,s[r-1][1]=c.substring(0,c.length-d),s[r+1][0]=it,s[r+1][1]=f.substring(d),r++),r++}r++}};C.prototype.diff_cleanupSemanticLossless=function(s){function t(d,p){if(!d||!p)return 6;var g=d.charAt(d.length-1),m=p.charAt(0),b=g.match(C.nonAlphaNumericRegex_),w=m.match(C.nonAlphaNumericRegex_),y=b&&g.match(C.whitespaceRegex_),v=w&&m.match(C.whitespaceRegex_),x=y&&g.match(C.linebreakRegex_),S=v&&m.match(C.linebreakRegex_),k=x&&d.match(C.blanklineEndRegex_),R=S&&p.match(C.blanklineStartRegex_);return k||R?5:x||S?4:b&&!y&&v?3:y||v?2:b||w?1:0}for(var e=1;e=c&&(c=u,a=i,h=n,f=r)}s[e-1][1]!=a&&(a?s[e-1][1]=a:(s.splice(e-1,1),e--),s[e][1]=h,f?s[e+1][1]=f:(s.splice(e+1,1),e--))}e++}};C.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;C.whitespaceRegex_=/\\s/;C.linebreakRegex_=/[\\r\\n]/;C.blanklineEndRegex_=/\\n\\r?\\n$/;C.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;C.prototype.diff_cleanupEfficiency=function(s){for(var t=!1,e=[],i=0,n=null,r=0,o=!1,l=!1,a=!1,h=!1;r0?e[i-1]:-1,a=h=!1),t=!0)),r++;t&&this.diff_cleanupMerge(s)};C.prototype.diff_cleanupMerge=function(s){s.push(new C.Diff(G,""));for(var t=0,e=0,i=0,n="",r="",o;t1?(e!==0&&i!==0&&(o=this.diff_commonPrefix(r,n),o!==0&&(t-e-i>0&&s[t-e-i-1][0]==G?s[t-e-i-1][1]+=r.substring(0,o):(s.splice(0,0,new C.Diff(G,r.substring(0,o))),t++),r=r.substring(o),n=n.substring(o)),o=this.diff_commonSuffix(r,n),o!==0&&(s[t][1]=r.substring(r.length-o)+s[t][1],r=r.substring(0,r.length-o),n=n.substring(0,n.length-o))),t-=e+i,s.splice(t,e+i),n.length&&(s.splice(t,0,new C.Diff(it,n)),t++),r.length&&(s.splice(t,0,new C.Diff(st,r)),t++),t++):t!==0&&s[t-1][0]==G?(s[t-1][1]+=s[t][1],s.splice(t,1)):t++,i=0,e=0,n="",r="";break}s[s.length-1][1]===""&&s.pop();var l=!1;for(t=1;tt));o++)n=e,r=i;return s.length!=o&&s[o][0]===it?r:r+(t-n)};C.prototype.diff_prettyHtml=function(s){for(var t=[],e=/&/g,i=//g,r=/\\n/g,o=0;o");switch(l){case st:t[o]=\'\'+h+"";break;case it:t[o]=\'\'+h+"";break;case G:t[o]=""+h+"";break}}return t.join("")};C.prototype.diff_text1=function(s){for(var t=[],e=0;ethis.Match_MaxBits)throw new Error("Pattern too long for this browser.");var i=this.match_alphabet_(t),n=this;function r(v,x){var S=v/t.length,k=Math.abs(e-x);return n.Match_Distance?S+k/n.Match_Distance:k?1:S}var o=this.Match_Threshold,l=s.indexOf(t,e);l!=-1&&(o=Math.min(r(0,l),o),l=s.lastIndexOf(t,e+t.length),l!=-1&&(o=Math.min(r(0,l),o)));var a=1<=p;b--){var w=i[s.charAt(b-1)];if(d===0?m[b]=(m[b+1]<<1|1)&w:m[b]=(m[b+1]<<1|1)&w|((u[b+1]|u[b])<<1|1)|u[b+1],m[b]&a){var y=r(d,b-1);if(y<=o)if(o=y,l=b-1,l>e)p=Math.max(1,2*e-l);else break}}if(r(d+1,e)>o)break;u=m}return l};C.prototype.match_alphabet_=function(s){for(var t={},e=0;e2&&(this.diff_cleanupSemantic(n),this.diff_cleanupEfficiency(n));else if(s&&typeof s=="object"&&typeof t=="undefined"&&typeof e=="undefined")n=s,i=this.diff_text1(n);else if(typeof s=="string"&&t&&typeof t=="object"&&typeof e=="undefined")i=s,n=t;else if(typeof s=="string"&&typeof t=="string"&&e&&typeof e=="object")i=s,n=e;else throw new Error("Unknown call format to patch_make.");if(n.length===0)return[];for(var r=[],o=new C.patch_obj,l=0,a=0,h=0,f=i,c=i,u=0;u=2*this.Patch_Margin&&l&&(this.patch_addContext_(o,f),r.push(o),o=new C.patch_obj,l=0,f=c,a=h);break}d!==st&&(a+=p.length),d!==it&&(h+=p.length)}return l&&(this.patch_addContext_(o,f),r.push(o)),r};C.prototype.patch_deepCopy=function(s){for(var t=[],e=0;ethis.Match_MaxBits?(a=this.match_main(t,l.substring(0,this.Match_MaxBits),o),a!=-1&&(h=this.match_main(t,l.substring(l.length-this.Match_MaxBits),o+l.length-this.Match_MaxBits),(h==-1||a>=h)&&(a=-1))):a=this.match_main(t,l,o),a==-1)n[r]=!1,i-=s[r].length2-s[r].length1;else{n[r]=!0,i=a-o;var f;if(h==-1?f=t.substring(a,a+l.length):f=t.substring(a,h+this.Match_MaxBits),l==f)t=t.substring(0,a)+this.diff_text2(s[r].diffs)+t.substring(a+l.length);else{var c=this.diff_main(l,f,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(c)/l.length>this.Patch_DeleteThreshold)n[r]=!1;else{this.diff_cleanupSemanticLossless(c);for(var u=0,d,p=0;pr[0][1].length){var o=t-r[0][1].length;r[0][1]=e.substring(r[0][1].length)+r[0][1],n.start1-=o,n.start2-=o,n.length1+=o,n.length2+=o}if(n=s[s.length-1],r=n.diffs,r.length==0||r[r.length-1][0]!=G)r.push(new C.Diff(G,e)),n.length1+=t,n.length2+=t;else if(t>r[r.length-1][1].length){var o=t-r[r.length-1][1].length;r[r.length-1][1]+=e.substring(0,o),n.length1+=o,n.length2+=o}return e};C.prototype.patch_splitMax=function(s){for(var t=this.Match_MaxBits,e=0;e2*t?(l.length1+=f.length,n+=f.length,a=!1,l.diffs.push(new C.Diff(h,f)),i.diffs.shift()):(f=f.substring(0,t-l.length1-this.Patch_Margin),l.length1+=f.length,n+=f.length,h===G?(l.length2+=f.length,r+=f.length):a=!1,l.diffs.push(new C.Diff(h,f)),f==i.diffs[0][1]?i.diffs.shift():i.diffs[0][1]=i.diffs[0][1].substring(f.length))}o=this.diff_text2(l.diffs),o=o.substring(o.length-this.Patch_Margin);var c=this.diff_text1(i.diffs).substring(0,this.Patch_Margin);c!==""&&(l.length1+=c.length,l.length2+=c.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===G?l.diffs[l.diffs.length-1][1]+=c:l.diffs.push(new C.Diff(G,c))),a||s.splice(++e,0,l)}}};C.prototype.patch_toText=function(s){for(var t=[],e=0;e","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]},Rf={"{++":["++}"],"{--":["--}"],"{~~":["~>","~~}"],"{==":["==}"],"{>>":["<<}"]};var ar={a:"author",t:"time",d:"done",s:"style",c:"color"},oe=class{constructor(t,e,i,n,r,o){this.from=t;this.to=e;this.type=i;this.repr=n;this.text=r;this.metadata=o;I(this,"fields",{});I(this,"replies",[]);if(o!==void 0){let l=o-t,a=r.slice(3,l);this.text=r.slice(0,3)+r.slice(l+2);try{this.fields=JSON.parse(a);for(let h in this.fields)h in ar&&(this.fields[ar[h]]=this.fields[h],delete this.fields[h])}catch(h){this.fields={}}}}get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(t=>t.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(t,e){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(t){return t in ar&&(t=ar[t]),t in this.fields&&(delete this.fields[t],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(t,e){return this.fields[t]=e,this.set_metadata(this.fields)}set_metadata(t){return this.fields=t,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(t)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(t)+"@@"}]}has_comment(t){return this.thread.includes(t)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(t){return this.type===t.type&&this.from===t.from&&this.to===t.to&&this.replies.length===t.replies.length&&this.full_text===t.full_text}left_adjacent(t){return this.from===t.to}right_adjacent(t){return this.to===t.from}part_is_empty(t){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(t=!1){return t?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(t,e){return t-=this.range_front,e-=this.range_front,e<=0||t===e?"":this.text.slice(Math.max(3,t),Math.min(this.text.length-3,e))}partially_in_range(t,e){return!(t>this.to||ethis.full_range_back||ee:this.from<=t&&this.to>=e}part_encloses_range(t,e,i){return this.encloses_range(t,e)}accept(t=!0){return this.text}reject(t=!0){return this.text}touches(t){return this.from===t||this.to===t}cursor_inside(t){return this.from<=t&&t<=this.to}cursor_before_range(t){return tthis.to}cursor_move_inside(t,e=!1){return Math.min(Math.max(e&&this.metadata?this.metadata+2:this.from+3,t),this.to-3)}cursor_pass_syntax(t,e,i=!1){return e?(this.touches_left_bracket(t,!0,!1,i)&&(t=i&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(t,!1,!0)&&(t=this.to)):(this.touches_right_bracket(t,!0,!1)&&(t=this.to-3),this.touches_left_bracket(t,!1,!0,i)&&(t=this.from)),t}cursor_move_through(t,e,i){return i=="unchanged"||!this.cursor_inside(t)||(i=="ignore_completely"?t=e?this.to:this.from:t=this.cursor_pass_syntax(t,e,i=="ignore_metadata")),t}touches_left_bracket(t,e=!1,i=!1,n=!1){return t+(e?0:1)>=this.from&&t+(i?0:1)<=(n&&this.metadata?this.metadata+2:this.from+3)}touches_separator(t,e=!1,i=!1){return!1}touches_right_bracket(t,e=!1,i=!1){return t-(i?0:1)>=this.to-3&&t-(e?0:1)<=this.to}touches_bracket(t,e,i=!1,n=!1){return e?this.touches_left_bracket(t,i,n):this.touches_right_bracket(t,i,n)}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;return!r&&t&&(this.to>=o.length&&!o.endsWith(zt[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap()),`<${i} class=\'cmtr-${this.repr.toLowerCase()}\'>${o}`}apply_offset(t){this.from+=t,this.to+=t,this.metadata!==void 0&&(this.metadata+=t)}split_range(t){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var Ei=class extends oe{constructor(t,e,i,n){super(t,e,"addition","Addition",i,n)}accept(){return this.unwrap()}reject(){return""}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(zt[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-addition":e===2&&(o=""),`<${i} class=\'${l}\'>${o}`}};var en=class extends oe{constructor(e,i,n,r){super(e,i,"comment","Comment",n,r);I(this,"reply_depth",0);I(this,"attached_comment",null)}get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}accept(e=!0){return e?"":this.unwrap()}reject(e=!0){return e?"":this.unwrap()}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(e){this.attach_to_range(e.type==="comment"?e.base_range:e)}attach_to_range(e){e.replies.push(this),this.reply_depth=e.replies.length-(e.type==="comment"?0:1),this.attached_comment=e}};var nn=class extends oe{constructor(t,e,i,n){super(t,e,"deletion","Deletion",i,n)}accept(){return""}reject(){return this.unwrap()}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(zt[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-deletion":e===1&&(o=""),`<${i} class=\'${l}\'>${o}`}};var sn=class extends oe{constructor(t,e,i,n){super(t,e,"highlight","Highlight",i,n)}};var rn=class extends oe{constructor(e,i,n,r,o){super(e,n,"substitution","Substitution",r,o);this.middle=i}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(e,i){return i<=this.middle+2?"deletion":e>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(e,i){return e-=this.range_front,i-=this.range_front,e=Math.max(0,e),i<=0?this.unwrap_parts():i<=this.char_middle?[this.text.slice(3,e)+this.text.slice(i,this.char_middle),this.text.slice(this.char_middle+2,-3)]:e>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,e)+this.text.slice(i,-3)]:[this.text.slice(3,e),this.text.slice(i,-3)]}unwrap_parts_bracket(e,i=0){return e?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(e,i){return e-=this.range_front,i-=this.range_front,i<=0||e===i?"":e>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,e),Math.min(this.text.length-3,i)):i<=this.char_middle?this.text.slice(Math.max(3,e),Math.min(this.char_middle,i)):this.text.slice(Math.max(3,e),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,i))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(e,i=!1,n=!1){return e+(i?1:0)>=this.middle&&e-(n?0:1)<=this.middle+2}contains_separator(e,i){return e<=this.middle+2&&i>=this.middle}contains_part(e,i,n=!0){return n?ithis.middle+2?!1:void 0:i<=this.middle?!0:e>=this.middle+2?!1:void 0}cursor_pass_syntax(e,i,n=!1){return i?(this.touches_left_bracket(e,!0,!1,n)&&(e=n&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(e,!1,!0)&&(e=this.middle+2),this.touches_right_bracket(e,!1,!0)&&(e=this.to)):(this.touches_right_bracket(e,!0,!1)&&(e=this.to-3),this.touches_separator(e,!1,!0)&&(e=this.middle),this.touches_left_bracket(e,!1,!0,n)&&(e=this.from)),e}part_encloses_range(e,i,n){return n?this.from<=e&&i<=this.middle+2:this.middle<=e&&i<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(e){return e?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(e=!0,i=0,n="div",r=null,o){let l=o!=null?o:this.text,a=[l];!o&&e&&(this.to>=l.length&&!l.endsWith(zt.substitution[2])?a=this.unwrap_parts_bracket(!0):this.from<=0&&!l.startsWith(zt.substitution[0])?a=this.unwrap_parts_bracket(!1):a=this.unwrap_parts());let h="cmtr-preview";return a.length===1&&(a[+r]=a[0],a[+!r]=""),l="",i===0?(a[0].length&&(l+=`<${n} class=\'${h} cmtr-deletion\'>${a[0]}`),a[1].length&&(l+=`<${n} class=\'${h} cmtr-addition\'>${a[1]}`)):i===1?a[1].length&&(l+=`<${n} class=\'${h}\'>${a[1]}`):a[0].length&&(l+=`<${n} class=\'${h}\'>${a[0]}`),l}apply_offset(e){this.from+=e,this.middle+=e,this.to+=e,this.metadata!==void 0&&(this.metadata+=e)}split_range(e){let i=super.split_range(e);return e<=this.middle?i[0]=zt.substitution[1]+i[0]:i[1]=i[1]+zt.substitution[1],i}cursor_move_inside(e,i=!1){return e=super.cursor_move_inside(e,i),e==this.middle+1&&(e=this.middle+2),e}};var al=[],Hf=[];(()=>{let s="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(t=>t?parseInt(t,36):1);for(let t=0,e=0;t>1;if(s=Hf[i])t=i+1;else return!0;if(t==e)return!1}}function Bf(s){return s>=127462&&s<=127487}var Nf=8205;function Ff(s,t,e=!0,i=!0){return(e?Vf:Hg)(s,t,i)}function Vf(s,t,e){if(t==s.length)return t;t&&zf(s.charCodeAt(t))&&Wf(s.charCodeAt(t-1))&&t--;let i=ll(s,t);for(t+=Lf(i);t=0&&Bf(ll(s,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function Hg(s,t,e){for(;t>0;){let i=Vf(s,t-2,e);if(i=56320&&s<57344}function Wf(s){return s>=55296&&s<56320}function Lf(s){return s<65536?1:2}var $=class s{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=fn(this,t,e);let n=[];return this.decompose(0,t,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(e,this.length,n,1),ln.from(n,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=fn(this,t,e);let i=[];return this.decompose(t,e,i,0),ln.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new Ri(this),r=new Ri(t);for(let o=e,l=e;;){if(n.next(o),r.next(o),o=0,n.lineBreak!=r.lineBreak||n.done!=r.done||n.value!=r.value)return!1;if(l+=n.value.length,n.done||l>=i)return!0}}iter(t=1){return new Ri(this,t)}iterRange(t,e=this.length){return new dr(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new pr(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?s.empty:t.length<=32?new Kt(t):ln.from(Kt.split(t,[]))}},Kt=class s extends ${constructor(t,e=Fg(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.text[r],l=n+o.length;if((e?i:l)>=t)return new fl(n,l,i,o);n=l+1,i++}}decompose(t,e,i,n){let r=t<=0&&e>=this.length?this:new s(Gf(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(n&1){let o=i.pop(),l=ur(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new s(l,o.length+r.length));else{let a=l.length>>1;i.push(new s(l.slice(0,a)),new s(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof s))return super.replace(t,e,i);[t,e]=fn(this,t,e);let n=ur(this.text,ur(i.text,Gf(this.text,0,t)),e),r=this.length+i.length-(e-t);return n.length<=32?new s(n,r):ln.from(s.split(n,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=fn(this,t,e);let n="";for(let r=0,o=0;r<=e&&ot&&o&&(n+=i),tr&&(n+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],n=-1;for(let r of t)i.push(r),n+=r.length+1,i.length==32&&(e.push(new s(i,n)),i=[],n=-1);return n>-1&&e.push(new s(i,n)),e}},ln=class s extends ${constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.children[r],l=n+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,n);n=l+1,i=a+1}}decompose(t,e,i,n){for(let r=0,o=0;o<=e&&r=o){let h=n&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=fn(this,t,e),i.lines=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let f=this.children.slice();return f[n]=a,new s(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=fn(this,t,e);let n="";for(let r=0,o=0;rt&&r&&(n+=i),to&&(n+=l.sliceString(t-o,e-o,i)),o=a+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof s))return 0;let i=0,[n,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;n+=e,r+=e){if(n==o||r==l)return i;let a=this.children[n],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new Kt(d,e)}let n=Math.max(32,i>>5),r=n<<1,o=n>>1,l=[],a=0,h=-1,f=[];function c(d){let p;if(d.lines>r&&d instanceof s)for(let g of d.children)c(g);else d.lines>o&&(a>o||!a)?(u(),l.push(d)):d instanceof Kt&&a&&(p=f[f.length-1])instanceof Kt&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new Kt(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>n&&u(),a+=d.lines,h+=d.length+1,f.push(d))}function u(){a!=0&&(l.push(f.length==1?f[0]:s.from(f,h)),h=-1,a=f.length=0)}for(let d of t)c(d);return u(),l.length==1?l[0]:new s(l,e)}};$.empty=new Kt([""],0);function Fg(s){let t=-1;for(let e of s)t+=e.length+1;return t}function ur(s,t,e=0,i=1e9){for(let n=0,r=0,o=!0;r=e&&(a>i&&(l=l.slice(0,i-n)),n0?1:(t instanceof Kt?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],r=this.offsets[i],o=r>>1,l=n instanceof Kt?n.text.length:n.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(n instanceof Kt){let a=n.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=n.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof Kt?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},dr=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new Ri(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},pr=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&($.prototype[Symbol.iterator]=function(){return this.iter()},Ri.prototype[Symbol.iterator]=dr.prototype[Symbol.iterator]=pr.prototype[Symbol.iterator]=function(){return this});var fl=class{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}};function fn(s,t,e){return t=Math.max(0,Math.min(s.length,t)),[t,Math.max(t,Math.min(s.length,e))]}function Ce(s,t,e=!0,i=!0){return Ff(s,t,e,i)}function Vg(s){return s>=56320&&s<57344}function zg(s){return s>=55296&&s<56320}function Kf(s,t){let e=s.charCodeAt(t);if(!zg(e)||t+1==s.length)return e;let i=s.charCodeAt(t+1);return Vg(i)?(e-55296<<10)+(i-56320)+65536:e}function Yf(s){return s<65536?1:2}var cl=/\\r\\n?|\\n/,Wt=function(s){return s[s.Simple=0]="Simple",s[s.TrackDel=1]="TrackDel",s[s.TrackBefore=2]="TrackBefore",s[s.TrackAfter=3]="TrackAfter",s}(Wt||(Wt={})),Ii=class s{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return r+(t-n);r+=l}else{if(i!=Wt.Simple&&h>=t&&(i==Wt.TrackDel&&nt||i==Wt.TrackBefore&&nt))return null;if(h>t||h==t&&e<0&&!l)return t==n||e<0?r:r+a;r+=a}n=h}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return r}touchesRange(t,e=t){for(let i=0,n=0;i=0&&n<=e&&l>=t)return ne?"cover":!0;n=l}return!1}toString(){let t="";for(let e=0;e=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new s(t)}static create(t){return new s(t)}},Yt=class s extends Ii{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return ul(this,(e,i,n,r,o)=>t=t.replace(n,n+(i-e),o),!1),t}mapDesc(t,e=!1){return dl(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let n=0,r=0;n=0){e[n]=l,e[n+1]=o;let a=n>>1;for(;i.length0&&hi(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l>1].toJSON()))}return t}static of(t,e,i){let n=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!n.length)return;ou||c<0||u>e)throw new RangeError(`Invalid change range ${c} to ${u} (in doc of length ${e})`);let p=d?typeof d=="string"?$.of(d.split(i||cl)):d:$.empty,g=p.length;if(c==u&&g==0)return;co&&Pt(n,c-o,-1),Pt(n,u-c,g),hi(r,n,p),o=u}}return h(t),a(!l),l}static empty(t){return new s(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let n=0;nl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length=0&&e<=0&&e==s[n+1]?s[n]+=t:n>=0&&t==0&&s[n]==0?s[n+1]+=e:i?(s[n]+=t,s[n+1]+=e):s.push(t,e)}function hi(s,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i>1])),!(e||o==s.sections.length||s.sections[o+1]<0);)l=s.sections[o++],a=s.sections[o++];t(n,h,r,f,c),n=h,r=f}}}function dl(s,t,e,i=!1){let n=[],r=i?[]:null,o=new Bi(s),l=new Bi(t);for(let a=-1;;){if(o.done&&l.len||l.done&&o.len)throw new Error("Mismatched change set lengths");if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);Pt(n,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let c=Math.min(f,l.len);h+=c,f-=c,l.forward(c)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var Bi=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return e>=t.length?$.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?$.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},on=class s{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new s(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return N.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return N.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return N.range(t.anchor,t.head)}static create(t,e,i){return new s(t,e,i)}},N=class s{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:s.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new s(t.ranges.map(e=>on.fromJSON(e)),t.main)}static single(t,e=t){return new s([s.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nt?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((n,r)=>n.from-r.from),e=t.indexOf(i);for(let n=1;nr.head?s.range(a,l):s.range(l,a))}}return new s(t,e)}};function Jf(s,t){for(let e of s.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var Sl=0,L=class s{constructor(t,e,i,n,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=Sl++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new s(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:Cl),!!t.static,t.enables)}of(t){return new an([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new an(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new an(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function Cl(s,t){return s==t||s.length==t.length&&s.every((e,i)=>e===t[i])}var an=class{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=Sl++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let c of this.dependencies)c=="doc"?a=!0:c=="selection"?h=!0:(((e=t[c.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[c.id]);return{create(c){return c.values[o]=i(c),1},update(c,u){if(a&&u.docChanged||h&&(u.docChanged||u.selection)||pl(c,f)){let d=i(c);if(l?!Uf(d,c.values[o],n):!n(d,c.values[o]))return c.values[o]=d,1}return 0},reconfigure:(c,u)=>{let d,p=u.config.address[r];if(p!=null){let g=br(u,p);if(this.dependencies.every(m=>m instanceof L?u.facet(m)===c.facet(m):m instanceof Tt?u.field(m,!1)==c.field(m,!1):!0)||(l?Uf(d=i(c),g,n):n(d=i(c),g)))return c.values[o]=g,0}else d=i(c);return c.values[o]=d,1}}}};function Uf(s,t,e){if(s.length!=t.length)return!1;for(let i=0;is[a.id]),n=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=s[t.id]>>1;function l(a){let h=[];for(let f=0;fi===n),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(hr).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,n)=>{let r=i.values[e],o=this.updateF(r,n);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,n)=>{let r=i.facet(hr),o=n.facet(hr),l;return(l=r.find(a=>a.field==this))&&l!=o.find(a=>a.field==this)?(i.values[e]=l.create(i),1):n.config.address[this.id]!=null?(i.values[e]=n.field(this),0):(i.values[e]=this.create(i),1)}}}init(t){return[this,hr.of({field:this,create:t})]}get extension(){return this}},Di={lowest:4,low:3,default:2,high:1,highest:0};function Xn(s){return t=>new gr(t,s)}var ci={highest:Xn(Di.highest),high:Xn(Di.high),default:Xn(Di.default),low:Xn(Di.low),lowest:Xn(Di.lowest)},gr=class{constructor(t,e){this.inner=t,this.prec=e}},Xt=class s{of(t){return new Qn(this,t)}reconfigure(t){return s.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},Qn=class{constructor(t,e){this.compartment=t,this.inner=e}},mr=class s{constructor(t,e,i,n,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let n=[],r=Object.create(null),o=new Map;for(let u of Gg(t,e,o))u instanceof Tt?n.push(u):(r[u.facet.id]||(r[u.facet.id]=[])).push(u);let l=Object.create(null),a=[],h=[];for(let u of n)l[u.id]=h.length<<1,h.push(d=>u.slot(d));let f=i==null?void 0:i.config.facets;for(let u in r){let d=r[u],p=d[0].facet,g=f&&f[u]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,Cl(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>Wg(m,p,d))}}let c=h.map(u=>u(l));return new s(t,o,c,l,a,r)}};function Gg(s,t,e){let i=[[],[],[],[],[]],n=new Map;function r(o,l){let a=n.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof Qn&&e.delete(o.compartment)}if(n.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof Qn){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof gr)r(o.inner,o.prec);else if(o instanceof Tt)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof an)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Di.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(s,Di.default),i.reduce((o,l)=>o.concat(l))}function Jn(s,t){if(t&1)return 2;let e=t>>1,i=s.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;s.status[e]=4;let n=s.computeSlot(s,s.config.dynamicSlots[e]);return s.status[e]=2|n}function br(s,t){return t&1?s.config.staticValues[t>>1]:s.values[t>>1]}var Qf=L.define(),gl=L.define({combine:s=>s.some(t=>t),static:!0}),Zf=L.define({combine:s=>s.length?s[0]:void 0,static:!0}),tc=L.define(),ec=L.define(),ic=L.define(),nc=L.define({combine:s=>s.length?s[0]:!1}),xt=class{constructor(t,e){this.type=t,this.value=e}static define(){return new ml}},ml=class{of(t){return new xt(this,t)}},bl=class{constructor(t){this.map=t}of(t){return new ot(this,t)}},ot=class s{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new s(this.type,e)}is(t){return this.type==t}static define(t={}){return new bl(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let r=n.map(e);r&&i.push(r)}return i}};ot.reconfigure=ot.define();ot.appendConfig=ot.define();var Gt=class s{constructor(t,e,i,n,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&Jf(i,e.newLength),r.some(l=>l.type==s.time)||(this.annotations=r.concat(s.time.of(Date.now())))}static create(t,e,i,n,r,o){return new s(t,e,i,n,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(s.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};Gt.time=xt.define();Gt.userEvent=xt.define();Gt.addToHistory=xt.define();Gt.remote=xt.define();function Ug(s,t){let e=[];for(let i=0,n=0;;){let r,o;if(i=s[i]))r=s[i++],o=s[i++];else if(n=0;n--){let r=i[n](s);r instanceof Gt?s=r:Array.isArray(r)&&r.length==1&&r[0]instanceof Gt?s=r[0]:s=rc(t,hn(r),!1)}return s}function qg(s){let t=s.startState,e=t.facet(ic),i=s;for(let n=e.length-1;n>=0;n--){let r=e[n](s);r&&Object.keys(r).length&&(i=sc(i,wl(t,r,s.changes.newLength),!0))}return i==s?s:Gt.create(t,s.changes,s.selection,i.effects,i.annotations,i.scrollIntoView)}var $g=[];function hn(s){return s==null?$g:Array.isArray(s)?s:[s]}var Se=function(s){return s[s.Word=0]="Word",s[s.Space=1]="Space",s[s.Other=2]="Other",s}(Se||(Se={})),Kg=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,yl;try{yl=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(s){}function Yg(s){if(yl)return yl.test(s);for(let t=0;t"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||Kg.test(e)))return!0}return!1}function Xg(s){return t=>{if(!/\\S/.test(t))return Se.Space;if(Yg(t))return Se.Word;for(let e=0;e-1)return Se.Word;return Se.Other}}var ct=class s{constructor(t,e,i,n,r,o){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ln.set(h,a)),e=null),n.set(l.value.compartment,l.value.extension)):l.is(ot.reconfigure)?(e=null,i=l.value):l.is(ot.appendConfig)&&(e=null,i=hn(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=mr.resolve(i,n,this),r=new s(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(gl)?t.newSelection:t.newSelection.asSingle();new s(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:N.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),r=[i.range],o=hn(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return s.create({doc:t.doc,selection:N.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(t={}){let e=mr.resolve(t.extensions||[],new Map),i=t.doc instanceof $?t.doc:$.of((t.doc||"").split(e.staticFacet(s.lineSeparator)||cl)),n=t.selection?t.selection instanceof N?t.selection:N.single(t.selection.anchor,t.selection.head):N.single(0);return Jf(n,i.length),e.staticFacet(gl)||(n=n.asSingle()),new s(e,i,n,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(s.tabSize)}get lineBreak(){return this.facet(s.lineSeparator)||`\n`}get readOnly(){return this.facet(nc)}phrase(t,...e){for(let i of this.facet(s.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,n)=>{if(n=="$")return"$";let r=+(n||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let n=[];for(let r of this.facet(Qf))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&n.push(o[t]);return n}charCategorizer(t){return Xg(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=Ce(e,o,!1);if(r(e.slice(a,o))!=Se.Word)break;o=a}for(;ls.length?s[0]:4});ct.lineSeparator=Zf;ct.readOnly=nc;ct.phrases=L.define({compare(s,t){let e=Object.keys(s),i=Object.keys(t);return e.length==i.length&&e.every(n=>s[n]==t[n])}});ct.languageData=Qf;ct.changeFilter=tc;ct.transactionFilter=ec;ct.transactionExtender=ic;Xt.reconfigure=ot.define();var Ke=class{eq(t){return this==t}range(t,e=t){return Zn.create(t,e,this)}};Ke.prototype.startSide=Ke.prototype.endSide=0;Ke.prototype.point=!1;Ke.prototype.mapMode=Wt.TrackDel;var Zn=class s{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new s(t,e,i)}};function vl(s,t){return s.from-t.from||s.value.startSide-t.value.startSide}var kl=class s{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let r=i?this.to:this.from;for(let o=n,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,n){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||u==d&&h.startSide>0&&h.endSide<=0)continue;(d-u||h.endSide-h.startSide)<0||(o<0&&(o=u),h.point&&(l=Math.max(l,d-u)),i.push(h),n.push(u-o),r.push(d-o))}return{mapped:i.length?new s(n,r,i,l):null,pos:o}}},K=class s{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new s(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(vl)),this.isEmpty)return e.length?s.of(e):this;let l=new wr(this,null,-1).goto(0),a=0,h=[],f=new fi;for(;l.value||a=0){let c=e[a++];f.addInner(c.from,c.to,c.value)||h.push(c)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return ts.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return ts.from(t).goto(e)}static compare(t,e,i,n,r=-1){let o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),l=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),a=jf(o,l,i),h=new Pi(o,a,r),f=new Pi(l,a,r);i.iterGaps((c,u,d)=>qf(h,c,f,u,d,n)),i.empty&&i.length==0&&qf(h,0,f,0,0,n)}static eq(t,e,i=0,n){n==null&&(n=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=jf(r,o),a=new Pi(r,l,0).goto(i),h=new Pi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!xl(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>n)return!0;a.next(),h.next()}}static spans(t,e,i,n,r=-1){let o=new Pi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),c=o.pointFroml&&(n.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new fi;for(let n of t instanceof Zn?[t]:e?Jg(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return s.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=s.empty;n=n.nextLayer)e=new s(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}};K.empty=new K([],[],null,-1);function Jg(s){if(s.length>1)for(let t=s[0],e=1;e0)return s.slice().sort(vl);t=i}return s}K.empty.nextLayer=K.empty;var fi=class s{finishChunk(t){this.chunks.push(new kl(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new s)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(K.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=K.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function jf(s,t,e){let i=new Map;for(let r of s)for(let o=0;o=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new wr(o,e,i,r));return n.length==1?n[0]:new s(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)hl(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)hl(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),hl(this.heap,0)}}};function hl(s,t){for(let e=s[t];;){let i=(t<<1)+1;if(i>=s.length)break;let n=s[i];if(i+1=0&&(n=s[i+1],i++),e.compare(n)<0)break;s[i]=e,s[t]=n,t=i}}var Pi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=ts.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){fr(this.active,t),fr(this.activeTo,t),fr(this.activeRank,t),this.minActive=$f(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:r}=this.cursor;for(;e0;)e++;cr(this.active,e,i),cr(this.activeTo,e,n),cr(this.activeRank,e,r),t&&cr(t,e,this.cursor.from),this.minActive=$f(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&fr(i,n)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function qf(s,t,e,i,n,r){s.goto(t),e.goto(i);let o=i+n,l=i,a=i-t;for(;;){let h=s.to+a-e.to,f=h||s.endSide-e.endSide,c=f<0?s.to+a:e.to,u=Math.min(c,o);if(s.point||e.point?s.point&&e.point&&(s.point==e.point||s.point.eq(e.point))&&xl(s.activeForPoint(s.to),e.activeForPoint(e.to))||r.comparePoint(l,u,s.point,e.point):u>l&&!xl(s.active,e.active)&&r.compareRange(l,u,s.active,e.active),c>o)break;(h||s.openEnd!=e.openEnd)&&r.boundChange&&r.boundChange(c),l=c,f<=0&&s.next(),f>=0&&e.next()}}function xl(s,t){if(s.length!=t.length)return!1;for(let e=0;e=t;i--)s[i+1]=s[i];s[t]=e}function $f(s,t){let e=-1,i=1e9;for(let n=0;n=t)return n;if(n==s.length)break;r+=s.charCodeAt(n)==9?e-r%e:1,n=Ce(s,n)}return i===!0?-1:s.length}var Qg=class Ml{constructor(t,e){this.low=t,this.high=e}clone(){return new Ml(this.low,this.high)}get max(){return this.clone()}less_than(t){return this.lowt.high?this.high:t.high)}output(){return[this.low,this.high]}static comparable_max(t,e){return t.merge(e)}static comparable_less_than(t,e){return ta&&([l,a]=[a,l]),this.item.key=new Qg(l,a)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===X}_value_less_than(t){return this.item.value&&t.item.value&&this.item.value.less_than?this.item.value.less_than(t.item.value):this.item.valuet++),t}get keys(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.key.output?e.item.key.output():e.item.key)),t}get values(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.value)),t}get items(){let t=[];return this.tree_walk(this.root,e=>t.push({key:e.item.key.output?e.item.key.output():e.item.key,value:e.item.value})),t}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(t,e=t){if(t===void 0)return;let i=new Ye(t,e,this.nil_node,this.nil_node,null,At);return this.tree_insert(i),this.recalc_max(i),i}exist(t,e=t){let i=new Ye(t,e);return!!this.tree_search(this.root,i)}remove(t,e=t){let i=new Ye(t,e),n=this.tree_search(this.root,i);return n&&this.tree_delete(n),n}search(t,e=(i,n)=>i===n?n.output():i){let i=new Ye(t),n=[];return this.tree_search_interval(this.root,i,n),n.map(r=>e(r.item.value,r.item.key))}intersect_any(t){let e=new Ye(t);return this.tree_find_any_interval(this.root,e)}forEach(t){this.tree_walk(this.root,e=>t(e.item.key,e.item.value))}map(t){let e=new s;return this.tree_walk(this.root,i=>e.insert(i.item.key,t(i.item.value,i.item.key))),e}*iterate(t,e=(i,n)=>i===n?n.output():i){let i;for(t?i=this.tree_search_nearest_forward(this.root,new Ye(t)):this.root&&(i=this.local_minimum(this.root));i;)yield e(i.item.value,i.item.key),i=this.tree_successor(i)}recalc_max(t){let e=t;for(;e.parent!=null;)e.parent.update_max(),e=e.parent}tree_insert(t){let e=this.root,i=null;if(this.root==null||this.root===this.nil_node)this.root=t;else{for(;e!==this.nil_node;)i=e,t.less_than(e)?e=e.left:e=e.right;t.parent=i,t.less_than(i)?i.left=t:i.right=t}this.insert_fixup(t)}insert_fixup(t){let e,i;for(e=t;e!==this.root&&e.parent.color===At;)e.parent===e.parent.parent.left?(i=e.parent.parent.right,i.color===At?(e.parent.color=X,i.color=X,e.parent.parent.color=At,e=e.parent.parent):(e===e.parent.right&&(e=e.parent,this.rotate_left(e)),e.parent.color=X,e.parent.parent.color=At,this.rotate_right(e.parent.parent))):(i=e.parent.parent.left,i.color===At?(e.parent.color=X,i.color=X,e.parent.parent.color=At,e=e.parent.parent):(e===e.parent.left&&(e=e.parent,this.rotate_right(e)),e.parent.color=X,e.parent.parent.color=At,this.rotate_left(e.parent.parent)));this.root.color=X}tree_delete(t){let e,i;t.left===this.nil_node||t.right===this.nil_node?e=t:e=this.tree_successor(t),e.left!==this.nil_node?i=e.left:i=e.right,i.parent=e.parent,e===this.root?this.root=i:(e===e.parent.left?e.parent.left=i:e.parent.right=i,e.parent.update_max()),this.recalc_max(i),e!==t&&(t.copy_data(e),t.update_max(),this.recalc_max(t)),e.color===X&&this.delete_fixup(i)}delete_fixup(t){let e=t,i;for(;e!==this.root&&e.parent!=null&&e.color===X;)e===e.parent.left?(i=e.parent.right,i.color===At&&(i.color=X,e.parent.color=At,this.rotate_left(e.parent),i=e.parent.right),i.left.color===X&&i.right.color===X?(i.color=At,e=e.parent):(i.right.color===X&&(i.color=At,i.left.color=X,this.rotate_right(i),i=e.parent.right),i.color=e.parent.color,e.parent.color=X,i.right.color=X,this.rotate_left(e.parent),e=this.root)):(i=e.parent.left,i.color===At&&(i.color=X,e.parent.color=At,this.rotate_right(e.parent),i=e.parent.left),i.left.color===X&&i.right.color===X?(i.color=At,e=e.parent):(i.left.color===X&&(i.color=At,i.right.color=X,this.rotate_left(i),i=e.parent.left),i.color=e.parent.color,e.parent.color=X,i.left.color=X,this.rotate_right(e.parent),e=this.root));e.color=X}tree_search(t,e){if(!(t==null||t===this.nil_node))return e.equal_to(t)?t:e.less_than(t)?this.tree_search(t.left,e):this.tree_search(t.right,e)}tree_search_nearest_forward(t,e){let i,n=t;for(;n&&n!==this.nil_node;)n.less_than(e)?n.intersect(e)?(i=n,n=n.left):n=n.right:((!i||n.less_than(i))&&(i=n),n=n.left);return i||null}tree_search_interval(t,e,i){t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&this.tree_search_interval(t.left,e,i),t.intersect(e)&&i.push(t),t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&this.tree_search_interval(t.right,e,i))}tree_find_any_interval(t,e){let i=!1;return t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&(i=this.tree_find_any_interval(t.left,e)),i||(i=t.intersect(e)),!i&&t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&(i=this.tree_find_any_interval(t.right,e))),i}local_minimum(t){let e=t;for(;e.left!=null&&e.left!==this.nil_node;)e=e.left;return e}local_maximum(t){let e=t;for(;e.right!=null&&e.right!==this.nil_node;)e=e.right;return e}tree_successor(t){let e,i,n;if(t.right!==this.nil_node)e=this.local_minimum(t.right);else{for(i=t,n=t.parent;n!=null&&n.right===i;)i=n,n=n.parent;e=n}return e}rotate_left(t){let e=t.right;t.right=e.left,e.left!==this.nil_node&&(e.left.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e,t!=null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}rotate_right(t){let e=t.left;t.left=e.right,e.right!==this.nil_node&&(e.right.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.right=t,t.parent=e,t!==null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}tree_walk(t,e){t!=null&&t!==this.nil_node&&(this.tree_walk(t.left,e),e(t),this.tree_walk(t.right,e))}testRedBlackProperty(){let t=!0;return this.tree_walk(this.root,function(e){e.color===At&&(e.left.color===X&&e.right.color===X||(t=!1))}),t}testBlackHeightProperty(t){let e=0,i=0,n=0;if(t.color===X&&e++,t.left!==this.nil_node?i=this.testBlackHeightProperty(t.left):i=1,t.right!==this.nil_node?n=this.testBlackHeightProperty(t.right):n=1,i!==n)throw new Error("Red-black height property violated");return e+=i,e}};var vr=class{constructor(t){I(this,"ranges");I(this,"tree");this.ranges=t,this.tree=new yr;for(let e of t)this.tree.insert([e.from,e.to],e)}empty(){return this.ranges.length===0}get(t){return t<0?this.ranges[this.ranges.length+t]:this.ranges[t]}at_cursor(t,e=!1){let i=this.tree.search([t,t]);return i.length?e&&i.length>1?i[1]:i[0]:void 0}contains_range(t,e){return this.tree.intersect_any([t,e])}range_adjacent_to_cursor(t,e,i=!1,n=!1){let r=e?this.ranges.slice().reverse():this.ranges;return n?r.find(o=>e?(i?o.from:o.to)e?(i?o.from:o.to)<=t:t<=(i?o.to:o.from))}adjacent_range(t,e,i=!1){let n=this.ranges.findIndex(o=>o===t);if(n===-1)return;let r=e?this.ranges[n-1]:this.ranges[n+1];if(r)if(i){if(e?r.to===t.from:t.to===r.from)return r}else return r}ranges_in_interval(t,e){return this.tree.search([t,e])}ranges_in_intervals(t){let e=new Set;for(let i of t)for(let n of this.tree.search([i.from,i.to]))if(e.add(n),n.base_range){e.add(n.base_range);for(let r of n.base_range.replies)e.add(r)}return Array.from(e).sort((i,n)=>i.from-n.from)}unwrap_in_range(t,e=0,i=t.length,n=null){let r,o;if(n||(n=this.ranges_in_interval(e,i)),n.length===0)return{output:t.sliceString(e,i),from:e,to:i};let l="";e=n.at(-1).to?l+=t.sliceString(n.at(-1).to,i):o=n.at(-1);let h=r?r.cursor_pass_syntax(e,!1):e,f=o?o.cursor_pass_syntax(i,!0):i;return(h!==e||e===(r==null?void 0:r.from))&&(r=void 0),(f!==i||i===(o==null?void 0:o.to))&&(o=void 0),{output:l,from:h,to:f,front_range:r,back_range:o}}};var Tl="\\u037C",lc=typeof Symbol=="undefined"?"__"+Tl:Symbol.for(Tl),Al=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),ac=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},le=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],c=/^@(\\w+)\\b/.exec(o[0]),u=c&&c[1]=="keyframes";if(c&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!c)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(n(d),p,f,u)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||u)&&a.push((i&&!c&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(n(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=ac[lc]||1;return ac[lc]=t+1,Tl+t.toString(36)}static mount(t,e,i){let n=t[Al],r=i&&i.nonce;n?r&&n.setNonce(r):n=new Ol(t,r),n.mount(Array.isArray(e)?e:[e],t)}},hc=new Map,Ol=class{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let r=hc.get(i);if(r)return t[Al]=r;this.sheet=new n.CSSStyleSheet,hc.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],t[Al]=this}mount(t,e){let i=this.sheet,n=0,r=0;for(let o=0;o-1&&(this.modules.splice(a,1),r--,a=-1),a==-1){if(this.modules.splice(r++,0,l),i)for(let h=0;h",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},Zg=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),tm=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(gt=0;gt<10;gt++)Xe[48+gt]=Xe[96+gt]=String(gt);var gt;for(gt=1;gt<=24;gt++)Xe[gt+111]="F"+gt;var gt;for(gt=65;gt<=90;gt++)Xe[gt]=String.fromCharCode(gt+32),cn[gt]=String.fromCharCode(gt);var gt;for(kr in Xe)cn.hasOwnProperty(kr)||(cn[kr]=Xe[kr]);var kr;function fc(s){var t=Zg&&s.metaKey&&s.shiftKey&&!s.ctrlKey&&!s.altKey||tm&&s.shiftKey&&s.key&&s.key.length==1||s.key=="Unidentified",e=!t&&s.key||(s.shiftKey?cn:Xe)[s.keyCode]||s.key||"Unidentified";return e=="Esc"&&(e="Escape"),e=="Del"&&(e="Delete"),e=="Left"&&(e="ArrowLeft"),e=="Up"&&(e="ArrowUp"),e=="Right"&&(e="ArrowRight"),e=="Down"&&(e="ArrowDown"),e}function fs(s){let t;return s.nodeType==11?t=s.getSelection?s:s.ownerDocument:t=s,t.getSelection()}function Rl(s,t){return t?s==t||s.contains(t.nodeType!=1?t.parentNode:t):!1}function Er(s,t){if(!t.anchorNode)return!1;try{return Rl(s,t.anchorNode)}catch(e){return!1}}function gn(s){return s.nodeType==3?Hi(s,0,s.nodeValue.length).getClientRects():s.nodeType==1?s.getClientRects():[]}function rs(s,t,e,i){return e?cc(s,t,e,i,-1)||cc(s,t,e,i,1):!1}function Li(s){for(var t=0;;t++)if(s=s.previousSibling,!s)return t}function Ir(s){return s.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\\d|SECTION|PRE)$/.test(s.nodeName)}function cc(s,t,e,i,n){for(;;){if(s==e&&t==i)return!0;if(t==(n<0?0:_e(s))){if(s.nodeName=="DIV")return!1;let r=s.parentNode;if(!r||r.nodeType!=1)return!1;t=Li(s)+(n<0?0:1),s=r}else if(s.nodeType==1){if(s=s.childNodes[t+(n<0?-1:0)],s.nodeType==1&&s.contentEditable=="false")return!1;t=n<0?_e(s):0}else return!1}}function _e(s){return s.nodeType==3?s.nodeValue.length:s.childNodes.length}function ms(s,t){let e=t?s.left:s.right;return{left:e,right:e,top:s.top,bottom:s.bottom}}function nm(s){let t=s.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:s.innerWidth,top:0,bottom:s.innerHeight}}function Wc(s,t){let e=t.width/s.offsetWidth,i=t.height/s.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-s.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-s.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function sm(s,t,e,i,n,r,o,l){let a=s.ownerDocument,h=a.defaultView||window;for(let f=s,c=!1;f&&!c;)if(f.nodeType==1){let u,d=f==a.body,p=1,g=1;if(d)u=nm(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(c=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let w=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Wc(f,w)),u={left:w.left,right:w.left+f.clientWidth*p,top:w.top,bottom:w.top+f.clientHeight*g}}let m=0,b=0;if(n=="nearest")t.top0&&t.bottom>u.bottom+b&&(b=t.bottom-u.bottom+o)):t.bottom>u.bottom&&(b=t.bottom-u.bottom+o,e<0&&t.top-b0&&t.right>u.right+m&&(m=t.right-u.right+r)):t.right>u.right&&(m=t.right-u.right+r,e<0&&t.leftu.bottom||t.leftu.right)&&(t={left:Math.max(t.left,u.left),right:Math.min(t.right,u.right),top:Math.max(t.top,u.top),bottom:Math.min(t.bottom,u.bottom)}),f=f.assignedSlot||f.parentNode}else if(f.nodeType==11)f=f.host;else break}function rm(s){let t=s.ownerDocument,e,i;for(let n=s.parentNode;n&&!(n==t.body||e&&i);)if(n.nodeType==1)!i&&n.scrollHeight>n.clientHeight&&(i=n),!e&&n.scrollWidth>n.clientWidth&&(e=n),n=n.assignedSlot||n.parentNode;else if(n.nodeType==11)n=n.host;else break;return{x:e,y:i}}var Il=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?_e(e):0),i,Math.min(t.focusOffset,i?_e(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}},un=null;function Gc(s){if(s.setActive)return s.setActive();if(un)return s.focus(un);let t=[];for(let e=s;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(s.focus(un==null?{get preventScroll(){return un={preventScroll:!0},!0}}:void 0),!un){un=!1;for(let e=0;eMath.max(1,s.scrollHeight-s.clientHeight-4)}function qc(s,t){for(let e=s,i=t;;){if(e.nodeType==3&&i>0)return{node:e,offset:i};if(e.nodeType==1&&i>0){if(e.contentEditable=="false")return null;e=e.childNodes[i-1],i=_e(e)}else if(e.parentNode&&!Ir(e))i=Li(e),e=e.parentNode;else return null}}function $c(s,t){for(let e=s,i=t;;){if(e.nodeType==3&&ie)return c.domBoundsAround(t,e,h);if(u>=t&&n==-1&&(n=a,r=h),h>e&&c.dom.parentNode==this.dom){o=a,l=f;break}f=u,h=u+c.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=fa){this.markDirty();for(let n=t;nthis.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Kc(s,t,e,i,n,r,o,l,a){let{children:h}=s,f=h.length?h[t]:null,c=r.length?r[r.length-1]:null,u=c?c.breakAfter:o;if(!(t==i&&f&&!o&&!u&&r.length<2&&f.merge(e,n,r.length?c:null,e==0,l,a))){if(i0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e2),D={mac:mc||/Mac/.test(Ut.platform),windows:/Win/.test(Ut.platform),linux:/Linux|X11/.test(Ut.platform),ie:jr,ie_version:Xc?Bl.documentMode||6:Ll?+Ll[1]:Nl?+Nl[1]:0,gecko:pc,gecko_version:pc?+(/Firefox\\/(\\d+)/.exec(Ut.userAgent)||[0,0])[1]:0,chrome:!!_l,chrome_version:_l?+_l[1]:0,ios:mc,android:/Android\\b/.test(Ut.userAgent),webkit:gc,safari:Jc,webkit_version:gc?+(/\\bAppleWebKit\\/(\\d+)/.exec(Ut.userAgent)||[0,0])[1]:0,tabSize:Bl.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},am=256,Ee=class s extends nt{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof s)||this.length-(e-t)+i.length>am||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new s(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Ft(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return hm(this.dom,t,e)}},pi=class s extends nt{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let n of e)n.setParent(this)}setAttrs(t){if(Uc(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,r,o){return i&&(!(i instanceof s&&i.mark.eq(this.mark))||t&&r<=0||et&&e.push(i=t&&(n=r),i=a,r++}let o=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new s(this.mark,e,o)}domAtPos(t){return Qc(this,t)}coordsAt(t,e){return tu(this,t,e)}};function hm(s,t,e){let i=s.nodeValue.length;t>i&&(t=i);let n=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?D.chrome||D.gecko||(t?(n--,o=1):r=0)?0:l.length-1];return D.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?ms(a,o<0):a||null}var Nr=class s extends nt{static create(t,e,i){return new s(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=s.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0)?Ft.before(this.dom):Ft.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),r=null;if(!n.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?n.length-1:0;r=n[l],!(t>0?l==0:l==n.length-1||r.top0?Ft.before(this.dom):Ft.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return $.empty}get isHidden(){return!0}};Ee.prototype.children=Nr.prototype.children=cs.prototype.children=fa;function Qc(s,t){let e=s.dom,{children:i}=s,n=0;for(let r=0;nr&&t0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=n;r0&&t instanceof pi&&n.length&&(i=n[n.length-1])instanceof pi&&i.mark.eq(t.mark)?Zc(i,t.children[0],e-1):(n.push(t),t.setParent(s)),s.length+=t.length}function tu(s,t,e){let i=null,n=-1,r=null,o=-1;function l(h,f){for(let c=0,u=0;c=f&&(d.children.length?l(d,f-u):(!r||r.isHidden&&(e>0||cm(r,d)))&&(p>f||u==p&&d.getSide()>0)?(r=d,o=f-u):(u-1?1:0)!=n.length-(e&&n.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(n.indexOf(r)==-1||s[r]!==t[r]))return!1;return!0}function Fl(s,t,e){let i=!1;if(t)for(let n in t)e&&n in e||(i=!0,n=="style"?s.style.cssText="":s.removeAttribute(n));if(e)for(let n in e)t&&t[n]==e[n]||(i=!0,n=="style"?s.style.cssText=e[n]:s.setAttribute(n,e[n]));return i}function um(s){let t=Object.create(null);for(let e=0;e0?3e8:-4e8:e>0?1e8:-1e8,new gi(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,n;if(t.isBlockGap)i=-5e8,n=4e8;else{let{start:r,end:o}=eu(t,e);i=(r?e?-3e8:-1:5e8)-1,n=(o?e?2e8:1:-6e8)+1}return new gi(t,i,n,e,t.widget||null,!0)}static line(t){return new ds(t)}static set(t,e=!1){return K.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};J.none=K.empty;var us=class s extends J{constructor(t){let{start:e,end:i}=eu(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof s&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&Lr(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};us.prototype.point=!1;var ds=class s extends J{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof s&&this.spec.class==t.spec.class&&Lr(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};ds.prototype.mapMode=Wt.TrackBefore;ds.prototype.point=!0;var gi=class s extends J{constructor(t,e,i,n,r,o){super(e,i,r,t),this.block=n,this.isReplace=o,this.mapMode=n?e<=0?Wt.TrackBefore:Wt.TrackAfter:Wt.TrackDel}get type(){return this.startSide!=this.endSide?Jt.WidgetRange:this.startSide<=0?Jt.WidgetBefore:Jt.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof s&&dm(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};gi.prototype.point=!0;function eu(s,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=s;return e==null&&(e=s.inclusive),i==null&&(i=s.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function dm(s,t){return s==t||!!(s&&t&&s.compare(t))}function Dr(s,t,e,i=0){let n=e.length-1;n>=0&&e[n]+i>=s?e[n]=Math.max(e[n],t):e.push(s,t)}var Ot=class s extends nt{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,n,r,o){if(i){if(!(i instanceof s))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),Yc(this,t,e,i?i.children.slice():[],r,o),!0}split(t){let e=new s;if(e.breakAfter=this.breakAfter,this.length==0)return e;let{i,off:n}=this.childPos(t);n&&(e.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let r=i;r0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Lr(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Zc(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Hl(e,this.attrs||{})),i&&(this.attrs=Hl({class:i},this.attrs||{}))}domAtPos(t){return Qc(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Uc(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(Fl(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&nt.get(n)instanceof pi;)n=n.lastChild;if(!n||!this.length||n.nodeName!="BR"&&((i=nt.get(n))===null||i===void 0?void 0:i.isEditable)==!1&&(!D.ios||!this.children.some(r=>r instanceof Ee))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof Ee)||/[^ -~]/.test(i.text))return null;let n=gn(i.dom);if(n.length!=1)return null;t+=n[0].width,e=n[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=tu(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:n}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-n.lineHeight)<2&&n.textHeight=e){if(r instanceof s)return r;if(o>e)break}n=o+r.breakAfter}return null}},Ni=class s extends nt{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0}},ps=class extends Fi{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},os=class s{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof Ni&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Ot),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(xr(new cs(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof Ni)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(xr(new Ee(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof gi){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof gi)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new Ni(i.widget||mi.block,l,i));else{let a=Nr.create(i.widget||mi.inline,l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=n.length&&(t0),f=!a.isEditable&&(tn.length||i.startSide<=0),c=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(n),h&&(c.append(xr(new cs(1),n),r),r=n.length+Math.max(0,r-n.length)),c.append(xr(a,n),r),this.atCursorPos=f,this.pendingBuffer=f?tn.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,n,r){let o=new s(t,e,i,r);return o.openEnd=K.spans(n,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function xr(s,t){for(let e of t)s=new pi(e,[s],s.length);return s}var mi=class extends Fi{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}};mi.inline=new mi("span");mi.block=new mi("div");var mt=function(s){return s[s.LTR=0]="LTR",s[s.RTL=1]="RTL",s}(mt||(mt={})),Vi=mt.LTR,ca=mt.RTL;function iu(s){let t=[];for(let e=0;e=e){if(l.level==i)return o;(r<0||(n!=0?n<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function su(s,t){if(s.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(Me[g+1]==-d){let m=Me[g+2],b=m&2?n:m&4?m&1?r:n:0;b&&(Z[c]=Z[Me[g]]=b),l=g;break}}else{if(Me.length==189)break;Me[l++]=c,Me[l++]=u,Me[l++]=a}else if((p=Z[c])==2||p==1){let g=p==n;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=Me[m+2];if(b&2)break;if(g)Me[m+2]|=2;else{if(b&4)break;Me[m+2]|=4}}}}}function ym(s,t,e,i){for(let n=0,r=i;n<=e.length;n++){let o=n?e[n-1].to:s,l=na;)p==m&&(p=e[--g].from,m=g?e[g-1].to:s),Z[--p]=d;a=f}else r=h,a++}}}function zl(s,t,e,i,n,r,o){let l=i%2?2:1;if(i%2==n%2)for(let a=t,h=0;aa&&o.push(new Ae(a,g.from,d));let m=g.direction==Vi!=!(d%2);Wl(s,m?i+1:i,n,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?Z[p]!=l:Z[p]==l))break;p++}u?zl(s,a,p,i+1,n,u,o):at;){let f=!0,c=!1;if(!h||a>r[h-1].to){let g=Z[a-1];g!=l&&(f=!1,c=g==16)}let u=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(c)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(Z[m-1]==l)break t;break}}if(u)u.push(g);else{g.toZ.length;)Z[Z.length]=256;let i=[],n=t==Vi?0:1;return Wl(s,n,n,e,0,s.length,i),i}function ru(s){return[new Ae(0,s,0)]}var ou="";function km(s,t,e,i,n){var r;let o=i.head-s.from,l=Ae.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(n,e);if(o==h){let u=l+=n?1:-1;if(u<0||u>=t.length)return null;a=t[l=u],o=a.side(!n,e),h=a.side(n,e)}let f=Ce(s.text,o,a.forward(n,e));(fa.to)&&(f=h),ou=s.text.slice(Math.min(o,f),Math.max(o,f));let c=l==(n?t.length-1:0)?null:t[l+(n?1:-1)];return c&&f==h&&c.level+(n?0:1)s.some(t=>t)}),Sm=L.define({combine:s=>s.some(t=>t)}),pu=L.define(),ls=class s{constructor(t,e="nearest",i="nearest",n=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new s(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new s(N.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},Sr=ot.define({map:(s,t)=>s.map(t)}),gu=ot.define();function ge(s,t,e){let i=s.facet(fu);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var Je=L.define({combine:s=>s.length?s[0]:!0}),Cm=0,es=L.define(),me=class s{constructor(t,e,i,n,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:n,provide:r,decorations:o}=e||{};return new s(Cm++,t,i,n,l=>{let a=[es.of(l)];return o&&a.push(gs.of(h=>{let f=h.plugin(l);return f?o(f):J.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return s.define(i=>new t(i),e)}},as=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(ge(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){ge(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){ge(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},mu=L.define(),pa=L.define(),gs=L.define(),bu=L.define(),ga=L.define(),wu=L.define();function wc(s,t){let e=s.state.facet(wu);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(s):r),n=[];return K.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,c=n;for(let u=l.length-1;u>=0;u--,a--){let d=l[u].spec.bidiIsolate,p;if(d==null&&(d=xm(t.text,h,f)),a>0&&c.length&&(p=c[c.length-1]).to==h&&p.direction==d)p.to=f,c=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};c.push(g),c=g.inner}}}}),n}var yu=L.define();function vu(s){let t=0,e=0,i=0,n=0;for(let r of s.state.facet(yu)){let o=r(s);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(n=Math.max(n,o.bottom)))}return{left:t,right:e,top:i,bottom:n}}var is=L.define(),Oe=class s{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new s(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toAf)break;r+=2}if(!a)return i;new s(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},Hr=class s{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Yt.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let n=[];this.changes.iterChangedRanges((r,o,l,a)=>n.push(new Oe(r,o,l,a))),this.changedRanges=n}static create(t,e,i){return new s(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},Fr=class extends nt{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=J.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new Ot],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new Oe(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(t);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?n=this.domChanged.newSel.head:!Dm(t.changes,this.hasComposition)&&!t.selectionSet&&(n=t.state.selection.main.head));let r=n>-1?Tm(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new Oe(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(D.ie||D.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=_m(o,l,t.changes);return i=Oe.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=D.chrome||D.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||n.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?n[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:c}=l,u,d,p,g;if(i&&i.range.fromBf){let v=os.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),x=os.build(this.view.state.doc,i.range.toB,c,this.decorations,this.dynamicDecorationMap);d=v.breakAtStart,p=v.openStart,g=x.openEnd;let S=this.compositionView(i);x.breakAtStart?S.breakAfter=1:x.content.length&&S.merge(S.length,S.length,x.content[0],!1,x.openStart,0)&&(S.breakAfter=x.content[0].breakAfter,x.content.shift()),v.content.length&&S.merge(0,0,v.content[v.content.length-1],!0,0,v.openEnd)&&v.content.pop(),u=v.content.concat(S).concat(x.content)}else({content:u,breakAtStart:d,openStart:p,openEnd:g}=os.build(this.view.state.doc,f,c,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:w,off:y}=r.findPos(a,-1);Kc(this,w,y,m,b,u,d,p,g)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(t){this.editContextFormatting=this.editContextFormatting.map(t.changes);for(let e of t.transactions)for(let i of e.effects)i.is(gu)&&(this.editContextFormatting=i.value)}compositionView(t){let e=new Ee(t.text.nodeValue);e.flags|=8;for(let{deco:n}of t.marks)e=new pi(n,[e],e.length);let i=new Ot;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=nt.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let r=t.marks.length-1;r>=-1;r--)i=n.childPos(i.off,1),n=n.children[i.i],e(r>=0?t.marks[r].node:t.text,n)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,r=!n&&!(this.view.state.facet(Je)||this.dom.tabIndex>-1)&&Er(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(D.gecko&&l.empty&&!this.hasComposition&&Mm(a)){let c=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(c,a.node.childNodes[a.offset]||null)),a=h=new Ft(c,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!rs(a.node,a.offset,f.anchorNode,f.anchorOffset)||!rs(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{D.android&&D.chrome&&this.dom.contains(f.focusNode)&&Em(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let c=fs(this.view.root);if(c)if(l.empty){if(D.gecko){let u=Am(a.node,a.offset);if(u&&u!=3){let d=(u==1?qc:$c)(a.node,a.offset);d&&(a=new Ft(d.node,d.offset))}}c.collapse(a.node,a.offset),l.bidiLevel!=null&&c.caretBidiLevel!==void 0&&(c.caretBidiLevel=l.bidiLevel)}else if(c.extend){c.collapse(a.node,a.offset);try{c.extend(h.node,h.offset)}catch(u){}}else{let u=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),u.setEnd(h.node,h.offset),u.setStart(a.node,a.offset),c.removeAllRanges(),c.addRange(u)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Ft(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Ft(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&rs(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=fs(t.root),{anchorNode:n,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=Ot.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(n,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let n=t.offset;!i&&n=0;n--){let r=nt.get(e.childNodes[n]);r instanceof Ot&&(i=r.domAtPos(r.length))}return i?new Ft(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=nt.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(at||l.covers(1))&&(!i||l instanceof Ot&&!(i instanceof Ot&&e>=0)))i=l,n=h;else if(i&&h==t&&a==t&&l instanceof Ni&&Math.abs(e)<2){if(l.deco.startSide<0)break;o&&(i=null)}r=h}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof Ot))return null;for(;n.children.length;){let{i:l,off:a}=n.childPos(i,1);for(;;l++){if(l==n.children.length)return null;if((n=n.children[l]).length)break}i=a}if(!(n instanceof Ee))return null;let r=Ce(n.text,i);if(r==i)return null;let o=Hi(n.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==mt.LTR;for(let h=0,f=0;fn)break;if(h>=i){let d=c.dom.getBoundingClientRect();if(e.push(d.height),o){let p=c.dom.lastChild,g=p?gn(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=u)}}}h=u+c.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?mt.RTL:mt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof Ot){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,n;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=gn(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,n=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:n}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Br(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let r=n==e.viewports.length?null:e.viewports[n],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(J.replace({widget:new ps(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return J.set(t)}updateDeco(){let t=1,e=this.view.state.facet(gs).map(r=>(this.dynamicDecorationMap[t++]=typeof r=="function")?r(this.view):r),i=!1,n=this.view.state.facet(bu).map((r,o)=>{let l=typeof r=="function";return l&&(i=!0),l?r(this.view):r});for(n.length&&(this.dynamicDecorationMap[t++]=i,e.push(K.join(n))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];te.anchor?-1:1),n;if(!i)return;!e.empty&&(n=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,n.left),top:Math.min(i.top,n.top),right:Math.max(i.right,n.right),bottom:Math.max(i.bottom,n.bottom)});let r=vu(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;sm(this.view.scrollDOM,o,e.head{it.from&&(e=!0)}),e}function Pm(s,t,e=1){let i=s.charCategorizer(t),n=s.doc.lineAt(t),r=t-n.from;if(n.length==0)return N.cursor(t);r==0?e=1:r==n.length&&(e=-1);let o=r,l=r;e<0?o=Ce(n.text,r,!1):l=Ce(n.text,r);let a=i(n.text.slice(o,l));for(;o>0;){let h=Ce(n.text,o,!1);if(i(n.text.slice(h,o))!=a)break;o=h}for(;ls?t.left-s:Math.max(0,s-t.right)}function Im(s,t){return t.top>s?t.top-s:Math.max(0,s-t.bottom)}function El(s,t){return s.topt.top+1}function yc(s,t){return ts.bottom?{top:s.top,left:s.left,right:s.right,bottom:t}:s}function Ul(s,t,e){let i,n,r,o,l=!1,a,h,f,c;for(let p=s.firstChild;p;p=p.nextSibling){let g=gn(p);for(let m=0;my||o==y&&r>w){i=p,n=b,r=w,o=y;let v=y?e0?m0)}w==0?e>b.bottom&&(!f||f.bottomb.top)&&(h=p,c=b):f&&El(f,b)?f=vc(f,b.bottom):c&&El(c,b)&&(c=yc(c,b.top))}}if(f&&f.bottom>=e?(i=a,n=f):c&&c.top<=e&&(i=h,n=c),!i)return{node:s,offset:0};let u=Math.max(n.left,Math.min(n.right,t));if(i.nodeType==3)return kc(i,u,e);if(l&&i.contentEditable!="false")return Ul(i,u,e);let d=Array.prototype.indexOf.call(s.childNodes,i)+(t>=(n.left+n.right)/2?1:0);return{node:s,offset:d}}function kc(s,t,e){let i=s.nodeValue.length,n=-1,r=1e9,o=0;for(let l=0;le?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&c=(f.left+f.right)/2,d=u;if((D.chrome||D.gecko)&&Hi(s,l).getBoundingClientRect().left==f.right&&(d=!u),c<=0)return{node:s,offset:l+(d?1:0)};n=l+(d?1:0),r=c}}}return{node:s,offset:n>-1?n:o>0?s.nodeValue.length:0}}function xu(s,t,e,i=-1){var n,r;let o=s.contentDOM.getBoundingClientRect(),l=o.top+s.viewState.paddingTop,a,{docHeight:h}=s.viewState,{x:f,y:c}=t,u=c-l;if(u<0)return 0;if(u>h)return s.state.doc.length;for(let v=s.viewState.heightOracle.textHeight/2,x=!1;a=s.elementAtHeight(u),a.type!=Jt.Text;)for(;u=i>0?a.bottom+v:a.top-v,!(u>=0&&u<=h);){if(x)return e?null:0;x=!0,i=-i}c=l+u;let d=a.from;if(ds.viewport.to)return s.viewport.to==s.state.doc.length?s.state.doc.length:e?null:xc(s,o,a,f,c);let p=s.dom.ownerDocument,g=s.root.elementFromPoint?s.root:p,m=g.elementFromPoint(f,c);m&&!s.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,c),m&&!s.contentDOM.contains(m)&&(m=null));let b,w=-1;if(m&&((n=s.docView.nearest(m))===null||n===void 0?void 0:n.isEditable)!=!1){if(p.caretPositionFromPoint){let v=p.caretPositionFromPoint(f,c);v&&({offsetNode:b,offset:w}=v)}else if(p.caretRangeFromPoint){let v=p.caretRangeFromPoint(f,c);v&&({startContainer:b,startOffset:w}=v,(!s.contentDOM.contains(b)||D.safari&&Bm(b,w,f)||D.chrome&&Nm(b,w,f))&&(b=void 0))}b&&(w=Math.min(_e(b),w))}if(!b||!s.docView.dom.contains(b)){let v=Ot.find(s.docView,d);if(!v)return u>a.top+a.height/2?a.to:a.from;({node:b,offset:w}=Ul(v.dom,f,c))}let y=s.docView.nearest(b);if(!y)return null;if(y.isWidget&&((r=y.dom)===null||r===void 0?void 0:r.nodeType)==1){let v=y.dom.getBoundingClientRect();return t.ys.defaultLineHeight*1.5){let l=s.viewState.heightOracle.textHeight,a=Math.floor((n-e.top-(s.defaultLineHeight-l)*.5)/l);r+=a*s.viewState.heightOracle.lineLength}let o=s.state.sliceDoc(e.from,e.to);return e.from+oc(o,r,s.state.tabSize)}function Bm(s,t,e){let i;if(s.nodeType!=3||t!=(i=s.nodeValue.length))return!1;for(let n=s.nextSibling;n;n=n.nextSibling)if(n.nodeType!=1||n.nodeName!="BR")return!1;return Hi(s,i-1,i).getBoundingClientRect().left>e}function Nm(s,t,e){if(t!=0)return!1;for(let n=s;;){let r=n.parentNode;if(!r||r.nodeType!=1||r.firstChild!=n)return!1;if(r.classList.contains("cm-line"))break;n=r}let i=s.nodeType==1?s.getBoundingClientRect():Hi(s,0,Math.max(s.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function Lm(s,t,e){let i=s.lineBlockAt(t);if(Array.isArray(i.type)){let n;for(let r of i.type){if(r.from>t)break;if(!(r.tot)return r;(!n||r.type==Jt.Text&&(n.type!=r.type||(e<0?r.fromt)))&&(n=r)}}return n||i}return i}function Hm(s,t,e,i){let n=Lm(s,t.head,t.assoc||-1),r=!i||n.type!=Jt.Text||!(s.lineWrapping||n.widgetLineBreaks)?null:s.coordsAtPos(t.assoc<0&&t.head>n.from?t.head-1:t.head);if(r){let o=s.dom.getBoundingClientRect(),l=s.textDirectionAt(n.from),a=s.posAtCoords({x:e==(l==mt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return N.cursor(a,e?-1:1)}return N.cursor(e?n.to:n.from,e?-1:1)}function Sc(s,t,e,i){let n=s.state.doc.lineAt(t.head),r=s.bidiSpans(n),o=s.textDirectionAt(n.from);for(let l=t,a=null;;){let h=km(n,r,o,l,e),f=ou;if(!h){if(n.number==(e?s.state.doc.lines:1))return l;f=`\n`,n=s.state.doc.line(n.number+(e?1:-1)),r=s.bidiSpans(n),h=s.visualLineSide(n,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function Fm(s,t,e){let i=s.state.charCategorizer(t),n=i(e);return r=>{let o=i(r);return n==Se.Space&&(n=o),n==o}}function Vm(s,t,e,i){let n=t.head,r=e?1:-1;if(n==(e?s.state.doc.length:0))return N.cursor(n,t.assoc);let o=t.goalColumn,l,a=s.contentDOM.getBoundingClientRect(),h=s.coordsAtPos(n,t.assoc||-1),f=s.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=s.viewState.lineBlockAt(n);o==null&&(o=Math.min(a.right-a.left,s.defaultCharacterWidth*(n-d.from))),l=(r<0?d.top:d.bottom)+f}let c=a.left+o,u=i!=null?i:s.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(u+d)*r,g=xu(s,{x:c,y:p},!1,r);if(pa.bottom||(r<0?gn)){let m=s.docView.coordsForChar(g),b=!m||p{if(t>r&&tn(s)),e.from,t.head>e.from?-1:1);return i==e.from?e:N.cursor(i,ir)&&this.lineBreak(),n=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=n.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=nt.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(zm(t,i.node,i.offset)?e:0))}};function zm(s,t,e){for(;;){if(!t||e<_e(t))return!1;if(t==s)return!0;e=Li(t)+1,t=t.parentNode}}var Vr=class{constructor(t,e){this.node=t,this.offset=e,this.pos=-1}},ql=class{constructor(t,e,i,n){this.typeOver=n,this.bounds=null,this.text="",this.domChanged=e>-1;let{impreciseHead:r,impreciseAnchor:o}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:Um(t),a=new jl(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=jm(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!Rl(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!Rl(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if((D.ios||D.chrome)&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.toDate.now()-100?s.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=n.from,h=null;(r===8||D.android&&t.text.length=n.from&&e.to<=n.to&&(e.from!=n.from||e.to!=n.to)&&n.to-n.from-(e.to-e.from)<=4?e={from:n.from,to:n.to,insert:s.state.doc.slice(n.from,e.from).append(e.insert).append(s.state.doc.slice(e.to,n.to))}:D.chrome&&e&&e.from==e.to&&e.from==n.head&&e.insert.toString()==`\n `&&s.lineWrapping&&(i&&(i=N.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:$.of([" "])}),e)return ma(s,e,i,r);if(i&&!i.main.eq(n)){let o=!1,l="select";return s.inputState.lastSelectionTime>Date.now()-50&&(s.inputState.lastSelectionOrigin=="select"&&(o=!0),l=s.inputState.lastSelectionOrigin),s.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function ma(s,t,e,i=-1){if(D.ios&&s.inputState.flushIOSKey(t))return!0;let n=s.state.selection.main;if(D.android&&(t.to==n.to&&(t.from==n.from||t.from==n.from-1&&s.state.sliceDoc(t.from,n.from)==" ")&&t.insert.length==1&&t.insert.lines==2&&pn(s.contentDOM,"Enter",13)||(t.from==n.from-1&&t.to==n.to&&t.insert.length==0||i==8&&t.insert.lengthn.head)&&pn(s.contentDOM,"Backspace",8)||t.from==n.from&&t.to==n.to+1&&t.insert.length==0&&pn(s.contentDOM,"Delete",46)))return!0;let r=t.insert.toString();s.inputState.composing>=0&&s.inputState.composing++;let o,l=()=>o||(o=Wm(s,t,e));return s.state.facet(cu).some(a=>a(s,t.from,t.to,r,l))||s.dispatch(l()),!0}function Wm(s,t,e){let i,n=s.state,r=n.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&s.inputState.composing<0){let l=r.fromt.to?n.sliceDoc(t.to,r.to):"";i=n.replaceSelection(s.state.toText(l+t.insert.sliceString(0,void 0,s.state.lineBreak)+a))}else{let l=n.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(n.selection.ranges.length>1&&s.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=s.state.sliceDoc(t.from,t.to),f,c=e&&ku(s,e.main.head);if(c){let p=t.insert.length-(t.to-t.from);f={from:c.from,to:c.to-p}}else f=s.state.doc.lineAt(r.head);let u=r.to-t.to,d=r.to-r.from;i=n.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-u,m=g-h.length;if(p.to-p.from!=d||s.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=n.changes({from:m,to:g,insert:t.insert}),w=p.to-r.to;return{changes:b,range:a?N.range(Math.max(0,a.anchor+w),Math.max(0,a.head+w)):p.map(b)}})}else i={changes:l,selection:a&&n.selection.replaceRange(a)}}let o="input.type";return(s.composing||s.inputState.compositionPendingChange&&s.inputState.compositionEndedAt>Date.now()-50)&&(s.inputState.compositionPendingChange=!1,o+=".compose",s.inputState.compositionFirstChange&&(o+=".start",s.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:o,scrollIntoView:!0})}function Gm(s,t,e,i){let n=Math.min(s.length,t.length),r=0;for(;r0&&l>0&&s.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function Um(s){let t=[];if(s.root.activeElement!=s.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}=s.observer.selectionRange;return e&&(t.push(new Vr(e,i)),(n!=e||r!=i)&&t.push(new Vr(n,r))),t}function jm(s,t){if(s.length==0)return null;let e=s[0].pos,i=s.length==2?s[1].pos:e;return e>-1&&i>-1?N.single(e+t,i+t):null}var $l=class{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,D.safari&&t.contentDOM.addEventListener("input",()=>null),D.gecko&&o0(t.contentDOM.ownerDocument)}handleEvent(t){!Qm(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(t.type,t)):this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let n of i.observers)n(this.view,e);for(let n of i.handlers){if(e.defaultPrevented)break;if(n(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=qm(t),i=this.handlers,n=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(n.removeEventListener(r,this.handleEvent),l=null),l||n.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&n.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&t.keyCode!=27&&Mu.indexOf(t.keyCode)<0&&(this.tabFocusMode=-1),D.android&&D.chrome&&!t.synthetic&&(t.keyCode==13||t.keyCode==8))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return D.ios&&!t.synthetic&&!t.altKey&&!t.metaKey&&((e=Cu.find(i=>i.keyCode==t.keyCode))&&!t.ctrlKey||$m.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(t){let e=this.pendingIOSKey;return!e||e.key=="Enter"&&t&&t.from0?!0:D.safari&&!D.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.view.observer.update(t),this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function Cc(s,t){return(e,i)=>{try{return t.call(s,i,e)}catch(n){ge(e.state,n)}}}function qm(s){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of s){let n=i.spec;if(n&&n.domEventHandlers)for(let r in n.domEventHandlers){let o=n.domEventHandlers[r];o&&e(r).handlers.push(Cc(i.value,o))}if(n&&n.domEventObservers)for(let r in n.domEventObservers){let o=n.domEventObservers[r];o&&e(r).observers.push(Cc(i.value,o))}}for(let i in be)e(i).handlers.push(be[i]);for(let i in he)e(i).observers.push(he[i]);return t}var Cu=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],$m="dthko",Mu=[16,17,18,20,91,92,224,225],Cr=6;function Mr(s){return Math.max(0,s)*.7+8}function Km(s,t){return Math.max(Math.abs(s.clientX-t.clientX),Math.abs(s.clientY-t.clientY))}var Kl=class{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=rm(t.contentDOM),this.atoms=t.state.facet(ga).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(ct.allowMultipleSelections)&&Ym(t,e),this.dragging=Jm(t,e)&&Ou(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&Km(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let e=0,i=0,n=0,r=0,o=this.view.win.innerWidth,l=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:o}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:r,bottom:l}=this.scrollParents.y.getBoundingClientRect());let a=vu(this.view);t.clientX-a.left<=n+Cr?e=-Mr(n-t.clientX):t.clientX+a.right>=o-Cr&&(e=Mr(t.clientX-o)),t.clientY-a.top<=r+Cr?i=-Mr(r-t.clientY):t.clientY+a.bottom>=l-Cr&&(i=Mr(t.clientY-l)),this.setScrollSpeed(e,i)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:t,y:e}=this.scrollSpeed;t&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=t,t=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(t||e)&&this.view.win.scrollBy(t,e),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;ie.isUserEvent("input.type"))?this.destroy():this.style.update(t)&&setTimeout(()=>this.select(this.lastEvent),20)}};function Ym(s,t){let e=s.state.facet(lu);return e.length?e[0](t):D.mac?t.metaKey:t.ctrlKey}function Xm(s,t){let e=s.state.facet(au);return e.length?e[0](t):D.mac?!t.altKey:!t.ctrlKey}function Jm(s,t){let{main:e}=s.state.selection;if(e.empty)return!1;let i=fs(s.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function Qm(s,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=s.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=nt.get(e))&&i.ignoreEvent(t))return!1;return!0}var be=Object.create(null),he=Object.create(null),Tu=D.ie&&D.ie_version<15||D.ios&&D.webkit_version<604;function Zm(s){let t=s.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{s.focus(),e.remove(),Au(s,e.value)},50)}function qr(s,t,e){for(let i of s.facet(t))e=i(e,s);return e}function Au(s,t){t=qr(s.state,ua,t);let{state:e}=s,i,n=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(Yl!=null&&e.selection.ranges.every(a=>a.empty)&&Yl==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let c=e.toText((o?r.line(n++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:c},range:N.cursor(h.from+c.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(n++);return{changes:{from:a.from,to:a.to,insert:h.text},range:N.cursor(a.from+h.length)}}):i=e.replaceSelection(r);s.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}he.scroll=s=>{s.inputState.lastScrollTop=s.scrollDOM.scrollTop,s.inputState.lastScrollLeft=s.scrollDOM.scrollLeft};be.keydown=(s,t)=>(s.inputState.setSelectionOrigin("select"),t.keyCode==27&&s.inputState.tabFocusMode!=0&&(s.inputState.tabFocusMode=Date.now()+2e3),!1);he.touchstart=(s,t)=>{s.inputState.lastTouchTime=Date.now(),s.inputState.setSelectionOrigin("select.pointer")};he.touchmove=s=>{s.inputState.setSelectionOrigin("select.pointer")};be.mousedown=(s,t)=>{if(s.observer.flush(),s.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of s.state.facet(hu))if(e=i(s,t),e)break;if(!e&&t.button==0&&(e=i0(s,t)),e){let i=!s.hasFocus;s.inputState.startMouseSelection(new Kl(s,t,e,i)),i&&s.observer.ignore(()=>{Gc(s.contentDOM);let r=s.root.activeElement;r&&!r.contains(s.contentDOM)&&r.blur()});let n=s.inputState.mouseSelection;if(n)return n.start(t),n.dragging===!1}return!1};function Mc(s,t,e,i){if(i==1)return N.cursor(t,e);if(i==2)return Pm(s.state,t,e);{let n=Ot.find(s.docView,t),r=s.state.doc.lineAt(n?n.posAtEnd:t),o=n?n.posAtStart:r.from,l=n?n.posAtEnd:r.to;return lt>=e.top&&t<=e.bottom&&s>=e.left&&s<=e.right;function t0(s,t,e,i){let n=Ot.find(s.docView,t);if(!n)return 1;let r=t-n.posAtStart;if(r==0)return 1;if(r==n.length)return-1;let o=n.coordsAt(r,-1);if(o&&Tc(e,i,o))return-1;let l=n.coordsAt(r,1);return l&&Tc(e,i,l)?1:o&&o.bottom>=i?-1:1}function Ac(s,t){let e=s.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:t0(s,e,t.clientX,t.clientY)}}var e0=D.ie&&D.ie_version<=11,Oc=null,_c=0,Ec=0;function Ou(s){if(!e0)return s.detail;let t=Oc,e=Ec;return Oc=s,Ec=Date.now(),_c=!t||e>Date.now()-400&&Math.abs(t.clientX-s.clientX)<2&&Math.abs(t.clientY-s.clientY)<2?(_c+1)%3:1}function i0(s,t){let e=Ac(s,t),i=Ou(t),n=s.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),n=n.map(r.changes))},get(r,o,l){let a=Ac(s,r),h,f=Mc(s,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let c=Mc(s,e.pos,e.bias,i),u=Math.min(c.from,f.from),d=Math.max(c.to,f.to);f=u1&&(h=n0(n,a.pos))?h:l?n.addRange(f):N.create([f])}}}function n0(s,t){for(let e=0;e=t)return N.create(s.ranges.slice(0,e).concat(s.ranges.slice(e+1)),s.mainIndex==e?0:s.mainIndex-(s.mainIndex>e?1:0))}return null}be.dragstart=(s,t)=>{let{selection:{main:e}}=s.state;if(t.target.draggable){let n=s.docView.nearest(t.target);if(n&&n.isWidget){let r=n.posAtStart,o=r+n.length;(r>=e.to||o<=e.from)&&(e=N.range(r,o))}}let{inputState:i}=s;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",qr(s.state,da,s.state.sliceDoc(e.from,e.to))),t.dataTransfer.effectAllowed="copyMove"),!1};be.dragend=s=>(s.inputState.draggedContent=null,!1);function Dc(s,t,e,i){if(e=qr(s.state,ua,e),!e)return;let n=s.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=s.inputState,o=i&&r&&Xm(s,t)?{from:r.from,to:r.to}:null,l={from:n,insert:e},a=s.state.changes(o?[o,l]:l);s.focus(),s.dispatch({changes:a,selection:{anchor:a.mapPos(n,-1),head:a.mapPos(n,1)},userEvent:o?"move.drop":"input.drop"}),s.inputState.draggedContent=null}be.drop=(s,t)=>{if(!t.dataTransfer)return!1;if(s.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),n=0,r=()=>{++n==e.length&&Dc(s,t,i.filter(o=>o!=null).join(s.state.lineBreak),!1)};for(let o=0;o{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return Dc(s,t,i,!0),!0}return!1};be.paste=(s,t)=>{if(s.state.readOnly)return!0;s.observer.flush();let e=Tu?null:t.clipboardData;return e?(Au(s,e.getData("text/plain")||e.getData("text/uri-list")),!0):(Zm(s),!1)};function s0(s,t){let e=s.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),s.focus()},50)}function r0(s){let t=[],e=[],i=!1;for(let n of s.selection.ranges)n.empty||(t.push(s.sliceDoc(n.from,n.to)),e.push(n));if(!t.length){let n=-1;for(let{from:r}of s.selection.ranges){let o=s.doc.lineAt(r);o.number>n&&(t.push(o.text),e.push({from:o.from,to:Math.min(s.doc.length,o.to+1)})),n=o.number}i=!0}return{text:qr(s,da,t.join(s.lineBreak)),ranges:e,linewise:i}}var Yl=null;be.copy=be.cut=(s,t)=>{let{text:e,ranges:i,linewise:n}=r0(s.state);if(!e&&!n)return!1;Yl=n?e:null,t.type=="cut"&&!s.state.readOnly&&s.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=Tu?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(s0(s,e),!1)};var _u=xt.define();function Eu(s,t){let e=[];for(let i of s.facet(uu)){let n=i(s,t);n&&e.push(n)}return e.length?s.update({effects:e,annotations:_u.of(!0)}):null}function Du(s){setTimeout(()=>{let t=s.hasFocus;if(t!=s.inputState.notifiedFocused){let e=Eu(s.state,t);e?s.dispatch(e):s.update([])}},10)}he.focus=s=>{s.inputState.lastFocusTime=Date.now(),!s.scrollDOM.scrollTop&&(s.inputState.lastScrollTop||s.inputState.lastScrollLeft)&&(s.scrollDOM.scrollTop=s.inputState.lastScrollTop,s.scrollDOM.scrollLeft=s.inputState.lastScrollLeft),Du(s)};he.blur=s=>{s.observer.clearSelectionRange(),Du(s)};he.compositionstart=he.compositionupdate=s=>{s.observer.editContext||(s.inputState.compositionFirstChange==null&&(s.inputState.compositionFirstChange=!0),s.inputState.composing<0&&(s.inputState.composing=0))};he.compositionend=s=>{s.observer.editContext||(s.inputState.composing=-1,s.inputState.compositionEndedAt=Date.now(),s.inputState.compositionPendingKey=!0,s.inputState.compositionPendingChange=s.observer.pendingRecords().length>0,s.inputState.compositionFirstChange=null,D.chrome&&D.android?s.observer.flushSoon():s.inputState.compositionPendingChange?Promise.resolve().then(()=>s.observer.flush()):setTimeout(()=>{s.inputState.composing<0&&s.docView.hasComposition&&s.update([])},50))};he.contextmenu=s=>{s.inputState.lastContextMenu=Date.now()};be.beforeinput=(s,t)=>{var e,i;if(t.inputType=="insertReplacementText"&&s.observer.editContext){let r=(e=t.dataTransfer)===null||e===void 0?void 0:e.getData("text/plain"),o=t.getTargetRanges();if(r&&o.length){let l=o[0],a=s.posAtDOM(l.startContainer,l.startOffset),h=s.posAtDOM(l.endContainer,l.endOffset);return ma(s,{from:a,to:h,insert:s.state.toText(r)},null),!0}}let n;if(D.chrome&&D.android&&(n=Cu.find(r=>r.inputType==t.inputType))&&(s.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let r=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var o;(((o=window.visualViewport)===null||o===void 0?void 0:o.height)||0)>r+10&&s.hasFocus&&(s.contentDOM.blur(),s.focus())},100)}return D.ios&&t.inputType=="deleteContentForward"&&s.observer.flushSoon(),D.safari&&t.inputType=="insertText"&&s.inputState.composing>=0&&setTimeout(()=>he.compositionend(s,t),20),!1};var Pc=new Set;function o0(s){Pc.has(s)||(Pc.add(s),s.addEventListener("copy",()=>{}),s.addEventListener("cut",()=>{}))}var Rc=["pre-wrap","normal","pre-line","break-spaces"],mn=!1;function Ic(){mn=!1}var Xl=class{constructor(t){this.lineWrapping=t,this.doc=$.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return Rc.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t){this.height!=t&&(Math.abs(this.height-t)>Rr&&(mn=!0),this.height=t)}replace(t,e,i){return s.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let r=this,o=i.doc;for(let l=n.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:c}=n[l],u=r.lineAt(a,lt.ByPosNoHeight,i.setDoc(e),0,0),d=u.to>=h?u:r.lineAt(h,lt.ByPosNoHeight,i,0,0);for(c+=d.to-h,h=d.to;l>0&&u.from<=n[l-1].toA;)a=n[l-1].fromA,f=n[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,n-=l.size}else if(r>n*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(n=r&&o(this.blockAt(0,i,n,r))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},ae=class s extends Wr{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new Te(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return i.length==1&&(n instanceof s||n instanceof di&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof di?n=new s(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):Qt.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(n.heights[n.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},di=class s extends Qt{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,n=t.doc.lineAt(e+this.length).number,r=n-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:n,perLine:o,perChar:l}}blockAt(t,e,i,n){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let h=n+(t0){let r=i[i.length-1];r instanceof s?i[i.length-1]=new s(r.length+n):i.push(null,new s(n-1))}if(t>0){let r=i[0];r instanceof s?i[0]=new s(t+r.length):i.unshift(new s(t-1),null)}return Qt.of(i)}decomposeLeft(t,e){e.push(new s(t-1),null)}decomposeRight(t,e){e.push(null,new s(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let r=e+this.length;if(n&&n.from<=e+this.length&&n.more){let o=[],l=Math.max(e,n.from),a=-1;for(n.from>e&&o.push(new s(n.from-e-1).updateHeight(t,e));l<=r&&n.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let c=n.heights[n.index++];a==-1?a=c:Math.abs(c-a)>=Rr&&(a=-2);let u=new ae(f,c);u.outdated=!1,o.push(u),l+=f+1}l<=r&&o.push(null,new s(r-l).updateHeight(t,l));let h=Qt.of(o);return(a<0||Math.abs(h.height-this.height)>=Rr||Math.abs(a-this.heightMetrics(t,e).perLine)>=Rr)&&(mn=!0),zr(this,h)}else(i||this.outdated)&&(this.setHeight(t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Ql=class extends Qt{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,n){let r=i+this.left.height;return tl))return h;let f=e==lt.ByPosNoHeight?lt.ByPosNoHeight:lt.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,n,r).join(h)}forEachLine(t,e,i,n,r,o){let l=n+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,lt.ByPos,i,n,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&Bc(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t2*e.size||e.size>2*t.size?Qt.of(this.break?[t,null,e]:[t,e]):(this.left=zr(this.left,t),this.right=zr(this.right,e),this.setHeight(t.height+e.height),this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return n&&n.from<=e+r.length&&n.more?a=r=r.updateHeight(t,e,i,n):r.updateHeight(t,e,i),n&&n.from<=l+o.length&&n.more?a=o=o.updateHeight(t,l,i,n):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function Bc(s,t){let e,i;s[t]==null&&(e=s[t-1])instanceof di&&(i=s[t+1])instanceof di&&s.splice(t-1,3,new di(e.length+1+i.length))}var l0=5,Zl=class s{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof ae?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new ae(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=l0)&&this.addLineDeco(n,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new ae(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new di(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof ae)return t;let e=new ae(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof ae)&&!this.isCovered?this.nodes.push(new ae(0,-1)):(this.writtenTof.clientHeight||f.scrollWidth>f.clientWidth)&&c.overflow!="visible"){let u=f.getBoundingClientRect();r=Math.max(r,u.left),o=Math.min(o,u.right),l=Math.max(l,u.top),a=Math.min(h==s.parentNode?n.innerHeight:a,u.bottom)}h=c.position=="absolute"||c.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function f0(s){let t=s.getBoundingClientRect(),e=s.ownerDocument.defaultView||window;return t.left0&&t.top0}function c0(s,t){let e=s.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var hs=class{constructor(t,e,i,n){this.from=t,this.to=e,this.size=i,this.displaySize=n}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new Xl(e),this.stateDeco=t.facet(gs).filter(i=>typeof i!="function"),this.heightMap=Qt.empty().applyChanges(this.stateDeco,$.empty,this.heightOracle.setDoc(t.doc),[new Oe(0,0,0,t.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=J.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>n>=r&&n<=o)){let{from:r,to:o}=this.lineBlockAt(n);t.push(new dn(r,o))}}return this.viewports=t.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let t=this.scaler;return this.scaler=this.heightMap.height<=7e6?Nc:new ia(this.heightOracle,this.heightMap,this.viewports),t.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(ss(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(gs).filter(f=>typeof f!="function");let n=t.changedRanges,r=Oe.extendWithRanges(n,a0(i,this.stateDeco,t?t.changes:Yt.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);Ic(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),(this.heightMap.height!=o||mn)&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=o);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,t.flags|=this.updateForViewport(),(h||!t.changes.empty||t.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(t.changes),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(Sm)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),n=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?mt.RTL:mt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:v,scaleY:x}=Wc(e,l);(v>.005&&Math.abs(this.scaleX-v)>.005||x>.005&&Math.abs(this.scaleY-x)>.005)&&(this.scaleX=v,this.scaleY=x,h|=16,o=a=!0)}let c=(parseInt(i.paddingTop)||0)*this.scaleY,u=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=u)&&(this.paddingTop=c,this.paddingBottom=u,h|=18),this.editorWidth!=t.scrollDOM.clientWidth&&(n.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=16);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=jc(t.scrollDOM);let p=(this.printing?c0:h0)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget&&!f0(t.dom))return 0;let w=l.width;if((this.contentDOMWidth!=w||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=16),a){let v=t.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(v)&&(o=!0),o||n.lineWrapping&&Math.abs(w-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:S,textHeight:k}=t.docView.measureTextSize();o=x>0&&n.refresh(r,x,S,k,w/S,v),o&&(t.docView.minWidth=0,h|=16)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),Ic();for(let x of this.viewports){let S=x.from==this.viewport.from?v:t.docView.measureVisibleLineHeights(x);this.heightMap=(o?Qt.empty().applyChanges(this.stateDeco,$.empty,this.heightOracle,[new Oe(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(n,0,o,new Jl(x.from,S))}mn&&(h|=2)}let y=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return y&&(h&2&&(h|=this.updateScaler()),this.viewport=this.getViewport(f,this.scrollTarget),h|=this.updateForViewport()),(h&2||y)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new dn(n.lineAt(o-i*1e3,lt.ByHeight,r,0,0).from,n.lineAt(l+(1-i)*1e3,lt.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=n.lineAt(h,lt.ByPos,r,0,0),u;e.y=="center"?u=(c.top+c.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&n>o-2*1e3&&r>1,o=n<<1;if(this.defaultTextDirection!=mt.LTR&&!i)return[];let l=[],a=(f,c,u,d)=>{if(c-ff&&bb.from>=u.from&&b.to<=u.to&&Math.abs(b.from-f)b.fromw));if(!m){if(cy.from<=c&&y.to>=c)){let y=e.moveToLineBoundary(N.cursor(c),!1,!0).head;y>f&&(c=y)}let b=this.gapSize(u,f,c,d),w=i||b<2e6?b:2e6;m=new hs(f,c,b,w)}l.push(m)},h=f=>{if(f.length2e6)for(let S of t)S.from>=f.from&&S.fromf.from&&a(f.from,d,f,c),pe.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(t){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let i=[];K.spans(e,this.viewport.from,this.viewport.to,{span(r,o){i.push({from:r,to:o})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let r=0;r=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||ss(this.heightMap.lineAt(t,lt.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return t>=this.viewportLines[0].top&&t<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(e=>e.top<=t&&e.bottom>=t)||ss(this.heightMap.lineAt(this.scaler.fromDOM(t),lt.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return ss(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},dn=class{constructor(t,e){this.from=t,this.to=e}};function u0(s,t,e){let i=[],n=s,r=0;return K.spans(e,s,t,{span(){},point(o,l){o>n&&(i.push({from:n,to:o}),r+=o-n),n=l}},20),n=1)return t[t.length-1].to;let i=Math.floor(s*e);for(let n=0;;n++){let{from:r,to:o}=t[n],l=o-r;if(i<=l)return r+i;i-=l}}function Ar(s,t){let e=0;for(let{from:i,to:n}of s.ranges){if(t<=n){e+=t-i;break}e+=n-i}return e/s.total}function d0(s,t){for(let e of s)if(t(e))return e}var Nc={toDOM(s){return s},fromDOM(s){return s},scale:1,eq(s){return s==this}},ia=class s{constructor(t,e,i){let n=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,lt.ByPos,t,0,0).top,f=e.lineAt(a,lt.ByPos,t,0,0).bottom;return n+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(e.height-n);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let r=ee.from==t.viewports[i].from&&e.to==t.viewports[i].to):!1}};function ss(s,t){if(t.scale==1)return s;let e=t.toDOM(s.top),i=t.toDOM(s.bottom);return new Te(s.from,s.length,e,i-e,Array.isArray(s._content)?s._content.map(n=>ss(n,t)):s._content)}var Or=L.define({combine:s=>s.join(" ")}),na=L.define({combine:s=>s.indexOf(!0)>-1}),sa=le.newName(),Pu=le.newName(),Ru=le.newName(),Iu={"&light":"."+Pu,"&dark":"."+Ru};function ra(s,t,e){return new le(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,n=>{if(n=="&")return s;if(!e||!e[n])throw new RangeError(`Unsupported selector: ${n}`);return e[n]}):s+" "+i}})}var p0=ra("."+sa,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Iu),g0={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Pl=D.ie&&D.ie_version<=11,oa=class{constructor(t){this.view=t,this.active=!1,this.editContext=null,this.selectionRange=new Il,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(D.ie&&D.ie_version<=11||D.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&t.constructor.EDIT_CONTEXT!==!1&&!(D.chrome&&D.chrome_version<126)&&(this.editContext=new la(t),t.state.facet(Je)&&(t.contentDOM.editContext=this.editContext.editContext)),Pl&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(t){(t.type=="change"||!t.type)&&!t.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(Je)?i.root.activeElement!=this.dom:!Er(this.dom,n))return;let r=n.anchorNode&&i.docView.nearest(n.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(D.ie&&D.ie_version<=11||D.android&&D.chrome)&&!i.state.selection.main.empty&&n.focusNode&&rs(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=fs(t.root);if(!e)return!1;let i=D.safari&&t.root.nodeType==11&&t.root.activeElement==this.dom&&m0(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let n=Er(this.dom,i);return n&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&pn(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(n=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&Er(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new ql(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=Su(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=Lc(e,t.previousSibling||t.target.previousSibling,-1),n=Lc(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}update(t){this.editContext&&(this.editContext.update(t),t.startState.facet(Je)!=t.state.facet(Je)&&(t.view.contentDOM.editContext=t.state.facet(Je)?this.editContext.editContext:null))}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function Lc(s,t,e){for(;t;){let i=nt.get(t);if(i&&i.parent==s)return i;let n=t.parentNode;t=n!=s.dom?n:e>0?t.nextSibling:t.previousSibling}return null}function Hc(s,t){let e=t.startContainer,i=t.startOffset,n=t.endContainer,r=t.endOffset,o=s.docView.domAtPos(s.state.selection.main.anchor);return rs(o.node,o.offset,n,r)&&([e,i,n,r]=[n,r,e,i]),{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}}function m0(s,t){if(t.getComposedRanges){let n=t.getComposedRanges(s.root)[0];if(n)return Hc(s,n)}let e=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),e=n.getTargetRanges()[0]}return s.contentDOM.addEventListener("beforeinput",i,!0),s.dom.ownerDocument.execCommand("indent"),s.contentDOM.removeEventListener("beforeinput",i,!0),e?Hc(s,e):null}var la=class{constructor(t){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(t.state);let e=this.editContext=new window.EditContext({text:t.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,t.state.selection.main.anchor))),selectionEnd:this.toContextPos(t.state.selection.main.head)});this.handlers.textupdate=i=>{let n=t.state.selection.main,{anchor:r,head:o}=n,l=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);t.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:l,drifted:!1});let h={from:l,to:a,insert:$.of(i.text.split(`\n`))};if(h.from==this.from&&rthis.to&&(h.to=r),h.from==h.to&&!h.insert.length){let f=N.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));f.main.eq(n)||t.dispatch({selection:f,userEvent:"select"});return}if((D.mac||D.android)&&h.from==o-1&&/^\\. ?$/.test(i.text)&&t.contentDOM.getAttribute("autocorrect")=="off"&&(h={from:l,to:a,insert:$.of([i.text.replace("."," ")])}),this.pendingContextChange=h,!t.state.readOnly){let f=this.to-this.from+(h.to-h.from+h.insert.length);ma(t,h,N.single(this.toEditorPos(i.selectionStart,f),this.toEditorPos(i.selectionEnd,f)))}this.pendingContextChange&&(this.revertPending(t.state),this.setSelection(t.state))},this.handlers.characterboundsupdate=i=>{let n=[],r=null;for(let o=this.toEditorPos(i.rangeStart),l=this.toEditorPos(i.rangeEnd);o{let n=[];for(let r of i.getTextFormats()){let o=r.underlineStyle,l=r.underlineThickness;if(o!="None"&&l!="None"){let a=this.toEditorPos(r.rangeStart),h=this.toEditorPos(r.rangeEnd);if(a{t.inputState.composing<0&&(t.inputState.composing=0,t.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(t.inputState.composing=-1,t.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(t.state)}};for(let i in this.handlers)e.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=fs(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(t){let e=0,i=!1,n=this.pendingContextChange;return t.changes.iterChanges((r,o,l,a,h)=>{if(i)return;let f=h.length-(o-r);if(n&&o>=n.to)if(n.from==r&&n.to==o&&n.insert.eq(h)){n=this.pendingContextChange=null,e+=f,this.to+=f;return}else n=null,this.revertPending(t.state);if(r+=e,o+=e,o<=this.from)this.from+=f,this.to+=f;else if(rthis.to||this.to-this.from+h.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(r),this.toContextPos(o),h.toString()),this.to+=f}e+=f}),n&&!i&&this.revertPending(t.state),!i}update(t){let e=this.pendingContextChange,i=t.startState.selection.main;this.composing&&(this.composing.drifted||!t.changes.touchesRange(i.from,i.to)&&t.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=t.changes.mapPos(this.composing.editorBase)):!this.applyEdits(t)||!this.rangeIsValid(t.state)?(this.pendingContextChange=null,this.reset(t.state)):(t.docChanged||t.selectionSet||e)&&this.setSelection(t.state),(t.geometryChanged||t.docChanged||t.selectionSet)&&t.view.requestMeasure(this.measureReq)}resetRange(t){let{head:e}=t.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(t.doc.length,e+1e4)}reset(t){this.resetRange(t),this.editContext.updateText(0,this.editContext.text.length,t.doc.sliceString(this.from,this.to)),this.setSelection(t)}revertPending(t){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),t.doc.sliceString(e.from,e.to))}setSelection(t){let{main:e}=t.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),n=this.toContextPos(e.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(t){let{head:e}=t.selection.main;return!(this.from>0&&e-this.from<500||this.to1e4*3)}toEditorPos(t,e=this.to-this.from){t=Math.min(t,e);let i=this.composing;return i&&i.drifted?i.editorBase+(t-i.contextBase):t+this.from}toContextPos(t){let e=this.composing;return e&&e.drifted?e.contextBase+(t-e.editorBase):t-this.from}destroy(){for(let t in this.handlers)this.editContext.removeEventListener(t,this.handlers[t])}},W=class s{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){var e;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:i}=t;this.dispatchTransactions=t.dispatchTransactions||i&&(n=>n.forEach(r=>i(r,this)))||(n=>this.update(n)),this.dispatch=this.dispatch.bind(this),this._root=t.root||om(t.parent)||document,this.viewState=new Gr(t.state||ct.create(t)),t.scrollTo&&t.scrollTo.is(Sr)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(es).map(n=>new as(n));for(let n of this.plugins)n.update(this);this.observer=new oa(this),this.inputState=new $l(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Fr(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((e=document.fonts)===null||e===void 0)&&e.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...t){let e=t.length==1&&t[0]instanceof Gt?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,n,r=this.state;for(let u of t){if(u.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=u.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(u=>u.annotation(_u))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=Eu(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(ct.phrases)!=this.state.facet(ct.phrases))return this.setState(r);n=Hr.create(this,r,t),n.flags|=l;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let u of t){if(c&&(c=c.map(u.changes)),u.scrollIntoView){let{main:d}=u.state.selection;c=new ls(d.empty?d:N.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of u.effects)d.is(Sr)&&(c=d.value.clip(this.state))}this.viewState.update(n,c),this.bidiCache=Ur.update(this.bidiCache,n.changes),n.empty||(this.updatePlugins(n),this.inputState.update(n)),e=this.docView.update(n),this.state.facet(is)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(u=>u.isUserEvent("select.pointer")))}finally{this.updateState=0}if(n.startState.facet(Or)!=n.state.facet(Or)&&(this.viewState.mustMeasureContent=!0),(e||i||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),e&&this.docViewUpdate(),!n.empty)for(let u of this.state.facet(Gl))try{u(n)}catch(d){ge(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!Su(this,f)&&h.force&&pn(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new Gr(t),this.plugins=t.facet(es).map(i=>new as(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new Fr(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(es),i=t.state.facet(es);if(e!=i){let n=[];for(let r of i){let o=e.indexOf(r);if(o<0)n.push(new as(r));else{let l=this.plugins[o];l.mustUpdate=t,n.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let n of this.plugins)n.mustUpdate=t;for(let n=0;n-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(jc(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(n);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return ge(this.state,p),Fc}}),c=Hr.create(this,this.state,[]),u=!1;c.flags|=a,e?e.flags|=a:e=c,this.updateState=2,c.empty||(this.updatePlugins(c),this.inputState.update(c),this.updateAttrs(),u=this.docView.update(c),u&&this.docViewUpdate());for(let d=0;d1||p<-1){n=n+p,i.scrollTop=n/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(Gl))l(e)}get themeClasses(){return sa+" "+(this.state.facet(na)?Ru:Pu)+" "+this.state.facet(Or)}updateAttrs(){let t=Vc(this,mu,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(Je)?"true":"false",class:"cm-content",style:`${D.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Vc(this,pa,e);let i=this.observer.ignore(()=>{let n=Fl(this.contentDOM,this.contentAttrs,e),r=Fl(this.dom,this.editorAttrs,t);return n||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let n of i.effects)if(n.is(s.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=n.value}}mountStyles(){this.styleModules=this.state.facet(is);let t=this.state.facet(s.cspNonce);le.mount(this.root,this.styleModules.concat(p0).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return Dl(this,t,Sc(this,t,e,i))}moveByGroup(t,e){return Dl(this,t,Sc(this,t,e,i=>Fm(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return N.cursor(r.side(e,n)+t.from,r.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return Hm(this,t,e,i)}moveVertically(t,e,i){return Dl(this,t,Vm(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),xu(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let n=this.state.doc.lineAt(t),r=this.bidiSpans(n),o=r[Ae.find(r,t-n.from,-1,e)];return ms(i,o.dir==mt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(du)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>b0)return ru(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||su(r.isolates,i=wc(this,t))))return r.order;i||(i=wc(this,t));let n=vm(t.text,e,i);return this.bidiCache.push(new Ur(t.from,t.to,e,i,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||D.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Gc(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return Sr.of(new ls(typeof t=="number"?N.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return Sr.of(new ls(N.cursor(i.from),"start","start",i.top-t,e,!0))}setTabFocusMode(t){t==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof t=="boolean"?this.inputState.tabFocusMode=t?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+t)}static domEventHandlers(t){return me.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return me.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=le.newName(),n=[Or.of(i),is.of(ra(`.${i}`,t))];return e&&e.dark&&n.push(na.of(!0)),n}static baseTheme(t){return ci.lowest(is.of(ra("."+sa,t,Iu)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&nt.get(i)||nt.get(t);return((e=n==null?void 0:n.rootView)===null||e===void 0?void 0:e.view)||null}};W.styleModule=is;W.inputHandler=cu;W.clipboardInputFilter=ua;W.clipboardOutputFilter=da;W.scrollHandler=pu;W.focusChangeEffect=uu;W.perLineTextDirection=du;W.exceptionSink=fu;W.updateListener=Gl;W.editable=Je;W.mouseSelectionStyle=hu;W.dragMovesSelection=au;W.clickAddsSelectionRange=lu;W.decorations=gs;W.outerDecorations=bu;W.atomicRanges=ga;W.bidiIsolatedRanges=wu;W.scrollMargins=yu;W.darkTheme=na;W.cspNonce=L.define({combine:s=>s.length?s[0]:""});W.contentAttributes=pa;W.editorAttributes=mu;W.lineWrapping=W.contentAttributes.of({class:"cm-lineWrapping"});W.announce=ot.define();var b0=4096,Fc={},Ur=class s{constructor(t,e,i,n,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],n=t.length?t[t.length-1].dir:mt.LTR;for(let r=Math.max(0,t.length-10);r=0;n--){let r=i[n],o=typeof r=="function"?r(s):r;o&&Hl(o,e)}return e}var w0=D.mac?"mac":D.windows?"win":D.linux?"linux":"key";function y0(s,t){let e=s.split(/-(?!$)/),i=e[e.length-1];i=="Space"&&(i=" ");let n,r,o,l;for(let a=0;ai.concat(n),[]))),e}var ui=null,x0=4e3;function S0(s,t=w0){let e=Object.create(null),i=Object.create(null),n=(o,l)=>{let a=i[o];if(a==null)i[o]=l;else if(a!=l)throw new Error("Key binding "+o+" is used both as a regular binding and as a multi-stroke prefix")},r=(o,l,a,h,f)=>{var c,u;let d=e[o]||(e[o]=Object.create(null)),p=l.split(/ (?!$)/).map(b=>y0(b,t));for(let b=1;b{let v=ui={view:y,prefix:w,scope:o};return setTimeout(()=>{ui==v&&(ui=null)},x0),!0}]})}let g=p.join(" ");n(g,!1);let m=d[g]||(d[g]={preventDefault:!1,stopPropagation:!1,run:((u=(c=d._any)===null||c===void 0?void 0:c.run)===null||u===void 0?void 0:u.slice())||[]});a&&m.run.push(a),h&&(m.preventDefault=!0),f&&(m.stopPropagation=!0)};for(let o of s){let l=o.scope?o.scope.split(" "):["editor"];if(o.any)for(let h of l){let f=e[h]||(e[h]=Object.create(null));f._any||(f._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:c}=o;for(let u in f)f[u].run.push(d=>c(d,aa))}let a=o[t]||o.key;if(a)for(let h of l)r(h,a,o.run,o.preventDefault,o.stopPropagation),o.shift&&r(h,"Shift-"+a,o.shift,o.preventDefault,o.stopPropagation)}return e}var aa=null;function C0(s,t,e,i){aa=t;let n=fc(t),r=Kf(n,0),o=Yf(r)==n.length&&n!=" ",l="",a=!1,h=!1,f=!1;ui&&ui.view==e&&ui.scope==i&&(l=ui.prefix+" ",Mu.indexOf(t.keyCode)<0&&(h=!0,ui=null));let c=new Set,u=m=>{if(m){for(let b of m.run)if(!c.has(b)&&(c.add(b),b(e)))return m.stopPropagation&&(f=!0),!0;m.preventDefault&&(m.stopPropagation&&(f=!0),h=!0)}return!1},d=s[i],p,g;return d&&(u(d[l+_r(n,t,!o)])?a=!0:o&&(t.altKey||t.metaKey||t.ctrlKey)&&!(D.windows&&t.ctrlKey&&t.altKey)&&(p=Xe[t.keyCode])&&p!=n?(u(d[l+_r(p,t,!0)])||t.shiftKey&&(g=cn[t.keyCode])!=n&&g!=p&&u(d[l+_r(g,t,!1)]))&&(a=!0):o&&t.shiftKey&&u(d[l+_r(n,t,!0)])&&(a=!0),!a&&u(d._any)&&(a=!0)),h&&(a=!0),a&&f&&t.stopPropagation(),aa=null,a}var dv=/x/.unicode!=null?"gu":"g";var ha=class extends Fi{constructor(t){super(),this.content=t}toDOM(t){let e=document.createElement("span");return e.className="cm-placeholder",e.style.pointerEvents="none",e.appendChild(typeof this.content=="string"?document.createTextNode(this.content):typeof this.content=="function"?this.content(t):this.content.cloneNode(!0)),e.setAttribute("aria-hidden","true"),e}coordsAt(t){let e=t.firstChild?gn(t.firstChild):[];if(!e.length)return null;let i=window.getComputedStyle(t.parentNode),n=ms(e[0],i.direction!="rtl"),r=parseInt(i.lineHeight);return n.bottom-n.top>r*1.5?{left:n.left,right:n.right,top:n.top,bottom:n.top+r}:n}ignoreEvent(){return!1}};function Bu(s){let t=me.fromClass(class{constructor(e){this.view=e,this.placeholder=s?J.set([J.widget({widget:new ha(s),side:1}).range(0)]):J.none}get decorations(){return this.view.state.doc.length?J.none:this.placeholder}},{decorations:e=>e.decorations});return typeof s=="string"?[t,W.contentAttributes.of({"aria-placeholder":s})]:t}var pv=W.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var Zt=class extends Ke{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};Zt.prototype.elementClass="";Zt.prototype.toDOM=void 0;Zt.prototype.mapMode=Wt.TrackBefore;Zt.prototype.startSide=Zt.prototype.endSide=-1;Zt.prototype.point=!0;var $r=L.define();var M0=0,bs=class{constructor(t,e){this.from=t,this.to=e}},Q=class{constructor(t={}){this.id=M0++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=fe.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};Q.closedBy=new Q({deserialize:s=>s.split(" ")});Q.openedBy=new Q({deserialize:s=>s.split(" ")});Q.group=new Q({deserialize:s=>s.split(" ")});Q.isolate=new Q({deserialize:s=>{if(s&&s!="rtl"&&s!="ltr"&&s!="auto")throw new RangeError("Invalid value for isolate: "+s);return s||"auto"}});Q.contextHash=new Q({perNode:!0});Q.lookAhead=new Q({perNode:!0});Q.mounted=new Q({perNode:!0});var bn=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[Q.mounted.id]}},T0=Object.create(null),fe=class s{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):T0,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),n=new s(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(n)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return n}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(Q.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return i=>{for(let n=i.prop(Q.group),r=-1;r<(n?n.length:0);r++){let o=e[r<0?i.name:n[r]];if(o)return o}}}};fe.none=new fe("",Object.create(null),0,8);var Kr=new WeakMap,Lu=new WeakMap,St;(function(s){s[s.ExcludeBuffers=1]="ExcludeBuffers",s[s.IncludeAnonymous=2]="IncludeAnonymous",s[s.IgnoreMounts=4]="IgnoreMounts",s[s.IgnoreOverlays=8]="IgnoreOverlays"})(St||(St={}));var Rt=class s{constructor(t,e,i,n,r){if(this.type=t,this.children=e,this.positions=i,this.length=n,this.props=null,r&&r.length){this.props=Object.create(null);for(let[o,l]of r)this.props[typeof o=="number"?o:o.id]=l}}toString(){let t=bn.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let i of this.children){let n=i.toString();n&&(e&&(e+=","),e+=n)}return this.type.name?(/\\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new vs(this.topNode,t)}cursorAt(t,e=0,i=0){let n=Kr.get(this)||this.topNode,r=new vs(n);return r.moveTo(t,e),Kr.set(this,r._tree),r}get topNode(){return new De(this,0,0,null)}resolve(t,e=0){let i=ws(Kr.get(this)||this.topNode,t,e,!1);return Kr.set(this,i),i}resolveInner(t,e=0){let i=ws(Lu.get(this)||this.topNode,t,e,!0);return Lu.set(this,i),i}resolveStack(t,e=0){return A0(this,t,e)}iterate(t){let{enter:e,leave:i,from:n=0,to:r=this.length}=t,o=t.mode||0,l=(o&St.IncludeAnonymous)>0;for(let a=this.cursor(o|St.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=n&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:Ca(fe.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,n)=>new s(this.type,e,i,n,this.propValues),t.makeTree||((e,i,n)=>new s(fe.none,e,i,n)))}static build(t){return O0(t)}};Rt.empty=new Rt(fe.none,[],[],0);var wa=class s{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new s(this.buffer,this.index)}},bi=class s{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return fe.none}toString(){let t=[];for(let e=0;e0));a=o[a+3]);return l}slice(t,e,i){let n=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l=t&&et;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function ws(s,t,e,i){for(var n;s.from==s.to||(e<1?s.from>=t:s.from>t)||(e>-1?s.to<=t:s.to0?l.length:-1;t!=h;t+=e){let f=l[t],c=a[t]+o.from;if(Vu(n,i,c,c+f.length)){if(f instanceof bi){if(r&St.ExcludeBuffers)continue;let u=f.findChild(0,f.buffer.length,e,i-c,n);if(u>-1)return new ys(new va(o,f,t,c),null,u)}else if(r&St.IncludeAnonymous||!f.type.isAnonymous||Sa(f)){let u;if(!(r&St.IgnoreMounts)&&(u=bn.get(f))&&!u.overlay)return new s(u.tree,c,t,o);let d=new s(f,c,t,o);return r&St.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,n)}}}if(r&St.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&St.IgnoreOverlays)&&(n=bn.get(this._tree))&&n.overlay){let r=t-this.from;for(let{from:o,to:l}of n.overlay)if((e>0?o<=r:o=r:l>r))return new s(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Hu(s,t,e,i){let n=s.cursor(),r=[];if(!n.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=n.type.is(e),!n.nextSibling())return r}for(;;){if(i!=null&&n.type.is(i))return r;if(n.type.is(t)&&r.push(n.node),!n.nextSibling())return i==null?r:[]}}function ya(s,t,e=t.length-1){for(let i=s;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var va=class{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}},ys=class s extends Xr{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new s(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&St.ExcludeBuffers)return null;let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new s(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new s(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new s(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,r=i.buffer[this.index+3];if(r>n){let o=i.buffer[this.index+1];t.push(i.slice(n,r,o)),e.push(0)}return new Rt(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function zu(s){if(!s.length)return null;let t=0,e=s[0];for(let r=1;re.from||o.to=t){let l=new De(o.tree,o.overlay[0].from+r.from,-1,r);(n||(n=[i])).push(ws(l,t,e,!1))}}return n?zu(n):i}var vs=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof De)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[t]],this.from=i+n.buffer[t+1],this.to=i+n.buffer[t+2],!0}yield(t){return t?t instanceof De?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:n}=this.buffer,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&St.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&St.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&St.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(e.findChild(n,this.index,-1,0,4))}else{let n=e.buffer[this.index+3];if(n<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:n}=this;if(n){if(t>0){if(this.index-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&St.IncludeAnonymous||l instanceof bi||!l.type.isAnonymous||Sa(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==n){if(n==this.index)return o;e=o,i=r+1;break t}n=this.stack[--r]}for(let n=i;n=0;r--){if(r<0)return ya(this._tree,t,n);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[n]&&t[n]!=o.name)return!1;n--}}return!0}};function Sa(s){return s.children.some(t=>t instanceof bi||!t.type.isAnonymous||Sa(t))}function O0(s){var t;let{buffer:e,nodeSet:i,maxBufferLength:n=1024,reused:r=[],minRepeatType:o=i.types.length}=s,l=Array.isArray(e)?new wa(e,e.length):e,a=i.types,h=0,f=0;function c(x,S,k,R,P,z){let{id:E,start:M,end:H,size:F}=l,j=f,Mt=h;for(;F<0;)if(l.next(),F==-1){let kt=r[E];k.push(kt),R.push(M-x);return}else if(F==-3){h=E;return}else if(F==-4){f=E;return}else throw new RangeError(`Unrecognized record size: ${F}`);let pe=a[E],qe,Lt,$n=M-x;if(H-M<=n&&(Lt=m(l.pos-S,P))){let kt=new Uint16Array(Lt.size-Lt.skip),rt=l.pos-Lt.size,ut=kt.length;for(;l.pos>rt;)ut=b(Lt.start,kt,ut);qe=new bi(kt,H-Lt.start,i),$n=Lt.start-x}else{let kt=l.pos-F;l.next();let rt=[],ut=[],Ht=E>=o?E:-1,$t=0,$e=H;for(;l.pos>kt;)Ht>=0&&l.id==Ht&&l.size>=0?(l.end<=$e-n&&(p(rt,ut,M,$t,l.end,$e,Ht,j,Mt),$t=rt.length,$e=l.end),l.next()):z>2500?u(M,kt,rt,ut):c(M,kt,rt,ut,Ht,z+1);if(Ht>=0&&$t>0&&$t-1&&$t>0){let Kn=d(pe,Mt);qe=Ca(pe,rt,ut,0,rt.length,0,H-M,Kn,Kn)}else qe=g(pe,rt,ut,H-M,j-H,Mt)}k.push(qe),R.push($n)}function u(x,S,k,R){let P=[],z=0,E=-1;for(;l.pos>S;){let{id:M,start:H,end:F,size:j}=l;if(j>4)l.next();else{if(E>-1&&H=0;F-=3)M[j++]=P[F],M[j++]=P[F+1]-H,M[j++]=P[F+2]-H,M[j++]=j;k.push(new bi(M,P[2]-H,i)),R.push(H-x)}}function d(x,S){return(k,R,P)=>{let z=0,E=k.length-1,M,H;if(E>=0&&(M=k[E])instanceof Rt){if(!E&&M.type==x&&M.length==P)return M;(H=M.prop(Q.lookAhead))&&(z=R[E]+M.length+H)}return g(x,k,R,P,z,S)}}function p(x,S,k,R,P,z,E,M,H){let F=[],j=[];for(;x.length>R;)F.push(x.pop()),j.push(S.pop()+k-P);x.push(g(i.types[E],F,j,z-P,M-z,H)),S.push(P-k)}function g(x,S,k,R,P,z,E){if(z){let M=[Q.contextHash,z];E=E?[M].concat(E):[M]}if(P>25){let M=[Q.lookAhead,P];E=E?[M].concat(E):[M]}return new Rt(x,S,k,R,E)}function m(x,S){let k=l.fork(),R=0,P=0,z=0,E=k.end-n,M={size:0,start:0,skip:0};t:for(let H=k.pos-x;k.pos>H;){let F=k.size;if(k.id==S&&F>=0){M.size=R,M.start=P,M.skip=z,z+=4,R+=4,k.next();continue}let j=k.pos-F;if(F<0||j=o?4:0,pe=k.start;for(k.next();k.pos>j;){if(k.size<0)if(k.size==-3)Mt+=4;else break t;else k.id>=o&&(Mt+=4);k.next()}P=pe,R+=F,z+=Mt}return(S<0||R==x)&&(M.size=R,M.start=P,M.skip=z),M.size>4?M:void 0}function b(x,S,k){let{id:R,start:P,end:z,size:E}=l;if(l.next(),E>=0&&R4){let H=l.pos-(E-4);for(;l.pos>H;)k=b(x,S,k)}S[--k]=M,S[--k]=z-x,S[--k]=P-x,S[--k]=R}else E==-3?h=R:E==-4&&(f=R);return k}let w=[],y=[];for(;l.pos>0;)c(s.start||0,s.bufferStart||0,w,y,-1,0);let v=(t=s.length)!==null&&t!==void 0?t:w.length?y[0]+w[0].length:0;return new Rt(a[s.topID],w.reverse(),y.reverse(),v)}var Fu=new WeakMap;function Yr(s,t){if(!s.isAnonymous||t instanceof bi||t.type!=s)return 1;let e=Fu.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=s||!(i instanceof Rt)){e=1;break}e+=Yr(s,i)}Fu.set(t,e)}return e}function Ca(s,t,e,i,n,r,o,l,a){let h=0;for(let p=i;p=f)break;S+=k}if(y==v+1){if(S>f){let k=p[v];d(k.children,k.positions,0,k.children.length,g[v]+w);continue}c.push(p[v])}else{let k=g[y-1]+p[y-1].length-x;c.push(Ca(s,p,g,v,y,x,k,null,a))}u.push(x+w-r)}}return d(t,e,i,n,0),(l||a)(c,u,o)}var we=class s{constructor(t,e,i,n,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let n=[new s(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&n.push(r);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l=i)for(;o&&o.from=u.from||c<=u.to||h){let d=Math.max(u.from,a)-h,p=Math.min(u.to,c)-h;u=d>=p?null:new s(d,p,u.tree,u.offset+h,l>0,!!f)}if(u&&n.push(u),o.to>c)break;o=rnew bs(n.from,n.to)):[new bs(0,0)]:[new bs(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let r=n.advance();if(r)return r}}},xa=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var Cv=new Q({perNode:!0});var _0=0,ye=class s{constructor(t,e,i,n){this.name=t,this.set=e,this.base=i,this.modified=n,this.id=_0++}toString(){let{name:t}=this;for(let e of this.modified)e.name&&(t=`${e.name}(${t})`);return t}static define(t,e){let i=typeof t=="string"?t:"?";if(t instanceof s&&(e=t),e!=null&&e.base)throw new Error("Can not derive from a modified tag");let n=new s(i,[],null,[]);if(n.set.push(n),e)for(let r of e.set)n.set.push(r);return n}static defineModifier(t){let e=new eo(t);return i=>i.modified.indexOf(e)>-1?i:eo.get(i.base||i,i.modified.concat(e).sort((n,r)=>n.id-r.id))}},E0=0,eo=class s{constructor(t){this.name=t,this.instances=[],this.id=E0++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&D0(e,l.modified));if(i)return i;let n=[],r=new ye(t.name,n,t,e);for(let l of e)l.instances.push(r);let o=P0(e);for(let l of t.set)if(!l.modified.length)for(let a of o)n.push(s.get(l,a));return r}};function D0(s,t){return s.length==t.length&&s.every((e,i)=>e==t[i])}function P0(s){let t=[[]];for(let e=0;ei.length-e.length)}var Av=new Q,io=class{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth{let o=n;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var T=ye.define,Qr=T(),wi=T(),Wu=T(wi),Gu=T(wi),yi=T(),Zr=T(yi),Ma=T(yi),Ie=T(),zi=T(Ie),Pe=T(),Re=T(),Ta=T(),ks=T(Ta),to=T(),O={comment:Qr,lineComment:T(Qr),blockComment:T(Qr),docComment:T(Qr),name:wi,variableName:T(wi),typeName:Wu,tagName:T(Wu),propertyName:Gu,attributeName:T(Gu),className:T(wi),labelName:T(wi),namespace:T(wi),macroName:T(wi),literal:yi,string:Zr,docString:T(Zr),character:T(Zr),attributeValue:T(Zr),number:Ma,integer:T(Ma),float:T(Ma),bool:T(yi),regexp:T(yi),escape:T(yi),color:T(yi),url:T(yi),keyword:Pe,self:T(Pe),null:T(Pe),atom:T(Pe),unit:T(Pe),modifier:T(Pe),operatorKeyword:T(Pe),controlKeyword:T(Pe),definitionKeyword:T(Pe),moduleKeyword:T(Pe),operator:Re,derefOperator:T(Re),arithmeticOperator:T(Re),logicOperator:T(Re),bitwiseOperator:T(Re),compareOperator:T(Re),updateOperator:T(Re),definitionOperator:T(Re),typeOperator:T(Re),controlOperator:T(Re),punctuation:Ta,separator:T(Ta),bracket:ks,angleBracket:T(ks),squareBracket:T(ks),paren:T(ks),brace:T(ks),content:Ie,heading:zi,heading1:T(zi),heading2:T(zi),heading3:T(zi),heading4:T(zi),heading5:T(zi),heading6:T(zi),contentSeparator:T(Ie),list:T(Ie),quote:T(Ie),emphasis:T(Ie),strong:T(Ie),link:T(Ie),monospace:T(Ie),strikethrough:T(Ie),inserted:T(),deleted:T(),changed:T(),invalid:T(),meta:to,documentMeta:T(to),annotation:T(to),processingInstruction:T(to),definition:ye.defineModifier("definition"),constant:ye.defineModifier("constant"),function:ye.defineModifier("function"),standard:ye.defineModifier("standard"),local:ye.defineModifier("local"),special:ye.defineModifier("special")};for(let s in O){let t=O[s];t instanceof ye&&(t.name=s)}var Ov=Aa([{tag:O.link,class:"tok-link"},{tag:O.heading,class:"tok-heading"},{tag:O.emphasis,class:"tok-emphasis"},{tag:O.strong,class:"tok-strong"},{tag:O.keyword,class:"tok-keyword"},{tag:O.atom,class:"tok-atom"},{tag:O.bool,class:"tok-bool"},{tag:O.url,class:"tok-url"},{tag:O.labelName,class:"tok-labelName"},{tag:O.inserted,class:"tok-inserted"},{tag:O.deleted,class:"tok-deleted"},{tag:O.literal,class:"tok-literal"},{tag:O.string,class:"tok-string"},{tag:O.number,class:"tok-number"},{tag:[O.regexp,O.escape,O.special(O.string)],class:"tok-string2"},{tag:O.variableName,class:"tok-variableName"},{tag:O.local(O.variableName),class:"tok-variableName tok-local"},{tag:O.definition(O.variableName),class:"tok-variableName tok-definition"},{tag:O.special(O.variableName),class:"tok-variableName2"},{tag:O.definition(O.propertyName),class:"tok-propertyName tok-definition"},{tag:O.typeName,class:"tok-typeName"},{tag:O.namespace,class:"tok-namespace"},{tag:O.className,class:"tok-className"},{tag:O.macroName,class:"tok-macroName"},{tag:O.propertyName,class:"tok-propertyName"},{tag:O.operator,class:"tok-operator"},{tag:O.comment,class:"tok-comment"},{tag:O.meta,class:"tok-meta"},{tag:O.invalid,class:"tok-invalid"},{tag:O.punctuation,class:"tok-punctuation"}]);var Oa,Ss=new Q;var R0=new Q,ce=class{constructor(t,e,i=[],n=""){this.data=t,this.name=n,ct.prototype.hasOwnProperty("tree")||Object.defineProperty(ct.prototype,"tree",{get(){return Ea(this)}}),this.parser=e,this.extension=[wn.of(this),ct.languageData.of((r,o,l)=>{let a=Uu(r,o,l),h=a.type.prop(Ss);if(!h)return[];let f=r.facet(h),c=a.type.prop(R0);if(c){let u=a.resolve(o-a.from,l);for(let d of c)if(d.test(u,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Uu(t,e,i).type.prop(Ss)==this.data}findRegions(t){let e=t.facet(wn);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(r,o)=>{if(r.prop(Ss)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(Q.mounted);if(l){if(l.tree.prop(Ss)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(n(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;a=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},xs=null,Da=class s{constructor(t,e,i=[],n,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new s(t,e,[],Rt.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Cs(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=Rt.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let n=Date.now()+t;t=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(we.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=xs;xs=this;try{return t()}finally{xs=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=ju(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,c,u)=>a.push({fromA:h,toA:f,fromB:c,toB:u})),i=we.applyChanges(i,a),n=Rt.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),c=t.mapPos(h.to,-1);ft.from&&(this.fragments=ju(this.fragments,n,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends Jr{createParse(e,i,n){let r=n[0].from,o=n[n.length-1].to;return{parsedPos:r,advance(){let a=xs;if(a){for(let h of n)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new Rt(fe.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return xs}};function ju(s,t,e){return we.applyChanges(s,[{fromA:t,toA:e,fromB:t,toB:e}])}var Ms=class s{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new s(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=Da.create(t.facet(wn).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new s(i)}};ce.state=Tt.define({create:Ms.init,update(s,t){for(let e of t.effects)if(e.is(ce.setState))return e.value;return t.startState.facet(wn)!=t.state.facet(wn)?Ms.init(t.state):s.apply(t)}});var qu=s=>{let t=setTimeout(()=>s(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(qu=s=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(s,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var _a=typeof navigator!="undefined"&&(!((Oa=navigator.scheduling)===null||Oa===void 0)&&Oa.isInputPending)?()=>navigator.scheduling.isInputPending():null,I0=me.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(ce.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(ce.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=qu(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,a=r.context.work(()=>_a&&_a()||Date.now()>o,n+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:ce.setState.of(new Ms(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>ge(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),wn=L.define({combine(s){return s.length?s[0]:null},enables:s=>[ce.state,I0,W.contentAttributes.compute([s],t=>{let e=t.facet(s);return e&&e.name?{"data-language":e.name}:{}})]});var Pa=class s{constructor(t,e){this.specs=t;let i;function n(l){let a=le.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?n(e.all):void 0,o=e.scope;this.scope=o instanceof ce?l=>l.prop(Ss)==o.data:o?l=>l==o:void 0,this.style=Aa(t.map(l=>({tag:l.tag,class:l.class||n(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new le(i):null,this.themeType=e.themeType}static define(t,e){return new s(t,e||{})}};var Fv=Pa.define([{tag:O.meta,color:"#404740"},{tag:O.link,textDecoration:"underline"},{tag:O.heading,textDecoration:"underline",fontWeight:"bold"},{tag:O.emphasis,fontStyle:"italic"},{tag:O.strong,fontWeight:"bold"},{tag:O.strikethrough,textDecoration:"line-through"},{tag:O.keyword,color:"#708"},{tag:[O.atom,O.bool,O.url,O.contentSeparator,O.labelName],color:"#219"},{tag:[O.literal,O.inserted],color:"#164"},{tag:[O.string,O.deleted],color:"#a11"},{tag:[O.regexp,O.escape,O.special(O.string)],color:"#e40"},{tag:O.definition(O.variableName),color:"#00f"},{tag:O.local(O.variableName),color:"#30a"},{tag:[O.typeName,O.namespace],color:"#085"},{tag:O.className,color:"#167"},{tag:[O.special(O.variableName),O.macroName],color:"#256"},{tag:O.definition(O.propertyName),color:"#00c"},{tag:O.comment,color:"#940"},{tag:O.invalid,color:"#f00"}]);var Vv=[fe.none];var zv={rtl:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:mt.RTL}),ltr:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:mt.LTR}),auto:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var Wi=L.define({combine:s=>s[0]}),Ra=new Xt,$u=L.define({combine:s=>s[0]}),B0=new Xt,Ku=L.define({combine:s=>s[0]}),N0=new Xt,L0=new Xt,Ia=ot.define();var H0=0,Ts=class{constructor(t,e){this.from=t,this.to=e}},q=class{constructor(t={}){this.id=H0++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=It.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};q.closedBy=new q({deserialize:s=>s.split(" ")});q.openedBy=new q({deserialize:s=>s.split(" ")});q.group=new q({deserialize:s=>s.split(" ")});q.isolate=new q({deserialize:s=>{if(s&&s!="rtl"&&s!="ltr"&&s!="auto")throw new RangeError("Invalid value for isolate: "+s);return s||"auto"}});q.contextHash=new q({perNode:!0});q.lookAhead=new q({perNode:!0});q.mounted=new q({perNode:!0});var yn=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[q.mounted.id]}},F0=Object.create(null),It=class s{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):F0,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),n=new s(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(n)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return n}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(q.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return i=>{for(let n=i.prop(q.group),r=-1;r<(n?n.length:0);r++){let o=e[r<0?i.name:n[r]];if(o)return o}}}};It.none=new It("",Object.create(null),0,8);var As=class s{constructor(t){this.types=t;for(let e=0;e0;for(let a=this.cursor(o|bt.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=n&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:za(It.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,n)=>new s(this.type,e,i,n,this.propValues),t.makeTree||((e,i,n)=>new s(It.none,e,i,n)))}static build(t){return z0(t)}};dt.empty=new dt(It.none,[],[],0);var Ba=class s{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new s(this.buffer,this.index)}},vi=class s{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return It.none}toString(){let t=[];for(let e=0;e0));a=o[a+3]);return l}slice(t,e,i){let n=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l=t&&et;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function Os(s,t,e,i){for(var n;s.from==s.to||(e<1?s.from>=t:s.from>t)||(e>-1?s.to<=t:s.to0?l.length:-1;t!=h;t+=e){let f=l[t],c=a[t]+o.from;if(Qu(n,i,c,c+f.length)){if(f instanceof vi){if(r&bt.ExcludeBuffers)continue;let u=f.findChild(0,f.buffer.length,e,i-c,n);if(u>-1)return new _s(new La(o,f,t,c),null,u)}else if(r&bt.IncludeAnonymous||!f.type.isAnonymous||Va(f)){let u;if(!(r&bt.IgnoreMounts)&&(u=yn.get(f))&&!u.overlay)return new s(u.tree,c,t,o);let d=new s(f,c,t,o);return r&bt.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,n)}}}if(r&bt.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&bt.IgnoreOverlays)&&(n=yn.get(this._tree))&&n.overlay){let r=t-this.from;for(let{from:o,to:l}of n.overlay)if((e>0?o<=r:o=r:l>r))return new s(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Xu(s,t,e,i){let n=s.cursor(),r=[];if(!n.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=n.type.is(e),!n.nextSibling())return r}for(;;){if(i!=null&&n.type.is(i))return r;if(n.type.is(t)&&r.push(n.node),!n.nextSibling())return i==null?r:[]}}function Na(s,t,e=t.length-1){for(let i=s;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var La=class{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}},_s=class s extends ro{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new s(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&bt.ExcludeBuffers)return null;let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new s(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new s(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new s(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,r=i.buffer[this.index+3];if(r>n){let o=i.buffer[this.index+1];t.push(i.slice(n,r,o)),e.push(0)}return new dt(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Zu(s){if(!s.length)return null;let t=0,e=s[0];for(let r=1;re.from||o.to=t){let l=new Be(o.tree,o.overlay[0].from+r.from,-1,r);(n||(n=[i])).push(Os(l,t,e,!1))}}return n?Zu(n):i}var Es=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof Be)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[t]],this.from=i+n.buffer[t+1],this.to=i+n.buffer[t+2],!0}yield(t){return t?t instanceof Be?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:n}=this.buffer,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&bt.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&bt.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&bt.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(e.findChild(n,this.index,-1,0,4))}else{let n=e.buffer[this.index+3];if(n<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:n}=this;if(n){if(t>0){if(this.index-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&bt.IncludeAnonymous||l instanceof vi||!l.type.isAnonymous||Va(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==n){if(n==this.index)return o;e=o,i=r+1;break t}n=this.stack[--r]}for(let n=i;n=0;r--){if(r<0)return Na(this._tree,t,n);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[n]&&t[n]!=o.name)return!1;n--}}return!0}};function Va(s){return s.children.some(t=>t instanceof vi||!t.type.isAnonymous||Va(t))}function z0(s){var t;let{buffer:e,nodeSet:i,maxBufferLength:n=1024,reused:r=[],minRepeatType:o=i.types.length}=s,l=Array.isArray(e)?new Ba(e,e.length):e,a=i.types,h=0,f=0;function c(x,S,k,R,P,z){let{id:E,start:M,end:H,size:F}=l,j=f,Mt=h;for(;F<0;)if(l.next(),F==-1){let kt=r[E];k.push(kt),R.push(M-x);return}else if(F==-3){h=E;return}else if(F==-4){f=E;return}else throw new RangeError(`Unrecognized record size: ${F}`);let pe=a[E],qe,Lt,$n=M-x;if(H-M<=n&&(Lt=m(l.pos-S,P))){let kt=new Uint16Array(Lt.size-Lt.skip),rt=l.pos-Lt.size,ut=kt.length;for(;l.pos>rt;)ut=b(Lt.start,kt,ut);qe=new vi(kt,H-Lt.start,i),$n=Lt.start-x}else{let kt=l.pos-F;l.next();let rt=[],ut=[],Ht=E>=o?E:-1,$t=0,$e=H;for(;l.pos>kt;)Ht>=0&&l.id==Ht&&l.size>=0?(l.end<=$e-n&&(p(rt,ut,M,$t,l.end,$e,Ht,j,Mt),$t=rt.length,$e=l.end),l.next()):z>2500?u(M,kt,rt,ut):c(M,kt,rt,ut,Ht,z+1);if(Ht>=0&&$t>0&&$t-1&&$t>0){let Kn=d(pe,Mt);qe=za(pe,rt,ut,0,rt.length,0,H-M,Kn,Kn)}else qe=g(pe,rt,ut,H-M,j-H,Mt)}k.push(qe),R.push($n)}function u(x,S,k,R){let P=[],z=0,E=-1;for(;l.pos>S;){let{id:M,start:H,end:F,size:j}=l;if(j>4)l.next();else{if(E>-1&&H=0;F-=3)M[j++]=P[F],M[j++]=P[F+1]-H,M[j++]=P[F+2]-H,M[j++]=j;k.push(new vi(M,P[2]-H,i)),R.push(H-x)}}function d(x,S){return(k,R,P)=>{let z=0,E=k.length-1,M,H;if(E>=0&&(M=k[E])instanceof dt){if(!E&&M.type==x&&M.length==P)return M;(H=M.prop(q.lookAhead))&&(z=R[E]+M.length+H)}return g(x,k,R,P,z,S)}}function p(x,S,k,R,P,z,E,M,H){let F=[],j=[];for(;x.length>R;)F.push(x.pop()),j.push(S.pop()+k-P);x.push(g(i.types[E],F,j,z-P,M-z,H)),S.push(P-k)}function g(x,S,k,R,P,z,E){if(z){let M=[q.contextHash,z];E=E?[M].concat(E):[M]}if(P>25){let M=[q.lookAhead,P];E=E?[M].concat(E):[M]}return new dt(x,S,k,R,E)}function m(x,S){let k=l.fork(),R=0,P=0,z=0,E=k.end-n,M={size:0,start:0,skip:0};t:for(let H=k.pos-x;k.pos>H;){let F=k.size;if(k.id==S&&F>=0){M.size=R,M.start=P,M.skip=z,z+=4,R+=4,k.next();continue}let j=k.pos-F;if(F<0||j=o?4:0,pe=k.start;for(k.next();k.pos>j;){if(k.size<0)if(k.size==-3)Mt+=4;else break t;else k.id>=o&&(Mt+=4);k.next()}P=pe,R+=F,z+=Mt}return(S<0||R==x)&&(M.size=R,M.start=P,M.skip=z),M.size>4?M:void 0}function b(x,S,k){let{id:R,start:P,end:z,size:E}=l;if(l.next(),E>=0&&R4){let H=l.pos-(E-4);for(;l.pos>H;)k=b(x,S,k)}S[--k]=M,S[--k]=z-x,S[--k]=P-x,S[--k]=R}else E==-3?h=R:E==-4&&(f=R);return k}let w=[],y=[];for(;l.pos>0;)c(s.start||0,s.bufferStart||0,w,y,-1,0);let v=(t=s.length)!==null&&t!==void 0?t:w.length?y[0]+w[0].length:0;return new dt(a[s.topID],w.reverse(),y.reverse(),v)}var Ju=new WeakMap;function so(s,t){if(!s.isAnonymous||t instanceof vi||t.type!=s)return 1;let e=Ju.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=s||!(i instanceof dt)){e=1;break}e+=so(s,i)}Ju.set(t,e)}return e}function za(s,t,e,i,n,r,o,l,a){let h=0;for(let p=i;p=f)break;S+=k}if(y==v+1){if(S>f){let k=p[v];d(k.children,k.positions,0,k.children.length,g[v]+w);continue}c.push(p[v])}else{let k=g[y-1]+p[y-1].length-x;c.push(za(s,p,g,v,y,x,k,null,a))}u.push(x+w-r)}}return d(t,e,i,n,0),(l||a)(c,u,o)}var Gi=class s{constructor(t,e,i,n,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let n=[new s(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&n.push(r);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l=i)for(;o&&o.from=u.from||c<=u.to||h){let d=Math.max(u.from,a)-h,p=Math.min(u.to,c)-h;u=d>=p?null:new s(d,p,u.tree,u.offset+h,l>0,!!f)}if(u&&n.push(u),o.to>c)break;o=rnew Ts(n.from,n.to)):[new Ts(0,0)]:[new Ts(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let r=n.advance();if(r)return r}}},Fa=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var Xv=new q({perNode:!0});var Y=class s{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=Tn(this,t,e);let n=[];return this.decompose(0,t,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(e,this.length,n,1),xn.from(n,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=Tn(this,t,e);let i=[];return this.decompose(t,e,i,0),xn.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new qi(this),r=new qi(t);for(let o=e,l=e;;){if(n.next(o),r.next(o),o=0,n.lineBreak!=r.lineBreak||n.done!=r.done||n.value!=r.value)return!1;if(l+=n.value.length,n.done||l>=i)return!0}}iter(t=1){return new qi(this,t)}iterRange(t,e=this.length){return new fo(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new co(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?s.empty:t.length<=32?new te(t):xn.from(te.split(t,[]))}},te=class s extends Y{constructor(t,e=W0(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.text[r],l=n+o.length;if((e?i:l)>=t)return new Ga(n,l,i,o);n=l+1,i++}}decompose(t,e,i,n){let r=t<=0&&e>=this.length?this:new s(td(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(n&1){let o=i.pop(),l=ao(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new s(l,o.length+r.length));else{let a=l.length>>1;i.push(new s(l.slice(0,a)),new s(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof s))return super.replace(t,e,i);[t,e]=Tn(this,t,e);let n=ao(this.text,ao(i.text,td(this.text,0,t)),e),r=this.length+i.length-(e-t);return n.length<=32?new s(n,r):xn.from(s.split(n,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=Tn(this,t,e);let n="";for(let r=0,o=0;r<=e&&ot&&o&&(n+=i),tr&&(n+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],n=-1;for(let r of t)i.push(r),n+=r.length+1,i.length==32&&(e.push(new s(i,n)),i=[],n=-1);return n>-1&&e.push(new s(i,n)),e}},xn=class s extends Y{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.children[r],l=n+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,n);n=l+1,i=a+1}}decompose(t,e,i,n){for(let r=0,o=0;o<=e&&r=o){let h=n&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=Tn(this,t,e),i.lines=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let f=this.children.slice();return f[n]=a,new s(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=Tn(this,t,e);let n="";for(let r=0,o=0;rt&&r&&(n+=i),to&&(n+=l.sliceString(t-o,e-o,i)),o=a+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof s))return 0;let i=0,[n,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;n+=e,r+=e){if(n==o||r==l)return i;let a=this.children[n],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new te(d,e)}let n=Math.max(32,i>>5),r=n<<1,o=n>>1,l=[],a=0,h=-1,f=[];function c(d){let p;if(d.lines>r&&d instanceof s)for(let g of d.children)c(g);else d.lines>o&&(a>o||!a)?(u(),l.push(d)):d instanceof te&&a&&(p=f[f.length-1])instanceof te&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new te(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>n&&u(),a+=d.lines,h+=d.length+1,f.push(d))}function u(){a!=0&&(l.push(f.length==1?f[0]:s.from(f,h)),h=-1,a=f.length=0)}for(let d of t)c(d);return u(),l.length==1?l[0]:new s(l,e)}};Y.empty=new te([""],0);function W0(s){let t=-1;for(let e of s)t+=e.length+1;return t}function ao(s,t,e=0,i=1e9){for(let n=0,r=0,o=!0;r=e&&(a>i&&(l=l.slice(0,i-n)),n0?1:(t instanceof te?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],r=this.offsets[i],o=r>>1,l=n instanceof te?n.text.length:n.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(n instanceof te){let a=n.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=n.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof te?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},fo=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new qi(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},co=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&(Y.prototype[Symbol.iterator]=function(){return this.iter()},qi.prototype[Symbol.iterator]=fo.prototype[Symbol.iterator]=co.prototype[Symbol.iterator]=function(){return this});var Ga=class{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}};function Tn(s,t,e){return t=Math.max(0,Math.min(s.length,t)),[t,Math.max(t,Math.min(s.length,e))]}var Sn="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(s=>s?parseInt(s,36):1);for(let s=1;ss)return Sn[t-1]<=s;return!1}function ed(s){return s>=127462&&s<=127487}var id=8205;function Le(s,t,e=!0,i=!0){return(e?ad:U0)(s,t,i)}function ad(s,t,e){if(t==s.length)return t;t&&hd(s.charCodeAt(t))&&fd(s.charCodeAt(t-1))&&t--;let i=ho(s,t);for(t+=Ua(i);t=0&&ed(ho(s,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function U0(s,t,e){for(;t>0;){let i=ad(s,t-2,e);if(i=56320&&s<57344}function fd(s){return s>=55296&&s<56320}function ho(s,t){let e=s.charCodeAt(t);if(!fd(e)||t+1==s.length)return e;let i=s.charCodeAt(t+1);return hd(i)?(e-55296<<10)+(i-56320)+65536:e}function Ua(s){return s<65536?1:2}var ja=/\\r\\n?|\\n/,jt=function(s){return s[s.Simple=0]="Simple",s[s.TrackDel=1]="TrackDel",s[s.TrackBefore=2]="TrackBefore",s[s.TrackAfter=3]="TrackAfter",s}(jt||(jt={})),$i=class s{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return r+(t-n);r+=l}else{if(i!=jt.Simple&&h>=t&&(i==jt.TrackDel&&nt||i==jt.TrackBefore&&nt))return null;if(h>t||h==t&&e<0&&!l)return t==n||e<0?r:r+a;r+=a}n=h}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return r}touchesRange(t,e=t){for(let i=0,n=0;i=0&&n<=e&&l>=t)return ne?"cover":!0;n=l}return!1}toString(){let t="";for(let e=0;e=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new s(t)}static create(t){return new s(t)}},ee=class s extends $i{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return qa(this,(e,i,n,r,o)=>t=t.replace(n,n+(i-e),o),!1),t}mapDesc(t,e=!1){return $a(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let n=0,r=0;n=0){e[n]=l,e[n+1]=o;let a=n>>1;for(;i.length0&&ki(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l>1].toJSON()))}return t}static of(t,e,i){let n=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!n.length)return;ou||c<0||u>e)throw new RangeError(`Invalid change range ${c} to ${u} (in doc of length ${e})`);let p=d?typeof d=="string"?Y.of(d.split(i||ja)):d:Y.empty,g=p.length;if(c==u&&g==0)return;co&&Bt(n,c-o,-1),Bt(n,u-c,g),ki(r,n,p),o=u}}return h(t),a(!l),l}static empty(t){return new s(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let n=0;nl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length=0&&e<=0&&e==s[n+1]?s[n]+=t:t==0&&s[n]==0?s[n+1]+=e:i?(s[n]+=t,s[n+1]+=e):s.push(t,e)}function ki(s,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i>1])),!(e||o==s.sections.length||s.sections[o+1]<0);)l=s.sections[o++],a=s.sections[o++];t(n,h,r,f,c),n=h,r=f}}}function $a(s,t,e,i=!1){let n=[],r=i?[]:null,o=new Ki(s),l=new Ki(t);for(let a=-1;;)if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);Bt(n,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let c=Math.min(f,l.len);h+=c,f-=c,l.forward(c)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var Ki=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return e>=t.length?Y.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?Y.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},kn=class s{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new s(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return V.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return V.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return V.range(t.anchor,t.head)}static create(t,e,i){return new s(t,e,i)}},V=class s{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:s.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new s(t.ranges.map(e=>kn.fromJSON(e)),t.main)}static single(t,e=t){return new s([s.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nt?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((n,r)=>n.from-r.from),e=t.indexOf(i);for(let n=1;nr.head?s.range(a,l):s.range(l,a))}}return new s(t,e)}};function ud(s,t){for(let e of s.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var nh=0,U=class s{constructor(t,e,i,n,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=nh++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new s(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:sh),!!t.static,t.enables)}of(t){return new Cn([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new Cn(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new Cn(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function sh(s,t){return s==t||s.length==t.length&&s.every((e,i)=>e===t[i])}var Cn=class{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=nh++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let c of this.dependencies)c=="doc"?a=!0:c=="selection"?h=!0:(((e=t[c.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[c.id]);return{create(c){return c.values[o]=i(c),1},update(c,u){if(a&&u.docChanged||h&&(u.docChanged||u.selection)||Ka(c,f)){let d=i(c);if(l?!nd(d,c.values[o],n):!n(d,c.values[o]))return c.values[o]=d,1}return 0},reconfigure:(c,u)=>{let d,p=u.config.address[r];if(p!=null){let g=mo(u,p);if(this.dependencies.every(m=>m instanceof U?u.facet(m)===c.facet(m):m instanceof Qe?u.field(m,!1)==c.field(m,!1):!0)||(l?nd(d=i(c),g,n):n(d=i(c),g)))return c.values[o]=g,0}else d=i(c);return c.values[o]=d,1}}}};function nd(s,t,e){if(s.length!=t.length)return!1;for(let i=0;is[a.id]),n=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=s[t.id]>>1;function l(a){let h=[];for(let f=0;fi===n),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(sd).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,n)=>{let r=i.values[e],o=this.updateF(r,n);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,n)=>n.config.address[this.id]!=null?(i.values[e]=n.field(this),0):(i.values[e]=this.create(i),1)}}init(t){return[this,sd.of({field:this,create:t})]}get extension(){return this}},Ui={lowest:4,low:3,default:2,high:1,highest:0};function Ds(s){return t=>new uo(t,s)}var rh={highest:Ds(Ui.highest),high:Ds(Ui.high),default:Ds(Ui.default),low:Ds(Ui.low),lowest:Ds(Ui.lowest)},uo=class{constructor(t,e){this.inner=t,this.prec=e}},po=class s{of(t){return new Rs(this,t)}reconfigure(t){return s.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},Rs=class{constructor(t,e){this.compartment=t,this.inner=e}},go=class s{constructor(t,e,i,n,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let n=[],r=Object.create(null),o=new Map;for(let u of q0(t,e,o))u instanceof Qe?n.push(u):(r[u.facet.id]||(r[u.facet.id]=[])).push(u);let l=Object.create(null),a=[],h=[];for(let u of n)l[u.id]=h.length<<1,h.push(d=>u.slot(d));let f=i==null?void 0:i.config.facets;for(let u in r){let d=r[u],p=d[0].facet,g=f&&f[u]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,sh(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>j0(m,p,d))}}let c=h.map(u=>u(l));return new s(t,o,c,l,a,r)}};function q0(s,t,e){let i=[[],[],[],[],[]],n=new Map;function r(o,l){let a=n.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof Rs&&e.delete(o.compartment)}if(n.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof Rs){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof uo)r(o.inner,o.prec);else if(o instanceof Qe)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof Cn)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Ui.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(s,Ui.default),i.reduce((o,l)=>o.concat(l))}function Ps(s,t){if(t&1)return 2;let e=t>>1,i=s.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;s.status[e]=4;let n=s.computeSlot(s,s.config.dynamicSlots[e]);return s.status[e]=2|n}function mo(s,t){return t&1?s.config.staticValues[t>>1]:s.values[t>>1]}var dd=U.define(),Ya=U.define({combine:s=>s.some(t=>t),static:!0}),pd=U.define({combine:s=>s.length?s[0]:void 0,static:!0}),gd=U.define(),md=U.define(),bd=U.define(),wd=U.define({combine:s=>s.length?s[0]:!1}),Ze=class{constructor(t,e){this.type=t,this.value=e}static define(){return new Xa}},Xa=class{of(t){return new Ze(this,t)}},Ja=class{constructor(t){this.map=t}of(t){return new wt(this,t)}},wt=class s{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new s(this.type,e)}is(t){return this.type==t}static define(t={}){return new Ja(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let r=n.map(e);r&&i.push(r)}return i}};wt.reconfigure=wt.define();wt.appendConfig=wt.define();var qt=class s{constructor(t,e,i,n,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&ud(i,e.newLength),r.some(l=>l.type==s.time)||(this.annotations=r.concat(s.time.of(Date.now())))}static create(t,e,i,n,r,o){return new s(t,e,i,n,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(s.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};qt.time=Ze.define();qt.userEvent=Ze.define();qt.addToHistory=Ze.define();qt.remote=Ze.define();function $0(s,t){let e=[];for(let i=0,n=0;;){let r,o;if(i=s[i]))r=s[i++],o=s[i++];else if(n=0;n--){let r=i[n](s);r instanceof qt?s=r:Array.isArray(r)&&r.length==1&&r[0]instanceof qt?s=r[0]:s=vd(t,Mn(r),!1)}return s}function Y0(s){let t=s.startState,e=t.facet(bd),i=s;for(let n=e.length-1;n>=0;n--){let r=e[n](s);r&&Object.keys(r).length&&(i=yd(i,Qa(t,r,s.changes.newLength),!0))}return i==s?s:qt.create(t,s.changes,s.selection,i.effects,i.annotations,i.scrollIntoView)}var X0=[];function Mn(s){return s==null?X0:Array.isArray(s)?s:[s]}var Ne=function(s){return s[s.Word=0]="Word",s[s.Space=1]="Space",s[s.Other=2]="Other",s}(Ne||(Ne={})),J0=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,Za;try{Za=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(s){}function Q0(s){if(Za)return Za.test(s);for(let t=0;t"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||J0.test(e)))return!0}return!1}function Z0(s){return t=>{if(!/\\S/.test(t))return Ne.Space;if(Q0(t))return Ne.Word;for(let e=0;e-1)return Ne.Word;return Ne.Other}}var pt=class s{constructor(t,e,i,n,r,o){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ln.set(h,a)),e=null),n.set(l.value.compartment,l.value.extension)):l.is(wt.reconfigure)?(e=null,i=l.value):l.is(wt.appendConfig)&&(e=null,i=Mn(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=go.resolve(i,n,this),r=new s(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(Ya)?t.newSelection:t.newSelection.asSingle();new s(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:V.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),r=[i.range],o=Mn(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return s.create({doc:t.doc,selection:V.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(t={}){let e=go.resolve(t.extensions||[],new Map),i=t.doc instanceof Y?t.doc:Y.of((t.doc||"").split(e.staticFacet(s.lineSeparator)||ja)),n=t.selection?t.selection instanceof V?t.selection:V.single(t.selection.anchor,t.selection.head):V.single(0);return ud(n,i.length),e.staticFacet(Ya)||(n=n.asSingle()),new s(e,i,n,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(s.tabSize)}get lineBreak(){return this.facet(s.lineSeparator)||`\n`}get readOnly(){return this.facet(wd)}phrase(t,...e){for(let i of this.facet(s.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,n)=>{if(n=="$")return"$";let r=+(n||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let n=[];for(let r of this.facet(dd))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&n.push(o[t]);return n}charCategorizer(t){return Z0(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=Le(e,o,!1);if(r(e.slice(a,o))!=Ne.Word)break;o=a}for(;ls.length?s[0]:4});pt.lineSeparator=pd;pt.readOnly=wd;pt.phrases=U.define({compare(s,t){let e=Object.keys(s),i=Object.keys(t);return e.length==i.length&&e.every(n=>s[n]==t[n])}});pt.languageData=dd;pt.changeFilter=gd;pt.transactionFilter=md;pt.transactionExtender=bd;po.reconfigure=wt.define();var ti=class{eq(t){return this==t}range(t,e=t){return Is.create(t,e,this)}};ti.prototype.startSide=ti.prototype.endSide=0;ti.prototype.point=!1;ti.prototype.mapMode=jt.TrackDel;var Is=class s{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new s(t,e,i)}};function th(s,t){return s.from-t.from||s.value.startSide-t.value.startSide}var eh=class s{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let r=i?this.to:this.from;for(let o=n,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,n){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||u==d&&h.startSide>0&&h.endSide<=0)continue;(d-u||h.endSide-h.startSide)<0||(o<0&&(o=u),h.point&&(l=Math.max(l,d-u)),i.push(h),n.push(u-o),r.push(d-o))}return{mapped:i.length?new s(n,r,i,l):null,pos:o}}},yt=class s{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new s(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(th)),this.isEmpty)return e.length?s.of(e):this;let l=new bo(this,null,-1).goto(0),a=0,h=[],f=new An;for(;l.value||a=0){let c=e[a++];f.addInner(c.from,c.to,c.value)||h.push(c)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return Bs.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Bs.from(t).goto(e)}static compare(t,e,i,n,r=-1){let o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),l=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),a=rd(o,l,i),h=new ji(o,a,r),f=new ji(l,a,r);i.iterGaps((c,u,d)=>od(h,c,f,u,d,n)),i.empty&&i.length==0&&od(h,0,f,0,0,n)}static eq(t,e,i=0,n){n==null&&(n=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=rd(r,o),a=new ji(r,l,0).goto(i),h=new ji(o,l,0).goto(i);for(;;){if(a.to!=h.to||!ih(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>n)return!0;a.next(),h.next()}}static spans(t,e,i,n,r=-1){let o=new ji(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),c=o.pointFroml&&(n.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new An;for(let n of t instanceof Is?[t]:e?tb(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return s.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=s.empty;n=n.nextLayer)e=new s(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}};yt.empty=new yt([],[],null,-1);function tb(s){if(s.length>1)for(let t=s[0],e=1;e0)return s.slice().sort(th);t=i}return s}yt.empty.nextLayer=yt.empty;var An=class s{finishChunk(t){this.chunks.push(new eh(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new s)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(yt.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=yt.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function rd(s,t,e){let i=new Map;for(let r of s)for(let o=0;o=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new bo(o,e,i,r));return n.length==1?n[0]:new s(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)Wa(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)Wa(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Wa(this.heap,0)}}};function Wa(s,t){for(let e=s[t];;){let i=(t<<1)+1;if(i>=s.length)break;let n=s[i];if(i+1=0&&(n=s[i+1],i++),e.compare(n)<0)break;s[i]=e,s[t]=n,t=i}}var ji=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Bs.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){oo(this.active,t),oo(this.activeTo,t),oo(this.activeRank,t),this.minActive=ld(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:r}=this.cursor;for(;e0;)e++;lo(this.active,e,i),lo(this.activeTo,e,n),lo(this.activeRank,e,r),t&&lo(t,e,this.cursor.from),this.minActive=ld(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&oo(i,n)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function od(s,t,e,i,n,r){s.goto(t),e.goto(i);let o=i+n,l=i,a=i-t;for(;;){let h=s.to+a-e.to||s.endSide-e.endSide,f=h<0?s.to+a:e.to,c=Math.min(f,o);if(s.point||e.point?s.point&&e.point&&(s.point==e.point||s.point.eq(e.point))&&ih(s.activeForPoint(s.to),e.activeForPoint(e.to))||r.comparePoint(l,c,s.point,e.point):c>l&&!ih(s.active,e.active)&&r.compareRange(l,c,s.active,e.active),f>o)break;l=f,h<=0&&s.next(),h>=0&&e.next()}}function ih(s,t){if(s.length!=t.length)return!1;for(let e=0;e=t;i--)s[i+1]=s[i];s[t]=e}function ld(s,t){let e=-1,i=1e9;for(let n=0;n=t)return n;if(n==s.length)break;r+=s.charCodeAt(n)==9?e-r%e:1,n=Le(s,n)}return i===!0?-1:s.length}var oh="\\u037C",xd=typeof Symbol=="undefined"?"__"+oh:Symbol.for(oh),lh=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Sd=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},ue=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],c=/^@(\\w+)\\b/.exec(o[0]),u=c&&c[1]=="keyframes";if(c&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!c)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(n(d),p,f,u)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||u)&&a.push((i&&!c&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(n(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=Sd[xd]||1;return Sd[xd]=t+1,oh+t.toString(36)}static mount(t,e,i){let n=t[lh],r=i&&i.nonce;n?r&&n.setNonce(r):n=new ah(t,r),n.mount(Array.isArray(e)?e:[e])}},Cd=new Map,ah=class{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let r=Cd.get(i);if(r)return t.adoptedStyleSheets=[r.sheet,...t.adoptedStyleSheets],t[lh]=r;this.sheet=new n.CSSStyleSheet,t.adoptedStyleSheets=[this.sheet,...t.adoptedStyleSheets],Cd.set(i,this)}else{this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);let r=t.head||t;r.insertBefore(this.styleTag,r.firstChild)}this.modules=[],t[lh]=this}mount(t){let e=this.sheet,i=0,n=0;for(let r=0;r-1&&(this.modules.splice(l,1),n--,l=-1),l==-1){if(this.modules.splice(n++,0,o),e)for(let a=0;a",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},t1=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),e1=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(vt=0;vt<10;vt++)Yi[48+vt]=Yi[96+vt]=String(vt);var vt;for(vt=1;vt<=24;vt++)Yi[vt+111]="F"+vt;var vt;for(vt=65;vt<=90;vt++)Yi[vt]=String.fromCharCode(vt+32),yo[vt]=String.fromCharCode(vt);var vt;for(wo in Yi)yo.hasOwnProperty(wo)||(yo[wo]=Yi[wo]);var wo;function Eo(s){let t;return s.nodeType==11?t=s.getSelection?s:s.ownerDocument:t=s,t.getSelection()}function dh(s,t){return t?s==t||s.contains(t.nodeType!=1?t.parentNode:t):!1}function nb(s){let t=s.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}function Ao(s,t){if(!t.anchorNode)return!1;try{return dh(s,t.anchorNode)}catch(e){return!1}}function js(s){return s.nodeType==3?Xi(s,0,s.nodeValue.length).getClientRects():s.nodeType==1?s.getClientRects():[]}function Vs(s,t,e,i){return e?Md(s,t,e,i,-1)||Md(s,t,e,i,1):!1}function qs(s){for(var t=0;;t++)if(s=s.previousSibling,!s)return t}function Md(s,t,e,i,n){for(;;){if(s==e&&t==i)return!0;if(t==(n<0?0:ni(s))){if(s.nodeName=="DIV")return!1;let r=s.parentNode;if(!r||r.nodeType!=1)return!1;t=qs(s)+(n<0?0:1),s=r}else if(s.nodeType==1){if(s=s.childNodes[t+(n<0?-1:0)],s.nodeType==1&&s.contentEditable=="false")return!1;t=n<0?ni(s):0}else return!1}}function ni(s){return s.nodeType==3?s.nodeValue.length:s.childNodes.length}function Wh(s,t){let e=t?s.left:s.right;return{left:e,right:e,top:s.top,bottom:s.bottom}}function sb(s){return{left:0,right:s.innerWidth,top:0,bottom:s.innerHeight}}function ep(s,t){let e=t.width/s.offsetWidth,i=t.height/s.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-s.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-s.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function rb(s,t,e,i,n,r,o,l){let a=s.ownerDocument,h=a.defaultView||window;for(let f=s,c=!1;f&&!c;)if(f.nodeType==1){let u,d=f==a.body,p=1,g=1;if(d)u=sb(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(c=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let w=f.getBoundingClientRect();({scaleX:p,scaleY:g}=ep(f,w)),u={left:w.left,right:w.left+f.clientWidth*p,top:w.top,bottom:w.top+f.clientHeight*g}}let m=0,b=0;if(n=="nearest")t.top0&&t.bottom>u.bottom+b&&(b=t.bottom-u.bottom+b+o)):t.bottom>u.bottom&&(b=t.bottom-u.bottom+o,e<0&&t.top-b0&&t.right>u.right+m&&(m=t.right-u.right+m+r)):t.right>u.right&&(m=t.right-u.right+r,e<0&&t.lefte.clientHeight||e.scrollWidth>e.clientWidth)return e;e=e.assignedSlot||e.parentNode}else if(e.nodeType==11)e=e.host;else break;return null}var ph=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?ni(e):0),i,Math.min(t.focusOffset,i?ni(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}},On=null;function ip(s){if(s.setActive)return s.setActive();if(On)return s.focus(On);let t=[];for(let e=s;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(s.focus(On==null?{get preventScroll(){return On={preventScroll:!0},!0}}:void 0),!On){On=!1;for(let e=0;eMath.max(1,s.scrollHeight-s.clientHeight-4)}var Vt=class s{constructor(t,e,i=!0){this.node=t,this.offset=e,this.precise=i}static before(t,e){return new s(t.parentNode,qs(t),e)}static after(t,e){return new s(t.parentNode,qs(t)+1,e)}},Gh=[],ht=class s{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t){let e=this.posAtStart;for(let i of this.children){if(i==t)return e;e+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}sync(t,e){if(this.flags&2){let i=this.dom,n=null,r;for(let o of this.children){if(o.flags&7){if(!o.dom&&(r=n?n.nextSibling:i.firstChild)){let l=s.get(r);(!l||!l.parent&&l.canReuseDOM(o))&&o.reuseDOM(r)}o.sync(t,e),o.flags&=-8}if(r=n?n.nextSibling:i.firstChild,e&&!e.written&&e.node==i&&r!=o.dom&&(e.written=!0),o.dom.parentNode==i)for(;r&&r!=o.dom;)r=Ad(r);else i.insertBefore(o.dom,r);n=o.dom}for(r=n?n.nextSibling:i.firstChild,r&&e&&e.node==i&&(e.written=!0);r;)r=Ad(r)}else if(this.flags&1)for(let i of this.children)i.flags&7&&(i.sync(t,e),i.flags&=-8)}reuseDOM(t){}localPosFromDOM(t,e){let i;if(t==this.dom)i=this.dom.childNodes[e];else{let n=ni(t)==0?0:e==0?-1:1;for(;;){let r=t.parentNode;if(r==this.dom)break;n==0&&r.firstChild!=r.lastChild&&(t==r.firstChild?n=-1:n=1),t=r}n<0?i=t:i=t.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!s.get(i);)i=i.nextSibling;if(!i)return this.length;for(let n=0,r=0;;n++){let o=this.children[n];if(o.dom==i)return r;r+=o.length+o.breakAfter}}domBoundsAround(t,e,i=0){let n=-1,r=-1,o=-1,l=-1;for(let a=0,h=i,f=i;ae)return c.domBoundsAround(t,e,h);if(u>=t&&n==-1&&(n=a,r=h),h>e&&c.dom.parentNode==this.dom){o=a,l=f;break}f=u,h=u+c.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=Gh){this.markDirty();for(let n=t;nthis.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function rp(s,t,e,i,n,r,o,l,a){let{children:h}=s,f=h.length?h[t]:null,c=r.length?r[r.length-1]:null,u=c?c.breakAfter:o;if(!(t==i&&f&&!o&&!u&&r.length<2&&f.merge(e,n,r.length?c:null,e==0,l,a))){if(i0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e2),B={mac:Ed||/Mac/.test(ie.platform),windows:/Win/.test(ie.platform),linux:/Linux|X11/.test(ie.platform),ie:zo,ie_version:lp?gh.documentMode||6:bh?+bh[1]:mh?+mh[1]:0,gecko:Od,gecko_version:Od?+(/Firefox\\/(\\d+)/.exec(ie.userAgent)||[0,0])[1]:0,chrome:!!hh,chrome_version:hh?+hh[1]:0,ios:Ed,android:/Android\\b/.test(ie.userAgent),webkit:_d,safari:ap,webkit_version:_d?+(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:gh.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},hb=256,Si=class s extends ht{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof s)||this.length-(e-t)+i.length>hb||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new s(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Vt(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return fb(this.dom,t,e)}},Ci=class s extends ht{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let n of e)n.setParent(this)}setAttrs(t){if(np(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,r,o){return i&&(!(i instanceof s&&i.mark.eq(this.mark))||t&&r<=0||et&&e.push(i=t&&(n=r),i=a,r++}let o=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new s(this.mark,e,o)}domAtPos(t){return hp(this,t)}coordsAt(t,e){return cp(this,t,e)}};function fb(s,t,e){let i=s.nodeValue.length;t>i&&(t=i);let n=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?B.chrome||B.gecko||(t?(n--,o=1):r=0)?0:l.length-1];return B.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?Wh(a,o<0):a||null}var Po=class s extends ht{static create(t,e,i){return new s(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=s.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0)?Vt.before(this.dom):Vt.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),r=null;if(!n.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?n.length-1:0;r=n[l],!(t>0?l==0:l==n.length-1||r.top0?Vt.before(this.dom):Vt.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return Y.empty}get isHidden(){return!0}};Si.prototype.children=Po.prototype.children=$s.prototype.children=Gh;function hp(s,t){let e=s.dom,{children:i}=s,n=0;for(let r=0;nr&&t0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=n;r0&&t instanceof Ci&&n.length&&(i=n[n.length-1])instanceof Ci&&i.mark.eq(t.mark)?fp(i,t.children[0],e-1):(n.push(t),t.setParent(s)),s.length+=t.length}function cp(s,t,e){let i=null,n=-1,r=null,o=-1;function l(h,f){for(let c=0,u=0;c=f&&(d.children.length?l(d,f-u):(!r||r.isHidden&&e>0)&&(p>f||u==p&&d.getSide()>0)?(r=d,o=f-u):(u-1?1:0)!=n.length-(e&&n.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(n.indexOf(r)==-1||s[r]!==t[r]))return!1;return!0}function yh(s,t,e){let i=!1;if(t)for(let n in t)e&&n in e||(i=!0,n=="style"?s.style.cssText="":s.removeAttribute(n));if(e)for(let n in e)t&&t[n]==e[n]||(i=!0,n=="style"?s.style.cssText=e[n]:s.setAttribute(n,e[n]));return i}function ub(s){let t=Object.create(null);for(let e=0;e0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Uh(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){fp(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=wh(e,this.attrs||{})),i&&(this.attrs=wh({class:i},this.attrs||{}))}domAtPos(t){return hp(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(np(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(yh(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&ht.get(n)instanceof Ci;)n=n.lastChild;if(!n||!this.length||n.nodeName!="BR"&&((i=ht.get(n))===null||i===void 0?void 0:i.isEditable)==!1&&(!B.ios||!this.children.some(r=>r instanceof Si))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof Si)||/[^ -~]/.test(i.text))return null;let n=js(i.dom);if(n.length!=1)return null;t+=n[0].width,e=n[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=cp(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:n}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-n.lineHeight)<2&&n.textHeight=e){if(r instanceof s)return r;if(o>e)break}n=o+r.breakAfter}return null}},Dn=class s extends ht{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0}},Pn=class{eq(t){return!1}updateDOM(t,e){return!1}compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(t){return!0}coordsAt(t,e,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(t){}},ei=function(s){return s[s.Text=0]="Text",s[s.WidgetBefore=1]="WidgetBefore",s[s.WidgetAfter=2]="WidgetAfter",s[s.WidgetRange=3]="WidgetRange",s}(ei||(ei={})),Nt=class extends ti{constructor(t,e,i,n){super(),this.startSide=t,this.endSide=e,this.widget=i,this.spec=n}get heightRelevant(){return!1}static mark(t){return new Ks(t)}static widget(t){let e=Math.max(-1e4,Math.min(1e4,t.side||0)),i=!!t.block;return e+=i&&!t.inlineOrder?e>0?3e8:-4e8:e>0?1e8:-1e8,new Mi(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,n;if(t.isBlockGap)i=-5e8,n=4e8;else{let{start:r,end:o}=up(t,e);i=(r?e?-3e8:-1:5e8)-1,n=(o?e?2e8:1:-6e8)+1}return new Mi(t,i,n,e,t.widget||null,!0)}static line(t){return new Ys(t)}static set(t,e=!1){return yt.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};Nt.none=yt.empty;var Ks=class s extends Nt{constructor(t){let{start:e,end:i}=up(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof s&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&Uh(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};Ks.prototype.point=!1;var Ys=class s extends Nt{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof s&&this.spec.class==t.spec.class&&Uh(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};Ys.prototype.mapMode=jt.TrackBefore;Ys.prototype.point=!0;var Mi=class s extends Nt{constructor(t,e,i,n,r,o){super(e,i,r,t),this.block=n,this.isReplace=o,this.mapMode=n?e<=0?jt.TrackBefore:jt.TrackAfter:jt.TrackDel}get type(){return this.startSide!=this.endSide?ei.WidgetRange:this.startSide<=0?ei.WidgetBefore:ei.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof s&&db(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};Mi.prototype.point=!0;function up(s,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=s;return e==null&&(e=s.inclusive),i==null&&(i=s.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function db(s,t){return s==t||!!(s&&t&&s.compare(t))}function vh(s,t,e,i=0){let n=e.length-1;n>=0&&e[n]+i>=s?e[n]=Math.max(e[n],t):e.push(s,t)}var zs=class s{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof Dn&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new _t),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(vo(new $s(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof Dn)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(vo(new Si(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof Mi){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof Mi)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new Dn(i.widget||new Ro("div"),l,i));else{let a=Po.create(i.widget||new Ro("span"),l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=n.length&&(t0),f=!a.isEditable&&(tn.length||i.startSide<=0),c=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(n),h&&(c.append(vo(new $s(1),n),r),r=n.length+Math.max(0,r-n.length)),c.append(vo(a,n),r),this.atCursorPos=f,this.pendingBuffer=f?tn.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,n,r){let o=new s(t,e,i,r);return o.openEnd=yt.spans(n,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function vo(s,t){for(let e of t)s=new Ci(e,[s],s.length);return s}var Ro=class extends Pn{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}},Ct=function(s){return s[s.LTR=0]="LTR",s[s.RTL=1]="RTL",s}(Ct||(Ct={})),Ji=Ct.LTR,jh=Ct.RTL;function dp(s){let t=[];for(let e=0;e=e){if(l.level==i)return o;(r<0||(n!=0?n<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function gp(s,t){if(s.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(He[g+1]==-d){let m=He[g+2],b=m&2?n:m&4?m&1?r:n:0;b&&(tt[c]=tt[He[g]]=b),l=g;break}}else{if(He.length==189)break;He[l++]=c,He[l++]=u,He[l++]=a}else if((p=tt[c])==2||p==1){let g=p==n;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=He[m+2];if(b&2)break;if(g)He[m+2]|=2;else{if(b&4)break;He[m+2]|=4}}}}}function yb(s,t,e,i){for(let n=0,r=i;n<=e.length;n++){let o=n?e[n-1].to:s,l=na;)p==m&&(p=e[--g].from,m=g?e[g-1].to:s),tt[--p]=d;a=f}else r=h,a++}}}function xh(s,t,e,i,n,r,o){let l=i%2?2:1;if(i%2==n%2)for(let a=t,h=0;aa&&o.push(new Ve(a,g.from,d));let m=g.direction==Ji!=!(d%2);Sh(s,m?i+1:i,n,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?tt[p]!=l:tt[p]==l))break;p++}u?xh(s,a,p,i+1,n,u,o):at;){let f=!0,c=!1;if(!h||a>r[h-1].to){let g=tt[a-1];g!=l&&(f=!1,c=g==16)}let u=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(c)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(tt[m-1]==l)break t;break}}if(u)u.push(g);else{g.tott.length;)tt[tt.length]=256;let i=[],n=t==Ji?0:1;return Sh(s,n,n,e,0,s.length,i),i}function mp(s){return[new Ve(0,s,0)]}var bp="";function kb(s,t,e,i,n){var r;let o=i.head-s.from,l=Ve.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(n,e);if(o==h){let u=l+=n?1:-1;if(u<0||u>=t.length)return null;a=t[l=u],o=a.side(!n,e),h=a.side(n,e)}let f=Le(s.text,o,a.forward(n,e));(fa.to)&&(f=h),bp=s.text.slice(Math.min(o,f),Math.max(o,f));let c=l==(n?t.length-1:0)?null:t[l+(n?1:-1)];return c&&f==h&&c.level+(n?0:1)s.some(t=>t)}),Sb=U.define({combine:s=>s.some(t=>t)}),Ws=class s{constructor(t,e="nearest",i="nearest",n=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new s(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new s(V.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},ko=wt.define({map:(s,t)=>s.map(t)});function ii(s,t,e){let i=s.facet(kp);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var Wo=U.define({combine:s=>s.length?s[0]:!0}),Cb=0,Ns=U.define(),Rn=class s{constructor(t,e,i,n,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:n,provide:r,decorations:o}=e||{};return new s(Cb++,t,i,n,l=>{let a=[Ns.of(l)];return o&&a.push(Xs.of(h=>{let f=h.plugin(l);return f?o(f):Nt.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return s.define(i=>new t(i),e)}},Gs=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(ii(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){ii(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){ii(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},Mp=U.define(),qh=U.define(),Xs=U.define(),Tp=U.define(),$h=U.define(),Ap=U.define();function Pd(s,t){let e=s.state.facet(Ap);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(s):r),n=[];return yt.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,c=n;for(let u=l.length-1;u>=0;u--,a--){let d=l[u].spec.bidiIsolate,p;if(d==null&&(d=xb(t.text,h,f)),a>0&&c.length&&(p=c[c.length-1]).to==h&&p.direction==d)p.to=f,c=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};c.push(g),c=g.inner}}}}),n}var Op=U.define();function _p(s){let t=0,e=0,i=0,n=0;for(let r of s.state.facet(Op)){let o=r(s);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(n=Math.max(n,o.bottom)))}return{left:t,right:e,top:i,bottom:n}}var Ls=U.define(),ze=class s{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new s(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toAf)break;r+=2}if(!a)return i;new s(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},Io=class s{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=ee.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let n=[];this.changes.iterChangedRanges((r,o,l,a)=>n.push(new ze(r,o,l,a))),this.changedRanges=n}static create(t,e,i){return new s(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&10)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},Bo=class extends ht{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new _t],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new ze(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let n=-1;this.view.inputState.composing>=0&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?n=this.domChanged.newSel.head:!Db(t.changes,this.hasComposition)&&!t.selectionSet&&(n=t.state.selection.main.head));let r=n>-1?Tb(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new ze(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(B.ie||B.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=_b(o,l,t.changes);return i=ze.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=B.chrome||B.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||n.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?n[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:c}=l,u,d,p,g;if(i&&i.range.fromBf){let v=zs.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),x=zs.build(this.view.state.doc,i.range.toB,c,this.decorations,this.dynamicDecorationMap);d=v.breakAtStart,p=v.openStart,g=x.openEnd;let S=this.compositionView(i);x.breakAtStart?S.breakAfter=1:x.content.length&&S.merge(S.length,S.length,x.content[0],!1,x.openStart,0)&&(S.breakAfter=x.content[0].breakAfter,x.content.shift()),v.content.length&&S.merge(0,0,v.content[v.content.length-1],!0,0,v.openEnd)&&v.content.pop(),u=v.content.concat(S).concat(x.content)}else({content:u,breakAtStart:d,openStart:p,openEnd:g}=zs.build(this.view.state.doc,f,c,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:w,off:y}=r.findPos(a,-1);rp(this,w,y,m,b,u,d,p,g)}i&&this.fixCompositionDOM(i)}compositionView(t){let e=new Si(t.text.nodeValue);e.flags|=8;for(let{deco:n}of t.marks)e=new Ci(n,[e],e.length);let i=new _t;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=ht.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let r=t.marks.length-1;r>=-1;r--)i=n.childPos(i.off,1),n=n.children[i.i],e(r>=0?t.marks[r].node:t.text,n)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,r=!n&&Ao(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(B.gecko&&l.empty&&!this.hasComposition&&Mb(a)){let c=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(c,a.node.childNodes[a.offset]||null)),a=h=new Vt(c,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!Vs(a.node,a.offset,f.anchorNode,f.anchorOffset)||!Vs(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{B.android&&B.chrome&&this.dom.contains(f.focusNode)&&Eb(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let c=Eo(this.view.root);if(c)if(l.empty){if(B.gecko){let u=Ab(a.node,a.offset);if(u&&u!=3){let d=Dp(a.node,a.offset,u==1?1:-1);d&&(a=new Vt(d.node,d.offset))}}c.collapse(a.node,a.offset),l.bidiLevel!=null&&c.caretBidiLevel!==void 0&&(c.caretBidiLevel=l.bidiLevel)}else if(c.extend){c.collapse(a.node,a.offset);try{c.extend(h.node,h.offset)}catch(u){}}else{let u=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),u.setEnd(h.node,h.offset),u.setStart(a.node,a.offset),c.removeAllRanges(),c.addRange(u)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Vt(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Vt(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&Vs(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=Eo(t.root),{anchorNode:n,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=_t.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(n,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let n=t.offset;!i&&n=0;n--){let r=ht.get(e.childNodes[n]);r instanceof _t&&(i=r.domAtPos(r.length))}return i?new Vt(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=ht.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(at||l.covers(1))&&(!i||l instanceof _t&&!(i instanceof _t&&e>=0))&&(i=l,n=h),r=h}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof _t))return null;for(;n.children.length;){let{i:l,off:a}=n.childPos(i,1);for(;;l++){if(l==n.children.length)return null;if((n=n.children[l]).length)break}i=a}if(!(n instanceof Si))return null;let r=Le(n.text,i);if(r==i)return null;let o=Xi(n.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==Ct.LTR;for(let h=0,f=0;fn)break;if(h>=i){let d=c.dom.getBoundingClientRect();if(e.push(d.height),o){let p=c.dom.lastChild,g=p?js(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=u)}}}h=u+c.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?Ct.RTL:Ct.LTR}measureTextSize(){for(let r of this.children)if(r instanceof _t){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,n;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=js(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,n=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:n}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Do(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let r=n==e.viewports.length?null:e.viewports[n],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(Nt.replace({widget:new No(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return Nt.set(t)}updateDeco(){let t=this.view.state.facet(Xs).map((n,r)=>(this.dynamicDecorationMap[r]=typeof n=="function")?n(this.view):n),e=!1,i=this.view.state.facet(Tp).map((n,r)=>{let o=typeof n=="function";return o&&(e=!0),o?n(this.view):n});i.length&&(this.dynamicDecorationMap[t.length]=e,t.push(yt.join(i)));for(let n=t.length;ne.anchor?-1:1),n;if(!i)return;!e.empty&&(n=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,n.left),top:Math.min(i.top,n.top),right:Math.max(i.right,n.right),bottom:Math.max(i.bottom,n.bottom)});let r=_p(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;rb(this.view.scrollDOM,o,e.head0)i=i.childNodes[n-1],n=ni(i);else break}if(e>=0)for(let i=s,n=t;;){if(i.nodeType==3)return{node:i,offset:n};if(i.nodeType==1&&n=0)i=i.childNodes[n],n=0;else break}return null}function Ab(s,t){return s.nodeType!=1?0:(t&&s.childNodes[t-1].contentEditable=="false"?1:0)|(t{it.from&&(e=!0)}),e}function Pb(s,t,e=1){let i=s.charCategorizer(t),n=s.doc.lineAt(t),r=t-n.from;if(n.length==0)return V.cursor(t);r==0?e=1:r==n.length&&(e=-1);let o=r,l=r;e<0?o=Le(n.text,r,!1):l=Le(n.text,r);let a=i(n.text.slice(o,l));for(;o>0;){let h=Le(n.text,o,!1);if(i(n.text.slice(h,o))!=a)break;o=h}for(;ls?t.left-s:Math.max(0,s-t.right)}function Ib(s,t){return t.top>s?t.top-s:Math.max(0,s-t.bottom)}function fh(s,t){return s.topt.top+1}function Rd(s,t){return ts.bottom?{top:s.top,left:s.left,right:s.right,bottom:t}:s}function Mh(s,t,e){let i,n,r,o,l=!1,a,h,f,c;for(let p=s.firstChild;p;p=p.nextSibling){let g=js(p);for(let m=0;my||o==y&&r>w){i=p,n=b,r=w,o=y;let v=y?e0?m0)}w==0?e>b.bottom&&(!f||f.bottomb.top)&&(h=p,c=b):f&&fh(f,b)?f=Id(f,b.bottom):c&&fh(c,b)&&(c=Rd(c,b.top))}}if(f&&f.bottom>=e?(i=a,n=f):c&&c.top<=e&&(i=h,n=c),!i)return{node:s,offset:0};let u=Math.max(n.left,Math.min(n.right,t));if(i.nodeType==3)return Bd(i,u,e);if(l&&i.contentEditable!="false")return Mh(i,u,e);let d=Array.prototype.indexOf.call(s.childNodes,i)+(t>=(n.left+n.right)/2?1:0);return{node:s,offset:d}}function Bd(s,t,e){let i=s.nodeValue.length,n=-1,r=1e9,o=0;for(let l=0;le?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&c=(f.left+f.right)/2,d=u;if((B.chrome||B.gecko)&&Xi(s,l).getBoundingClientRect().left==f.right&&(d=!u),c<=0)return{node:s,offset:l+(d?1:0)};n=l+(d?1:0),r=c}}}return{node:s,offset:n>-1?n:o>0?s.nodeValue.length:0}}function Pp(s,t,e,i=-1){var n,r;let o=s.contentDOM.getBoundingClientRect(),l=o.top+s.viewState.paddingTop,a,{docHeight:h}=s.viewState,{x:f,y:c}=t,u=c-l;if(u<0)return 0;if(u>h)return s.state.doc.length;for(let v=s.viewState.heightOracle.textHeight/2,x=!1;a=s.elementAtHeight(u),a.type!=ei.Text;)for(;u=i>0?a.bottom+v:a.top-v,!(u>=0&&u<=h);){if(x)return e?null:0;x=!0,i=-i}c=l+u;let d=a.from;if(ds.viewport.to)return s.viewport.to==s.state.doc.length?s.state.doc.length:e?null:Nd(s,o,a,f,c);let p=s.dom.ownerDocument,g=s.root.elementFromPoint?s.root:p,m=g.elementFromPoint(f,c);m&&!s.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,c),m&&!s.contentDOM.contains(m)&&(m=null));let b,w=-1;if(m&&((n=s.docView.nearest(m))===null||n===void 0?void 0:n.isEditable)!=!1){if(p.caretPositionFromPoint){let v=p.caretPositionFromPoint(f,c);v&&({offsetNode:b,offset:w}=v)}else if(p.caretRangeFromPoint){let v=p.caretRangeFromPoint(f,c);v&&({startContainer:b,startOffset:w}=v,(!s.contentDOM.contains(b)||B.safari&&Bb(b,w,f)||B.chrome&&Nb(b,w,f))&&(b=void 0))}}if(!b||!s.docView.dom.contains(b)){let v=_t.find(s.docView,d);if(!v)return u>a.top+a.height/2?a.to:a.from;({node:b,offset:w}=Mh(v.dom,f,c))}let y=s.docView.nearest(b);if(!y)return null;if(y.isWidget&&((r=y.dom)===null||r===void 0?void 0:r.nodeType)==1){let v=y.dom.getBoundingClientRect();return t.ys.defaultLineHeight*1.5){let l=s.viewState.heightOracle.textHeight,a=Math.floor((n-e.top-(s.defaultLineHeight-l)*.5)/l);r+=a*s.viewState.heightOracle.lineLength}let o=s.state.sliceDoc(e.from,e.to);return e.from+kd(o,r,s.state.tabSize)}function Bb(s,t,e){let i;if(s.nodeType!=3||t!=(i=s.nodeValue.length))return!1;for(let n=s.nextSibling;n;n=n.nextSibling)if(n.nodeType!=1||n.nodeName!="BR")return!1;return Xi(s,i-1,i).getBoundingClientRect().left>e}function Nb(s,t,e){if(t!=0)return!1;for(let n=s;;){let r=n.parentNode;if(!r||r.nodeType!=1||r.firstChild!=n)return!1;if(r.classList.contains("cm-line"))break;n=r}let i=s.nodeType==1?s.getBoundingClientRect():Xi(s,0,Math.max(s.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function Lb(s,t){let e=s.lineBlockAt(t);if(Array.isArray(e.type)){for(let i of e.type)if(i.to>t||i.to==t&&(i.to==e.to||i.type==ei.Text))return i}return e}function Hb(s,t,e,i){let n=Lb(s,t.head),r=!i||n.type!=ei.Text||!(s.lineWrapping||n.widgetLineBreaks)?null:s.coordsAtPos(t.assoc<0&&t.head>n.from?t.head-1:t.head);if(r){let o=s.dom.getBoundingClientRect(),l=s.textDirectionAt(n.from),a=s.posAtCoords({x:e==(l==Ct.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return V.cursor(a,e?-1:1)}return V.cursor(e?n.to:n.from,e?-1:1)}function Ld(s,t,e,i){let n=s.state.doc.lineAt(t.head),r=s.bidiSpans(n),o=s.textDirectionAt(n.from);for(let l=t,a=null;;){let h=kb(n,r,o,l,e),f=bp;if(!h){if(n.number==(e?s.state.doc.lines:1))return l;f=`\n`,n=s.state.doc.line(n.number+(e?1:-1)),r=s.bidiSpans(n),h=s.visualLineSide(n,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function Fb(s,t,e){let i=s.state.charCategorizer(t),n=i(e);return r=>{let o=i(r);return n==Ne.Space&&(n=o),n==o}}function Vb(s,t,e,i){let n=t.head,r=e?1:-1;if(n==(e?s.state.doc.length:0))return V.cursor(n,t.assoc);let o=t.goalColumn,l,a=s.contentDOM.getBoundingClientRect(),h=s.coordsAtPos(n,t.assoc||-1),f=s.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=s.viewState.lineBlockAt(n);o==null&&(o=Math.min(a.right-a.left,s.defaultCharacterWidth*(n-d.from))),l=(r<0?d.top:d.bottom)+f}let c=a.left+o,u=i!=null?i:s.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(u+d)*r,g=Pp(s,{x:c,y:p},!1,r);if(pa.bottom||(r<0?gn)){let m=s.docView.coordsForChar(g),b=!m||p{if(t>r&&tn(s)),e.from,t.head>e.from?-1:1);return i==e.from?e:V.cursor(i,inull),B.gecko&&iw(t.contentDOM.ownerDocument)}handleEvent(t){!Kb(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||this.runHandlers(t.type,t)}runHandlers(t,e){let i=this.handlers[t];if(i){for(let n of i.observers)n(this.view,e);for(let n of i.handlers){if(e.defaultPrevented)break;if(n(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=zb(t),i=this.handlers,n=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(n.removeEventListener(r,this.handleEvent),l=null),l||n.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&n.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&Date.now()i.keyCode==t.keyCode))&&!t.ctrlKey||Wb.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(){let t=this.pendingIOSKey;return t?(this.pendingIOSKey=void 0,En(this.view.contentDOM,t.key,t.keyCode)):!1}ignoreDuringComposition(t){return/^key/.test(t.type)?this.composing>0?!0:B.safari&&!B.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function Hd(s,t){return(e,i)=>{try{return t.call(s,i,e)}catch(n){ii(e.state,n)}}}function zb(s){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of s){let n=i.spec;if(n&&n.domEventHandlers)for(let r in n.domEventHandlers){let o=n.domEventHandlers[r];o&&e(r).handlers.push(Hd(i.value,o))}if(n&&n.domEventObservers)for(let r in n.domEventObservers){let o=n.domEventObservers[r];o&&e(r).observers.push(Hd(i.value,o))}}for(let i in ve)e(i).handlers.push(ve[i]);for(let i in ke)e(i).observers.push(ke[i]);return t}var Rp=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Wb="dthko",Gb=[16,17,18,20,91,92,224,225],xo=6;function So(s){return Math.max(0,s)*.7+8}function Ub(s,t){return Math.max(Math.abs(s.clientX-t.clientX),Math.abs(s.clientY-t.clientY))}var Ah=class{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParent=ob(t.contentDOM),this.atoms=t.state.facet($h).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(pt.allowMultipleSelections)&&jb(t,e),this.dragging=$b(t,e)&&Lp(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){var e;if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&Ub(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let i=0,n=0,r=((e=this.scrollParent)===null||e===void 0?void 0:e.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},o=_p(this.view);t.clientX-o.left<=r.left+xo?i=-So(r.left-t.clientX):t.clientX+o.right>=r.right-xo&&(i=So(t.clientX-r.right)),t.clientY-o.top<=r.top+xo?n=-So(r.top-t.clientY):t.clientY+o.bottom>=r.bottom-xo&&(n=So(t.clientY-r.bottom)),this.setScrollSpeed(i,n)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;ithis.select(this.lastEvent),20)}};function jb(s,t){let e=s.state.facet(wp);return e.length?e[0](t):B.mac?t.metaKey:t.ctrlKey}function qb(s,t){let e=s.state.facet(yp);return e.length?e[0](t):B.mac?!t.altKey:!t.ctrlKey}function $b(s,t){let{main:e}=s.state.selection;if(e.empty)return!1;let i=Eo(s.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function Kb(s,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=s.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=ht.get(e))&&i.ignoreEvent(t))return!1;return!0}var ve=Object.create(null),ke=Object.create(null),Ip=B.ie&&B.ie_version<15||B.ios&&B.webkit_version<604;function Yb(s){let t=s.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{s.focus(),e.remove(),Bp(s,e.value)},50)}function Bp(s,t){let{state:e}=s,i,n=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(Oh!=null&&e.selection.ranges.every(a=>a.empty)&&Oh==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let c=e.toText((o?r.line(n++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:c},range:V.cursor(h.from+c.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(n++);return{changes:{from:a.from,to:a.to,insert:h.text},range:V.cursor(a.from+h.length)}}):i=e.replaceSelection(r);s.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}ke.scroll=s=>{s.inputState.lastScrollTop=s.scrollDOM.scrollTop,s.inputState.lastScrollLeft=s.scrollDOM.scrollLeft};ve.keydown=(s,t)=>(s.inputState.setSelectionOrigin("select"),t.keyCode==27&&(s.inputState.lastEscPress=Date.now()),!1);ke.touchstart=(s,t)=>{s.inputState.lastTouchTime=Date.now(),s.inputState.setSelectionOrigin("select.pointer")};ke.touchmove=s=>{s.inputState.setSelectionOrigin("select.pointer")};ve.mousedown=(s,t)=>{if(s.observer.flush(),s.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of s.state.facet(vp))if(e=i(s,t),e)break;if(!e&&t.button==0&&(e=Qb(s,t)),e){let i=!s.hasFocus;s.inputState.startMouseSelection(new Ah(s,t,e,i)),i&&s.observer.ignore(()=>ip(s.contentDOM));let n=s.inputState.mouseSelection;if(n)return n.start(t),n.dragging===!1}return!1};function Fd(s,t,e,i){if(i==1)return V.cursor(t,e);if(i==2)return Pb(s.state,t,e);{let n=_t.find(s.docView,t),r=s.state.doc.lineAt(n?n.posAtEnd:t),o=n?n.posAtStart:r.from,l=n?n.posAtEnd:r.to;return ls>=t.top&&s<=t.bottom,Vd=(s,t,e)=>Np(t,e)&&s>=e.left&&s<=e.right;function Xb(s,t,e,i){let n=_t.find(s.docView,t);if(!n)return 1;let r=t-n.posAtStart;if(r==0)return 1;if(r==n.length)return-1;let o=n.coordsAt(r,-1);if(o&&Vd(e,i,o))return-1;let l=n.coordsAt(r,1);return l&&Vd(e,i,l)?1:o&&Np(i,o)?-1:1}function zd(s,t){let e=s.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:Xb(s,e,t.clientX,t.clientY)}}var Jb=B.ie&&B.ie_version<=11,Wd=null,Gd=0,Ud=0;function Lp(s){if(!Jb)return s.detail;let t=Wd,e=Ud;return Wd=s,Ud=Date.now(),Gd=!t||e>Date.now()-400&&Math.abs(t.clientX-s.clientX)<2&&Math.abs(t.clientY-s.clientY)<2?(Gd+1)%3:1}function Qb(s,t){let e=zd(s,t),i=Lp(t),n=s.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),n=n.map(r.changes))},get(r,o,l){let a=zd(s,r),h,f=Fd(s,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let c=Fd(s,e.pos,e.bias,i),u=Math.min(c.from,f.from),d=Math.max(c.to,f.to);f=u1&&(h=Zb(n,a.pos))?h:l?n.addRange(f):V.create([f])}}}function Zb(s,t){for(let e=0;e=t)return V.create(s.ranges.slice(0,e).concat(s.ranges.slice(e+1)),s.mainIndex==e?0:s.mainIndex-(s.mainIndex>e?1:0))}return null}ve.dragstart=(s,t)=>{let{selection:{main:e}}=s.state;if(t.target.draggable){let n=s.docView.nearest(t.target);if(n&&n.isWidget){let r=n.posAtStart,o=r+n.length;(r>=e.to||o<=e.from)&&(e=V.range(r,o))}}let{inputState:i}=s;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",s.state.sliceDoc(e.from,e.to)),t.dataTransfer.effectAllowed="copyMove"),!1};ve.dragend=s=>(s.inputState.draggedContent=null,!1);function jd(s,t,e,i){if(!e)return;let n=s.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=s.inputState,o=i&&r&&qb(s,t)?{from:r.from,to:r.to}:null,l={from:n,insert:e},a=s.state.changes(o?[o,l]:l);s.focus(),s.dispatch({changes:a,selection:{anchor:a.mapPos(n,-1),head:a.mapPos(n,1)},userEvent:o?"move.drop":"input.drop"}),s.inputState.draggedContent=null}ve.drop=(s,t)=>{if(!t.dataTransfer)return!1;if(s.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),n=0,r=()=>{++n==e.length&&jd(s,t,i.filter(o=>o!=null).join(s.state.lineBreak),!1)};for(let o=0;o{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return jd(s,t,i,!0),!0}return!1};ve.paste=(s,t)=>{if(s.state.readOnly)return!0;s.observer.flush();let e=Ip?null:t.clipboardData;return e?(Bp(s,e.getData("text/plain")||e.getData("text/uri-text")),!0):(Yb(s),!1)};function tw(s,t){let e=s.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),s.focus()},50)}function ew(s){let t=[],e=[],i=!1;for(let n of s.selection.ranges)n.empty||(t.push(s.sliceDoc(n.from,n.to)),e.push(n));if(!t.length){let n=-1;for(let{from:r}of s.selection.ranges){let o=s.doc.lineAt(r);o.number>n&&(t.push(o.text),e.push({from:o.from,to:Math.min(s.doc.length,o.to+1)})),n=o.number}i=!0}return{text:t.join(s.lineBreak),ranges:e,linewise:i}}var Oh=null;ve.copy=ve.cut=(s,t)=>{let{text:e,ranges:i,linewise:n}=ew(s.state);if(!e&&!n)return!1;Oh=n?e:null,t.type=="cut"&&!s.state.readOnly&&s.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=Ip?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(tw(s,e),!1)};var Hp=Ze.define();function Fp(s,t){let e=[];for(let i of s.facet(Sp)){let n=i(s,t);n&&e.push(n)}return e?s.update({effects:e,annotations:Hp.of(!0)}):null}function Vp(s){setTimeout(()=>{let t=s.hasFocus;if(t!=s.inputState.notifiedFocused){let e=Fp(s.state,t);e?s.dispatch(e):s.update([])}},10)}ke.focus=s=>{s.inputState.lastFocusTime=Date.now(),!s.scrollDOM.scrollTop&&(s.inputState.lastScrollTop||s.inputState.lastScrollLeft)&&(s.scrollDOM.scrollTop=s.inputState.lastScrollTop,s.scrollDOM.scrollLeft=s.inputState.lastScrollLeft),Vp(s)};ke.blur=s=>{s.observer.clearSelectionRange(),Vp(s)};ke.compositionstart=ke.compositionupdate=s=>{s.inputState.compositionFirstChange==null&&(s.inputState.compositionFirstChange=!0),s.inputState.composing<0&&(s.inputState.composing=0)};ke.compositionend=s=>{s.inputState.composing=-1,s.inputState.compositionEndedAt=Date.now(),s.inputState.compositionPendingKey=!0,s.inputState.compositionPendingChange=s.observer.pendingRecords().length>0,s.inputState.compositionFirstChange=null,B.chrome&&B.android?s.observer.flushSoon():s.inputState.compositionPendingChange?Promise.resolve().then(()=>s.observer.flush()):setTimeout(()=>{s.inputState.composing<0&&s.docView.hasComposition&&s.update([])},50)};ke.contextmenu=s=>{s.inputState.lastContextMenu=Date.now()};ve.beforeinput=(s,t)=>{var e;let i;if(B.chrome&&B.android&&(i=Rp.find(n=>n.inputType==t.inputType))&&(s.observer.delayAndroidKey(i.key,i.keyCode),i.key=="Backspace"||i.key=="Delete")){let n=((e=window.visualViewport)===null||e===void 0?void 0:e.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>n+10&&s.hasFocus&&(s.contentDOM.blur(),s.focus())},100)}return!1};var qd=new Set;function iw(s){qd.has(s)||(qd.add(s),s.addEventListener("copy",()=>{}),s.addEventListener("cut",()=>{}))}var $d=["pre-wrap","normal","pre-line","break-spaces"],_h=class{constructor(t){this.lineWrapping=t,this.doc=Y.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return $d.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t,e){this.height!=e&&(Math.abs(this.height-e)>_o&&(t.heightChanged=!0),this.height=e)}replace(t,e,i){return s.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let r=this,o=i.doc;for(let l=n.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:c}=n[l],u=r.lineAt(a,at.ByPosNoHeight,i.setDoc(e),0,0),d=u.to>=h?u:r.lineAt(h,at.ByPosNoHeight,i,0,0);for(c+=d.to-h,h=d.to;l>0&&u.from<=n[l-1].toA;)a=n[l-1].fromA,f=n[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,n-=l.size}else if(r>n*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(n=r&&o(this.blockAt(0,i,n,r))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(t,n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},de=class s extends Lo{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new Fe(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return i.length==1&&(n instanceof s||n instanceof xi&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof xi?n=new s(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):ne.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(t,n.heights[n.index++]):(i||this.outdated)&&this.setHeight(t,Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},xi=class s extends ne{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,n=t.doc.lineAt(e+this.length).number,r=n-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:n,perLine:o,perChar:l}}blockAt(t,e,i,n){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let h=n+Math.round(Math.max(0,Math.min(1,(t-i)/this.height))*this.length),f=e.doc.lineAt(h),c=l+f.length*a,u=Math.max(i,t-c/2);return new Fe(f.from,f.length,u,c,0)}else{let h=Math.max(0,Math.min(o-r,Math.floor((t-i)/l))),{from:f,length:c}=e.doc.line(r+h);return new Fe(f,c,i+l*h,l,0)}}lineAt(t,e,i,n,r){if(e==at.ByHeight)return this.blockAt(t,i,n,r);if(e==at.ByPosNoHeight){let{from:d,to:p}=i.doc.lineAt(t);return new Fe(d,p-d,0,0,0)}let{firstLine:o,perLine:l,perChar:a}=this.heightMetrics(i,r),h=i.doc.lineAt(t),f=l+h.length*a,c=h.number-o,u=n+l*c+a*(h.from-r-c);return new Fe(h.from,h.length,Math.max(n,Math.min(u,n+this.height-f)),f,0)}forEachLine(t,e,i,n,r,o){t=Math.max(t,r),e=Math.min(e,r+this.length);let{firstLine:l,perLine:a,perChar:h}=this.heightMetrics(i,r);for(let f=t,c=n;f<=e;){let u=i.doc.lineAt(f);if(f==t){let p=u.number-l;c+=a*p+h*(t-r-p)}let d=a+h*u.length;o(new Fe(u.from,u.length,c,d,0)),c+=d,f=u.to+1}}replace(t,e,i){let n=this.length-e;if(n>0){let r=i[i.length-1];r instanceof s?i[i.length-1]=new s(r.length+n):i.push(null,new s(n-1))}if(t>0){let r=i[0];r instanceof s?i[0]=new s(t+r.length):i.unshift(new s(t-1),null)}return ne.of(i)}decomposeLeft(t,e){e.push(new s(t-1),null)}decomposeRight(t,e){e.push(null,new s(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let r=e+this.length;if(n&&n.from<=e+this.length&&n.more){let o=[],l=Math.max(e,n.from),a=-1;for(n.from>e&&o.push(new s(n.from-e-1).updateHeight(t,e));l<=r&&n.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let c=n.heights[n.index++];a==-1?a=c:Math.abs(c-a)>=_o&&(a=-2);let u=new de(f,c);u.outdated=!1,o.push(u),l+=f+1}l<=r&&o.push(null,new s(r-l).updateHeight(t,l));let h=ne.of(o);return(a<0||Math.abs(h.height-this.height)>=_o||Math.abs(a-this.heightMetrics(t,e).perLine)>=_o)&&(t.heightChanged=!0),h}else(i||this.outdated)&&(this.setHeight(t,t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Dh=class extends ne{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,n){let r=i+this.left.height;return tl))return h;let f=e==at.ByPosNoHeight?at.ByPosNoHeight:at.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,n,r).join(h)}forEachLine(t,e,i,n,r,o){let l=n+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,at.ByPos,i,n,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&Kd(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t2*e.size||e.size>2*t.size?ne.of(this.break?[t,null,e]:[t,e]):(this.left=t,this.right=e,this.height=t.height+e.height,this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return n&&n.from<=e+r.length&&n.more?a=r=r.updateHeight(t,e,i,n):r.updateHeight(t,e,i),n&&n.from<=l+o.length&&n.more?a=o=o.updateHeight(t,l,i,n):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function Kd(s,t){let e,i;s[t]==null&&(e=s[t-1])instanceof xi&&(i=s[t+1])instanceof xi&&s.splice(t-1,3,new xi(e.length+1+i.length))}var nw=5,Ph=class s{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof de?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new de(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=nw)&&this.addLineDeco(n,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new de(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new xi(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof de)return t;let e=new de(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof de)&&!this.isCovered?this.nodes.push(new de(0,-1)):(this.writtenTof.clientHeight||f.scrollWidth>f.clientWidth)&&c.overflow!="visible"){let u=f.getBoundingClientRect();r=Math.max(r,u.left),o=Math.min(o,u.right),l=Math.max(l,u.top),a=h==s.parentNode?u.bottom:Math.min(a,u.bottom)}h=c.position=="absolute"||c.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function ow(s,t){let e=s.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var Us=class{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new _h(e),this.stateDeco=t.facet(Xs).filter(i=>typeof i!="function"),this.heightMap=ne.empty().applyChanges(this.stateDeco,Y.empty,this.heightOracle.setDoc(t.doc),[new ze(0,0,0,t.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Nt.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>n>=r&&n<=o)){let{from:r,to:o}=this.lineBlockAt(n);t.push(new _n(r,o))}}this.viewports=t.sort((i,n)=>i.from-n.from),this.scaler=this.heightMap.height<=7e6?Yd:new Bh(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(this.scaler.scale==1?t:Hs(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Xs).filter(f=>typeof f!="function");let n=t.changedRanges,r=ze.extendWithRanges(n,sw(i,this.stateDeco,t?t.changes:ee.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),this.heightMap.height!=o&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=!t.changes.empty||t.flags&2||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),h&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(Sb)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),n=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?Ct.RTL:Ct.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:v,scaleY:x}=ep(e,l);(this.scaleX!=v||this.scaleY!=x)&&(this.scaleX=v,this.scaleY=x,h|=8,o=a=!0)}let c=(parseInt(i.paddingTop)||0)*this.scaleY,u=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=u)&&(this.paddingTop=c,this.paddingBottom=u,h|=10),this.editorWidth!=t.scrollDOM.clientWidth&&(n.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=8);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=sp(t.scrollDOM);let p=(this.printing?ow:rw)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget)return 0;let w=l.width;if((this.contentDOMWidth!=w||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=8),a){let v=t.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(v)&&(o=!0),o||n.lineWrapping&&Math.abs(w-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:S,textHeight:k}=t.docView.measureTextSize();o=x>0&&n.refresh(r,x,S,k,w/S,v),o&&(t.docView.minWidth=0,h|=8)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),n.heightChanged=!1;for(let x of this.viewports){let S=x.from==this.viewport.from?v:t.docView.measureVisibleLineHeights(x);this.heightMap=(o?ne.empty().applyChanges(this.stateDeco,Y.empty,this.heightOracle,[new ze(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(n,0,o,new Eh(x.from,S))}n.heightChanged&&(h|=2)}let y=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return y&&(this.viewport=this.getViewport(f,this.scrollTarget)),this.updateForViewport(),(h&2||y)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new _n(n.lineAt(o-i*1e3,at.ByHeight,r,0,0).from,n.lineAt(l+(1-i)*1e3,at.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=n.lineAt(h,at.ByPos,r,0,0),u;e.y=="center"?u=(c.top+c.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&n>o-2*1e3&&r>1,o=n<<1;if(this.defaultTextDirection!=Ct.LTR&&!i)return[];let l=[],a=(h,f,c,u)=>{if(f-hh&&mm.from>=c.from&&m.to<=c.to&&Math.abs(m.from-h)m.fromb));if(!g){if(fm.from<=f&&m.to>=f)){let m=e.moveToLineBoundary(V.cursor(f),!1,!0).head;m>h&&(f=m)}g=new Us(h,f,this.gapSize(c,h,f,u))}l.push(g)};for(let h of this.viewportLines){if(h.lengthh.from&&a(h.from,u,h,f),de.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];yt.spans(t,this.viewport.from,this.viewport.to,{span(n,r){e.push({from:n,to:r})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some((n,r)=>n.from!=e[r].from||n.to!=e[r].to);return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||Hs(this.heightMap.lineAt(t,at.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return Hs(this.heightMap.lineAt(this.scaler.fromDOM(t),at.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Hs(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},_n=class{constructor(t,e){this.from=t,this.to=e}};function lw(s,t,e){let i=[],n=s,r=0;return yt.spans(e,s,t,{span(){},point(o,l){o>n&&(i.push({from:n,to:o}),r+=o-n),n=l}},20),n=1)return t[t.length-1].to;let i=Math.floor(s*e);for(let n=0;;n++){let{from:r,to:o}=t[n],l=o-r;if(i<=l)return r+i;i-=l}}function Mo(s,t){let e=0;for(let{from:i,to:n}of s.ranges){if(t<=n){e+=t-i;break}e+=n-i}return e/s.total}function aw(s,t){for(let e of s)if(t(e))return e}var Yd={toDOM(s){return s},fromDOM(s){return s},scale:1},Bh=class{constructor(t,e,i){let n=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,at.ByPos,t,0,0).top,f=e.lineAt(a,at.ByPos,t,0,0).bottom;return n+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(e.height-n);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let r=eHs(n,t)):s._content)}var To=U.define({combine:s=>s.join(" ")}),Nh=U.define({combine:s=>s.indexOf(!0)>-1}),Lh=ue.newName(),zp=ue.newName(),Wp=ue.newName(),Gp={"&light":"."+zp,"&dark":"."+Wp};function Hh(s,t,e){return new ue(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,n=>{if(n=="&")return s;if(!e||!e[n])throw new RangeError(`Unsupported selector: ${n}`);return e[n]}):s+" "+i}})}var hw=Hh("."+Lh,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Gp),Fs="\\uFFFF",Fh=class{constructor(t,e){this.points=t,this.text="",this.lineSeparator=e.facet(pt.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=Fs}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let n=t;;){this.findPointBefore(i,n);let r=this.text.length;this.readNode(n);let o=n.nextSibling;if(o==e)break;let l=ht.get(n),a=ht.get(o);(l&&a?l.breakAfter:(l?l.breakAfter:Xd(n))||Xd(o)&&(n.nodeName!="BR"||n.cmIgnore)&&this.text.length>r)&&this.lineBreak(),n=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=n.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=ht.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(fw(t,i.node,i.offset)?e:0))}};function fw(s,t,e){for(;;){if(!t||e-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:dw(t),a=new Fh(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=pw(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!dh(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!dh(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if(B.ios&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.toDate.now()-100?s.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=n.from,h=null;(r===8||B.android&&t.text.length=n.from&&e.to<=n.to&&(e.from!=n.from||e.to!=n.to)&&n.to-n.from-(e.to-e.from)<=4?e={from:n.from,to:n.to,insert:s.state.doc.slice(n.from,e.from).append(e.insert).append(s.state.doc.slice(e.to,n.to))}:(B.mac||B.android)&&e&&e.from==e.to&&e.from==n.head-1&&/^\\. ?$/.test(e.insert.toString())&&s.contentDOM.getAttribute("autocorrect")=="off"?(i&&e.insert.length==2&&(i=V.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:Y.of([" "])}):B.chrome&&e&&e.from==e.to&&e.from==n.head&&e.insert.toString()==`\n `&&s.lineWrapping&&(i&&(i=V.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:Y.of([" "])}),e){if(B.ios&&s.inputState.flushIOSKey()||B.android&&(e.from==n.from&&e.to==n.to&&e.insert.length==1&&e.insert.lines==2&&En(s.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||r==8&&e.insert.lengthn.head)&&En(s.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&En(s.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();s.inputState.composing>=0&&s.inputState.composing++;let l,a=()=>l||(l=cw(s,e,i));return s.state.facet(xp).some(h=>h(s,e.from,e.to,o,a))||s.dispatch(a()),!0}else if(i&&!i.main.eq(n)){let o=!1,l="select";return s.inputState.lastSelectionTime>Date.now()-50&&(s.inputState.lastSelectionOrigin=="select"&&(o=!0),l=s.inputState.lastSelectionOrigin),s.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function cw(s,t,e){let i,n=s.state,r=n.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&s.inputState.composing<0){let l=r.fromt.to?n.sliceDoc(t.to,r.to):"";i=n.replaceSelection(s.state.toText(l+t.insert.sliceString(0,void 0,s.state.lineBreak)+a))}else{let l=n.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(n.selection.ranges.length>1&&s.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=s.state.sliceDoc(t.from,t.to),f,c=e&&Ep(s,e.main.head);if(c){let p=t.insert.length-(t.to-t.from);f={from:c.from,to:c.to-p}}else f=s.state.doc.lineAt(r.head);let u=r.to-t.to,d=r.to-r.from;i=n.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-u,m=g-h.length;if(p.to-p.from!=d||s.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=n.changes({from:m,to:g,insert:t.insert}),w=p.to-r.to;return{changes:b,range:a?V.range(Math.max(0,a.anchor+w),Math.max(0,a.head+w)):p.map(b)}})}else i={changes:l,selection:a&&n.selection.replaceRange(a)}}let o="input.type";return(s.composing||s.inputState.compositionPendingChange&&s.inputState.compositionEndedAt>Date.now()-50)&&(s.inputState.compositionPendingChange=!1,o+=".compose",s.inputState.compositionFirstChange&&(o+=".start",s.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:o,scrollIntoView:!0})}function uw(s,t,e,i){let n=Math.min(s.length,t.length),r=0;for(;r0&&l>0&&s.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function dw(s){let t=[];if(s.root.activeElement!=s.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}=s.observer.selectionRange;return e&&(t.push(new Fo(e,i)),(n!=e||r!=i)&&t.push(new Fo(n,r))),t}function pw(s,t){if(s.length==0)return null;let e=s[0].pos,i=s.length==2?s[1].pos:e;return e>-1&&i>-1?V.single(e+t,i+t):null}var gw={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},uh=B.ie&&B.ie_version<=11,zh=class{constructor(t){this.view=t,this.active=!1,this.selectionRange=new ph,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(B.ie&&B.ie_version<=11||B.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),uh&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500)}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(Wo)?i.root.activeElement!=this.dom:!Ao(i.dom,n))return;let r=n.anchorNode&&i.docView.nearest(n.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(B.ie&&B.ie_version<=11||B.android&&B.chrome)&&!i.state.selection.main.empty&&n.focusNode&&Vs(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=B.safari&&t.root.nodeType==11&&nb(this.dom.ownerDocument)==this.dom&&mw(this.view)||Eo(t.root);if(!e||this.selectionRange.eq(e))return!1;let i=Ao(this.dom,e);return i&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&En(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(n=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&Ao(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new Vh(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=Up(this.view,e);return this.view.state==i&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=Jd(e,t.previousSibling||t.target.previousSibling,-1),n=Jd(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}};function Jd(s,t,e){for(;t;){let i=ht.get(t);if(i&&i.parent==s)return i;let n=t.parentNode;t=n!=s.dom?n:e>0?t.nextSibling:t.previousSibling}return null}function mw(s){let t=null;function e(a){a.preventDefault(),a.stopImmediatePropagation(),t=a.getTargetRanges()[0]}if(s.contentDOM.addEventListener("beforeinput",e,!0),s.dom.ownerDocument.execCommand("indent"),s.contentDOM.removeEventListener("beforeinput",e,!0),!t)return null;let i=t.startContainer,n=t.startOffset,r=t.endContainer,o=t.endOffset,l=s.docView.domAtPos(s.state.selection.main.anchor);return Vs(l.node,l.offset,r,o)&&([i,n,r,o]=[r,o,i,n]),{anchorNode:i,anchorOffset:n,focusNode:r,focusOffset:o}}var et=class s{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:e}=t;this.dispatchTransactions=t.dispatchTransactions||e&&(i=>i.forEach(n=>e(n,this)))||(i=>this.update(i)),this.dispatch=this.dispatch.bind(this),this._root=t.root||lb(t.parent)||document,this.viewState=new Ho(t.state||pt.create(t)),t.scrollTo&&t.scrollTo.is(ko)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(Ns).map(i=>new Gs(i));for(let i of this.plugins)i.update(this);this.observer=new zh(this),this.inputState=new Th(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Bo(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure()}dispatch(...t){let e=t.length==1&&t[0]instanceof qt?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,n,r=this.state;for(let u of t){if(u.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=u.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(u=>u.annotation(Hp))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=Fp(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(pt.phrases)!=this.state.facet(pt.phrases))return this.setState(r);n=Io.create(this,r,t),n.flags|=l;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let u of t){if(c&&(c=c.map(u.changes)),u.scrollIntoView){let{main:d}=u.state.selection;c=new Ws(d.empty?d:V.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of u.effects)d.is(ko)&&(c=d.value.clip(this.state))}this.viewState.update(n,c),this.bidiCache=Vo.update(this.bidiCache,n.changes),n.empty||(this.updatePlugins(n),this.inputState.update(n)),e=this.docView.update(n),this.state.facet(Ls)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(u=>u.isUserEvent("select.pointer")))}finally{this.updateState=0}if(n.startState.facet(To)!=n.state.facet(To)&&(this.viewState.mustMeasureContent=!0),(e||i||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!n.empty)for(let u of this.state.facet(Ch))try{u(n)}catch(d){ii(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!Up(this,f)&&h.force&&En(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new Ho(t),this.plugins=t.facet(Ns).map(i=>new Gs(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new Bo(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(Ns),i=t.state.facet(Ns);if(e!=i){let n=[];for(let r of i){let o=e.indexOf(r);if(o<0)n.push(new Gs(r));else{let l=this.plugins[o];l.mustUpdate=t,n.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let n of this.plugins)n.mustUpdate=t;for(let n=0;n-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(sp(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(n);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return ii(this.state,p),Qd}}),c=Io.create(this,this.state,[]),u=!1;c.flags|=a,e?e.flags|=a:e=c,this.updateState=2,c.empty||(this.updatePlugins(c),this.inputState.update(c),this.updateAttrs(),u=this.docView.update(c));for(let d=0;d1||p<-1){n=n+p,i.scrollTop=n/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(Ch))l(e)}get themeClasses(){return Lh+" "+(this.state.facet(Nh)?Wp:zp)+" "+this.state.facet(To)}updateAttrs(){let t=Zd(this,Mp,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(Wo)?"true":"false",class:"cm-content",style:`${B.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Zd(this,qh,e);let i=this.observer.ignore(()=>{let n=yh(this.contentDOM,this.contentAttrs,e),r=yh(this.dom,this.editorAttrs,t);return n||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let n of i.effects)if(n.is(s.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=n.value}}mountStyles(){this.styleModules=this.state.facet(Ls);let t=this.state.facet(s.cspNonce);ue.mount(this.root,this.styleModules.concat(hw).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return ch(this,t,Ld(this,t,e,i))}moveByGroup(t,e){return ch(this,t,Ld(this,t,e,i=>Fb(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return V.cursor(r.side(e,n)+t.from,r.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return Hb(this,t,e,i)}moveVertically(t,e,i){return ch(this,t,Vb(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),Pp(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let n=this.state.doc.lineAt(t),r=this.bidiSpans(n),o=r[Ve.find(r,t-n.from,-1,e)];return Wh(i,o.dir==Ct.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(Cp)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>bw)return mp(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||gp(r.isolates,i=Pd(this,t))))return r.order;i||(i=Pd(this,t));let n=vb(t.text,e,i);return this.bidiCache.push(new Vo(t.from,t.to,e,i,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||B.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{ip(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return ko.of(new Ws(typeof t=="number"?V.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return ko.of(new Ws(V.cursor(i.from),"start","start",i.top-t,e,!0))}static domEventHandlers(t){return Rn.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return Rn.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=ue.newName(),n=[To.of(i),Ls.of(Hh(`.${i}`,t))];return e&&e.dark&&n.push(Nh.of(!0)),n}static baseTheme(t){return rh.lowest(Ls.of(Hh("."+Lh,t,Gp)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&ht.get(i)||ht.get(t);return((e=n==null?void 0:n.rootView)===null||e===void 0?void 0:e.view)||null}};et.styleModule=Ls;et.inputHandler=xp;et.focusChangeEffect=Sp;et.perLineTextDirection=Cp;et.exceptionSink=kp;et.updateListener=Ch;et.editable=Wo;et.mouseSelectionStyle=vp;et.dragMovesSelection=yp;et.clickAddsSelectionRange=wp;et.decorations=Xs;et.outerDecorations=Tp;et.atomicRanges=$h;et.bidiIsolatedRanges=Ap;et.scrollMargins=Op;et.darkTheme=Nh;et.cspNonce=U.define({combine:s=>s.length?s[0]:""});et.contentAttributes=qh;et.editorAttributes=Mp;et.lineWrapping=et.contentAttributes.of({class:"cm-lineWrapping"});et.announce=wt.define();var bw=4096,Qd={},Vo=class s{constructor(t,e,i,n,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],n=t.length?t[t.length-1].dir:Ct.LTR;for(let r=Math.max(0,t.length-10);r=0;n--){let r=i[n],o=typeof r=="function"?r(s):r;o&&wh(o,e)}return e}var a1=B.mac?"mac":B.windows?"win":B.linux?"linux":"key";var ww=!B.ios;var tp={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};ww&&(tp[".cm-line"].caretColor="transparent !important",tp[".cm-content"]={caretColor:"transparent !important"});var h1=/x/.unicode!=null?"gu":"g";var f1=et.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var si=class extends ti{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};si.prototype.elementClass="";si.prototype.toDOM=void 0;si.prototype.mapMode=jt.TrackBefore;si.prototype.startSide=si.prototype.endSide=-1;si.prototype.point=!0;var yw=0,je=class s{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=yw++}static define(t){if(t!=null&&t.base)throw new Error("Can not derive from a modified tag");let e=new s([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new qo;return e=>e.modified.indexOf(t)>-1?e:qo.get(e.base||e,e.modified.concat(t).sort((i,n)=>i.id-n.id))}},vw=0,qo=class s{constructor(){this.instances=[],this.id=vw++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&kw(e,l.modified));if(i)return i;let n=[],r=new je(n,t,e);for(let l of e)l.instances.push(r);let o=xw(e);for(let l of t.set)if(!l.modified.length)for(let a of o)n.push(s.get(l,a));return r}};function kw(s,t){return s.length==t.length&&s.every((e,i)=>e==t[i])}function xw(s){let t=[[]];for(let e=0;ei.length-e.length)}function $p(s){let t=Object.create(null);for(let e in s){let i=s[e];Array.isArray(i)||(i=[i]);for(let n of e.split(" "))if(n){let r=[],o=2,l=n;for(let c=0;;){if(l=="..."&&c>0&&c+3==n.length){o=1;break}let u=/^"(?:[^"\\\\]|\\\\.)*?"|[^\\/!]+/.exec(l);if(!u)throw new RangeError("Invalid path: "+n);if(r.push(u[0]=="*"?"":u[0][0]==\'"\'?JSON.parse(u[0]):u[0]),c+=u[0].length,c==n.length)break;let d=n[c++];if(c==n.length&&d=="!"){o=0;break}if(d!="/")throw new RangeError("Invalid path: "+n);l=n.slice(c)}let a=r.length-1,h=r[a];if(!h)throw new RangeError("Invalid path: "+n);let f=new Qs(i,o,a>0?r.slice(0,a):null);t[h]=f.sort(t[h])}}return Sw.add(t)}var Sw=new q,Qs=class{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth{let o=n;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var A=je.define,Go=A(),Ti=A(),jp=A(Ti),qp=A(Ti),Ai=A(),Uo=A(Ai),Kh=A(Ai),Ue=A(),Qi=A(Ue),We=A(),Ge=A(),Yh=A(),Js=A(Yh),jo=A(),_={comment:Go,lineComment:A(Go),blockComment:A(Go),docComment:A(Go),name:Ti,variableName:A(Ti),typeName:jp,tagName:A(jp),propertyName:qp,attributeName:A(qp),className:A(Ti),labelName:A(Ti),namespace:A(Ti),macroName:A(Ti),literal:Ai,string:Uo,docString:A(Uo),character:A(Uo),attributeValue:A(Uo),number:Kh,integer:A(Kh),float:A(Kh),bool:A(Ai),regexp:A(Ai),escape:A(Ai),color:A(Ai),url:A(Ai),keyword:We,self:A(We),null:A(We),atom:A(We),unit:A(We),modifier:A(We),operatorKeyword:A(We),controlKeyword:A(We),definitionKeyword:A(We),moduleKeyword:A(We),operator:Ge,derefOperator:A(Ge),arithmeticOperator:A(Ge),logicOperator:A(Ge),bitwiseOperator:A(Ge),compareOperator:A(Ge),updateOperator:A(Ge),definitionOperator:A(Ge),typeOperator:A(Ge),controlOperator:A(Ge),punctuation:Yh,separator:A(Yh),bracket:Js,angleBracket:A(Js),squareBracket:A(Js),paren:A(Js),brace:A(Js),content:Ue,heading:Qi,heading1:A(Qi),heading2:A(Qi),heading3:A(Qi),heading4:A(Qi),heading5:A(Qi),heading6:A(Qi),contentSeparator:A(Ue),list:A(Ue),quote:A(Ue),emphasis:A(Ue),strong:A(Ue),link:A(Ue),monospace:A(Ue),strikethrough:A(Ue),inserted:A(),deleted:A(),changed:A(),invalid:A(),meta:jo,documentMeta:A(jo),annotation:A(jo),processingInstruction:A(jo),definition:je.defineModifier(),constant:je.defineModifier(),function:je.defineModifier(),standard:je.defineModifier(),local:je.defineModifier(),special:je.defineModifier()},d1=Xh([{tag:_.link,class:"tok-link"},{tag:_.heading,class:"tok-heading"},{tag:_.emphasis,class:"tok-emphasis"},{tag:_.strong,class:"tok-strong"},{tag:_.keyword,class:"tok-keyword"},{tag:_.atom,class:"tok-atom"},{tag:_.bool,class:"tok-bool"},{tag:_.url,class:"tok-url"},{tag:_.labelName,class:"tok-labelName"},{tag:_.inserted,class:"tok-inserted"},{tag:_.deleted,class:"tok-deleted"},{tag:_.literal,class:"tok-literal"},{tag:_.string,class:"tok-string"},{tag:_.number,class:"tok-number"},{tag:[_.regexp,_.escape,_.special(_.string)],class:"tok-string2"},{tag:_.variableName,class:"tok-variableName"},{tag:_.local(_.variableName),class:"tok-variableName tok-local"},{tag:_.definition(_.variableName),class:"tok-variableName tok-definition"},{tag:_.special(_.variableName),class:"tok-variableName2"},{tag:_.definition(_.propertyName),class:"tok-propertyName tok-definition"},{tag:_.typeName,class:"tok-typeName"},{tag:_.namespace,class:"tok-namespace"},{tag:_.className,class:"tok-className"},{tag:_.macroName,class:"tok-macroName"},{tag:_.propertyName,class:"tok-propertyName"},{tag:_.operator,class:"tok-operator"},{tag:_.comment,class:"tok-comment"},{tag:_.meta,class:"tok-meta"},{tag:_.invalid,class:"tok-invalid"},{tag:_.punctuation,class:"tok-punctuation"}]);var Jh,In=new q;function Cw(s){return U.define({combine:s?t=>t.concat(s):void 0})}var Mw=new q,se=class{constructor(t,e,i=[],n=""){this.data=t,this.name=n,pt.prototype.hasOwnProperty("tree")||Object.defineProperty(pt.prototype,"tree",{get(){return tf(this)}}),this.parser=e,this.extension=[Bn.of(this),pt.languageData.of((r,o,l)=>{let a=Kp(r,o,l),h=a.type.prop(In);if(!h)return[];let f=r.facet(h),c=a.type.prop(Mw);if(c){let u=a.resolve(o-a.from,l);for(let d of c)if(d.test(u,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Kp(t,e,i).type.prop(In)==this.data}findRegions(t){let e=t.facet(Bn);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(r,o)=>{if(r.prop(In)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(q.mounted);if(l){if(l.tree.prop(In)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(n(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;ai.isTop?e:void 0)]}),t.name)}configure(t,e){return new s(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function tf(s){let t=s.field(se.state,!1);return t?t.tree:dt.empty}var ef=class{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},Zs=null,nf=class s{constructor(t,e,i=[],n,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new s(t,e,[],dt.empty,0,i,[],null)}startParse(){return this.parser.startParse(new ef(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=dt.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let n=Date.now()+t;t=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(Gi.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=Zs;Zs=this;try{return t()}finally{Zs=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=Yp(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,c,u)=>a.push({fromA:h,toA:f,fromB:c,toB:u})),i=Gi.applyChanges(i,a),n=dt.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),c=t.mapPos(h.to,-1);ft.from&&(this.fragments=Yp(this.fragments,n,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends vn{createParse(e,i,n){let r=n[0].from,o=n[n.length-1].to;return{parsedPos:r,advance(){let a=Zs;if(a){for(let h of n)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new dt(It.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return Zs}};function Yp(s,t,e){return Gi.applyChanges(s,[{fromA:t,toA:e,fromB:t,toB:e}])}var tr=class s{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new s(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=nf.create(t.facet(Bn).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new s(i)}};se.state=Qe.define({create:tr.init,update(s,t){for(let e of t.effects)if(e.is(se.setState))return e.value;return t.startState.facet(Bn)!=t.state.facet(Bn)?tr.init(t.state):s.apply(t)}});var Zp=s=>{let t=setTimeout(()=>s(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Zp=s=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(s,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var Qh=typeof navigator!="undefined"&&(!((Jh=navigator.scheduling)===null||Jh===void 0)&&Jh.isInputPending)?()=>navigator.scheduling.isInputPending():null,Tw=Rn.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(se.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(se.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Zp(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,a=r.context.work(()=>Qh&&Qh()||Date.now()>o,n+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:se.setState.of(new tr(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>ii(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),Bn=U.define({combine(s){return s.length?s[0]:null},enables:s=>[se.state,Tw,et.contentAttributes.compute([s],t=>{let e=t.facet(s);return e&&e.name?{"data-language":e.name}:{}})]});var sf=class s{constructor(t,e){this.specs=t;let i;function n(l){let a=ue.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?n(e.all):void 0,o=e.scope;this.scope=o instanceof se?l=>l.prop(In)==o.data:o?l=>l==o:void 0,this.style=Xh(t.map(l=>({tag:l.tag,class:l.class||n(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new ue(i):null,this.themeType=e.themeType}static define(t,e){return new s(t,e||{})}};var S1=sf.define([{tag:_.meta,color:"#404740"},{tag:_.link,textDecoration:"underline"},{tag:_.heading,textDecoration:"underline",fontWeight:"bold"},{tag:_.emphasis,fontStyle:"italic"},{tag:_.strong,fontWeight:"bold"},{tag:_.strikethrough,textDecoration:"line-through"},{tag:_.keyword,color:"#708"},{tag:[_.atom,_.bool,_.url,_.contentSeparator,_.labelName],color:"#219"},{tag:[_.literal,_.inserted],color:"#164"},{tag:[_.string,_.deleted],color:"#a11"},{tag:[_.regexp,_.escape,_.special(_.string)],color:"#e40"},{tag:_.definition(_.variableName),color:"#00f"},{tag:_.local(_.variableName),color:"#30a"},{tag:[_.typeName,_.namespace],color:"#085"},{tag:_.className,color:"#167"},{tag:[_.special(_.variableName),_.macroName],color:"#256"},{tag:_.definition(_.propertyName),color:"#00c"},{tag:_.comment,color:"#940"},{tag:_.invalid,color:"#f00"}]);var Aw=Object.create(null),Xp=[It.none];var Jp=[],Qp=Object.create(null),Ow=Object.create(null);for(let[s,t]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])Ow[s]=_w(Aw,t);function Zh(s,t){Jp.indexOf(s)>-1||(Jp.push(s),console.warn(t))}function _w(s,t){let e=[];for(let l of t.split(" ")){let a=[];for(let h of l.split(".")){let f=s[h]||_[h];f?typeof f=="function"?a.length?a=a.map(f):Zh(h,`Modifier ${h} used at start of tag`):a.length?Zh(h,`Tag ${h} used as modifier`):a=Array.isArray(f)?f:[f]:Zh(h,`Unknown highlighting tag ${h}`)}for(let h of a)e.push(h)}if(!e.length)return 0;let i=t.replace(/ /g,"_"),n=i+" "+e.map(l=>l.id),r=Qp[n];if(r)return r.id;let o=Qp[n]=It.define({id:Xp.length,name:i,props:[$p({[i]:e})]});return Xp.push(o),o.id}var C1={rtl:Nt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:Ct.RTL}),ltr:Nt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:Ct.LTR}),auto:Nt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var of=class s{constructor(t,e,i,n,r,o,l,a,h,f=0,c){this.p=t,this.stack=e,this.state=i,this.reducePos=n,this.pos=r,this.score=o,this.buffer=l,this.bufferBase=a,this.curContext=h,this.lookAhead=f,this.parent=c}toString(){return`[${this.stack.filter((t,e)=>e%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let n=t.parser.context;return new s(t,[],e,i,i,0,[],0,n?new Ko(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,n=t&65535,{parser:r}=this.p,o=r.dynamicPrecedence(n);if(o&&(this.score+=o),i==0){this.pushState(r.getGoto(this.state,n,!0),this.reducePos),n=2e3&&!(!((e=this.p.parser.nodeSet.types[n])===null||e===void 0)&&e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=h):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(n,a)}storeNode(t,e,i,n=4,r=!1){if(t==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&o.buffer[l-4]==0&&o.buffer[l-1]>-1){if(e==i)return;if(o.buffer[l-2]>=e){o.buffer[l-2]=i;return}}}if(!r||this.pos==i)this.buffer.push(t,e,i,n);else{let o=this.buffer.length;if(o>0&&this.buffer[o-4]!=0)for(;o>0&&this.buffer[o-2]>i;)this.buffer[o]=this.buffer[o-4],this.buffer[o+1]=this.buffer[o-3],this.buffer[o+2]=this.buffer[o-2],this.buffer[o+3]=this.buffer[o-1],o-=4,n>4&&(n-=4);this.buffer[o]=t,this.buffer[o+1]=e,this.buffer[o+2]=i,this.buffer[o+3]=n}}shift(t,e,i,n){if(t&131072)this.pushState(t&65535,this.pos);else if((t&262144)==0){let r=t,{parser:o}=this.p;(n>this.pos||e<=o.maxNode)&&(this.pos=n,o.stateFlag(r,1)||(this.reducePos=n)),this.pushState(r,i),this.shiftContext(e,i),e<=o.maxNode&&this.buffer.push(e,i,n,4)}else this.pos=n,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,n,4)}apply(t,e,i,n){t&65536?this.reduce(t):this.shift(t,e,i,n)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let n=this.pos;this.reducePos=this.pos=n+t.length,this.pushState(e,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),n=t.bufferBase+e;for(;t&&n==t.bufferBase;)t=t.parent;return new s(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new lf(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(i==0)return!1;if((i&65536)==0)return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let n=[];for(let r=0,o;ra&1&&l==o)||n.push(e[r],o)}e=n}let i=[];for(let n=0;n>19,n=e&65535,r=this.stack.length-i*3;if(r<0||t.getGoto(this.stack[r],n,!1)<0){let o=this.findForcedReduction();if(o==null)return!1;e=o}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(n,r)=>{if(!e.includes(n))return e.push(n),t.allActions(n,o=>{if(!(o&393216))if(o&65536){let l=(o>>19)-r;if(l>1){let a=o&65535,h=this.stack.length-l*3;if(h>=0&&t.getGoto(this.stack[h],a,!1)>=0)return l<<19|65536|a}}else{let l=i(o,r+1);if(l!=null)return l}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:t}=this.p;return t.data[t.stateSlot(this.state,1)]==65535&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;ethis.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},Ko=class{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}},lf=class{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=t&65535,i=t>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=n}},af=class s{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,this.index==0&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new s(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;t!=null&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new s(this.stack,this.pos,this.index)}};function er(s,t=Uint16Array){if(typeof s!="string")return s;let e=null;for(let i=0,n=0;i=92&&o--,o>=34&&o--;let a=o-32;if(a>=46&&(a-=46,l=!0),r+=a,l)break;r*=46}e?e[n++]=r:e=new t(r)}return e}var Nn=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},tg=new Nn,hf=class{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=tg,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,n=this.rangeIndex,r=this.pos+t;for(;ri.to:r>=i.to;){if(n==this.ranges.length-1)return null;let o=this.ranges[++n];r+=o.from-i.to,i=o}return r}clipPos(t){if(t>=this.range.from&&tt)return Math.max(t,e.from);return this.end}peek(t){let e=this.chunkOff+t,i,n;if(e>=0&&e=this.chunk2Pos&&il.to&&(this.chunk2=this.chunk2.slice(0,l.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=tg,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let n of this.ranges){if(n.from>=e)break;n.to>t&&(i+=this.input.read(Math.max(n.from,t),Math.min(n.to,e)))}return i}},Oi=class{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;rg(this.data,t,e,this.id,i.data,i.tokenPrecTable)}};Oi.prototype.contextual=Oi.prototype.fallback=Oi.prototype.extend=!1;var oi=class{constructor(t,e,i){this.precTable=e,this.elseToken=i,this.data=typeof t=="string"?er(t):t}token(t,e){let i=t.pos,n=0;for(;;){let r=t.next<0,o=t.resolveOffset(1,1);if(rg(this.data,t,e,0,this.data,this.precTable),t.token.value>-1)break;if(this.elseToken==null)return;if(r||n++,o==null)break;t.reset(o,t.token)}n&&(t.reset(i,t.token),t.acceptToken(this.elseToken,n))}};oi.prototype.contextual=Oi.prototype.fallback=Oi.prototype.extend=!1;function rg(s,t,e,i,n,r){let o=0,l=1<0){let p=s[d];if(a.allows(p)&&(t.token.value==-1||t.token.value==p||Dw(p,t.token.value,n,r))){t.acceptToken(p);break}}let f=t.next,c=0,u=s[o+2];if(t.next<0&&u>c&&s[h+u*3-3]==65535){o=s[h+u*3-1];continue t}for(;c>1,p=h+d+(d<<1),g=s[p],m=s[p+1]||65536;if(f=m)c=d+1;else{o=s[p+2],t.advance();continue t}}break}}function eg(s,t,e){for(let i=t,n;(n=s[i])!=65535;i++)if(n==e)return i-t;return-1}function Dw(s,t,e,i){let n=eg(e,i,t);return n<0||eg(e,i,s)t)&&!i.type.isError)return e<0?Math.max(0,Math.min(i.to-1,t-25)):Math.min(s.length,Math.max(i.from+1,t+25));if(e<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return e<0?0:s.length}}var ff=class{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?ig(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?ig(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(tt)return this.nextStart=o,null;if(r instanceof dt){if(o==t){if(o=Math.max(this.safeFrom,t)&&(this.trees.push(r),this.start.push(o),this.index.push(0))}else this.index[e]++,this.nextStart=o+r.length}}},cf=class{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map(i=>new Nn)}getActions(t){let e=0,i=null,{parser:n}=t.p,{tokenizers:r}=n,o=n.stateSlot(t.state,3),l=t.curContext?t.curContext.hash:0,a=0;for(let h=0;hc.end+25&&(a=Math.max(c.lookAhead,a)),c.value!=0)){let u=e;if(c.extended>-1&&(e=this.addActions(t,c.extended,c.end,e)),e=this.addActions(t,c.value,c.end,e),!f.extend&&(i=c,e>u))break}}for(;this.actions.length>e;)this.actions.pop();return a&&t.setLookAhead(a),!i&&t.pos==this.stream.end&&(i=new Nn,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new Nn,{pos:i,p:n}=t;return e.start=i,e.end=Math.min(i+1,n.stream.end),e.value=i==n.stream.end?n.parser.eofTerm:0,e}updateCachedToken(t,e,i){let n=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(n,t),i),t.value>-1){let{parser:r}=i.p;for(let o=0;o=0&&i.p.parser.dialect.allows(l>>1)){(l&1)==0?t.value=l>>1:t.extended=l>>1;break}}}else t.value=0,t.end=this.stream.clipPos(n+1)}putAction(t,e,i,n){for(let r=0;rt.bufferLength*4?new ff(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t=this.stacks,e=this.minStackPos,i=this.stacks=[],n,r;if(this.bigReductionCount>300&&t.length==1){let[o]=t;for(;o.forceReduce()&&o.stack.length&&o.stack[o.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let o=0;oe)i.push(l);else{if(this.advanceStack(l,i,t))continue;{n||(n=[],r=[]),n.push(l);let a=this.tokens.getMainToken(l);r.push(a.value,a.end)}}break}}if(!i.length){let o=n&&Pw(n);if(o)return re&&console.log("Finish with "+this.stackID(o)),this.stackToTree(o);if(this.parser.strict)throw re&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+e);this.recovering||(this.recovering=5)}if(this.recovering&&n){let o=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,r,i);if(o)return re&&console.log("Force-finish "+this.stackID(o)),this.stackToTree(o.forceAll())}if(this.recovering){let o=this.recovering==1?1:this.recovering*3;if(i.length>o)for(i.sort((l,a)=>a.score-l.score);i.length>o;)i.pop();i.some(l=>l.reducePos>e)&&this.recovering--}else if(i.length>1){t:for(let o=0;o500&&h.buffer.length>500)if((l.score-h.score||l.buffer.length-h.buffer.length)>0)i.splice(a--,1);else{i.splice(o--,1);continue t}}}i.length>12&&i.splice(12,i.length-12)}this.minStackPos=i[0].pos;for(let o=1;o ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let h=t.curContext&&t.curContext.tracker.strict,f=h?t.curContext.hash:0;for(let c=this.fragments.nodeAt(n);c;){let u=this.parser.nodeSet.types[c.type.id]==c.type?r.getGoto(t.state,c.type.id):-1;if(u>-1&&c.length&&(!h||(c.prop(q.contextHash)||0)==f))return t.useNode(c,u),re&&console.log(o+this.stackID(t)+` (via reuse of ${r.getName(c.type.id)})`),!0;if(!(c instanceof dt)||c.children.length==0||c.positions[0]>0)break;let d=c.children[0];if(d instanceof dt&&c.positions[0]==0)c=d;else break}}let l=r.stateSlot(t.state,4);if(l>0)return t.reduce(l),re&&console.log(o+this.stackID(t)+` (via always-reduce ${r.getName(l&65535)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let a=this.tokens.getActions(t);for(let h=0;hn?e.push(p):i.push(p)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return ng(t,e),!0}}runRecovery(t,e,i){let n=null,r=!1;for(let o=0;o ":"";if(l.deadEnd&&(r||(r=!0,l.restart(),re&&console.log(f+this.stackID(l)+" (restarted)"),this.advanceFully(l,i))))continue;let c=l.split(),u=f;for(let d=0;c.forceReduce()&&d<10&&(re&&console.log(u+this.stackID(c)+" (via force-reduce)"),!this.advanceFully(c,i));d++)re&&(u=this.stackID(c)+" -> ");for(let d of l.recoverByInsert(a))re&&console.log(f+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>l.pos?(h==l.pos&&(h++,a=0),l.recoverByDelete(a,h),re&&console.log(f+this.stackID(l)+` (via recover-delete ${this.parser.getName(a)})`),ng(l,i)):(!n||n.scoret.topRules[l][1]),n=[];for(let l=0;l=0)r(f,a,l[h++]);else{let c=l[h+-f];for(let u=-f;u>0;u--)r(l[h++],a,c);h++}}}this.nodeSet=new As(e.map((l,a)=>It.define({name:a>=this.minRepeatTerm?void 0:l,id:a,props:n[a],top:i.indexOf(a)>-1,error:a==0,skipped:t.skippedNodes&&t.skippedNodes.indexOf(a)>-1}))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=1024;let o=er(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let l=0;ltypeof l=="number"?new Oi(o,l):l),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let n=new uf(this,t,e,i);for(let r of this.wrappers)n=r(n,t,e,i);return n}getGoto(t,e,i=!1){let n=this.goto;if(e>=n[0])return-1;for(let r=n[e+1];;){let o=n[r++],l=o&1,a=n[r++];if(l&&i)return a;for(let h=r+(o>>1);r0}validAction(t,e){return!!this.allActions(t,i=>i==e?!0:null)}allActions(t,e){let i=this.stateSlot(t,4),n=i?e(i):void 0;for(let r=this.stateSlot(t,1);n==null;r+=3){if(this.data[r]==65535)if(this.data[r+1]==1)r=ri(this.data,r+2);else break;n=e(ri(this.data,r+1))}return n}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=ri(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];e.some((r,o)=>o&1&&r==n)||e.push(this.data[i],n)}}return e}configure(t){let e=Object.assign(Object.create(s.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map(i=>{let n=t.tokenizers.find(r=>r.from==i);return n?n.to:i})),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map((i,n)=>{let r=t.specializers.find(l=>l.from==i.external);if(!r)return i;let o=Object.assign(Object.assign({},i),{external:r.to});return e.specializers[n]=sg(o),o})),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),t.strict!=null&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),t.bufferLength!=null&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return e==null?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map(()=>!1);if(t)for(let r of t.split(" ")){let o=e.indexOf(r);o>=0&&(i[o]=!0)}let n=null;for(let r=0;ri)&&e.p.parser.stateFlag(e.state,2)&&(!t||t.scores.external(e,i)<<1|t}return s.get}var Rw=Yo.deserialize({version:14,states:")`QQOPOOOfOQO\'#C^OqOSO\'#C`O|OWO\'#CbO!XO`O\'#CeO!dOpO\'#CgOOOO\'#Ck\'#CkOOOO\'#Ci\'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<{ir=s},contextmenu:(s,t)=>{ir=s}});var Ww=require("obsidian");var pf=require("obsidian");var xe=require("obsidian");function Qo(s,t){if(s.length!=t.length)return!1;for(let e=0;eK.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}};function gf(s,t,e){for(;s.value&&s.from<=e;)s.from<=e&&t.push(s.value),s.next()}function lg(s){return Array.isArray(s)?s:[s]}var Ln=class{constructor(t,e,i,n){I(this,"dom");I(this,"height",-1);I(this,"above",0);I(this,"markers",[]);this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(t,e,i,n)}update(t,e,i,n){this.height!=e&&(this.height=e,this.dom.style.height=e+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),Qo(this.markers,n)||this.setMarkers(t,n)}setMarkers(t,e){let i="cm-gutterElement",n=this.dom.firstChild;for(let r=0,o=0;;){let l=o,a=rthis.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}},_i=class{constructor(t,e){this.view=t;this.config=e;I(this,"dom");I(this,"elements",[]);I(this,"markers");I(this,"spacer",null);this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,n=>{let r=n.target,o;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let a=r.getBoundingClientRect();o=(a.top+a.bottom)/2}else o=n.clientY;let l=t.lineBlockAtHeight(o-t.documentTop);e.domEventHandlers[i](t,l,n)&&n.preventDefault()});this.markers=lg(e.markers(t)),e.initialSpacer&&(this.spacer=new Ln(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(t){let e=this.markers;if(this.markers=lg(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],t);n!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[n])}let i=t.view.viewport;return!K.eq(this.markers,e,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(t):!1)}destroy(){for(let t of this.elements)t.destroy()}},Hn=class{constructor(t,e,i){this.view=t;this.unfixGutters=e;this.activeGutters=i;I(this,"gutters");I(this,"dom");I(this,"fixed");I(this,"prevViewport");this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.style.minHeight=this.view.contentHeight+"px",this.gutters=this.createGutters(t);for(let n of this.gutters)this.dom.appendChild(n.dom);this.fixed=!t.state.facet(this.unfixGutters),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),this.insertGutters(t)}createGutters(t){return t.state.facet(this.activeGutters).map(e=>new _i(t,e))}insertGutters(t){t.contentDOM.parentNode.insertBefore(this.dom,t.contentDOM)}insertDetachedGutters(t){t.parentNode.insertBefore(this.dom,t)}getUpdateContexts(){return this.gutters.map(t=>new nr(t,this.view.viewport,-this.view.documentPadding.top))}update(t){if(this.updateGutters(t)){let e=this.prevViewport,i=t.view.viewport,n=Math.min(e.to,i.to)-Math.max(e.from,i.from);this.syncGutters(n<(i.to-i.from)*.8)}t.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(this.unfixGutters)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&this.dom.remove();let i=K.iter(this.view.state.facet($r),this.view.viewport.from),n=[],r=this.getUpdateContexts();for(let o of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(o.type)){let l=!0;for(let a of o.type)if(a.type==Jt.Text&&l){gf(i,n,a.from);for(let h of r)h.line(this.view,a,n);l=!1}else if(a.widget)for(let h of r)h.widget(this.view,a)}else if(o.type==Jt.Text){gf(i,n,o.from);for(let l of r)l.line(this.view,o,n)}for(let o of r)o.finish();t&&this.insertDetachedGutters(e)}updateGutters(t){let e=t.startState.facet(this.activeGutters),i=t.state.facet(this.activeGutters),n=t.docChanged||t.heightChanged||t.viewportChanged||!K.eq(t.startState.facet($r),t.state.facet($r),t.view.viewport.from,t.view.viewport.to);if(e==i)for(let r of this.gutters)r.update(t)&&(n=!0);else{n=!0;let r=[];for(let o of i){let l=e.indexOf(o);l<0?r.push(new _i(this.view,o)):(this.gutters[l].update(t),r.push(this.gutters[l]))}for(let o of this.gutters)o.dom.remove(),r.indexOf(o)<0&&o.destroy();for(let o of r)this.dom.appendChild(o.dom);this.gutters=r}return n}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove()}};function Zo(s){return me.fromClass(s,{provide:t=>W.scrollMargins.of(e=>{let i=e.plugin(t);return!i||i.gutters.length==0||!i.fixed?null:e.textDirection==mt.LTR?{left:i.dom.offsetWidth}:{right:i.dom.offsetWidth}})})}function $w(s,t,e){let i=[s];return t&&t.fixed===!1&&i.push(e.of(!0)),i}function mf(s,t,e,i){return[$w(s,{},i),e.of(ai(ai({},qw),t))]}var Et=require("obsidian");var ag=require("obsidian");function sr(s,t){let e=Object.keys(t).map(i=>Kw(s,i,t[i]));return e.length===1?e[0]:function(){e.forEach(i=>i())}}function Kw(s,t,e){let i=s[t],n=s.hasOwnProperty(t),r=n?i:function(){return Object.getPrototypeOf(s)[t].apply(this,arguments)},o=e(r);return i&&Object.setPrototypeOf(o,i),Object.setPrototypeOf(l,o),s[t]=l,a;function l(...h){return o===r&&s[t]===l&&a(),o.apply(this,h)}function a(){s[t]===l&&(n?s[t]=r:delete s[t]),o!==r&&(o=r,Object.setPrototypeOf(l,i||Function))}}function Yw(s){let t=s.embedRegistry.embedByExtension.md({app:s,containerEl:createDiv()},null,"");t.editable=!0,t.showEditor();let e=Object.getPrototypeOf(Object.getPrototypeOf(t.editMode));return t.unload(),e.constructor}var bf={cursorLocation:{anchor:0,head:0},value:"",cls:"",placeholder:"",focus:!0,filteredExtensions:[],onEnter:(s,t,e)=>(t&&s.options.onSubmit(s),t),onEscape:s=>{s.options.onBlur(s)},onSubmit:()=>{},onBlur:()=>{},onPaste:()=>{},onChange:()=>{}},Fn=class extends Yw(app){constructor(e,i,n){var r,o,l;super(e,i,{app:e,onMarkdownScroll:()=>{},getMode:()=>"source"});I(this,"options");I(this,"initial_value");I(this,"scope");this.options=ai(ai({},bf),n),this.initial_value=this.options.value,this.scope=new ag.Scope(this.app.scope),this.scope.register(["Mod"],"Enter",(a,h)=>!0),this.owner.editMode=this,this.owner.editor=this.editor,this.set(n.value||"",!0),this.register(sr(this.app.workspace,{setActiveLeaf:a=>(h,f)=>{this.activeCM.hasFocus||a.call(this.app.workspace,h,f)}})),this.options.onBlur!==bf.onBlur&&((r=this.editor)==null||r.cm.contentDOM.addEventListener("blur",()=>{this._loaded&&this.options.onBlur(this)})),(o=this.editor)==null||o.cm.contentDOM.addEventListener("focusin",()=>{this.app.keymap.pushScope(this.scope),this.app.workspace.activeEditor=this.owner}),this.editorEl.classList.remove("markdown-source-view"),n.cls&&this.editorEl.classList.add(...[].concat(n.cls)),n.cursorLocation&&((l=this.editor)==null||l.cm.dispatch({selection:N.range(n.cursorLocation.anchor,n.cursorLocation.head)}))}onUpdate(e,i){super.onUpdate(e,i),i&&this.options.onChange(e)}buildLocalExtensions(){let e=super.buildLocalExtensions();return this.options.placeholder&&e.push(Bu(this.options.placeholder)),e.push(W.domEventHandlers({paste:i=>{this.options.onPaste(i,this)}})),e.push(ci.highest(ba.of([{key:"Enter",run:i=>this.options.onEnter(this,!1,!1),shift:i=>this.options.onEnter(this,!1,!0)},{key:"Mod-Enter",run:i=>this.options.onEnter(this,!0,!1),shift:i=>this.options.onEnter(this,!0,!0)},{key:"Escape",run:i=>(this.options.onEscape(this),!0),preventDefault:!0}]))),e}getDynamicExtensions(){return super.getDynamicExtensions().filter(e=>!this.options.filteredExtensions.includes(e))}updateBottomPadding(e){return 0}destroy(){this._loaded&&this.unload(),this.app.keymap.popScope(this.scope),this.app.workspace.activeEditor===this.owner&&(this.app.workspace.activeEditor=null),this.containerEl.empty(),super.destroy()}onunload(){super.onunload(),this.destroy()}onload(){var e;super.onload(),this.options.focus&&((e=this.editor)==null||e.focus())}};var Jw="0.2.3";var _k={version:Jw,default_edit_mode:1,default_preview_mode:0,comment_style:"icon",editor_styling:!1,markup_focus:{0:{show_styling:!0,show_syntax:!0,show_metadata:!0,focus_annotation:!0,show_comment:!0},1:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1},2:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1}},diff_gutter:!0,diff_gutter_hide_empty:!0,annotation_gutter:!0,annotation_gutter_included_types:31,annotation_gutter_hide_empty:!0,annotation_gutter_default_fold_state:!1,annotation_gutter_fold_button:!0,annotation_gutter_resize_handle:!0,annotation_gutter_focus_on_click:!0,annotation_gutter_width:300,tag_completion:!0,tag_correcter:!0,clipboard_remove_syntax:!0,edit_info:!0,toolbar_preview_button:!0,toolbar_edit_button:!0,toolbar_show_buttons_labels:!0,status_bar_preview_button:!0,status_bar_edit_button:!0,status_bar_metadata_button:!0,database_workers:2,post_processor:!0,live_preview:!0,alternative_cursor_movement:!0,enable_metadata:!1,enable_author_metadata:!1,enable_timestamp_metadata:!1,enable_completed_metadata:!1,enable_style_metadata:!1,enable_color_metadata:!1,add_metadata:!1,add_author_metadata:!1,add_timestamp_metadata:!1,add_completed_metadata:!1,add_style_metadata:!1,add_color_metadata:!1,author:"",suggestion_mode_operations:{cursor_movement:{addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",highlight:"ignore_metadata",comment:"ignore_completely"},bracket_movement:{addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",highlight:"stay_inside",comment:"stay_inside"}}};var Vn=require("obsidian");var wf=(s=!1)=>{let t=sr(Vn.Menu.prototype,{onEnter:n=>function(r){let o=this.items[this.selected];return o&&o instanceof Vn.MenuItem&&o.handleEvent(r)||!0},onMenuClick:n=>function(r){if(!s||this.currentSubmenu&&this.currentSubmenu.dom.contains(r.target))r.stopImmediatePropagation();else return n&&n.apply(this,[r])},hide:n=>function(){return this.parentMenu||i(),n&&n.apply(this)}}),e=sr(Vn.MenuItem.prototype,{setChecked:n=>function(...r){return this.checkIconEl&&(this.checkIconEl.remove(),this.checkIconEl=void 0),n&&n.apply(this,r)}}),i=()=>{t(),e()};return i};var yf=require("obsidian");function Qw(s){if(s.children.length>0){let t=createSpan({cls:"cmtr-metadata-info-separator",text:" \\u2022 "});s.appendChild(t)}}function tl(s,t,e="icon"){let i=createDiv({cls:["cmtr-metadata-info"].concat(t!=null?t:[])});if(s.fields.author){let n=createSpan({cls:"cmtr-metadata-info-field"});if(e==="label"){let o=createSpan({cls:"cmtr-metadata-info-label",text:"Author: "});n.appendChild(o)}else if(e==="icon"){let o=createSpan({cls:"cmtr-metadata-info-icon"});(0,yf.setIcon)(o,"user"),n.appendChild(o)}let r=createSpan({cls:"cmtr-metadata-info-author-data",text:s.fields.author});n.appendChild(r),i.appendChild(n)}if(s.fields.time){e!=="icon"&&Qw(i);let n=createSpan({cls:"cmtr-metadata-info-field"});if(e==="label"){let o=createSpan({cls:"cmtr-metadata-info-label",text:"Updated at: "});n.appendChild(o)}else if(e==="icon"){let o=createSpan({cls:"cmtr-metadata-info-icon"});(0,yf.setIcon)(o,"clock"),n.appendChild(o)}let r=createSpan({cls:"cmtr-metadata-info-time-data",text:window.moment.unix(s.fields.time).format("MMM DD YYYY, HH:mm")});n.appendChild(r),i.appendChild(n)}return i}var vf=class extends Et.Component{constructor(e,i){super();this.range=e;this.marker=i;I(this,"text");I(this,"new_text",null);I(this,"annotation_container");I(this,"metadata_view",null);I(this,"annotation_view");I(this,"currentMode",null);I(this,"editMode",null);this.text=e.unwrap(),this.annotation_container=this.marker.annotation_thread.createDiv({cls:"cmtr-anno-gutter-annotation"}),this.annotation_container.addEventListener("blur",this.renderPreview.bind(this)),this.annotation_container.addEventListener("dblclick",this.renderSource.bind(this)),this.annotation_container.addEventListener("contextmenu",this.onCommentContextmenu.bind(this)),this.range.metadata&&(this.metadata_view=tl(this.range),this.annotation_container.appendChild(this.metadata_view)),this.annotation_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-view"}),this.renderPreview()}onload(){super.onload()}onunload(){super.onunload(),this.annotation_container.remove(),this.editMode=null}renderSource(e){if(this.range.type!=="comment")new Et.Notice("[Commentator] You can only edit comments.");else{if(e==null||e.stopPropagation(),this.currentMode==="source")return;let{app:i}=this.marker.view.state.field(Et.editorInfoField);if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!0),this.range.fields.author&&this.range.fields.author!==i.plugins.plugins.commentator.settings.author){new Et.Notice("[Commentator] You cannot edit comments from other authors.");return}this.annotation_view.empty(),this.editMode=this.addChild(new Fn(i,this.annotation_view,{value:this.text,cls:"cmtr-anno-gutter-annotation-editor",onSubmit:n=>{this.new_text=n.get(),this.renderPreview()},filteredExtensions:[i.plugins.plugins.commentator.editorExtensions],onBlur:this.renderPreview.bind(this)})),this.currentMode="source"}}renderPreview(){if(this.currentMode!=="preview")if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!1),this.text===this.new_text||this.new_text===null){let{app:e}=this.marker.view.state.field(Et.editorInfoField);if(this.new_text=null,this.editMode&&(this.removeChild(this.editMode),this.editMode=null),this.annotation_view.empty(),this.range.type!=="substitution"){let i="";switch(this.range.type){case"addition":i="Added: ";break;case"deletion":i="Deleted: ";break;case"highlight":break;case"comment":break}let n=createDiv({cls:"cmtr-anno-gutter-annotation-content"});Et.MarkdownRenderer.render(e,this.text||" ",n,"",this).then(()=>{var r;((r=n.children[0])!=null?r:n).prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:i})),this.annotation_view.append(...n.childNodes),n.remove()})}else{let i=this.range.unwrap_parts(),n=createDiv(),r=createDiv();Et.MarkdownRenderer.render(e,i[0]||" ",n,"",this).then(()=>{var o;((o=n.children[0])!=null?o:n).prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Changed: "})),this.annotation_view.append(...n.childNodes),Et.MarkdownRenderer.render(e,i[1]||" ",r,"",this).then(()=>{var l;((l=r.children[0])!=null?l:r).prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"To: "})),this.annotation_view.append(...r.childNodes),n.remove(),r.remove()})})}this.annotation_view.addClass("cmtr-anno-gutter-annotation-"+this.range.type),this.currentMode="preview"}else{let e=this.marker.view.state.field(li);this.text=this.new_text,window.setTimeout(()=>{this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:rr(e,"comment",this.new_text)}})})}}onCommentContextmenu(e){e.preventDefault(),e.stopPropagation(),wf(!0);let i=new Et.Menu;this.range.type!=="comment"&&this.range.type!=="highlight"&&(i.addItem(n=>{n.setTitle("Accept changes").setIcon("check").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:Wn(this.marker.view.state,this.range.from,this.range.to)})})}),i.addItem(n=>{n.setTitle("Reject changes").setIcon("cross").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:Gn(this.marker.view.state,this.range.from,this.range.to)})})})),this.range.type==="comment"?(this.range.replies.length>0&&i.addItem(n=>{n.setTitle("Close comment thread").setIcon("message-square-off").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.full_range_front,to:this.range.full_range_back,insert:""}})})}),i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Zi(this.marker.view,this.range)})}),i.addItem(n=>{n.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(()=>{this.renderSource()})}),i.addItem(n=>{n.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:""}})})})):this.range.type!=="highlight"?(i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Zi(this.marker.view,this.range)})}),this.range.replies.length>0&&i.addItem(n=>{n.setTitle("Remove all comments").setIcon("message-square-x").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.replies[0].from,to:this.range.replies[this.range.replies.length-1].to,insert:""}})})})):i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Zi(this.marker.view,this.range)})}),i.addItem(n=>{n.setTitle("Fold gutter").setSection("gutter-controls").setIcon("arrow-right-from-line").onClick(()=>{this.marker.view.dispatch({annotations:[zn.of(null)]})})}),i.addItem(n=>{let r=n.setTitle("Included annotations").setIcon("eye").setSection("gutter-controls").setSubmenu(),o=this.marker.view.state.facet(Wi);for(let{title:l,icon:a,value:h}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])r.addItem(f=>{f.setTitle(l).setIcon(a).setChecked((o&h)!==0).onClick(()=>{o^=h,f.setChecked((o&h)!==0),this.marker.view.dispatch(this.marker.view.state.update({effects:[Ra.reconfigure(Wi.of(o))]}))})})}),i.showAtPosition(e)}},el=class extends Zt{constructor(e,i,n,r=0){super();this.annotation=e;this.annotations=i;this.view=n;this.itr=r;I(this,"annotation_thread");I(this,"component",new Et.Component);I(this,"preventUnload",!1)}eq(e){return this.itr===e.itr&&this.annotations===e.annotations&&this.annotations[0].equals(e.annotations[0])}onCommentThreadClick(){this.view.dispatch({annotations:[il.of({marker:this,index:-1,scroll:!0,focus_markup:!0})]}),this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0)}toDOM(){this.annotation_thread=createDiv({cls:"cmtr-anno-gutter-thread"}),this.annotation_thread.addEventListener("click",this.onCommentThreadClick.bind(this));for(let e of this.annotations)this.component.addChild(new vf(e,this));return this.component.load(),this.annotation_thread}focus(){this.annotation_thread.focus()}focus_annotation(e=-1,i=!1){e===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0):e>=0&&e{let n=this.view.lineBlockAt(this.annotations[0].from).top-100;this.view.scrollDOM.scrollTo({top:n,behavior:"smooth"})},200)}unfocus_annotation(e=-1){e===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!1):this.annotation_thread.children.item(e).classList.toggle("cmtr-anno-gutter-thread-highlight",!1)}destroy(e){this.component.unload(),this.annotation_thread.remove(),super.destroy(e)}};function hg(s,t,e){let i=s.field(Et.editorEditorField),n=(e&1)!==0,r=(e&2)!==0,o=(e&4)!==0,l=(e&8)!==0,a=(e&16)!==0,h=[];for(let f of t){let c=f.full_thread;switch(a||(c=c.slice(0,1)),f.type){case"addition":n||c.shift();break;case"deletion":r||c.shift();break;case"substitution":o||c.shift();break;case"highlight":l||c.shift();break;case"comment":a||c.shift();break}if(c.length){let u=new el(f,c,i,fg);u.preventUnload=!0,h.push(u.range(f.from,f.to))}}return h}var fg=0,tn=Tt.define({create(s){let t=s.field(ft).ranges.ranges.reduce((e,i)=>{let n=i.base_range;return e.includes(n)||e.push(n),e},[]);return K.of(hg(s,t,s.facet(Wi)))},update(s,t){let e=t.state.facet(Wi);if(t.startState.facet(Wi)!==e)return this.create(t.state);if(!t.docChanged)return s;fg+=1;let i=[];for(let r of t.state.field(ft).inserted_ranges)i.includes(r.base_range)||i.push(r.base_range);let n=t.state.field(ft).deleted_ranges.map(r=>r.base_range);return s.map(t.changes).update({filter:(r,o,l)=>{let a=!n.includes(l.annotation);return l.preventUnload=a,a},add:hg(t.state,i.map(r=>r.full_thread[0]),e)})}});var Un=require("obsidian");var cg=require("obsidian");var or=ot.define(),kf=Tt.define({create(s){return{from:s.selection.main.from,to:s.selection.main.to}},update(s,t){for(let e of t.effects)if(e.is(or))return e.value;return s}}),ty=Tt.define({create(s){return J.none},update(s,t){var n;let e=t.startState.field(kf,!1),i=t.state.field(kf);if(e!==i){let r=t.state.field(ft).ranges.ranges_in_interval(i.from,i.to);return r.length&&r[0].base_range===((n=r.at(-1))==null?void 0:n.base_range)&&i.from>=r[0].from&&i.to<=r.at(-1).to?K.of([J.mark({attributes:{class:"cmtr-focused"}}).range(r[0].full_range_front,r[0].full_range_back)]):J.none}else return s},provide(s){return W.decorations.from(s)}});var ug=require("obsidian");var Ox=J.replace({});var lr=24,iy=L.define({combine:s=>s.some(t=>t)}),dg=L.define(),jn=xt.define(),zn=xt.define(),il=xt.define(),pg=xt.define(),gg=xt.define(),mg=xt.define(),bg=xt.define(),nl=class extends Hn{constructor(e){super(e,iy,dg);I(this,"previously_focused");I(this,"debouncedMoveGutter",(0,xe.debounce)(this.moveGutter.bind(this),200));e.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{e.dispatch(e.state.update({effects:[wg.reconfigure([])]}))}))}createGutters(e){return e.state.facet(dg).map(i=>new Sf(e,i,this.dom))}insertGutters(e){e.contentDOM.parentNode.insertBefore(this.dom,e.contentDOM.nextSibling)}insertDetachedGutters(e){this.view.contentDOM.parentNode.insertBefore(this.dom,this.view.contentDOM.nextSibling)}getUpdateContexts(){return this.gutters.map(e=>new xf(e,this.view.viewport,-this.view.documentPadding.top))}update(e){for(let i of e.transactions){let n=i.annotation(il);if(n){let{marker:r,index:o,scroll:l=!1,focus_markup:a=!1}=n;this.unfocusAnnotation(),this.focusAnnotation(r,o,l,a)}}super.update(e)}unfocusAnnotation(){var e;(e=this.previously_focused)==null||e.unfocus_annotation(),this.previously_focused=void 0}focusAnnotation(e,i,n=!1,r=!1){this.previously_focused=e,this.debouncedMoveGutter(e),e.focus_annotation(i,n),r&&window.setTimeout(()=>{this.view.dispatch(this.view.state.update({effects:[or.of({from:e.annotation.from,to:e.annotation.full_range_back})]}))})}updateGutters(e){let i=e.transactions.flatMap(n=>n.annotation(jn)).find(n=>n);if((i||e.startState.selection!==e.state.selection)&&this.unfocusAnnotation(),i){let{from:n,to:r,index:o=-1,scroll:l=!1}=i;t:for(let a of this.gutters[0].elements)if(n>=a.block.from){for(let h of a.markers)if(n>=h.annotation.from&&r<=h.annotation.full_range_back){this.focusAnnotation(h,o,l);break t}}else if(nh.markers.includes(e));if(!n)return;let r=n.markers.indexOf(e),o=n.block.top,l=n.dom.children[r].offsetTop,a=o-l;if(Math.abs(a)>=10&&a){let h=i.elements[0];h.dom.style.marginTop=parseInt(h.dom.style.marginTop||"0")+a+"px"}}foldGutter(){this.gutters[0].foldGutter()}},ny=Zo(nl);var xf=class extends nr{constructor(e,i,n){super(e,i,n);this.gutter=e;this.height=n;I(this,"previous_element_end",0);I(this,"new_gutter_elements",[]);I(this,"added_elements",[]);this.previous_element_end=n}async addElement(e,i,n){var f;let r=Math.max(i.top-this.previous_element_end,0),o=r<=0?this.previous_element_end:i.top;n.sort((c,u)=>c.annotation.from-u.annotation.from);let a=((f=this.gutter.elements[this.i])==null?void 0:f.dom.clientHeight)||36,h=this.gutter.elements.findIndex(c=>Qo(c.markers,n));if(h!==-1){let c=this.gutter.elements[h];for(let u=this.i;u{this.folded=!this.folded,this.view.state.field(xe.editorInfoField).app.workspace.requestSaveLayout(),this.foldGutter()},this.setFoldButtonState(),this.fold_button_el=createDiv({cls:["cmtr-anno-gutter-button"]}),this.fold_button_el.appendChild(e),this.gutterDom.appendChild(this.fold_button_el)}createResizeHandle(){this.resize_handle_el=createEl("hr",{cls:["cmtr-anno-gutter-resize-handle"]}),this.resize_handle_el.style.display=this.view.state.field(tn).size&&!this.folded?"":"none",this.resize_handle_el.addEventListener("mousedown",e=>{let i=e.clientX,n=this.view.state.field(xe.editorInfoField).app.vault.getConfig("readableLineLength"),r=document.styleSheets[0],o=(0,xe.debounce)(f=>{this.width=Math.round(Math.max(0,f)),this.view.state.field(xe.editorInfoField).app.workspace.requestSaveLayout(),this.dom.style.width=this.width+"px",this.view.dom.style.setProperty("--cmtr-anno-gutter-width",this.width+"px"),n&&(r.deleteRule(r.cssRules.length-1),r.insertRule(`.cmtr-anno-gutter-resizing .cm-line { width: ${this.view.contentDOM.clientWidth}px !important; }`,r.cssRules.length),this.gutter_position=this.view.scrollDOM.getBoundingClientRect().right-this.view.contentDOM.getBoundingClientRect().right+lr)},25);this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!0),this.view.scrollDOM.classList.toggle("cmtr-anno-gutter-resizing",!0);let l=parseInt(this.dom.style.width.slice(0,-2)),a=f=>{let c=f.clientX-i;return i=f.clientX,l-=c,o(l),!0},h=()=>{document.removeEventListener("mousemove",a),document.removeEventListener("mouseup",h),this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!1),this.view.scrollDOM.classList.toggle("cmtr-anno-gutter-resizing",!1),n&&r.deleteRule(r.cssRules.length-1)};return document.addEventListener("mousemove",a),document.addEventListener("mouseup",h),!0}),this.gutterDom.appendChild(this.resize_handle_el)}setFoldButtonState(){this.fold_button_el&&(this.folded?(this.fold_button_el.children[0].setAttribute("style","rotate: -180deg;"),this.fold_button_el.children[0].ariaLabel="Unfold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="none")):(this.fold_button_el.children[0].setAttribute("style","rotate: 0deg;"),this.fold_button_el.children[0].ariaLabel="Fold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="")))}foldGutter(){if(this.setFoldButtonState(),this.folded?this.elements.forEach(e=>{Array.from(e.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(i=>{i.setAttribute("style",`max-height: ${i.clientHeight}px; overflow: hidden;`)})}):this.dom.addEventListener("transitionend",()=>{this.elements.forEach(e=>{Array.from(e.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(i=>{i.removeAttribute("style")})})},{once:!0}),this.dom.style.width=this.folded?"0":this.width+"px",this.gutterDom.style.marginInlineStart=this.folded?"0":lr+"px",this.view.state.field(xe.editorInfoField).app.vault.getConfig("readableLineLength")){let e=parseInt(getComputedStyle(this.view.scrollDOM).getPropertyValue("--file-line-width").trim()),i=Math.max(0,this.view.scrollDOM.innerWidth-e),n=Math.max(0,i-this.width),r=(this.folded?i:n)/2,o=(this.folded?n:i)/2;this.view.contentDOM.style.width=this.view.contentDOM.clientWidth+(this.folded?lr:0)+"px !important",this.view.scrollDOM.children[0].setAttribute("style",`margin: 0 ${o}px; transition: margin 0.4s ease-in-out, max-width 0.4s ease-in-out;`),this.folded||this.view.dom.style.setProperty("--cmtr-anno-gutter-width",this.width+"px"),setTimeout(()=>{this.view.scrollDOM.children[0].setAttribute("style",`margin: 0 ${r}px; transition: margin 0.4s ease-in-out, max-width 0.4s ease-in-out;`),this.dom.addEventListener("transitionend",()=>{this.view.contentDOM.removeAttribute("style"),this.view.scrollDOM.children[0].removeAttribute("style"),this.folded&&this.view.dom.style.setProperty("--cmtr-anno-gutter-width","0px")},{once:!0})})}}update(e){let i=super.update(e),n=e.state.field(tn);for(let r of e.transactions){let o=r.annotation(zn),l=r.annotation(pg),a=r.annotation(gg),h=r.annotation(mg),f=r.annotation(bg);l!==void 0&&(this.width=l,!this.hide_on_empty&&!this.folded&&(this.dom.style.width=l+"px",this.setFoldButtonState()),this.view.dom.style.setProperty("--cmtr-anno-gutter-width",this.width+"px")),o!==void 0&&(o===null?(this.folded=!this.folded,this.view.state.field(xe.editorInfoField).app.workspace.requestSaveLayout()):this.folded=o,this.foldGutter()),a!==void 0&&(this.hide_on_empty=a,this.hide_on_empty&&n.size===0?this.dom.style.width="0":this.dom.style.width=this.width+"px",this.view.dom.style.setProperty("--cmtr-anno-gutter-width",this.width+"px")),h!==void 0&&(this.add_fold_button=h,this.add_fold_button&&!this.fold_button_el?this.createFoldButton():!this.add_fold_button&&this.fold_button_el&&(this.fold_button_el.remove(),this.fold_button_el=void 0),this.setFoldButtonState()),f!==void 0&&(this.add_resize_handle=f,this.add_resize_handle&&!this.resize_handle_el?this.createResizeHandle():!this.add_resize_handle&&this.resize_handle_el&&(this.resize_handle_el.remove(),this.resize_handle_el=void 0))}return n.size!==e.startState.field(tn).size&&(n.size===0?(this.fold_button_el&&(this.fold_button_el.style.display="none"),this.resize_handle_el&&(this.resize_handle_el.style.display="none"),this.hide_on_empty&&(this.dom.style.width="0")):(this.fold_button_el&&(this.fold_button_el.style.display=""),this.resize_handle_el&&(this.resize_handle_el.style.display=""),this.folded||(this.dom.style.width=this.width+"px"))),i}destroy(){var e,i;(e=this.fold_button_el)==null||e.remove(),(i=this.resize_handle_el)==null||i.remove(),super.destroy()}},Cf=class extends Ln{constructor(e,i,n,r,o=null){super(e,i,n,r);this.block=o}update(e,i,n,r,o=null){this.block=o,this.above!=n&&(this.dom.style.marginTop=(this.above=n)?n+"px":""),Qo(this.markers,r)||this.setMarkers(e,r)}};var wg=new Xt;var Sg=require("obsidian");var yg=L.define({combine:s=>s.some(t=>t)}),Mf=L.define(),vg=xt.define(),Tf=class extends Hn{constructor(t){super(t,yg,Mf),t.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{t.dispatch(t.state.update({effects:[xg.reconfigure([])]}))}))}createGutters(t){return t.state.facet(Mf).map(e=>new Af(t,e))}},Af=class extends _i{constructor(e,i){super(e,i);this.view=e;this.config=i;I(this,"hide_on_empty",!1);I(this,"showing",!0);this.hide_on_empty=i.hideOnEmpty}update(e){let i=super.update(e);for(let n of e.transactions){let r=n.annotation(vg);r!==void 0&&(this.hide_on_empty=r)}return this.showing&&this.hide_on_empty&&e.state.field(ft).ranges.empty()?(this.dom.parentElement.classList.add("gutter-hidden"),this.showing=!1):!this.showing&&(!this.hide_on_empty||!e.state.field(ft).ranges.empty())&&(this.dom.parentElement.classList.remove("gutter-hidden"),this.showing=!0),i}},sy=Zo(Tf);function kg(s){return mf(sy,s,Mf,yg)}var Of=class extends Zt{constructor(e,i,n){super();this.type=e;this.top=i;this.bottom=n}toDOM(){let e="";return this.type.has("addition")&&(e+="cmtr-diff-gutter-addition "),this.type.has("deletion")&&(e+="cmtr-diff-gutter-deletion "),this.type.has("substitution")&&(e+="cmtr-diff-gutter-substitution "),this.top&&(e+="cmtr-diff-gutter-top "),this.bottom&&(e+="cmtr-diff-gutter-bottom "),createDiv({cls:e})}},_f=me.fromClass(class{constructor(t){I(this,"markers",K.empty);this.constructMarkers(t)}constructMarkers(t){let e=t.state.field(ft).ranges,i=new fi,n={};for(let r of e.ranges_in_interval(t.viewport.from,t.viewport.to)){let o=t.state.doc.lineAt(r.from).number,l=t.state.doc.lineAt(r.to).number,a=Array.from({length:l-o+1},(h,f)=>o+f);n[o]?n[o].isStart=!0:n[o]={isStart:!0,isEnd:!1,types:new Set};for(let h of a)n[h]?(n[h].isEnd=!1,n[h].types.add(r.type)):n[h]={isStart:!1,isEnd:!1,types:new Set([r.type])};n[l]&&(n[l].isEnd=!0)}for(let[r,o]of Object.entries(n)){let l=t.state.doc.line(Number(r));i.add(l.from,l.to,new Of(o.types,o.isStart,o.isEnd))}this.markers=i.finish()}update(t){(t.docChanged||t.viewportChanged||t.heightChanged)&&this.constructMarkers(t.view)}});var dS=[_f,kg({class:"cmtr-diff-gutter",markers:s=>s.plugin(_f).markers,domEventHandlers:{click:(s,t,e)=>{let i=new Sg.Menu;return i.addItem(n=>{n.setTitle("Accept changes").setIcon("check").onClick(()=>{s.dispatch({changes:Wn(s.state,t.from,t.to)})})}),i.addItem(n=>{n.setTitle("Reject changes").setIcon("cross").onClick(()=>{s.dispatch({changes:Gn(s.state,t.from,t.to)})})}),i.showAtMouseEvent(e),!1}}})],xg=new Xt;var hy=ci.high(W.inputHandler.of((s,t,e,i)=>{let n=s.state.doc.sliceString(t-2,t)+i,r;if((r=Rf[n])!==void 0){let o=[{from:t,to:e+1,insert:i+r.join("")}];return s.dispatch({changes:o,selection:N.cursor(e+1)}),!0}return!1}));var fy=ct.transactionFilter.of(s=>{if(s.isUserEvent("select")){let t=s.startState.selection.main,e=s.selection.main;if(e.anchor===e.head){let i=s.startState.field(ft).ranges,n=i.at_cursor(t.head),r=i.at_cursor(e.head);if(n&&n!==r&&(n.type==="substitution"||n.type==="highlight")){let o=n.unwrap(),l=!1,a=0,h=o.search(/\\S/);h>=1&&(l=!0,o=o.slice(h),a+=h);let f=o.match(/\\n\\s*\\n/g);if(f&&(l=!0,o=o.replace(/\\n\\s*\\n/g,`\n`),a+=f.reduce((c,u)=>c+u.length,0)),l)return{changes:[{from:n.from+3,to:n.to-3,insert:o}],selection:N.cursor(e.head-a)}}}}return s});var li;var Cg=require("obsidian");var ft=Tt.define({create(s){let t=s.doc.toString(),e=Xo.parser.parse(t),i=s.field(li),n=new vr(Ef(e,t,i));return{tree:e,fragments:we.addTree(e),ranges:n,inserted_ranges:n.ranges,deleted_ranges:[]}},update(s,t){let e=t.state.field(li);if(t.effects.some(g=>g.is(Ia)))return this.create(t.state);if(!t.docChanged)return s.inserted_ranges=[],s.deleted_ranges=[],s;let i=[];t.changes.iterChangedRanges((g,m,b,w)=>i.push({fromA:g,toA:m,fromB:b,toB:w}));let n=we.applyChanges(s.fragments,i),r=t.state.doc.toString(),o=Xo.parser.parse(new Cs(t.state.doc),n);n=we.addTree(o,n);let l=new Map,a=[],h=new Map,f=new Set;for(let g of i){s.ranges.tree.search([g.fromA,g.toA],(m,b)=>{s.ranges.tree.remove(b,m),f.add(m);for(let w of m.base_range.thread)h.set(w.from,w);return!0});for(let m of Ef(o,r,e,g.fromB,g.toB))l.set(m.from,m);a.push([g.toA,g.toB-g.fromB-(g.toA-g.fromA)])}for(let g of f)g.type==="comment"&&h.delete(g.from);let c=0,u=s.ranges.tree.nil_node;function d(g){if(g!=null&&g!=u){for(d(g.left);a.length&&g.item.key.low>=a[0][0];)c+=a.shift()[1];g.item.value.apply_offset(c),g.item.key.low=g.item.value.from,g.item.key.high=g.item.value.to,d(g.right),g.left!=u&&(g.max.low=g.left.max.low),g.right!=u&&(g.max.high=g.right.max.high)}}d(s.ranges.tree.root);let p=Array.from(l.values());for(let g of p)s.ranges.tree.insert([g.from,g.to],g);for(let g of p)g.type==="comment"&&h.set(g.from,g);if(h.size){let g=[],m,b=[];for(let w of Array.from(h.values()).sort((y,v)=>y.from-v.from))w.clear_references(),w.replies.length=0,!m||m!=null&&m.right_adjacent(w)?b.push(w):(g.push(b),b=[w]),m=w;g.push(b);for(let w of g){let y=w[0],v=s.ranges.tree.search([y.from,y.from])[0];v.replies.length=0;for(let x of w.slice(v===y?1:0))x.add_reply(v)}}return s.ranges.ranges=s.ranges.tree.values,{tree:o,ranges:s.ranges,fragments:n,inserted_ranges:p,deleted_ranges:[...f]}}});function cy(s,t,e){var r,o;let i=s.enable_metadata&&((r=t.firstChild)!=null&&r.type.name.startsWith("MDSep"))?t.firstChild.from:void 0,n;if(t.type.name==="Substitution"){let l=i?(o=t.firstChild)==null?void 0:o.nextSibling:t.firstChild;if(!l||l.type.name!=="MSub")return;n=l.from}return uy(t.from,t.to,t.type.name,e.slice(t.from,t.to),n,i)}function Ef(s,t,e,i=0,n=t.length){let r=[],o,l=s.cursor();if(l.childAfter(i-1),l.node.type.name==="CriticMarkup"||l.node.from>n)return r;if(l)do{let a=l.node;if(a.type.name==="\\u26A0")continue;let h=cy(e,a,t);h&&(h.type==="comment"&&o&&o.right_adjacent(h)&&h.add_reply(o),r.push(h),o=h)}while(l.nextSibling()&&l.node.from<=n);return r}function Mg(s,t){let e=Xo.parser.parse(s);return Ef(e,s,t)}function uy(s,t,e,i,n,r){switch(e){case"Addition":return new Ei(s,t,i,r);case"Deletion":return new nn(s,t,i,r);case"Substitution":return new rn(s,n,t,i,r);case"Highlight":return new sn(s,t,i,r);case"Comment":return new en(s,t,i,r);default:return new Ei(s,t,i,r)}}var PC={addition:Ei,deletion:nn,highlight:sn,substitution:rn,comment:en};function Jo(s){let t;return s.add_metadata&&(t={},s.add_author_metadata&&(t.author=s.author||void 0),s.add_timestamp_metadata&&(t.time=Math.floor(Date.now()/1e3)),Object.keys(t).length===0&&(t=void 0)),t}function Tg(s,t,e,i,n=0,r=0){if(!e)return{insert:t+s,start_offset:n,end_offset:r};let o=zt[e],l=i&&Object.keys(i).length?JSON.stringify(i)+"@@":"",a=o[0]+l+(e==="substitution"?t+o[1]+s+o[2]:t+s+o[1]),h=o[0].length+l.length;return n+=h,r+=e==="substitution"?o[1].length:0,{insert:a,start_offset:n,end_offset:r}}function rr(s,t,e,i=""){return Tg(e,i,t,Jo(s)).insert}var aM={addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",comment:"ignore_metadata",highlight:"ignore_metadata"},hM={addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",comment:"stay_inside",highlight:"stay_inside"};function Zi(s,t,e=!1){let i=s.state.field(li),n=t?t.full_range_back:s.state.selection.main.head,r=t?t.full_thread.length:-1;s.dispatch(s.state.update({changes:{from:n,to:n,insert:rr(i,"comment","")},selection:N.cursor(n),scrollIntoView:e})),window.setTimeout(()=>{s.dispatch(s.state.update({annotations:[jn.of({from:n,to:n,index:r})]}))})}function Wn(s,t,e,i=!0){let n=s.field(ft).ranges;return(t||e?n.ranges_in_interval(t!=null?t:0,e!=null?e:1/0):n.ranges).filter(r=>r.type==="addition"||r.type==="deletion"||r.type==="substitution").map(r=>({from:r.from,to:i?r.full_range_back:r.to,insert:r.accept()}))}function Gn(s,t,e,i=!0){let n=s.field(ft).ranges;return(t||e?n.ranges_in_interval(t!=null?t:0,e!=null?e:1/0):n.ranges).filter(r=>r.type==="addition"||r.type==="deletion"||r.type==="substitution").map(r=>({from:r.from,to:i?r.full_range_back:r.to,insert:r.reject()}))}var sl=Ng(Ag(),1);sl.default.DIFF_DELETE=-1;sl.default.DIFF_INSERT=1;sl.default.DIFF_EQUAL=0;async function Og(s,t){return await Promise.all(s.map(async e=>Mg(e,t)))}self.onmessage=async s=>{self.postMessage(await Og(s.data.files,s.data.settings))};\n')}(0,Nd.extendPrototype)(wr.default);(0,Ld.extendPrototype)(wr.default);var Uh=class extends An.Events{_events=[];onunload(){}unload(){for(;this._events.length>0;)this._events.pop()()}register(t){this._events.push(t)}registerEvent(t){this.register(()=>t.e.offref(t))}},zo=class extends Uh{constructor(e,n,r,s,o,a,l,u=2,f=p=>p,h=()=>this.plugin.settings,c=!0){super();this.plugin=e;this.name=n;this.title=r;this.version=s;this.description=o;this.defaultValue=a;this.extractValue=l;this.workers=u;this.loadValue=f;this.getSettings=h;this.old_version=parseInt(this.plugin.app.loadLocalStorage(n+"-version"))||null,this.persist=wr.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:wr.default.INDEXEDDB,description:o,version:s}),c&&this.startDatabase()}memory=new Map;persist;old_version=null;deleted_keys=new Set;databaseUpdate=(0,An.debounce)(()=>{this.trigger("database-update",this.allEntries()),this.flushChanges()},100,!0);flushChanges=(0,An.debounce)(async()=>{await this.persistMemory(),this.trigger("database-update",this.allEntries())},1e3,!0);on(e,n,r){return super.on(e,n,r)}async startDatabase(){this.plugin.app.workspace.onLayoutReady(async()=>{await this.persist.ready(async()=>{this.old_version===null?(await this.rebuildDatabase(),this.trigger("database-create")):this.old_version{if(e instanceof An.TFile&&e.extension==="md"){let n=this.plugin.app.workspace.activeEditor,r=n&&n.file?.path===e.path&&n.editor?n.editor.cm.state:void 0;this.storeKey(e.path,await this.extractValue(e,r),e.stat.mtime)}})),this.registerEvent(this.plugin.app.vault.on("delete",async e=>{e instanceof An.TFile&&e.extension==="md"&&this.deleteKey(e.path)})),this.registerEvent(this.plugin.app.vault.on("rename",async(e,n)=>{e instanceof An.TFile&&e.extension==="md"&&this.renameKey(n,e.path,e.stat.mtime)})),this.registerEvent(this.plugin.app.vault.on("create",async e=>{e instanceof An.TFile&&e.extension==="md"&&this.storeKey(e.path,this.defaultValue(),e.stat.mtime)}))})})}async loadDatabase(){this.memory=new Map(Object.entries(await this.persist.getItems()).map(([e,n])=>(n.data=this.loadValue(n.data),[e,n])))}async regularParseFiles(e){for(let n=0;nawait this.plugin.app.vault.cachedRead(s))),r=Math.ceil(e.length/this.workers);for(let s=0;s{for(let f=0;f{e.some(s=>s.path===r)||this.deleteKey(r)});let n=e.filter(r=>!this.memory.has(r.path)||this.memory.get(r.path).mtimeawait this.persist.removeItem(n))),this.deleted_keys.clear()}storeKey(e,n,r,s=!0){this.memory.set(e,{data:n,mtime:r??Date.now(),dirty:s}),this.databaseUpdate()}deleteKey(e){if(this.getItem(e)==null)throw new Error("Key does not exist");this.memory.delete(e),this.deleted_keys.add(e),this.databaseUpdate()}renameKey(e,n,r){let s=this.getItem(e);if(s==null)throw new Error("Key does not exist");this.storeKey(n,s.data,r),this.deleteKey(e),this.databaseUpdate()}allKeys(){return Array.from(this.memory.keys())}getValue(e){return this.memory.get(e)?.data??null}allValues(){return Array.from(this.memory.values()).map(e=>e.data)}getItem(e){return this.memory.get(e)??null}allItems(){return Array.from(this.memory.values())}allEntries(){return Array.from(this.memory.entries())}async dropDatabase(){this.memory.clear(),await wr.default.dropInstance({name:this.name+`/${this.plugin.app.appId}`}),localStorage.removeItem(this.plugin.app.appId+"-"+this.name+"-version")}async reinitializeDatabase(){await this.dropDatabase(),this.persist=wr.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:wr.default.INDEXEDDB,version:this.version,description:this.description}),await this.rebuildDatabase(),this.trigger("database-update",this.allEntries())}async clearDatabase(){this.memory.clear(),await this.persist.clear()}isEmpty(){return this.memory.size===0}};var jh=new Uint16Array('\u1D41<\xD5\u0131\u028A\u049D\u057B\u05D0\u0675\u06DE\u07A2\u07D6\u080F\u0A4A\u0A91\u0DA1\u0E6D\u0F09\u0F26\u10CA\u1228\u12E1\u1415\u149D\u14C3\u14DF\u1525\0\0\0\0\0\0\u156B\u16CD\u198D\u1C12\u1DDD\u1F7E\u2060\u21B0\u228D\u23C0\u23FB\u2442\u2824\u2912\u2D08\u2E48\u2FCE\u3016\u32BA\u3639\u37AC\u38FE\u3A28\u3A71\u3AE0\u3B2E\u0800EMabcfglmnoprstu\\bfms\x7F\x84\x8B\x90\x95\x98\xA6\xB3\xB9\xC8\xCFlig\u803B\xC6\u40C6P\u803B&\u4026cute\u803B\xC1\u40C1reve;\u4102\u0100iyx}rc\u803B\xC2\u40C2;\u4410r;\uC000\u{1D504}rave\u803B\xC0\u40C0pha;\u4391acr;\u4100d;\u6A53\u0100gp\x9D\xA1on;\u4104f;\uC000\u{1D538}plyFunction;\u6061ing\u803B\xC5\u40C5\u0100cs\xBE\xC3r;\uC000\u{1D49C}ign;\u6254ilde\u803B\xC3\u40C3ml\u803B\xC4\u40C4\u0400aceforsu\xE5\xFB\xFE\u0117\u011C\u0122\u0127\u012A\u0100cr\xEA\xF2kslash;\u6216\u0176\xF6\xF8;\u6AE7ed;\u6306y;\u4411\u0180crt\u0105\u010B\u0114ause;\u6235noullis;\u612Ca;\u4392r;\uC000\u{1D505}pf;\uC000\u{1D539}eve;\u42D8c\xF2\u0113mpeq;\u624E\u0700HOacdefhilorsu\u014D\u0151\u0156\u0180\u019E\u01A2\u01B5\u01B7\u01BA\u01DC\u0215\u0273\u0278\u027Ecy;\u4427PY\u803B\xA9\u40A9\u0180cpy\u015D\u0162\u017Aute;\u4106\u0100;i\u0167\u0168\u62D2talDifferentialD;\u6145leys;\u612D\u0200aeio\u0189\u018E\u0194\u0198ron;\u410Cdil\u803B\xC7\u40C7rc;\u4108nint;\u6230ot;\u410A\u0100dn\u01A7\u01ADilla;\u40B8terDot;\u40B7\xF2\u017Fi;\u43A7rcle\u0200DMPT\u01C7\u01CB\u01D1\u01D6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01E2\u01F8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020FoubleQuote;\u601Duote;\u6019\u0200lnpu\u021E\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6A74\u0180git\u022F\u0236\u023Aruent;\u6261nt;\u622FourIntegral;\u622E\u0100fr\u024C\u024E;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6A2Fcr;\uC000\u{1D49E}p\u0100;C\u0284\u0285\u62D3ap;\u624D\u0580DJSZacefios\u02A0\u02AC\u02B0\u02B4\u02B8\u02CB\u02D7\u02E1\u02E6\u0333\u048D\u0100;o\u0179\u02A5trahd;\u6911cy;\u4402cy;\u4405cy;\u440F\u0180grs\u02BF\u02C4\u02C7ger;\u6021r;\u61A1hv;\u6AE4\u0100ay\u02D0\u02D5ron;\u410E;\u4414l\u0100;t\u02DD\u02DE\u6207a;\u4394r;\uC000\u{1D507}\u0100af\u02EB\u0327\u0100cm\u02F0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031Ccute;\u40B4o\u0174\u030B\u030D;\u42D9bleAcute;\u42DDrave;\u4060ilde;\u42DCond;\u62C4ferentialD;\u6146\u0470\u033D\0\0\0\u0342\u0354\0\u0405f;\uC000\u{1D53B}\u0180;DE\u0348\u0349\u034D\u40A8ot;\u60DCqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03CF\u03E2\u03F8ontourIntegra\xEC\u0239o\u0274\u0379\0\0\u037B\xBB\u0349nArrow;\u61D3\u0100eo\u0387\u03A4ft\u0180ART\u0390\u0396\u03A1rrow;\u61D0ightArrow;\u61D4e\xE5\u02CAng\u0100LR\u03AB\u03C4eft\u0100AR\u03B3\u03B9rrow;\u67F8ightArrow;\u67FAightArrow;\u67F9ight\u0100AT\u03D8\u03DErrow;\u61D2ee;\u62A8p\u0241\u03E9\0\0\u03EFrrow;\u61D1ownArrow;\u61D5erticalBar;\u6225n\u0300ABLRTa\u0412\u042A\u0430\u045E\u047F\u037Crrow\u0180;BU\u041D\u041E\u0422\u6193ar;\u6913pArrow;\u61F5reve;\u4311eft\u02D2\u043A\0\u0446\0\u0450ightVector;\u6950eeVector;\u695Eector\u0100;B\u0459\u045A\u61BDar;\u6956ight\u01D4\u0467\0\u0471eeVector;\u695Fector\u0100;B\u047A\u047B\u61C1ar;\u6957ee\u0100;A\u0486\u0487\u62A4rrow;\u61A7\u0100ct\u0492\u0497r;\uC000\u{1D49F}rok;\u4110\u0800NTacdfglmopqstux\u04BD\u04C0\u04C4\u04CB\u04DE\u04E2\u04E7\u04EE\u04F5\u0521\u052F\u0536\u0552\u055D\u0560\u0565G;\u414AH\u803B\xD0\u40D0cute\u803B\xC9\u40C9\u0180aiy\u04D2\u04D7\u04DCron;\u411Arc\u803B\xCA\u40CA;\u442Dot;\u4116r;\uC000\u{1D508}rave\u803B\xC8\u40C8ement;\u6208\u0100ap\u04FA\u04FEcr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65FBerySmallSquare;\u65AB\u0100gp\u0526\u052Aon;\u4118f;\uC000\u{1D53C}silon;\u4395u\u0100ai\u053C\u0549l\u0100;T\u0542\u0543\u6A75ilde;\u6242librium;\u61CC\u0100ci\u0557\u055Ar;\u6130m;\u6A73a;\u4397ml\u803B\xCB\u40CB\u0100ip\u056A\u056Fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058D\u05B2\u05CCy;\u4424r;\uC000\u{1D509}lled\u0253\u0597\0\0\u05A3mallSquare;\u65FCerySmallSquare;\u65AA\u0370\u05BA\0\u05BF\0\0\u05C4f;\uC000\u{1D53D}All;\u6200riertrf;\u6131c\xF2\u05CB\u0600JTabcdfgorst\u05E8\u05EC\u05EF\u05FA\u0600\u0612\u0616\u061B\u061D\u0623\u066C\u0672cy;\u4403\u803B>\u403Emma\u0100;d\u05F7\u05F8\u4393;\u43DCreve;\u411E\u0180eiy\u0607\u060C\u0610dil;\u4122rc;\u411C;\u4413ot;\u4120r;\uC000\u{1D50A};\u62D9pf;\uC000\u{1D53E}eater\u0300EFGLST\u0635\u0644\u064E\u0656\u065B\u0666qual\u0100;L\u063E\u063F\u6265ess;\u62DBullEqual;\u6267reater;\u6AA2ess;\u6277lantEqual;\u6A7Eilde;\u6273cr;\uC000\u{1D4A2};\u626B\u0400Aacfiosu\u0685\u068B\u0696\u069B\u069E\u06AA\u06BE\u06CARDcy;\u442A\u0100ct\u0690\u0694ek;\u42C7;\u405Eirc;\u4124r;\u610ClbertSpace;\u610B\u01F0\u06AF\0\u06B2f;\u610DizontalLine;\u6500\u0100ct\u06C3\u06C5\xF2\u06A9rok;\u4126mp\u0144\u06D0\u06D8ownHum\xF0\u012Fqual;\u624F\u0700EJOacdfgmnostu\u06FA\u06FE\u0703\u0707\u070E\u071A\u071E\u0721\u0728\u0744\u0778\u078B\u078F\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803B\xCD\u40CD\u0100iy\u0713\u0718rc\u803B\xCE\u40CE;\u4418ot;\u4130r;\u6111rave\u803B\xCC\u40CC\u0180;ap\u0720\u072F\u073F\u0100cg\u0734\u0737r;\u412AinaryI;\u6148lie\xF3\u03DD\u01F4\u0749\0\u0762\u0100;e\u074D\u074E\u622C\u0100gr\u0753\u0758ral;\u622Bsection;\u62C2isible\u0100CT\u076C\u0772omma;\u6063imes;\u6062\u0180gpt\u077F\u0783\u0788on;\u412Ef;\uC000\u{1D540}a;\u4399cr;\u6110ilde;\u4128\u01EB\u079A\0\u079Ecy;\u4406l\u803B\xCF\u40CF\u0280cfosu\u07AC\u07B7\u07BC\u07C2\u07D0\u0100iy\u07B1\u07B5rc;\u4134;\u4419r;\uC000\u{1D50D}pf;\uC000\u{1D541}\u01E3\u07C7\0\u07CCr;\uC000\u{1D4A5}rcy;\u4408kcy;\u4404\u0380HJacfos\u07E4\u07E8\u07EC\u07F1\u07FD\u0802\u0808cy;\u4425cy;\u440Cppa;\u439A\u0100ey\u07F6\u07FBdil;\u4136;\u441Ar;\uC000\u{1D50E}pf;\uC000\u{1D542}cr;\uC000\u{1D4A6}\u0580JTaceflmost\u0825\u0829\u082C\u0850\u0863\u09B3\u09B8\u09C7\u09CD\u0A37\u0A47cy;\u4409\u803B<\u403C\u0280cmnpr\u0837\u083C\u0841\u0844\u084Dute;\u4139bda;\u439Bg;\u67EAlacetrf;\u6112r;\u619E\u0180aey\u0857\u085C\u0861ron;\u413Ddil;\u413B;\u441B\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087E\u08A9\u08B1\u08E0\u08E6\u08FC\u092F\u095B\u0390\u096A\u0100nr\u0883\u088FgleBracket;\u67E8row\u0180;BR\u0899\u089A\u089E\u6190ar;\u61E4ightArrow;\u61C6eiling;\u6308o\u01F5\u08B7\0\u08C3bleBracket;\u67E6n\u01D4\u08C8\0\u08D2eeVector;\u6961ector\u0100;B\u08DB\u08DC\u61C3ar;\u6959loor;\u630Aight\u0100AV\u08EF\u08F5rrow;\u6194ector;\u694E\u0100er\u0901\u0917e\u0180;AV\u0909\u090A\u0910\u62A3rrow;\u61A4ector;\u695Aiangle\u0180;BE\u0924\u0925\u0929\u62B2ar;\u69CFqual;\u62B4p\u0180DTV\u0937\u0942\u094CownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61BFar;\u6958ector\u0100;B\u0965\u0966\u61BCar;\u6952ight\xE1\u039Cs\u0300EFGLST\u097E\u098B\u0995\u099D\u09A2\u09ADqualGreater;\u62DAullEqual;\u6266reater;\u6276ess;\u6AA1lantEqual;\u6A7Dilde;\u6272r;\uC000\u{1D50F}\u0100;e\u09BD\u09BE\u62D8ftarrow;\u61DAidot;\u413F\u0180npw\u09D4\u0A16\u0A1Bg\u0200LRlr\u09DE\u09F7\u0A02\u0A10eft\u0100AR\u09E6\u09ECrrow;\u67F5ightArrow;\u67F7ightArrow;\u67F6eft\u0100ar\u03B3\u0A0Aight\xE1\u03BFight\xE1\u03CAf;\uC000\u{1D543}er\u0100LR\u0A22\u0A2CeftArrow;\u6199ightArrow;\u6198\u0180cht\u0A3E\u0A40\u0A42\xF2\u084C;\u61B0rok;\u4141;\u626A\u0400acefiosu\u0A5A\u0A5D\u0A60\u0A77\u0A7C\u0A85\u0A8B\u0A8Ep;\u6905y;\u441C\u0100dl\u0A65\u0A6FiumSpace;\u605Flintrf;\u6133r;\uC000\u{1D510}nusPlus;\u6213pf;\uC000\u{1D544}c\xF2\u0A76;\u439C\u0480Jacefostu\u0AA3\u0AA7\u0AAD\u0AC0\u0B14\u0B19\u0D91\u0D97\u0D9Ecy;\u440Acute;\u4143\u0180aey\u0AB4\u0AB9\u0ABEron;\u4147dil;\u4145;\u441D\u0180gsw\u0AC7\u0AF0\u0B0Eative\u0180MTV\u0AD3\u0ADF\u0AE8ediumSpace;\u600Bhi\u0100cn\u0AE6\u0AD8\xEB\u0AD9eryThi\xEE\u0AD9ted\u0100GL\u0AF8\u0B06reaterGreate\xF2\u0673essLes\xF3\u0A48Line;\u400Ar;\uC000\u{1D511}\u0200Bnpt\u0B22\u0B28\u0B37\u0B3Areak;\u6060BreakingSpace;\u40A0f;\u6115\u0680;CDEGHLNPRSTV\u0B55\u0B56\u0B6A\u0B7C\u0BA1\u0BEB\u0C04\u0C5E\u0C84\u0CA6\u0CD8\u0D61\u0D85\u6AEC\u0100ou\u0B5B\u0B64ngruent;\u6262pCap;\u626DoubleVerticalBar;\u6226\u0180lqx\u0B83\u0B8A\u0B9Bement;\u6209ual\u0100;T\u0B92\u0B93\u6260ilde;\uC000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0BB6\u0BB7\u0BBD\u0BC9\u0BD3\u0BD8\u0BE5\u626Fqual;\u6271ullEqual;\uC000\u2267\u0338reater;\uC000\u226B\u0338ess;\u6279lantEqual;\uC000\u2A7E\u0338ilde;\u6275ump\u0144\u0BF2\u0BFDownHump;\uC000\u224E\u0338qual;\uC000\u224F\u0338e\u0100fs\u0C0A\u0C27tTriangle\u0180;BE\u0C1A\u0C1B\u0C21\u62EAar;\uC000\u29CF\u0338qual;\u62ECs\u0300;EGLST\u0C35\u0C36\u0C3C\u0C44\u0C4B\u0C58\u626Equal;\u6270reater;\u6278ess;\uC000\u226A\u0338lantEqual;\uC000\u2A7D\u0338ilde;\u6274ested\u0100GL\u0C68\u0C79reaterGreater;\uC000\u2AA2\u0338essLess;\uC000\u2AA1\u0338recedes\u0180;ES\u0C92\u0C93\u0C9B\u6280qual;\uC000\u2AAF\u0338lantEqual;\u62E0\u0100ei\u0CAB\u0CB9verseElement;\u620CghtTriangle\u0180;BE\u0CCB\u0CCC\u0CD2\u62EBar;\uC000\u29D0\u0338qual;\u62ED\u0100qu\u0CDD\u0D0CuareSu\u0100bp\u0CE8\u0CF9set\u0100;E\u0CF0\u0CF3\uC000\u228F\u0338qual;\u62E2erset\u0100;E\u0D03\u0D06\uC000\u2290\u0338qual;\u62E3\u0180bcp\u0D13\u0D24\u0D4Eset\u0100;E\u0D1B\u0D1E\uC000\u2282\u20D2qual;\u6288ceeds\u0200;EST\u0D32\u0D33\u0D3B\u0D46\u6281qual;\uC000\u2AB0\u0338lantEqual;\u62E1ilde;\uC000\u227F\u0338erset\u0100;E\u0D58\u0D5B\uC000\u2283\u20D2qual;\u6289ilde\u0200;EFT\u0D6E\u0D6F\u0D75\u0D7F\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uC000\u{1D4A9}ilde\u803B\xD1\u40D1;\u439D\u0700Eacdfgmoprstuv\u0DBD\u0DC2\u0DC9\u0DD5\u0DDB\u0DE0\u0DE7\u0DFC\u0E02\u0E20\u0E22\u0E32\u0E3F\u0E44lig;\u4152cute\u803B\xD3\u40D3\u0100iy\u0DCE\u0DD3rc\u803B\xD4\u40D4;\u441Eblac;\u4150r;\uC000\u{1D512}rave\u803B\xD2\u40D2\u0180aei\u0DEE\u0DF2\u0DF6cr;\u414Cga;\u43A9cron;\u439Fpf;\uC000\u{1D546}enCurly\u0100DQ\u0E0E\u0E1AoubleQuote;\u601Cuote;\u6018;\u6A54\u0100cl\u0E27\u0E2Cr;\uC000\u{1D4AA}ash\u803B\xD8\u40D8i\u016C\u0E37\u0E3Cde\u803B\xD5\u40D5es;\u6A37ml\u803B\xD6\u40D6er\u0100BP\u0E4B\u0E60\u0100ar\u0E50\u0E53r;\u603Eac\u0100ek\u0E5A\u0E5C;\u63DEet;\u63B4arenthesis;\u63DC\u0480acfhilors\u0E7F\u0E87\u0E8A\u0E8F\u0E92\u0E94\u0E9D\u0EB0\u0EFCrtialD;\u6202y;\u441Fr;\uC000\u{1D513}i;\u43A6;\u43A0usMinus;\u40B1\u0100ip\u0EA2\u0EADncareplan\xE5\u069Df;\u6119\u0200;eio\u0EB9\u0EBA\u0EE0\u0EE4\u6ABBcedes\u0200;EST\u0EC8\u0EC9\u0ECF\u0EDA\u627Aqual;\u6AAFlantEqual;\u627Cilde;\u627Eme;\u6033\u0100dp\u0EE9\u0EEEuct;\u620Fortion\u0100;a\u0225\u0EF9l;\u621D\u0100ci\u0F01\u0F06r;\uC000\u{1D4AB};\u43A8\u0200Ufos\u0F11\u0F16\u0F1B\u0F1FOT\u803B"\u4022r;\uC000\u{1D514}pf;\u611Acr;\uC000\u{1D4AC}\u0600BEacefhiorsu\u0F3E\u0F43\u0F47\u0F60\u0F73\u0FA7\u0FAA\u0FAD\u1096\u10A9\u10B4\u10BEarr;\u6910G\u803B\xAE\u40AE\u0180cnr\u0F4E\u0F53\u0F56ute;\u4154g;\u67EBr\u0100;t\u0F5C\u0F5D\u61A0l;\u6916\u0180aey\u0F67\u0F6C\u0F71ron;\u4158dil;\u4156;\u4420\u0100;v\u0F78\u0F79\u611Cerse\u0100EU\u0F82\u0F99\u0100lq\u0F87\u0F8Eement;\u620Builibrium;\u61CBpEquilibrium;\u696Fr\xBB\u0F79o;\u43A1ght\u0400ACDFTUVa\u0FC1\u0FEB\u0FF3\u1022\u1028\u105B\u1087\u03D8\u0100nr\u0FC6\u0FD2gleBracket;\u67E9row\u0180;BL\u0FDC\u0FDD\u0FE1\u6192ar;\u61E5eftArrow;\u61C4eiling;\u6309o\u01F5\u0FF9\0\u1005bleBracket;\u67E7n\u01D4\u100A\0\u1014eeVector;\u695Dector\u0100;B\u101D\u101E\u61C2ar;\u6955loor;\u630B\u0100er\u102D\u1043e\u0180;AV\u1035\u1036\u103C\u62A2rrow;\u61A6ector;\u695Biangle\u0180;BE\u1050\u1051\u1055\u62B3ar;\u69D0qual;\u62B5p\u0180DTV\u1063\u106E\u1078ownVector;\u694FeeVector;\u695Cector\u0100;B\u1082\u1083\u61BEar;\u6954ector\u0100;B\u1091\u1092\u61C0ar;\u6953\u0100pu\u109B\u109Ef;\u611DndImplies;\u6970ightarrow;\u61DB\u0100ch\u10B9\u10BCr;\u611B;\u61B1leDelayed;\u69F4\u0680HOacfhimoqstu\u10E4\u10F1\u10F7\u10FD\u1119\u111E\u1151\u1156\u1161\u1167\u11B5\u11BB\u11BF\u0100Cc\u10E9\u10EEHcy;\u4429y;\u4428FTcy;\u442Ccute;\u415A\u0280;aeiy\u1108\u1109\u110E\u1113\u1117\u6ABCron;\u4160dil;\u415Erc;\u415C;\u4421r;\uC000\u{1D516}ort\u0200DLRU\u112A\u1134\u113E\u1149ownArrow\xBB\u041EeftArrow\xBB\u089AightArrow\xBB\u0FDDpArrow;\u6191gma;\u43A3allCircle;\u6218pf;\uC000\u{1D54A}\u0272\u116D\0\0\u1170t;\u621Aare\u0200;ISU\u117B\u117C\u1189\u11AF\u65A1ntersection;\u6293u\u0100bp\u118F\u119Eset\u0100;E\u1197\u1198\u628Fqual;\u6291erset\u0100;E\u11A8\u11A9\u6290qual;\u6292nion;\u6294cr;\uC000\u{1D4AE}ar;\u62C6\u0200bcmp\u11C8\u11DB\u1209\u120B\u0100;s\u11CD\u11CE\u62D0et\u0100;E\u11CD\u11D5qual;\u6286\u0100ch\u11E0\u1205eeds\u0200;EST\u11ED\u11EE\u11F4\u11FF\u627Bqual;\u6AB0lantEqual;\u627Dilde;\u627FTh\xE1\u0F8C;\u6211\u0180;es\u1212\u1213\u1223\u62D1rset\u0100;E\u121C\u121D\u6283qual;\u6287et\xBB\u1213\u0580HRSacfhiors\u123E\u1244\u1249\u1255\u125E\u1271\u1276\u129F\u12C2\u12C8\u12D1ORN\u803B\xDE\u40DEADE;\u6122\u0100Hc\u124E\u1252cy;\u440By;\u4426\u0100bu\u125A\u125C;\u4009;\u43A4\u0180aey\u1265\u126A\u126Fron;\u4164dil;\u4162;\u4422r;\uC000\u{1D517}\u0100ei\u127B\u1289\u01F2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128E\u1298kSpace;\uC000\u205F\u200ASpace;\u6009lde\u0200;EFT\u12AB\u12AC\u12B2\u12BC\u623Cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uC000\u{1D54B}ipleDot;\u60DB\u0100ct\u12D6\u12DBr;\uC000\u{1D4AF}rok;\u4166\u0AE1\u12F7\u130E\u131A\u1326\0\u132C\u1331\0\0\0\0\0\u1338\u133D\u1377\u1385\0\u13FF\u1404\u140A\u1410\u0100cr\u12FB\u1301ute\u803B\xDA\u40DAr\u0100;o\u1307\u1308\u619Fcir;\u6949r\u01E3\u1313\0\u1316y;\u440Eve;\u416C\u0100iy\u131E\u1323rc\u803B\xDB\u40DB;\u4423blac;\u4170r;\uC000\u{1D518}rave\u803B\xD9\u40D9acr;\u416A\u0100di\u1341\u1369er\u0100BP\u1348\u135D\u0100ar\u134D\u1350r;\u405Fac\u0100ek\u1357\u1359;\u63DFet;\u63B5arenthesis;\u63DDon\u0100;P\u1370\u1371\u62C3lus;\u628E\u0100gp\u137B\u137Fon;\u4172f;\uC000\u{1D54C}\u0400ADETadps\u1395\u13AE\u13B8\u13C4\u03E8\u13D2\u13D7\u13F3rrow\u0180;BD\u1150\u13A0\u13A4ar;\u6912ownArrow;\u61C5ownArrow;\u6195quilibrium;\u696Eee\u0100;A\u13CB\u13CC\u62A5rrow;\u61A5own\xE1\u03F3er\u0100LR\u13DE\u13E8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13F9\u13FA\u43D2on;\u43A5ing;\u416Ecr;\uC000\u{1D4B0}ilde;\u4168ml\u803B\xDC\u40DC\u0480Dbcdefosv\u1427\u142C\u1430\u1433\u143E\u1485\u148A\u1490\u1496ash;\u62ABar;\u6AEBy;\u4412ash\u0100;l\u143B\u143C\u62A9;\u6AE6\u0100er\u1443\u1445;\u62C1\u0180bty\u144C\u1450\u147Aar;\u6016\u0100;i\u144F\u1455cal\u0200BLST\u1461\u1465\u146A\u1474ar;\u6223ine;\u407Ceparator;\u6758ilde;\u6240ThinSpace;\u600Ar;\uC000\u{1D519}pf;\uC000\u{1D54D}cr;\uC000\u{1D4B1}dash;\u62AA\u0280cefos\u14A7\u14AC\u14B1\u14B6\u14BCirc;\u4174dge;\u62C0r;\uC000\u{1D51A}pf;\uC000\u{1D54E}cr;\uC000\u{1D4B2}\u0200fios\u14CB\u14D0\u14D2\u14D8r;\uC000\u{1D51B};\u439Epf;\uC000\u{1D54F}cr;\uC000\u{1D4B3}\u0480AIUacfosu\u14F1\u14F5\u14F9\u14FD\u1504\u150F\u1514\u151A\u1520cy;\u442Fcy;\u4407cy;\u442Ecute\u803B\xDD\u40DD\u0100iy\u1509\u150Drc;\u4176;\u442Br;\uC000\u{1D51C}pf;\uC000\u{1D550}cr;\uC000\u{1D4B4}ml;\u4178\u0400Hacdefos\u1535\u1539\u153F\u154B\u154F\u155D\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417D;\u4417ot;\u417B\u01F2\u1554\0\u155BoWidt\xE8\u0AD9a;\u4396r;\u6128pf;\u6124cr;\uC000\u{1D4B5}\u0BE1\u1583\u158A\u1590\0\u15B0\u15B6\u15BF\0\0\0\0\u15C6\u15DB\u15EB\u165F\u166D\0\u1695\u169B\u16B2\u16B9\0\u16BEcute\u803B\xE1\u40E1reve;\u4103\u0300;Ediuy\u159C\u159D\u15A1\u15A3\u15A8\u15AD\u623E;\uC000\u223E\u0333;\u623Frc\u803B\xE2\u40E2te\u80BB\xB4\u0306;\u4430lig\u803B\xE6\u40E6\u0100;r\xB2\u15BA;\uC000\u{1D51E}rave\u803B\xE0\u40E0\u0100ep\u15CA\u15D6\u0100fp\u15CF\u15D4sym;\u6135\xE8\u15D3ha;\u43B1\u0100ap\u15DFc\u0100cl\u15E4\u15E7r;\u4101g;\u6A3F\u0264\u15F0\0\0\u160A\u0280;adsv\u15FA\u15FB\u15FF\u1601\u1607\u6227nd;\u6A55;\u6A5Clope;\u6A58;\u6A5A\u0380;elmrsz\u1618\u1619\u161B\u161E\u163F\u164F\u1659\u6220;\u69A4e\xBB\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163A\u163C\u163E;\u69A8;\u69A9;\u69AA;\u69AB;\u69AC;\u69AD;\u69AE;\u69AFt\u0100;v\u1645\u1646\u621Fb\u0100;d\u164C\u164D\u62BE;\u699D\u0100pt\u1654\u1657h;\u6222\xBB\xB9arr;\u637C\u0100gp\u1663\u1667on;\u4105f;\uC000\u{1D552}\u0380;Eaeiop\u12C1\u167B\u167D\u1682\u1684\u1687\u168A;\u6A70cir;\u6A6F;\u624Ad;\u624Bs;\u4027rox\u0100;e\u12C1\u1692\xF1\u1683ing\u803B\xE5\u40E5\u0180cty\u16A1\u16A6\u16A8r;\uC000\u{1D4B6};\u402Amp\u0100;e\u12C1\u16AF\xF1\u0288ilde\u803B\xE3\u40E3ml\u803B\xE4\u40E4\u0100ci\u16C2\u16C8onin\xF4\u0272nt;\u6A11\u0800Nabcdefiklnoprsu\u16ED\u16F1\u1730\u173C\u1743\u1748\u1778\u177D\u17E0\u17E6\u1839\u1850\u170D\u193D\u1948\u1970ot;\u6AED\u0100cr\u16F6\u171Ek\u0200ceps\u1700\u1705\u170D\u1713ong;\u624Cpsilon;\u43F6rime;\u6035im\u0100;e\u171A\u171B\u623Dq;\u62CD\u0176\u1722\u1726ee;\u62BDed\u0100;g\u172C\u172D\u6305e\xBB\u172Drk\u0100;t\u135C\u1737brk;\u63B6\u0100oy\u1701\u1741;\u4431quo;\u601E\u0280cmprt\u1753\u175B\u1761\u1764\u1768aus\u0100;e\u010A\u0109ptyv;\u69B0s\xE9\u170Cno\xF5\u0113\u0180ahw\u176F\u1771\u1773;\u43B2;\u6136een;\u626Cr;\uC000\u{1D51F}g\u0380costuvw\u178D\u179D\u17B3\u17C1\u17D5\u17DB\u17DE\u0180aiu\u1794\u1796\u179A\xF0\u0760rc;\u65EFp\xBB\u1371\u0180dpt\u17A4\u17A8\u17ADot;\u6A00lus;\u6A01imes;\u6A02\u0271\u17B9\0\0\u17BEcup;\u6A06ar;\u6605riangle\u0100du\u17CD\u17D2own;\u65BDp;\u65B3plus;\u6A04e\xE5\u1444\xE5\u14ADarow;\u690D\u0180ako\u17ED\u1826\u1835\u0100cn\u17F2\u1823k\u0180lst\u17FA\u05AB\u1802ozenge;\u69EBriangle\u0200;dlr\u1812\u1813\u1818\u181D\u65B4own;\u65BEeft;\u65C2ight;\u65B8k;\u6423\u01B1\u182B\0\u1833\u01B2\u182F\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183E\u184D\u0100;q\u1843\u1846\uC000=\u20E5uiv;\uC000\u2261\u20E5t;\u6310\u0200ptwx\u1859\u185E\u1867\u186Cf;\uC000\u{1D553}\u0100;t\u13CB\u1863om\xBB\u13CCtie;\u62C8\u0600DHUVbdhmptuv\u1885\u1896\u18AA\u18BB\u18D7\u18DB\u18EC\u18FF\u1905\u190A\u1910\u1921\u0200LRlr\u188E\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18A1\u18A2\u18A4\u18A6\u18A8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18B3\u18B5\u18B7\u18B9;\u655D;\u655A;\u655C;\u6559\u0380;HLRhlr\u18CA\u18CB\u18CD\u18CF\u18D1\u18D3\u18D5\u6551;\u656C;\u6563;\u6560;\u656B;\u6562;\u655Fox;\u69C9\u0200LRlr\u18E4\u18E6\u18E8\u18EA;\u6555;\u6552;\u6510;\u650C\u0280;DUdu\u06BD\u18F7\u18F9\u18FB\u18FD;\u6565;\u6568;\u652C;\u6534inus;\u629Flus;\u629Eimes;\u62A0\u0200LRlr\u1919\u191B\u191D\u191F;\u655B;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193B\u6502;\u656A;\u6561;\u655E;\u653C;\u6524;\u651C\u0100ev\u0123\u1942bar\u803B\xA6\u40A6\u0200ceio\u1951\u1956\u195A\u1960r;\uC000\u{1D4B7}mi;\u604Fm\u0100;e\u171A\u171Cl\u0180;bh\u1968\u1969\u196B\u405C;\u69C5sub;\u67C8\u016C\u1974\u197El\u0100;e\u1979\u197A\u6022t\xBB\u197Ap\u0180;Ee\u012F\u1985\u1987;\u6AAE\u0100;q\u06DC\u06DB\u0CE1\u19A7\0\u19E8\u1A11\u1A15\u1A32\0\u1A37\u1A50\0\0\u1AB4\0\0\u1AC1\0\0\u1B21\u1B2E\u1B4D\u1B52\0\u1BFD\0\u1C0C\u0180cpr\u19AD\u19B2\u19DDute;\u4107\u0300;abcds\u19BF\u19C0\u19C4\u19CA\u19D5\u19D9\u6229nd;\u6A44rcup;\u6A49\u0100au\u19CF\u19D2p;\u6A4Bp;\u6A47ot;\u6A40;\uC000\u2229\uFE00\u0100eo\u19E2\u19E5t;\u6041\xEE\u0693\u0200aeiu\u19F0\u19FB\u1A01\u1A05\u01F0\u19F5\0\u19F8s;\u6A4Don;\u410Ddil\u803B\xE7\u40E7rc;\u4109ps\u0100;s\u1A0C\u1A0D\u6A4Cm;\u6A50ot;\u410B\u0180dmn\u1A1B\u1A20\u1A26il\u80BB\xB8\u01ADptyv;\u69B2t\u8100\xA2;e\u1A2D\u1A2E\u40A2r\xE4\u01B2r;\uC000\u{1D520}\u0180cei\u1A3D\u1A40\u1A4Dy;\u4447ck\u0100;m\u1A47\u1A48\u6713ark\xBB\u1A48;\u43C7r\u0380;Ecefms\u1A5F\u1A60\u1A62\u1A6B\u1AA4\u1AAA\u1AAE\u65CB;\u69C3\u0180;el\u1A69\u1A6A\u1A6D\u42C6q;\u6257e\u0261\u1A74\0\0\u1A88rrow\u0100lr\u1A7C\u1A81eft;\u61BAight;\u61BB\u0280RSacd\u1A92\u1A94\u1A96\u1A9A\u1A9F\xBB\u0F47;\u64C8st;\u629Birc;\u629Aash;\u629Dnint;\u6A10id;\u6AEFcir;\u69C2ubs\u0100;u\u1ABB\u1ABC\u6663it\xBB\u1ABC\u02EC\u1AC7\u1AD4\u1AFA\0\u1B0Aon\u0100;e\u1ACD\u1ACE\u403A\u0100;q\xC7\xC6\u026D\u1AD9\0\0\u1AE2a\u0100;t\u1ADE\u1ADF\u402C;\u4040\u0180;fl\u1AE8\u1AE9\u1AEB\u6201\xEE\u1160e\u0100mx\u1AF1\u1AF6ent\xBB\u1AE9e\xF3\u024D\u01E7\u1AFE\0\u1B07\u0100;d\u12BB\u1B02ot;\u6A6Dn\xF4\u0246\u0180fry\u1B10\u1B14\u1B17;\uC000\u{1D554}o\xE4\u0254\u8100\xA9;s\u0155\u1B1Dr;\u6117\u0100ao\u1B25\u1B29rr;\u61B5ss;\u6717\u0100cu\u1B32\u1B37r;\uC000\u{1D4B8}\u0100bp\u1B3C\u1B44\u0100;e\u1B41\u1B42\u6ACF;\u6AD1\u0100;e\u1B49\u1B4A\u6AD0;\u6AD2dot;\u62EF\u0380delprvw\u1B60\u1B6C\u1B77\u1B82\u1BAC\u1BD4\u1BF9arr\u0100lr\u1B68\u1B6A;\u6938;\u6935\u0270\u1B72\0\0\u1B75r;\u62DEc;\u62DFarr\u0100;p\u1B7F\u1B80\u61B6;\u693D\u0300;bcdos\u1B8F\u1B90\u1B96\u1BA1\u1BA5\u1BA8\u622Arcap;\u6A48\u0100au\u1B9B\u1B9Ep;\u6A46p;\u6A4Aot;\u628Dr;\u6A45;\uC000\u222A\uFE00\u0200alrv\u1BB5\u1BBF\u1BDE\u1BE3rr\u0100;m\u1BBC\u1BBD\u61B7;\u693Cy\u0180evw\u1BC7\u1BD4\u1BD8q\u0270\u1BCE\0\0\u1BD2re\xE3\u1B73u\xE3\u1B75ee;\u62CEedge;\u62CFen\u803B\xA4\u40A4earrow\u0100lr\u1BEE\u1BF3eft\xBB\u1B80ight\xBB\u1BBDe\xE4\u1BDD\u0100ci\u1C01\u1C07onin\xF4\u01F7nt;\u6231lcty;\u632D\u0980AHabcdefhijlorstuwz\u1C38\u1C3B\u1C3F\u1C5D\u1C69\u1C75\u1C8A\u1C9E\u1CAC\u1CB7\u1CFB\u1CFF\u1D0D\u1D7B\u1D91\u1DAB\u1DBB\u1DC6\u1DCDr\xF2\u0381ar;\u6965\u0200glrs\u1C48\u1C4D\u1C52\u1C54ger;\u6020eth;\u6138\xF2\u1133h\u0100;v\u1C5A\u1C5B\u6010\xBB\u090A\u016B\u1C61\u1C67arow;\u690Fa\xE3\u0315\u0100ay\u1C6E\u1C73ron;\u410F;\u4434\u0180;ao\u0332\u1C7C\u1C84\u0100gr\u02BF\u1C81r;\u61CAtseq;\u6A77\u0180glm\u1C91\u1C94\u1C98\u803B\xB0\u40B0ta;\u43B4ptyv;\u69B1\u0100ir\u1CA3\u1CA8sht;\u697F;\uC000\u{1D521}ar\u0100lr\u1CB3\u1CB5\xBB\u08DC\xBB\u101E\u0280aegsv\u1CC2\u0378\u1CD6\u1CDC\u1CE0m\u0180;os\u0326\u1CCA\u1CD4nd\u0100;s\u0326\u1CD1uit;\u6666amma;\u43DDin;\u62F2\u0180;io\u1CE7\u1CE8\u1CF8\u40F7de\u8100\xF7;o\u1CE7\u1CF0ntimes;\u62C7n\xF8\u1CF7cy;\u4452c\u026F\u1D06\0\0\u1D0Arn;\u631Eop;\u630D\u0280lptuw\u1D18\u1D1D\u1D22\u1D49\u1D55lar;\u4024f;\uC000\u{1D555}\u0280;emps\u030B\u1D2D\u1D37\u1D3D\u1D42q\u0100;d\u0352\u1D33ot;\u6251inus;\u6238lus;\u6214quare;\u62A1blebarwedg\xE5\xFAn\u0180adh\u112E\u1D5D\u1D67ownarrow\xF3\u1C83arpoon\u0100lr\u1D72\u1D76ef\xF4\u1CB4igh\xF4\u1CB6\u0162\u1D7F\u1D85karo\xF7\u0F42\u026F\u1D8A\0\0\u1D8Ern;\u631Fop;\u630C\u0180cot\u1D98\u1DA3\u1DA6\u0100ry\u1D9D\u1DA1;\uC000\u{1D4B9};\u4455l;\u69F6rok;\u4111\u0100dr\u1DB0\u1DB4ot;\u62F1i\u0100;f\u1DBA\u1816\u65BF\u0100ah\u1DC0\u1DC3r\xF2\u0429a\xF2\u0FA6angle;\u69A6\u0100ci\u1DD2\u1DD5y;\u445Fgrarr;\u67FF\u0900Dacdefglmnopqrstux\u1E01\u1E09\u1E19\u1E38\u0578\u1E3C\u1E49\u1E61\u1E7E\u1EA5\u1EAF\u1EBD\u1EE1\u1F2A\u1F37\u1F44\u1F4E\u1F5A\u0100Do\u1E06\u1D34o\xF4\u1C89\u0100cs\u1E0E\u1E14ute\u803B\xE9\u40E9ter;\u6A6E\u0200aioy\u1E22\u1E27\u1E31\u1E36ron;\u411Br\u0100;c\u1E2D\u1E2E\u6256\u803B\xEA\u40EAlon;\u6255;\u444Dot;\u4117\u0100Dr\u1E41\u1E45ot;\u6252;\uC000\u{1D522}\u0180;rs\u1E50\u1E51\u1E57\u6A9Aave\u803B\xE8\u40E8\u0100;d\u1E5C\u1E5D\u6A96ot;\u6A98\u0200;ils\u1E6A\u1E6B\u1E72\u1E74\u6A99nters;\u63E7;\u6113\u0100;d\u1E79\u1E7A\u6A95ot;\u6A97\u0180aps\u1E85\u1E89\u1E97cr;\u4113ty\u0180;sv\u1E92\u1E93\u1E95\u6205et\xBB\u1E93p\u01001;\u1E9D\u1EA4\u0133\u1EA1\u1EA3;\u6004;\u6005\u6003\u0100gs\u1EAA\u1EAC;\u414Bp;\u6002\u0100gp\u1EB4\u1EB8on;\u4119f;\uC000\u{1D556}\u0180als\u1EC4\u1ECE\u1ED2r\u0100;s\u1ECA\u1ECB\u62D5l;\u69E3us;\u6A71i\u0180;lv\u1EDA\u1EDB\u1EDF\u43B5on\xBB\u1EDB;\u43F5\u0200csuv\u1EEA\u1EF3\u1F0B\u1F23\u0100io\u1EEF\u1E31rc\xBB\u1E2E\u0269\u1EF9\0\0\u1EFB\xED\u0548ant\u0100gl\u1F02\u1F06tr\xBB\u1E5Dess\xBB\u1E7A\u0180aei\u1F12\u1F16\u1F1Als;\u403Dst;\u625Fv\u0100;D\u0235\u1F20D;\u6A78parsl;\u69E5\u0100Da\u1F2F\u1F33ot;\u6253rr;\u6971\u0180cdi\u1F3E\u1F41\u1EF8r;\u612Fo\xF4\u0352\u0100ah\u1F49\u1F4B;\u43B7\u803B\xF0\u40F0\u0100mr\u1F53\u1F57l\u803B\xEB\u40EBo;\u60AC\u0180cip\u1F61\u1F64\u1F67l;\u4021s\xF4\u056E\u0100eo\u1F6C\u1F74ctatio\xEE\u0559nential\xE5\u0579\u09E1\u1F92\0\u1F9E\0\u1FA1\u1FA7\0\0\u1FC6\u1FCC\0\u1FD3\0\u1FE6\u1FEA\u2000\0\u2008\u205Allingdotse\xF1\u1E44y;\u4444male;\u6640\u0180ilr\u1FAD\u1FB3\u1FC1lig;\u8000\uFB03\u0269\u1FB9\0\0\u1FBDg;\u8000\uFB00ig;\u8000\uFB04;\uC000\u{1D523}lig;\u8000\uFB01lig;\uC000fj\u0180alt\u1FD9\u1FDC\u1FE1t;\u666Dig;\u8000\uFB02ns;\u65B1of;\u4192\u01F0\u1FEE\0\u1FF3f;\uC000\u{1D557}\u0100ak\u05BF\u1FF7\u0100;v\u1FFC\u1FFD\u62D4;\u6AD9artint;\u6A0D\u0100ao\u200C\u2055\u0100cs\u2011\u2052\u03B1\u201A\u2030\u2038\u2045\u2048\0\u2050\u03B2\u2022\u2025\u2027\u202A\u202C\0\u202E\u803B\xBD\u40BD;\u6153\u803B\xBC\u40BC;\u6155;\u6159;\u615B\u01B3\u2034\0\u2036;\u6154;\u6156\u02B4\u203E\u2041\0\0\u2043\u803B\xBE\u40BE;\u6157;\u615C5;\u6158\u01B6\u204C\0\u204E;\u615A;\u615D8;\u615El;\u6044wn;\u6322cr;\uC000\u{1D4BB}\u0880Eabcdefgijlnorstv\u2082\u2089\u209F\u20A5\u20B0\u20B4\u20F0\u20F5\u20FA\u20FF\u2103\u2112\u2138\u0317\u213E\u2152\u219E\u0100;l\u064D\u2087;\u6A8C\u0180cmp\u2090\u2095\u209Dute;\u41F5ma\u0100;d\u209C\u1CDA\u43B3;\u6A86reve;\u411F\u0100iy\u20AA\u20AErc;\u411D;\u4433ot;\u4121\u0200;lqs\u063E\u0642\u20BD\u20C9\u0180;qs\u063E\u064C\u20C4lan\xF4\u0665\u0200;cdl\u0665\u20D2\u20D5\u20E5c;\u6AA9ot\u0100;o\u20DC\u20DD\u6A80\u0100;l\u20E2\u20E3\u6A82;\u6A84\u0100;e\u20EA\u20ED\uC000\u22DB\uFE00s;\u6A94r;\uC000\u{1D524}\u0100;g\u0673\u061Bmel;\u6137cy;\u4453\u0200;Eaj\u065A\u210C\u210E\u2110;\u6A92;\u6AA5;\u6AA4\u0200Eaes\u211B\u211D\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6A8Arox\xBB\u2124\u0100;q\u212E\u212F\u6A88\u0100;q\u212E\u211Bim;\u62E7pf;\uC000\u{1D558}\u0100ci\u2143\u2146r;\u610Am\u0180;el\u066B\u214E\u2150;\u6A8E;\u6A90\u8300>;cdlqr\u05EE\u2160\u216A\u216E\u2173\u2179\u0100ci\u2165\u2167;\u6AA7r;\u6A7Aot;\u62D7Par;\u6995uest;\u6A7C\u0280adels\u2184\u216A\u2190\u0656\u219B\u01F0\u2189\0\u218Epro\xF8\u209Er;\u6978q\u0100lq\u063F\u2196les\xF3\u2088i\xED\u066B\u0100en\u21A3\u21ADrtneqq;\uC000\u2269\uFE00\xC5\u21AA\u0500Aabcefkosy\u21C4\u21C7\u21F1\u21F5\u21FA\u2218\u221D\u222F\u2268\u227Dr\xF2\u03A0\u0200ilmr\u21D0\u21D4\u21D7\u21DBrs\xF0\u1484f\xBB\u2024il\xF4\u06A9\u0100dr\u21E0\u21E4cy;\u444A\u0180;cw\u08F4\u21EB\u21EFir;\u6948;\u61ADar;\u610Firc;\u4125\u0180alr\u2201\u220E\u2213rts\u0100;u\u2209\u220A\u6665it\xBB\u220Alip;\u6026con;\u62B9r;\uC000\u{1D525}s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223A\u223E\u2243\u225E\u2263rr;\u61FFtht;\u623Bk\u0100lr\u2249\u2253eftarrow;\u61A9ightarrow;\u61AAf;\uC000\u{1D559}bar;\u6015\u0180clt\u226F\u2274\u2278r;\uC000\u{1D4BD}as\xE8\u21F4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xBB\u1C5B\u0AE1\u22A3\0\u22AA\0\u22B8\u22C5\u22CE\0\u22D5\u22F3\0\0\u22F8\u2322\u2367\u2362\u237F\0\u2386\u23AA\u23B4cute\u803B\xED\u40ED\u0180;iy\u0771\u22B0\u22B5rc\u803B\xEE\u40EE;\u4438\u0100cx\u22BC\u22BFy;\u4435cl\u803B\xA1\u40A1\u0100fr\u039F\u22C9;\uC000\u{1D526}rave\u803B\xEC\u40EC\u0200;ino\u073E\u22DD\u22E9\u22EE\u0100in\u22E2\u22E6nt;\u6A0Ct;\u622Dfin;\u69DCta;\u6129lig;\u4133\u0180aop\u22FE\u231A\u231D\u0180cgt\u2305\u2308\u2317r;\u412B\u0180elp\u071F\u230F\u2313in\xE5\u078Ear\xF4\u0720h;\u4131f;\u62B7ed;\u41B5\u0280;cfot\u04F4\u232C\u2331\u233D\u2341are;\u6105in\u0100;t\u2338\u2339\u621Eie;\u69DDdo\xF4\u2319\u0280;celp\u0757\u234C\u2350\u235B\u2361al;\u62BA\u0100gr\u2355\u2359er\xF3\u1563\xE3\u234Darhk;\u6A17rod;\u6A3C\u0200cgpt\u236F\u2372\u2376\u237By;\u4451on;\u412Ff;\uC000\u{1D55A}a;\u43B9uest\u803B\xBF\u40BF\u0100ci\u238A\u238Fr;\uC000\u{1D4BE}n\u0280;Edsv\u04F4\u239B\u239D\u23A1\u04F3;\u62F9ot;\u62F5\u0100;v\u23A6\u23A7\u62F4;\u62F3\u0100;i\u0777\u23AElde;\u4129\u01EB\u23B8\0\u23BCcy;\u4456l\u803B\xEF\u40EF\u0300cfmosu\u23CC\u23D7\u23DC\u23E1\u23E7\u23F5\u0100iy\u23D1\u23D5rc;\u4135;\u4439r;\uC000\u{1D527}ath;\u4237pf;\uC000\u{1D55B}\u01E3\u23EC\0\u23F1r;\uC000\u{1D4BF}rcy;\u4458kcy;\u4454\u0400acfghjos\u240B\u2416\u2422\u2427\u242D\u2431\u2435\u243Bppa\u0100;v\u2413\u2414\u43BA;\u43F0\u0100ey\u241B\u2420dil;\u4137;\u443Ar;\uC000\u{1D528}reen;\u4138cy;\u4445cy;\u445Cpf;\uC000\u{1D55C}cr;\uC000\u{1D4C0}\u0B80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248D\u2491\u250E\u253D\u255A\u2580\u264E\u265E\u2665\u2679\u267D\u269A\u26B2\u26D8\u275D\u2768\u278B\u27C0\u2801\u2812\u0180art\u2477\u247A\u247Cr\xF2\u09C6\xF2\u0395ail;\u691Barr;\u690E\u0100;g\u0994\u248B;\u6A8Bar;\u6962\u0963\u24A5\0\u24AA\0\u24B1\0\0\0\0\0\u24B5\u24BA\0\u24C6\u24C8\u24CD\0\u24F9ute;\u413Amptyv;\u69B4ra\xEE\u084Cbda;\u43BBg\u0180;dl\u088E\u24C1\u24C3;\u6991\xE5\u088E;\u6A85uo\u803B\xAB\u40ABr\u0400;bfhlpst\u0899\u24DE\u24E6\u24E9\u24EB\u24EE\u24F1\u24F5\u0100;f\u089D\u24E3s;\u691Fs;\u691D\xEB\u2252p;\u61ABl;\u6939im;\u6973l;\u61A2\u0180;ae\u24FF\u2500\u2504\u6AABil;\u6919\u0100;s\u2509\u250A\u6AAD;\uC000\u2AAD\uFE00\u0180abr\u2515\u2519\u251Drr;\u690Crk;\u6772\u0100ak\u2522\u252Cc\u0100ek\u2528\u252A;\u407B;\u405B\u0100es\u2531\u2533;\u698Bl\u0100du\u2539\u253B;\u698F;\u698D\u0200aeuy\u2546\u254B\u2556\u2558ron;\u413E\u0100di\u2550\u2554il;\u413C\xEC\u08B0\xE2\u2529;\u443B\u0200cqrs\u2563\u2566\u256D\u257Da;\u6936uo\u0100;r\u0E19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694Bh;\u61B2\u0280;fgqs\u258B\u258C\u0989\u25F3\u25FF\u6264t\u0280ahlrt\u2598\u25A4\u25B7\u25C2\u25E8rrow\u0100;t\u0899\u25A1a\xE9\u24F6arpoon\u0100du\u25AF\u25B4own\xBB\u045Ap\xBB\u0966eftarrows;\u61C7ight\u0180ahs\u25CD\u25D6\u25DErrow\u0100;s\u08F4\u08A7arpoon\xF3\u0F98quigarro\xF7\u21F0hreetimes;\u62CB\u0180;qs\u258B\u0993\u25FAlan\xF4\u09AC\u0280;cdgs\u09AC\u260A\u260D\u261D\u2628c;\u6AA8ot\u0100;o\u2614\u2615\u6A7F\u0100;r\u261A\u261B\u6A81;\u6A83\u0100;e\u2622\u2625\uC000\u22DA\uFE00s;\u6A93\u0280adegs\u2633\u2639\u263D\u2649\u264Bppro\xF8\u24C6ot;\u62D6q\u0100gq\u2643\u2645\xF4\u0989gt\xF2\u248C\xF4\u099Bi\xED\u09B2\u0180ilr\u2655\u08E1\u265Asht;\u697C;\uC000\u{1D529}\u0100;E\u099C\u2663;\u6A91\u0161\u2669\u2676r\u0100du\u25B2\u266E\u0100;l\u0965\u2673;\u696Alk;\u6584cy;\u4459\u0280;acht\u0A48\u2688\u268B\u2691\u2696r\xF2\u25C1orne\xF2\u1D08ard;\u696Bri;\u65FA\u0100io\u269F\u26A4dot;\u4140ust\u0100;a\u26AC\u26AD\u63B0che\xBB\u26AD\u0200Eaes\u26BB\u26BD\u26C9\u26D4;\u6268p\u0100;p\u26C3\u26C4\u6A89rox\xBB\u26C4\u0100;q\u26CE\u26CF\u6A87\u0100;q\u26CE\u26BBim;\u62E6\u0400abnoptwz\u26E9\u26F4\u26F7\u271A\u272F\u2741\u2747\u2750\u0100nr\u26EE\u26F1g;\u67ECr;\u61FDr\xEB\u08C1g\u0180lmr\u26FF\u270D\u2714eft\u0100ar\u09E6\u2707ight\xE1\u09F2apsto;\u67FCight\xE1\u09FDparrow\u0100lr\u2725\u2729ef\xF4\u24EDight;\u61AC\u0180afl\u2736\u2739\u273Dr;\u6985;\uC000\u{1D55D}us;\u6A2Dimes;\u6A34\u0161\u274B\u274Fst;\u6217\xE1\u134E\u0180;ef\u2757\u2758\u1800\u65CAnge\xBB\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277C\u2785\u2787r\xF2\u08A8orne\xF2\u1D8Car\u0100;d\u0F98\u2783;\u696D;\u600Eri;\u62BF\u0300achiqt\u2798\u279D\u0A40\u27A2\u27AE\u27BBquo;\u6039r;\uC000\u{1D4C1}m\u0180;eg\u09B2\u27AA\u27AC;\u6A8D;\u6A8F\u0100bu\u252A\u27B3o\u0100;r\u0E1F\u27B9;\u601Arok;\u4142\u8400<;cdhilqr\u082B\u27D2\u2639\u27DC\u27E0\u27E5\u27EA\u27F0\u0100ci\u27D7\u27D9;\u6AA6r;\u6A79re\xE5\u25F2mes;\u62C9arr;\u6976uest;\u6A7B\u0100Pi\u27F5\u27F9ar;\u6996\u0180;ef\u2800\u092D\u181B\u65C3r\u0100du\u2807\u280Dshar;\u694Ahar;\u6966\u0100en\u2817\u2821rtneqq;\uC000\u2268\uFE00\xC5\u281E\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288E\u2893\u28A0\u28A5\u28A8\u28DA\u28E2\u28E4\u0A83\u28F3\u2902Dot;\u623A\u0200clpr\u284E\u2852\u2863\u287Dr\u803B\xAF\u40AF\u0100et\u2857\u2859;\u6642\u0100;e\u285E\u285F\u6720se\xBB\u285F\u0100;s\u103B\u2868to\u0200;dlu\u103B\u2873\u2877\u287Bow\xEE\u048Cef\xF4\u090F\xF0\u13D1ker;\u65AE\u0100oy\u2887\u288Cmma;\u6A29;\u443Cash;\u6014asuredangle\xBB\u1626r;\uC000\u{1D52A}o;\u6127\u0180cdn\u28AF\u28B4\u28C9ro\u803B\xB5\u40B5\u0200;acd\u1464\u28BD\u28C0\u28C4s\xF4\u16A7ir;\u6AF0ot\u80BB\xB7\u01B5us\u0180;bd\u28D2\u1903\u28D3\u6212\u0100;u\u1D3C\u28D8;\u6A2A\u0163\u28DE\u28E1p;\u6ADB\xF2\u2212\xF0\u0A81\u0100dp\u28E9\u28EEels;\u62A7f;\uC000\u{1D55E}\u0100ct\u28F8\u28FDr;\uC000\u{1D4C2}pos\xBB\u159D\u0180;lm\u2909\u290A\u290D\u43BCtimap;\u62B8\u0C00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297E\u2989\u2998\u29DA\u29E9\u2A15\u2A1A\u2A58\u2A5D\u2A83\u2A95\u2AA4\u2AA8\u2B04\u2B07\u2B44\u2B7F\u2BAE\u2C34\u2C67\u2C7C\u2CE9\u0100gt\u2947\u294B;\uC000\u22D9\u0338\u0100;v\u2950\u0BCF\uC000\u226B\u20D2\u0180elt\u295A\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61CDightarrow;\u61CE;\uC000\u22D8\u0338\u0100;v\u297B\u0C47\uC000\u226A\u20D2ightarrow;\u61CF\u0100Dd\u298E\u2993ash;\u62AFash;\u62AE\u0280bcnpt\u29A3\u29A7\u29AC\u29B1\u29CCla\xBB\u02DEute;\u4144g;\uC000\u2220\u20D2\u0280;Eiop\u0D84\u29BC\u29C0\u29C5\u29C8;\uC000\u2A70\u0338d;\uC000\u224B\u0338s;\u4149ro\xF8\u0D84ur\u0100;a\u29D3\u29D4\u666El\u0100;s\u29D3\u0B38\u01F3\u29DF\0\u29E3p\u80BB\xA0\u0B37mp\u0100;e\u0BF9\u0C00\u0280aeouy\u29F4\u29FE\u2A03\u2A10\u2A13\u01F0\u29F9\0\u29FB;\u6A43on;\u4148dil;\u4146ng\u0100;d\u0D7E\u2A0Aot;\uC000\u2A6D\u0338p;\u6A42;\u443Dash;\u6013\u0380;Aadqsx\u0B92\u2A29\u2A2D\u2A3B\u2A41\u2A45\u2A50rr;\u61D7r\u0100hr\u2A33\u2A36k;\u6924\u0100;o\u13F2\u13F0ot;\uC000\u2250\u0338ui\xF6\u0B63\u0100ei\u2A4A\u2A4Ear;\u6928\xED\u0B98ist\u0100;s\u0BA0\u0B9Fr;\uC000\u{1D52B}\u0200Eest\u0BC5\u2A66\u2A79\u2A7C\u0180;qs\u0BBC\u2A6D\u0BE1\u0180;qs\u0BBC\u0BC5\u2A74lan\xF4\u0BE2i\xED\u0BEA\u0100;r\u0BB6\u2A81\xBB\u0BB7\u0180Aap\u2A8A\u2A8D\u2A91r\xF2\u2971rr;\u61AEar;\u6AF2\u0180;sv\u0F8D\u2A9C\u0F8C\u0100;d\u2AA1\u2AA2\u62FC;\u62FAcy;\u445A\u0380AEadest\u2AB7\u2ABA\u2ABE\u2AC2\u2AC5\u2AF6\u2AF9r\xF2\u2966;\uC000\u2266\u0338rr;\u619Ar;\u6025\u0200;fqs\u0C3B\u2ACE\u2AE3\u2AEFt\u0100ar\u2AD4\u2AD9rro\xF7\u2AC1ightarro\xF7\u2A90\u0180;qs\u0C3B\u2ABA\u2AEAlan\xF4\u0C55\u0100;s\u0C55\u2AF4\xBB\u0C36i\xED\u0C5D\u0100;r\u0C35\u2AFEi\u0100;e\u0C1A\u0C25i\xE4\u0D90\u0100pt\u2B0C\u2B11f;\uC000\u{1D55F}\u8180\xAC;in\u2B19\u2B1A\u2B36\u40ACn\u0200;Edv\u0B89\u2B24\u2B28\u2B2E;\uC000\u22F9\u0338ot;\uC000\u22F5\u0338\u01E1\u0B89\u2B33\u2B35;\u62F7;\u62F6i\u0100;v\u0CB8\u2B3C\u01E1\u0CB8\u2B41\u2B43;\u62FE;\u62FD\u0180aor\u2B4B\u2B63\u2B69r\u0200;ast\u0B7B\u2B55\u2B5A\u2B5Flle\xEC\u0B7Bl;\uC000\u2AFD\u20E5;\uC000\u2202\u0338lint;\u6A14\u0180;ce\u0C92\u2B70\u2B73u\xE5\u0CA5\u0100;c\u0C98\u2B78\u0100;e\u0C92\u2B7D\xF1\u0C98\u0200Aait\u2B88\u2B8B\u2B9D\u2BA7r\xF2\u2988rr\u0180;cw\u2B94\u2B95\u2B99\u619B;\uC000\u2933\u0338;\uC000\u219D\u0338ghtarrow\xBB\u2B95ri\u0100;e\u0CCB\u0CD6\u0380chimpqu\u2BBD\u2BCD\u2BD9\u2B04\u0B78\u2BE4\u2BEF\u0200;cer\u0D32\u2BC6\u0D37\u2BC9u\xE5\u0D45;\uC000\u{1D4C3}ort\u026D\u2B05\0\0\u2BD6ar\xE1\u2B56m\u0100;e\u0D6E\u2BDF\u0100;q\u0D74\u0D73su\u0100bp\u2BEB\u2BED\xE5\u0CF8\xE5\u0D0B\u0180bcp\u2BF6\u2C11\u2C19\u0200;Ees\u2BFF\u2C00\u0D22\u2C04\u6284;\uC000\u2AC5\u0338et\u0100;e\u0D1B\u2C0Bq\u0100;q\u0D23\u2C00c\u0100;e\u0D32\u2C17\xF1\u0D38\u0200;Ees\u2C22\u2C23\u0D5F\u2C27\u6285;\uC000\u2AC6\u0338et\u0100;e\u0D58\u2C2Eq\u0100;q\u0D60\u2C23\u0200gilr\u2C3D\u2C3F\u2C45\u2C47\xEC\u0BD7lde\u803B\xF1\u40F1\xE7\u0C43iangle\u0100lr\u2C52\u2C5Ceft\u0100;e\u0C1A\u2C5A\xF1\u0C26ight\u0100;e\u0CCB\u2C65\xF1\u0CD7\u0100;m\u2C6C\u2C6D\u43BD\u0180;es\u2C74\u2C75\u2C79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2C8F\u2C94\u2C99\u2C9E\u2CA3\u2CB0\u2CB6\u2CD3\u2CE3ash;\u62ADarr;\u6904p;\uC000\u224D\u20D2ash;\u62AC\u0100et\u2CA8\u2CAC;\uC000\u2265\u20D2;\uC000>\u20D2nfin;\u69DE\u0180Aet\u2CBD\u2CC1\u2CC5rr;\u6902;\uC000\u2264\u20D2\u0100;r\u2CCA\u2CCD\uC000<\u20D2ie;\uC000\u22B4\u20D2\u0100At\u2CD8\u2CDCrr;\u6903rie;\uC000\u22B5\u20D2im;\uC000\u223C\u20D2\u0180Aan\u2CF0\u2CF4\u2D02rr;\u61D6r\u0100hr\u2CFA\u2CFDk;\u6923\u0100;o\u13E7\u13E5ear;\u6927\u1253\u1A95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2D2D\0\u2D38\u2D48\u2D60\u2D65\u2D72\u2D84\u1B07\0\0\u2D8D\u2DAB\0\u2DC8\u2DCE\0\u2DDC\u2E19\u2E2B\u2E3E\u2E43\u0100cs\u2D31\u1A97ute\u803B\xF3\u40F3\u0100iy\u2D3C\u2D45r\u0100;c\u1A9E\u2D42\u803B\xF4\u40F4;\u443E\u0280abios\u1AA0\u2D52\u2D57\u01C8\u2D5Alac;\u4151v;\u6A38old;\u69BClig;\u4153\u0100cr\u2D69\u2D6Dir;\u69BF;\uC000\u{1D52C}\u036F\u2D79\0\0\u2D7C\0\u2D82n;\u42DBave\u803B\xF2\u40F2;\u69C1\u0100bm\u2D88\u0DF4ar;\u69B5\u0200acit\u2D95\u2D98\u2DA5\u2DA8r\xF2\u1A80\u0100ir\u2D9D\u2DA0r;\u69BEoss;\u69BBn\xE5\u0E52;\u69C0\u0180aei\u2DB1\u2DB5\u2DB9cr;\u414Dga;\u43C9\u0180cdn\u2DC0\u2DC5\u01CDron;\u43BF;\u69B6pf;\uC000\u{1D560}\u0180ael\u2DD4\u2DD7\u01D2r;\u69B7rp;\u69B9\u0380;adiosv\u2DEA\u2DEB\u2DEE\u2E08\u2E0D\u2E10\u2E16\u6228r\xF2\u1A86\u0200;efm\u2DF7\u2DF8\u2E02\u2E05\u6A5Dr\u0100;o\u2DFE\u2DFF\u6134f\xBB\u2DFF\u803B\xAA\u40AA\u803B\xBA\u40BAgof;\u62B6r;\u6A56lope;\u6A57;\u6A5B\u0180clo\u2E1F\u2E21\u2E27\xF2\u2E01ash\u803B\xF8\u40F8l;\u6298i\u016C\u2E2F\u2E34de\u803B\xF5\u40F5es\u0100;a\u01DB\u2E3As;\u6A36ml\u803B\xF6\u40F6bar;\u633D\u0AE1\u2E5E\0\u2E7D\0\u2E80\u2E9D\0\u2EA2\u2EB9\0\0\u2ECB\u0E9C\0\u2F13\0\0\u2F2B\u2FBC\0\u2FC8r\u0200;ast\u0403\u2E67\u2E72\u0E85\u8100\xB6;l\u2E6D\u2E6E\u40B6le\xEC\u0403\u0269\u2E78\0\0\u2E7Bm;\u6AF3;\u6AFDy;\u443Fr\u0280cimpt\u2E8B\u2E8F\u2E93\u1865\u2E97nt;\u4025od;\u402Eil;\u6030enk;\u6031r;\uC000\u{1D52D}\u0180imo\u2EA8\u2EB0\u2EB4\u0100;v\u2EAD\u2EAE\u43C6;\u43D5ma\xF4\u0A76ne;\u660E\u0180;tv\u2EBF\u2EC0\u2EC8\u43C0chfork\xBB\u1FFD;\u43D6\u0100au\u2ECF\u2EDFn\u0100ck\u2ED5\u2EDDk\u0100;h\u21F4\u2EDB;\u610E\xF6\u21F4s\u0480;abcdemst\u2EF3\u2EF4\u1908\u2EF9\u2EFD\u2F04\u2F06\u2F0A\u2F0E\u402Bcir;\u6A23ir;\u6A22\u0100ou\u1D40\u2F02;\u6A25;\u6A72n\u80BB\xB1\u0E9Dim;\u6A26wo;\u6A27\u0180ipu\u2F19\u2F20\u2F25ntint;\u6A15f;\uC000\u{1D561}nd\u803B\xA3\u40A3\u0500;Eaceinosu\u0EC8\u2F3F\u2F41\u2F44\u2F47\u2F81\u2F89\u2F92\u2F7E\u2FB6;\u6AB3p;\u6AB7u\xE5\u0ED9\u0100;c\u0ECE\u2F4C\u0300;acens\u0EC8\u2F59\u2F5F\u2F66\u2F68\u2F7Eppro\xF8\u2F43urlye\xF1\u0ED9\xF1\u0ECE\u0180aes\u2F6F\u2F76\u2F7Approx;\u6AB9qq;\u6AB5im;\u62E8i\xED\u0EDFme\u0100;s\u2F88\u0EAE\u6032\u0180Eas\u2F78\u2F90\u2F7A\xF0\u2F75\u0180dfp\u0EEC\u2F99\u2FAF\u0180als\u2FA0\u2FA5\u2FAAlar;\u632Eine;\u6312urf;\u6313\u0100;t\u0EFB\u2FB4\xEF\u0EFBrel;\u62B0\u0100ci\u2FC0\u2FC5r;\uC000\u{1D4C5};\u43C8ncsp;\u6008\u0300fiopsu\u2FDA\u22E2\u2FDF\u2FE5\u2FEB\u2FF1r;\uC000\u{1D52E}pf;\uC000\u{1D562}rime;\u6057cr;\uC000\u{1D4C6}\u0180aeo\u2FF8\u3009\u3013t\u0100ei\u2FFE\u3005rnion\xF3\u06B0nt;\u6A16st\u0100;e\u3010\u3011\u403F\xF1\u1F19\xF4\u0F14\u0A80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30E0\u310E\u312B\u3147\u3162\u3172\u318E\u3206\u3215\u3224\u3229\u3258\u326E\u3272\u3290\u32B0\u32B7\u0180art\u3047\u304A\u304Cr\xF2\u10B3\xF2\u03DDail;\u691Car\xF2\u1C65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307F\u308F\u3094\u30CC\u0100eu\u306D\u3071;\uC000\u223D\u0331te;\u4155i\xE3\u116Emptyv;\u69B3g\u0200;del\u0FD1\u3089\u308B\u308D;\u6992;\u69A5\xE5\u0FD1uo\u803B\xBB\u40BBr\u0580;abcfhlpstw\u0FDC\u30AC\u30AF\u30B7\u30B9\u30BC\u30BE\u30C0\u30C3\u30C7\u30CAp;\u6975\u0100;f\u0FE0\u30B4s;\u6920;\u6933s;\u691E\xEB\u225D\xF0\u272El;\u6945im;\u6974l;\u61A3;\u619D\u0100ai\u30D1\u30D5il;\u691Ao\u0100;n\u30DB\u30DC\u6236al\xF3\u0F1E\u0180abr\u30E7\u30EA\u30EEr\xF2\u17E5rk;\u6773\u0100ak\u30F3\u30FDc\u0100ek\u30F9\u30FB;\u407D;\u405D\u0100es\u3102\u3104;\u698Cl\u0100du\u310A\u310C;\u698E;\u6990\u0200aeuy\u3117\u311C\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xEC\u0FF2\xE2\u30FA;\u4440\u0200clqs\u3134\u3137\u313D\u3144a;\u6937dhar;\u6969uo\u0100;r\u020E\u020Dh;\u61B3\u0180acg\u314E\u315F\u0F44l\u0200;ips\u0F78\u3158\u315B\u109Cn\xE5\u10BBar\xF4\u0FA9t;\u65AD\u0180ilr\u3169\u1023\u316Esht;\u697D;\uC000\u{1D52F}\u0100ao\u3177\u3186r\u0100du\u317D\u317F\xBB\u047B\u0100;l\u1091\u3184;\u696C\u0100;v\u318B\u318C\u43C1;\u43F1\u0180gns\u3195\u31F9\u31FCht\u0300ahlrst\u31A4\u31B0\u31C2\u31D8\u31E4\u31EErrow\u0100;t\u0FDC\u31ADa\xE9\u30C8arpoon\u0100du\u31BB\u31BFow\xEE\u317Ep\xBB\u1092eft\u0100ah\u31CA\u31D0rrow\xF3\u0FEAarpoon\xF3\u0551ightarrows;\u61C9quigarro\xF7\u30CBhreetimes;\u62CCg;\u42DAingdotse\xF1\u1F32\u0180ahm\u320D\u3210\u3213r\xF2\u0FEAa\xF2\u0551;\u600Foust\u0100;a\u321E\u321F\u63B1che\xBB\u321Fmid;\u6AEE\u0200abpt\u3232\u323D\u3240\u3252\u0100nr\u3237\u323Ag;\u67EDr;\u61FEr\xEB\u1003\u0180afl\u3247\u324A\u324Er;\u6986;\uC000\u{1D563}us;\u6A2Eimes;\u6A35\u0100ap\u325D\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6A12ar\xF2\u31E3\u0200achq\u327B\u3280\u10BC\u3285quo;\u603Ar;\uC000\u{1D4C7}\u0100bu\u30FB\u328Ao\u0100;r\u0214\u0213\u0180hir\u3297\u329B\u32A0re\xE5\u31F8mes;\u62CAi\u0200;efl\u32AA\u1059\u1821\u32AB\u65B9tri;\u69CEluhar;\u6968;\u611E\u0D61\u32D5\u32DB\u32DF\u332C\u3338\u3371\0\u337A\u33A4\0\0\u33EC\u33F0\0\u3428\u3448\u345A\u34AD\u34B1\u34CA\u34F1\0\u3616\0\0\u3633cute;\u415Bqu\xEF\u27BA\u0500;Eaceinpsy\u11ED\u32F3\u32F5\u32FF\u3302\u330B\u330F\u331F\u3326\u3329;\u6AB4\u01F0\u32FA\0\u32FC;\u6AB8on;\u4161u\xE5\u11FE\u0100;d\u11F3\u3307il;\u415Frc;\u415D\u0180Eas\u3316\u3318\u331B;\u6AB6p;\u6ABAim;\u62E9olint;\u6A13i\xED\u1204;\u4441ot\u0180;be\u3334\u1D47\u3335\u62C5;\u6A66\u0380Aacmstx\u3346\u334A\u3357\u335B\u335E\u3363\u336Drr;\u61D8r\u0100hr\u3350\u3352\xEB\u2228\u0100;o\u0A36\u0A34t\u803B\xA7\u40A7i;\u403Bwar;\u6929m\u0100in\u3369\xF0nu\xF3\xF1t;\u6736r\u0100;o\u3376\u2055\uC000\u{1D530}\u0200acoy\u3382\u3386\u3391\u33A0rp;\u666F\u0100hy\u338B\u338Fcy;\u4449;\u4448rt\u026D\u3399\0\0\u339Ci\xE4\u1464ara\xEC\u2E6F\u803B\xAD\u40AD\u0100gm\u33A8\u33B4ma\u0180;fv\u33B1\u33B2\u33B2\u43C3;\u43C2\u0400;deglnpr\u12AB\u33C5\u33C9\u33CE\u33D6\u33DE\u33E1\u33E6ot;\u6A6A\u0100;q\u12B1\u12B0\u0100;E\u33D3\u33D4\u6A9E;\u6AA0\u0100;E\u33DB\u33DC\u6A9D;\u6A9Fe;\u6246lus;\u6A24arr;\u6972ar\xF2\u113D\u0200aeit\u33F8\u3408\u340F\u3417\u0100ls\u33FD\u3404lsetm\xE9\u336Ahp;\u6A33parsl;\u69E4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341C\u341D\u6AAA\u0100;s\u3422\u3423\u6AAC;\uC000\u2AAC\uFE00\u0180flp\u342E\u3433\u3442tcy;\u444C\u0100;b\u3438\u3439\u402F\u0100;a\u343E\u343F\u69C4r;\u633Ff;\uC000\u{1D564}a\u0100dr\u344D\u0402es\u0100;u\u3454\u3455\u6660it\xBB\u3455\u0180csu\u3460\u3479\u349F\u0100au\u3465\u346Fp\u0100;s\u1188\u346B;\uC000\u2293\uFE00p\u0100;s\u11B4\u3475;\uC000\u2294\uFE00u\u0100bp\u347F\u348F\u0180;es\u1197\u119C\u3486et\u0100;e\u1197\u348D\xF1\u119D\u0180;es\u11A8\u11AD\u3496et\u0100;e\u11A8\u349D\xF1\u11AE\u0180;af\u117B\u34A6\u05B0r\u0165\u34AB\u05B1\xBB\u117Car\xF2\u1148\u0200cemt\u34B9\u34BE\u34C2\u34C5r;\uC000\u{1D4C8}tm\xEE\xF1i\xEC\u3415ar\xE6\u11BE\u0100ar\u34CE\u34D5r\u0100;f\u34D4\u17BF\u6606\u0100an\u34DA\u34EDight\u0100ep\u34E3\u34EApsilo\xEE\u1EE0h\xE9\u2EAFs\xBB\u2852\u0280bcmnp\u34FB\u355E\u1209\u358B\u358E\u0480;Edemnprs\u350E\u350F\u3511\u3515\u351E\u3523\u352C\u3531\u3536\u6282;\u6AC5ot;\u6ABD\u0100;d\u11DA\u351Aot;\u6AC3ult;\u6AC1\u0100Ee\u3528\u352A;\u6ACB;\u628Alus;\u6ABFarr;\u6979\u0180eiu\u353D\u3552\u3555t\u0180;en\u350E\u3545\u354Bq\u0100;q\u11DA\u350Feq\u0100;q\u352B\u3528m;\u6AC7\u0100bp\u355A\u355C;\u6AD5;\u6AD3c\u0300;acens\u11ED\u356C\u3572\u3579\u357B\u3326ppro\xF8\u32FAurlye\xF1\u11FE\xF1\u11F3\u0180aes\u3582\u3588\u331Bppro\xF8\u331Aq\xF1\u3317g;\u666A\u0680123;Edehlmnps\u35A9\u35AC\u35AF\u121C\u35B2\u35B4\u35C0\u35C9\u35D5\u35DA\u35DF\u35E8\u35ED\u803B\xB9\u40B9\u803B\xB2\u40B2\u803B\xB3\u40B3;\u6AC6\u0100os\u35B9\u35BCt;\u6ABEub;\u6AD8\u0100;d\u1222\u35C5ot;\u6AC4s\u0100ou\u35CF\u35D2l;\u67C9b;\u6AD7arr;\u697Bult;\u6AC2\u0100Ee\u35E4\u35E6;\u6ACC;\u628Blus;\u6AC0\u0180eiu\u35F4\u3609\u360Ct\u0180;en\u121C\u35FC\u3602q\u0100;q\u1222\u35B2eq\u0100;q\u35E7\u35E4m;\u6AC8\u0100bp\u3611\u3613;\u6AD4;\u6AD6\u0180Aan\u361C\u3620\u362Drr;\u61D9r\u0100hr\u3626\u3628\xEB\u222E\u0100;o\u0A2B\u0A29war;\u692Alig\u803B\xDF\u40DF\u0BE1\u3651\u365D\u3660\u12CE\u3673\u3679\0\u367E\u36C2\0\0\0\0\0\u36DB\u3703\0\u3709\u376C\0\0\0\u3787\u0272\u3656\0\0\u365Bget;\u6316;\u43C4r\xEB\u0E5F\u0180aey\u3666\u366B\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uC000\u{1D531}\u0200eiko\u3686\u369D\u36B5\u36BC\u01F2\u368B\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369B\u43B8ym;\u43D1\u0100cn\u36A2\u36B2k\u0100as\u36A8\u36AEppro\xF8\u12C1im\xBB\u12ACs\xF0\u129E\u0100as\u36BA\u36AE\xF0\u12C1rn\u803B\xFE\u40FE\u01EC\u031F\u36C6\u22E7es\u8180\xD7;bd\u36CF\u36D0\u36D8\u40D7\u0100;a\u190F\u36D5r;\u6A31;\u6A30\u0180eps\u36E1\u36E3\u3700\xE1\u2A4D\u0200;bcf\u0486\u36EC\u36F0\u36F4ot;\u6336ir;\u6AF1\u0100;o\u36F9\u36FC\uC000\u{1D565}rk;\u6ADA\xE1\u3362rime;\u6034\u0180aip\u370F\u3712\u3764d\xE5\u1248\u0380adempst\u3721\u374D\u3740\u3751\u3757\u375C\u375Fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65B5own\xBB\u1DBBeft\u0100;e\u2800\u373E\xF1\u092E;\u625Cight\u0100;e\u32AA\u374B\xF1\u105Aot;\u65ECinus;\u6A3Alus;\u6A39b;\u69CDime;\u6A3Bezium;\u63E2\u0180cht\u3772\u377D\u3781\u0100ry\u3777\u377B;\uC000\u{1D4C9};\u4446cy;\u445Brok;\u4167\u0100io\u378B\u378Ex\xF4\u1777head\u0100lr\u3797\u37A0eftarro\xF7\u084Fightarrow\xBB\u0F5D\u0900AHabcdfghlmoprstuw\u37D0\u37D3\u37D7\u37E4\u37F0\u37FC\u380E\u381C\u3823\u3834\u3851\u385D\u386B\u38A9\u38CC\u38D2\u38EA\u38F6r\xF2\u03EDar;\u6963\u0100cr\u37DC\u37E2ute\u803B\xFA\u40FA\xF2\u1150r\u01E3\u37EA\0\u37EDy;\u445Eve;\u416D\u0100iy\u37F5\u37FArc\u803B\xFB\u40FB;\u4443\u0180abh\u3803\u3806\u380Br\xF2\u13ADlac;\u4171a\xF2\u13C3\u0100ir\u3813\u3818sht;\u697E;\uC000\u{1D532}rave\u803B\xF9\u40F9\u0161\u3827\u3831r\u0100lr\u382C\u382E\xBB\u0957\xBB\u1083lk;\u6580\u0100ct\u3839\u384D\u026F\u383F\0\0\u384Arn\u0100;e\u3845\u3846\u631Cr\xBB\u3846op;\u630Fri;\u65F8\u0100al\u3856\u385Acr;\u416B\u80BB\xA8\u0349\u0100gp\u3862\u3866on;\u4173f;\uC000\u{1D566}\u0300adhlsu\u114B\u3878\u387D\u1372\u3891\u38A0own\xE1\u13B3arpoon\u0100lr\u3888\u388Cef\xF4\u382Digh\xF4\u382Fi\u0180;hl\u3899\u389A\u389C\u43C5\xBB\u13FAon\xBB\u389Aparrows;\u61C8\u0180cit\u38B0\u38C4\u38C8\u026F\u38B6\0\0\u38C1rn\u0100;e\u38BC\u38BD\u631Dr\xBB\u38BDop;\u630Eng;\u416Fri;\u65F9cr;\uC000\u{1D4CA}\u0180dir\u38D9\u38DD\u38E2ot;\u62F0lde;\u4169i\u0100;f\u3730\u38E8\xBB\u1813\u0100am\u38EF\u38F2r\xF2\u38A8l\u803B\xFC\u40FCangle;\u69A7\u0780ABDacdeflnoprsz\u391C\u391F\u3929\u392D\u39B5\u39B8\u39BD\u39DF\u39E4\u39E8\u39F3\u39F9\u39FD\u3A01\u3A20r\xF2\u03F7ar\u0100;v\u3926\u3927\u6AE8;\u6AE9as\xE8\u03E1\u0100nr\u3932\u3937grt;\u699C\u0380eknprst\u34E3\u3946\u394B\u3952\u395D\u3964\u3996app\xE1\u2415othin\xE7\u1E96\u0180hir\u34EB\u2EC8\u3959op\xF4\u2FB5\u0100;h\u13B7\u3962\xEF\u318D\u0100iu\u3969\u396Dgm\xE1\u33B3\u0100bp\u3972\u3984setneq\u0100;q\u397D\u3980\uC000\u228A\uFE00;\uC000\u2ACB\uFE00setneq\u0100;q\u398F\u3992\uC000\u228B\uFE00;\uC000\u2ACC\uFE00\u0100hr\u399B\u399Fet\xE1\u369Ciangle\u0100lr\u39AA\u39AFeft\xBB\u0925ight\xBB\u1051y;\u4432ash\xBB\u1036\u0180elr\u39C4\u39D2\u39D7\u0180;be\u2DEA\u39CB\u39CFar;\u62BBq;\u625Alip;\u62EE\u0100bt\u39DC\u1468a\xF2\u1469r;\uC000\u{1D533}tr\xE9\u39AEsu\u0100bp\u39EF\u39F1\xBB\u0D1C\xBB\u0D59pf;\uC000\u{1D567}ro\xF0\u0EFBtr\xE9\u39B4\u0100cu\u3A06\u3A0Br;\uC000\u{1D4CB}\u0100bp\u3A10\u3A18n\u0100Ee\u3980\u3A16\xBB\u397En\u0100Ee\u3992\u3A1E\xBB\u3990igzag;\u699A\u0380cefoprs\u3A36\u3A3B\u3A56\u3A5B\u3A54\u3A61\u3A6Airc;\u4175\u0100di\u3A40\u3A51\u0100bg\u3A45\u3A49ar;\u6A5Fe\u0100;q\u15FA\u3A4F;\u6259erp;\u6118r;\uC000\u{1D534}pf;\uC000\u{1D568}\u0100;e\u1479\u3A66at\xE8\u1479cr;\uC000\u{1D4CC}\u0AE3\u178E\u3A87\0\u3A8B\0\u3A90\u3A9B\0\0\u3A9D\u3AA8\u3AAB\u3AAF\0\0\u3AC3\u3ACE\0\u3AD8\u17DC\u17DFtr\xE9\u17D1r;\uC000\u{1D535}\u0100Aa\u3A94\u3A97r\xF2\u03C3r\xF2\u09F6;\u43BE\u0100Aa\u3AA1\u3AA4r\xF2\u03B8r\xF2\u09EBa\xF0\u2713is;\u62FB\u0180dpt\u17A4\u3AB5\u3ABE\u0100fl\u3ABA\u17A9;\uC000\u{1D569}im\xE5\u17B2\u0100Aa\u3AC7\u3ACAr\xF2\u03CEr\xF2\u0A01\u0100cq\u3AD2\u17B8r;\uC000\u{1D4CD}\u0100pt\u17D6\u3ADCr\xE9\u17D4\u0400acefiosu\u3AF0\u3AFD\u3B08\u3B0C\u3B11\u3B15\u3B1B\u3B21c\u0100uy\u3AF6\u3AFBte\u803B\xFD\u40FD;\u444F\u0100iy\u3B02\u3B06rc;\u4177;\u444Bn\u803B\xA5\u40A5r;\uC000\u{1D536}cy;\u4457pf;\uC000\u{1D56A}cr;\uC000\u{1D4CE}\u0100cm\u3B26\u3B29y;\u444El\u803B\xFF\u40FF\u0500acdefhiosw\u3B42\u3B48\u3B54\u3B58\u3B64\u3B69\u3B6D\u3B74\u3B7A\u3B80cute;\u417A\u0100ay\u3B4D\u3B52ron;\u417E;\u4437ot;\u417C\u0100et\u3B5D\u3B61tr\xE6\u155Fa;\u43B6r;\uC000\u{1D537}cy;\u4436grarr;\u61DDpf;\uC000\u{1D56B}cr;\uC000\u{1D4CF}\u0100jn\u3B85\u3B87;\u600Dj;\u600C'.split("").map(i=>i.charCodeAt(0)));var Yh,s0=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),Kh=(Yh=String.fromCodePoint)!==null&&Yh!==void 0?Yh:function(i){let t="";return i>65535&&(i-=65536,t+=String.fromCharCode(i>>>10&1023|55296),i=56320|i&1023),t+=String.fromCharCode(i),t};function Jh(i){var t;return i>=55296&&i<=57343||i>1114111?65533:(t=s0.get(i))!==null&&t!==void 0?t:i}var Pe;(function(i){i[i.NUM=35]="NUM",i[i.SEMI=59]="SEMI",i[i.EQUALS=61]="EQUALS",i[i.ZERO=48]="ZERO",i[i.NINE=57]="NINE",i[i.LOWER_A=97]="LOWER_A",i[i.LOWER_F=102]="LOWER_F",i[i.LOWER_X=120]="LOWER_X",i[i.LOWER_Z=122]="LOWER_Z",i[i.UPPER_A=65]="UPPER_A",i[i.UPPER_F=70]="UPPER_F",i[i.UPPER_Z=90]="UPPER_Z"})(Pe||(Pe={}));var a0=32,yr;(function(i){i[i.VALUE_LENGTH=49152]="VALUE_LENGTH",i[i.BRANCH_LENGTH=16256]="BRANCH_LENGTH",i[i.JUMP_TABLE=127]="JUMP_TABLE"})(yr||(yr={}));function Xh(i){return i>=Pe.ZERO&&i<=Pe.NINE}function l0(i){return i>=Pe.UPPER_A&&i<=Pe.UPPER_F||i>=Pe.LOWER_A&&i<=Pe.LOWER_F}function u0(i){return i>=Pe.UPPER_A&&i<=Pe.UPPER_Z||i>=Pe.LOWER_A&&i<=Pe.LOWER_Z||Xh(i)}function h0(i){return i===Pe.EQUALS||u0(i)}var Ie;(function(i){i[i.EntityStart=0]="EntityStart",i[i.NumericStart=1]="NumericStart",i[i.NumericDecimal=2]="NumericDecimal",i[i.NumericHex=3]="NumericHex",i[i.NamedEntity=4]="NamedEntity"})(Ie||(Ie={}));var Xi;(function(i){i[i.Legacy=0]="Legacy",i[i.Strict=1]="Strict",i[i.Attribute=2]="Attribute"})(Xi||(Xi={}));var Ll=class{constructor(t,e,n){this.decodeTree=t,this.emitCodePoint=e,this.errors=n,this.state=Ie.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=Xi.Strict}startEntity(t){this.decodeMode=t,this.state=Ie.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(t,e){switch(this.state){case Ie.EntityStart:return t.charCodeAt(e)===Pe.NUM?(this.state=Ie.NumericStart,this.consumed+=1,this.stateNumericStart(t,e+1)):(this.state=Ie.NamedEntity,this.stateNamedEntity(t,e));case Ie.NumericStart:return this.stateNumericStart(t,e);case Ie.NumericDecimal:return this.stateNumericDecimal(t,e);case Ie.NumericHex:return this.stateNumericHex(t,e);case Ie.NamedEntity:return this.stateNamedEntity(t,e)}}stateNumericStart(t,e){return e>=t.length?-1:(t.charCodeAt(e)|a0)===Pe.LOWER_X?(this.state=Ie.NumericHex,this.consumed+=1,this.stateNumericHex(t,e+1)):(this.state=Ie.NumericDecimal,this.stateNumericDecimal(t,e))}addToNumericResult(t,e,n,r){if(e!==n){let s=n-e;this.result=this.result*Math.pow(r,s)+Number.parseInt(t.substr(e,s),r),this.consumed+=s}}stateNumericHex(t,e){let n=e;for(;e>14;for(;e>14,s!==0){if(o===Pe.SEMI)return this.emitNamedEntityData(this.treeIndex,s,this.consumed+this.excess);this.decodeMode!==Xi.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var t;let{result:e,decodeTree:n}=this,r=(n[e]&yr.VALUE_LENGTH)>>14;return this.emitNamedEntityData(e,r,this.consumed),(t=this.errors)===null||t===void 0||t.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(t,e,n){let{decodeTree:r}=this;return this.emitCodePoint(e===1?r[t]&~yr.VALUE_LENGTH:r[t+1],n),e===3&&this.emitCodePoint(r[t+2],n),n}end(){var t;switch(this.state){case Ie.NamedEntity:return this.result!==0&&(this.decodeMode!==Xi.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case Ie.NumericDecimal:return this.emitNumericEntity(0,2);case Ie.NumericHex:return this.emitNumericEntity(0,3);case Ie.NumericStart:return(t=this.errors)===null||t===void 0||t.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case Ie.EntityStart:return 0}}};function c0(i){let t="",e=new Ll(i,n=>t+=Kh(n));return function(r,s){let o=0,a=0;for(;(a=r.indexOf("&",a))>=0;){t+=r.slice(o,a),e.startEntity(s);let u=e.write(r,a+1);if(u<0){o=a+e.end();break}o=a+u,a=u===0?o+1:o}let l=t+r.slice(o);return t="",l}}function f0(i,t,e,n){let r=(t&yr.BRANCH_LENGTH)>>7,s=t&yr.JUMP_TABLE;if(r===0)return s!==0&&n===s?e:-1;if(s){let l=n-s;return l<0||l>=r?-1:i[e+l]-1}let o=e,a=o+r-1;for(;o<=a;){let l=o+a>>>1,u=i[l];if(un)a=l-1;else return i[l+r]}return-1}var d0=c0(jh);function Hs(i,t=Xi.Legacy){return d0(i,t)}var p0=String.prototype.codePointAt==null?(i,t)=>(i.charCodeAt(t)&64512)===55296?(i.charCodeAt(t)-55296)*1024+i.charCodeAt(t+1)-56320+65536:i.charCodeAt(t):(i,t)=>i.codePointAt(t);var Bd;(function(i){i[i.XML=0]="XML",i[i.HTML=1]="HTML"})(Bd||(Bd={}));var Fd;(function(i){i[i.UTF8=0]="UTF8",i[i.ASCII=1]="ASCII",i[i.Extensive=2]="Extensive",i[i.Attribute=3]="Attribute",i[i.Text=4]="Text"})(Fd||(Fd={}));var Vs=require("obsidian");function Go(i,t,e=!0,n=0,r="div",s=null,o){return t.type==="comment"?bh(i,t,o,e):t.postprocess(e,n,r,s,o)}async function Bl(i,t,e){let n=null,r=null,s=null,o=Hs(i.getHTML(),Xi.Strict),a=e.settings.default_preview_mode;if(t){if(e.app.workspace.activeLeaf?.view instanceof Vs.MarkdownView){let _=e.app.workspace.activeLeaf.view;_.previewMode.docId===t.docId&&(a=_.editor.cm.state.field(qe))}let v=t.getSectionInfo(i);if(v){let _=Lo(v.text,e.settings),S=[...v.text.matchAll(/\n/g)].map(k=>k.index);if(r=v.lineStart?S[v.lineStart-1]+1:0,s=S[v.lineEnd]??v.text.length,n=_.filter(k=>k.partially_in_range(r,s)),!n.length)return;if(n.length===1){let k=n[0],E=!1,M=null;if(k.type==="substitution"?k.part_encloses_range(r,s,!0)&&(E=!0,M=!0)||k.part_encloses_range(r,s,!1)&&(E=!0,M=!1):E=k.encloses_range(r,s),E){k.type==="substitution"&&(o=o.replace(/~>/g,""));let w=r===k.from;if(s===k.to){let D=o.lastIndexOf(me[k.type].at(-1));o=o.substring(0,D)+o.substring(D+3)}if(w){let D=o.indexOf(me[k.type][0]);o=o.substring(0,D)+o.substring(D+3)}let A=Go(e.app,k,!1,a,"div",M,o);i.empty(),A instanceof HTMLElement?i.appendChild(A):i.append((0,Vs.sanitizeHTMLToDom)(A));return}}}}o=o.replaceAll(/{|{<\/del>/g,"{~~").replaceAll(/}|<\/del>}/g,"~~}").replaceAll(/{|{<\/mark>/g,"{==").replaceAll(/}|<\/mark>}/g,"==}").replaceAll(/{==}|{=<\/mark>=}/g,"{====}");let l=Lo(o,e.settings);for(let v=0;vn[0].from,p=s",g.push(v));i.append((0,Vs.sanitizeHTMLToDom)(m)),i.querySelectorAll("placeholder").forEach((v,_)=>{v.replaceWith(g[_])})}var w0=require("@codemirror/state"),Zh=require("obsidian");function tc(i){for(let t of i.workspace.getLeavesOfType("markdown"))if(t.view instanceof Zh.MarkdownView){for(let e of t.view.previewMode.renderer.sections.filter(n=>n.el.querySelector(".cmtr-preview")))e.rendered=!1,e.html="";t.view.previewMode.renderer.queueRender()}}function Fl(i){for(let t of i.workspace.getLeavesOfType("markdown"))t.view instanceof Zh.MarkdownView&&t.view.previewMode.rerender(!0)}var Vl=require("obsidian");var Hl=class{constructor(t,e=!1){this.plugin=t;this.setRendering(e)}button=null;index=0;metadata_settings_toggles=[{icon:"lucide-user",text:"Author",attribute:"author"},{icon:"lucide-calendar",text:"Time",attribute:"timestamp"},{icon:"lucide-check",text:"Completed",attribute:"completed"},{icon:"brush",text:"Style",attribute:"style"},{icon:"paintbrush",text:"Color",attribute:"color"}];showMenu(t){mr();let e=new Vl.Menu;e.addItem(n=>{n.setTitle("Add metadata"),n.setIcon("tags"),n.setChecked(this.plugin.settings.add_metadata),n.onClick(async()=>{await this.plugin.setSetting("add_metadata",!this.plugin.settings.add_metadata),n.setChecked(this.plugin.settings.add_metadata),e.items.slice(1).forEach(r=>{r.setDisabled(!this.plugin.settings.add_metadata)})})});for(let{icon:n,text:r,attribute:s}of this.metadata_settings_toggles){let o=`add_${s}_metadata`;e.addItem(a=>{a.setTitle(r),a.setIcon(n),a.setChecked(this.plugin.settings[o]),a.setDisabled(!this.plugin.settings.add_metadata),a.onClick(async()=>{await this.plugin.setSetting(o,!this.plugin.settings[o]),a.setChecked(this.plugin.settings[o])}),a.dom.addClass("cmtr-submenu-nested")})}e.showAtMouseEvent(t)}setRendering(t){t===void 0||t===!!this.button||(t?this.renderButton():this.detachButton())}renderButton(){this.button=this.plugin.addStatusBarItem();let t=this.button.createSpan({cls:"status-bar-item-icon"});(0,Vl.setIcon)(t,"tags"),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label","Metadata"),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",e=>this.showMenu(e)),this.button.addEventListener("contextmenu",e=>this.showMenu(e))}detachButton(){this.button&&(this.button.detach(),this.button=null)}};var Jr=require("obsidian"),qo=class{constructor(t,e,n,r,s=!1){this.states=t;this.onchange=e;this.getvalue=n;this.plugin=r;this.setRendering(s),this.plugin.app.workspace.onLayoutReady(()=>this.currentView=this.plugin.app.workspace.activeEditor)}button=null;value=0;changeEvent=null;currentView=null;showMenu(t){let e=new Jr.Menu;for(let[n,r]of this.states.entries())e.addItem(s=>{s.setTitle(r.text),s.setIcon(r.icon),s.setChecked(n===this.value),s.onClick(()=>this.onchange(this.currentView,n))});e.showAtMouseEvent(t),t.preventDefault()}setRendering(t){t===void 0||t===!!this.button||(t?this.renderButton():this.detachButton())}updateButton(t){if(!this.button||t===void 0)return;this.value=t;let{icon:e,text:n}=this.states[t];(0,Jr.setIcon)(this.button,e),this.button.setAttribute("aria-label",n)}renderButton(){let{icon:t,text:e}=this.states[this.value];this.changeEvent=this.plugin.app.workspace.on("active-leaf-change",r=>{r&&r.view instanceof Jr.MarkdownView?(this.currentView=r.view,this.updateButton(this.getvalue(r.view.editor)),this.button.style.display=""):(this.currentView=null,this.button.style.display="none")}),this.button=this.plugin.addStatusBarItem();let n=this.button.createSpan({cls:"status-bar-item-icon"});(0,Jr.setIcon)(n,t),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label",e),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",r=>this.showMenu(r)),this.button.addEventListener("contextmenu",r=>this.showMenu(r))}detachButton(){this.button&&(this.button.detach(),this.button=null,this.plugin.app.workspace.offref(this.changeEvent))}};var zd=(i,t)=>new qo([{icon:"message-square",text:"Showing all suggestions"},{icon:"check",text:'Previewing "accept all"'},{icon:"cross",text:'Previewing "reject all"'}],i.setPreviewMode.bind(i),e=>e.cm.state.facet(qe),i,t),Gd=(i,t)=>new qo([{icon:"pencil",text:"Editing (Regular)"},{icon:"edit",text:"Editing (Corrected)"},{icon:"file-edit",text:"Suggesting"}],i.setEditMode.bind(i),e=>e.cm.state.facet(xi),i,t),qd=(i,t)=>new Hl(i,t);var xr=require("obsidian"),Wo=class{constructor(t,e,n,r,s,o,a=!1){this.states=t;this.has_label=e;this.cls=n;this.onchange=r;this.getvalue=s;this.plugin=o;this.setRendering(a)}active_mapping=new WeakMap;changeEvent=null;setRendering(t){t===void 0||t===!!this.changeEvent||(t?this.attachButtons():this.detachButtons())}setLabelRendering(t){if(!(t===void 0||!this.changeEvent||t===this.has_label)){this.has_label=t;for(let e of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(e.view instanceof xr.MarkdownView))continue;let{view:n}=e,{text:r}=this.states[this.getvalue(n)],s=this.active_mapping.get(n);if(s)if(s.status)s.status.detach(),s.status=null;else{let o=s.button.createSpan({text:r,cls:this.cls});s.button.parentElement.insertBefore(o,s.button),s.status=o}}}}updateButton(t,e){let n=this.active_mapping.get(t);if(n)if(this.states[e]){let{tooltip:r,text:s}=this.states[e];(0,xr.setIcon)(n.button,this.states[(e+1)%this.states.length].icon),n.button.setAttribute("aria-label",r),n.button.style.display="",this.has_label&&(n.status.innerText=s)}else n.button.style.display="none"}attachButtons(){this.changeEvent||(this.changeEvent=this.plugin.app.workspace.on("layout-change",this.attachButtons.bind(this)));for(let t of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(t.view instanceof xr.MarkdownView))continue;let{view:e}=t;if(this.active_mapping.has(e))continue;let n=t.on("history-change",()=>{this.updateButton(e,this.getvalue(e))}),r=this.getvalue(e);if(r===void 0)return;let{tooltip:s,text:o}=this.states[r],a=e.addAction(this.states[(r+1)%this.states.length].icon,s,async()=>{let u=(this.getvalue(e)+1)%this.states.length;this.onchange(e,u)}),l=this.has_label?a.createSpan({text:o,cls:this.cls}):null;this.has_label&&a.parentElement.insertBefore(l,a),a.oncontextmenu=u=>{let f=new xr.Menu,h=this.getvalue(e);for(let[c,{icon:p,text:g}]of this.states.entries())f.addItem(m=>{m.setIcon(p).setTitle(g).setChecked(c===h).onClick(()=>{this.onchange(e,c)})});f.showAtMouseEvent(u)},this.active_mapping.set(e,{button:a,status:l,event:n})}}detachButton(t){let e=t.view,n=this.active_mapping.get(e);n&&(t.offref(n.event),n.button.detach(),n.status?.detach(),this.active_mapping.delete(e))}detachButtons(){if(this.changeEvent){for(let t of this.plugin.app.workspace.getLeavesOfType("markdown"))t.view instanceof xr.MarkdownView&&this.detachButton(t);this.plugin.app.workspace.offref(this.changeEvent),this.changeEvent=null}}};var Wd=(i,t)=>new Wo([{icon:"message-square",tooltip:`Current mode: show all suggestions Click to preview 'accept all'`,text:"Showing all suggestions"},{icon:"check",tooltip:`Current mode: preview 'accept all' Click to preview 'reject all'`,text:'Previewing "accept all"'},{icon:"cross",tooltip:`Current mode: preview 'reject all' -Click to preview 'show all'`,text:'Previewing "reject all"'}],C.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",C.setPreviewMode.bind(C),g=>g.editor.cm.state.facet(Mg),C,I),ri=(C,I)=>new HA([{icon:"pencil",tooltip:`Current mode: editing (regular) +Click to preview 'show all'`,text:'Previewing "reject all"'}],i.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",i.setPreviewMode.bind(i),e=>e.editor.cm.state.facet(qe),i,t),Ud=(i,t)=>new Wo([{icon:"pencil",tooltip:`Current mode: editing (regular) Click to edit (corrected)`,text:"Editing (REG)"},{icon:"edit",tooltip:`Current mode: editing (corrected) Click to suggest`,text:"Editing (ALT)"},{icon:"file-edit",tooltip:`Current mode: suggesting -Click to edit (regular)`,text:"Suggesting"}],C.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",C.setEditMode.bind(C),g=>g.editor.cm.state.facet(nC),C,I);var Tb=require("obsidian");var Nl=!0;var pi=globalThis.process?.env?.NODE_ENV,CI=pi&&!pi.toLowerCase().startsWith("prod");var _C=Array.isArray,Hi=Array.prototype.indexOf,YA=Array.from,ft=Object.keys,Pg=Object.defineProperty,qC=Object.getOwnPropertyDescriptor,rl=Object.getOwnPropertyDescriptors,pl=Object.prototype,Yi=Array.prototype,xF=Object.getPrototypeOf,zt=Object.isExtensible;function Mt(C){return typeof C=="function"}var mg=()=>{};function JA(C){for(var I=0;Ie.editor.cm.state.facet(xi),i,t);var tm=require("obsidian");var zl=!0;var jd=globalThis.process?.env?.NODE_ENV,it=jd&&!jd.toLowerCase().startsWith("prod");var Qi=Array.isArray,Yd=Array.prototype.indexOf,Uo=Array.from,ec=Object.keys,Ue=Object.defineProperty,Zi=Object.getOwnPropertyDescriptor,Gl=Object.getOwnPropertyDescriptors,ql=Object.prototype,Kd=Array.prototype,kr=Object.getPrototypeOf,ic=Object.isExtensible;function nc(i){return typeof i=="function"}var Se=()=>{};function jo(i){for(var t=0;t0){let F=g.length>10?g.slice(0,7):g.slice(0,10),Q=g.length-F.length,A=F.map(U=>`- ${U}`).join(` -`);Q>0&&(A+=` -- ...and ${Q} more`)}return B}return kA(C,new Map,"",lZ)}function kA(C,I,g,B,F=null){if(typeof C=="object"&&C!==null){var Q=I.get(C);if(Q!==void 0)return Q;if(C instanceof Map)return new Map(C);if(C instanceof Set)return new Set(C);if(_C(C)){var A=Array(C.length);I.set(C,A),F!==null&&I.set(F,A);for(var U=0;U{B.d=!0}),CI&&(zI.function=g,JC=g)}function xI(C){let I=zI;if(I!==null){C!==void 0&&(I.x=C);let A=I.e;if(A!==null){var g=LI,B=SI;I.e=null;try{for(var F=0;F{var s=SI;Gg(A);var G=l();return Gg(s),G};return B&&g.set("length",lI(C.length,Q)),new Proxy(C,{defineProperty(l,s,G){(!("value"in G)||G.configurable===!1||G.enumerable===!1||G.writable===!1)&&ji();var t=g.get(s);return t===void 0?(t=U(()=>lI(G.value,Q)),g.set(s,t)):Y(t,U(()=>rI(G.value))),!0},deleteProperty(l,s){var G=g.get(s);if(G===void 0)s in l&&(g.set(s,U(()=>lI(Lg,Q))),Pt(F));else{if(B&&typeof s=="string"){var t=g.get("length"),c=Number(s);Number.isInteger(c)&&clI(rI(c?l[s]:Lg),Q)),g.set(s,t)),t!==void 0){var d=i(t);return d===Lg?void 0:d}return Reflect.get(l,s,G)},getOwnPropertyDescriptor(l,s){var G=Reflect.getOwnPropertyDescriptor(l,s);if(G&&"value"in G){var t=g.get(s);t&&(G.value=i(t))}else if(G===void 0){var c=g.get(s),d=c?.v;if(c!==void 0&&d!==Lg)return{enumerable:!0,configurable:!0,value:d,writable:!0}}return G},has(l,s){if(s===sC)return!0;var G=g.get(s),t=G!==void 0&&G.v!==Lg||Reflect.has(l,s);if(G!==void 0||LI!==null&&(!t||qC(l,s)?.writable)){G===void 0&&(G=U(()=>lI(t?rI(l[s]):Lg,Q)),g.set(s,G));var c=i(G);if(c===Lg)return!1}return t},set(l,s,G,t){var c=g.get(s),d=s in l;if(B&&s==="length")for(var b=G;blI(Lg,Q)),g.set(b+"",Z))}c===void 0?(!d||qC(l,s)?.writable)&&(c=U(()=>lI(void 0,Q)),Y(c,U(()=>rI(G))),g.set(s,c)):(d=c.v!==Lg,Y(c,U(()=>rI(G))));var e=Reflect.getOwnPropertyDescriptor(l,s);if(e?.set&&e.set.call(t,G),!d){if(B&&typeof s=="string"){var x=g.get("length"),a=Number(s);Number.isInteger(a)&&a>=x.v&&Y(x,a+1)}Pt(F)}return!0},ownKeys(l){i(F);var s=Reflect.ownKeys(l).filter(c=>{var d=g.get(c);return d===void 0||d.v!==Lg});for(var[G,t]of g)t.v!==Lg&&!(G in l)&&s.push(G);return s},setPrototypeOf(){Oi()}})}function Pt(C,I=1){Y(C,C.v+I)}function vQ(C){try{if(C!==null&&typeof C=="object"&&sC in C)return C[sC]}catch{}return C}function jt(C,I){return Object.is(vQ(C),vQ(I))}function RF(C){var I=2050,g=SI!==null&&(SI.f&2)!==0?SI:null;LI===null||g!==null&&(g.f&256)!==0?I|=256:LI.f|=1048576;let B={ctx:zI,deps:null,effects:null,equals:Hl,f:I,fn:C,reactions:null,rv:0,v:null,wv:0,parent:g??LI};return CI&&XB&&(B.created=jB("CreatedAt")),B}function BI(C){let I=RF(C);return vl(I),I}function KA(C){let I=RF(C);return I.equals=JQ,I}function Yl(C){var I=C.effects;if(I!==null){C.effects=null;for(var g=0;g0){let B=Array.from(zF);for(let F of B)(F.f&1024)!==0&&QC(F,4096),nF(F)&&TQ(F);zF.clear()}}return I}function jA(C,I=1){var g=i(C),B=I===1?g++:g--;return Y(C,g),B}function Cd(C,I){var g=C.reactions;if(g!==null)for(var B=tB(),F=g.length,Q=0;Q{C.indexOf=g,C.lastIndexOf=B,C.includes=F}}var Cc,Ad,OA,Ud,ld;function kl(){if(Cc===void 0){Cc=window,Ad=document,OA=/Firefox/.test(navigator.userAgent);var C=Element.prototype,I=Node.prototype,g=Text.prototype;Ud=qC(I,"firstChild").get,ld=qC(I,"nextSibling").get,zt(C)&&(C.__click=void 0,C.__className=void 0,C.__attributes=null,C.__style=void 0,C.__e=void 0),zt(g)&&(g.__t=void 0),CI&&(C.__svelte_meta=null,Qd())}}function hC(C=""){return document.createTextNode(C)}function Xg(C){return Ud.call(C)}function jg(C){return ld.call(C)}function O(C,I){if(!iI)return Xg(C);var g=Xg(RI);if(g===null)g=RI.appendChild(hC());else if(I&&g.nodeType!==3){var B=hC();return g?.before(B),tg(B),B}return tg(g),g}function yI(C,I){if(!iI){var g=Xg(C);return g instanceof Comment&&g.data===""?jg(g):g}if(I&&RI?.nodeType!==3){var B=hC();return RI?.before(B),tg(B),B}return RI}function v(C,I=1,g=!1){let B=iI?RI:C;for(var F;I--;)F=B,B=jg(B);if(!iI)return B;var Q=B?.nodeType;if(g&&Q!==3){var A=hC();return B===null?F?.after(A):B.before(A),tg(A),A}return tg(B),B}function _A(C){C.textContent=""}function td(C){LI===null&&SI===null&&wi(C),SI!==null&&(SI.f&256)!==0&&LI===null&&Ti(),KF&&Di(C)}function cZ(C,I){var g=I.last;g===null?I.last=I.first=C:(g.next=C,C.prev=g,I.last=C)}function jF(C,I,g,B=!0){var F=LI;if(CI)for(;F!==null&&(F.f&262144)!==0;)F=F.parent;var Q={ctx:zI,deps:null,nodes_start:null,nodes_end:null,f:C|2048,first:null,fn:I,last:null,next:null,parent:F,prev:null,teardown:null,transitions:null,wv:0};if(CI&&(Q.component_function=JC),g)try{TQ(Q),Q.f|=32768}catch(l){throw FC(Q),l}else I!==null&&wQ(Q);var A=g&&Q.deps===null&&Q.first===null&&Q.nodes_start===null&&Q.teardown===null&&(Q.f&1048704)===0;if(!A&&B&&(F!==null&&cZ(Q,F),SI!==null&&(SI.f&2)!==0)){var U=SI;(U.effects??=[]).push(Q)}return Q}function mC(C){let I=jF(8,null,!1);return QC(I,1024),I.teardown=C,I}function og(C){td("$effect");var I=LI!==null&&(LI.f&32)!==0&&zI!==null&&!zI.m;if(CI&&Pg(C,"name",{value:"$effect"}),I){var g=zI;(g.e??=[]).push({fn:C,effect:LI,reaction:SI})}else{var B=CC(C);return B}}function Ac(C){let I=jF(64,C,!0);return()=>{FC(I)}}function cd(C){let I=jF(64,C,!0);return(g={})=>new Promise(B=>{g.outro?wC(I,()=>{FC(I),B(void 0)}):(FC(I),B(void 0))})}function CC(C){return jF(4,C,!1)}function GC(C){return jF(8,C,!0)}function sI(C,I=[],g=RF){let B=I.map(g),F=()=>C(...B.map(i));return CI&&Pg(F,"name",{value:"{expression}"}),UC(F)}function UC(C,I=0){return jF(24|I,C,!0)}function Jg(C,I=!0){return jF(40,C,!0,I)}function Uc(C){var I=C.teardown;if(I!==null){let g=KF,B=SI;Bc(!0),Gg(null);try{I.call(null)}finally{Bc(g),Gg(B)}}}function lc(C,I=!1){var g=C.first;for(C.first=C.last=null;g!==null;){var B=g.next;(g.f&64)!==0?g.parent=null:FC(g,I),g=B}}function Gd(C){for(var I=C.first;I!==null;){var g=I.next;(I.f&32)===0&&FC(I),I=g}}function FC(C,I=!0){var g=!1;(I||(C.f&524288)!==0)&&C.nodes_start!==null&&(sc(C.nodes_start,C.nodes_end),g=!0),lc(C,I&&!g),$A(C,0),QC(C,16384);var B=C.transitions;if(B!==null)for(let Q of B)Q.stop();Uc(C);var F=C.parent;F!==null&&F.first!==null&&tc(C),CI&&(C.component_function=null),C.next=C.prev=C.teardown=C.ctx=C.deps=C.fn=C.nodes_start=C.nodes_end=null}function sc(C,I){for(;C!==null;){var g=C===I?null:jg(C);C.remove(),C=g}}function tc(C){var I=C.parent,g=C.prev,B=C.next;g!==null&&(g.next=B),B!==null&&(B.prev=g),I!==null&&(I.first===C&&(I.first=B),I.last===C&&(I.last=g))}function wC(C,I){var g=[];Tl(C,g,!0),cc(g,()=>{FC(C),I&&I()})}function cc(C,I){var g=C.length;if(g>0){var B=()=>--g||I();for(var F of C)F.out(B)}else I()}function Tl(C,I,g){if((C.f&8192)===0){if(C.f^=8192,C.transitions!==null)for(let A of C.transitions)(A.is_global||g)&&I.push(A);for(var B=C.first;B!==null;){var F=B.next,Q=(B.f&65536)!==0||(B.f&32)!==0;Tl(B,I,Q?g:!1),B=F}}}function aF(C){id(C,!0)}function id(C,I){if((C.f&8192)!==0){C.f^=8192,(C.f&1024)===0&&(C.f^=1024),nF(C)&&(QC(C,2048),wQ(C));for(var g=C.first;g!==null;){var B=g.next,F=(g.f&65536)!==0||(g.f&32)!==0;id(g,F?I:!1),g=B}if(C.transitions!==null)for(let Q of C.transitions)(Q.is_global||I)&&Q.in()}}var GZ=typeof requestIdleCallback>"u"?C=>setTimeout(C,1):requestIdleCallback,IU=[],gU=[];function dd(){var C=IU;IU=[],JA(C)}function bd(){var C=gU;gU=[],JA(C)}function XC(C){IU.length===0&&queueMicrotask(dd),IU.push(C)}function Zd(C){gU.length===0&&GZ(bd),gU.push(C)}function Gc(){IU.length>0&&dd(),gU.length>0&&bd()}var ed=new WeakSet,wl=!1,FU=!1,CU=null,OF=!1,KF=!1;function Bc(C){KF=C}var BU=[],bc=[],SI=null,IB=!1;function Gg(C){SI=C}var LI=null;function Sg(C){LI=C}var oB=null;function vl(C){SI!==null&&SI.f&2097152&&(oB===null?oB=[C]:oB.push(C))}var iC=null,fC=0,kC=null;function Bd(C){kC=C}var Ld=1,zl=0,OB=!1,wA=null;function PA(){return++Ld}function nF(C){var I=C.f;if((I&2048)!==0)return!0;if((I&4096)!==0){var g=C.deps,B=(I&256)!==0;if(g!==null){var F,Q,A=(I&512)!==0,U=B&&LI!==null&&!OB,l=g.length;if(A||U){var s=C,G=s.parent;for(F=0;FC.wv)return!0}(!B||LI!==null&&!OB)&&QC(C,1024)}return!1}function iZ(C,I){for(var g=I;g!==null;){if((g.f&128)!==0)try{g.fn(C);return}catch{g.f^=128}g=g.parent}throw wl=!1,C}function Vd(C){return(C.f&16384)===0&&(C.parent===null||(C.parent.f&128)===0)}function MQ(C,I,g,B){if(wl){if(g===null&&(wl=!1),Vd(I))throw C;return}if(g!==null&&(wl=!0),CI&&B!==null&&C instanceof Error&&!ed.has(C)){ed.add(C);let Q=[],A=I.fn?.name;A&&Q.push(A);let U=B;for(;U!==null;){var F=U.function?.[YC];if(F){let G=F.split("/").pop();Q.push(G)}U=U.p}let l=OA?" ":" ";Pg(C,"message",{value:C.message+` -${Q.map(G=>` -${l}in ${G}`).join("")} -`}),Pg(C,"component_stack",{value:Q});let s=C.stack;if(s){let G=s.split(` -`),t=[];for(let c=0;c0)for(t.length=fC+iC.length,c=0;c0;){I++>1e3&&bZ();var g=BU,B=g.length;BU=[];for(var F=0;F0;)FU=!0,dc(),Gc();return I}async function PQ(){await Promise.resolve(),KQ()}function i(C){var I=C.f,g=(I&2)!==0;if(wA!==null&&wA.add(C),SI!==null&&!IB){if(!oB?.includes(C)){var B=SI.deps;C.rv>>0).toString(36)}var uZ=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected","webkitdirectory","defer","disablepictureinpicture","disableremoteplayback"];var To=[...uZ,"formNoValidate","isMap","noModule","playsInline","readOnly","value","volume","defaultValue","defaultChecked","srcObject","noValidate","allowFullscreen","disablePictureInPicture","disableRemotePlayback"];var LZ=["touchstart","touchmove"];function ad(C){return LZ.includes(C)}function Pl(C){return C?.replace(/\//g,"/\u200B")}var md=new Map;function hd(C,I){var g=md.get(C);g||(g=new Set,md.set(C,g)),g.add(I)}var Xd=!1;function jl(){Xd||(Xd=!0,document.addEventListener("reset",C=>{Promise.resolve().then(()=>{if(!C.defaultPrevented)for(let I of C.target.elements)I.__on_r?.()})},{capture:!0}))}function jQ(C){var I=SI,g=LI;Gg(null),Sg(null);try{return C()}finally{Gg(I),Sg(g)}}function Zc(C,I,g,B=g){C.addEventListener(I,()=>jQ(g));let F=C.__on_r;F?C.__on_r=()=>{F(),B(!0)}:C.__on_r=()=>B(!0),jl()}var ec=new Set,Ol=new Set;function od(C,I,g,B={}){function F(Q){if(B.capture||OQ.call(I,Q),!Q.cancelBubble)return jQ(()=>g?.call(this,Q))}return C.startsWith("pointer")||C.startsWith("touch")||C==="wheel"?XC(()=>{I.addEventListener(C,F,B)}):I.addEventListener(C,F,B),F}function vg(C,I,g,B,F){var Q={capture:B,passive:F},A=od(C,I,g,Q);(I===document.body||I===window||I===document)&&mC(()=>{I.removeEventListener(C,A,Q)})}function KI(C){for(var I=0;I{throw a});throw c}}finally{C.__root=I,delete C.currentTarget,Gg(G),Sg(t)}}}var RZ;function yd(){RZ=void 0}function QU(C){var I=document.createElement("template");return I.innerHTML=C,I.content}function oC(C,I){var g=LI;g.nodes_start===null&&(g.nodes_start=C,g.nodes_end=I)}function f(C,I){var g=(I&1)!==0,B=(I&2)!==0,F,Q=!C.startsWith("");return()=>{if(iI)return oC(RI,null),RI;F===void 0&&(F=QU(Q?C:""+C),g||(F=Xg(F)));var A=B||OA?document.importNode(F,!0):F.cloneNode(!0);if(g){var U=Xg(A),l=A.lastChild;oC(U,l)}else oC(A,A);return A}}function Vc(C=""){if(!iI){var I=hC(C+"");return oC(I,I),I}var g=RI;return g.nodeType!==3&&(g.before(g=hC()),tg(g)),oC(g,g),g}function Ng(){if(iI)return oC(RI,null),RI;var C=document.createDocumentFragment(),I=document.createComment(""),g=hC();return C.append(I,g),oC(I,g),C}function D(C,I){if(iI){LI.nodes_end=RI,hg();return}C!==null&&C.before(I)}var _l=!0;function vI(C,I){var g=I==null?"":typeof I=="object"?I+"":I;g!==(C.__t??=C.nodeValue)&&(C.__t=g,C.nodeValue=g+"")}function yB(C,I){return Sd(C,I)}function uc(C,I){kl(),I.intro=I.intro??!1;let g=I.target,B=iI,F=RI;try{for(var Q=Xg(g);Q&&(Q.nodeType!==8||Q.data!==uF);)Q=jg(Q);if(!Q)throw PB;AC(!0),tg(Q),hg();let A=Sd(C,{...I,anchor:Q});if(RI===null||RI.nodeType!==8||RI.data!==fF)throw PB;return AC(!1),A}catch(A){if(A===PB)return I.recover===!1&&zi(),kl(),_A(g),AC(!1),yB(C,I);throw A}finally{AC(B),tg(F),yd()}}var _Q=new Map;function Sd(C,{target:I,anchor:g,props:B={},events:F,context:Q,intro:A=!0}){kl();var U=new Set,l=t=>{for(var c=0;c{var t=g??I.appendChild(hC());return Jg(()=>{if(Q){VI({});var c=zI;c.c=Q}F&&(B.$$events=F),iI&&oC(t,null),_l=A,s=C(t,B)||{},_l=!0,iI&&(LI.nodes_end=RI),Q&&xI()}),()=>{for(var c of U){I.removeEventListener(c,OQ);var d=_Q.get(c);--d===0?(document.removeEventListener(c,OQ),_Q.delete(c)):_Q.set(c,d)}Ol.delete(l),t!==g&&t.parentNode?.removeChild(t)}});return xc.set(s,G),s}var xc=new WeakMap;function $B(C,I){let g=xc.get(C);return g?(xc.delete(C),g(I)):(CI&&void 0,Promise.resolve())}function GI(C,I,[g,B]=[0,0]){iI&&g===0&&hg();var F=C,Q=null,A=null,U=Lg,l=g>0?65536:0,s=!1;let G=(c,d=!0)=>{s=!0,t(d,c)},t=(c,d)=>{if(U===(U=c))return;let b=!1;if(iI&&B!==-1){if(g===0){let e=F.data;e===uF?B=0:e===LF?B=1/0:(B=parseInt(e.substring(1)),B!==B&&(B=U?1/0:-1))}let Z=B>g;!!U===Z&&(F=PF(),tg(F),AC(!1),b=!0,B=-1)}U?(Q?aF(Q):d&&(Q=Jg(()=>d(F))),A&&wC(A,()=>{A=null})):(A?aF(A):d&&(A=Jg(()=>d(F,[g+1,B]))),Q&&wC(Q,()=>{Q=null})),b&&AC(!0)};UC(()=>{s=!1,I(G),s||t(null,null)},l),iI&&(F=RI)}function qQ(C,I,g){iI&&hg();var B=C,F=Lg,Q,A=tB()?vi:YQ;UC(()=>{A(F,F=I())&&(Q&&wC(Q),Q=Jg(()=>g(B)))}),iI&&(B=RI)}var AU=null;function Qg(C,I){return I}function oZ(C,I,g,B){for(var F=[],Q=I.length,A=0;A0&&F.length===0&&g!==null;if(U){var l=g.parentNode;_A(l),l.append(g),B.clear(),mF(C,I[0].prev,I[Q-1].next)}cc(F,()=>{for(var s=0;s{var d=g();return _C(d)?d:d==null?[]:YA(d)});UC(()=>{var d=i(c),b=d.length;if(t&&b===0)return;t=b===0;let Z=!1;if(iI){var e=A.data===LF;e!==(b===0)&&(A=PF(),tg(A),AC(!1),Z=!0)}if(iI){for(var x=null,a,n=0;n0&&tg(PF())}iI||yZ(d,U,A,F,I,B,g),Q!==null&&(b===0?G?aF(G):G=Jg(()=>Q(A)):G!==null&&wC(G,()=>{G=null})),Z&&AC(!0),i(c)}),iI&&(A=RI)}function yZ(C,I,g,B,F,Q,A){var U=(F&8)!==0,l=(F&3)!==0,s=C.length,G=I.items,t=I.first,c=t,d,b=null,Z,e=[],x=[],a,n,h,m;if(U)for(m=0;m0){var T=(F&4)!==0&&s===0?g:null;if(U){for(m=0;m{if(Z!==void 0)for(h of Z)h.a?.apply()}),LI.first=I.first&&I.first.e,LI.last=b&&b.e}function SZ(C,I,g,B){(B&1)!==0&&DQ(C.v,I),(B&2)!==0?DQ(C.i,g):C.i=g}function Nd(C,I,g,B,F,Q,A,U,l,s){var G=AU,t=(l&1)!==0,c=(l&16)===0,d=t?c?qB(F):Wg(F):F,b=(l&2)===0?A:Wg(A);CI&&t&&(d.debug=()=>{var e=typeof b=="number"?A:b.v;s()[e]});var Z={i:b,v:d,k:Q,a:null,e:null,prev:g,next:B};AU=Z;try{return Z.e=Jg(()=>U(C,d,b,s),iI),Z.e.prev=g&&g.e,Z.e.next=B&&B.e,g===null?I.first=Z:(g.next=Z,g.e.next=Z.e),B!==null&&(B.prev=Z,B.e.prev=Z.e),Z}finally{AU=G}}function Wd(C,I,g){for(var B=C.next?C.next.e.nodes_start:g,F=I?I.e.nodes_start:g,Q=C.e.nodes_start;Q!==B;){var A=jg(Q);F.before(Q),Q=A}}function mF(C,I,g){I===null?C.first=g:(I.next=g,I.e.next=g&&g.e),g!==null&&(g.prev=I,g.e.prev=I&&I.e)}function WZ(C,I,g){if(!I||I===nd(String(g??"")))return;let B,F=C.__svelte_meta?.loc;F?B=`near ${F.file}:${F.line}:${F.column}`:JC?.[YC]&&(B=`in ${JC[YC]}`),Pl(B)}function _F(C,I,g=!1,B=!1,F=!1){var Q=C,A="";sI(()=>{var U=LI;if(A===(A=I()??"")){iI&&hg();return}if(U.nodes_start!==null&&(sc(U.nodes_start,U.nodes_end),U.nodes_start=U.nodes_end=null),A!==""){if(iI){for(var l=RI.data,s=hg(),G=s;s!==null&&(s.nodeType!==8||s.data!=="");)G=s,s=jg(s);if(s===null)throw PB;CI&&!F&&WZ(s.parentNode,l,A),oC(RI,G),Q=tg(s);return}var t=A+"";g?t=`${t}`:B&&(t=`${t}`);var c=QU(t);if((g||B)&&(c=Xg(c)),oC(Xg(c),c.lastChild),g||B)for(;Xg(c);)Q.before(Xg(c));else Q.before(c)}})}function yC(C,I,...g){var B=C,F=mg,Q;UC(()=>{F!==(F=I())&&(Q&&(FC(Q),Q=null),CI&&F==null&&Mi(),Q=Jg(()=>F(B,...g)))},65536),iI&&(B=RI)}function nc(C,I,g){iI&&hg();var B=C,F,Q;UC(()=>{F!==(F=I())&&(Q&&(wC(Q),Q=null),F&&(Q=Jg(()=>g(B,F))))},65536),iI&&(B=RI)}function IF(C,I){XC(()=>{var g=C.getRootNode(),B=g.host?g:g.head??g.ownerDocument.head;if(!B.querySelector("#"+I.hash)){let F=document.createElement("style");F.id=I.hash,F.textContent=I.code,B.appendChild(F),CI&&hd(I.hash,F)}})}function ql(C,I,g){CC(()=>{var B=Cg(()=>I(C,g?.())||{});if(g&&B?.update){var F=!1,Q={};GC(()=>{var A=g();Kl(A),F&&YQ(Q,A)&&(Q=A,B.update(A))}),F=!0}if(B?.destroy)return()=>B.destroy()})}function rd(C){var I,g,B="";if(typeof C=="string"||typeof C=="number")B+=C;else if(typeof C=="object")if(Array.isArray(C)){var F=C.length;for(I=0;I=0;){var U=A+Q;(A===0||Hd.includes(B[A-1]))&&(U===B.length||Hd.includes(B[U]))?B=(A===0?"":B.substring(0,A))+B.substring(U+1):A=U}}return B===""?null:B}function Yd(C,I=!1){var g=I?" !important;":";",B="";for(var F in C){var Q=C[F];Q!=null&&Q!==""&&(B+=" "+F+": "+Q+g)}return B}function ac(C){return C[0]!=="-"||C[1]!=="-"?C.toLowerCase():C}function vd(C,I){if(I){var g="",B,F;if(Array.isArray(I)?(B=I[0],F=I[1]):B=I,C){C=String(C).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var Q=!1,A=0,U=!1,l=[];B&&l.push(...Object.keys(B).map(ac)),F&&l.push(...Object.keys(F).map(ac));var s=0,G=-1;let Z=C.length;for(var t=0;t{if(!I){if(I=!0,C.hasAttribute("value")){var B=C.value;pI(C,"value",null),C.value=B}if(C.hasAttribute("checked")){var F=C.checked;pI(C,"checked",null),C.checked=F}}};C.__on_r=g,Zd(g),jl()}}function hF(C,I){var g=Td(C);g.value===(g.value=I??void 0)||C.value===I&&(I!==0||C.nodeName!=="PROGRESS")||(C.value=I??"")}function pI(C,I,g,B){var F=Td(C);if(iI&&(F[I]=C.getAttribute(I),I==="src"||I==="srcset"||I==="href"&&C.nodeName==="LINK")){B||DZ(C,I,g??"");return}F[I]!==(F[I]=g)&&(I==="loading"&&(C[Ji]=g),g==null?C.removeAttribute(I):typeof g!="string"&&kZ(C).includes(I)?C[I]=g:C.setAttribute(I,g))}function Td(C){return C.__attributes??={[JZ]:C.nodeName.includes("-"),[vZ]:C.namespaceURI===$i}}var kd=new Map;function kZ(C){var I=kd.get(C.nodeName);if(I)return I;kd.set(C.nodeName,I=[]);for(var g,B=C,F=Element.prototype;F!==B;){g=rl(B);for(var Q in g)g[Q].set&&I.push(Q);B=xF(B)}return I}function DZ(C,I,g){CI&&(I==="srcset"&&TZ(C,g)||hc(C.getAttribute(I)??"",g)||(C.outerHTML.replace(C.innerHTML,C.innerHTML&&"..."),String(g),void 0))}function hc(C,I){return C===I?!0:new URL(C,document.baseURI).href===new URL(I,document.baseURI).href}function Dd(C){return C.split(",").map(I=>I.trim().split(" ").filter(Boolean))}function TZ(C,I){var g=Dd(C.srcset),B=Dd(I);return B.length===g.length&&B.every(([F,Q],A)=>Q===g[A][1]&&(hc(g[A][0],F)||hc(F,g[A][0])))}var wZ=Nl?()=>performance.now():()=>Date.now(),iB={tick:C=>(Nl?requestAnimationFrame:mg)(C),now:()=>wZ(),tasks:new Set};function wd(){let C=iB.now();iB.tasks.forEach(I=>{I.c(C)||(iB.tasks.delete(I),I.f())}),iB.tasks.size!==0&&iB.tick(wd)}function fd(C){let I;return iB.tasks.size===0&&iB.tick(wd),{promise:new Promise(g=>{iB.tasks.add(I={c:C,f:g})}),abort(){iB.tasks.delete(I)}}}function $l(C,I){jQ(()=>{C.dispatchEvent(new CustomEvent(I))})}function KZ(C){if(C==="float")return"cssFloat";if(C==="offset")return"cssOffset";if(C.startsWith("--"))return C;let I=C.split("-");return I.length===1?I[0]:I[0]+I.slice(1).map(g=>g[0].toUpperCase()+g.slice(1)).join("")}function zd(C){let I={},g=C.split(";");for(let B of g){let[F,Q]=B.split(":");if(!F||Q===void 0)break;let A=KZ(F.trim());I[A]=Q.trim()}return I}var PZ=C=>C;function _g(C,I,g,B){var F=(C&1)!==0,Q=(C&2)!==0,A=F&&Q,U=(C&4)!==0,l=A?"both":F?"in":"out",s,G=I.inert,t=I.style.overflow,c,d;function b(){var n=SI,h=LI;Gg(null),Sg(null);try{return s??=g()(I,B?.()??{},{direction:l})}finally{Gg(n),Sg(h)}}var Z={is_global:U,in(){if(I.inert=G,!F){d?.abort(),d?.reset?.();return}Q||c?.abort(),$l(I,"introstart"),c=Xc(I,b(),d,1,()=>{$l(I,"introend"),c?.abort(),c=s=void 0,I.style.overflow=t})},out(n){if(!Q){n?.(),s=void 0;return}I.inert=!0,$l(I,"outrostart"),d=Xc(I,b(),c,0,()=>{$l(I,"outroend"),n?.()})},stop:()=>{c?.abort(),d?.abort()}},e=LI;if((e.transitions??=[]).push(Z),F&&_l){var x=U;if(!x){for(var a=e.parent;a&&(a.f&65536)!==0;)for(;(a=a.parent)&&(a.f&16)===0;);x=!a||(a.f&32768)!==0}x&&CC(()=>{Cg(()=>Z.in())})}}function Xc(C,I,g,B,F){var Q=B===1;if(Mt(I)){var A,U=!1;return XC(()=>{if(!U){var e=I({direction:Q?"in":"out"});A=Xc(C,e,g,B,F)}}),{abort:()=>{U=!0,A?.abort()},deactivate:()=>A.deactivate(),reset:()=>A.reset(),t:()=>A.t()}}if(g?.deactivate(),!I?.duration)return F(),{abort:mg,deactivate:mg,reset:mg,t:()=>B};let{delay:l=0,css:s,tick:G,easing:t=PZ}=I;var c=[];if(Q&&g===void 0&&(G&&G(0,1),s)){var d=zd(s(0,1));c.push(d,d)}var b=()=>1-B,Z=C.animate(c,{duration:l});return Z.onfinish=()=>{var e=g?.t()??1-B;g?.abort();var x=B-e,a=I.duration*Math.abs(x),n=[];if(a>0){var h=!1;if(s)for(var m=Math.ceil(a/16.666666666666668),L=0;L<=m;L+=1){var R=e+x*t(L/m),o=zd(s(R,1-R));n.push(o),h||=o.overflow==="hidden"}h&&(C.style.overflow="hidden"),b=()=>{var y=Z.currentTime;return e+x*t(y/a)},G&&fd(()=>{if(Z.playState!=="running")return!1;var y=b();return G(y,1-y),!0})}Z=C.animate(n,{duration:a,fill:"forwards"}),Z.onfinish=()=>{b=()=>B,G?.(B,1-B),F()}},{abort:()=>{Z&&(Z.cancel(),Z.effect=null,Z.onfinish=mg)},deactivate:()=>{F=mg},reset:()=>{B===0&&G?.(1,0)},t:()=>b()}}function Sc(C,I,g=I){var B=tB();Zc(C,"input",F=>{CI&&C.type==="checkbox"&&Kt();var Q=F?C.defaultValue:C.value;if(Q=oc(C)?yc(Q):Q,g(Q),B&&Q!==(Q=I())){var A=C.selectionStart,U=C.selectionEnd;C.value=Q??"",U!==null&&(C.selectionStart=A,C.selectionEnd=Math.min(U,C.value.length))}}),(iI&&C.defaultValue!==C.value||Cg(I)==null&&C.value)&&g(oc(C)?yc(C.value):C.value),GC(()=>{CI&&C.type==="checkbox"&&Kt();var F=I();oc(C)&&F===yc(C.value)||C.type==="date"&&!F&&!C.value||F!==C.value&&(C.value=F??"")})}function oc(C){var I=C.type;return I==="number"||I==="range"}function yc(C){return C===""?null:+C}function UU(C,I,g){if(C.multiple)return jZ(C,I);for(var B of C.options){var F=Md(B);if(jt(F,I)){B.selected=!0;return}}(!g||I!==void 0)&&(C.selectedIndex=-1)}function Wc(C,I){let g=!0;CC(()=>{I&&UU(C,Cg(I),g),g=!1;var B=new MutationObserver(()=>{var F=C.__value;UU(C,F)});return B.observe(C,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),()=>{B.disconnect()}})}function jZ(C,I){for(var g of C.options)g.selected=~I.indexOf(Md(g))}function Md(C){return"__value"in C?C.__value:C.value}var Ec=class C{#I=new WeakMap;#g;#C;static entries=new WeakMap;constructor(I){this.#C=I}observe(I,g){var B=this.#I.get(I)||new Set;return B.add(g),this.#I.set(I,B),this.#B().observe(I,this.#C),()=>{var F=this.#I.get(I);F.delete(g),F.size===0&&(this.#I.delete(I),this.#g.unobserve(I))}}#B(){return this.#g??(this.#g=new ResizeObserver(I=>{for(var g of I){C.entries.set(g.target,g);for(var B of this.#I.get(g.target)||[])B(g)}}))}};var OZ=new Ec({box:"border-box"});function gs(C,I,g){var B=OZ.observe(C,()=>g(C[I]));CC(()=>(Cg(()=>g(C[I])),B))}function Kd(C,I){return C===I||C?.[sC]===I}function dB(C={},I,g,B){return CC(()=>{var F,Q;return GC(()=>{F=Q,Q=B?.()||[],Cg(()=>{C!==g(...Q)&&(I(C,...Q),F&&Kd(g(...F),C)&&I(null,...F))})}),()=>{XC(()=>{Q&&Kd(g(...Q),C)&&I(null,...Q)})}}),C}var Cs=!1,ir=Symbol();function rc(C){var I=Cs;try{return Cs=!1,[C(),Cs]}finally{Cs=I}}function jd(C){return C.ctx?.d??!1}function J(C,I,g,B){var F=(g&1)!==0,Q=!KB||(g&2)!==0,A=(g&8)!==0,U=(g&16)!==0,l=!1,s;A?[s,l]=rc(()=>C[I]):s=C[I];var G=sC in C||vA in C,t=A&&(qC(C,I)?.set??(G&&I in C&&(R=>C[I]=R)))||void 0,c=B,d=!0,b=!1,Z=()=>(b=!0,d&&(d=!1,U?c=Cg(B):c=B),c);s===void 0&&B!==void 0&&(t&&Q&&Ki(I),s=Z(),t&&t(s));var e;if(Q)e=()=>{var R=C[I];return R===void 0?Z():(d=!0,b=!1,R)};else{var x=(F?RF:KA)(()=>C[I]);x.f|=131072,e=()=>{var R=i(x);return R!==void 0&&(c=void 0),R===void 0?c:R}}if((g&4)===0)return e;if(t){var a=C.$$legacy;return function(R,o){return arguments.length>0?((!Q||!o||a||l)&&t(o?e():R),R):e()}}var n=!1,h=!1,m=qB(s),L=RF(()=>{var R=e(),o=i(m);return n?(n=!1,h=!0,o):(h=!1,m.v=R)});return A&&i(L),F||(L.equals=JQ),function(R,o){if(wA!==null&&(n=h,e(),i(m)),arguments.length>0){let y=o?i(L):Q&&A?rI(R):R;if(!L.equals(y)){if(n=!0,Y(m,y),b&&c!==void 0&&(c=y),jd(L))return R;Cg(()=>i(L))}return R}return jd(L)?L.v:i(L)}}function Od(C){return new pc(C)}var pc=class{#I;#g;constructor(I){var g=new Map,B=(Q,A)=>{var U=qB(A);return g.set(Q,U),U};let F=new Proxy({...I.props||{},$$events:{}},{get(Q,A){return i(g.get(A)??B(A,Reflect.get(Q,A)))},has(Q,A){return A===vA?!0:(i(g.get(A)??B(A,Reflect.get(Q,A))),Reflect.has(Q,A))},set(Q,A,U){return Y(g.get(A)??B(A,U),U),Reflect.set(Q,A,U)}});this.#g=(I.hydrate?uc:yB)(I.component,{target:I.target,anchor:I.anchor,props:F,context:I.context,intro:I.intro??!1,recover:I.recover}),(!I?.props?.$$host||I.sync===!1)&&KQ(),this.#I=F.$$events;for(let Q of Object.keys(this.#g))Q==="$set"||Q==="$destroy"||Q==="$on"||Pg(this,Q,{get(){return this.#g[Q]},set(A){this.#g[Q]=A},enumerable:!0});this.#g.$set=Q=>{Object.assign(F,Q)},this.#g.$destroy=()=>{$B(this.#g)}}$set(I){this.#g.$set(I)}$on(I,g){this.#I[I]=this.#I[I]||[];let B=(...F)=>g.call(this,...F);return this.#I[I].push(B),()=>{this.#I[I]=this.#I[I].filter(F=>F!==B)}}$destroy(){this.#g.$destroy()}};var se;typeof HTMLElement=="function"&&(se=class extends HTMLElement{$$ctor;$$s;$$c;$$cn=!1;$$d={};$$r=!1;$$p_d={};$$l={};$$l_u=new Map;$$me;constructor(C,I,g){super(),this.$$ctor=C,this.$$s=I,g&&this.attachShadow({mode:"open"})}addEventListener(C,I,g){if(this.$$l[C]=this.$$l[C]||[],this.$$l[C].push(I),this.$$c){let B=this.$$c.$on(C,I);this.$$l_u.set(I,B)}super.addEventListener(C,I,g)}removeEventListener(C,I,g){if(super.removeEventListener(C,I,g),this.$$c){let B=this.$$l_u.get(I);B&&(B(),this.$$l_u.delete(I))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let C=function(B){return F=>{let Q=document.createElement("slot");B!=="default"&&(Q.name=B),D(F,Q)}};if(await Promise.resolve(),!this.$$cn||this.$$c)return;let I={},g=te(this);for(let B of this.$$s)B in g&&(B==="default"&&!this.$$d.children?(this.$$d.children=C(B),I.default=!0):I[B]=C(B));for(let B of this.attributes){let F=this.$$g_p(B.name);F in this.$$d||(this.$$d[F]=Hc(F,B.value,this.$$p_d,"toProp"))}for(let B in this.$$p_d)!(B in this.$$d)&&this[B]!==void 0&&(this.$$d[B]=this[B],delete this[B]);this.$$c=Od({component:this.$$ctor,target:this.shadowRoot||this,props:{...this.$$d,$$slots:I,$$host:this}}),this.$$me=Ac(()=>{GC(()=>{this.$$r=!0;for(let B of ft(this.$$c)){if(!this.$$p_d[B]?.reflect)continue;this.$$d[B]=this.$$c[B];let F=Hc(B,this.$$d[B],this.$$p_d,"toAttribute");F==null?this.removeAttribute(this.$$p_d[B].attribute||B):this.setAttribute(this.$$p_d[B].attribute||B,F)}this.$$r=!1})});for(let B in this.$$l)for(let F of this.$$l[B]){let Q=this.$$c.$on(B,F);this.$$l_u.set(F,Q)}this.$$l={}}}attributeChangedCallback(C,I,g){this.$$r||(C=this.$$g_p(C),this.$$d[C]=Hc(C,g,this.$$p_d,"toProp"),this.$$c?.$set({[C]:this.$$d[C]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$me(),this.$$c=void 0)})}$$g_p(C){return ft(this.$$p_d).find(I=>this.$$p_d[I].attribute===C||!this.$$p_d[I].attribute&&I.toLowerCase()===C)||C}});function Hc(C,I,g,B){let F=g[C]?.type;if(I=F==="Boolean"&&typeof I!="boolean"?I!=null:I,!B||!g[C])return I;if(B==="toAttribute")switch(F){case"Object":case"Array":return I==null?null:JSON.stringify(I);case"Boolean":return I?"":null;case"Number":return I??null;default:return I}else switch(F){case"Object":case"Array":return I&&JSON.parse(I);case"Boolean":return I;case"Number":return I!=null?+I:I;default:return I}}function te(C){let I={};return C.childNodes.forEach(g=>{I[g.slot||"default"]=!0}),I}if(CI){let C=function(I){if(!(I in globalThis)){let g;Object.defineProperty(globalThis,I,{configurable:!0,get:()=>{if(g!==void 0)return g;Pi(I)},set:B=>{g=B}})}};C("$state"),C("$effect"),C("$derived"),C("$inspect"),C("$props"),C("$bindable")}function CF(C){zI===null&&fA("onMount"),KB&&zI.l!==null?Ge(zI).m.push(C):og(()=>{let I=Cg(C);if(typeof I=="function")return I})}function _d(C){zI===null&&fA("onDestroy"),CF(()=>()=>Cg(C))}function Ge(C){var I=C.l;return I.u??={a:[],b:[],m:[]}}var qd="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(qd);var ie=f("
"),de=f("");function dC(C,I){let g=J(I,"text",3,""),B=J(I,"icon",3,""),F=J(I,"tooltip",3,""),Q=J(I,"size",3,null),A=J(I,"onClick",3,()=>{}),U=J(I,"class",3,"");var l=de();let s;l.__click=function(...b){A()?.apply(this,b)};var G=O(l);{var t=b=>{var Z=ie(),e=O(Z,!0);z(Z),sI(()=>vI(e,g())),D(b,Z)};GI(G,b=>{g()&&b(t)})}var c=v(G,2);{var d=b=>{lC(b,{get icon(){return B()},get size(){return Q()}})};GI(c,b=>{B()&&b(d)})}z(l),sI(b=>{s=nI(l,1,Og(U()),null,s,b),pI(l,"aria-label",F())},[()=>({"svelcomlib-icon-text":B()})]),D(C,l)}KI(["click"]);var be=(C,I)=>I()(C.target.value,C.target),Ze=f(""),ee=f("");function bB(C,I){VI(I,!0);let g=J(I,"onChange",3,()=>{}),B=J(I,"options",19,()=>[]),F=J(I,"value",3,""),Q=J(I,"disabled",3,!1),A=J(I,"class",3,"");var U=ee();U.__change=[be,g],Wc(U,F);var l;qI(U,21,B,Qg,(s,G,t,c)=>{let d=()=>i(G).value,b=()=>i(G).text;var Z=Ze(),e={},x=O(Z,!0);z(Z),sI(()=>{e!==(e=d())&&(Z.value=(Z.__value=d())??""),vI(x,b())}),D(s,Z)}),z(U),sI(()=>{nI(U,1,Og(A()?A()+" dropdown":"dropdown")),U.disabled=Q(),l!==(l=F())&&(U.value=(U.__value=F())??"",UU(U,F()))}),D(C,U),xI()}KI(["change"]);var $d=require("obsidian");function lC(C,I){VI(I,!0);let g=J(I,"icon",3,""),B=J(I,"size",3,null),F=J(I,"stroke_width",3,null),Q=J(I,"class",3,""),A=lI(null);og(()=>{g().startsWith("{i(A)&&B()&&(typeof B()=="number"?(i(A).style.width=B()+"px",i(A).style.height=B()+"px"):Array.isArray(B())?(i(A).style.width=B()[0]+"px",i(A).style.height=B()[1]+"px"):(i(A).style.width=`var(--${B()})`,i(A).style.height=`var(--${B()})`))}),og(()=>{i(A)&&F()&&(i(A).style.strokeWidth=F()+"px")});var U=Ng(),l=yI(U);_F(l,()=>i(A)?.outerHTML??""),D(C,U),xI()}var Ve=(C,I)=>I()(C.target.value),xe=f("");function qF(C,I){VI(I,!0);let g=J(I,"type",3,"text"),B=J(I,"value",3,""),F=J(I,"placeholder",3,""),Q=J(I,"onChange",3,()=>{}),A=J(I,"valid",3,!1),U=J(I,"readonly",3,!1),l=J(I,"class",3,"");var s=xe();gF(s),s.__input=[Ve,Q];let G;sI(t=>{pI(s,"type",g()),hF(s,B()),pI(s,"placeholder",F()),s.readOnly=U(),G=nI(s,1,Og(l()),null,G,t)},[()=>({"svelcomlib-input-success":A(),"svelcomlib-input-fail":A()===!1})]),D(C,s),xI()}KI(["input"]);var ue=(C,I,g)=>{I()(g())},Le=f('');function $F(C,I){VI(I,!0);let g=J(I,"min",3,0),B=J(I,"max",3,100),F=J(I,"step",3,1),Q=J(I,"value",7,0),A=J(I,"onChange",3,()=>{}),U=J(I,"getTooltip",3,s=>s.toString());var l=Le();gF(l),l.__input=()=>{let s=document.body.lastChild;s.classList.contains("tooltip")&&(s.firstChild.textContent=U()(Q()),s.style.width="auto")},l.__change=[ue,A,Q],sI(s=>{pI(l,"min",g()),pI(l,"max",B()),pI(l,"step",F()),pI(l,"aria-label",s)},[()=>U()(Q())]),Sc(l,Q),D(C,l),xI()}KI(["input","change"]);var jY=f("");KI(["change","contextmenu"]);var Re=(C,I,g,B)=>{I()||g()(!B()),B(!B())},ne=f('
');function EI(C,I){VI(I,!0);let g=J(I,"value",7,!1),B=J(I,"onChange",3,()=>{}),F=J(I,"disabled",3,!1);var Q=ne();let A;Q.__click=[Re,F,B,g];var U=O(Q);z(Q),sI(l=>{A=nI(Q,1,"checkbox-container",null,A,l),U.disabled=F()},[()=>({"is-enabled":g()})]),D(C,Q),xI()}KI(["click"]);var g1=f(''),C1=f(' '),B1=f('
');KI(["click"]);var A1=f('
');var ae=(C,I,g,B)=>{I((I()+1)%g().length),B()()},me=f("
");function XF(C,I){VI(I,!0);let g=J(I,"states",19,()=>[]),B=J(I,"value",15,0),F=J(I,"size",3,null),Q=J(I,"onClick",3,()=>{}),A=J(I,"onContextMenu",3,()=>{}),U=J(I,"class",3,"");var l=me();l.__click=[ae,B,g,Q],l.__contextmenu=function(...d){A()?.apply(this,d)};var s=O(l);{var G=d=>{lC(d,{get icon(){return g()[B()].icon},get size(){return F()}})};GI(s,d=>{g()[B()].icon&&d(G)})}var t=v(s,2);{var c=d=>{var b=Vc();sI(()=>vI(b,g()[B()].text)),D(d,b)};GI(t,d=>{g()[B()].text&&d(c)})}z(l),sI(()=>{nI(l,1,U()+" svelcomlib-icon-text"),pI(l,"aria-label",g()[B()].tooltip)}),D(C,l),xI()}KI(["click","contextmenu"]);var i1=f("");KI(["click"]);var e1=f("
");KI(["input"]);var he=f('
'),Xe=f('
'),oe={hash:"svelte-3kpd",code:""};function lU(C,I){VI(I,!0),IF(C,oe);let g=J(I,"height",3,"100%"),B=J(I,"itemHeight",3,void 0),F=J(I,"start",7,0),Q=J(I,"end",7,0),A=rI([]),U=lI(rI([])),l=lI(void 0),s=lI(void 0),G=lI(0),t=lI(void 0),c=lI(0),d=lI(0),b=lI(0),Z=lI(0),e=BI(()=>I.items.slice(F(),Q()).map((L,R)=>({index:R+F(),data:L})));og(()=>{i(t)&&x(I.items,i(G),B())});async function x(L,R,o){L.lengthL){F(R),Y(c,o,!0);break}o+=H,R+=1}for(;RL+i(G))););Q(R);let y=I.items.length-Q();for(Y(b,o/Q());R{Y(U,i(s).getElementsByClassName("svelcomlib-virtual-list-row"),!0),Y(t,!0)});var h=Xe(),m=O(h);return qI(m,21,()=>i(e),L=>L.index,(L,R)=>{var o=he(),y=O(o);yC(y,()=>I.item,()=>i(R).data,()=>i(R).index),z(o),D(L,o)}),z(m),dB(m,L=>Y(s,L),()=>i(s)),z(h),dB(h,L=>Y(l,L),()=>i(l)),sI(()=>{gB(h,`height: ${g()??""};`),gB(m,`padding-top: ${i(c)??""}px; padding-bottom: ${i(d)??""}px; --scroll-offset: ${i(Z)??""}px`)}),vg("scroll",h,a),gs(h,"offsetHeight",L=>Y(G,L)),D(C,h),xI({scrollToIndex:n})}var Bs=require("obsidian"),Ne=f("
");function IQ(C,I){VI(I,!0);let g=J(I,"source",3,""),B=J(I,"class",3,""),F=lI(void 0);CF(async()=>{let A=new Bs.Component;await Bs.MarkdownRenderer.render(I.plugin.app,I.text,i(F),g(),A),A.load()});var Q=Ne();dB(Q,A=>Y(F,A),()=>i(F)),sI(()=>nI(Q,1,Og(B()))),D(C,Q),xI()}var re=f("Empty navheader"),pe=f('');function sU(C,I){"use strict";var g=pe(),B=O(g),F=O(B);{var Q=U=>{var l=Ng(),s=yI(l);yC(s,()=>I.container),D(U,l)},A=U=>{var l=re();D(U,l)};GI(F,U=>{I.container?U(Q):U(A,!1)})}z(B),z(g),D(C,g)}var He=f("
"),Ye=f(" ",1),Je=f('
',1);function tI(C,I){VI(I,!0);let g=J(I,"description",3,null),B=J(I,"type",3,null),F=J(I,"depth",3,0),Q=J(I,"notices",19,()=>[]),A=J(I,"class",3,""),U=BI(()=>{let R="";return F()&&(R+=" svelcomlib-"+"sub".repeat(F())+"setting"),B()==="heading"&&(R+=" svelcomlib-setting-"+"sub".repeat(F())+"heading"),R});var l=Je(),s=yI(l);let G;var t=O(s),c=O(t),d=O(c),b=O(d);_F(b,()=>I.name),z(d),z(c);var Z=v(c,2),e=O(Z);_F(e,g);var x=v(e,2);qI(x,17,Q,Qg,(R,o,y)=>{var H=Ng(),r=yI(H);{var N=T=>{var M=Ye(),q=yI(M);{var AI=XI=>{var kI=He();D(XI,kI)};GI(q,XI=>{(g()||y!==0)&&XI(AI)})}var aI=v(q,2);let uI;var ZI=O(aI);_F(ZI,()=>i(o).text),z(aI),sI(XI=>uI=nI(aI,1,"svelcomlib-notice "+(i(o).style??""),null,uI,XI),[()=>({"svelcomlib-notice-info":i(o).type==="info","svelcomlib-notice-warning":i(o).type==="warning","svelcomlib-notice-error":i(o).type==="error"})]),D(T,M)};GI(r,T=>{i(o)&&T(N)})}D(R,H)}),z(Z),z(t);var a=v(t,2),n=O(a);{var h=R=>{var o=Ng(),y=yI(o);yC(y,()=>I.control),D(R,o)};GI(n,R=>{I.control&&R(h)})}z(a),z(s);var m=v(s,2);{var L=R=>{var o=Ng(),y=yI(o);yC(y,()=>I.subcontrol),D(R,o)};GI(m,R=>{I.subcontrol&&R(L)})}sI(R=>G=nI(s,1,(A()??"")+" setting-item"+i(U),null,G,R),[()=>({"mod-dropdown":B()==="dropdown","mod-toggle":B()==="toggle","mod-slider":B()==="slider","setting-item-heading":B()==="heading"})]),D(C,l),xI()}var ve=f(" ",1);function tU(C,I){"use strict";let g=J(I,"class",3,"");var B=ve(),F=yI(B);{var Q=l=>{var s=Ng(),G=yI(s);yC(G,()=>I.header,g),D(l,s)};GI(F,l=>{I.header&&l(Q)})}var A=v(F,2);{var U=l=>{var s=Ng(),G=yI(s);yC(G,()=>I.view,g),D(l,s)};GI(A,l=>{I.view&&l(U)})}D(C,B)}var De=f(" ",1);function Fs(C,I){VI(I,!0);let g=J(I,"plugin",7),B={addition:{icon:"plus-circle",tooltip:"Additions"},deletion:{icon:"minus-square",tooltip:"Deletions"},substitution:{icon:"replace",tooltip:"Substitutions"},highlight:{icon:"highlighter",tooltip:"Highlights"},comment:{icon:"message-square",tooltip:"Comments"}},F={"":{icon:"star",tooltip:"Regular"},...B},Q=[{value:"unchanged",text:"Regular movement"},{value:"ignore_bracket",text:"Skip brackets"},{value:"ignore_metadata",text:"Skip brackets and metadata"},{value:"ignore_completely",text:"Skip completely"}],A=[{value:"unchanged",text:"Regular movement"},{value:"stay_inside",text:"Keep cursor within range"},{value:"stay_outside",text:"Treat range as word group"}];var U=De(),l=yI(U);tI(l,{name:"Functionality",type:"heading"});var s=v(l,2);tI(s,{name:"Suggestion mode",type:"heading",depth:1});var G=v(s,2);tI(G,{name:"Cursor movement",type:"heading",depth:2});var t=v(G,2);qI(t,17,()=>Object.keys(B),Qg,(a,n)=>{tI(a,{get name(){return B[i(n)].tooltip},type:"dropdown",depth:2,control:m=>{bB(m,{get value(){return g().settings.suggestion_mode_operations.cursor_movement[i(n)]},options:Q,onChange:L=>{g().settings.suggestion_mode_operations.cursor_movement[i(n)]=L,g().saveSettings()}})},$$slots:{control:!0}})});var c=v(t,2);tI(c,{name:"Bracket movement",type:"heading",depth:2});var d=v(c,2);qI(d,17,()=>Object.keys(B),Qg,(a,n)=>{tI(a,{get name(){return B[i(n)].tooltip},type:"dropdown",depth:2,control:m=>{bB(m,{get value(){return g().settings.suggestion_mode_operations.bracket_movement[i(n)]},options:A,onChange:L=>{g().settings.suggestion_mode_operations.bracket_movement[i(n)]=L,g().saveSettings()}})},$$slots:{control:!0}})});var b=v(d,2);tI(b,{name:"Suggestion mode cursor movement",description:"Determine how the cursor should move through suggestions in suggestion mode",type:"dropdown"});var Z=v(b,2);tI(Z,{name:"Rendering",type:"heading"});var e=v(Z,2);tI(e,{name:"Live Preview renderer",description:"Enable custom rendering of CriticMarkup syntax in Live Preview",type:"toggle",control:n=>{EI(n,{get value(){return g().settings.live_preview},onChange:()=>{g().settings.live_preview=!g().settings.live_preview,g().saveSettings()}})},$$slots:{control:!0}});var x=v(e,2);tI(x,{name:"Reading View renderer",description:"Enable custom rendering of CriticMarkup syntax in Reading View",type:"toggle",control:n=>{EI(n,{get value(){return g().settings.post_processor},onChange:()=>{g().settings.post_processor=!g().settings.post_processor,g().saveSettings()}})},$$slots:{control:!0}}),D(C,U),xI()}var Te=f(" ",1);function Qs(C,I){VI(I,!0);let g=J(I,"plugin",7),B=lI(rI(g().settings.comment_style)),F={inline:"Comments receive a background color and are fully visible (similar to suggestions)",icon:"Comments are displayed as icons and can be hovered over to reveal the comment",none:"Comments are not rendered in the editor, use this with the annotation gutter"};var Q=Te(),A=yI(Q);tI(A,{name:"Editing features",type:"heading"});var U=v(A,2);tI(U,{name:"Automatic tag completion",notices:[{type:"info",text:"When typing {++, the tag automatically gets completed with ++}"}],type:"toggle",control:Z=>{EI(Z,{get value(){return g().settings.tag_completion},onChange:()=>{g().settings.tag_completion=!g().settings.tag_completion,g().saveSettings()}})},$$slots:{control:!0}});var l=v(U,2);tI(l,{name:"Remove syntax on copy",description:"When copying in the editor to the clipboard, any CriticMarkup syntax is removed",notices:[{type:"info",text:"Copying my {++text++} will result in my text"}],type:"toggle",control:Z=>{EI(Z,{slot:"control",get value(){return g().settings.clipboard_remove_syntax},onChange:()=>{g().settings.clipboard_remove_syntax=!g().settings.clipboard_remove_syntax,g().saveSettings()}})},$$slots:{control:!0}});var s=v(l,2);tI(s,{name:"Automatic tag correction",description:"Dangling tags and redundant whitespaces automatically get removed to prevent invalid CriticMarkup syntax",type:"toggle",control:Z=>{EI(Z,{get value(){return g().settings.tag_correcter},onChange:()=>{g().settings.tag_correcter=!g().settings.tag_correcter,g().saveSettings()}})},$$slots:{control:!0}});var G=v(s,2);tI(G,{name:"Show style while editing",description:"Keep the style of suggestions visible while editing",type:"toggle",control:Z=>{EI(Z,{get value(){return g().settings.editor_styling},onChange:()=>{g().settings.editor_styling=!g().settings.editor_styling,g().saveSettings()}})},$$slots:{control:!0}});var t=v(G,2);tI(t,{name:"Comments Rendering",type:"heading"});var c=v(t,2);let d=BI(()=>[{type:"info",text:F[i(B)]}]);tI(c,{name:"Comment rendering mode",description:"Determine how comments are rendered inside the editor",get notices(){return i(d)},type:"dropdown",control:Z=>{bB(Z,{options:[{value:"inline",text:"Inline"},{value:"icon",text:"Icon"},{value:"none",text:"Hidden"}],get value(){return i(B)},onChange:e=>{g().settings.comment_style=e,Y(B,e,!0),g().saveSettings()}})},$$slots:{control:!0}}),D(C,Q),xI()}var we=f('
',1);function cU(C,I){VI(I,!0);let g=J(I,"plugin",7),B=lI(rI(g().settings.default_preview_mode)),F={0:"All suggestions will be visible",1:"Preview document as if all suggestions were accepted",2:"Preview document as if all suggestions were rejected"};var Q=we(),A=yI(Q);tI(A,{name:"Default Edit Mode",type:"dropdown",notices:[{type:"info",text:"When opening a new note, this will be the default editing mode"}],control:e=>{let x=BI(()=>[{value:0 .toString(),text:"Regular Edit Mode"},{value:1 .toString(),text:"Corrected Edit Mode"},{value:2 .toString(),text:"Suggestion Mode"}]),a=BI(()=>g().settings.default_edit_mode.toString());bB(e,{get options(){return i(x)},get value(){return i(a)},onChange:n=>{let h=parseInt(n);g().settings.default_edit_mode=h,g().saveSettings()}})},$$slots:{control:!0}});var U=v(A,2);let l=BI(()=>[{type:"info",text:"When opening a new note, this will be the default editing mode"},{type:"info",text:F[i(B)]}]);tI(U,{name:"Default Preview Mode",type:"dropdown",get notices(){return i(l)},control:e=>{let x=BI(()=>[{value:0 .toString(),text:"View all suggestions"},{value:1 .toString(),text:"Preview 'accept all'"},{value:2 .toString(),text:"Preview 'reject all'"}]),a=BI(()=>g().settings.default_preview_mode.toString());bB(e,{get options(){return i(x)},get value(){return i(a)},onChange:n=>{Y(B,parseInt(n),!0),g().settings.default_preview_mode=i(B),g().saveSettings()}})},$$slots:{control:!0}});var s=v(U,2);tI(s,{name:"Include Metadata Extension",type:"dropdown",notices:[{type:"info",text:"Allow inclusion of metadata for suggestions, such as authorship, time, etc."},{type:"warning",text:"Suggestion metadata is not part of the official CriticMarkup standard, this metadata will not get processed/rendered correctly in other editors"},{type:"error",text:"Toggling this setting results in a re-indexation of the entire vault"}],control:e=>{EI(e,{get value(){return g().settings.enable_metadata},onChange:x=>{g().settings.enable_metadata=x,g().saveSettings()}})},$$slots:{control:!0}});var G=v(s,2);tI(G,{name:"Database",type:"heading"});var t=v(G,2);tI(t,{name:"Database Workers",description:"Number of workers to use for database indexing",notices:[{type:"info",text:"A higher amount of workers will increase indexing speed"}],type:"slider",control:e=>{$F(e,{min:1,max:navigator.hardwareConcurrency/2,step:1,get value(){return g().settings.database_workers},onChange:x=>{g().settings.database_workers=x,g().saveSettings()}})},$$slots:{control:!0}});var c=v(t,2);tI(c,{name:"Rebuild Database",notices:[{type:"info",text:"Recommended if you're encountering issues with the view after updating"},{type:"warning",text:"In large vaults, reindexing the database may take a while"}],control:e=>{dC(e,{text:"Rebuild",onClick:async()=>{await g().database.reinitializeDatabase()}})},$$slots:{control:!0}});var d=v(c,2),b=O(d);dC(b,{class:"translator-fail",text:"REPORT BUG",icon:"bug",onClick:()=>ii(g().app,void 0,{})}),z(d),D(C,Q),xI()}var fe=f(" ",1);function As(C,I){VI(I,!0);let g=J(I,"plugin",7);var B=fe(),F=yI(B);tI(F,{name:"Editor header",type:"heading"});var Q=v(F,2);tI(Q,{name:"Full button labels",description:"Adds labels to the buttons in the editor header",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.toolbar_show_buttons_labels},onChange:()=>{g().settings.toolbar_show_buttons_labels=!g().settings.toolbar_show_buttons_labels,g().saveSettings()}})},$$slots:{control:!0}});var A=v(Q,2);tI(A,{name:"Preview mode header button",description:"Adds a button to the editor's header for quickly changing preview mode",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.toolbar_preview_button},onChange:()=>{g().settings.toolbar_preview_button=!g().settings.toolbar_preview_button,g().saveSettings()}})},$$slots:{control:!0}});var U=v(A,2);tI(U,{name:"Suggestion mode header button",description:"Adds a button to the editor's header for quickly toggling suggestion mode",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.toolbar_edit_button},onChange:()=>{g().settings.toolbar_edit_button=!g().settings.toolbar_edit_button,g().saveSettings()}})},$$slots:{control:!0}});var l=v(U,2);tI(l,{name:"Editor status bar",type:"heading"});var s=v(l,2);tI(s,{name:"Preview mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.status_bar_preview_button},onChange:()=>{g().settings.status_bar_preview_button=!g().settings.status_bar_preview_button,g().saveSettings()}})},$$slots:{control:!0}});var G=v(s,2);tI(G,{name:"Suggestion mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.status_bar_edit_button},onChange:()=>{g().settings.status_bar_edit_button=!g().settings.status_bar_edit_button,g().saveSettings()}})},$$slots:{control:!0}});var t=v(G,2);tI(t,{name:"Metadata status bar toggle",description:"Adds a status bar item for quickly toggling the inclusion of (particular) metadata",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.status_bar_metadata_button},onChange:()=>{g().settings.status_bar_metadata_button=!g().settings.status_bar_metadata_button,g().saveSettings()}})},$$slots:{control:!0}}),D(C,B),xI()}var ze=f(" ",1),Me=f(" ",1);function Us(C,I){VI(I,!0);let g=J(I,"plugin",7);var B=Me(),F=yI(B);tI(F,{name:"Add Metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_metadata},onChange:L=>{g().settings.enable_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var Q=v(F,2);tI(Q,{name:"Enable Authorship",description:"Enable rendering and processing of author metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_author_metadata},onChange:L=>{g().settings.enable_author_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var A=v(Q,2);{var U=h=>{var m=ze(),L=yI(m);tI(L,{name:"Add Author Metadata",description:"Author metadata will be added into new suggestions and comments",type:"toggle",depth:1,control:y=>{EI(y,{get value(){return g().settings.add_author_metadata},onChange:H=>{g().settings.add_author_metadata=H,g().saveSettings()}})},$$slots:{control:!0}});var R=v(L,2);tI(R,{name:"Name",depth:1,control:y=>{qF(y,{type:"text",onChange:H=>{g().settings.author=H,g().saveSettings()},get value(){return g().settings.author},set value(H){g().settings.author=H}})},$$slots:{control:!0}}),D(h,m)};GI(A,h=>{g().settings.enable_author_metadata&&h(U)})}var l=v(A,2);tI(l,{name:"Enable Timestamp",description:"Enable rendering and processing of timestamp metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_timestamp_metadata},onChange:L=>{g().settings.enable_timestamp_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var s=v(l,2);{var G=h=>{tI(h,{name:"Add Timestamp Metadata",description:"Timestamp metadata will be added into new suggestions and comments",depth:1,control:L=>{EI(L,{get value(){return g().settings.add_timestamp_metadata},onChange:R=>{g().settings.add_timestamp_metadata=R,g().saveSettings()}})},$$slots:{control:!0}})};GI(s,h=>{g().settings.enable_timestamp_metadata&&h(G)})}var t=v(s,2);tI(t,{name:"Enable Completed",description:"Enable rendering and processing of completed metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_completed_metadata},onChange:L=>{g().settings.enable_completed_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var c=v(t,2);{var d=h=>{tI(h,{name:"Add Completed Metadata",description:"Completed metadata will be added into new suggestions and comments",depth:1,control:L=>{EI(L,{get value(){return g().settings.add_completed_metadata},onChange:R=>{g().settings.add_completed_metadata=R,g().saveSettings()}})},$$slots:{control:!0}})};GI(c,h=>{g().settings.enable_completed_metadata&&h(d)})}var b=v(c,2);tI(b,{name:"Enable Style",description:"Enable rendering and processing of style metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_style_metadata},onChange:L=>{g().settings.enable_style_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var Z=v(b,2);{var e=h=>{tI(h,{name:"Add Style Metadata",description:"Style metadata will be added into new suggestions and comments",depth:1,control:L=>{EI(L,{get value(){return g().settings.add_style_metadata},onChange:R=>{g().settings.add_style_metadata=R,g().saveSettings()}})},$$slots:{control:!0}})};GI(Z,h=>{g().settings.enable_style_metadata&&h(e)})}var x=v(Z,2);tI(x,{name:"Enable Color",description:"Enable rendering and processing of color metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_color_metadata},onChange:L=>{g().settings.enable_color_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var a=v(x,2);{var n=h=>{tI(h,{name:"Add Color Metadata",description:"Color metadata will be added into new suggestions and comments",depth:1,control:L=>{EI(L,{get value(){return g().settings.add_color_metadata},onChange:R=>{g().settings.add_color_metadata=R,g().saveSettings()}})},$$slots:{control:!0}})};GI(a,h=>{g().settings.enable_color_metadata&&h(n)})}D(C,B),xI()}var Ke=f(" ",1);function ls(C,I){VI(I,!0);let g=J(I,"plugin",7);var B=Ke(),F=yI(B);tI(F,{name:"Diff gutter",type:"heading"});var Q=v(F,2);tI(Q,{name:"Enable diff gutter",description:"Display a gutter in the editor for showing changes from suggestions",notices:[{type:"info",text:"Clicking on the gutter reveals a menu for accepting/rejecting all changes within the block"}],type:"toggle",control:a=>{EI(a,{slot:"control",get value(){return g().settings.diff_gutter},onChange:()=>{g().settings.diff_gutter=!g().settings.diff_gutter,g().saveSettings()}})},$$slots:{control:!0}});var A=v(Q,2);tI(A,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no changes in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:a=>{EI(a,{slot:"control",get value(){return g().settings.diff_gutter_hide_empty},onChange:()=>{g().settings.diff_gutter_hide_empty=!g().settings.diff_gutter_hide_empty,g().saveSettings()}})},$$slots:{control:!0}});var U=v(A,2);tI(U,{name:"Annotation gutter",type:"heading"});var l=v(U,2);tI(l,{name:"Enable annotation gutter",description:"Display a gutter in the editor for annotations",type:"toggle",control:a=>{EI(a,{get value(){return g().settings.annotation_gutter},onChange:()=>{g().settings.annotation_gutter=!g().settings.annotation_gutter,g().saveSettings()}})},$$slots:{control:!0}});var s=v(l,2);tI(s,{name:"Included annotations",description:"Determine which annotations should be shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"subheading",depth:1});var G=v(s,2);qI(G,17,()=>Object.keys(JF).filter(x=>isNaN(Number(x))),Qg,(x,a)=>{let n=BI(()=>i(a).toLowerCase().replace(/\b\w/g,h=>h.toUpperCase()));tI(x,{get name(){return i(n)},type:"toggle",depth:2,control:m=>{let L=BI(()=>(g().settings.annotation_gutter_included_types&JF[i(a)])!==0);EI(m,{get value(){return i(L)},onChange:()=>{g().settings.annotation_gutter_included_types^=JF[i(a)],g().saveSettings()}})},$$slots:{control:!0}})});var t=v(G,2);tI(t,{name:"Focus annotation on selection",description:"When selecting an annotation in the editor, the corresponding annotation in the gutter will be focused",type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_focus_on_click},onChange:()=>{g().settings.annotation_gutter_focus_on_click=!g().settings.annotation_gutter_focus_on_click,g().saveSettings()}})},$$slots:{control:!0}});var c=v(t,2);tI(c,{name:"Width",description:"The width of the gutter in pixels",type:"slider",depth:1,control:a=>{$F(a,{min:100,max:500,step:50,get value(){return g().settings.annotation_gutter_width},onChange:n=>{g().settings.annotation_gutter_width=n,g().saveSettings()}})},$$slots:{control:!0}});var d=v(c,2);tI(d,{name:"Show resize handle",description:"Display a handle bar within the editor for quickly resizing the gutter",type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_resize_handle},onChange:()=>{g().settings.annotation_gutter_resize_handle=!g().settings.annotation_gutter_resize_handle,g().saveSettings()}})},$$slots:{control:!0}});var b=v(d,2);tI(b,{name:"Default fold state",description:"Determine whether the gutter is shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_default_fold_state},onChange:()=>{g().settings.annotation_gutter_default_fold_state=!g().settings.annotation_gutter_default_fold_state,g().saveSettings()}})},$$slots:{control:!0}});var Z=v(b,2);tI(Z,{name:"Show fold button",description:"Display a button within the editor for (un)folding the gutter",type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_fold_button},onChange:()=>{g().settings.annotation_gutter_fold_button=!g().settings.annotation_gutter_fold_button,g().saveSettings()}})},$$slots:{control:!0}});var e=v(Z,2);tI(e,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no annotations in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_hide_empty},onChange:()=>{g().settings.annotation_gutter_hide_empty=!g().settings.annotation_gutter_hide_empty,g().saveSettings()}})},$$slots:{control:!0}}),D(C,B),xI()}var Pe=C=>C;function je(C){let I=C-1;return I*I*I+1}function oF(C,{delay:I=0,duration:g=400,easing:B=Pe}={}){let F=+getComputedStyle(C).opacity;return{delay:I,duration:g,easing:B,css:Q=>`opacity: ${Q*F}`}}var Yc=!1;function Jc(C,{delay:I=0,duration:g=400,easing:B=je,axis:F="y"}={}){let Q=getComputedStyle(C);CI&&!Yc&&/(contents|inline|table)/.test(Q.display)&&(Yc=!0,Promise.resolve().then(()=>Yc=!1),Q.display,void 0);let A=+Q.opacity,U=F==="y"?"height":"width",l=parseFloat(Q[U]),s=F==="y"?["top","bottom"]:["left","right"],G=s.map(x=>`${x[0].toUpperCase()}${x.slice(1)}`),t=parseFloat(Q[`padding${G[0]}`]),c=parseFloat(Q[`padding${G[1]}`]),d=parseFloat(Q[`margin${G[0]}`]),b=parseFloat(Q[`margin${G[1]}`]),Z=parseFloat(Q[`border${G[0]}Width`]),e=parseFloat(Q[`border${G[1]}Width`]);return{delay:I,duration:g,easing:B,css:x=>`overflow: hidden;opacity: ${Math.min(x*20,1)*A};${U}: ${x*l}px;padding-${s[0]}: ${x*t}px;padding-${s[1]}: ${x*c}px;margin-${s[0]}: ${x*d}px;margin-${s[1]}: ${x*b}px;border-${s[0]}-width: ${x*Z}px;border-${s[1]}-width: ${x*e}px;min-${U}: 0`}}var Oe=(C,I,g,B)=>{if(C.key==="Tab"){if(C.metaKey||C.ctrlKey)return!0;C.shiftKey?I(((i(g)-1)%B.length+B.length)%B.length):I((i(g)+1)%B.length),C.preventDefault()}},_e=f('
'),qe=f("
"),$e=f('
');function GU(C,I){VI(I,!0);let g=J(I,"plugin",7),B=[{id:"general",name:"General",icon:"settings"},{id:"editor",name:"Editor",icon:"pencil"},{id:"interface",name:"Interface",icon:"layout"},{id:"gutter",name:"Gutters",icon:"sticky-note"},{id:"metadata",name:"Metadata",icon:"tags"},{id:"advanced",name:"Advanced",icon:"shield-alert"}],F=lI(rI(B.findIndex(t=>t.id===g().settings_tab))),Q=BI(()=>B[i(F)].id),A=BI(()=>{switch(i(Q)){case"general":return cU;case"editor":return Qs;case"gutter":return ls;case"advanced":return Fs;case"interface":return As;case"metadata":return Us;default:return cU}});async function U(t){Y(F,t,!0),Y(Q,B[t].id,!0),g().settings_tab=i(Q)}var l=$e(),s=O(l);s.__keydown=[Oe,U,F,B],qI(s,21,()=>B,Qg,(t,c,d)=>{let b=()=>i(c).id,Z=()=>i(c).name,e=()=>i(c).icon;var x=_e();let a;x.__click=()=>{U(d)};var n=O(x),h=O(n);lC(h,{get icon(){return e()}}),z(n);var m=v(n,2);let L;var R=O(m,!0);z(m),z(x),sI((o,y)=>{a=nI(x,1,"cmtr-settings-navigation-item",null,a,o),pI(x,"aria-label",`${Z()} settings`),L=nI(m,1,"cmtr-settings-navigation-item-text",null,L,y),vI(R,Z())},[()=>({"cmtr-settings-navigation-selected-item":i(F)===d}),()=>({"cmtr-settings-navigation-selected-item-text":i(F)!==d})]),D(t,x)}),z(s);var G=v(s,2);qQ(G,()=>i(Q),t=>{var c=qe(),d=O(c);nc(d,()=>i(A),(b,Z)=>{Z(b,{get plugin(){return g()}})}),z(c),_g(1,c,()=>Jc,()=>({duration:400,delay:400})),_g(2,c,()=>Jc,()=>({duration:400})),D(t,c)}),z(l),D(C,l),xI()}KI(["keydown","click"]);var SB=require("obsidian");var gb=require("@codemirror/state");function ss(C,I,g){let B=new SB.Menu,F=new Set(g.map(U=>U.range.type)),Q=g.length>20,A=g.length>1;if(F.has("comment")||F.has("highlight")?F.size===1&&F.has("comment")?B.addItem(U=>{U.setTitle(A?"Remove selected comment threads":"Remove comment thread").setIcon("message-square-off").setSection("close-annotation").setWarning(Q).onClick(async()=>sB(C,g,lB.bind(null,(l,s)=>"")))}):B.addItem(U=>{U.setTitle(A?"Remove selected threads":"Remove thread").setIcon("trash").setSection("close-annotation").setWarning(Q).onClick(async()=>sB(C,g,lB.bind(null,(l,s)=>"")))}):(B.addItem(U=>{U.setTitle(A?"Apply selected changes":"Apply change").setIcon("check").setSection("close-annotation").setWarning(Q).onClick(async()=>sB(C,g,lB.bind(null,(l,s)=>l.accept())))}),B.addItem(U=>{U.setTitle(A?"Reject selected changes":"Reject change").setIcon("cross").setSection("close-annotation").setWarning(Q).onClick(async()=>sB(C,g,lB.bind(null,(l,s)=>l.reject())))})),!A){let{range:U,path:l}=g[0];B.addItem(s=>{s.setTitle("Add reply").setIcon("reply").setSection("comment-handling").onClick(async G=>{let t=C.app.vault.getAbstractFileByPath(l);if(t&&t instanceof SB.TFile){let c=C.app.workspace.getLeaf(!1);await c.openLinkText(l,""),c.view instanceof SB.MarkdownView&&(pQ(c.view.editor,U),jC(c.view.editor.cm,U,!1))}})}),U.type==="comment"&&(B.addItem(s=>{s.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(async()=>{let G=C.app.vault.getAbstractFileByPath(l);if(G&&G instanceof SB.TFile){let t=C.app.workspace.getLeaf(!1);if(await t.openLinkText(l,""),t.view instanceof SB.MarkdownView){let{editor:c}=t.view;pQ(c,U),c.cm.dispatch(c.cm.state.update({selection:gb.EditorSelection.cursor(U.full_range_back),annotations:[aB.of({from:U.full_range_back,to:U.full_range_back,index:U.reply_depth})]}))}}})}),B.addItem(s=>{s.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(async()=>sB(C,g,lB.bind(null,(G,t)=>""),!1))}))}return B.addItem(U=>{U.setTitle(A?"Open in new tabs":"Open in new tab").setIcon("file-plus").setSection("open-annotation").onClick(async l=>{let s=MU(g);for(let[G,t]of Object.entries(s).slice(0,10)){let c=C.app.vault.getAbstractFileByPath(G);if(c&&c instanceof SB.TFile){let d=C.app.workspace.getLeaf(l.metaKey||l.ctrlKey||!0);await d.openLinkText(G,""),d.view instanceof SB.MarkdownView&&pQ(d.view.editor,t[0])}}})}),B.showAtMouseEvent(I),B}var G5=require("obsidian");var IV=f(" ",1),gV=f('
');function ts(C,I){VI(I,!0);let g=J(I,"menu_open",15,!1);var B=gV(),F=O(B),Q=O(F);{var A=G=>{var t=Ng(),c=yI(t);{var d=Z=>{dC(Z,{icon:"message-square-off",tooltip:"Delete comment thread",onClick:()=>sB(I.plugin,[I.entry],lB.bind(null,(e,x)=>e.accept()))})},b=Z=>{dC(Z,{icon:"cross",tooltip:"Delete comment",onClick:()=>sB(I.plugin,[I.entry],lB.bind(null,(e,x)=>e.accept()))})};GI(c,Z=>{I.entry.range.replies.length?Z(d):Z(b,!1)})}D(G,t)},U=(G,t)=>{{var c=d=>{var b=IV(),Z=yI(b);let e=BI(()=>"Accept change"+(I.entry.range.replies.length?" (and delete thread)":""));dC(Z,{icon:"check",get tooltip(){return i(e)},onClick:()=>sB(I.plugin,[I.entry],lB.bind(null,(n,h)=>n.accept()))});var x=v(Z,2);let a=BI(()=>"Reject change"+(I.entry.range.replies.length?" (and delete thread)":""));dC(x,{icon:"cross",get tooltip(){return i(a)},onClick:()=>sB(I.plugin,[I.entry],lB.bind(null,(n,h)=>n.reject()))}),D(d,b)};GI(G,d=>{I.entry.range.type!=="highlight"&&d(c)},t)}};GI(Q,G=>{I.entry.range.type==="comment"?G(A):G(U,!1)})}var l=v(Q,4);dC(l,{icon:"eye",tooltip:"View in note",onClick:async()=>{await Xl(I.plugin,I.entry)}});var s=v(l,2);dC(s,{icon:"more-vertical",tooltip:"More options",onClick:G=>{g(!0),I.moreOptionsMenu(I.plugin,G,[I.entry]).onHide(()=>{g(!1)})}}),z(F),z(B),D(C,B),xI()}var CV=(C,I,g)=>{I.onClick(C,I.row,I.index),Y(g,!0)},BV=(C,I)=>{I.onDblClick(C,I.row,I.index)},FV=(C,I,g)=>{ss(I.plugin,C,I.selected_ranges.length?I.selected_ranges:[{path:I.row.path,range:I.row.range.thread[i(g)]??I.row.range}])},QV=f(' '),AV=f(' '),UV=f('

This range is empty

'),lV=f(" ",1),sV=f('
'),tV=f(' '),cV=f(' '),GV=f('
'),iV=f('
');function vc(C,I){VI(I,!0);let g=J(I,"menu_open",15,!1),B=lI(!1),F=lI(null),Q=lI(null);function A(y){g()||(Y(F,y,!0),Y(Q,i(F),!0))}let U=BI(()=>I.selected_ranges.some(y=>y.path===I.row.path&&y.range.from===I.row.range.from));var l=iV();let s;l.__click=[CV,I,B],l.__dblclick=[BV,I],l.__contextmenu=[FV,I,F];var G=O(l);{var t=y=>{ts(y,{get plugin(){return I.plugin},get entry(){return I.row},moreOptionsMenu:ss,get menu_open(){return g()},set menu_open(H){g(H)}})};GI(G,y=>{(!g()&&i(F)===0||g()&&i(Q)===0)&&y(t)})}var c=v(G,2),d=O(c);lC(d,{size:24,get icon(){return AG[I.row.range.type]}});var b=v(d,2),Z=O(b),e=O(Z,!0);z(Z);var x=v(Z,2),a=O(x);{var n=y=>{var H=QV(),r=O(H,!0);z(H),sI(()=>vI(r,I.row.range.fields.author)),D(y,H)};GI(a,y=>{I.row.range.fields.author&&y(n)})}var h=v(a,2);{var m=y=>{var H=AV(),r=O(H,!0);z(H),sI(N=>vI(r,N),[()=>window.moment.unix(I.row.range.fields.time).format("MMM DD YYYY, HH:mm")]),D(y,H)};GI(h,y=>{I.row.range.fields.time&&y(m)})}z(x),z(b),z(c);var L=v(c,2);qQ(L,()=>I.row.range.text,y=>{var H=sV(),r=O(H);{var N=M=>{var q=UV();D(M,q)},T=M=>{var q=lV();let AI=BI(()=>I.row.range.unwrap_parts());var aI=yI(q);IQ(aI,{get plugin(){return I.plugin},get text(){return i(AI)[0]},get source(){return I.row.path},get class(){return I.row.range.fields.style}});var uI=v(aI,2);{var ZI=XI=>{IQ(XI,{get plugin(){return I.plugin},get text(){return i(AI)[1]},get source(){return I.row.path}})};GI(uI,XI=>{I.row.range.type==="substitution"&&XI(ZI)})}D(M,q)};GI(r,M=>{I.row.range.empty()?M(N):M(T,!1)})}z(H),vg("mouseenter",H,()=>{A(0)}),D(y,H)});var R=v(L,2);{var o=y=>{var H=Ng(),r=yI(H);qI(r,17,()=>I.row.range.replies,Qg,(N,T,M)=>{var q=Ng(),AI=yI(q);qQ(AI,()=>i(T).text,aI=>{var uI=GV();let ZI;var XI=O(uI);{var kI=p=>{let w=BI(()=>({path:I.row.path,range:i(T)}));ts(p,{get plugin(){return I.plugin},get entry(){return i(w)},moreOptionsMenu:ss,get menu_open(){return g()},set menu_open(QI){g(QI)}})};GI(XI,p=>{(!g()&&i(F)===M+1||g()&&i(Q)===M+1)&&p(kI)})}var mI=v(XI,2),wI=O(mI);{var gg=p=>{var w=tV(),QI=O(w,!0);z(w),sI(()=>vI(QI,i(T).fields.author)),D(p,w)};GI(wI,p=>{i(T).fields.author&&p(gg)})}var HI=v(wI,2);{var hI=p=>{var w=cV(),QI=O(w,!0);z(w),sI(FI=>vI(QI,FI),[()=>window.moment.unix(i(T).fields.time).format("MMM DD YYYY, HH:mm")]),D(p,w)};GI(HI,p=>{i(T).fields.time&&p(hI)})}z(mI);var WI=v(mI,2),rg=O(WI);let PI=BI(()=>i(T).unwrap());IQ(rg,{get plugin(){return I.plugin},get text(){return i(PI)},get source(){return I.row.path},get class(){return i(T).fields.style}}),z(WI),z(uI),sI(p=>ZI=nI(uI,1,"cmtr-view-range-reply",null,ZI,p),[()=>({"cmtr-view-range-reply-hovered":i(F)===M+1})]),vg("mouseenter",uI,()=>{A(M+1)}),D(aI,uI)}),D(N,q)}),D(y,H)};GI(R,y=>{I.row.range.replies.length&&y(o)})}z(l),sI(y=>{pI(l,"tabindex",I.index),s=nI(l,1,"cmtr-view-range",null,s,y),vI(e,I.row.path)},[()=>({"cmtr-view-range-completed":I.row.range.fields.done,"cmtr-view-range-selected":i(U)})]),vg("mouseenter",l,()=>{A(0)}),vg("mouseleave",l,()=>{A(null)}),vg("blur",l,()=>{Y(B,!1)}),D(C,l),xI()}KI(["click","dblclick","contextmenu"]);var EB=require("obsidian");var kb=require("obsidian");var Cb={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],todayBtn:"Today",clearBtn:"Clear",okBtn:"Ok",cancelBtn:"Cancel",timeView:"Show time view",backToDate:"Back to calendar view"};var Bb={theme:"sdt-calendar-colors",format:"yyyy-mm-dd",formatType:"standard",displayFormat:null,displayFormatType:null,minuteIncrement:1,weekStart:1,inputClasses:"",todayBtnClasses:"sdt-action-btn sdt-today-btn",clearBtnClasses:"sdt-action-btn sdt-clear-btn",hourOnly:!1,todayBtn:!0,clearBtn:!0,clearToggle:!0,autocommit:!0,i18n:Cb};var Fb=!1,ig=class C extends Date{#I=Wg(super.getTime());#g=new Map;#C=SI;constructor(...I){super(...I),Fb||this.#B()}#B(){Fb=!0;var I=C.prototype,g=Date.prototype,B=Object.getOwnPropertyNames(g);for(let F of B)(F.startsWith("get")||F.startsWith("to")||F==="valueOf")&&(I[F]=function(...Q){if(Q.length>0)return i(this.#I),g[F].apply(this,Q);var A=this.#g.get(F);if(A===void 0){let U=SI;Gg(this.#C),A=BI(()=>(i(this.#I),g[F].apply(this,Q))),this.#g.set(F,A),Gg(U)}return i(A)}),F.startsWith("set")&&(I[F]=function(...Q){var A=g[F].apply(this,Q);return Y(this.#I,g.getTime.call(this)),A})}};function BF(C){Y(C,C.v+1)}var Qb=Symbol(),cs=class extends URLSearchParams{#I=Wg(0);#g=Ab();#C=!1;#B(){if(!this.#g||this.#C)return;this.#C=!0;let I=this.toString();this.#g.search=I&&`?${I}`,this.#C=!1}[Qb](I){if(!this.#C){this.#C=!0;for(let g of[...super.keys()])super.delete(g);for(let[g,B]of I)super.append(g,B);BF(this.#I),this.#C=!1}}append(I,g){super.append(I,g),this.#B(),BF(this.#I)}delete(I,g){var B=super.has(I,g);super.delete(I,g),B&&(this.#B(),BF(this.#I))}get(I){return i(this.#I),super.get(I)}getAll(I){return i(this.#I),super.getAll(I)}has(I,g){return i(this.#I),super.has(I,g)}keys(){return i(this.#I),super.keys()}set(I,g){var B=super.getAll(I).join("");super.set(I,g),B!==super.getAll(I).join("")&&(this.#B(),BF(this.#I))}sort(){super.sort(),this.#B(),BF(this.#I)}toString(){return i(this.#I),super.toString()}values(){return i(this.#I),super.values()}entries(){return i(this.#I),super.entries()}[Symbol.iterator](){return this.entries()}get size(){return i(this.#I),super.size}};var dV=null;function Ab(){return dV}function gQ(C,I,g,B){if(C instanceof Date)return C;let F=B==="php"?{date:"Y-m-d",datetime:"Y-m-d H:i",datetime_s:"Y-m-d H:i:s"}:{date:"yyyy-mm-dd",datetime:"yyyy-mm-dd hh:ii",datetime_s:"yyyy-mm-dd hh:ii:ss"},Q,A;/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(C)?Q=yF.parseFormat(F.date,B):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(C)?Q=yF.parseFormat(F.datetime,B):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(C)?Q=yF.parseFormat(F.datetime_s,B):(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/.test(C)&&(A=C.match(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/)?.slice(1).filter(e=>e)),Q=yF.parseFormat(I,B));let U=A||C&&C.toString().match(yF.nonpunctuation)||[];C=new Date,C.setHours(0,0,0,0);let l={},{setters_order:s,setters_map:G}=yF.setters(B),t,c;if(U.length!==Q.parts.length&&Q.parts.includes("S")){let e=U[Q.parts.indexOf("S")-1].match(/(\d+)([a-zA-Z]+)/)?.slice(1,3);U.splice(Q.parts.indexOf("S")-1,1,...e)}if(U.length===Q.parts.length){for(var d=0,b=Q.parts.length;d14)?g.suffix[F%10-1]:g.suffix[g.suffix.length-1],p:g.meridiem.length===2?g.meridiem[C.getHours()<12?0:1]:"",h:C.getHours(),ii:(C.getMinutes()<10?"0":"")+C.getMinutes(),ss:(C.getUTCSeconds()<10?"0":"")+C.getUTCSeconds()},g.meridiem.length===2?Q.H=Q.h%12===0?12:Q.h%12:Q.H=Q.h,Q.HH=(Q.H<10?"0":"")+Q.H,Q.P=Q.p.toUpperCase(),Q.hh=(Q.h<10?"0":"")+Q.h,Q.i=Q.ii,Q.s=Q.ss,Q.dd=(Q.d<10?"0":"")+Q.d,Q.mm=(Q.m<10?"0":"")+Q.m;else if(B==="php")Q={y:C.getFullYear().toString().substring(2),Y:C.getFullYear(),F:g.months[C.getMonth()],M:g.monthsShort[C.getMonth()],n:C.getMonth()+1,t:kc(C.getFullYear(),C.getMonth()),j:C.getDate(),l:g.days[C.getDay()],D:g.daysShort[C.getDay()],w:C.getDay(),N:C.getDay()===0?7:C.getDay(),S:F%10&&F%10<4&&(F<10||F>14)?g.suffix[F%10-1]:g.suffix[g.suffix.length-1],a:g.meridiem.length===2?g.meridiem[C.getHours()<12?0:1]:"",g:C.getHours()%12===0?12:C.getHours()%12,G:C.getHours(),i:C.getMinutes(),s:C.getSeconds(),U:Math.floor(C.getTime()/1e3)},Q.m=(Q.n<10?"0":"")+Q.n,Q.d=(Q.j<10?"0":"")+Q.j,Q.A=Q.a.toString().toUpperCase(),Q.h=(Q.g<10?"0":"")+Q.g,Q.H=(Q.G<10?"0":"")+Q.G,Q.i=(Q.i<10?"0":"")+Q.i,Q.s=(Q.s<10?"0":"")+Q.s;else throw new Error("Invalid format type.");let A=[],U=yF.parseFormat(I,B);for(var l=0,s=U.parts?.length||0;lB.setHours(F),h:(B,F)=>B.setHours(F),HH:(B,F)=>B.setHours(F===12?0:F),H:(B,F)=>B.setHours(F===12?0:F),i:(B,F)=>B.setMinutes(F),s:(B,F)=>B.setSeconds(F),yyyy:(B,F)=>B.setFullYear(F),yy:(B,F)=>B.setFullYear((F<50?2e3:1900)+F),m:(B,F)=>{for(F-=1;F<0;)F+=12;for(F%=12,B.setMonth(F);B.getMonth()!==F;){if(isNaN(B.getMonth()))return B;B.setDate(B.getDate()-1)}return B},d:(B,F)=>B.setDate(F),p:(B,F)=>B.setHours(F===1&&B.getHours()<12?B.getHours()+12:B.getHours()),t:(B,F)=>B.setTime(F),mm:()=>{},M:()=>{},MM:()=>{},ii:()=>{},ss:()=>{},dd:()=>{},D:()=>{},DD:()=>{},P:()=>{}},g.mm=g.M=g.MM=g.m,g.ii=g.i,g.ss=g.s,g.dd=g.D=g.DD=g.d,g.P=g.p):(I=["Y","yy","m","M","F","n","d","D","j","l","N","S","H","G","h","g","i","s","p","P","U"],g={H:(B,F)=>B.setHours(F),G:(B,F)=>B.setHours(F),h:(B,F)=>B.setHours(F===12?0:F),g:(B,F)=>B.setHours(F===12?0:F),i:(B,F)=>B.setMinutes(F),s:(B,F)=>B.setSeconds(F),Y:(B,F)=>B.setFullYear(F),yy:(B,F)=>B.setFullYear((F<50?2e3:1900)+F),m:(B,F)=>{for(F-=1;F<0;)F+=12;for(F%=12,B.setMonth(F);B.getMonth()!==F;){if(isNaN(B.getMonth()))return B;B.setDate(B.getDate()-1)}return B},n:(B,F)=>B.setMonth(F-1),d:(B,F)=>B.setDate(F),a:(B,F)=>B.setHours(F===1?B.getHours()+12:B.getHours()),U:(B,F)=>B.setTime(F*1e3)},g.F=g.M=g.m,g.D=g.j=g.l=g.N=g.d,g.A=g.a),{setters_order:I,setters_map:g}}};function Ub(C,I,g,B,F){if(g===0){let L=10,R=20,o=-1,y=[],H=[],r=C.getFullYear()-C.getFullYear()%10;r-=r%20?12:10,r%10&&(L=12,R=22);for(let T=0;T<32;T++)H.push(r+T),H.length===4&&(y.push(H),H=[]);let N=[];return I[0]||(I[0]=new Date),I[0].getFullYear()>=r&&N.push(I[0].getFullYear()%r),{years:y,todayMark:o,nextFrom:R,prevTo:L,selectionMark:N}}if(g===1){let L=[],R=[],o=12,y=24,H=C.toISOString().split("T")[0].substring(0,8),r=new Date(H+"01 00:00:00"),N=r.getFullYear()-1;r.setFullYear(N);let T=0;for(let q=0;q<3;q++){for(let AI=0;AI<12;AI++)r.setMonth(AI),R.push(B.monthsShort[AI%12]),R.length===4&&(L.push(R),R=[]);r.setFullYear(r.getFullYear()+1)}let M=[];return I[0]||(I[0]=new Date),I[0].getFullYear()-N>=0&&I[0].getFullYear()-N<=2&&M.push(I[0].getMonth()+(I[0].getFullYear()-N||0)*12),{months:L,todayMark:T,nextFrom:y,prevTo:o,selectionMark:M}}let Q=C||new Date,A=Q.getFullYear(),U=Q.getMonth(),l=Q.getDate(),s=Q.getHours(),G=new Date,t=new Date(A,U-1,28,0,0,0,0),c=kc(t.getFullYear(),t.getMonth());t.setDate(c),t.setDate(c-(t.getDay()-F+7)%7);let d=new Date(t);d.setDate(d.getDate()+42);let b=d.valueOf(),Z=[],e=[],x=-1,a=[],n=0,h=42,m=0;for(;t.valueOf()A||t.getFullYear()===A&&t.getMonth()>U)&&(h=m-1),t.setDate(t.getDate()+1),t.getFullYear()===G.getFullYear()&&t.getMonth()===G.getMonth()&&t.getDate()===G.getDate()&&(x=m),a.length!==I.length&&I.map(L=>{t.getFullYear()===L.getFullYear()&&t.getMonth()===L.getMonth()&&t.getDate()===L.getDate()&&a.push(m)}),e.length===7&&(Z.push(e),e=[]);return{grid:Z,days:Z,todayMark:x,prevTo:n,nextFrom:h,selectionMark:a}}function lb(C){let I=C-1;return I*I*I+1}function sb(C,{duration:I=400,start:g=0,end:B=1,opacity:F=0}){let Q=getComputedStyle(C),A=+Q.opacity,U=Q.transform==="none"?"":Q.transform,l=1-g,s=A*(1-F);return B=B||1,{delay:0,duration:I,easing:lb,css:(G,t)=>` - transform: ${U} scale(${B!==1?g+B*t:1-l*t}); - opacity: ${A-s*t}; - `}}function ZV(C,I,g,B,F,Q,A,U){if(Y(I,-1),Y(g,!0),i(B)&&jA(B,-1),i(B)===0){let l=Math.floor(i(F).getFullYear()/10)*10%20===0;Y(Q,l?A:U,!0)}}function eV(C,I){I.onswitch?.("time")}var VV=f(''),xV=(C,I)=>I(-1),uV=(C,I)=>I(1),LV=(C,I,g)=>{I(i(g))},RV=f(''),nV=f(''),aV=f('
'),mV=(C,I,g)=>{I(i(g))},hV=f(''),XV=f(''),oV=f('
'),yV=f(' '),SV=(C,I,g)=>{I(i(g))},WV=f(''),EV=f(""),NV=f('
'),rV=f('
',1),pV={hash:"svelte-s6uyff",code:`td.svelte-s6uyff,th.svelte-s6uyff {padding:0;border-width:0;}.sdt-cal-td.svelte-s6uyff {padding:0;font-size:90%;text-align:center; +https://svelte.dev/e/hydration_failed`);throw i.name="Svelte error",i}else throw new Error("https://svelte.dev/e/hydration_failed")}function rp(){if(it){let i=new Error("invalid_snippet\nCould not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\nhttps://svelte.dev/e/invalid_snippet");throw i.name="Svelte error",i}else throw new Error("https://svelte.dev/e/invalid_snippet")}function sp(i){if(it){let t=new Error(`props_invalid_value +Cannot do \`bind:${i}={undefined}\` when \`${i}\` has a fallback value +https://svelte.dev/e/props_invalid_value`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/props_invalid_value")}function op(i){if(it){let t=new Error(`rune_outside_svelte +The \`${i}\` rune is only available inside \`.svelte\` and \`.svelte.js/ts\` files +https://svelte.dev/e/rune_outside_svelte`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/rune_outside_svelte")}function ap(){if(it){let i=new Error("state_descriptors_fixed\nProperty descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\nhttps://svelte.dev/e/state_descriptors_fixed");throw i.name="Svelte error",i}else throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function lp(){if(it){let i=new Error("state_prototype_fixed\nCannot set prototype of `$state` object\nhttps://svelte.dev/e/state_prototype_fixed");throw i.name="Svelte error",i}else throw new Error("https://svelte.dev/e/state_prototype_fixed")}function up(){if(it){let i=new Error("state_unsafe_mutation\nUpdating state inside a derived or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\nhttps://svelte.dev/e/state_unsafe_mutation");throw i.name="Svelte error",i}else throw new Error("https://svelte.dev/e/state_unsafe_mutation")}var Kn=!1,Cn=!1;var Sr="[",Mr="[!",Xr="]",Jn={};var we=Symbol(),Li=Symbol("filename"),hp=Symbol("hmr"),cp="http://www.w3.org/1999/xhtml";var y0=[];function Jo(i,t=!1){if(it&&!t){let e=[],n=Ko(i,new Map,"",e);if(e.length===1&&e[0]==="");else if(e.length>0){let r=e.length>10?e.slice(0,7):e.slice(0,10),s=e.length-r.length,o=r.map(a=>`- ${a}`).join(` +`);s>0&&(o+=` +- ...and ${s} more`)}return n}return Ko(i,new Map,"",y0)}function Ko(i,t,e,n,r=null){if(typeof i=="object"&&i!==null){var s=t.get(i);if(s!==void 0)return s;if(i instanceof Map)return new Map(i);if(i instanceof Set)return new Set(i);if(Qi(i)){var o=Array(i.length);t.set(i,o),r!==null&&t.set(r,o);for(var a=0;a{n.d=!0}),it&&(Gt.function=e,Bi=e)}function _t(i){let t=Gt;if(t!==null){i!==void 0&&(t.x=i);let o=t.e;if(o!==null){var e=yt,n=Ct;t.e=null;try{for(var r=0;r{var u=Ct;ce(o);var f=l();return ce(u),f};return n&&e.set("length",at(i.length,s)),new Proxy(i,{defineProperty(l,u,f){(!("value"in f)||f.configurable===!1||f.enumerable===!1||f.writable===!1)&&ap();var h=e.get(u);return h===void 0?(h=a(()=>at(f.value,s)),e.set(u,h)):P(h,a(()=>Rt(f.value))),!0},deleteProperty(l,u){var f=e.get(u);if(f===void 0)u in l&&(e.set(u,a(()=>at(we,s))),sc(r));else{if(n&&typeof u=="string"){var h=e.get("length"),c=Number(u);Number.isInteger(c)&&cat(Rt(c?l[u]:we),s)),e.set(u,h)),h!==void 0){var p=d(h);return p===we?void 0:p}return Reflect.get(l,u,f)},getOwnPropertyDescriptor(l,u){var f=Reflect.getOwnPropertyDescriptor(l,u);if(f&&"value"in f){var h=e.get(u);h&&(f.value=d(h))}else if(f===void 0){var c=e.get(u),p=c?.v;if(c!==void 0&&p!==we)return{enumerable:!0,configurable:!0,value:p,writable:!0}}return f},has(l,u){if(u===ui)return!0;var f=e.get(u),h=f!==void 0&&f.v!==we||Reflect.has(l,u);if(f!==void 0||yt!==null&&(!h||Zi(l,u)?.writable)){f===void 0&&(f=a(()=>at(h?Rt(l[u]):we,s)),e.set(u,f));var c=d(f);if(c===we)return!1}return h},set(l,u,f,h){var c=e.get(u),p=u in l;if(n&&u==="length")for(var g=f;gat(we,s)),e.set(g+"",m))}c===void 0?(!p||Zi(l,u)?.writable)&&(c=a(()=>at(void 0,s)),P(c,a(()=>Rt(f))),e.set(u,c)):(p=c.v!==we,P(c,a(()=>Rt(f))));var v=Reflect.getOwnPropertyDescriptor(l,u);if(v?.set&&v.set.call(h,f),!p){if(n&&typeof u=="string"){var _=e.get("length"),S=Number(u);Number.isInteger(S)&&S>=_.v&&P(_,S+1)}sc(r)}return!0},ownKeys(l){d(r);var u=Reflect.ownKeys(l).filter(c=>{var p=e.get(c);return p===void 0||p.v!==we});for(var[f,h]of e)h.v!==we&&!(f in l)&&u.push(f);return u},setPrototypeOf(){lp()}})}function sc(i,t=1){P(i,i.v+t)}function qs(i){try{if(i!==null&&typeof i=="object"&&ui in i)return i[ui]}catch{}return i}function oc(i,t){return Object.is(qs(i),qs(t))}function Er(i){var t=2050,e=Ct!==null&&(Ct.f&2)!==0?Ct:null;yt===null||e!==null&&(e.f&256)!==0?t|=256:yt.f|=1048576;let n={ctx:Gt,deps:null,effects:null,equals:Wl,f:t,fn:i,reactions:null,rv:0,v:null,wv:0,parent:e??yt};return it&&Cn&&(n.created=Xn("CreatedAt")),n}function nt(i){let t=Er(i);return Yl(t),t}function ia(i){let t=Er(i);return t.equals=Gs,t}function Ul(i){var t=i.effects;if(t!==null){i.effects=null;for(var e=0;e0){let n=Array.from(Qr);for(let r of n)(r.f&1024)!==0&&ri(r,4096),Tr(r)&&js(r);Qr.clear()}}return t}function ra(i,t=1){var e=d(i),n=t===1?e++:e--;return P(i,e),n}function pp(i,t){var e=i.reactions;if(e!==null)for(var n=dn(),r=e.length,s=0;s{i.indexOf=e,i.lastIndexOf=n,i.includes=r}}var dc,bp,sa,_p,wp;function Kl(){if(dc===void 0){dc=window,bp=document,sa=/Firefox/.test(navigator.userAgent);var i=Element.prototype,t=Node.prototype,e=Text.prototype;_p=Zi(t,"firstChild").get,wp=Zi(t,"nextSibling").get,ic(i)&&(i.__click=void 0,i.__className=void 0,i.__attributes=null,i.__style=void 0,i.__e=void 0),ic(e)&&(e.__t=void 0),it&&(i.__svelte_meta=null,vp())}}function Mi(i=""){return document.createTextNode(i)}function Ee(i){return _p.call(i)}function je(i){return wp.call(i)}function J(i,t){if(!ft)return Ee(i);var e=Ee(xt);if(e===null)e=xt.appendChild(Mi());else if(t&&e.nodeType!==3){var n=Mi();return e?.before(n),ue(n),n}return ue(e),e}function Et(i,t){if(!ft){var e=Ee(i);return e instanceof Comment&&e.data===""?je(e):e}if(t&&xt?.nodeType!==3){var n=Mi();return xt?.before(n),ue(n),n}return xt}function F(i,t=1,e=!1){let n=ft?xt:i;for(var r;t--;)r=n,n=je(n);if(!ft)return n;var s=n?.nodeType;if(e&&s!==3){var o=Mi();return n===null?r?.after(o):n.before(o),ue(o),o}return ue(n),n}function oa(i){i.textContent=""}function xp(i){yt===null&&Ct===null&&ep(i),Ct!==null&&(Ct.f&256)!==0&&yt===null&&tp(),ts&&Zd(i)}function S0(i,t){var e=t.last;e===null?t.last=t.first=i:(e.next=i,i.prev=e,t.last=i)}function is(i,t,e,n=!0){var r=yt;if(it)for(;r!==null&&(r.f&262144)!==0;)r=r.parent;var s={ctx:Gt,deps:null,nodes_start:null,nodes_end:null,f:i|2048,first:null,fn:t,last:null,next:null,parent:r,prev:null,teardown:null,transitions:null,wv:0};if(it&&(s.component_function=Bi),e)try{js(s),s.f|=32768}catch(l){throw ni(s),l}else t!==null&&Ys(s);var o=e&&s.deps===null&&s.first===null&&s.nodes_start===null&&s.teardown===null&&(s.f&1048704)===0;if(!o&&n&&(r!==null&&S0(s,r),Ct!==null&&(Ct.f&2)!==0)){var a=Ct;(a.effects??=[]).push(s)}return s}function Si(i){let t=is(8,null,!1);return ri(t,1024),t.teardown=i,t}function Te(i){xp("$effect");var t=yt!==null&&(yt.f&32)!==0&&Gt!==null&&!Gt.m;if(it&&Ue(i,"name",{value:"$effect"}),t){var e=Gt;(e.e??=[]).push({fn:i,effect:yt,reaction:Ct})}else{var n=ei(i);return n}}function vc(i){let t=is(64,i,!0);return()=>{ni(t)}}function kp(i){let t=is(64,i,!0);return(e={})=>new Promise(n=>{e.outro?Gi(t,()=>{ni(t),n(void 0)}):(ni(t),n(void 0))})}function ei(i){return is(4,i,!1)}function fi(i){return is(8,i,!0)}function ct(i,t=[],e=Er){let n=t.map(e),r=()=>i(...n.map(d));return it&&Ue(r,"name",{value:"{expression}"}),oi(r)}function oi(i,t=0){return is(24|t,i,!0)}function Ne(i,t=!0){return is(40,i,!0,t)}function bc(i){var t=i.teardown;if(t!==null){let e=ts,n=Ct;pc(!0),ce(null);try{t.call(null)}finally{pc(e),ce(n)}}}function _c(i,t=!1){var e=i.first;for(i.first=i.last=null;e!==null;){var n=e.next;(e.f&64)!==0?e.parent=null:ni(e,t),e=n}}function Sp(i){for(var t=i.first;t!==null;){var e=t.next;(t.f&32)===0&&ni(t),t=e}}function ni(i,t=!0){var e=!1;(t||(i.f&524288)!==0)&&i.nodes_start!==null&&(wc(i.nodes_start,i.nodes_end),e=!0),_c(i,t&&!e),la(i,0),ri(i,16384);var n=i.transitions;if(n!==null)for(let s of n)s.stop();bc(i);var r=i.parent;r!==null&&r.first!==null&&yc(i),it&&(i.component_function=null),i.next=i.prev=i.teardown=i.ctx=i.deps=i.fn=i.nodes_start=i.nodes_end=null}function wc(i,t){for(;i!==null;){var e=i===t?null:je(i);i.remove(),i=e}}function yc(i){var t=i.parent,e=i.prev,n=i.next;e!==null&&(e.next=n),n!==null&&(n.prev=e),t!==null&&(t.first===i&&(t.first=n),t.last===i&&(t.last=e))}function Gi(i,t){var e=[];Xl(i,e,!0),xc(e,()=>{ni(i),t&&t()})}function xc(i,t){var e=i.length;if(e>0){var n=()=>--e||t();for(var r of i)r.out(n)}else t()}function Xl(i,t,e){if((i.f&8192)===0){if(i.f^=8192,i.transitions!==null)for(let o of i.transitions)(o.is_global||e)&&t.push(o);for(var n=i.first;n!==null;){var r=n.next,s=(n.f&65536)!==0||(n.f&32)!==0;Xl(n,t,s?e:!1),n=r}}}function Ar(i){Mp(i,!0)}function Mp(i,t){if((i.f&8192)!==0){i.f^=8192,(i.f&1024)===0&&(i.f^=1024),Tr(i)&&(ri(i,2048),Ys(i));for(var e=i.first;e!==null;){var n=e.next,r=(e.f&65536)!==0||(e.f&32)!==0;Mp(e,r?t:!1),e=n}if(i.transitions!==null)for(let s of i.transitions)(s.is_global||t)&&s.in()}}var M0=typeof requestIdleCallback>"u"?i=>setTimeout(i,1):requestIdleCallback,ua=[],ha=[];function Ep(){var i=ua;ua=[],jo(i)}function Tp(){var i=ha;ha=[],jo(i)}function Ei(i){ua.length===0&&queueMicrotask(Ep),ua.push(i)}function Ap(i){ha.length===0&&M0(Tp),ha.push(i)}function kc(){ua.length>0&&Ep(),ha.length>0&&Tp()}var Cp=new WeakSet,Ql=!1,da=!1,ca=null,ns=!1,ts=!1;function pc(i){ts=i}var fa=[],Ec=[],Ct=null,en=!1;function ce(i){Ct=i}var yt=null;function Ce(i){yt=i}var On=null;function Yl(i){Ct!==null&&Ct.f&2097152&&(On===null?On=[i]:On.push(i))}var di=null,qi=0,Hi=null;function gp(i){Hi=i}var Rp=1,tu=0,Qn=!1,Qo=null;function na(){return++Rp}function Tr(i){var t=i.f;if((t&2048)!==0)return!0;if((t&4096)!==0){var e=i.deps,n=(t&256)!==0;if(e!==null){var r,s,o=(t&512)!==0,a=n&&yt!==null&&!Qn,l=e.length;if(o||a){var u=i,f=u.parent;for(r=0;ri.wv)return!0}(!n||yt!==null&&!Qn)&&ri(i,1024)}return!1}function E0(i,t){for(var e=t;e!==null;){if((e.f&128)!==0)try{e.fn(i);return}catch{e.f^=128}e=e.parent}throw Ql=!1,i}function Op(i){return(i.f&16384)===0&&(i.parent===null||(i.parent.f&128)===0)}function Xs(i,t,e,n){if(Ql){if(e===null&&(Ql=!1),Op(t))throw i;return}if(e!==null&&(Ql=!0),it&&n!==null&&i instanceof Error&&!Cp.has(i)){Cp.add(i);let s=[],o=t.fn?.name;o&&s.push(o);let a=n;for(;a!==null;){var r=a.function?.[Li];if(r){let f=r.split("/").pop();s.push(f)}a=a.p}let l=sa?" ":" ";Ue(i,"message",{value:i.message+` +${s.map(f=>` +${l}in ${f}`).join("")} +`}),Ue(i,"component_stack",{value:s});let u=i.stack;if(u){let f=u.split(` +`),h=[];for(let c=0;c0)for(h.length=qi+di.length,c=0;c0;){t++>1e3&&A0();var e=fa,n=e.length;fa=[];for(var r=0;r0;)da=!0,Mc(),kc();return t}async function Zs(){await Promise.resolve(),Qs()}function d(i){var t=i.f,e=(t&2)!==0;if(Qo!==null&&Qo.add(i),Ct!==null&&!en){if(!On?.includes(i)){var n=Ct.deps;i.rv>>0).toString(36)}var R0=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected","webkitdirectory","defer","disablepictureinpicture","disableremoteplayback"];var fE=[...R0,"formNoValidate","isMap","noModule","playsInline","readOnly","value","volume","defaultValue","defaultChecked","srcObject","noValidate","allowFullscreen","disablePictureInPicture","disableRemotePlayback"];var I0=["touchstart","touchmove"];function Np(i){return I0.includes(i)}function nu(i){return i?.replace(/\//g,"/\u200B")}var Lp=new Map;function Bp(i,t){var e=Lp.get(i);e||(e=new Set,Lp.set(i,e)),e.add(t)}var Fp=!1;function ru(){Fp||(Fp=!0,document.addEventListener("reset",i=>{Promise.resolve().then(()=>{if(!i.defaultPrevented)for(let t of i.target.elements)t.__on_r?.()})},{capture:!0}))}function to(i){var t=Ct,e=yt;ce(null),Ce(null);try{return i()}finally{ce(t),Ce(e)}}function Tc(i,t,e,n=e){i.addEventListener(t,()=>to(e));let r=i.__on_r;r?i.__on_r=()=>{r(),n(!0)}:i.__on_r=()=>n(!0),ru()}var Ac=new Set,su=new Set;function Hp(i,t,e,n={}){function r(s){if(n.capture||eo.call(t,s),!s.cancelBubble)return to(()=>e?.call(this,s))}return i.startsWith("pointer")||i.startsWith("touch")||i==="wheel"?Ei(()=>{t.addEventListener(i,r,n)}):t.addEventListener(i,r,n),r}function Le(i,t,e,n,r){var s={capture:n,passive:r},o=Hp(i,t,e,s);(t===document.body||t===window||t===document)&&Si(()=>{t.removeEventListener(i,o,s)})}function jt(i){for(var t=0;t{throw S});throw c}}finally{i.__root=t,delete i.currentTarget,ce(f),Ce(h)}}}var P0;function Vp(){P0=void 0}function pa(i){var t=document.createElement("template");return t.innerHTML=i,t.content}function Ti(i,t){var e=yt;e.nodes_start===null&&(e.nodes_start=i,e.nodes_end=t)}function G(i,t){var e=(t&1)!==0,n=(t&2)!==0,r,s=!i.startsWith("");return()=>{if(ft)return Ti(xt,null),xt;r===void 0&&(r=pa(s?i:""+i),e||(r=Ee(r)));var o=n||sa?document.importNode(r,!0):r.cloneNode(!0);if(e){var a=Ee(o),l=o.lastChild;Ti(a,l)}else Ti(o,o);return o}}function Cc(i=""){if(!ft){var t=Mi(i+"");return Ti(t,t),t}var e=xt;return e.nodeType!==3&&(e.before(e=Mi()),ue(e)),Ti(e,e),e}function $e(){if(ft)return Ti(xt,null),xt;var i=document.createDocumentFragment(),t=document.createComment(""),e=Mi();return i.append(t,e),Ti(t,e),i}function V(i,t){if(ft){yt.nodes_end=xt,Me();return}i!==null&&i.before(t)}var ou=!0;function Wt(i,t){var e=t==null?"":typeof t=="object"?t+"":t;e!==(i.__t??=i.nodeValue)&&(i.__t=e,i.nodeValue=e+"")}function Dn(i,t){return zp(i,t)}function Dc(i,t){Kl(),t.intro=t.intro??!1;let e=t.target,n=ft,r=xt;try{for(var s=Ee(e);s&&(s.nodeType!==8||s.data!==Sr);)s=je(s);if(!s)throw Jn;si(!0),ue(s),Me();let o=zp(i,{...t,anchor:s});if(xt===null||xt.nodeType!==8||xt.data!==Xr)throw Jn;return si(!1),o}catch(o){if(o===Jn)return t.recover===!1&&np(),Kl(),oa(e),si(!1),Dn(i,t);throw o}finally{si(n),ue(r),Vp()}}var io=new Map;function zp(i,{target:t,anchor:e,props:n={},events:r,context:s,intro:o=!0}){Kl();var a=new Set,l=h=>{for(var c=0;c{var h=e??t.appendChild(Mi());return Ne(()=>{if(s){bt({});var c=Gt;c.c=s}r&&(n.$$events=r),ft&&Ti(h,null),ou=o,u=i(h,n)||{},ou=!0,ft&&(yt.nodes_end=xt),s&&_t()}),()=>{for(var c of a){t.removeEventListener(c,eo);var p=io.get(c);--p===0?(document.removeEventListener(c,eo),io.delete(c)):io.set(c,p)}su.delete(l),h!==e&&h.parentNode?.removeChild(h)}});return Oc.set(u,f),u}var Oc=new WeakMap;function er(i,t){let e=Oc.get(i);return e?(Oc.delete(i),e(t)):(it&&void 0,Promise.resolve())}function pt(i,t,[e,n]=[0,0]){ft&&e===0&&Me();var r=i,s=null,o=null,a=we,l=e>0?65536:0,u=!1;let f=(c,p=!0)=>{u=!0,h(p,c)},h=(c,p)=>{if(a===(a=c))return;let g=!1;if(ft&&n!==-1){if(e===0){let v=r.data;v===Sr?n=0:v===Mr?n=1/0:(n=parseInt(v.substring(1)),n!==n&&(n=a?1/0:-1))}let m=n>e;!!a===m&&(r=es(),ue(r),si(!1),g=!0,n=-1)}a?(s?Ar(s):p&&(s=Ne(()=>p(r))),o&&Gi(o,()=>{o=null})):(o?Ar(o):p&&(o=Ne(()=>p(r,[e+1,n]))),s&&Gi(s,()=>{s=null})),g&&si(!0)};oi(()=>{u=!1,t(f),u||h(null,null)},l),ft&&(r=xt)}function no(i,t,e){ft&&Me();var n=i,r=we,s,o=dn()?Xd:zs;oi(()=>{o(r,r=t())&&(s&&Gi(s),s=Ne(()=>e(n)))}),ft&&(n=xt)}var ga=null;function se(i,t){return t}function V0(i,t,e,n){for(var r=[],s=t.length,o=0;o0&&r.length===0&&e!==null;if(a){var l=e.parentNode;oa(l),l.append(e),n.clear(),Cr(i,t[0].prev,t[s-1].next)}xc(r,()=>{for(var u=0;u{var p=e();return Qi(p)?p:p==null?[]:Uo(p)});oi(()=>{var p=d(c),g=p.length;if(h&&g===0)return;h=g===0;let m=!1;if(ft){var v=o.data===Mr;v!==(g===0)&&(o=es(),ue(o),si(!1),m=!0)}if(ft){for(var _=null,S,k=0;k0&&ue(es())}ft||z0(p,a,o,r,t,n,e),s!==null&&(g===0?f?Ar(f):f=Ne(()=>s(o)):f!==null&&Gi(f,()=>{f=null})),m&&si(!0),d(c)}),ft&&(o=xt)}function z0(i,t,e,n,r,s,o){var a=(r&8)!==0,l=(r&3)!==0,u=i.length,f=t.items,h=t.first,c=h,p,g=null,m,v=[],_=[],S,k,E,M;if(a)for(M=0;M0){var z=(r&4)!==0&&u===0?e:null;if(a){for(M=0;M{if(m!==void 0)for(E of m)E.a?.apply()}),yt.first=t.first&&t.first.e,yt.last=g&&g.e}function G0(i,t,e,n){(n&1)!==0&&Us(i.v,t),(n&2)!==0?Us(i.i,e):i.i=e}function Wp(i,t,e,n,r,s,o,a,l,u){var f=ga,h=(l&1)!==0,c=(l&16)===0,p=h?c?tr(r):Oe(r):r,g=(l&2)===0?o:Oe(o);it&&h&&(p.debug=()=>{var v=typeof g=="number"?o:g.v;u()[v]});var m={i:g,v:p,k:s,a:null,e:null,prev:e,next:n};ga=m;try{return m.e=Ne(()=>a(i,p,g,u),ft),m.e.prev=e&&e.e,m.e.next=n&&n.e,e===null?t.first=m:(e.next=m,e.e.next=m.e),n!==null&&(n.prev=m,n.e.prev=m.e),m}finally{ga=f}}function Gp(i,t,e){for(var n=i.next?i.next.e.nodes_start:e,r=t?t.e.nodes_start:e,s=i.e.nodes_start;s!==n;){var o=je(s);r.before(s),s=o}}function Cr(i,t,e){t===null?i.first=e:(t.next=e,t.e.next=e&&e.e),e!==null&&(e.prev=t,e.e.prev=t&&t.e)}function q0(i,t,e){if(!t||t===Pp(String(e??"")))return;let n,r=i.__svelte_meta?.loc;r?n=`near ${r.file}:${r.line}:${r.column}`:Bi?.[Li]&&(n=`in ${Bi[Li]}`),nu(n)}function $n(i,t,e=!1,n=!1,r=!1){var s=i,o="";ct(()=>{var a=yt;if(o===(o=t()??"")){ft&&Me();return}if(a.nodes_start!==null&&(wc(a.nodes_start,a.nodes_end),a.nodes_start=a.nodes_end=null),o!==""){if(ft){for(var l=xt.data,u=Me(),f=u;u!==null&&(u.nodeType!==8||u.data!=="");)f=u,u=je(u);if(u===null)throw Jn;it&&!r&&q0(u.parentNode,l,o),Ti(xt,f),s=ue(u);return}var h=o+"";e?h=`${h}`:n&&(h=`${h}`);var c=pa(h);if((e||n)&&(c=Ee(c)),Ti(Ee(c),c.lastChild),e||n)for(;Ee(c);)s.before(Ee(c));else s.before(c)}})}function Ai(i,t,...e){var n=i,r=Se,s;oi(()=>{r!==(r=t())&&(s&&(ni(s),s=null),it&&r==null&&rp(),s=Ne(()=>r(n,...e)))},65536),ft&&(n=xt)}function Ic(i,t,e){ft&&Me();var n=i,r,s;oi(()=>{r!==(r=t())&&(s&&(Gi(s),s=null),r&&(s=Ne(()=>e(n,r))))},65536),ft&&(n=xt)}function ir(i,t){Ei(()=>{var e=i.getRootNode(),n=e.host?e:e.head??e.ownerDocument.head;if(!n.querySelector("#"+t.hash)){let r=document.createElement("style");r.id=t.hash,r.textContent=t.code,n.appendChild(r),it&&Bp(t.hash,r)}})}function au(i,t,e){ei(()=>{var n=ie(()=>t(i,e?.())||{});if(e&&n?.update){var r=!1,s={};fi(()=>{var o=e();iu(o),r&&zs(s,o)&&(s=o,n.update(o))}),r=!0}if(n?.destroy)return()=>n.destroy()})}function Up(i){var t,e,n="";if(typeof i=="string"||typeof i=="number")n+=i;else if(typeof i=="object")if(Array.isArray(i)){var r=i.length;for(t=0;t=0;){var a=o+s;(o===0||Yp.includes(n[o-1]))&&(a===n.length||Yp.includes(n[a]))?n=(o===0?"":n.substring(0,o))+n.substring(a+1):o=a}}return n===""?null:n}function Kp(i,t=!1){var e=t?" !important;":";",n="";for(var r in i){var s=i[r];s!=null&&s!==""&&(n+=" "+r+": "+s+e)}return n}function Pc(i){return i[0]!=="-"||i[1]!=="-"?i.toLowerCase():i}function Xp(i,t){if(t){var e="",n,r;if(Array.isArray(t)?(n=t[0],r=t[1]):n=t,i){i=String(i).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,o=0,a=!1,l=[];n&&l.push(...Object.keys(n).map(Pc)),r&&l.push(...Object.keys(r).map(Pc));var u=0,f=-1;let m=i.length;for(var h=0;h{if(!t){if(t=!0,i.hasAttribute("value")){var n=i.value;It(i,"value",null),i.value=n}if(i.hasAttribute("checked")){var r=i.checked;It(i,"checked",null),i.checked=r}}};i.__on_r=e,Ap(e),ru()}}function Or(i,t){var e=tg(i);e.value===(e.value=t??void 0)||i.value===t&&(t!==0||i.nodeName!=="PROGRESS")||(i.value=t??"")}function It(i,t,e,n){var r=tg(i);if(ft&&(r[t]=i.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&i.nodeName==="LINK")){n||tv(i,t,e??"");return}r[t]!==(r[t]=e)&&(t==="loading"&&(i[Jd]=e),e==null?i.removeAttribute(t):typeof e!="string"&&Z0(i).includes(t)?i[t]=e:i.setAttribute(t,e))}function tg(i){return i.__attributes??={[X0]:i.nodeName.includes("-"),[Q0]:i.namespaceURI===cp}}var Qp=new Map;function Z0(i){var t=Qp.get(i.nodeName);if(t)return t;Qp.set(i.nodeName,t=[]);for(var e,n=i,r=Element.prototype;r!==n;){e=Gl(n);for(var s in e)e[s].set&&t.push(s);n=kr(n)}return t}function tv(i,t,e){it&&(t==="srcset"&&ev(i,e)||Lc(i.getAttribute(t)??"",e)||(i.outerHTML.replace(i.innerHTML,i.innerHTML&&"..."),String(e),void 0))}function Lc(i,t){return i===t?!0:new URL(i,document.baseURI).href===new URL(t,document.baseURI).href}function Zp(i){return i.split(",").map(t=>t.trim().split(" ").filter(Boolean))}function ev(i,t){var e=Zp(i.srcset),n=Zp(t);return n.length===e.length&&n.every(([r,s],o)=>s===e[o][1]&&(Lc(e[o][0],r)||Lc(r,e[o][0])))}var iv=zl?()=>performance.now():()=>Date.now(),mn={tick:i=>(zl?requestAnimationFrame:Se)(i),now:()=>iv(),tasks:new Set};function eg(){let i=mn.now();mn.tasks.forEach(t=>{t.c(i)||(mn.tasks.delete(t),t.f())}),mn.tasks.size!==0&&mn.tick(eg)}function ig(i){let t;return mn.tasks.size===0&&mn.tick(eg),{promise:new Promise(e=>{mn.tasks.add(t={c:i,f:e})}),abort(){mn.tasks.delete(t)}}}function lu(i,t){to(()=>{i.dispatchEvent(new CustomEvent(t))})}function ov(i){if(i==="float")return"cssFloat";if(i==="offset")return"cssOffset";if(i.startsWith("--"))return i;let t=i.split("-");return t.length===1?t[0]:t[0]+t.slice(1).map(e=>e[0].toUpperCase()+e.slice(1)).join("")}function ng(i){let t={},e=i.split(";");for(let n of e){let[r,s]=n.split(":");if(!r||s===void 0)break;let o=ov(r.trim());t[o]=s.trim()}return t}var av=i=>i;function Ke(i,t,e,n){var r=(i&1)!==0,s=(i&2)!==0,o=r&&s,a=(i&4)!==0,l=o?"both":r?"in":"out",u,f=t.inert,h=t.style.overflow,c,p;function g(){var k=Ct,E=yt;ce(null),Ce(null);try{return u??=e()(t,n?.()??{},{direction:l})}finally{ce(k),Ce(E)}}var m={is_global:a,in(){if(t.inert=f,!r){p?.abort(),p?.reset?.();return}s||c?.abort(),lu(t,"introstart"),c=Bc(t,g(),p,1,()=>{lu(t,"introend"),c?.abort(),c=u=void 0,t.style.overflow=h})},out(k){if(!s){k?.(),u=void 0;return}t.inert=!0,lu(t,"outrostart"),p=Bc(t,g(),c,0,()=>{lu(t,"outroend"),k?.()})},stop:()=>{c?.abort(),p?.abort()}},v=yt;if((v.transitions??=[]).push(m),r&&ou){var _=a;if(!_){for(var S=v.parent;S&&(S.f&65536)!==0;)for(;(S=S.parent)&&(S.f&16)===0;);_=!S||(S.f&32768)!==0}_&&ei(()=>{ie(()=>m.in())})}}function Bc(i,t,e,n,r){var s=n===1;if(nc(t)){var o,a=!1;return Ei(()=>{if(!a){var v=t({direction:s?"in":"out"});o=Bc(i,v,e,n,r)}}),{abort:()=>{a=!0,o?.abort()},deactivate:()=>o.deactivate(),reset:()=>o.reset(),t:()=>o.t()}}if(e?.deactivate(),!t?.duration)return r(),{abort:Se,deactivate:Se,reset:Se,t:()=>n};let{delay:l=0,css:u,tick:f,easing:h=av}=t;var c=[];if(s&&e===void 0&&(f&&f(0,1),u)){var p=ng(u(0,1));c.push(p,p)}var g=()=>1-n,m=i.animate(c,{duration:l});return m.onfinish=()=>{var v=e?.t()??1-n;e?.abort();var _=n-v,S=t.duration*Math.abs(_),k=[];if(S>0){var E=!1;if(u)for(var M=Math.ceil(S/16.666666666666668),w=0;w<=M;w+=1){var x=v+_*h(w/M),A=ng(u(x,1-x));k.push(A),E||=A.overflow==="hidden"}E&&(i.style.overflow="hidden"),g=()=>{var D=m.currentTime;return v+_*h(D/S)},f&&ig(()=>{if(m.playState!=="running")return!1;var D=g();return f(D,1-D),!0})}m=i.animate(k,{duration:S,fill:"forwards"}),m.onfinish=()=>{g=()=>n,f?.(n,1-n),r()}},{abort:()=>{m&&(m.cancel(),m.effect=null,m.onfinish=Se)},deactivate:()=>{r=Se},reset:()=>{n===0&&f?.(1,0)},t:()=>g()}}function Vc(i,t,e=t){var n=dn();Tc(i,"input",r=>{it&&i.type==="checkbox"&&rc();var s=r?i.defaultValue:i.value;if(s=Fc(i)?Hc(s):s,e(s),n&&s!==(s=t())){var o=i.selectionStart,a=i.selectionEnd;i.value=s??"",a!==null&&(i.selectionStart=o,i.selectionEnd=Math.min(a,i.value.length))}}),(ft&&i.defaultValue!==i.value||ie(t)==null&&i.value)&&e(Fc(i)?Hc(i.value):i.value),fi(()=>{it&&i.type==="checkbox"&&rc();var r=t();Fc(i)&&r===Hc(i.value)||i.type==="date"&&!r&&!i.value||r!==i.value&&(i.value=r??"")})}function Fc(i){var t=i.type;return t==="number"||t==="range"}function Hc(i){return i===""?null:+i}function ma(i,t,e){if(i.multiple)return lv(i,t);for(var n of i.options){var r=rg(n);if(oc(r,t)){n.selected=!0;return}}(!e||t!==void 0)&&(i.selectedIndex=-1)}function zc(i,t){let e=!0;ei(()=>{t&&ma(i,ie(t),e),e=!1;var n=new MutationObserver(()=>{var r=i.__value;ma(i,r)});return n.observe(i,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),()=>{n.disconnect()}})}function lv(i,t){for(var e of i.options)e.selected=~t.indexOf(rg(e))}function rg(i){return"__value"in i?i.__value:i.value}var Gc=class i{#t=new WeakMap;#e;#i;static entries=new WeakMap;constructor(t){this.#i=t}observe(t,e){var n=this.#t.get(t)||new Set;return n.add(e),this.#t.set(t,n),this.#n().observe(t,this.#i),()=>{var r=this.#t.get(t);r.delete(e),r.size===0&&(this.#t.delete(t),this.#e.unobserve(t))}}#n(){return this.#e??(this.#e=new ResizeObserver(t=>{for(var e of t){i.entries.set(e.target,e);for(var n of this.#t.get(e.target)||[])n(e)}}))}};var uv=new Gc({box:"border-box"});function hu(i,t,e){var n=uv.observe(i,()=>e(i[t]));ei(()=>(ie(()=>e(i[t])),n))}function sg(i,t){return i===t||i?.[ui]===t}function vn(i={},t,e,n){return ei(()=>{var r,s;return fi(()=>{r=s,s=n?.()||[],ie(()=>{i!==e(...s)&&(t(i,...s),r&&sg(e(...r),i)&&t(null,...r))})}),()=>{Ei(()=>{s&&sg(e(...s),i)&&t(null,...s)})}}),i}var cu=!1,L6=Symbol();function Wc(i){var t=cu;try{return cu=!1,[i(),cu]}finally{cu=t}}function ag(i){return i.ctx?.d??!1}function B(i,t,e,n){var r=(e&1)!==0,s=!Kn||(e&2)!==0,o=(e&8)!==0,a=(e&16)!==0,l=!1,u;o?[u,l]=Wc(()=>i[t]):u=i[t];var f=ui in i||Yo in i,h=o&&(Zi(i,t)?.set??(f&&t in i&&(x=>i[t]=x)))||void 0,c=n,p=!0,g=!1,m=()=>(g=!0,p&&(p=!1,a?c=ie(n):c=n),c);u===void 0&&n!==void 0&&(h&&s&&sp(t),u=m(),h&&h(u));var v;if(s)v=()=>{var x=i[t];return x===void 0?m():(p=!0,g=!1,x)};else{var _=(r?Er:ia)(()=>i[t]);_.f|=131072,v=()=>{var x=d(_);return x!==void 0&&(c=void 0),x===void 0?c:x}}if((e&4)===0)return v;if(h){var S=i.$$legacy;return function(x,A){return arguments.length>0?((!s||!A||S||l)&&h(A?v():x),x):v()}}var k=!1,E=!1,M=tr(u),w=Er(()=>{var x=v(),A=d(M);return k?(k=!1,E=!0,A):(E=!1,M.v=x)});return o&&d(w),r||(w.equals=Gs),function(x,A){if(Qo!==null&&(k=E,v(),d(M)),arguments.length>0){let D=A?d(w):s&&o?Rt(x):x;if(!w.equals(D)){if(k=!0,P(M,D),g&&c!==void 0&&(c=D),ag(w))return x;ie(()=>d(w))}return x}return ag(w)?w.v:d(w)}}function lg(i){return new Uc(i)}var Uc=class{#t;#e;constructor(t){var e=new Map,n=(s,o)=>{var a=tr(o);return e.set(s,a),a};let r=new Proxy({...t.props||{},$$events:{}},{get(s,o){return d(e.get(o)??n(o,Reflect.get(s,o)))},has(s,o){return o===Yo?!0:(d(e.get(o)??n(o,Reflect.get(s,o))),Reflect.has(s,o))},set(s,o,a){return P(e.get(o)??n(o,a),a),Reflect.set(s,o,a)}});this.#e=(t.hydrate?Dc:Dn)(t.component,{target:t.target,anchor:t.anchor,props:r,context:t.context,intro:t.intro??!1,recover:t.recover}),(!t?.props?.$$host||t.sync===!1)&&Qs(),this.#t=r.$$events;for(let s of Object.keys(this.#e))s==="$set"||s==="$destroy"||s==="$on"||Ue(this,s,{get(){return this.#e[s]},set(o){this.#e[s]=o},enumerable:!0});this.#e.$set=s=>{Object.assign(r,s)},this.#e.$destroy=()=>{er(this.#e)}}$set(t){this.#e.$set(t)}$on(t,e){this.#t[t]=this.#t[t]||[];let n=(...r)=>e.call(this,...r);return this.#t[t].push(n),()=>{this.#t[t]=this.#t[t].filter(r=>r!==n)}}$destroy(){this.#e.$destroy()}};var xv;typeof HTMLElement=="function"&&(xv=class extends HTMLElement{$$ctor;$$s;$$c;$$cn=!1;$$d={};$$r=!1;$$p_d={};$$l={};$$l_u=new Map;$$me;constructor(i,t,e){super(),this.$$ctor=i,this.$$s=t,e&&this.attachShadow({mode:"open"})}addEventListener(i,t,e){if(this.$$l[i]=this.$$l[i]||[],this.$$l[i].push(t),this.$$c){let n=this.$$c.$on(i,t);this.$$l_u.set(t,n)}super.addEventListener(i,t,e)}removeEventListener(i,t,e){if(super.removeEventListener(i,t,e),this.$$c){let n=this.$$l_u.get(t);n&&(n(),this.$$l_u.delete(t))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let i=function(n){return r=>{let s=document.createElement("slot");n!=="default"&&(s.name=n),V(r,s)}};if(await Promise.resolve(),!this.$$cn||this.$$c)return;let t={},e=kv(this);for(let n of this.$$s)n in e&&(n==="default"&&!this.$$d.children?(this.$$d.children=i(n),t.default=!0):t[n]=i(n));for(let n of this.attributes){let r=this.$$g_p(n.name);r in this.$$d||(this.$$d[r]=jc(r,n.value,this.$$p_d,"toProp"))}for(let n in this.$$p_d)!(n in this.$$d)&&this[n]!==void 0&&(this.$$d[n]=this[n],delete this[n]);this.$$c=lg({component:this.$$ctor,target:this.shadowRoot||this,props:{...this.$$d,$$slots:t,$$host:this}}),this.$$me=vc(()=>{fi(()=>{this.$$r=!0;for(let n of ec(this.$$c)){if(!this.$$p_d[n]?.reflect)continue;this.$$d[n]=this.$$c[n];let r=jc(n,this.$$d[n],this.$$p_d,"toAttribute");r==null?this.removeAttribute(this.$$p_d[n].attribute||n):this.setAttribute(this.$$p_d[n].attribute||n,r)}this.$$r=!1})});for(let n in this.$$l)for(let r of this.$$l[n]){let s=this.$$c.$on(n,r);this.$$l_u.set(r,s)}this.$$l={}}}attributeChangedCallback(i,t,e){this.$$r||(i=this.$$g_p(i),this.$$d[i]=jc(i,e,this.$$p_d,"toProp"),this.$$c?.$set({[i]:this.$$d[i]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$me(),this.$$c=void 0)})}$$g_p(i){return ec(this.$$p_d).find(t=>this.$$p_d[t].attribute===i||!this.$$p_d[t].attribute&&t.toLowerCase()===i)||i}});function jc(i,t,e,n){let r=e[i]?.type;if(t=r==="Boolean"&&typeof t!="boolean"?t!=null:t,!n||!e[i])return t;if(n==="toAttribute")switch(r){case"Object":case"Array":return t==null?null:JSON.stringify(t);case"Boolean":return t?"":null;case"Number":return t??null;default:return t}else switch(r){case"Object":case"Array":return t&&JSON.parse(t);case"Boolean":return t;case"Number":return t!=null?+t:t;default:return t}}function kv(i){let t={};return i.childNodes.forEach(e=>{t[e.slot||"default"]=!0}),t}if(it){let i=function(t){if(!(t in globalThis)){let e;Object.defineProperty(globalThis,t,{configurable:!0,get:()=>{if(e!==void 0)return e;op(t)},set:n=>{e=n}})}};i("$state"),i("$effect"),i("$derived"),i("$inspect"),i("$props"),i("$bindable")}function rr(i){Gt===null&&Zo("onMount"),Kn&&Gt.l!==null?Mv(Gt).m.push(i):Te(()=>{let t=ie(i);if(typeof t=="function")return t})}function ug(i){Gt===null&&Zo("onDestroy"),rr(()=>()=>ie(i))}function Mv(i){var t=i.l;return t.u??={a:[],b:[],m:[]}}var hg="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(hg);var Ev=G("
"),Tv=G("");function pi(i,t){let e=B(t,"text",3,""),n=B(t,"icon",3,""),r=B(t,"tooltip",3,""),s=B(t,"size",3,null),o=B(t,"onClick",3,()=>{}),a=B(t,"class",3,"");var l=Tv();let u;l.__click=function(...g){o()?.apply(this,g)};var f=J(l);{var h=g=>{var m=Ev(),v=J(m,!0);W(m),ct(()=>Wt(v,e())),V(g,m)};pt(f,g=>{e()&&g(h)})}var c=F(f,2);{var p=g=>{ai(g,{get icon(){return n()},get size(){return s()}})};pt(c,g=>{n()&&g(p)})}W(l),ct(g=>{u=kt(l,1,Ye(a()),null,u,g),It(l,"aria-label",r())},[()=>({"svelcomlib-icon-text":n()})]),V(i,l)}jt(["click"]);var Av=(i,t)=>t()(i.target.value,i.target),Cv=G(""),Ov=G("");function bn(i,t){bt(t,!0);let e=B(t,"onChange",3,()=>{}),n=B(t,"options",19,()=>[]),r=B(t,"value",3,""),s=B(t,"disabled",3,!1),o=B(t,"class",3,"");var a=Ov();a.__change=[Av,e],zc(a,r);var l;Qt(a,21,n,se,(u,f,h,c)=>{let p=()=>d(f).value,g=()=>d(f).text;var m=Cv(),v={},_=J(m,!0);W(m),ct(()=>{v!==(v=p())&&(m.value=(m.__value=p())??""),Wt(_,g())}),V(u,m)}),W(a),ct(()=>{kt(a,1,Ye(o()?o()+" dropdown":"dropdown")),a.disabled=s(),l!==(l=r())&&(a.value=(a.__value=r())??"",ma(a,r()))}),V(i,a),_t()}jt(["change"]);var cg=require("obsidian");function ai(i,t){bt(t,!0);let e=B(t,"icon",3,""),n=B(t,"size",3,null),r=B(t,"stroke_width",3,null),s=B(t,"class",3,""),o=at(null);Te(()=>{e().startsWith("{d(o)&&n()&&(typeof n()=="number"?(d(o).style.width=n()+"px",d(o).style.height=n()+"px"):Array.isArray(n())?(d(o).style.width=n()[0]+"px",d(o).style.height=n()[1]+"px"):(d(o).style.width=`var(--${n()})`,d(o).style.height=`var(--${n()})`))}),Te(()=>{d(o)&&r()&&(d(o).style.strokeWidth=r()+"px")});var a=$e(),l=Et(a);$n(l,()=>d(o)?.outerHTML??""),V(i,a),_t()}var Dv=(i,t)=>t()(i.target.value),$v=G("");function rs(i,t){bt(t,!0);let e=B(t,"type",3,"text"),n=B(t,"value",3,""),r=B(t,"placeholder",3,""),s=B(t,"onChange",3,()=>{}),o=B(t,"valid",3,!1),a=B(t,"readonly",3,!1),l=B(t,"class",3,"");var u=$v();nr(u),u.__input=[Dv,s];let f;ct(h=>{It(u,"type",e()),Or(u,n()),It(u,"placeholder",r()),u.readOnly=a(),f=kt(u,1,Ye(l()),null,f,h)},[()=>({"svelcomlib-input-success":o(),"svelcomlib-input-fail":o()===!1})]),V(i,u),_t()}jt(["input"]);var Rv=(i,t,e)=>{t()(e())},Iv=G('');function ss(i,t){bt(t,!0);let e=B(t,"min",3,0),n=B(t,"max",3,100),r=B(t,"step",3,1),s=B(t,"value",7,0),o=B(t,"onChange",3,()=>{}),a=B(t,"getTooltip",3,u=>u.toString());var l=Iv();nr(l),l.__input=()=>{let u=document.body.lastChild;u.classList.contains("tooltip")&&(u.firstChild.textContent=a()(s()),u.style.width="auto")},l.__change=[Rv,o,s],ct(u=>{It(l,"min",e()),It(l,"max",n()),It(l,"step",r()),It(l,"aria-label",u)},[()=>a()(s())]),Vc(l,s),V(i,l),_t()}jt(["input","change"]);var _R=G("");jt(["change","contextmenu"]);var Pv=(i,t,e,n)=>{t()||e()(!n()),n(!n())},Nv=G('
');function Ot(i,t){bt(t,!0);let e=B(t,"value",7,!1),n=B(t,"onChange",3,()=>{}),r=B(t,"disabled",3,!1);var s=Nv();let o;s.__click=[Pv,r,n,e];var a=J(s);W(s),ct(l=>{o=kt(s,1,"checkbox-container",null,o,l),a.disabled=r()},[()=>({"is-enabled":e()})]),V(i,s),_t()}jt(["click"]);var MR=G(''),ER=G(' '),TR=G('
');jt(["click"]);var OR=G('
');var Lv=(i,t,e,n)=>{t((t()+1)%e().length),n()()},Bv=G("
");function Dr(i,t){bt(t,!0);let e=B(t,"states",19,()=>[]),n=B(t,"value",15,0),r=B(t,"size",3,null),s=B(t,"onClick",3,()=>{}),o=B(t,"onContextMenu",3,()=>{}),a=B(t,"class",3,"");var l=Bv();l.__click=[Lv,n,e,s],l.__contextmenu=function(...p){o()?.apply(this,p)};var u=J(l);{var f=p=>{ai(p,{get icon(){return e()[n()].icon},get size(){return r()}})};pt(u,p=>{e()[n()].icon&&p(f)})}var h=F(u,2);{var c=p=>{var g=Cc();ct(()=>Wt(g,e()[n()].text)),V(p,g)};pt(h,p=>{e()[n()].text&&p(c)})}W(l),ct(()=>{kt(l,1,a()+" svelcomlib-icon-text"),It(l,"aria-label",e()[n()].tooltip)}),V(i,l),_t()}jt(["click","contextmenu"]);var LR=G("");jt(["click"]);var VR=G("
");jt(["input"]);var Fv=G('
'),Hv=G('
'),Vv={hash:"svelte-3kpd",code:""};function va(i,t){bt(t,!0),ir(i,Vv);let e=B(t,"height",3,"100%"),n=B(t,"itemHeight",3,void 0),r=B(t,"start",7,0),s=B(t,"end",7,0),o=Rt([]),a=at(Rt([])),l=at(void 0),u=at(void 0),f=at(0),h=at(void 0),c=at(0),p=at(0),g=at(0),m=at(0),v=nt(()=>t.items.slice(r(),s()).map((w,x)=>({index:x+r(),data:w})));Te(()=>{d(h)&&_(t.items,d(f),n())});async function _(w,x,A){w.lengthw){r(x),P(c,A,!0);break}A+=N,x+=1}for(;xw+d(f))););s(x);let D=t.items.length-s();for(P(g,A/s());x{P(a,d(u).getElementsByClassName("svelcomlib-virtual-list-row"),!0),P(h,!0)});var E=Hv(),M=J(E);return Qt(M,21,()=>d(v),w=>w.index,(w,x)=>{var A=Fv(),D=J(A);Ai(D,()=>t.item,()=>d(x).data,()=>d(x).index),W(A),V(w,A)}),W(M),vn(M,w=>P(u,w),()=>d(u)),W(E),vn(E,w=>P(l,w),()=>d(l)),ct(()=>{nn(E,`height: ${e()??""};`),nn(M,`padding-top: ${d(c)??""}px; padding-bottom: ${d(p)??""}px; --scroll-offset: ${d(m)??""}px`)}),Le("scroll",E,S),hu(E,"offsetHeight",w=>P(f,w)),V(i,E),_t({scrollToIndex:k})}var fu=require("obsidian"),Uv=G("
");function os(i,t){bt(t,!0);let e=B(t,"source",3,""),n=B(t,"class",3,""),r=at(void 0);rr(async()=>{let o=new fu.Component;await fu.MarkdownRenderer.render(t.plugin.app,t.text,d(r),e(),o),o.load()});var s=Uv();vn(s,o=>P(r,o),()=>d(r)),ct(()=>kt(s,1,Ye(n()))),V(i,s),_t()}var jv=G("Empty navheader"),Yv=G('');function ba(i,t){"use strict";var e=Yv(),n=J(e),r=J(n);{var s=a=>{var l=$e(),u=Et(l);Ai(u,()=>t.container),V(a,l)},o=a=>{var l=jv();V(a,l)};pt(r,a=>{t.container?a(s):a(o,!1)})}W(n),W(e),V(i,e)}var Kv=G("
"),Jv=G(" ",1),Xv=G('
',1);function ut(i,t){bt(t,!0);let e=B(t,"description",3,null),n=B(t,"type",3,null),r=B(t,"depth",3,0),s=B(t,"notices",19,()=>[]),o=B(t,"class",3,""),a=nt(()=>{let x="";return r()&&(x+=" svelcomlib-"+"sub".repeat(r())+"setting"),n()==="heading"&&(x+=" svelcomlib-setting-"+"sub".repeat(r())+"heading"),x});var l=Xv(),u=Et(l);let f;var h=J(u),c=J(h),p=J(c),g=J(p);$n(g,()=>t.name),W(p),W(c);var m=F(c,2),v=J(m);$n(v,e);var _=F(v,2);Qt(_,17,s,se,(x,A,D)=>{var N=$e(),I=Et(N);{var R=z=>{var U=Jv(),tt=Et(U);{var rt=Dt=>{var Bt=Kv();V(Dt,Bt)};pt(tt,Dt=>{(e()||D!==0)&&Dt(rt)})}var At=F(tt,2);let St;var mt=J(At);$n(mt,()=>d(A).text),W(At),ct(Dt=>St=kt(At,1,"svelcomlib-notice "+(d(A).style??""),null,St,Dt),[()=>({"svelcomlib-notice-info":d(A).type==="info","svelcomlib-notice-warning":d(A).type==="warning","svelcomlib-notice-error":d(A).type==="error"})]),V(z,U)};pt(I,z=>{d(A)&&z(R)})}V(x,N)}),W(m),W(h);var S=F(h,2),k=J(S);{var E=x=>{var A=$e(),D=Et(A);Ai(D,()=>t.control),V(x,A)};pt(k,x=>{t.control&&x(E)})}W(S),W(u);var M=F(u,2);{var w=x=>{var A=$e(),D=Et(A);Ai(D,()=>t.subcontrol),V(x,A)};pt(M,x=>{t.subcontrol&&x(w)})}ct(x=>f=kt(u,1,(o()??"")+" setting-item"+d(a),null,f,x),[()=>({"mod-dropdown":n()==="dropdown","mod-toggle":n()==="toggle","mod-slider":n()==="slider","setting-item-heading":n()==="heading"})]),V(i,l),_t()}var Qv=G(" ",1);function _a(i,t){"use strict";let e=B(t,"class",3,"");var n=Qv(),r=Et(n);{var s=l=>{var u=$e(),f=Et(u);Ai(f,()=>t.header,e),V(l,u)};pt(r,l=>{t.header&&l(s)})}var o=F(r,2);{var a=l=>{var u=$e(),f=Et(u);Ai(f,()=>t.view,e),V(l,u)};pt(o,l=>{t.view&&l(a)})}V(i,n)}var t1=G(" ",1);function du(i,t){bt(t,!0);let e=B(t,"plugin",7),n={addition:{icon:"plus-circle",tooltip:"Additions"},deletion:{icon:"minus-square",tooltip:"Deletions"},substitution:{icon:"replace",tooltip:"Substitutions"},highlight:{icon:"highlighter",tooltip:"Highlights"},comment:{icon:"message-square",tooltip:"Comments"}},r={"":{icon:"star",tooltip:"Regular"},...n},s=[{value:"unchanged",text:"Regular movement"},{value:"ignore_bracket",text:"Skip brackets"},{value:"ignore_metadata",text:"Skip brackets and metadata"},{value:"ignore_completely",text:"Skip completely"}],o=[{value:"unchanged",text:"Regular movement"},{value:"stay_inside",text:"Keep cursor within range"},{value:"stay_outside",text:"Treat range as word group"}];var a=t1(),l=Et(a);ut(l,{name:"Functionality",type:"heading"});var u=F(l,2);ut(u,{name:"Suggestion mode",type:"heading",depth:1});var f=F(u,2);ut(f,{name:"Cursor movement",type:"heading",depth:2});var h=F(f,2);Qt(h,17,()=>Object.keys(n),se,(S,k)=>{ut(S,{get name(){return n[d(k)].tooltip},type:"dropdown",depth:2,control:M=>{bn(M,{get value(){return e().settings.suggestion_mode_operations.cursor_movement[d(k)]},options:s,onChange:w=>{e().settings.suggestion_mode_operations.cursor_movement[d(k)]=w,e().saveSettings()}})},$$slots:{control:!0}})});var c=F(h,2);ut(c,{name:"Bracket movement",type:"heading",depth:2});var p=F(c,2);Qt(p,17,()=>Object.keys(n),se,(S,k)=>{ut(S,{get name(){return n[d(k)].tooltip},type:"dropdown",depth:2,control:M=>{bn(M,{get value(){return e().settings.suggestion_mode_operations.bracket_movement[d(k)]},options:o,onChange:w=>{e().settings.suggestion_mode_operations.bracket_movement[d(k)]=w,e().saveSettings()}})},$$slots:{control:!0}})});var g=F(p,2);ut(g,{name:"Suggestion mode cursor movement",description:"Determine how the cursor should move through suggestions in suggestion mode",type:"dropdown"});var m=F(g,2);ut(m,{name:"Rendering",type:"heading"});var v=F(m,2);ut(v,{name:"Live Preview renderer",description:"Enable custom rendering of CriticMarkup syntax in Live Preview",type:"toggle",control:k=>{Ot(k,{get value(){return e().settings.live_preview},onChange:()=>{e().settings.live_preview=!e().settings.live_preview,e().saveSettings()}})},$$slots:{control:!0}});var _=F(v,2);ut(_,{name:"Reading View renderer",description:"Enable custom rendering of CriticMarkup syntax in Reading View",type:"toggle",control:k=>{Ot(k,{get value(){return e().settings.post_processor},onChange:()=>{e().settings.post_processor=!e().settings.post_processor,e().saveSettings()}})},$$slots:{control:!0}}),V(i,a),_t()}var e1=G(" ",1);function pu(i,t){bt(t,!0);let e=B(t,"plugin",7),n=at(Rt(e().settings.comment_style)),r={inline:"Comments receive a background color and are fully visible (similar to suggestions)",icon:"Comments are displayed as icons and can be hovered over to reveal the comment",none:"Comments are not rendered in the editor, use this with the annotation gutter"};var s=e1(),o=Et(s);ut(o,{name:"Editing features",type:"heading"});var a=F(o,2);ut(a,{name:"Automatic tag completion",notices:[{type:"info",text:"When typing {++, the tag automatically gets completed with ++}"}],type:"toggle",control:m=>{Ot(m,{get value(){return e().settings.tag_completion},onChange:()=>{e().settings.tag_completion=!e().settings.tag_completion,e().saveSettings()}})},$$slots:{control:!0}});var l=F(a,2);ut(l,{name:"Remove syntax on copy",description:"When copying in the editor to the clipboard, any CriticMarkup syntax is removed",notices:[{type:"info",text:"Copying my {++text++} will result in my text"}],type:"toggle",control:m=>{Ot(m,{slot:"control",get value(){return e().settings.clipboard_remove_syntax},onChange:()=>{e().settings.clipboard_remove_syntax=!e().settings.clipboard_remove_syntax,e().saveSettings()}})},$$slots:{control:!0}});var u=F(l,2);ut(u,{name:"Automatic tag correction",description:"Dangling tags and redundant whitespaces automatically get removed to prevent invalid CriticMarkup syntax",type:"toggle",control:m=>{Ot(m,{get value(){return e().settings.tag_correcter},onChange:()=>{e().settings.tag_correcter=!e().settings.tag_correcter,e().saveSettings()}})},$$slots:{control:!0}});var f=F(u,2);ut(f,{name:"Show style while editing",description:"Keep the style of suggestions visible while editing",type:"toggle",control:m=>{Ot(m,{get value(){return e().settings.editor_styling},onChange:()=>{e().settings.editor_styling=!e().settings.editor_styling,e().saveSettings()}})},$$slots:{control:!0}});var h=F(f,2);ut(h,{name:"Comments Rendering",type:"heading"});var c=F(h,2);let p=nt(()=>[{type:"info",text:r[d(n)]}]);ut(c,{name:"Comment rendering mode",description:"Determine how comments are rendered inside the editor",get notices(){return d(p)},type:"dropdown",control:m=>{bn(m,{options:[{value:"inline",text:"Inline"},{value:"icon",text:"Icon"},{value:"none",text:"Hidden"}],get value(){return d(n)},onChange:v=>{e().settings.comment_style=v,P(n,v,!0),e().saveSettings()}})},$$slots:{control:!0}}),V(i,s),_t()}var i1=G('
',1);function wa(i,t){bt(t,!0);let e=B(t,"plugin",7),n=at(Rt(e().settings.default_preview_mode)),r={0:"All suggestions will be visible",1:"Preview document as if all suggestions were accepted",2:"Preview document as if all suggestions were rejected"};var s=i1(),o=Et(s);ut(o,{name:"Default Edit Mode",type:"dropdown",notices:[{type:"info",text:"When opening a new note, this will be the default editing mode"}],control:v=>{let _=nt(()=>[{value:0 .toString(),text:"Regular Edit Mode"},{value:1 .toString(),text:"Corrected Edit Mode"},{value:2 .toString(),text:"Suggestion Mode"}]),S=nt(()=>e().settings.default_edit_mode.toString());bn(v,{get options(){return d(_)},get value(){return d(S)},onChange:k=>{let E=parseInt(k);e().settings.default_edit_mode=E,e().saveSettings()}})},$$slots:{control:!0}});var a=F(o,2);let l=nt(()=>[{type:"info",text:"When opening a new note, this will be the default editing mode"},{type:"info",text:r[d(n)]}]);ut(a,{name:"Default Preview Mode",type:"dropdown",get notices(){return d(l)},control:v=>{let _=nt(()=>[{value:0 .toString(),text:"View all suggestions"},{value:1 .toString(),text:"Preview 'accept all'"},{value:2 .toString(),text:"Preview 'reject all'"}]),S=nt(()=>e().settings.default_preview_mode.toString());bn(v,{get options(){return d(_)},get value(){return d(S)},onChange:k=>{P(n,parseInt(k),!0),e().settings.default_preview_mode=d(n),e().saveSettings()}})},$$slots:{control:!0}});var u=F(a,2);ut(u,{name:"Include Metadata Extension",type:"dropdown",notices:[{type:"info",text:"Allow inclusion of metadata for suggestions, such as authorship, time, etc."},{type:"warning",text:"Suggestion metadata is not part of the official CriticMarkup standard, this metadata will not get processed/rendered correctly in other editors"},{type:"error",text:"Toggling this setting results in a re-indexation of the entire vault"}],control:v=>{Ot(v,{get value(){return e().settings.enable_metadata},onChange:_=>{e().settings.enable_metadata=_,e().saveSettings()}})},$$slots:{control:!0}});var f=F(u,2);ut(f,{name:"Database",type:"heading"});var h=F(f,2);ut(h,{name:"Database Workers",description:"Number of workers to use for database indexing",notices:[{type:"info",text:"A higher amount of workers will increase indexing speed"}],type:"slider",control:v=>{ss(v,{min:1,max:navigator.hardwareConcurrency/2,step:1,get value(){return e().settings.database_workers},onChange:_=>{e().settings.database_workers=_,e().saveSettings()}})},$$slots:{control:!0}});var c=F(h,2);ut(c,{name:"Rebuild Database",notices:[{type:"info",text:"Recommended if you're encountering issues with the view after updating"},{type:"warning",text:"In large vaults, reindexing the database may take a while"}],control:v=>{pi(v,{text:"Rebuild",onClick:async()=>{await e().database.reinitializeDatabase()}})},$$slots:{control:!0}});var p=F(c,2),g=J(p);pi(g,{class:"translator-fail",text:"REPORT BUG",icon:"bug",onClick:()=>zf(e().app,void 0,{})}),W(p),V(i,s),_t()}var n1=G(" ",1);function gu(i,t){bt(t,!0);let e=B(t,"plugin",7);var n=n1(),r=Et(n);ut(r,{name:"Editor header",type:"heading"});var s=F(r,2);ut(s,{name:"Full button labels",description:"Adds labels to the buttons in the editor header",type:"toggle",control:p=>{Ot(p,{get value(){return e().settings.toolbar_show_buttons_labels},onChange:()=>{e().settings.toolbar_show_buttons_labels=!e().settings.toolbar_show_buttons_labels,e().saveSettings()}})},$$slots:{control:!0}});var o=F(s,2);ut(o,{name:"Preview mode header button",description:"Adds a button to the editor's header for quickly changing preview mode",type:"toggle",control:p=>{Ot(p,{get value(){return e().settings.toolbar_preview_button},onChange:()=>{e().settings.toolbar_preview_button=!e().settings.toolbar_preview_button,e().saveSettings()}})},$$slots:{control:!0}});var a=F(o,2);ut(a,{name:"Suggestion mode header button",description:"Adds a button to the editor's header for quickly toggling suggestion mode",type:"toggle",control:p=>{Ot(p,{get value(){return e().settings.toolbar_edit_button},onChange:()=>{e().settings.toolbar_edit_button=!e().settings.toolbar_edit_button,e().saveSettings()}})},$$slots:{control:!0}});var l=F(a,2);ut(l,{name:"Editor status bar",type:"heading"});var u=F(l,2);ut(u,{name:"Preview mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:p=>{Ot(p,{get value(){return e().settings.status_bar_preview_button},onChange:()=>{e().settings.status_bar_preview_button=!e().settings.status_bar_preview_button,e().saveSettings()}})},$$slots:{control:!0}});var f=F(u,2);ut(f,{name:"Suggestion mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:p=>{Ot(p,{get value(){return e().settings.status_bar_edit_button},onChange:()=>{e().settings.status_bar_edit_button=!e().settings.status_bar_edit_button,e().saveSettings()}})},$$slots:{control:!0}});var h=F(f,2);ut(h,{name:"Metadata status bar toggle",description:"Adds a status bar item for quickly toggling the inclusion of (particular) metadata",type:"toggle",control:p=>{Ot(p,{get value(){return e().settings.status_bar_metadata_button},onChange:()=>{e().settings.status_bar_metadata_button=!e().settings.status_bar_metadata_button,e().saveSettings()}})},$$slots:{control:!0}}),V(i,n),_t()}var r1=G(" ",1),s1=G(" ",1);function mu(i,t){bt(t,!0);let e=B(t,"plugin",7);var n=s1(),r=Et(n);ut(r,{name:"Add Metadata",type:"toggle",control:M=>{Ot(M,{get value(){return e().settings.enable_metadata},onChange:w=>{e().settings.enable_metadata=w,e().saveSettings()}})},$$slots:{control:!0}});var s=F(r,2);ut(s,{name:"Enable Authorship",description:"Enable rendering and processing of author metadata",type:"toggle",control:M=>{Ot(M,{get value(){return e().settings.enable_author_metadata},onChange:w=>{e().settings.enable_author_metadata=w,e().saveSettings()}})},$$slots:{control:!0}});var o=F(s,2);{var a=E=>{var M=r1(),w=Et(M);ut(w,{name:"Add Author Metadata",description:"Author metadata will be added into new suggestions and comments",type:"toggle",depth:1,control:D=>{Ot(D,{get value(){return e().settings.add_author_metadata},onChange:N=>{e().settings.add_author_metadata=N,e().saveSettings()}})},$$slots:{control:!0}});var x=F(w,2);ut(x,{name:"Name",depth:1,control:D=>{rs(D,{type:"text",onChange:N=>{e().settings.author=N,e().saveSettings()},get value(){return e().settings.author},set value(N){e().settings.author=N}})},$$slots:{control:!0}}),V(E,M)};pt(o,E=>{e().settings.enable_author_metadata&&E(a)})}var l=F(o,2);ut(l,{name:"Enable Timestamp",description:"Enable rendering and processing of timestamp metadata",type:"toggle",control:M=>{Ot(M,{get value(){return e().settings.enable_timestamp_metadata},onChange:w=>{e().settings.enable_timestamp_metadata=w,e().saveSettings()}})},$$slots:{control:!0}});var u=F(l,2);{var f=E=>{ut(E,{name:"Add Timestamp Metadata",description:"Timestamp metadata will be added into new suggestions and comments",depth:1,control:w=>{Ot(w,{get value(){return e().settings.add_timestamp_metadata},onChange:x=>{e().settings.add_timestamp_metadata=x,e().saveSettings()}})},$$slots:{control:!0}})};pt(u,E=>{e().settings.enable_timestamp_metadata&&E(f)})}var h=F(u,2);ut(h,{name:"Enable Completed",description:"Enable rendering and processing of completed metadata",type:"toggle",control:M=>{Ot(M,{get value(){return e().settings.enable_completed_metadata},onChange:w=>{e().settings.enable_completed_metadata=w,e().saveSettings()}})},$$slots:{control:!0}});var c=F(h,2);{var p=E=>{ut(E,{name:"Add Completed Metadata",description:"Completed metadata will be added into new suggestions and comments",depth:1,control:w=>{Ot(w,{get value(){return e().settings.add_completed_metadata},onChange:x=>{e().settings.add_completed_metadata=x,e().saveSettings()}})},$$slots:{control:!0}})};pt(c,E=>{e().settings.enable_completed_metadata&&E(p)})}var g=F(c,2);ut(g,{name:"Enable Style",description:"Enable rendering and processing of style metadata",type:"toggle",control:M=>{Ot(M,{get value(){return e().settings.enable_style_metadata},onChange:w=>{e().settings.enable_style_metadata=w,e().saveSettings()}})},$$slots:{control:!0}});var m=F(g,2);{var v=E=>{ut(E,{name:"Add Style Metadata",description:"Style metadata will be added into new suggestions and comments",depth:1,control:w=>{Ot(w,{get value(){return e().settings.add_style_metadata},onChange:x=>{e().settings.add_style_metadata=x,e().saveSettings()}})},$$slots:{control:!0}})};pt(m,E=>{e().settings.enable_style_metadata&&E(v)})}var _=F(m,2);ut(_,{name:"Enable Color",description:"Enable rendering and processing of color metadata",type:"toggle",control:M=>{Ot(M,{get value(){return e().settings.enable_color_metadata},onChange:w=>{e().settings.enable_color_metadata=w,e().saveSettings()}})},$$slots:{control:!0}});var S=F(_,2);{var k=E=>{ut(E,{name:"Add Color Metadata",description:"Color metadata will be added into new suggestions and comments",depth:1,control:w=>{Ot(w,{get value(){return e().settings.add_color_metadata},onChange:x=>{e().settings.add_color_metadata=x,e().saveSettings()}})},$$slots:{control:!0}})};pt(S,E=>{e().settings.enable_color_metadata&&E(k)})}V(i,n),_t()}var o1=G(" ",1);function vu(i,t){bt(t,!0);let e=B(t,"plugin",7);var n=o1(),r=Et(n);ut(r,{name:"Diff gutter",type:"heading"});var s=F(r,2);ut(s,{name:"Enable diff gutter",description:"Display a gutter in the editor for showing changes from suggestions",notices:[{type:"info",text:"Clicking on the gutter reveals a menu for accepting/rejecting all changes within the block"}],type:"toggle",control:S=>{Ot(S,{slot:"control",get value(){return e().settings.diff_gutter},onChange:()=>{e().settings.diff_gutter=!e().settings.diff_gutter,e().saveSettings()}})},$$slots:{control:!0}});var o=F(s,2);ut(o,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no changes in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:S=>{Ot(S,{slot:"control",get value(){return e().settings.diff_gutter_hide_empty},onChange:()=>{e().settings.diff_gutter_hide_empty=!e().settings.diff_gutter_hide_empty,e().saveSettings()}})},$$slots:{control:!0}});var a=F(o,2);ut(a,{name:"Annotation gutter",type:"heading"});var l=F(a,2);ut(l,{name:"Enable annotation gutter",description:"Display a gutter in the editor for annotations",type:"toggle",control:S=>{Ot(S,{get value(){return e().settings.annotation_gutter},onChange:()=>{e().settings.annotation_gutter=!e().settings.annotation_gutter,e().saveSettings()}})},$$slots:{control:!0}});var u=F(l,2);ut(u,{name:"Included annotations",description:"Determine which annotations should be shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"subheading",depth:1});var f=F(u,2);Qt(f,17,()=>Object.keys(Gr).filter(_=>isNaN(Number(_))),se,(_,S)=>{let k=nt(()=>d(S).toLowerCase().replace(/\b\w/g,E=>E.toUpperCase()));ut(_,{get name(){return d(k)},type:"toggle",depth:2,control:M=>{let w=nt(()=>(e().settings.annotation_gutter_included_types&Gr[d(S)])!==0);Ot(M,{get value(){return d(w)},onChange:()=>{e().settings.annotation_gutter_included_types^=Gr[d(S)],e().saveSettings()}})},$$slots:{control:!0}})});var h=F(f,2);ut(h,{name:"Focus annotation on selection",description:"When selecting an annotation in the editor, the corresponding annotation in the gutter will be focused",type:"toggle",depth:1,control:S=>{Ot(S,{get value(){return e().settings.annotation_gutter_focus_on_click},onChange:()=>{e().settings.annotation_gutter_focus_on_click=!e().settings.annotation_gutter_focus_on_click,e().saveSettings()}})},$$slots:{control:!0}});var c=F(h,2);ut(c,{name:"Width",description:"The width of the gutter in pixels",type:"slider",depth:1,control:S=>{ss(S,{min:100,max:500,step:50,get value(){return e().settings.annotation_gutter_width},onChange:k=>{e().settings.annotation_gutter_width=k,e().saveSettings()}})},$$slots:{control:!0}});var p=F(c,2);ut(p,{name:"Show resize handle",description:"Display a handle bar within the editor for quickly resizing the gutter",type:"toggle",depth:1,control:S=>{Ot(S,{get value(){return e().settings.annotation_gutter_resize_handle},onChange:()=>{e().settings.annotation_gutter_resize_handle=!e().settings.annotation_gutter_resize_handle,e().saveSettings()}})},$$slots:{control:!0}});var g=F(p,2);ut(g,{name:"Default fold state",description:"Determine whether the gutter is shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"toggle",depth:1,control:S=>{Ot(S,{get value(){return e().settings.annotation_gutter_default_fold_state},onChange:()=>{e().settings.annotation_gutter_default_fold_state=!e().settings.annotation_gutter_default_fold_state,e().saveSettings()}})},$$slots:{control:!0}});var m=F(g,2);ut(m,{name:"Show fold button",description:"Display a button within the editor for (un)folding the gutter",type:"toggle",depth:1,control:S=>{Ot(S,{get value(){return e().settings.annotation_gutter_fold_button},onChange:()=>{e().settings.annotation_gutter_fold_button=!e().settings.annotation_gutter_fold_button,e().saveSettings()}})},$$slots:{control:!0}});var v=F(m,2);ut(v,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no annotations in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:S=>{Ot(S,{get value(){return e().settings.annotation_gutter_hide_empty},onChange:()=>{e().settings.annotation_gutter_hide_empty=!e().settings.annotation_gutter_hide_empty,e().saveSettings()}})},$$slots:{control:!0}}),V(i,n),_t()}var a1=i=>i;function l1(i){let t=i-1;return t*t*t+1}function $r(i,{delay:t=0,duration:e=400,easing:n=a1}={}){let r=+getComputedStyle(i).opacity;return{delay:t,duration:e,easing:n,css:s=>`opacity: ${s*r}`}}var Yc=!1;function Kc(i,{delay:t=0,duration:e=400,easing:n=l1,axis:r="y"}={}){let s=getComputedStyle(i);it&&!Yc&&/(contents|inline|table)/.test(s.display)&&(Yc=!0,Promise.resolve().then(()=>Yc=!1),s.display,void 0);let o=+s.opacity,a=r==="y"?"height":"width",l=parseFloat(s[a]),u=r==="y"?["top","bottom"]:["left","right"],f=u.map(_=>`${_[0].toUpperCase()}${_.slice(1)}`),h=parseFloat(s[`padding${f[0]}`]),c=parseFloat(s[`padding${f[1]}`]),p=parseFloat(s[`margin${f[0]}`]),g=parseFloat(s[`margin${f[1]}`]),m=parseFloat(s[`border${f[0]}Width`]),v=parseFloat(s[`border${f[1]}Width`]);return{delay:t,duration:e,easing:n,css:_=>`overflow: hidden;opacity: ${Math.min(_*20,1)*o};${a}: ${_*l}px;padding-${u[0]}: ${_*h}px;padding-${u[1]}: ${_*c}px;margin-${u[0]}: ${_*p}px;margin-${u[1]}: ${_*g}px;border-${u[0]}-width: ${_*m}px;border-${u[1]}-width: ${_*v}px;min-${a}: 0`}}var u1=(i,t,e,n)=>{if(i.key==="Tab"){if(i.metaKey||i.ctrlKey)return!0;i.shiftKey?t(((d(e)-1)%n.length+n.length)%n.length):t((d(e)+1)%n.length),i.preventDefault()}},h1=G('
'),c1=G("
"),f1=G('
');function ya(i,t){bt(t,!0);let e=B(t,"plugin",7),n=[{id:"general",name:"General",icon:"settings"},{id:"editor",name:"Editor",icon:"pencil"},{id:"interface",name:"Interface",icon:"layout-panel-top"},{id:"gutter",name:"Gutters",icon:"sidebar-open"},{id:"metadata",name:"Metadata",icon:"tags"},{id:"advanced",name:"Advanced",icon:"shield-alert"}],r=at(Rt(n.findIndex(h=>h.id===e().settings_tab))),s=nt(()=>n[d(r)].id),o=nt(()=>{switch(d(s)){case"general":return wa;case"editor":return pu;case"gutter":return vu;case"advanced":return du;case"interface":return gu;case"metadata":return mu;default:return wa}});async function a(h){P(r,h,!0),P(s,n[h].id,!0),e().settings_tab=d(s)}var l=f1(),u=J(l);u.__keydown=[u1,a,r,n],Qt(u,21,()=>n,se,(h,c,p)=>{let g=()=>d(c).id,m=()=>d(c).name,v=()=>d(c).icon;var _=h1();let S;_.__click=()=>{a(p)};var k=J(_),E=J(k);ai(E,{get icon(){return v()}}),W(k);var M=F(k,2);let w;var x=J(M,!0);W(M),W(_),ct((A,D)=>{S=kt(_,1,"cmtr-settings-navigation-item",null,S,A),It(_,"aria-label",`${m()} settings`),w=kt(M,1,"cmtr-settings-navigation-item-text",null,w,D),Wt(x,m())},[()=>({"cmtr-settings-navigation-selected-item":d(r)===p}),()=>({"cmtr-settings-navigation-selected-item-text":d(r)!==p})]),V(h,_)}),W(u);var f=F(u,2);no(f,()=>d(s),h=>{var c=c1(),p=J(c);Ic(p,()=>d(o),(g,m)=>{m(g,{get plugin(){return e()}})}),W(c),Ke(1,c,()=>Kc,()=>({duration:400,delay:400})),Ke(2,c,()=>Kc,()=>({duration:400})),V(h,c)}),W(l),V(i,l),_t()}jt(["keydown","click"]);var Rn=require("obsidian"),dg=require("@codemirror/state");function bu(i,t,e){let n=new Rn.Menu,r=new Set(e.map(a=>a.range.type)),s=e.length>20,o=e.length>1;if(r.has("comment")||r.has("highlight")?r.size===1&&r.has("comment")?n.addItem(a=>{a.setTitle(o?"Remove selected comment threads":"Remove comment thread").setIcon("message-square-off").setSection("close-annotation").setWarning(s).onClick(async()=>cn(i,e,fn.bind(null,(l,u)=>"")))}):n.addItem(a=>{a.setTitle(o?"Remove selected threads":"Remove thread").setIcon("trash").setSection("close-annotation").setWarning(s).onClick(async()=>cn(i,e,fn.bind(null,(l,u)=>"")))}):(n.addItem(a=>{a.setTitle(o?"Apply selected changes":"Apply change").setIcon("check").setSection("close-annotation").setWarning(s).onClick(async()=>cn(i,e,fn.bind(null,(l,u)=>l.accept())))}),n.addItem(a=>{a.setTitle(o?"Reject selected changes":"Reject change").setIcon("cross").setSection("close-annotation").setWarning(s).onClick(async()=>cn(i,e,fn.bind(null,(l,u)=>l.reject())))})),!o){let{range:a,path:l}=e[0];n.addItem(u=>{u.setTitle("Add reply").setIcon("reply").setSection("comment-handling").onClick(async f=>{let h=i.app.vault.getAbstractFileByPath(l);if(h&&h instanceof Rn.TFile){let c=i.app.workspace.getLeaf(!1);await c.openLinkText(l,""),c.view instanceof Rn.MarkdownView&&(Bs(c.view.editor,a),Ji(c.view.editor.cm,a,!1))}})}),a.type==="comment"&&(n.addItem(u=>{u.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(async()=>{let f=i.app.vault.getAbstractFileByPath(l);if(f&&f instanceof Rn.TFile){let h=i.app.workspace.getLeaf(!1);if(await h.openLinkText(l,""),h.view instanceof Rn.MarkdownView){let{editor:c}=h.view;Bs(c,a),c.cm.dispatch(c.cm.state.update({selection:dg.EditorSelection.cursor(a.full_range_back),annotations:[Tn.of({from:a.full_range_back,to:a.full_range_back,index:a.reply_depth})]}))}}})}),n.addItem(u=>{u.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(async()=>cn(i,e,fn.bind(null,(f,h)=>""),!1))}))}return n.addItem(a=>{a.setTitle(o?"Open in new tabs":"Open in new tab").setIcon("file-plus").setSection("open-annotation").onClick(async l=>{let u=$l(e);for(let[f,h]of Object.entries(u).slice(0,10)){let c=i.app.vault.getAbstractFileByPath(f);if(c&&c instanceof Rn.TFile){let p=i.app.workspace.getLeaf(l.metaKey||l.ctrlKey||!0);await p.openLinkText(f,""),p.view instanceof Rn.MarkdownView&&Bs(p.view.editor,h[0])}}})}),n.showAtMouseEvent(t),n}var N5=require("obsidian");var d1=G(" ",1),p1=G('
');function _u(i,t){bt(t,!0);let e=B(t,"menu_open",15,!1);var n=p1(),r=J(n),s=J(r);{var o=f=>{var h=$e(),c=Et(h);{var p=m=>{pi(m,{icon:"message-square-off",tooltip:"Delete comment thread",onClick:()=>cn(t.plugin,[t.entry],fn.bind(null,(v,_)=>v.accept()))})},g=m=>{pi(m,{icon:"cross",tooltip:"Delete comment",onClick:()=>cn(t.plugin,[t.entry],fn.bind(null,(v,_)=>v.accept()))})};pt(c,m=>{t.entry.range.replies.length?m(p):m(g,!1)})}V(f,h)},a=(f,h)=>{{var c=p=>{var g=d1(),m=Et(g);let v=nt(()=>"Accept change"+(t.entry.range.replies.length?" (and delete thread)":""));pi(m,{icon:"check",get tooltip(){return d(v)},onClick:()=>cn(t.plugin,[t.entry],fn.bind(null,(k,E)=>k.accept()))});var _=F(m,2);let S=nt(()=>"Reject change"+(t.entry.range.replies.length?" (and delete thread)":""));pi(_,{icon:"cross",get tooltip(){return d(S)},onClick:()=>cn(t.plugin,[t.entry],fn.bind(null,(k,E)=>k.reject()))}),V(p,g)};pt(f,p=>{t.entry.range.type!=="highlight"&&p(c)},h)}};pt(s,f=>{t.entry.range.type==="comment"?f(o):f(a,!1)})}var l=F(s,4);pi(l,{icon:"eye",tooltip:"View in note",onClick:async()=>{await Dl(t.plugin,t.entry)}});var u=F(l,2);pi(u,{icon:"more-vertical",tooltip:"More options",onClick:f=>{e(!0),t.moreOptionsMenu(t.plugin,f,[t.entry]).onHide(()=>{e(!1)})}}),W(r),W(n),V(i,n),_t()}var g1=(i,t,e)=>{t.onClick(i,t.row,t.index),P(e,!0)},m1=(i,t)=>{t.onDblClick(i,t.row,t.index)},v1=(i,t,e)=>{bu(t.plugin,i,t.selected_ranges.length?t.selected_ranges:[{path:t.row.path,range:t.row.range.thread[d(e)]??t.row.range}])},b1=G('

This range is empty

'),_1=G(" ",1),w1=G('
'),y1=G('
'),x1=G('
');function Jc(i,t){bt(t,!0);let e=B(t,"menu_open",15,!1),n=at(!1),r=at(null),s=at(null);function o(M){e()||(P(r,M,!0),P(s,d(r),!0))}let a=nt(()=>t.selected_ranges.some(M=>M.path===t.row.path&&M.range.from===t.row.range.from));var l=x1();let u;l.__click=[g1,t,n],l.__dblclick=[m1,t],l.__contextmenu=[v1,t,r];var f=J(l);{var h=M=>{_u(M,{get plugin(){return t.plugin},get entry(){return t.row},moreOptionsMenu:bu,get menu_open(){return e()},set menu_open(w){e(w)}})};pt(f,M=>{(!e()&&d(r)===0||e()&&d(s)===0)&&M(h)})}var c=F(f,2),p=J(c);ai(p,{size:24,get icon(){return vf[t.row.range.type]}});var g=F(p,2),m=J(g),v=J(m,!0);W(m);var _=F(m,2);$n(_,()=>vr(t.row.range,"","icon").outerHTML),W(g),W(c);var S=F(c,2);no(S,()=>t.row.range.text,M=>{var w=w1(),x=J(w);{var A=N=>{var I=b1();V(N,I)},D=N=>{var I=_1();let R=nt(()=>t.row.range.unwrap_parts());var z=Et(I);os(z,{get plugin(){return t.plugin},get text(){return d(R)[0]},get source(){return t.row.path},get class(){return t.row.range.fields.style}});var U=F(z,2);{var tt=rt=>{os(rt,{get plugin(){return t.plugin},get text(){return d(R)[1]},get source(){return t.row.path}})};pt(U,rt=>{t.row.range.type==="substitution"&&rt(tt)})}V(N,I)};pt(x,N=>{t.row.range.empty()?N(A):N(D,!1)})}W(w),Le("mouseenter",w,()=>{o(0)}),V(M,w)});var k=F(S,2);{var E=M=>{var w=$e(),x=Et(w);Qt(x,17,()=>t.row.range.replies,se,(A,D,N)=>{var I=$e(),R=Et(I);no(R,()=>d(D).text,z=>{var U=y1();let tt;var rt=J(U);{var At=wt=>{let qt=nt(()=>({path:t.row.path,range:d(D)}));_u(wt,{get plugin(){return t.plugin},get entry(){return d(qt)},moreOptionsMenu:bu,get menu_open(){return e()},set menu_open(ee){e(ee)}})};pt(rt,wt=>{(!e()&&d(r)===N+1||e()&&d(s)===N+1)&&wt(At)})}var St=F(rt,2);$n(St,()=>vr(d(D),"cmtr-view-range-reply-top").outerHTML);var mt=F(St,2),Dt=J(mt);let Bt=nt(()=>d(D).unwrap());os(Dt,{get plugin(){return t.plugin},get text(){return d(Bt)},get source(){return t.row.path},get class(){return d(D).fields.style}}),W(mt),W(U),ct(wt=>tt=kt(U,1,"cmtr-view-range-reply",null,tt,wt),[()=>({"cmtr-view-range-reply-hovered":d(r)===N+1})]),Le("mouseenter",U,()=>{o(N+1)}),V(z,U)}),V(A,I)}),V(M,w)};pt(k,M=>{t.row.range.replies.length&&M(E)})}W(l),ct(M=>{It(l,"tabindex",t.index),u=kt(l,1,"cmtr-view-range",null,u,M),Wt(v,t.row.path)},[()=>({"cmtr-view-range-completed":t.row.range.fields.done,"cmtr-view-range-selected":d(a)})]),Le("mouseenter",l,()=>{o(0)}),Le("mouseleave",l,()=>{o(null)}),Le("blur",l,()=>{P(n,!1)}),V(i,l),_t()}jt(["click","dblclick","contextmenu"]);var Pn=require("obsidian");var Qg=require("obsidian");var pg={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],todayBtn:"Today",clearBtn:"Clear",okBtn:"Ok",cancelBtn:"Cancel",timeView:"Show time view",backToDate:"Back to calendar view"};var gg={theme:"sdt-calendar-colors",format:"yyyy-mm-dd",formatType:"standard",displayFormat:null,displayFormatType:null,minuteIncrement:1,weekStart:1,inputClasses:"",todayBtnClasses:"sdt-action-btn sdt-today-btn",clearBtnClasses:"sdt-action-btn sdt-clear-btn",hourOnly:!1,todayBtn:!0,clearBtn:!0,clearToggle:!0,autocommit:!0,i18n:pg};var mg=!1,fe=class i extends Date{#t=Oe(super.getTime());#e=new Map;#i=Ct;constructor(...t){super(...t),mg||this.#n()}#n(){mg=!0;var t=i.prototype,e=Date.prototype,n=Object.getOwnPropertyNames(e);for(let r of n)(r.startsWith("get")||r.startsWith("to")||r==="valueOf")&&(t[r]=function(...s){if(s.length>0)return d(this.#t),e[r].apply(this,s);var o=this.#e.get(r);if(o===void 0){let a=Ct;ce(this.#i),o=nt(()=>(d(this.#t),e[r].apply(this,s))),this.#e.set(r,o),ce(a)}return d(o)}),r.startsWith("set")&&(t[r]=function(...s){var o=e[r].apply(this,s);return P(this.#t,e.getTime.call(this)),o})}};function sr(i){P(i,i.v+1)}var vg=Symbol(),wu=class extends URLSearchParams{#t=Oe(0);#e=bg();#i=!1;#n(){if(!this.#e||this.#i)return;this.#i=!0;let t=this.toString();this.#e.search=t&&`?${t}`,this.#i=!1}[vg](t){if(!this.#i){this.#i=!0;for(let e of[...super.keys()])super.delete(e);for(let[e,n]of t)super.append(e,n);sr(this.#t),this.#i=!1}}append(t,e){super.append(t,e),this.#n(),sr(this.#t)}delete(t,e){var n=super.has(t,e);super.delete(t,e),n&&(this.#n(),sr(this.#t))}get(t){return d(this.#t),super.get(t)}getAll(t){return d(this.#t),super.getAll(t)}has(t,e){return d(this.#t),super.has(t,e)}keys(){return d(this.#t),super.keys()}set(t,e){var n=super.getAll(t).join("");super.set(t,e),n!==super.getAll(t).join("")&&(this.#n(),sr(this.#t))}sort(){super.sort(),this.#n(),sr(this.#t)}toString(){return d(this.#t),super.toString()}values(){return d(this.#t),super.values()}entries(){return d(this.#t),super.entries()}[Symbol.iterator](){return this.entries()}get size(){return d(this.#t),super.size}};var k1=null;function bg(){return k1}function as(i,t,e,n){if(i instanceof Date)return i;let r=n==="php"?{date:"Y-m-d",datetime:"Y-m-d H:i",datetime_s:"Y-m-d H:i:s"}:{date:"yyyy-mm-dd",datetime:"yyyy-mm-dd hh:ii",datetime_s:"yyyy-mm-dd hh:ii:ss"},s,o;/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(i)?s=Rr.parseFormat(r.date,n):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(i)?s=Rr.parseFormat(r.datetime,n):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(i)?s=Rr.parseFormat(r.datetime_s,n):(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/.test(i)&&(o=i.match(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/)?.slice(1).filter(v=>v)),s=Rr.parseFormat(t,n));let a=o||i&&i.toString().match(Rr.nonpunctuation)||[];i=new Date,i.setHours(0,0,0,0);let l={},{setters_order:u,setters_map:f}=Rr.setters(n),h,c;if(a.length!==s.parts.length&&s.parts.includes("S")){let v=a[s.parts.indexOf("S")-1].match(/(\d+)([a-zA-Z]+)/)?.slice(1,3);a.splice(s.parts.indexOf("S")-1,1,...v)}if(a.length===s.parts.length){for(var p=0,g=s.parts.length;p14)?e.suffix[r%10-1]:e.suffix[e.suffix.length-1],p:e.meridiem.length===2?e.meridiem[i.getHours()<12?0:1]:"",h:i.getHours(),ii:(i.getMinutes()<10?"0":"")+i.getMinutes(),ss:(i.getUTCSeconds()<10?"0":"")+i.getUTCSeconds()},e.meridiem.length===2?s.H=s.h%12===0?12:s.h%12:s.H=s.h,s.HH=(s.H<10?"0":"")+s.H,s.P=s.p.toUpperCase(),s.hh=(s.h<10?"0":"")+s.h,s.i=s.ii,s.s=s.ss,s.dd=(s.d<10?"0":"")+s.d,s.mm=(s.m<10?"0":"")+s.m;else if(n==="php")s={y:i.getFullYear().toString().substring(2),Y:i.getFullYear(),F:e.months[i.getMonth()],M:e.monthsShort[i.getMonth()],n:i.getMonth()+1,t:Xc(i.getFullYear(),i.getMonth()),j:i.getDate(),l:e.days[i.getDay()],D:e.daysShort[i.getDay()],w:i.getDay(),N:i.getDay()===0?7:i.getDay(),S:r%10&&r%10<4&&(r<10||r>14)?e.suffix[r%10-1]:e.suffix[e.suffix.length-1],a:e.meridiem.length===2?e.meridiem[i.getHours()<12?0:1]:"",g:i.getHours()%12===0?12:i.getHours()%12,G:i.getHours(),i:i.getMinutes(),s:i.getSeconds(),U:Math.floor(i.getTime()/1e3)},s.m=(s.n<10?"0":"")+s.n,s.d=(s.j<10?"0":"")+s.j,s.A=s.a.toString().toUpperCase(),s.h=(s.g<10?"0":"")+s.g,s.H=(s.G<10?"0":"")+s.G,s.i=(s.i<10?"0":"")+s.i,s.s=(s.s<10?"0":"")+s.s;else throw new Error("Invalid format type.");let o=[],a=Rr.parseFormat(t,n);for(var l=0,u=a.parts?.length||0;ln.setHours(r),h:(n,r)=>n.setHours(r),HH:(n,r)=>n.setHours(r===12?0:r),H:(n,r)=>n.setHours(r===12?0:r),i:(n,r)=>n.setMinutes(r),s:(n,r)=>n.setSeconds(r),yyyy:(n,r)=>n.setFullYear(r),yy:(n,r)=>n.setFullYear((r<50?2e3:1900)+r),m:(n,r)=>{for(r-=1;r<0;)r+=12;for(r%=12,n.setMonth(r);n.getMonth()!==r;){if(isNaN(n.getMonth()))return n;n.setDate(n.getDate()-1)}return n},d:(n,r)=>n.setDate(r),p:(n,r)=>n.setHours(r===1&&n.getHours()<12?n.getHours()+12:n.getHours()),t:(n,r)=>n.setTime(r),mm:()=>{},M:()=>{},MM:()=>{},ii:()=>{},ss:()=>{},dd:()=>{},D:()=>{},DD:()=>{},P:()=>{}},e.mm=e.M=e.MM=e.m,e.ii=e.i,e.ss=e.s,e.dd=e.D=e.DD=e.d,e.P=e.p):(t=["Y","yy","m","M","F","n","d","D","j","l","N","S","H","G","h","g","i","s","p","P","U"],e={H:(n,r)=>n.setHours(r),G:(n,r)=>n.setHours(r),h:(n,r)=>n.setHours(r===12?0:r),g:(n,r)=>n.setHours(r===12?0:r),i:(n,r)=>n.setMinutes(r),s:(n,r)=>n.setSeconds(r),Y:(n,r)=>n.setFullYear(r),yy:(n,r)=>n.setFullYear((r<50?2e3:1900)+r),m:(n,r)=>{for(r-=1;r<0;)r+=12;for(r%=12,n.setMonth(r);n.getMonth()!==r;){if(isNaN(n.getMonth()))return n;n.setDate(n.getDate()-1)}return n},n:(n,r)=>n.setMonth(r-1),d:(n,r)=>n.setDate(r),a:(n,r)=>n.setHours(r===1?n.getHours()+12:n.getHours()),U:(n,r)=>n.setTime(r*1e3)},e.F=e.M=e.m,e.D=e.j=e.l=e.N=e.d,e.A=e.a),{setters_order:t,setters_map:e}}};function _g(i,t,e,n,r){if(e===0){let w=10,x=20,A=-1,D=[],N=[],I=i.getFullYear()-i.getFullYear()%10;I-=I%20?12:10,I%10&&(w=12,x=22);for(let z=0;z<32;z++)N.push(I+z),N.length===4&&(D.push(N),N=[]);let R=[];return t[0]||(t[0]=new Date),t[0].getFullYear()>=I&&R.push(t[0].getFullYear()%I),{years:D,todayMark:A,nextFrom:x,prevTo:w,selectionMark:R}}if(e===1){let w=[],x=[],A=12,D=24,N=i.toISOString().split("T")[0].substring(0,8),I=new Date(N+"01 00:00:00"),R=I.getFullYear()-1;I.setFullYear(R);let z=0;for(let tt=0;tt<3;tt++){for(let rt=0;rt<12;rt++)I.setMonth(rt),x.push(n.monthsShort[rt%12]),x.length===4&&(w.push(x),x=[]);I.setFullYear(I.getFullYear()+1)}let U=[];return t[0]||(t[0]=new Date),t[0].getFullYear()-R>=0&&t[0].getFullYear()-R<=2&&U.push(t[0].getMonth()+(t[0].getFullYear()-R||0)*12),{months:w,todayMark:z,nextFrom:D,prevTo:A,selectionMark:U}}let s=i||new Date,o=s.getFullYear(),a=s.getMonth(),l=s.getDate(),u=s.getHours(),f=new Date,h=new Date(o,a-1,28,0,0,0,0),c=Xc(h.getFullYear(),h.getMonth());h.setDate(c),h.setDate(c-(h.getDay()-r+7)%7);let p=new Date(h);p.setDate(p.getDate()+42);let g=p.valueOf(),m=[],v=[],_=-1,S=[],k=0,E=42,M=0;for(;h.valueOf()o||h.getFullYear()===o&&h.getMonth()>a)&&(E=M-1),h.setDate(h.getDate()+1),h.getFullYear()===f.getFullYear()&&h.getMonth()===f.getMonth()&&h.getDate()===f.getDate()&&(_=M),S.length!==t.length&&t.map(w=>{h.getFullYear()===w.getFullYear()&&h.getMonth()===w.getMonth()&&h.getDate()===w.getDate()&&S.push(M)}),v.length===7&&(m.push(v),v=[]);return{grid:m,days:m,todayMark:_,prevTo:k,nextFrom:E,selectionMark:S}}function wg(i){let t=i-1;return t*t*t+1}function yg(i,{duration:t=400,start:e=0,end:n=1,opacity:r=0}){let s=getComputedStyle(i),o=+s.opacity,a=s.transform==="none"?"":s.transform,l=1-e,u=o*(1-r);return n=n||1,{delay:0,duration:t,easing:wg,css:(f,h)=>` + transform: ${a} scale(${n!==1?e+n*h:1-l*h}); + opacity: ${o-u*h}; + `}}function M1(i,t,e,n,r,s,o,a){if(P(t,-1),P(e,!0),d(n)&&ra(n,-1),d(n)===0){let l=Math.floor(d(r).getFullYear()/10)*10%20===0;P(s,l?o:a,!0)}}function E1(i,t){t.onswitch?.("time")}var T1=G(''),A1=(i,t)=>t(-1),C1=(i,t)=>t(1),O1=(i,t,e)=>{t(d(e))},D1=G(''),$1=G(''),R1=G('
'),I1=(i,t,e)=>{t(d(e))},P1=G(''),N1=G(''),L1=G('
'),B1=G(' '),F1=(i,t,e)=>{t(d(e))},H1=G(''),V1=G(""),z1=G('
'),G1=G('
',1),q1={hash:"svelte-s6uyff",code:`td.svelte-s6uyff,th.svelte-s6uyff {padding:0;border-width:0;}.sdt-cal-td.svelte-s6uyff {padding:0;font-size:90%;text-align:center; /* background-color: var(--sdt-bg-main, #fff); */}.sdt-cal-th.svelte-s6uyff {text-align:center;height:24px;}.sdt-calendar.svelte-s6uyff {height:221px;overflow:hidden;}.sdt-calendar.is-grid.svelte-s6uyff {display:grid;}.sdt-calendar.is-grid.svelte-s6uyff .sdt-table:where(.svelte-s6uyff) {grid-column:1/2;grid-row:1/2;}.sdt-table.svelte-s6uyff {width:100%;border-collapse:collapse;margin:0;background-color:var(--sdt-table-bg, transparent);}.sdt-table-height.svelte-s6uyff {height:222px;}.animate-transition.svelte-s6uyff {will-change:transform;transition:transform .3s ease;}.not-current.svelte-s6uyff {opacity:0.3;}.not-current.svelte-s6uyff:hover {opacity:0.55;}.std-btn.svelte-s6uyff {margin:0;border:0;background:transparent;text-align:center;width:100%;border-radius:4px;cursor:pointer;padding:0.3rem;box-sizing:border-box;color:var(--sdt-color, initial);}.sdt-btn-day.svelte-s6uyff {max-height:32px;height:32px;}.std-btn[disabled].svelte-s6uyff {cursor:not-allowed;opacity:0.5;color:var(--sdt-table-disabled-date, #b22222);background-color:var(--sdt-table-disabled-date-bg, var(--sdt-bg-main, #fff));}.std-btn-header.svelte-s6uyff {width:auto;font-weight:bold;padding:0.375em 0.5em;color:var(--sdt-header-color, var(--sdt-color, initial));}.std-btn-header.icon-btn.svelte-s6uyff:first-of-type {padding-left:0.375em;padding-right:0.375em;}.std-btn-header.icon-btn.svelte-s6uyff {padding-left:0.25em;padding-right:0.25em;}.std-btn.svelte-s6uyff:hover {background-color:var(--sdt-table-data-bg-hover, #eee);}.is-selected.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {border-radius:4px 0 0 4px}.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff), .in-range-hover.svelte-s6uyff:not(.is-selected) .std-btn:where(.svelte-s6uyff) {background-color:color-mix(in srgb, transparent 75%, var(--sdt-bg-selected, #286090));border-radius:0;} /* range selection: start */.in-range-hover.is-selected:has(+ .in-range-hover) .std-btn {border-top-right-radius:0;border-bottom-right-radius:0;}.in-range-hover.svelte-s6uyff + .in-range-hover.is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-top-left-radius:0;border-bottom-left-radius:0;}.in-range.svelte-s6uyff:not(.is-selected) .std-btn:where(.svelte-s6uyff):hover {background-color:color-mix(in srgb, var(--sdt-table-data-bg-hover, #eee) 75%, var(--sdt-bg-selected, #286090));} @@ -75,7 +60,7 @@ ${l}in ${G}`).join("")} .is-selected.svelte-s6uyff + .is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-top-left-radius:0;border-bottom-left-radius:0;}.is-selected.svelte-s6uyff + .is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-left:1px solid color-mix(in srgb, white 75%, var(--sdt-table-selected-bg, var(--sdt-bg-selected, #286090)));margin-left:-1px;}.is-selected.svelte-s6uyff .std-btn:where(.svelte-s6uyff), .is-selected.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {background-color:var(--sdt-table-selected-bg, var(--sdt-bg-selected, #286090));color:var(--sdt-color-selected, var(--sdt-bg-main, #fff));opacity:0.9;}.std-btn-header.svelte-s6uyff:hover {background-color:var(--sdt-header-btn-bg-hover, #dfdfdf);}.sdt-time-icon.svelte-s6uyff {display:inline-flex;align-items:center;padding:0.375em !important;}.sdt-time-icon.svelte-s6uyff svg:where(.svelte-s6uyff) {height:1em !important;stroke:initial !important;}.sdt-tbody-lg.svelte-s6uyff {background-color:var(--sdt-bg-main, #fff);}.sdt-tbody-lg.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {height:74px;}.sdt-thead-nav.svelte-s6uyff {display:flex;margin-bottom:0.25em;align-items:stretch;}.sdt-nav-btns.svelte-s6uyff {white-space:nowrap;}.sdt-toggle-btn.svelte-s6uyff {width:100%;text-align:left;}.sdt-today.svelte-s6uyff {position:relative;}.sdt-today.svelte-s6uyff:before {box-sizing:border-box;position:absolute;content:'';margin-left:4px;margin-top:4px;border-left:4px solid var(--sdt-table-today-indicator, #ccc);border-top:4px solid var(--sdt-table-today-indicator, #ccc);border-bottom:4px solid transparent;border-right:4px solid transparent;border-radius:2px;height:4px;z-index:2;}.sdt-svg.svelte-s6uyff {fill:var(--sdt-header-color, initial);}.sdt-today.svelte-s6uyff:hover:before, .in-range.sdt-today.svelte-s6uyff:before {border-left-color:var(--sdt-bg-selected, #286090);border-top-color:var(--sdt-bg-selected, #286090);}.is-selected.sdt-today.svelte-s6uyff:before - {border-left-color:#eee;border-top-color:#eee;}`};function Dc(C,I){VI(I,!0),IF(C,pV);let g=J(I,"wid",3,0),B=J(I,"dates",19,()=>[]),F=J(I,"startDate",3,null),Q=J(I,"endDate",3,null),A=J(I,"weekStart",3,1),U=J(I,"initialView",3,2),l=J(I,"enableTimeToggle",3,!1),s=J(I,"isRange",3,!1),G=J(I,"hoverDate",15,null);function t($,dI){if(i(e)!==2){Y(e,2,!0),Y(x,1),Y(b,new ig(d||new Date),!0);return}if(!d){XI(new Date,{keyboard:!0});return}let UI=new Date(d);switch($){case"PageDown":dI=!0;case"ArrowDown":dI?UI.setMonth(d.getMonth()+1):UI.setDate(d.getDate()+7),dI&&UI.getMonth()===d.getMonth()&&UI.setDate(0),XI(UI,{keyboard:!0});break;case"PageUp":dI=!0;case"ArrowUp":dI?UI.setMonth(d.getMonth()-1):UI.setDate(d.getDate()-7),dI&&UI.getMonth()===d.getMonth()&&UI.setDate(0),XI(UI,{keyboard:!0});break;case"ArrowLeft":dI?UI.setFullYear(d.getFullYear()-1):UI.setDate(d.getDate()-1),XI(UI,{keyboard:!0});break;case"ArrowRight":dI?UI.setFullYear(d.getFullYear()+1):UI.setDate(d.getDate()+1),XI(UI,{keyboard:!0});break}}function c($){i(b).setTime($.getTime()),d=new Date($.getTime())}let d=B()[g()]||null,b=lI(rI(g()===1?(()=>{if(B().length===2&&B()[1]&&(B()[0].getMonth()!=B()[1].getMonth()||B()[0].getFullYear()!=B()[1].getFullYear()))return new ig(B()[1]);let $=new Date(B()[0]||new Date);return $.setMonth($.getMonth()+1),new ig($)})():new ig(B()[0]?.valueOf()||new Date))),Z=BI(()=>F()?new ig(F().getFullYear(),F().getMonth(),F().getDate(),0,0,0,0):null),e=lI(rI(U())),x=lI(-2),a=lI(!1),n=400,h=BI(()=>i(x)<1?1.5:.5),m=BI(()=>i(x)<1?1:1.5),L=222,R=148,o=lI(L),y=lI(null),H=BI(()=>i(x)===-2?oF:i(x)!==null?sb:()=>({})),r=BI(()=>B().map($=>($=new Date($),$.setHours(0,0,0,0),$.getTime()))),N=BI(()=>Ub(i(b),DA(B()),i(e),I.i18n,A())),T=BI(()=>I.i18n.daysMin.concat(...I.i18n.daysMin.slice(1)).slice(A(),7+A())),M=BI(()=>I.i18n&&mI(i(e),i(b)));function q($){return i(N).prevTo<=$&&$$||Q()&&Q()<=$||I.additionalDisableFn&&I.additionalDisableFn($))return!0;break;case 1:let dI=$.getFullYear(),UI=i(Z)?.getFullYear(),DI=Q()?.getFullYear();if(UI&&i(Z)&&(UI===dI&&i(Z).getMonth()>$.getMonth()||UI>dI)||DI&&Q()&&(DI===dI&&Q().getMonth()<$.getMonth()||DI$.getFullYear()||Q()&&Q().getFullYear()<$.getFullYear())return!0;break}return!1}function aI($,dI,UI){let DI=dI===1,Ug=DI?Q():i(Z);return Ug?UI===0?DI?$.getFullYear()+dI*10>Ug.getFullYear():$.getFullYear()+dI*10Ug.getFullYear():$.getFullYear()+dIUg.getFullYear()*100+Ug.getMonth():$.getFullYear()*100+$.getMonth()+dI28&&i(b).setDate(i(b).getDate()-3),i(b).setMonth(i(b).getMonth()+$*dI),Y(y,null),Y(o,i(e)===0?i(b).getFullYear()%20>=10?L:R:L,!0)}function ZI($){if(i(e)===2)return uI($);if(Y(y,()=>{uI($)}),i(e)===0){Y(o,i(o)===R?$===-1?i(o)-L:L+R:$===-1?i(o)-L:i(o)+R,!0);return}Y(o,$===-1?i(o)-L:i(o)+L,!0)}function XI($,{keyboard:dI}={}){switch(Y(x,1),Y(a,!0),i(e)){case 0:i(b).setFullYear($),Y(b,i(b),!0);break;case 1:i(b).setMonth(I.i18n.monthsShort.indexOf($)),Y(b,i(b),!0);break;case 2:if(AI($)||I.additionalDisableFn&&I.additionalDisableFn($))return;let UI=new Date($.getFullYear(),$.getMonth(),$.getDate());d&&(UI.setMinutes(d.getMinutes()),UI.setHours(d.getHours())),d=UI,dI&&(i(b).getFullYear()!==UI.getFullYear()||i(b).getFullYear()===UI.getFullYear()&&i(b).getMonth()!==UI.getMonth())&&(i(b).setFullYear(UI.getFullYear()),i(b).getDate()>28&&i(b).setDate(28),i(b).setMonth(UI.getMonth()),Y(b,i(b),!0)),I.onupdate?.({type:"date",date:d,isKeyboard:dI});break}i(e)<2&&jA(e),Y(o,L)}og(()=>{B().length===0&&(d=null)});function kI(){Y(a,!1)}function mI($,dI){switch($){case 0:let UI=i(N).years[Math.floor(i(N).prevTo/4)][i(N).prevTo%4],DI=i(N).years[Math.floor(i(N).nextFrom/4)][i(N).nextFrom%4];return`${UI} - ${DI}`;case 1:return dI.getFullYear();case 2:return I.i18n.months[dI.getMonth()]+" "+dI.getFullYear()}}function wI($=null){return function(dI){G($?.getTime()||null),I.onhoverupdate?.(G())}}function gg($){return i(r).length===2?$>=i(r)[0]&&$=dI&&i(r)[0]>=$)}var hI=rV(),WI=yI(hI),rg=O(WI);rg.__click=[ZV,x,a,e,b,o,R,L];var PI=O(rg,!0);z(rg);var p=v(rg,2);{var w=$=>{var dI=VV();dI.__click=[eV,I],sI(()=>{pI(dI,"title",I.i18n.timeView),pI(dI,"aria-label",I.i18n.timeView)}),D($,dI)};GI(p,$=>{l()&&B().length&&$(w)})}var QI=v(p,2);QI.__click=[xV,ZI];var FI=v(QI,2);FI.__click=[uV,ZI],fQ(2),z(WI);var fI=v(WI,2);let oI;var eI=O(fI);{var MI=$=>{var dI=aV(),UI=O(dI);let DI;qI(UI,21,()=>i(N).years,Qg,(Ug,bC,ZC)=>{var yg=nV();qI(yg,21,()=>i(bC),Qg,(eC,VC,kg)=>{var Rg=RV();let Dg=BI(()=>ZC*4+kg),Tg;var Vg=O(Rg);let $g;Vg.__click=[LV,XI,VC];var xC=O(Vg,!0);z(Vg),z(Rg),sI((uB,WC,ng)=>{Tg=nI(Rg,1,"sdt-cal-td svelte-s6uyff",null,Tg,uB),$g=nI(Vg,1,"std-btn svelte-s6uyff",null,$g,WC),Vg.disabled=ng,vI(xC,i(VC))},[()=>({"is-selected":i(N).selectionMark.includes(i(Dg))}),()=>({"not-current":!q(i(Dg))}),()=>AI(new Date(i(VC),i(b).getMonth(),i(b).getDate()))]),D(eC,Rg)}),z(yg),D(Ug,yg)}),z(UI),z(dI),sI(Ug=>{DI=nI(UI,1,"sdt-tbody-lg svelte-s6uyff",null,DI,Ug),gB(UI,`transform: translateY(-${i(o)}px); color: red`)},[()=>({"animate-transition":!!i(y)})]),vg("outroend",UI,kI),vg("transitionend",UI,()=>i(y)&&i(y)()),_g(1,UI,()=>i(H),()=>({duration:n,start:i(h),opacity:1})),_g(2,UI,()=>i(H),()=>({duration:n,end:i(m),start:1})),D($,dI)};GI(eI,$=>{i(e)===0&&$(MI)})}var Ag=v(eI,2);{var jI=$=>{var dI=oV(),UI=O(dI);let DI;qI(UI,21,()=>i(N).months,Qg,(Ug,bC,ZC)=>{var yg=XV();qI(yg,21,()=>i(bC),Qg,(eC,VC,kg)=>{var Rg=hV();let Dg=BI(()=>ZC*4+kg),Tg;var Vg=O(Rg);let $g;Vg.__click=[mV,XI,VC];var xC=O(Vg,!0);z(Vg),z(Rg),sI((uB,WC,ng)=>{Tg=nI(Rg,1,"sdt-cal-td svelte-s6uyff",null,Tg,uB),$g=nI(Vg,1,"std-btn svelte-s6uyff",null,$g,WC),Vg.disabled=ng,vI(xC,i(VC))},[()=>({"is-selected":i(Dg)===i(N).selectionMark[0]}),()=>({"not-current":!q(i(Dg))}),()=>AI(new Date(i(b).getFullYear(),I.i18n.monthsShort.indexOf(i(VC)),i(b).getDate()))]),D(eC,Rg)}),z(yg),D(Ug,yg)}),z(UI),z(dI),sI(Ug=>{DI=nI(UI,1,"sdt-tbody-lg svelte-s6uyff",null,DI,Ug),gB(UI,`transform: translateY(-${i(o)}px)`)},[()=>({"animate-transition":!!i(y)})]),vg("outroend",UI,kI),vg("transitionend",UI,()=>i(y)&&i(y)()),_g(1,UI,()=>i(H),()=>({duration:n,start:i(h),opacity:1})),_g(2,UI,()=>i(H),()=>({duration:n,end:i(m),start:1})),D($,dI)};GI(Ag,$=>{i(e)===1&&$(jI)})}var YI=v(Ag,2);{var bg=$=>{var dI=NV(),UI=O(dI),DI=O(UI);qI(DI,21,()=>i(T),Qg,(bC,ZC)=>{var yg=yV(),eC=O(yg,!0);z(yg),sI(()=>vI(eC,i(ZC))),D(bC,yg)}),z(DI);var Ug=v(DI);qI(Ug,17,()=>i(N).days,Qg,(bC,ZC,yg)=>{var eC=EV();qI(eC,21,()=>i(ZC),Qg,(VC,kg,Rg)=>{var Dg=WV();let Tg=BI(()=>yg*7+Rg),Vg=BI(()=>i(kg).getTime()),$g;var xC=BI(()=>wI(i(kg)));Dg.__mouseover=function(...FB){i(xC)?.apply(this,FB)};var uB=BI(wI);Dg.__mouseout=function(...FB){i(uB)?.apply(this,FB)};var WC=O(Dg);WC.__click=[SV,XI,kg];let ng;var WF=O(WC,!0);z(WC),z(Dg),sI((FB,EF,lQ,AA)=>{$g=nI(Dg,1,"sdt-cal-td svelte-s6uyff",null,$g,FB),ng=nI(WC,1,"std-btn sdt-btn-day svelte-s6uyff",null,ng,EF),WC.disabled=lQ,vI(WF,AA)},[()=>({"sdt-today":i(Tg)===i(N).todayMark,"in-range":gg(i(Vg)),"is-selected":i(r).includes(i(Vg)),"in-range-hover":s()&&HI(i(Vg),G())}),()=>({"not-current":!q(yg*7+Rg)}),()=>(i(Z)||Q()||I.additionalDisableFn)&&AI(i(kg)),()=>i(kg).getDate()]),D(VC,Dg)}),z(eC),D(bC,eC)}),z(UI),z(dI),vg("outroend",UI,kI),_g(1,UI,()=>i(H),()=>({duration:n,start:.5,opacity:1})),_g(2,UI,()=>i(H),()=>({duration:n,start:Math.abs(i(x))})),D($,dI)};GI(YI,$=>{i(e)===2&&$(bg)})}return z(fI),sI(($,dI,UI,DI,Ug,bC,ZC)=>{vI(PI,i(M)),pI(QI,"title",$),pI(QI,"aria-label",dI),QI.disabled=UI,pI(FI,"title",DI),pI(FI,"aria-label",Ug),FI.disabled=bC,oI=nI(fI,1,"sdt-calendar svelte-s6uyff",null,oI,ZC)},[()=>I.i18n.months[(i(b).getMonth()-1)%12],()=>I.i18n.months[(i(b).getMonth()-1)%12],()=>aI(i(b),-1,i(e)),()=>I.i18n.months[(i(b).getMonth()+1)%12],()=>I.i18n.months[(i(b).getMonth()+1)%12],()=>aI(i(b),1,i(e)),()=>({"is-grid":i(a)})]),D(C,hI),xI({handleGridNav:t,focusDate:c})}KI(["click","mouseover","mouseout"]);function HV(C,I,g,B,F,Q){let A=parseInt(C.target.dataset.value);i(I).setHours(A),Y(I,i(I),!0),g.onupdate?.({type:i(B)?"minute":"hour",date:F(i(I)),isKeyboard:C.type==="keyboard",dateIndex:Q()})}function tb(C,I){Y(I,C.type==="mousedown")}function YV(C,I){I.onswitch("date")}var JV=f(''),vV=(C,I)=>Y(I,!1),kV=(C,I)=>Y(I,!0),DV=f(' : ',1),TV=f(' '),wV=f(': 00',1),fV=f(' ',1),zV=f('
'),MV=(C,I)=>{C.preventDefault(),I(C)},KV=(C,I,g)=>{i(I)&&g(C)},PV=f(''),jV=f(''),OV=f('
'),_V={hash:"svelte-1piwi8e",code:`.sdt-timer.svelte-1piwi8e {position:relative; + {border-left-color:#eee;border-top-color:#eee;}`};function Qc(i,t){bt(t,!0),ir(i,q1);let e=B(t,"wid",3,0),n=B(t,"dates",19,()=>[]),r=B(t,"startDate",3,null),s=B(t,"endDate",3,null),o=B(t,"weekStart",3,1),a=B(t,"initialView",3,2),l=B(t,"enableTimeToggle",3,!1),u=B(t,"isRange",3,!1),f=B(t,"hoverDate",15,null);function h(Q,dt){if(d(v)!==2){P(v,2,!0),P(_,1),P(g,new fe(p||new Date),!0);return}if(!p){Dt(new Date,{keyboard:!0});return}let ot=new Date(p);switch(Q){case"PageDown":dt=!0;case"ArrowDown":dt?ot.setMonth(p.getMonth()+1):ot.setDate(p.getDate()+7),dt&&ot.getMonth()===p.getMonth()&&ot.setDate(0),Dt(ot,{keyboard:!0});break;case"PageUp":dt=!0;case"ArrowUp":dt?ot.setMonth(p.getMonth()-1):ot.setDate(p.getDate()-7),dt&&ot.getMonth()===p.getMonth()&&ot.setDate(0),Dt(ot,{keyboard:!0});break;case"ArrowLeft":dt?ot.setFullYear(p.getFullYear()-1):ot.setDate(p.getDate()-1),Dt(ot,{keyboard:!0});break;case"ArrowRight":dt?ot.setFullYear(p.getFullYear()+1):ot.setDate(p.getDate()+1),Dt(ot,{keyboard:!0});break}}function c(Q){d(g).setTime(Q.getTime()),p=new Date(Q.getTime())}let p=n()[e()]||null,g=at(Rt(e()===1?(()=>{if(n().length===2&&n()[1]&&(n()[0].getMonth()!=n()[1].getMonth()||n()[0].getFullYear()!=n()[1].getFullYear()))return new fe(n()[1]);let Q=new Date(n()[0]||new Date);return Q.setMonth(Q.getMonth()+1),new fe(Q)})():new fe(n()[0]?.valueOf()||new Date))),m=nt(()=>r()?new fe(r().getFullYear(),r().getMonth(),r().getDate(),0,0,0,0):null),v=at(Rt(a())),_=at(-2),S=at(!1),k=400,E=nt(()=>d(_)<1?1.5:.5),M=nt(()=>d(_)<1?1:1.5),w=222,x=148,A=at(w),D=at(null),N=nt(()=>d(_)===-2?$r:d(_)!==null?yg:()=>({})),I=nt(()=>n().map(Q=>(Q=new Date(Q),Q.setHours(0,0,0,0),Q.getTime()))),R=nt(()=>_g(d(g),Jo(n()),d(v),t.i18n,o())),z=nt(()=>t.i18n.daysMin.concat(...t.i18n.daysMin.slice(1)).slice(o(),7+o())),U=nt(()=>t.i18n&&wt(d(v),d(g)));function tt(Q){return d(R).prevTo<=Q&&QQ||s()&&s()<=Q||t.additionalDisableFn&&t.additionalDisableFn(Q))return!0;break;case 1:let dt=Q.getFullYear(),ot=d(m)?.getFullYear(),Ft=s()?.getFullYear();if(ot&&d(m)&&(ot===dt&&d(m).getMonth()>Q.getMonth()||ot>dt)||Ft&&s()&&(Ft===dt&&s().getMonth()Q.getFullYear()||s()&&s().getFullYear()ae.getFullYear():Q.getFullYear()+dt*10ae.getFullYear():Q.getFullYear()+dtae.getFullYear()*100+ae.getMonth():Q.getFullYear()*100+Q.getMonth()+dt28&&d(g).setDate(d(g).getDate()-3),d(g).setMonth(d(g).getMonth()+Q*dt),P(D,null),P(A,d(v)===0?d(g).getFullYear()%20>=10?w:x:w,!0)}function mt(Q){if(d(v)===2)return St(Q);if(P(D,()=>{St(Q)}),d(v)===0){P(A,d(A)===x?Q===-1?d(A)-w:w+x:Q===-1?d(A)-w:d(A)+x,!0);return}P(A,Q===-1?d(A)-w:d(A)+w,!0)}function Dt(Q,{keyboard:dt}={}){switch(P(_,1),P(S,!0),d(v)){case 0:d(g).setFullYear(Q),P(g,d(g),!0);break;case 1:d(g).setMonth(t.i18n.monthsShort.indexOf(Q)),P(g,d(g),!0);break;case 2:if(rt(Q)||t.additionalDisableFn&&t.additionalDisableFn(Q))return;let ot=new Date(Q.getFullYear(),Q.getMonth(),Q.getDate());p&&(ot.setMinutes(p.getMinutes()),ot.setHours(p.getHours())),p=ot,dt&&(d(g).getFullYear()!==ot.getFullYear()||d(g).getFullYear()===ot.getFullYear()&&d(g).getMonth()!==ot.getMonth())&&(d(g).setFullYear(ot.getFullYear()),d(g).getDate()>28&&d(g).setDate(28),d(g).setMonth(ot.getMonth()),P(g,d(g),!0)),t.onupdate?.({type:"date",date:p,isKeyboard:dt});break}d(v)<2&&ra(v),P(A,w)}Te(()=>{n().length===0&&(p=null)});function Bt(){P(S,!1)}function wt(Q,dt){switch(Q){case 0:let ot=d(R).years[Math.floor(d(R).prevTo/4)][d(R).prevTo%4],Ft=d(R).years[Math.floor(d(R).nextFrom/4)][d(R).nextFrom%4];return`${ot} - ${Ft}`;case 1:return dt.getFullYear();case 2:return t.i18n.months[dt.getMonth()]+" "+dt.getFullYear()}}function qt(Q=null){return function(dt){f(Q?.getTime()||null),t.onhoverupdate?.(f())}}function ee(Q){return d(I).length===2?Q>=d(I)[0]&&Q=dt&&d(I)[0]>=Q)}var Tt=G1(),Nt=Et(Tt),Xe=J(Nt);Xe.__click=[M1,_,S,v,g,A,x,w];var Jt=J(Xe,!0);W(Xe);var L=F(Xe,2);{var q=Q=>{var dt=T1();dt.__click=[E1,t],ct(()=>{It(dt,"title",t.i18n.timeView),It(dt,"aria-label",t.i18n.timeView)}),V(Q,dt)};pt(L,Q=>{l()&&n().length&&Q(q)})}var lt=F(L,2);lt.__click=[A1,mt];var st=F(lt,2);st.__click=[C1,mt],Ks(2),W(Nt);var zt=F(Nt,2);let Mt;var vt=J(zt);{var Ut=Q=>{var dt=R1(),ot=J(dt);let Ft;Qt(ot,21,()=>d(R).years,se,(ae,gi,mi)=>{var Ae=$1();Qt(Ae,21,()=>d(gi),se,(vi,bi,Be)=>{var ye=D1();let Fe=nt(()=>mi*4+Be),He;var ve=J(ye);let Qe;ve.__click=[O1,Dt,bi];var _i=J(ve,!0);W(ve),W(ye),ct((kn,Oi,xe)=>{He=kt(ye,1,"sdt-cal-td svelte-s6uyff",null,He,kn),Qe=kt(ve,1,"std-btn svelte-s6uyff",null,Qe,Oi),ve.disabled=xe,Wt(_i,d(bi))},[()=>({"is-selected":d(R).selectionMark.includes(d(Fe))}),()=>({"not-current":!tt(d(Fe))}),()=>rt(new Date(d(bi),d(g).getMonth(),d(g).getDate()))]),V(vi,ye)}),W(Ae),V(ae,Ae)}),W(ot),W(dt),ct(ae=>{Ft=kt(ot,1,"sdt-tbody-lg svelte-s6uyff",null,Ft,ae),nn(ot,`transform: translateY(-${d(A)}px); color: red`)},[()=>({"animate-transition":!!d(D)})]),Le("outroend",ot,Bt),Le("transitionend",ot,()=>d(D)&&d(D)()),Ke(1,ot,()=>d(N),()=>({duration:k,start:d(E),opacity:1})),Ke(2,ot,()=>d(N),()=>({duration:k,end:d(M),start:1})),V(Q,dt)};pt(vt,Q=>{d(v)===0&&Q(Ut)})}var oe=F(vt,2);{var Yt=Q=>{var dt=L1(),ot=J(dt);let Ft;Qt(ot,21,()=>d(R).months,se,(ae,gi,mi)=>{var Ae=N1();Qt(Ae,21,()=>d(gi),se,(vi,bi,Be)=>{var ye=P1();let Fe=nt(()=>mi*4+Be),He;var ve=J(ye);let Qe;ve.__click=[I1,Dt,bi];var _i=J(ve,!0);W(ve),W(ye),ct((kn,Oi,xe)=>{He=kt(ye,1,"sdt-cal-td svelte-s6uyff",null,He,kn),Qe=kt(ve,1,"std-btn svelte-s6uyff",null,Qe,Oi),ve.disabled=xe,Wt(_i,d(bi))},[()=>({"is-selected":d(Fe)===d(R).selectionMark[0]}),()=>({"not-current":!tt(d(Fe))}),()=>rt(new Date(d(g).getFullYear(),t.i18n.monthsShort.indexOf(d(bi)),d(g).getDate()))]),V(vi,ye)}),W(Ae),V(ae,Ae)}),W(ot),W(dt),ct(ae=>{Ft=kt(ot,1,"sdt-tbody-lg svelte-s6uyff",null,Ft,ae),nn(ot,`transform: translateY(-${d(A)}px)`)},[()=>({"animate-transition":!!d(D)})]),Le("outroend",ot,Bt),Le("transitionend",ot,()=>d(D)&&d(D)()),Ke(1,ot,()=>d(N),()=>({duration:k,start:d(E),opacity:1})),Ke(2,ot,()=>d(N),()=>({duration:k,end:d(M),start:1})),V(Q,dt)};pt(oe,Q=>{d(v)===1&&Q(Yt)})}var Lt=F(oe,2);{var pe=Q=>{var dt=z1(),ot=J(dt),Ft=J(ot);Qt(Ft,21,()=>d(z),se,(gi,mi)=>{var Ae=B1(),vi=J(Ae,!0);W(Ae),ct(()=>Wt(vi,d(mi))),V(gi,Ae)}),W(Ft);var ae=F(Ft);Qt(ae,17,()=>d(R).days,se,(gi,mi,Ae)=>{var vi=V1();Qt(vi,21,()=>d(mi),se,(bi,Be,ye)=>{var Fe=H1();let He=nt(()=>Ae*7+ye),ve=nt(()=>d(Be).getTime()),Qe;var _i=nt(()=>qt(d(Be)));Fe.__mouseover=function(...on){d(_i)?.apply(this,on)};var kn=nt(qt);Fe.__mouseout=function(...on){d(kn)?.apply(this,on)};var Oi=J(Fe);Oi.__click=[F1,Dt,Be];let xe;var Pr=J(Oi,!0);W(Oi),W(Fe),ct((on,Nr,ps,fo)=>{Qe=kt(Fe,1,"sdt-cal-td svelte-s6uyff",null,Qe,on),xe=kt(Oi,1,"std-btn sdt-btn-day svelte-s6uyff",null,xe,Nr),Oi.disabled=ps,Wt(Pr,fo)},[()=>({"sdt-today":d(He)===d(R).todayMark,"in-range":ee(d(ve)),"is-selected":d(I).includes(d(ve)),"in-range-hover":u()&&Vt(d(ve),f())}),()=>({"not-current":!tt(Ae*7+ye)}),()=>(d(m)||s()||t.additionalDisableFn)&&rt(d(Be)),()=>d(Be).getDate()]),V(bi,Fe)}),W(vi),V(gi,vi)}),W(ot),W(dt),Le("outroend",ot,Bt),Ke(1,ot,()=>d(N),()=>({duration:k,start:.5,opacity:1})),Ke(2,ot,()=>d(N),()=>({duration:k,start:Math.abs(d(_))})),V(Q,dt)};pt(Lt,Q=>{d(v)===2&&Q(pe)})}return W(zt),ct((Q,dt,ot,Ft,ae,gi,mi)=>{Wt(Jt,d(U)),It(lt,"title",Q),It(lt,"aria-label",dt),lt.disabled=ot,It(st,"title",Ft),It(st,"aria-label",ae),st.disabled=gi,Mt=kt(zt,1,"sdt-calendar svelte-s6uyff",null,Mt,mi)},[()=>t.i18n.months[(d(g).getMonth()-1)%12],()=>t.i18n.months[(d(g).getMonth()-1)%12],()=>At(d(g),-1,d(v)),()=>t.i18n.months[(d(g).getMonth()+1)%12],()=>t.i18n.months[(d(g).getMonth()+1)%12],()=>At(d(g),1,d(v)),()=>({"is-grid":d(S)})]),V(i,Tt),_t({handleGridNav:h,focusDate:c})}jt(["click","mouseover","mouseout"]);function W1(i,t,e,n,r,s){let o=parseInt(i.target.dataset.value);d(t).setHours(o),P(t,d(t),!0),e.onupdate?.({type:d(n)?"minute":"hour",date:r(d(t)),isKeyboard:i.type==="keyboard",dateIndex:s()})}function xg(i,t){P(t,i.type==="mousedown")}function U1(i,t){t.onswitch("date")}var j1=G(''),Y1=(i,t)=>P(t,!1),K1=(i,t)=>P(t,!0),J1=G(' : ',1),X1=G(' '),Q1=G(': 00',1),Z1=G(' ',1),tb=G('
'),eb=(i,t)=>{i.preventDefault(),t(i)},ib=(i,t,e)=>{d(t)&&e(i)},nb=G(''),rb=G(''),sb=G('
'),ob={hash:"svelte-1piwi8e",code:`.sdt-timer.svelte-1piwi8e {position:relative; /* width: 272px; */--sdt-clock-size: 220px;}.sdt-time-head.svelte-1piwi8e {position:relative;display:flex;justify-content:center;align-items:center;margin-bottom:4px;color:var(--sdt-header-color, initial);}.sdt-time-figure.svelte-1piwi8e {font-size:1.5em;font-weight:bold;padding:0 0.375em;}.sdt-time-figure.svelte-1piwi8e + .sdt-time-figure:where(.svelte-1piwi8e) {margin-left:-12px;}.sdt-clock.svelte-1piwi8e {margin:auto;position:relative;width:var(--sdt-clock-size);height:var(--sdt-clock-size);background-color:var(--sdt-clock-bg, #eeeded);border-radius:50%;transition:background-color 0.3s;overflow:hidden;}.sdt-time-btn.svelte-1piwi8e {border:0;background:transparent;text-align:center;border-radius:4px;cursor:pointer;height:38px;padding:0 0.375em;color:var(--sdt-header-color, initial);}.sdt-time-btn.svelte-1piwi8e > svg:where(.svelte-1piwi8e) {stroke:initial !important;}.sdt-svg.svelte-1piwi8e {fill:var(--sdt-header-color, initial);}.sdt-time-btn.svelte-1piwi8e:not(.is-active) {opacity:0.5;}.sdt-time-btn.svelte-1piwi8e:hover {background-color:var(--sdt-header-btn-bg-hover, #dfdfdf);}.sdt-back-btn.svelte-1piwi8e {position:absolute;top:0;left:0;padding:0.3em;opacity:1 !important;}.sdt-meridian.svelte-1piwi8e {position:absolute;top:0;right:0;display:flex;}.sdt-meridian.svelte-1piwi8e .sdt-time-btn:where(.svelte-1piwi8e) {width:56px;font-weight:bold;}.sdt-middle-dot.svelte-1piwi8e {left:50%;top:50%;width:6px;height:6px;position:absolute;transform:translate(-50%, -50%);background-color:var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));border-radius:50%;}.sdt-hand-pointer.svelte-1piwi8e {width:2px;height:calc(40% - 3px);bottom:50%;left:calc(50% - 1px);position:absolute;background-color:var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));transform-origin:center bottom 0;transition:transform 0.3s ease, height 0.15s ease;}.sdt-hand-circle.svelte-1piwi8e {left:-15px;top:-21px;position:relative;width:4px;height:4px;background-color:transparent;border:14px solid var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));border-radius:50%;box-sizing:content-box;}.sdt-tick.svelte-1piwi8e {position:absolute;width:30px;height:30px;border-width:0;transform:translate(-50%, -50%);text-align:center;border-radius:50%;line-height:20px;cursor:pointer;background-color:var(--sdt-clock-time-bg);transition:all 0.3s;color:var(--sdt-clock-color, inherit);}.sdt-tick.svelte-1piwi8e:hover {color:var(--sdt-clock-color-hover);background-color:var(--sdt-clock-time-bg-hover);}.sdt-tick[disabled].svelte-1piwi8e {cursor:not-allowed;color:var(--sdt-clock-disabled, #b22222);background-color:var(--sdt-clock-disabled-bg, var(--sdt-clock-bg, transparent));}.sdt-tick.outer-tick.svelte-1piwi8e {opacity:0;}.sdt-tick.is-selected.svelte-1piwi8e { animation: svelte-1piwi8e-tick-selection 0s 0.175s ease-out forwards;} @keyframes svelte-1piwi8e-tick-selection { @@ -87,13 +72,13 @@ ${l}in ${G}`).join("")} background-color: var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090)); color: var(--sdt-color-selected, var(--sdt-bg-main, #fff)); } -}`};function Tc(C,I){VI(I,!0),IF(C,_V);let g=J(I,"wid",3,0),B=J(I,"date",27,()=>rI(new ig)),F=J(I,"startDate",3,void 0),Q=J(I,"endDate",3,void 0),A=J(I,"hourOnly",3,!1),U=J(I,"minuteIncrement",3,1),l=J(I,"showMeridian",3,!1),s=J(I,"hasDateComponent",3,!1);function G(){Y(d,!0)}function t(p){i(d)?(p=p*5+i(n),p%5!==0&&(p=pi(e)?.getHours()||0),a=BI(()=>l()?i(x)>=12:!1),n=BI(()=>i(e)?.getMinutes()||0),h=BI(()=>{let p=i(d)?i(n)*6:i(x)%12*30;return i(d)||l()||i(x)<12?`transform: rotateZ(${p}deg);`:`transform: rotateZ(${p}deg); height: calc(25% + 1px)`}),m=BI(()=>i(d)?5:1),L=BI(()=>F()&&Q()&&["getFullYear","getMonth","getDate"].every(p=>Q()[p]()===F()[p]()));function R(p){if(i(e)?.valueOf()!==p?.valueOf()&&p)Y(e,new ig(p),!0);else if(!p)if(Y(d,!1),i(e))i(e).setHours(0,0);else{let w=new ig;w.setHours(0,0),Y(e,w,!0)}}function o(p){let w=!1;return F()&&F().toDateString()===p.toDateString()&&(M(p.getHours())&&(p.setHours(F().getHours()),w=!0),M(p.getMinutes(),!0)&&(p.setMinutes(F().getMinutes()),w=!0)),Q()&&Q().toDateString()===p.toDateString()&&(M(p.getHours())&&(p.setHours(Q().getHours()),w=!0),M(p.getMinutes(),!0)&&(p.setMinutes(Q().getMinutes()),w=!0)),p}function y(p,w,QI,FI,fI){let oI=p/2;w=w||oI;let eI=[0,1-.5,1-.134,1,1-.134,1-.5],MI=eI.concat(eI),Ag=eI.slice(3).concat(eI).concat(eI.slice(0,3)),jI=[];for(let YI=0;YI<12;YI++)jI.push({x:Math.abs(MI[YI]*oI+(YI<=6?1:-1)*w),y:Math.abs(Ag[YI]*oI+(YI>=9||YI<3?-1:1)*w),val:FI?YI*5||QI:YI?YI+fI:QI});return jI}let H=BI(()=>y(i(d)?220:180,110,"00",!1,0)),r=BI(()=>y(i(d)?180:120,110,i(d)?"00":"12",i(d),12));function N(p,w){return w?i(a)&&p===12?12:p<10||p%12<10?`0${p%12}`:p%12:p<10?`0${p}`:p}function T(p,w,QI){return i(d)?w===p||QI===0&&QI===p:l()?i(a)&&w==12&&p===12||!i(a)&&w==12&&p===0?!0:w===(p?p%12:12):+w>12?(QI?i(m)*QI+12:0)===p:w==="00"||w==="12"?p===12&&parseInt(w)==12||w==="00"&&p===0:w===p}function M(p,w=!1){return typeof p=="string"&&(p=parseInt(p)),F()&&Q()&&i(L)?i(d)||w?F().getHours()===i(e).getHours()&&F().getMinutes()>p||Q().getHours()===i(e).getHours()&&Q().getMinutes()p||Q().getHours()p:F().getHours()>p:Q()&&Q().getDate()===i(e).getDate()&&Q().getMonth()===i(e).getMonth()&&Q().getFullYear()===i(e).getFullYear()?i(d)||w?Q().getHours()===i(e).getHours()&&Q().getMinutes()i(n)?i(n)+U():i(n)-U();else if(FI%U()!==0){let fI=FI%U(),oI=FI-fI,eI=oI+U();FI=eI-FIeI?Ag=oI>MI?2:1:Ag=oI>MI?3:4,Ag){case 1:w=fI-eI,QI=MI-oI;break;case 2:w=fI-eI,QI=oI-MI;break;case 3:w=eI-fI,QI=oI-MI;break;case 4:w=eI-fI,QI=MI-oI;break}let jI=Math.sqrt(w*w+QI*QI),YI=90-Math.asin(w/jI)*(180/Math.PI),bg=0;switch(Ag){case 1:bg=90-YI;break;case 2:bg=YI+90;break;case 3:bg=270-YI;break;case 4:bg=YI+270;break}bg=Math.round(bg/6/U())*U(),bg>=60&&(bg=0),i(e).setMinutes(bg)}else return;i(b)||(I.onupdate?.({type:i(d)?"minute":"hour",date:o(i(e)),isKeyboard:p.type==="keyboard",dateIndex:g()}),p.type!=="keyboard"&&!i(d)&&!A()&&Y(d,!0))}og(()=>{R(B())});var AI=OV(),aI=O(AI),uI=O(aI);{var ZI=p=>{var w=JV();w.__click=[YV,I],sI(()=>{pI(w,"title",I.i18n.backToDate),pI(w,"aria-label",I.i18n.backToDate)}),D(p,w)};GI(uI,p=>{s()&&p(ZI)})}var XI=v(uI,2);{var kI=p=>{var w=DV(),QI=yI(w);let FI;QI.__click=[vV,d];var fI=O(QI,!0);z(QI);var oI=v(QI,4);let eI;oI.__click=[kV,d];var MI=O(oI,!0);z(oI),sI((Ag,jI,YI,bg)=>{FI=nI(QI,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,FI,Ag),vI(fI,jI),eI=nI(oI,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,eI,YI),vI(MI,bg)},[()=>({"is-active":!i(d)}),()=>N(i(x),l()),()=>({"is-active":i(d)}),()=>N(i(n),!1)]),D(p,w)},mI=p=>{var w=fV(),QI=yI(w),FI=O(QI,!0);z(QI);var fI=v(QI,2);{var oI=MI=>{var Ag=TV(),jI=O(Ag,!0);z(Ag),sI(YI=>vI(jI,YI),[()=>(i(a)?I.i18n.meridiem[1]:I.i18n.meridiem[0]).toUpperCase()]),D(MI,Ag)},eI=MI=>{var Ag=wV();fQ(2),D(MI,Ag)};GI(fI,MI=>{l()?MI(oI):MI(eI,!1)})}sI(MI=>vI(FI,MI),[()=>N(i(x),l())]),D(p,w)};GI(XI,p=>{A()?p(mI,!1):p(kI)})}var wI=v(XI,2);{var gg=p=>{var w=zV(),QI=O(w);QI.__click=[HV,e,I,d,o,g];var FI=O(QI,!0);z(QI),z(w),sI(()=>{pI(QI,"data-value",i(a)?i(x)%12:i(x)+12),vI(FI,i(a)?I.i18n.meridiem[1]:I.i18n.meridiem[0])}),D(p,w)};GI(wI,p=>{l()&&p(gg)})}z(aI);var HI=v(aI,2);let hI;HI.__click=[MV,q],HI.__mousedown=[tb,b],HI.__mousemove=[KV,b,q],HI.__mouseup=[tb,b];var WI=v(O(HI),2),rg=v(WI,2);qI(rg,19,()=>i(H),p=>p.val,(p,w,QI)=>{var FI=PV();let fI;var oI=O(FI,!0);z(FI),sI((eI,MI)=>{gB(FI,`left:${i(w).x}px; top:${i(w).y}px;`),fI=nI(FI,1,"sdt-tick svelte-1piwi8e",null,fI,eI),pI(FI,"data-value",i(w).val),FI.disabled=MI,vI(oI,i(w).val)},[()=>({"outer-tick":i(d),"is-selected":T(i(x),i(w).val,i(QI))}),()=>(F()||Q())&&i(e)&&M(i(w).val,!1)]),_g(3,FI,()=>oF,()=>({duration:200})),D(p,FI)});var PI=v(rg,2);return qI(PI,17,()=>i(r),Qg,(p,w,QI)=>{var FI=jV();let fI;var oI=O(FI,!0);z(FI),sI((eI,MI)=>{gB(FI,`left:${i(w).x}px; top:${i(w).y}px;`),fI=nI(FI,1,"sdt-tick svelte-1piwi8e",null,fI,eI),pI(FI,"data-value",i(w).val),FI.disabled=MI,vI(oI,i(w).val)},[()=>({"outer-tick":l()&&!i(d),"is-selected":T(i(d)?i(n):i(x),i(w).val,QI)}),()=>(F()||Q())&&i(e)&&M(i(w).val,!1)]),_g(3,FI,()=>oF,()=>({duration:200})),D(p,FI)}),z(HI),dB(HI,p=>c=p,()=>c),z(AI),sI(p=>{hI=nI(HI,1,"sdt-clock svelte-1piwi8e",null,hI,p),gB(WI,i(h))},[()=>({"is-minute-view":i(d)})]),_g(1,AI,()=>oF,()=>({duration:200})),D(C,AI),xI({showMinuteView:G,makeTick:t})}KI(["click","mousedown","mousemove","mouseup"]);var IA=Math.min,FF=Math.max,bU=Math.round,ZU=Math.floor,ZB=C=>({x:C,y:C}),qV={left:"right",right:"left",bottom:"top",top:"bottom"},$V={start:"end",end:"start"};function wc(C,I,g){return FF(C,IA(I,g))}function is(C,I){return typeof C=="function"?C(I):C}function CQ(C){return C.split("-")[0]}function ds(C){return C.split("-")[1]}function fc(C){return C==="x"?"y":"x"}function zc(C){return C==="y"?"height":"width"}function BQ(C){return["top","bottom"].includes(CQ(C))?"y":"x"}function Mc(C){return fc(BQ(C))}function cb(C,I,g){g===void 0&&(g=!1);let B=ds(C),F=Mc(C),Q=zc(F),A=F==="x"?B===(g?"end":"start")?"right":"left":B==="start"?"bottom":"top";return I.reference[Q]>I.floating[Q]&&(A=dU(A)),[A,dU(A)]}function Gb(C){let I=dU(C);return[Gs(C),I,Gs(I)]}function Gs(C){return C.replace(/start|end/g,I=>$V[I])}function Ix(C,I,g){let B=["left","right"],F=["right","left"],Q=["top","bottom"],A=["bottom","top"];switch(C){case"top":case"bottom":return g?I?F:B:I?B:F;case"left":case"right":return I?Q:A;default:return[]}}function ib(C,I,g,B){let F=ds(C),Q=Ix(CQ(C),g==="start",B);return F&&(Q=Q.map(A=>A+"-"+F),I&&(Q=Q.concat(Q.map(Gs)))),Q}function dU(C){return C.replace(/left|right|bottom|top/g,I=>qV[I])}function gx(C){return{top:0,right:0,bottom:0,left:0,...C}}function db(C){return typeof C!="number"?gx(C):{top:C,right:C,bottom:C,left:C}}function FQ(C){let{x:I,y:g,width:B,height:F}=C;return{width:B,height:F,top:g,left:I,right:I+B,bottom:g+F,x:I,y:g}}function bb(C,I,g){let{reference:B,floating:F}=C,Q=BQ(I),A=Mc(I),U=zc(A),l=CQ(I),s=Q==="y",G=B.x+B.width/2-F.width/2,t=B.y+B.height/2-F.height/2,c=B[U]/2-F[U]/2,d;switch(l){case"top":d={x:G,y:B.y-F.height};break;case"bottom":d={x:G,y:B.y+B.height};break;case"right":d={x:B.x+B.width,y:t};break;case"left":d={x:B.x-F.width,y:t};break;default:d={x:B.x,y:B.y}}switch(ds(I)){case"start":d[A]-=c*(g&&s?-1:1);break;case"end":d[A]+=c*(g&&s?-1:1);break}return d}var Zb=async(C,I,g)=>{let{placement:B="bottom",strategy:F="absolute",middleware:Q=[],platform:A}=g,U=Q.filter(Boolean),l=await(A.isRTL==null?void 0:A.isRTL(I)),s=await A.getElementRects({reference:C,floating:I,strategy:F}),{x:G,y:t}=bb(s,B,l),c=B,d={},b=0;for(let Z=0;Zq<=0)){var r,N;let q=(((r=Q.flip)==null?void 0:r.index)||0)+1,AI=R[q];if(AI){var T;let uI=t==="alignment"?a!==BQ(AI):!1,ZI=((T=H[0])==null?void 0:T.overflows[0])>0;if(!uI||ZI)return{data:{index:q,overflows:H},reset:{placement:AI}}}let aI=(N=H.filter(uI=>uI.overflows[0]<=0).sort((uI,ZI)=>uI.overflows[1]-ZI.overflows[1])[0])==null?void 0:N.placement;if(!aI)switch(d){case"bestFit":{var M;let uI=(M=H.filter(ZI=>{if(L){let XI=BQ(ZI.placement);return XI===a||XI==="y"}return!0}).map(ZI=>[ZI.placement,ZI.overflows.filter(XI=>XI>0).reduce((XI,kI)=>XI+kI,0)]).sort((ZI,XI)=>ZI[1]-XI[1])[0])==null?void 0:M[0];uI&&(aI=uI);break}case"initialPlacement":aI=U;break}if(F!==aI)return{reset:{placement:aI}}}return{}}}};var Vb=function(C){return C===void 0&&(C={}),{name:"shift",options:C,async fn(I){let{x:g,y:B,placement:F}=I,{mainAxis:Q=!0,crossAxis:A=!1,limiter:U={fn:e=>{let{x,y:a}=e;return{x,y:a}}},...l}=is(C,I),s={x:g,y:B},G=await Kc(I,l),t=BQ(CQ(F)),c=fc(t),d=s[c],b=s[t];if(Q){let e=c==="y"?"top":"left",x=c==="y"?"bottom":"right",a=d+G[e],n=d-G[x];d=wc(a,d,n)}if(A){let e=t==="y"?"top":"left",x=t==="y"?"bottom":"right",a=b+G[e],n=b-G[x];b=wc(a,b,n)}let Z=U.fn({...I,[c]:d,[t]:b});return{...Z,data:{x:Z.x-g,y:Z.y-B,enabled:{[c]:Q,[t]:A}}}}}};function bs(){return typeof window<"u"}function QQ(C){return ub(C)?(C.nodeName||"").toLowerCase():"#document"}function SC(C){var I;return(C==null||(I=C.ownerDocument)==null?void 0:I.defaultView)||window}function eB(C){var I;return(I=(ub(C)?C.ownerDocument:C.document)||window.document)==null?void 0:I.documentElement}function ub(C){return bs()?C instanceof Node||C instanceof SC(C).Node:!1}function CB(C){return bs()?C instanceof Element||C instanceof SC(C).Element:!1}function VB(C){return bs()?C instanceof HTMLElement||C instanceof SC(C).HTMLElement:!1}function xb(C){return!bs()||typeof ShadowRoot>"u"?!1:C instanceof ShadowRoot||C instanceof SC(C).ShadowRoot}function CA(C){let{overflow:I,overflowX:g,overflowY:B,display:F}=BB(C);return/auto|scroll|overlay|hidden|clip/.test(I+B+g)&&!["inline","contents"].includes(F)}function Lb(C){return["table","td","th"].includes(QQ(C))}function eU(C){return[":popover-open",":modal"].some(I=>{try{return C.matches(I)}catch{return!1}})}function Zs(C){let I=es(),g=CB(C)?BB(C):C;return["transform","translate","scale","rotate","perspective"].some(B=>g[B]?g[B]!=="none":!1)||(g.containerType?g.containerType!=="normal":!1)||!I&&(g.backdropFilter?g.backdropFilter!=="none":!1)||!I&&(g.filter?g.filter!=="none":!1)||["transform","translate","scale","rotate","perspective","filter"].some(B=>(g.willChange||"").includes(B))||["paint","layout","strict","content"].some(B=>(g.contain||"").includes(B))}function Rb(C){let I=QF(C);for(;VB(I)&&!AQ(I);){if(Zs(I))return I;if(eU(I))return null;I=QF(I)}return null}function es(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function AQ(C){return["html","body","#document"].includes(QQ(C))}function BB(C){return SC(C).getComputedStyle(C)}function VU(C){return CB(C)?{scrollLeft:C.scrollLeft,scrollTop:C.scrollTop}:{scrollLeft:C.scrollX,scrollTop:C.scrollY}}function QF(C){if(QQ(C)==="html")return C;let I=C.assignedSlot||C.parentNode||xb(C)&&C.host||eB(C);return xb(I)?I.host:I}function nb(C){let I=QF(C);return AQ(I)?C.ownerDocument?C.ownerDocument.body:C.body:VB(I)&&CA(I)?I:nb(I)}function gA(C,I,g){var B;I===void 0&&(I=[]),g===void 0&&(g=!0);let F=nb(C),Q=F===((B=C.ownerDocument)==null?void 0:B.body),A=SC(F);if(Q){let U=Vs(A);return I.concat(A,A.visualViewport||[],CA(F)?F:[],U&&g?gA(U):[])}return I.concat(F,gA(F,[],g))}function Vs(C){return C.parent&&Object.getPrototypeOf(C.parent)?C.frameElement:null}function hb(C){let I=BB(C),g=parseFloat(I.width)||0,B=parseFloat(I.height)||0,F=VB(C),Q=F?C.offsetWidth:g,A=F?C.offsetHeight:B,U=bU(g)!==Q||bU(B)!==A;return U&&(g=Q,B=A),{width:g,height:B,$:U}}function jc(C){return CB(C)?C:C.contextElement}function BA(C){let I=jc(C);if(!VB(I))return ZB(1);let g=I.getBoundingClientRect(),{width:B,height:F,$:Q}=hb(I),A=(Q?bU(g.width):g.width)/B,U=(Q?bU(g.height):g.height)/F;return(!A||!Number.isFinite(A))&&(A=1),(!U||!Number.isFinite(U))&&(U=1),{x:A,y:U}}var Cx=ZB(0);function Xb(C){let I=SC(C);return!es()||!I.visualViewport?Cx:{x:I.visualViewport.offsetLeft,y:I.visualViewport.offsetTop}}function Bx(C,I,g){return I===void 0&&(I=!1),!g||I&&g!==SC(C)?!1:I}function UQ(C,I,g,B){I===void 0&&(I=!1),g===void 0&&(g=!1);let F=C.getBoundingClientRect(),Q=jc(C),A=ZB(1);I&&(B?CB(B)&&(A=BA(B)):A=BA(C));let U=Bx(Q,g,B)?Xb(Q):ZB(0),l=(F.left+U.x)/A.x,s=(F.top+U.y)/A.y,G=F.width/A.x,t=F.height/A.y;if(Q){let c=SC(Q),d=B&&CB(B)?SC(B):B,b=c,Z=Vs(b);for(;Z&&B&&d!==b;){let e=BA(Z),x=Z.getBoundingClientRect(),a=BB(Z),n=x.left+(Z.clientLeft+parseFloat(a.paddingLeft))*e.x,h=x.top+(Z.clientTop+parseFloat(a.paddingTop))*e.y;l*=e.x,s*=e.y,G*=e.x,t*=e.y,l+=n,s+=h,b=SC(Z),Z=Vs(b)}}return FQ({width:G,height:t,x:l,y:s})}function Oc(C,I){let g=VU(C).scrollLeft;return I?I.left+g:UQ(eB(C)).left+g}function ob(C,I,g){g===void 0&&(g=!1);let B=C.getBoundingClientRect(),F=B.left+I.scrollLeft-(g?0:Oc(C,B)),Q=B.top+I.scrollTop;return{x:F,y:Q}}function Fx(C){let{elements:I,rect:g,offsetParent:B,strategy:F}=C,Q=F==="fixed",A=eB(B),U=I?eU(I.floating):!1;if(B===A||U&&Q)return g;let l={scrollLeft:0,scrollTop:0},s=ZB(1),G=ZB(0),t=VB(B);if((t||!t&&!Q)&&((QQ(B)!=="body"||CA(A))&&(l=VU(B)),VB(B))){let d=UQ(B);s=BA(B),G.x=d.x+B.clientLeft,G.y=d.y+B.clientTop}let c=A&&!t&&!Q?ob(A,l,!0):ZB(0);return{width:g.width*s.x,height:g.height*s.y,x:g.x*s.x-l.scrollLeft*s.x+G.x+c.x,y:g.y*s.y-l.scrollTop*s.y+G.y+c.y}}function Qx(C){return Array.from(C.getClientRects())}function Ax(C){let I=eB(C),g=VU(C),B=C.ownerDocument.body,F=FF(I.scrollWidth,I.clientWidth,B.scrollWidth,B.clientWidth),Q=FF(I.scrollHeight,I.clientHeight,B.scrollHeight,B.clientHeight),A=-g.scrollLeft+Oc(C),U=-g.scrollTop;return BB(B).direction==="rtl"&&(A+=FF(I.clientWidth,B.clientWidth)-F),{width:F,height:Q,x:A,y:U}}function Ux(C,I){let g=SC(C),B=eB(C),F=g.visualViewport,Q=B.clientWidth,A=B.clientHeight,U=0,l=0;if(F){Q=F.width,A=F.height;let s=es();(!s||s&&I==="fixed")&&(U=F.offsetLeft,l=F.offsetTop)}return{width:Q,height:A,x:U,y:l}}function lx(C,I){let g=UQ(C,!0,I==="fixed"),B=g.top+C.clientTop,F=g.left+C.clientLeft,Q=VB(C)?BA(C):ZB(1),A=C.clientWidth*Q.x,U=C.clientHeight*Q.y,l=F*Q.x,s=B*Q.y;return{width:A,height:U,x:l,y:s}}function ab(C,I,g){let B;if(I==="viewport")B=Ux(C,g);else if(I==="document")B=Ax(eB(C));else if(CB(I))B=lx(I,g);else{let F=Xb(C);B={x:I.x-F.x,y:I.y-F.y,width:I.width,height:I.height}}return FQ(B)}function yb(C,I){let g=QF(C);return g===I||!CB(g)||AQ(g)?!1:BB(g).position==="fixed"||yb(g,I)}function sx(C,I){let g=I.get(C);if(g)return g;let B=gA(C,[],!1).filter(U=>CB(U)&&QQ(U)!=="body"),F=null,Q=BB(C).position==="fixed",A=Q?QF(C):C;for(;CB(A)&&!AQ(A);){let U=BB(A),l=Zs(A);!l&&U.position==="fixed"&&(F=null),(Q?!l&&!F:!l&&U.position==="static"&&!!F&&["absolute","fixed"].includes(F.position)||CA(A)&&!l&&yb(C,A))?B=B.filter(G=>G!==A):F=U,A=QF(A)}return I.set(C,B),B}function tx(C){let{element:I,boundary:g,rootBoundary:B,strategy:F}=C,A=[...g==="clippingAncestors"?eU(I)?[]:sx(I,this._c):[].concat(g),B],U=A[0],l=A.reduce((s,G)=>{let t=ab(I,G,F);return s.top=FF(t.top,s.top),s.right=IA(t.right,s.right),s.bottom=IA(t.bottom,s.bottom),s.left=FF(t.left,s.left),s},ab(I,U,F));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function cx(C){let{width:I,height:g}=hb(C);return{width:I,height:g}}function Gx(C,I,g){let B=VB(I),F=eB(I),Q=g==="fixed",A=UQ(C,!0,Q,I),U={scrollLeft:0,scrollTop:0},l=ZB(0);function s(){l.x=Oc(F)}if(B||!B&&!Q)if((QQ(I)!=="body"||CA(F))&&(U=VU(I)),B){let d=UQ(I,!0,Q,I);l.x=d.x+I.clientLeft,l.y=d.y+I.clientTop}else F&&s();Q&&!B&&F&&s();let G=F&&!B&&!Q?ob(F,U):ZB(0),t=A.left+U.scrollLeft-l.x-G.x,c=A.top+U.scrollTop-l.y-G.y;return{x:t,y:c,width:A.width,height:A.height}}function Pc(C){return BB(C).position==="static"}function mb(C,I){if(!VB(C)||BB(C).position==="fixed")return null;if(I)return I(C);let g=C.offsetParent;return eB(C)===g&&(g=g.ownerDocument.body),g}function Sb(C,I){let g=SC(C);if(eU(C))return g;if(!VB(C)){let F=QF(C);for(;F&&!AQ(F);){if(CB(F)&&!Pc(F))return F;F=QF(F)}return g}let B=mb(C,I);for(;B&&Lb(B)&&Pc(B);)B=mb(B,I);return B&&AQ(B)&&Pc(B)&&!Zs(B)?g:B||Rb(C)||g}var ix=async function(C){let I=this.getOffsetParent||Sb,g=this.getDimensions,B=await g(C.floating);return{reference:Gx(C.reference,await I(C.floating),C.strategy),floating:{x:0,y:0,width:B.width,height:B.height}}};function dx(C){return BB(C).direction==="rtl"}var bx={convertOffsetParentRelativeRectToViewportRelativeRect:Fx,getDocumentElement:eB,getClippingRect:tx,getOffsetParent:Sb,getElementRects:ix,getClientRects:Qx,getDimensions:cx,getScale:BA,isElement:CB,isRTL:dx};function Wb(C,I){return C.x===I.x&&C.y===I.y&&C.width===I.width&&C.height===I.height}function Zx(C,I){let g=null,B,F=eB(C);function Q(){var U;clearTimeout(B),(U=g)==null||U.disconnect(),g=null}function A(U,l){U===void 0&&(U=!1),l===void 0&&(l=1),Q();let s=C.getBoundingClientRect(),{left:G,top:t,width:c,height:d}=s;if(U||I(),!c||!d)return;let b=ZU(t),Z=ZU(F.clientWidth-(G+c)),e=ZU(F.clientHeight-(t+d)),x=ZU(G),n={rootMargin:-b+"px "+-Z+"px "+-e+"px "+-x+"px",threshold:FF(0,IA(1,l))||1},h=!0;function m(L){let R=L[0].intersectionRatio;if(R!==l){if(!h)return A();R?A(!1,R):B=setTimeout(()=>{A(!1,1e-7)},1e3)}R===1&&!Wb(s,C.getBoundingClientRect())&&A(),h=!1}try{g=new IntersectionObserver(m,{...n,root:F.ownerDocument})}catch{g=new IntersectionObserver(m,n)}g.observe(C)}return A(!0),Q}function Eb(C,I,g,B){B===void 0&&(B={});let{ancestorScroll:F=!0,ancestorResize:Q=!0,elementResize:A=typeof ResizeObserver=="function",layoutShift:U=typeof IntersectionObserver=="function",animationFrame:l=!1}=B,s=jc(C),G=F||Q?[...s?gA(s):[],...gA(I)]:[];G.forEach(x=>{F&&x.addEventListener("scroll",g,{passive:!0}),Q&&x.addEventListener("resize",g)});let t=s&&U?Zx(s,g):null,c=-1,d=null;A&&(d=new ResizeObserver(x=>{let[a]=x;a&&a.target===s&&d&&(d.unobserve(I),cancelAnimationFrame(c),c=requestAnimationFrame(()=>{var n;(n=d)==null||n.observe(I)})),g()}),s&&!l&&d.observe(s),d.observe(I));let b,Z=l?UQ(C):null;l&&e();function e(){let x=UQ(C);Z&&!Wb(Z,x)&&g(),Z=x,b=requestAnimationFrame(e)}return g(),()=>{var x;G.forEach(a=>{F&&a.removeEventListener("scroll",g),Q&&a.removeEventListener("resize",g)}),t?.(),(x=d)==null||x.disconnect(),d=null,l&&cancelAnimationFrame(b)}}var Nb=Vb,rb=eb;var pb=(C,I,g)=>{let B=new Map,F={platform:bx,...g},Q={...F.platform,_c:B};return Zb(C,I,{...F,platform:Q})};function Hb(C){let I=C.parentElement?.querySelector("input[type=text]");if(!I)return;let g=Eb(I,C,()=>pb(I,C,{placement:"bottom-start",middleware:[Nb({padding:5}),rb()]}).then(({x:B,y:F})=>{Object.assign(C.style,{left:`${B}px`,top:`${F}px`})}));return{destroy(){g()}}}function Yb(C,I,g,B){let F=C?Array.isArray(C)?C:C.split(","):[];return F=F.map(Q=>Q.replace(/(:\d+):\d+(.*)/,"$1$2")),{iValues:F,iValueCombined:F.length?F.join():null,iDates:F.map(Q=>gQ(Q,I,g,B))}}function Jb(C,I){return C==="auto"?I.match(/g|hh?|ii?/i)&&I.match(/y|m|d/i)?"datetime":I.match(/g|hh?|ii?/i)?"time":"date":C}var qg=Bb,ex=f(' '),Vx=f(''),xx=f(''),ux=f(" "),Lx=f('
'),Rx=f(''),nx=f(' ',1),ax=C=>C.preventDefault(),mx=f('
'),hx=f('
'),Xx=f('
'),ox={hash:"svelte-yheoi9",code:`.sdt-component-wrap.svelte-yheoi9 {position:relative;display:inline-block;}.sdt-input-wrap.svelte-yheoi9 {position:relative;display:contents;}.sdt-calendar-wrap.svelte-yheoi9 {width:280px;background-color:var(--sdt-bg-main, #fff);box-shadow:var(--sdt-wrap-shadow, 0 1px 6px var(--sdt-shadow-color, #ccc));border-radius:var(--sdt-radius, 4px);padding:0.5em;color:var(--sdt-color, initial);}.sdt-calendar-wrap.is-range-wrap.svelte-yheoi9 {width:560px;}.sdt-widget-wrap.svelte-yheoi9 {display:flex;gap:0.5rem;justify-content:stretch;position:relative;}.sdt-widget.svelte-yheoi9 {flex:1;min-width:264px;}.value-dirty.svelte-yheoi9 {color:color-mix(in srgb, black 20%, white);}.sdt-calendar-wrap.is-popup.svelte-yheoi9 {position:absolute;box-shadow:0 1px 6px var(--sdt-shadow-color, #ccc);z-index:100;}.sdt-btn-row.svelte-yheoi9 {margin-top:0.5rem;display:flex;gap:0.5rem;justify-content:space-between;flex-flow:row-reverse;}.sdt-action-btn.svelte-yheoi9 {padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;}.sdt-today-btn.svelte-yheoi9 {background-color:var(--sdt-bg-selected, #286090);color:var(--sdt-today-color, var(--sdt-bg-main, #fff));padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;border:1px solid var(--sdt-today-bg, #286090);}.sdt-today-btn[disabled].svelte-yheoi9 {opacity:0.5;cursor:not-allowed;}.sdt-today-btn.svelte-yheoi9:focus, +}`};function Zc(i,t){bt(t,!0),ir(i,ob);let e=B(t,"wid",3,0),n=B(t,"date",27,()=>Rt(new fe)),r=B(t,"startDate",3,void 0),s=B(t,"endDate",3,void 0),o=B(t,"hourOnly",3,!1),a=B(t,"minuteIncrement",3,1),l=B(t,"showMeridian",3,!1),u=B(t,"hasDateComponent",3,!1);function f(){P(p,!0)}function h(L){d(p)?(L=L*5+d(k),L%5!==0&&(L=Ld(v)?.getHours()||0),S=nt(()=>l()?d(_)>=12:!1),k=nt(()=>d(v)?.getMinutes()||0),E=nt(()=>{let L=d(p)?d(k)*6:d(_)%12*30;return d(p)||l()||d(_)<12?`transform: rotateZ(${L}deg);`:`transform: rotateZ(${L}deg); height: calc(25% + 1px)`}),M=nt(()=>d(p)?5:1),w=nt(()=>r()&&s()&&["getFullYear","getMonth","getDate"].every(L=>s()[L]()===r()[L]()));function x(L){if(d(v)?.valueOf()!==L?.valueOf()&&L)P(v,new fe(L),!0);else if(!L)if(P(p,!1),d(v))d(v).setHours(0,0);else{let q=new fe;q.setHours(0,0),P(v,q,!0)}}function A(L){let q=!1;return r()&&r().toDateString()===L.toDateString()&&(U(L.getHours())&&(L.setHours(r().getHours()),q=!0),U(L.getMinutes(),!0)&&(L.setMinutes(r().getMinutes()),q=!0)),s()&&s().toDateString()===L.toDateString()&&(U(L.getHours())&&(L.setHours(s().getHours()),q=!0),U(L.getMinutes(),!0)&&(L.setMinutes(s().getMinutes()),q=!0)),L}function D(L,q,lt,st,zt){let Mt=L/2;q=q||Mt;let vt=[0,1-.5,1-.134,1,1-.134,1-.5],Ut=vt.concat(vt),oe=vt.slice(3).concat(vt).concat(vt.slice(0,3)),Yt=[];for(let Lt=0;Lt<12;Lt++)Yt.push({x:Math.abs(Ut[Lt]*Mt+(Lt<=6?1:-1)*q),y:Math.abs(oe[Lt]*Mt+(Lt>=9||Lt<3?-1:1)*q),val:st?Lt*5||lt:Lt?Lt+zt:lt});return Yt}let N=nt(()=>D(d(p)?220:180,110,"00",!1,0)),I=nt(()=>D(d(p)?180:120,110,d(p)?"00":"12",d(p),12));function R(L,q){return q?d(S)&&L===12?12:L<10||L%12<10?`0${L%12}`:L%12:L<10?`0${L}`:L}function z(L,q,lt){return d(p)?q===L||lt===0&<===L:l()?d(S)&&q==12&&L===12||!d(S)&&q==12&&L===0?!0:q===(L?L%12:12):+q>12?(lt?d(M)*lt+12:0)===L:q==="00"||q==="12"?L===12&&parseInt(q)==12||q==="00"&&L===0:q===L}function U(L,q=!1){return typeof L=="string"&&(L=parseInt(L)),r()&&s()&&d(w)?d(p)||q?r().getHours()===d(v).getHours()&&r().getMinutes()>L||s().getHours()===d(v).getHours()&&s().getMinutes()L||s().getHours()L:r().getHours()>L:s()&&s().getDate()===d(v).getDate()&&s().getMonth()===d(v).getMonth()&&s().getFullYear()===d(v).getFullYear()?d(p)||q?s().getHours()===d(v).getHours()&&s().getMinutes()d(k)?d(k)+a():d(k)-a();else if(st%a()!==0){let zt=st%a(),Mt=st-zt,vt=Mt+a();st=vt-stvt?oe=Mt>Ut?2:1:oe=Mt>Ut?3:4,oe){case 1:q=zt-vt,lt=Ut-Mt;break;case 2:q=zt-vt,lt=Mt-Ut;break;case 3:q=vt-zt,lt=Mt-Ut;break;case 4:q=vt-zt,lt=Ut-Mt;break}let Yt=Math.sqrt(q*q+lt*lt),Lt=90-Math.asin(q/Yt)*(180/Math.PI),pe=0;switch(oe){case 1:pe=90-Lt;break;case 2:pe=Lt+90;break;case 3:pe=270-Lt;break;case 4:pe=Lt+270;break}pe=Math.round(pe/6/a())*a(),pe>=60&&(pe=0),d(v).setMinutes(pe)}else return;d(g)||(t.onupdate?.({type:d(p)?"minute":"hour",date:A(d(v)),isKeyboard:L.type==="keyboard",dateIndex:e()}),L.type!=="keyboard"&&!d(p)&&!o()&&P(p,!0))}Te(()=>{x(n())});var rt=sb(),At=J(rt),St=J(At);{var mt=L=>{var q=j1();q.__click=[U1,t],ct(()=>{It(q,"title",t.i18n.backToDate),It(q,"aria-label",t.i18n.backToDate)}),V(L,q)};pt(St,L=>{u()&&L(mt)})}var Dt=F(St,2);{var Bt=L=>{var q=J1(),lt=Et(q);let st;lt.__click=[Y1,p];var zt=J(lt,!0);W(lt);var Mt=F(lt,4);let vt;Mt.__click=[K1,p];var Ut=J(Mt,!0);W(Mt),ct((oe,Yt,Lt,pe)=>{st=kt(lt,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,st,oe),Wt(zt,Yt),vt=kt(Mt,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,vt,Lt),Wt(Ut,pe)},[()=>({"is-active":!d(p)}),()=>R(d(_),l()),()=>({"is-active":d(p)}),()=>R(d(k),!1)]),V(L,q)},wt=L=>{var q=Z1(),lt=Et(q),st=J(lt,!0);W(lt);var zt=F(lt,2);{var Mt=Ut=>{var oe=X1(),Yt=J(oe,!0);W(oe),ct(Lt=>Wt(Yt,Lt),[()=>(d(S)?t.i18n.meridiem[1]:t.i18n.meridiem[0]).toUpperCase()]),V(Ut,oe)},vt=Ut=>{var oe=Q1();Ks(2),V(Ut,oe)};pt(zt,Ut=>{l()?Ut(Mt):Ut(vt,!1)})}ct(Ut=>Wt(st,Ut),[()=>R(d(_),l())]),V(L,q)};pt(Dt,L=>{o()?L(wt,!1):L(Bt)})}var qt=F(Dt,2);{var ee=L=>{var q=tb(),lt=J(q);lt.__click=[W1,v,t,p,A,e];var st=J(lt,!0);W(lt),W(q),ct(()=>{It(lt,"data-value",d(S)?d(_)%12:d(_)+12),Wt(st,d(S)?t.i18n.meridiem[1]:t.i18n.meridiem[0])}),V(L,q)};pt(qt,L=>{l()&&L(ee)})}W(At);var Vt=F(At,2);let Tt;Vt.__click=[eb,tt],Vt.__mousedown=[xg,g],Vt.__mousemove=[ib,g,tt],Vt.__mouseup=[xg,g];var Nt=F(J(Vt),2),Xe=F(Nt,2);Qt(Xe,19,()=>d(N),L=>L.val,(L,q,lt)=>{var st=nb();let zt;var Mt=J(st,!0);W(st),ct((vt,Ut)=>{nn(st,`left:${d(q).x}px; top:${d(q).y}px;`),zt=kt(st,1,"sdt-tick svelte-1piwi8e",null,zt,vt),It(st,"data-value",d(q).val),st.disabled=Ut,Wt(Mt,d(q).val)},[()=>({"outer-tick":d(p),"is-selected":z(d(_),d(q).val,d(lt))}),()=>(r()||s())&&d(v)&&U(d(q).val,!1)]),Ke(3,st,()=>$r,()=>({duration:200})),V(L,st)});var Jt=F(Xe,2);return Qt(Jt,17,()=>d(I),se,(L,q,lt)=>{var st=rb();let zt;var Mt=J(st,!0);W(st),ct((vt,Ut)=>{nn(st,`left:${d(q).x}px; top:${d(q).y}px;`),zt=kt(st,1,"sdt-tick svelte-1piwi8e",null,zt,vt),It(st,"data-value",d(q).val),st.disabled=Ut,Wt(Mt,d(q).val)},[()=>({"outer-tick":l()&&!d(p),"is-selected":z(d(p)?d(k):d(_),d(q).val,lt)}),()=>(r()||s())&&d(v)&&U(d(q).val,!1)]),Ke(3,st,()=>$r,()=>({duration:200})),V(L,st)}),W(Vt),vn(Vt,L=>c=L,()=>c),W(rt),ct(L=>{Tt=kt(Vt,1,"sdt-clock svelte-1piwi8e",null,Tt,L),nn(Nt,d(E))},[()=>({"is-minute-view":d(p)})]),Ke(1,rt,()=>$r,()=>({duration:200})),V(i,rt),_t({showMinuteView:f,makeTick:h})}jt(["click","mousedown","mousemove","mouseup"]);var so=Math.min,or=Math.max,Sa=Math.round,Ma=Math.floor,_n=i=>({x:i,y:i}),ab={left:"right",right:"left",bottom:"top",top:"bottom"},lb={start:"end",end:"start"};function tf(i,t,e){return or(i,so(t,e))}function xu(i,t){return typeof i=="function"?i(t):i}function ls(i){return i.split("-")[0]}function ku(i){return i.split("-")[1]}function ef(i){return i==="x"?"y":"x"}function nf(i){return i==="y"?"height":"width"}function us(i){return["top","bottom"].includes(ls(i))?"y":"x"}function rf(i){return ef(us(i))}function kg(i,t,e){e===void 0&&(e=!1);let n=ku(i),r=rf(i),s=nf(r),o=r==="x"?n===(e?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(o=ka(o)),[o,ka(o)]}function Sg(i){let t=ka(i);return[yu(i),t,yu(t)]}function yu(i){return i.replace(/start|end/g,t=>lb[t])}function ub(i,t,e){let n=["left","right"],r=["right","left"],s=["top","bottom"],o=["bottom","top"];switch(i){case"top":case"bottom":return e?t?r:n:t?n:r;case"left":case"right":return t?s:o;default:return[]}}function Mg(i,t,e,n){let r=ku(i),s=ub(ls(i),e==="start",n);return r&&(s=s.map(o=>o+"-"+r),t&&(s=s.concat(s.map(yu)))),s}function ka(i){return i.replace(/left|right|bottom|top/g,t=>ab[t])}function hb(i){return{top:0,right:0,bottom:0,left:0,...i}}function Eg(i){return typeof i!="number"?hb(i):{top:i,right:i,bottom:i,left:i}}function hs(i){let{x:t,y:e,width:n,height:r}=i;return{width:n,height:r,top:e,left:t,right:t+n,bottom:e+r,x:t,y:e}}function Tg(i,t,e){let{reference:n,floating:r}=i,s=us(t),o=rf(t),a=nf(o),l=ls(t),u=s==="y",f=n.x+n.width/2-r.width/2,h=n.y+n.height/2-r.height/2,c=n[a]/2-r[a]/2,p;switch(l){case"top":p={x:f,y:n.y-r.height};break;case"bottom":p={x:f,y:n.y+n.height};break;case"right":p={x:n.x+n.width,y:h};break;case"left":p={x:n.x-r.width,y:h};break;default:p={x:n.x,y:n.y}}switch(ku(t)){case"start":p[o]-=c*(e&&u?-1:1);break;case"end":p[o]+=c*(e&&u?-1:1);break}return p}var Ag=async(i,t,e)=>{let{placement:n="bottom",strategy:r="absolute",middleware:s=[],platform:o}=e,a=s.filter(Boolean),l=await(o.isRTL==null?void 0:o.isRTL(t)),u=await o.getElementRects({reference:i,floating:t,strategy:r}),{x:f,y:h}=Tg(u,n,l),c=n,p={},g=0;for(let m=0;mtt<=0)){var I,R;let tt=(((I=s.flip)==null?void 0:I.index)||0)+1,rt=x[tt];if(rt){var z;let St=h==="alignment"?S!==us(rt):!1,mt=((z=N[0])==null?void 0:z.overflows[0])>0;if(!St||mt)return{data:{index:tt,overflows:N},reset:{placement:rt}}}let At=(R=N.filter(St=>St.overflows[0]<=0).sort((St,mt)=>St.overflows[1]-mt.overflows[1])[0])==null?void 0:R.placement;if(!At)switch(p){case"bestFit":{var U;let St=(U=N.filter(mt=>{if(w){let Dt=us(mt.placement);return Dt===S||Dt==="y"}return!0}).map(mt=>[mt.placement,mt.overflows.filter(Dt=>Dt>0).reduce((Dt,Bt)=>Dt+Bt,0)]).sort((mt,Dt)=>mt[1]-Dt[1])[0])==null?void 0:U[0];St&&(At=St);break}case"initialPlacement":At=a;break}if(r!==At)return{reset:{placement:At}}}return{}}}};var Og=function(i){return i===void 0&&(i={}),{name:"shift",options:i,async fn(t){let{x:e,y:n,placement:r}=t,{mainAxis:s=!0,crossAxis:o=!1,limiter:a={fn:v=>{let{x:_,y:S}=v;return{x:_,y:S}}},...l}=xu(i,t),u={x:e,y:n},f=await sf(t,l),h=us(ls(r)),c=ef(h),p=u[c],g=u[h];if(s){let v=c==="y"?"top":"left",_=c==="y"?"bottom":"right",S=p+f[v],k=p-f[_];p=tf(S,p,k)}if(o){let v=h==="y"?"top":"left",_=h==="y"?"bottom":"right",S=g+f[v],k=g-f[_];g=tf(S,g,k)}let m=a.fn({...t,[c]:p,[h]:g});return{...m,data:{x:m.x-e,y:m.y-n,enabled:{[c]:s,[h]:o}}}}}};function Su(){return typeof window<"u"}function cs(i){return $g(i)?(i.nodeName||"").toLowerCase():"#document"}function Ci(i){var t;return(i==null||(t=i.ownerDocument)==null?void 0:t.defaultView)||window}function wn(i){var t;return(t=($g(i)?i.ownerDocument:i.document)||window.document)==null?void 0:t.documentElement}function $g(i){return Su()?i instanceof Node||i instanceof Ci(i).Node:!1}function rn(i){return Su()?i instanceof Element||i instanceof Ci(i).Element:!1}function yn(i){return Su()?i instanceof HTMLElement||i instanceof Ci(i).HTMLElement:!1}function Dg(i){return!Su()||typeof ShadowRoot>"u"?!1:i instanceof ShadowRoot||i instanceof Ci(i).ShadowRoot}function ao(i){let{overflow:t,overflowX:e,overflowY:n,display:r}=sn(i);return/auto|scroll|overlay|hidden|clip/.test(t+n+e)&&!["inline","contents"].includes(r)}function Rg(i){return["table","td","th"].includes(cs(i))}function Ea(i){return[":popover-open",":modal"].some(t=>{try{return i.matches(t)}catch{return!1}})}function Mu(i){let t=Eu(),e=rn(i)?sn(i):i;return["transform","translate","scale","rotate","perspective"].some(n=>e[n]?e[n]!=="none":!1)||(e.containerType?e.containerType!=="normal":!1)||!t&&(e.backdropFilter?e.backdropFilter!=="none":!1)||!t&&(e.filter?e.filter!=="none":!1)||["transform","translate","scale","rotate","perspective","filter"].some(n=>(e.willChange||"").includes(n))||["paint","layout","strict","content"].some(n=>(e.contain||"").includes(n))}function Ig(i){let t=ar(i);for(;yn(t)&&!fs(t);){if(Mu(t))return t;if(Ea(t))return null;t=ar(t)}return null}function Eu(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function fs(i){return["html","body","#document"].includes(cs(i))}function sn(i){return Ci(i).getComputedStyle(i)}function Ta(i){return rn(i)?{scrollLeft:i.scrollLeft,scrollTop:i.scrollTop}:{scrollLeft:i.scrollX,scrollTop:i.scrollY}}function ar(i){if(cs(i)==="html")return i;let t=i.assignedSlot||i.parentNode||Dg(i)&&i.host||wn(i);return Dg(t)?t.host:t}function Pg(i){let t=ar(i);return fs(t)?i.ownerDocument?i.ownerDocument.body:i.body:yn(t)&&ao(t)?t:Pg(t)}function oo(i,t,e){var n;t===void 0&&(t=[]),e===void 0&&(e=!0);let r=Pg(i),s=r===((n=i.ownerDocument)==null?void 0:n.body),o=Ci(r);if(s){let a=Tu(o);return t.concat(o,o.visualViewport||[],ao(r)?r:[],a&&e?oo(a):[])}return t.concat(r,oo(r,[],e))}function Tu(i){return i.parent&&Object.getPrototypeOf(i.parent)?i.frameElement:null}function Bg(i){let t=sn(i),e=parseFloat(t.width)||0,n=parseFloat(t.height)||0,r=yn(i),s=r?i.offsetWidth:e,o=r?i.offsetHeight:n,a=Sa(e)!==s||Sa(n)!==o;return a&&(e=s,n=o),{width:e,height:n,$:a}}function af(i){return rn(i)?i:i.contextElement}function lo(i){let t=af(i);if(!yn(t))return _n(1);let e=t.getBoundingClientRect(),{width:n,height:r,$:s}=Bg(t),o=(s?Sa(e.width):e.width)/n,a=(s?Sa(e.height):e.height)/r;return(!o||!Number.isFinite(o))&&(o=1),(!a||!Number.isFinite(a))&&(a=1),{x:o,y:a}}var cb=_n(0);function Fg(i){let t=Ci(i);return!Eu()||!t.visualViewport?cb:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function fb(i,t,e){return t===void 0&&(t=!1),!e||t&&e!==Ci(i)?!1:t}function ds(i,t,e,n){t===void 0&&(t=!1),e===void 0&&(e=!1);let r=i.getBoundingClientRect(),s=af(i),o=_n(1);t&&(n?rn(n)&&(o=lo(n)):o=lo(i));let a=fb(s,e,n)?Fg(s):_n(0),l=(r.left+a.x)/o.x,u=(r.top+a.y)/o.y,f=r.width/o.x,h=r.height/o.y;if(s){let c=Ci(s),p=n&&rn(n)?Ci(n):n,g=c,m=Tu(g);for(;m&&n&&p!==g;){let v=lo(m),_=m.getBoundingClientRect(),S=sn(m),k=_.left+(m.clientLeft+parseFloat(S.paddingLeft))*v.x,E=_.top+(m.clientTop+parseFloat(S.paddingTop))*v.y;l*=v.x,u*=v.y,f*=v.x,h*=v.y,l+=k,u+=E,g=Ci(m),m=Tu(g)}}return hs({width:f,height:h,x:l,y:u})}function lf(i,t){let e=Ta(i).scrollLeft;return t?t.left+e:ds(wn(i)).left+e}function Hg(i,t,e){e===void 0&&(e=!1);let n=i.getBoundingClientRect(),r=n.left+t.scrollLeft-(e?0:lf(i,n)),s=n.top+t.scrollTop;return{x:r,y:s}}function db(i){let{elements:t,rect:e,offsetParent:n,strategy:r}=i,s=r==="fixed",o=wn(n),a=t?Ea(t.floating):!1;if(n===o||a&&s)return e;let l={scrollLeft:0,scrollTop:0},u=_n(1),f=_n(0),h=yn(n);if((h||!h&&!s)&&((cs(n)!=="body"||ao(o))&&(l=Ta(n)),yn(n))){let p=ds(n);u=lo(n),f.x=p.x+n.clientLeft,f.y=p.y+n.clientTop}let c=o&&!h&&!s?Hg(o,l,!0):_n(0);return{width:e.width*u.x,height:e.height*u.y,x:e.x*u.x-l.scrollLeft*u.x+f.x+c.x,y:e.y*u.y-l.scrollTop*u.y+f.y+c.y}}function pb(i){return Array.from(i.getClientRects())}function gb(i){let t=wn(i),e=Ta(i),n=i.ownerDocument.body,r=or(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),s=or(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight),o=-e.scrollLeft+lf(i),a=-e.scrollTop;return sn(n).direction==="rtl"&&(o+=or(t.clientWidth,n.clientWidth)-r),{width:r,height:s,x:o,y:a}}function mb(i,t){let e=Ci(i),n=wn(i),r=e.visualViewport,s=n.clientWidth,o=n.clientHeight,a=0,l=0;if(r){s=r.width,o=r.height;let u=Eu();(!u||u&&t==="fixed")&&(a=r.offsetLeft,l=r.offsetTop)}return{width:s,height:o,x:a,y:l}}function vb(i,t){let e=ds(i,!0,t==="fixed"),n=e.top+i.clientTop,r=e.left+i.clientLeft,s=yn(i)?lo(i):_n(1),o=i.clientWidth*s.x,a=i.clientHeight*s.y,l=r*s.x,u=n*s.y;return{width:o,height:a,x:l,y:u}}function Ng(i,t,e){let n;if(t==="viewport")n=mb(i,e);else if(t==="document")n=gb(wn(i));else if(rn(t))n=vb(t,e);else{let r=Fg(i);n={x:t.x-r.x,y:t.y-r.y,width:t.width,height:t.height}}return hs(n)}function Vg(i,t){let e=ar(i);return e===t||!rn(e)||fs(e)?!1:sn(e).position==="fixed"||Vg(e,t)}function bb(i,t){let e=t.get(i);if(e)return e;let n=oo(i,[],!1).filter(a=>rn(a)&&cs(a)!=="body"),r=null,s=sn(i).position==="fixed",o=s?ar(i):i;for(;rn(o)&&!fs(o);){let a=sn(o),l=Mu(o);!l&&a.position==="fixed"&&(r=null),(s?!l&&!r:!l&&a.position==="static"&&!!r&&["absolute","fixed"].includes(r.position)||ao(o)&&!l&&Vg(i,o))?n=n.filter(f=>f!==o):r=a,o=ar(o)}return t.set(i,n),n}function _b(i){let{element:t,boundary:e,rootBoundary:n,strategy:r}=i,o=[...e==="clippingAncestors"?Ea(t)?[]:bb(t,this._c):[].concat(e),n],a=o[0],l=o.reduce((u,f)=>{let h=Ng(t,f,r);return u.top=or(h.top,u.top),u.right=so(h.right,u.right),u.bottom=so(h.bottom,u.bottom),u.left=or(h.left,u.left),u},Ng(t,a,r));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function wb(i){let{width:t,height:e}=Bg(i);return{width:t,height:e}}function yb(i,t,e){let n=yn(t),r=wn(t),s=e==="fixed",o=ds(i,!0,s,t),a={scrollLeft:0,scrollTop:0},l=_n(0);function u(){l.x=lf(r)}if(n||!n&&!s)if((cs(t)!=="body"||ao(r))&&(a=Ta(t)),n){let p=ds(t,!0,s,t);l.x=p.x+t.clientLeft,l.y=p.y+t.clientTop}else r&&u();s&&!n&&r&&u();let f=r&&!n&&!s?Hg(r,a):_n(0),h=o.left+a.scrollLeft-l.x-f.x,c=o.top+a.scrollTop-l.y-f.y;return{x:h,y:c,width:o.width,height:o.height}}function of(i){return sn(i).position==="static"}function Lg(i,t){if(!yn(i)||sn(i).position==="fixed")return null;if(t)return t(i);let e=i.offsetParent;return wn(i)===e&&(e=e.ownerDocument.body),e}function zg(i,t){let e=Ci(i);if(Ea(i))return e;if(!yn(i)){let r=ar(i);for(;r&&!fs(r);){if(rn(r)&&!of(r))return r;r=ar(r)}return e}let n=Lg(i,t);for(;n&&Rg(n)&&of(n);)n=Lg(n,t);return n&&fs(n)&&of(n)&&!Mu(n)?e:n||Ig(i)||e}var xb=async function(i){let t=this.getOffsetParent||zg,e=this.getDimensions,n=await e(i.floating);return{reference:yb(i.reference,await t(i.floating),i.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}};function kb(i){return sn(i).direction==="rtl"}var Sb={convertOffsetParentRelativeRectToViewportRelativeRect:db,getDocumentElement:wn,getClippingRect:_b,getOffsetParent:zg,getElementRects:xb,getClientRects:pb,getDimensions:wb,getScale:lo,isElement:rn,isRTL:kb};function Gg(i,t){return i.x===t.x&&i.y===t.y&&i.width===t.width&&i.height===t.height}function Mb(i,t){let e=null,n,r=wn(i);function s(){var a;clearTimeout(n),(a=e)==null||a.disconnect(),e=null}function o(a,l){a===void 0&&(a=!1),l===void 0&&(l=1),s();let u=i.getBoundingClientRect(),{left:f,top:h,width:c,height:p}=u;if(a||t(),!c||!p)return;let g=Ma(h),m=Ma(r.clientWidth-(f+c)),v=Ma(r.clientHeight-(h+p)),_=Ma(f),k={rootMargin:-g+"px "+-m+"px "+-v+"px "+-_+"px",threshold:or(0,so(1,l))||1},E=!0;function M(w){let x=w[0].intersectionRatio;if(x!==l){if(!E)return o();x?o(!1,x):n=setTimeout(()=>{o(!1,1e-7)},1e3)}x===1&&!Gg(u,i.getBoundingClientRect())&&o(),E=!1}try{e=new IntersectionObserver(M,{...k,root:r.ownerDocument})}catch{e=new IntersectionObserver(M,k)}e.observe(i)}return o(!0),s}function qg(i,t,e,n){n===void 0&&(n={});let{ancestorScroll:r=!0,ancestorResize:s=!0,elementResize:o=typeof ResizeObserver=="function",layoutShift:a=typeof IntersectionObserver=="function",animationFrame:l=!1}=n,u=af(i),f=r||s?[...u?oo(u):[],...oo(t)]:[];f.forEach(_=>{r&&_.addEventListener("scroll",e,{passive:!0}),s&&_.addEventListener("resize",e)});let h=u&&a?Mb(u,e):null,c=-1,p=null;o&&(p=new ResizeObserver(_=>{let[S]=_;S&&S.target===u&&p&&(p.unobserve(t),cancelAnimationFrame(c),c=requestAnimationFrame(()=>{var k;(k=p)==null||k.observe(t)})),e()}),u&&!l&&p.observe(u),p.observe(t));let g,m=l?ds(i):null;l&&v();function v(){let _=ds(i);m&&!Gg(m,_)&&e(),m=_,g=requestAnimationFrame(v)}return e(),()=>{var _;f.forEach(S=>{r&&S.removeEventListener("scroll",e),s&&S.removeEventListener("resize",e)}),h?.(),(_=p)==null||_.disconnect(),p=null,l&&cancelAnimationFrame(g)}}var Wg=Og,Ug=Cg;var jg=(i,t,e)=>{let n=new Map,r={platform:Sb,...e},s={...r.platform,_c:n};return Ag(i,t,{...r,platform:s})};function Yg(i){let t=i.parentElement?.querySelector("input[type=text]");if(!t)return;let e=qg(t,i,()=>jg(t,i,{placement:"bottom-start",middleware:[Wg({padding:5}),Ug()]}).then(({x:n,y:r})=>{Object.assign(i.style,{left:`${n}px`,top:`${r}px`})}));return{destroy(){e()}}}function Kg(i,t,e,n){let r=i?Array.isArray(i)?i:i.split(","):[];return r=r.map(s=>s.replace(/(:\d+):\d+(.*)/,"$1$2")),{iValues:r,iValueCombined:r.length?r.join():null,iDates:r.map(s=>as(s,t,e,n))}}function Jg(i,t){return i==="auto"?t.match(/g|hh?|ii?/i)&&t.match(/y|m|d/i)?"datetime":t.match(/g|hh?|ii?/i)?"time":"date":i}var Je=gg,Eb=G(' '),Tb=G(''),Ab=G(''),Cb=G(" "),Ob=G('
'),Db=G(''),$b=G(' ',1),Rb=i=>i.preventDefault(),Ib=G('
'),Pb=G('
'),Nb=G('
'),Lb={hash:"svelte-yheoi9",code:`.sdt-component-wrap.svelte-yheoi9 {position:relative;display:inline-block;}.sdt-input-wrap.svelte-yheoi9 {position:relative;display:contents;}.sdt-calendar-wrap.svelte-yheoi9 {width:280px;background-color:var(--sdt-bg-main, #fff);box-shadow:var(--sdt-wrap-shadow, 0 1px 6px var(--sdt-shadow-color, #ccc));border-radius:var(--sdt-radius, 4px);padding:0.5em;color:var(--sdt-color, initial);}.sdt-calendar-wrap.is-range-wrap.svelte-yheoi9 {width:560px;}.sdt-widget-wrap.svelte-yheoi9 {display:flex;gap:0.5rem;justify-content:stretch;position:relative;}.sdt-widget.svelte-yheoi9 {flex:1;min-width:264px;}.value-dirty.svelte-yheoi9 {color:color-mix(in srgb, black 20%, white);}.sdt-calendar-wrap.is-popup.svelte-yheoi9 {position:absolute;box-shadow:0 1px 6px var(--sdt-shadow-color, #ccc);z-index:100;}.sdt-btn-row.svelte-yheoi9 {margin-top:0.5rem;display:flex;gap:0.5rem;justify-content:space-between;flex-flow:row-reverse;}.sdt-action-btn.svelte-yheoi9 {padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;}.sdt-today-btn.svelte-yheoi9 {background-color:var(--sdt-bg-selected, #286090);color:var(--sdt-today-color, var(--sdt-bg-main, #fff));padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;border:1px solid var(--sdt-today-bg, #286090);}.sdt-today-btn[disabled].svelte-yheoi9 {opacity:0.5;cursor:not-allowed;}.sdt-today-btn.svelte-yheoi9:focus, .sdt-today-btn.svelte-yheoi9:active, .sdt-today-btn.svelte-yheoi9:hover:not([disabled]) {background-color:var(--sdt-today-bg, #286090);}.sdt-clear-btn.svelte-yheoi9 {border:1px solid var(--sdt-clear-color, #dc3545);background-color:var(--sdt-clear-bg, transparent);color:var(--sdt-clear-color, #dc3545);}.sdt-clear-btn.svelte-yheoi9:focus, .sdt-clear-btn.svelte-yheoi9:active:not([disabled]), .sdt-clear-btn.svelte-yheoi9:hover:not([disabled]) {background-color:var(--sdt-clear-hover-bg, #dc3545);color:var(--sdt-clear-hover-color, var(--sdt-bg-main, #fff));}.sdt-widget.svelte-yheoi9 + .sdt-widget:where(.svelte-yheoi9):before {content:'';position:absolute;top:0;bottom:0;left:50%;width:1px;background-color:#eee;} @media screen and (max-width: 560px) {.sdt-calendar-wrap.is-range-wrap.svelte-yheoi9 {width:280px;}.sdt-widget-wrap.svelte-yheoi9 {flex-wrap:wrap;}.sdt-widget.svelte-yheoi9 + .sdt-widget:where(.svelte-yheoi9):before {content:none;} - }`};function _c(C,I){VI(I,!0),IF(C,ox);let g=(gI,bI)=>{let xg=()=>bI?.().autocloseSupported,wg=()=>bI?.().todayBtnClasses,uC=()=>bI?.().clearBtnClasses,EC=()=>bI?.().onCancel,Zg=()=>bI?.().onConfirm,zC=()=>bI?.().onClear,fg=()=>bI?.().onToday,AF=()=>bI?.().isTodayDisabled,NC=()=>bI?.().i18n,lA=()=>bI?.().currentMode;var LC=Ng(),NB=yI(LC);{var NF=rB=>{var pB=Lx(),UF=O(pB);{var sA=u=>{var W=ex(),E=O(W);E.__click=function(...j){EC()?.apply(this,j)};var S=O(E,!0);z(E);var k=v(E,2);k.__click=function(...j){Zg()?.apply(this,j)};var K=O(k,!0);z(k),z(W),sI(()=>{nI(E,1,Og(uC()),"svelte-yheoi9"),vI(S,NC().cancelBtn),nI(k,1,Og(wg()),"svelte-yheoi9"),vI(K,NC().okBtn)}),D(u,W)};GI(UF,u=>{xg()||u(sA)})}var V=v(UF,2);{var X=u=>{var W=ux(),E=O(W);{var S=j=>{var P=Vx();P.__click=function(...cI){fg()?.apply(this,cI)};var II=O(P,!0);z(P),sI(()=>{nI(P,1,Og(wg()),"svelte-yheoi9"),P.disabled=AF(),vI(II,NC().todayBtn)}),D(j,P)};GI(E,j=>{r()&&lA()==="date"&&j(S)})}var k=v(E,2);{var K=j=>{var P=xx();P.__click=function(...cI){zC()?.apply(this,cI)};var II=O(P,!0);z(P),sI(()=>{nI(P,1,Og(uC()),"svelte-yheoi9"),vI(II,NC().clearBtn)}),D(j,P)};GI(k,j=>{N()&&j(K)})}z(W),D(u,W)};GI(V,u=>{(r()||N())&&u(X)})}z(pB),D(rB,pB)};GI(NB,rB=>{xg(),rB(NF)})}D(gI,LC)},B=J(I,"inputId",3,""),F=J(I,"name",3,"date"),Q=J(I,"disabled",3,!1),A=J(I,"placeholder",3,null),U=J(I,"required",3,!1),l=J(I,"value",15,null),s=J(I,"isRange",3,!1),G=J(I,"startDate",3,null),t=J(I,"endDate",3,null),c=J(I,"pickerOnly",3,!1),d=J(I,"startView",7,2),b=J(I,"mode",3,"auto"),Z=J(I,"disableDatesFn",3,null),e=J(I,"manualInput",3,!1),x=J(I,"theme",19,()=>qg.theme),a=J(I,"format",19,()=>qg.format),n=J(I,"formatType",19,()=>qg.formatType),h=J(I,"displayFormat",19,()=>qg.displayFormat),m=J(I,"displayFormatType",19,()=>qg.displayFormatType),L=J(I,"minuteIncrement",19,()=>qg.minuteIncrement),R=J(I,"weekStart",19,()=>qg.weekStart),o=J(I,"inputClasses",19,()=>qg.inputClasses),y=J(I,"todayBtnClasses",19,()=>qg.todayBtnClasses),H=J(I,"clearBtnClasses",19,()=>qg.clearBtnClasses),r=J(I,"todayBtn",19,()=>qg.todayBtn),N=J(I,"clearBtn",19,()=>qg.clearBtn),T=J(I,"clearToggle",19,()=>qg.clearToggle),M=J(I,"autocommit",19,()=>qg.autocommit),q=J(I,"hourOnly",19,()=>qg.hourOnly),AI=J(I,"i18n",19,()=>qg.i18n),aI=J(I,"validatorAction",3,null),uI=J(I,"ce_valueElement",7,null),ZI=J(I,"ce_displayElement",7,null),XI=J(I,"positionResolver",3,Hb),kI=J(I,"actionRow",3,g);s()&&Array.isArray(l());let{iDates:mI,iValues:wI,iValueCombined:gg}=Yb(l(),a(),AI(),n()),HI=gg,hI=lI(rI(wI)),WI=lI(rI(mI.map(gI=>new ig(gI)))),rg=lI(rI(wI)),PI=BI(()=>i(hI).length?i(hI).join(","):null),p=lI(rI(Rg())),w=a(),QI=h(),FI=lI(null),fI=BI(()=>G()?gQ(G(),a(),AI(),n()):null),oI=BI(()=>t()?new Date(gQ(t(),a(),AI(),n()).setSeconds(1)):null),eI=BI(()=>i(fI)&&i(fI)>new Date||i(oI)&&i(oI)F().endsWith("]")?F().substring(0,F().length-1)+"_input]":F()+"_input"),Ag=Jb(b(),a()),jI=lI(rI(Ag)),YI=lI(rI(Ag==="time"?"time":"date")),bg=rI(s()?[{ref:null},{ref:null}]:[{ref:null}]),$=lI("date"),dI=BI(()=>M()&&(s()&&i(jI)==="date"||!s())),UI=lI(rI(c())),DI=lI(rI(c())),Ug=c()?()=>({}):oF,bC=BI(()=>!!c()),ZC=aI()?aI().shift():()=>{},yg=aI()||[],eC=BI(()=>c()?()=>{}:XI()),VC=BI(()=>M()?!1:i(hI).join()!==i(rg).join()),kg;function Rg(){return i(WI).sort((gI,bI)=>gI.getTime()-bI.getTime()).map(gI=>$Q(gI,h()||a(),AI(),m()||n())).join(" - ")}function Dg(){return s()?i(hI).length===2?i(hI):null:i(hI)[0]||null}function Tg({type:gI,date:bI,isKeyboard:xg,dateIndex:wg=0}){if(bI&&!s()&&i(WI).length&&i(WI)[0].getFullYear()===bI.getFullYear()&&i(WI)[0].getMonth()===bI.getMonth()&&i(WI)[0].getDate()===bI.getDate()&&i(jI)==="date"&&!U()&&T()&&(bI=null),s()){if(gI==="date")Y(WI,bI?(i(WI).length===2?[new ig(bI)]:i(WI).concat(new ig(bI))).map(uC=>uC.getTime()).sort().map(uC=>new ig(uC)):[],!0);else if(bI&&wg!==void 0)i(WI)[wg]=new ig(bI);else if(gI==="datetime")i(WI)[0]=new ig(bI),i(WI)[1]=new ig(bI);else throw new Error(`Unhandled event type: '${gI}'`);Y(hI,i(WI).map(uC=>$Q(uC,a(),AI(),n())),!0)}else Y(WI,bI?[new ig(bI)]:[],!0),Y(hI,bI?[$Q(bI,a(),AI(),n())]:[],!0);Y($,gI,!0),Vg(gI)&&$g(),uB(gI,xg,wg)}function Vg(gI){return!M()||s()&&i(jI).includes("time")||s()&&(i(jI)==="datetime"||i(hI).length!==2)?!1:gI==="minute"||gI===i(jI)||gI==="hour"&&q()||c()}function $g(){HI=i(hI).join(),Y(rg,[...i(hI)],!0),Y(p,Rg(),!0),l(Dg()),Rs(!0),I.onChange?.(s()?i(hI):i(hI)[0]||null),I.onDateChange?.({value:s()?i(hI):i(hI)[0]||null,dateValue:s()?i(WI):i(WI)[0]||null,displayValue:i(p),valueFormat:a(),displayFormat:h(),event:i($)})}function xC(){d(2),i(jI)==="datetime"?setTimeout(()=>{c()||Y(DI,!1),Y(YI,"date")},M()?300:0):c()||Y(DI,!1)}function uB(gI,bI,xg){if(bI&&EF!=="Enter")return;if(gI==="hour"&&!q()){bg[xg].ref.showMinuteView();return}let wg=Vg(gI);if(i(jI)==="datetime"&&!(gI==="minute"&&!s()&&i(jI)==="datetime"&&wg)){gI==="date"&&(s()&&i(hI).length===2||!s())&&Y(YI,"time");return}wg&&!bI&&xC()}function WC(){let gI=new Date;Tg({type:s()?"datetime":"date",dateIndex:0,date:new Date(gI.getFullYear(),gI.getMonth(),gI.getDate(),0,0,0),isKeyboard:!1}),s()&&Tg({type:s()?"datetime":"date",dateIndex:1,date:new Date(gI.getFullYear(),gI.getMonth(),gI.getDate(),23,59,59,999),isKeyboard:!1}),Vg("date")===!1&&$g(),i(jI)==="date"&&xC()}function ng(){Y(WI,[],!0),Y(hI,[],!0),HI=null,$g()}function WF(){let gI=Array.isArray(l())?l().join():l()||null;(HI!==gI||M()===!1||s())&&$g(),xC()}function FB(){Y(hI,[...i(rg)],!0),xC(),I.onCancel?.()}let EF=null;function lQ(gI){if(i(DI)||(["Backspace","Delete"].includes(gI.key)&&!U()&&ng(),gI.key==="Enter"&&sQ()),!i(DI)&&gI.key!=="Tab"){Y(DI,gI.key!=="Shift"),gI.preventDefault();return}switch(EF=gI.key,gI.key){case"PageDown":case"PageUp":case"ArrowDown":case"ArrowUp":case"ArrowLeft":case"ArrowRight":if(gI.preventDefault(),s())return;i(YI)==="date"?kg.handleGridNav(gI.key,gI.shiftKey):bg[0].ref.makeTick(["ArrowDown","ArrowLeft","PageDown"].includes(gI.key)?-1:1);break;case"Escape":M()?ng():FB();break;case"Backspace":if(e()&&!s())return;case"Delete":!U()&&ng();break;case"Enter":if(i(UI)&&gI.preventDefault(),i(hI).length===0){Y(DI,!1);return}if(i(YI)==="time"&&i($)==="hour")return bg[0].ref.showMinuteView();if(i(jI)==="datetime"&&i(YI)!=="time"){Y(YI,"time");return}WF();break;case"Tab":i(DI)&&(Y(DI,!1),gI.preventDefault());case"F5":break;default:!e()&&gI.preventDefault()}}function AA(gI){gI.preventDefault(),gI.stopPropagation();let bI=gQ(gI.target.value,h()||a(),AI(),m()||n());$Q(bI,h()||a(),AI(),m()||n())===gI.target.value&&(Tg({type:"date",date:bI,isKeyboard:!0}),kg.focusDate(bI))}function nU(gI){d(2),Y(YI,gI,!0)}let UA=lI(rI(e()?"text":"none"));function aU(){e()&&i(UI)&&Y(UA,i(UA)==="text"?"none":"text",!0),!i(DI)&&sQ()}function sQ(){Y(UI,!0),Y(DI,!0)}function mU(){Y(UI,!1),i(dI)?WF():FB(),!ZI()&&I.onBlur?.()}function Rs(gI){uI()&&ZI()&&(uI().value=i(hI).join(",")||"",ZI().value=i(p),uI().dispatchEvent(new Event("input")),ZI().dispatchEvent(new Event("input"))),gI&&I.onInput?.(i(PI))}function ns(gI){Y(FI,gI,!0)}CF(()=>{ZI()&&(ZI().onfocus=sQ,ZI().onblur=mU,ZI().onclick=aU,ZI().onkeydown=lQ)});function as(gI){let bI=Array.isArray(gI)?gI.join():gI||null;HI!==bI&&(Y(hI,gI?Array.isArray(gI)?gI:[gI]:[],!0),Y(WI,i(hI).map(xg=>new ig(gQ(xg,a(),AI(),n()))),!0),Y(rg,i(hI),!0),HI=bI)}function hU(gI,bI){QI!==bI&&(QI=bI,Y(p,Rg(),!0)),w!==gI&&i(WI).length&&(w=gI,Y(hI,i(WI).map(xg=>$Q(xg,gI,AI(),n())),!0),HI=i(hI).join(),QI===null&&QI===bI&&Y(p,Rg(),!0),b()==="auto"&&(Y(jI,gI.match(/g|hh?|ii?/i)&&gI.match(/y|m|d/i)?"datetime":gI.match(/g|hh?|ii?/i)?"time":"date",!0),i(jI)==="time"&&i(YI)!=="time"&&Y(YI,"time")),$g())}og(()=>as(l())),og(()=>hU(a(),h()));var tQ=Xx();let XU;var cQ=O(tQ);cQ.__click=aU;var oU=O(cQ);{var ms=gI=>{var bI=nx(),xg=yI(bI);gF(xg);var wg=v(xg,2);{var uC=EC=>{var Zg=Rx();gF(Zg);let zC;Zg.__input=function(...fg){(e()?AA:()=>{})?.apply(this,fg)},Zg.__keydown=lQ,ql(Zg,(fg,AF)=>ZC?.(fg,AF),()=>yg),sI(fg=>{pI(Zg,"id",B()),pI(Zg,"name",i(MI)),zC=nI(Zg,1,Og(o()),"svelte-yheoi9",zC,fg),hF(Zg,i(p)),pI(Zg,"placeholder",A()),Zg.disabled=Q(),Zg.required=U(),pI(Zg,"inputmode",i(UA)),Zg.readOnly=i(UI)&&!e()&&!s()},[()=>({"value-dirty":i(VC)})]),vg("focus",Zg,sQ),vg("blur",Zg,mU),D(EC,Zg)};GI(wg,EC=>{c()||EC(uC)})}sI(()=>{pI(xg,"name",F()),hF(xg,l())}),D(gI,bI)};GI(oU,gI=>{ZI()||gI(ms)})}var hs=v(oU,2);yC(hs,()=>I.children??mg),z(cQ);var Xs=v(cQ,2);{var os=gI=>{var bI=hx();let xg;bI.__mousedown=[ax];var wg=O(bI);qI(wg,21,()=>bg,Qg,(EC,Zg,zC)=>{var fg=mx(),AF=O(fg);{var NC=LC=>{let NB=BI(()=>i(jI)?.includes("time")),NF=BI(()=>d()>2?2:d());dB(Dc(LC,{wid:zC,get dates(){return i(WI)},get isRange(){return s()},get startDate(){return i(fI)},get endDate(){return i(oI)},get enableTimeToggle(){return i(NB)},get initialView(){return i(NF)},get hoverDate(){return i(FI)},get additionalDisableFn(){return Z()},get i18n(){return AI()},get weekStart(){return R()},onupdate:Tg,onswitch:nU,onhoverupdate:ns}),rB=>kg=rB,()=>kg)},lA=LC=>{let NB=BI(()=>i(WI)[zC]||null),NF=BI(()=>s()&&zC===1?i(WI)[0]:i(fI)),rB=BI(()=>i(jI)!=="time"),pB=BI(()=>a().match(n()==="php"?"a|A":"p|P")!==null);dB(Tc(LC,{wid:zC,get date(){return i(NB)},get startDate(){return i(NF)},get endDate(){return i(oI)},get hasDateComponent(){return i(rB)},get showMeridian(){return i(pB)},get i18n(){return AI()},get minuteIncrement(){return L()},get hourOnly(){return q()},onupdate:Tg,onswitch:nU}),(UF,sA)=>sA.ref=UF,UF=>UF?.ref,()=>[i(Zg)])};GI(AF,LC=>{i(YI)==="date"?LC(NC):LC(lA,!1)})}z(fg),D(EC,fg)}),z(wg);var uC=v(wg,2);yC(uC,kI,()=>({autocloseSupported:i(dI),todayBtnClasses:y(),clearBtnClasses:H(),onCancel:FB,onConfirm:WF,onClear:ng,onToday:WC,isTodayDisabled:i(eI),i18n:AI(),currentMode:i(YI)})),z(bI),ql(bI,EC=>i(eC)?.(EC)),sI(EC=>xg=nI(bI,1,`sdt-calendar-wrap ${x()??""}`,"svelte-yheoi9",xg,EC),[()=>({"is-popup":!i(bC),"is-range-wrap":s()})]),_g(3,bI,()=>Ug,()=>({duration:200})),D(gI,bI)};GI(Xs,gI=>{i(DI)&&i(UI)&&gI(os)})}z(tQ),sI(gI=>XU=nI(tQ,1,"sdt-component-wrap svelte-yheoi9",null,XU,gI),[()=>({"picker-active":i(DI)})]),D(C,tQ),xI()}KI(["click","input","keydown","mousedown"]);var vb=_c;var yx=f('
');function qc(C,I){VI(I,!0);var g=yx(),B=O(g);vb(B,{pickerOnly:!0,isRange:!0,autocommit:!1,mode:"datetime",get value(){return I.value},format:"yyyy-mm-dd hh:ii:00",onBlur:()=>I.onClose(null),onChange:F=>I.onClose(F)}),z(g),D(C,g),xI()}var xU=class extends kb.Modal{constructor(g,B,F){super(g.app);this.plugin=g;this.value=B;this.callback=F;this.contentEl.parentElement.addClass("cmtr-daterange-picker-modal")}view;async onOpen(){this.view=yB(qc,{target:this.contentEl,props:{value:this.value?.map(g=>new Date(g*1e3).toISOString().split("T")[0]),onClose:async g=>{this.callback(g),super.close()}}})}onClose(){this.view&&$B(this.view)}};var Db=require("obsidian"),Ev=require("@codemirror/search");var Sx=Object.values(cg);function $c(C,I,g,B,F,Q,A,U,l){if(!I)return[];let s=I;B!==0&&l&&(B===1?s=I.filter(([t,c])=>t.startsWith(l.parent?.path??"")):B===2&&(s=I.filter(([t,c])=>t===l.path)));let G=s.flatMap(([t,c])=>c.data.map(d=>({path:t,range:d})));return G=G.filter(t=>t.range.type!=="comment"||!t.range.attached_comment),F!==void 0&&F!==0&&(G=G.filter(t=>t.range.full_thread.some(c=>c.type===Sx[F-1]))),Q!==0&&(G=G.filter(t=>t.range.full_thread.some(c=>Q===1!==c.empty()))),C.settings.enable_metadata&&(C.settings.enable_author_metadata&&A!==0&&C.settings.author&&(A===1?G=G.filter(t=>t.range.full_thread.some(c=>c.fields.author===C.settings.author)):A===2&&(G=G.filter(t=>t.range.full_thread.some(c=>c.fields.author&&c.fields.author!==C.settings.author)))),C.settings.enable_timestamp_metadata&&U&&(U[0]&&U[1]?G=G.filter(t=>t.range.full_thread.some(c=>c.fields.time&&c.fields.time>=U[0]&&c.fields.time<=U[1])):U[0]?G=G.filter(t=>t.range.full_thread.some(c=>c.fields.time&&c.fields.time>=U[0])):U[1]&&(G=G.filter(t=>t.range.full_thread.some(c=>c.fields.time&&c.fields.time<=U[1]))))),g?.length&&(G=G.filter(t=>(0,Db.prepareSimpleSearch)(g)(t.range.full_text)?.score)),G}async function Wx(C,I,g,B,F){C.key==="z"&&C.ctrlKey&&!C.shiftKey&&!C.altKey&&!C.metaKey?(C.preventDefault(),await pt(I.plugin)):C.key==="a"&&C.ctrlKey&&!C.shiftKey&&!C.altKey&&!C.metaKey?(C.preventDefault(),Y(g,[...i(B)],!0),Y(F,0)):C.key==="Escape"&&(C.preventDefault(),Y(g,[],!0),Y(F,null))}async function Ex(C,I,g){Y(I,[],!0),Y(g,null)}var Nx=(C,I,g)=>new xU(I.plugin,g(),B=>{g(B?.map(F=>F?window.moment(F,"YYYY-MM-DD HH:mm:ss").unix():0))}).open(),rx=(C,I)=>{C.preventDefault();let g=new EB.Menu;g.addItem(B=>{B.setTitle("Clear date filter").setIcon("calendar-x").onClick(()=>{I(void 0)})}),g.addItem(B=>{B.setTitle("Filter to today").setIcon("calendar-days").onClick(()=>{let F=window.moment().startOf("day").unix();I([F,F+86400])})}),g.addItem(B=>{B.setTitle("Filter to this week").setIcon("calendar-range").onClick(()=>{let F=window.moment().startOf("day").unix();I([F-window.moment().day()*86400,F+(7-window.moment().day())*86400])})}),g.addItem(B=>{B.setTitle("Filter to this month").setIcon("calendar-clock").onClick(()=>{let F=window.moment().startOf("day").unix();I([F-window.moment().date()*86400,F+(window.moment().daysInMonth()-window.moment().date())*86400])})}),g.showAtMouseEvent(C)},px=f(''),Hx=f(" ",1),Yx=f(" "),Jx=f('
',1),vx=f('
');function uU(C,I){VI(I,!0);let g=J(I,"range_type_filter",23,()=>0),B=J(I,"location_filter",23,()=>0),F=J(I,"content_filter",23,()=>0),Q=J(I,"author_filter",23,()=>0),A=J(I,"date_filter",7,void 0),U=lI(""),l=lI(null),s=I.plugin.app.workspace.on("layout-change",()=>{Y(l,I.plugin.app.workspace.getActiveFile(),!0)}),G=lI(!1),t=lI(rI([])),c=lI(rI([])),d=lI(null),b=[{icon:"asterisk",tooltip:"All markup",value:0},{icon:"plus-circle",tooltip:"Addition markup",value:1},{icon:"minus-square",tooltip:"Deletion markup",value:2},{icon:"replace",tooltip:"Substitution markup",value:3},{icon:"highlighter",tooltip:"Highlight markup",value:4},{icon:"message-square",tooltip:"Comment markup",value:5}],Z=["suggestions","insertions","deletions","replacements","highlights","comments"],e=[{icon:"vault",tooltip:"Entire vault",value:0},{icon:"folder-closed",tooltip:"Current folder",value:1},{icon:"file",tooltip:"Current file",value:2}],x=[{icon:"maximize",tooltip:"All suggestions",value:0},{icon:"square",tooltip:"Suggestions with content",value:1},{icon:"box-select",tooltip:"Empty suggestions",value:2}],a=[{icon:"users",tooltip:"All suggestions",value:0},{icon:"user",tooltip:"Own suggestions",value:1},{icon:"user-x",tooltip:"Others' suggestions",value:2}];CF(()=>{I.plugin.database.on("database-update",y=>{Y(t,y,!0)}),Y(t,I.plugin.database.allEntries(),!0)}),_d(()=>{I.plugin.app.workspace.offref(s)});let n=BI(()=>$c(I.plugin,i(t),i(U),B(),g(),F(),Q(),A(),i(l))),h=BI(()=>`${i(n).length} ${Z[g()]} in the ${e[i(l)?B():0].tooltip.toLowerCase()}`),m=(0,EB.debounce)($c,500),L=(0,EB.debounce)(()=>{I.sync_props({range_type_filter:g(),location_filter:B(),content_filter:F(),author_filter:Q(),date_filter:A(),search_filter:i(U)}),I.plugin.app.workspace.requestSaveLayout()},2500);og(()=>{g(),B(),F(),Q(),A(),L()}),og(()=>{i(n),Y(c,[],!0),Y(d,null)});async function R(y,H,r){if(y.stopPropagation(),y.shiftKey)i(d)?Y(c,[...i(n)].slice(Math.min(i(d),r),Math.max(i(d),r)+1),!0):(Y(c,[i(n)[r]],!0),Y(d,r,!0));else if(y.ctrlKey||y.metaKey){Y(d,r,!0);let N=i(c).length,T=i(n)[r];Y(c,i(c).filter(M=>!(M.path===T.path&&M.range===T.range)),!0),i(c).length===N&&Y(c,[...i(c),T],!0)}}async function o(y,H,r){y.stopPropagation(),Y(c,[],!0),await Xl(I.plugin,H)}tU(C,{header:r=>{sU(r,{container:T=>{var M=Jx(),q=yI(M),AI=O(q);qF(AI,{get value(){return i(U)},type:"text",enterkeyhint:"search",placeholder:"Search...",spellcheck:!1,onChange:PI=>{Y(U,PI,!0),m()}}),z(q);var aI=v(q,2),uI=O(aI);XF(uI,{onContextMenu:PI=>{let p=new EB.Menu;b.map((w,QI)=>{p.addItem(FI=>{FI.setTitle(w.tooltip).setIcon(w.icon).onClick(()=>{g(QI)})})}),p.showAtMouseEvent(PI)},class:"cmtr-view-action clickable-icon nav-action-button",states:b,get value(){return g()},set value(PI){g(PI)}});var ZI=v(uI,2);XF(ZI,{onContextMenu:PI=>{let p=new EB.Menu;e.map((w,QI)=>{p.addItem(FI=>{FI.setTitle(w.tooltip).setIcon(w.icon).onClick(()=>{B(QI)})})}),p.showAtMouseEvent(PI)},class:"cmtr-view-action clickable-icon nav-action-button",states:e,get value(){return B()},set value(PI){B(PI)}});var XI=v(ZI,2);XF(XI,{onContextMenu:PI=>{let p=new EB.Menu;x.map((w,QI)=>{p.addItem(FI=>{FI.setTitle(w.tooltip).setIcon(w.icon).onClick(()=>{F(QI)})})}),p.showAtMouseEvent(PI)},class:"cmtr-view-action clickable-icon nav-action-button",states:x,get value(){return F()},set value(PI){F(PI)}});var kI=v(XI,2);{var mI=PI=>{var p=Hx(),w=yI(p);{var QI=oI=>{XF(oI,{onContextMenu:eI=>{let MI=new EB.Menu;a.map((Ag,jI)=>{MI.addItem(YI=>{YI.setTitle(Ag.tooltip).setIcon(Ag.icon).onClick(()=>{Q(jI)})})}),MI.showAtMouseEvent(eI)},class:"cmtr-view-action clickable-icon nav-action-button",states:a,get value(){return Q()},set value(eI){Q(eI)}})};GI(w,oI=>{I.plugin.settings.enable_author_metadata&&oI(QI)})}var FI=v(w,2);{var fI=oI=>{var eI=px();eI.__click=[Nx,I,A],eI.__contextmenu=[rx,A];var MI=O(eI);lC(MI,{icon:"calendar"}),z(eI),D(oI,eI)};GI(FI,oI=>{I.plugin.settings.enable_timestamp_metadata&&oI(fI)})}D(PI,p)};GI(kI,PI=>{I.plugin.settings.enable_metadata&&PI(mI)})}var wI=v(kI,2);dC(wI,{class:"clickable-icon nav-action-button cmtr-view-action",icon:"more-vertical",tooltip:"More options",onClick:PI=>{GF(!0);let p=new EB.Menu;p.addItem(w=>{w.setTitle("Clear filters").setIcon("filter-x").setSection("filter-actions").onClick(()=>{g(0),B(0),F(0),Q(0),A(void 0),Y(U,"")})}),p.addItem(w=>{let QI=w.setTitle("Filter by author").setIcon("user-search").setSection("filter-actions").setSubmenu();Ll(QI,Q(),a,FI=>{Q(FI)})}),p.addItem(w=>{let QI=w.setTitle("Filter by type").setIcon("space").setSection("filter-actions").setSubmenu();Ll(QI,g(),b,FI=>{g(FI)})}),p.addItem(w=>{let QI=w.setTitle("Filter by location").setIcon("locate").setSection("filter-actions").setSubmenu();Ll(QI,B(),e,FI=>{B(FI)})}),p.addItem(w=>{w.setTitle("Filter by date").setIcon("calendar").setSection("filter-actions").onClick(()=>{new xU(I.plugin,A(),QI=>{A(QI?.map(FI=>FI?window.moment(FI,"YYYY-MM-DD HH:mm:ss").unix():0))}).open()})}),p.addItem(w=>{w.setTitle("Select all").setIcon("circle").setSection("selection-actions").onClick(async()=>{Y(c,[...i(n)],!0),Y(d,0)})}),p.addItem(w=>{w.setTitle("Clear selection").setIcon("circle-dashed").setSection("selection-actions").onClick(()=>{Y(c,[],!0),Y(d,null)})}),p.addItem(w=>{w.setTitle("Invert selection").setIcon("circle-alert").setSection("selection-actions").onClick(()=>{let QI=[...i(c)].sort((oI,eI)=>{oI.range.from-eI.range.from}),FI=[],fI=0;for(let[oI,eI]of i(n).entries())fI{w.setTitle("Undo change").setIcon("undo").setSection("history-actions").setDisabled(!I.plugin.file_history.length).onClick(()=>{pt(I.plugin)})}),p.showAtMouseEvent(PI)}}),z(aI);var gg=v(aI,2),HI=O(gg),hI=O(HI,!0);z(HI);var WI=v(HI,2);{var rg=PI=>{var p=Yx(),w=O(p);z(p),sI(()=>vI(w,`\xB7 ${i(c).length??""} selected`)),D(PI,p)};GI(WI,PI=>{i(c).length&&PI(rg)})}z(gg),sI(()=>vI(hI,i(h))),D(T,M)},$$slots:{container:!0}})},view:r=>{var N=vx();N.__click=[Ex,c,d],N.__keydown=[Wx,I,c,n,d];var T=O(N);lU(T,{get items(){return i(n)},item:(q,AI=mg,aI=mg)=>{vc(q,{get plugin(){return I.plugin},get selected_ranges(){return i(c)},get row(){return AI()},get index(){return aI()},onClick:R,onDblClick:o,get menu_open(){return i(G)},set menu_open(uI){Y(G,uI,!0)}})},$$slots:{item:!0}}),z(N),D(r,N)},$$slots:{header:!0,view:!0}}),xI()}KI(["click","contextmenu","keydown"]);var xs=class extends Tb.PluginSettingTab{plugin;view=null;constructor(I,g){super(I,g),this.plugin=g}display(){let{containerEl:I}=this;I.empty(),this.view=yB(GU,{target:this.containerEl,props:{plugin:this.plugin}})}hide(){super.hide(),this.view&&$B(this.view)}};var wb=require("obsidian");var FA="commentator-annotations-view",us=class extends wb.ItemView{constructor(I,g){super(I),this.plugin=g,this.props.plugin=g}view=null;#I=lI(rI({plugin:void 0,range_type_filter:void 0,location_filter:void 0,content_filter:void 0,author_filter:void 0,date_filter:void 0}));get props(){return i(this.#I)}set props(I){Y(this.#I,I,!0)}async onOpen(){this.containerEl.empty(),this.containerEl.classList.add("cmtr-view")}async onClose(){this.view&&await $B(this.view),this.containerEl.detach()}getViewType(){return FA}getDisplayText(){return"Vault suggestions and comments"}getIcon(){return"message-square"}getState(){let{plugin:I,...g}=this.props;return{...super.getState(),...g}}async setState(I,g){this.props.range_type_filter=I.range_type_filter||0,this.props.location_filter=I.location_filter||0,this.props.content_filter=I.content_filter||0,this.props.author_filter=I.author_filter||0,this.props.date_filter=I.date_filter||void 0,this.view||(this.props.plugin=this.plugin,this.view=yB(uU,{target:this.containerEl,props:{...this.props,sync_props:B=>{for(let[F,Q]of Object.entries(B))this.props[F]=Q}}})),await super.setState(I,g)}};var tk=require("@codemirror/state"),IG=require("obsidian");function LU(C,I,g){let B=C.findIndex(F=>F?.compartment===I);C[B]=C[B].compartment.of(g)}function fb(C,I,g,B,F){gG(C,Q=>{Q.dispatch({effects:[g.reconfigure(B.of(F))]})}),LU(I,g,B.of(F))}function gG(C,I){C.workspace.iterateAllLeaves(g=>{g.view instanceof IG.MarkdownView&&g.view.currentMode.type==="source"&&I(g.view.editor.cm)})}function RU(C,I){for(let g of C.workspace.getLeavesOfType("markdown"))g.view instanceof IG.MarkdownView&&g.view.currentMode.type==="source"&&g.view.editor.cm.dispatch({annotations:[I]})}function zb(C,I){let g={};for(let B in C)C[B]!==I[B]&&(g[B]=C[B]);return g}var Ls=class extends xB.Plugin{editorExtensions=[];settings=SQ;previous_settings={};changed_settings={};previewModeHeaderButton;editModeHeaderModeButton;previewModeStatusBarButton;editModeStatusBarButton;metadataStatusBarButton;defaultEditModeExtension=[];settings_tab="general";database=new EA(this,"commentator/cache","Commentator cache",YG,"Vault-wide cache for Commentator plugin",()=>[],async(I,g)=>g?g.field(JI).ranges.ranges:uA(await this.app.vault.cachedRead(I)),this.settings.database_workers,I=>I.map(g=>Object.setPrototypeOf(g,LA[g.type].prototype)),()=>this.settings);file_history=[];postProcessor;annotation_gutter_config=void 0;loadEditorExtensions(){if(this.editorExtensions.length=0,this.editorExtensions.push(XA),this.editorExtensions.push(QA.Prec.highest(st)),this.editorExtensions.push(rt(this.settings)),this.editorExtensions.push(QA.Prec.highest(nt)),this.editorExtensions.push(LQ.of(ZF(this.settings.default_edit_mode,this.settings))),this.editorExtensions.push(JI),this.settings.annotation_gutter){let I=_G(this);this.annotation_gutter_config=I[1][1].value,this.editorExtensions.push(bl.of(QA.Prec.low(I)))}this.settings.live_preview&&this.editorExtensions.push(QA.Prec.low(Gt(this.settings))),this.settings.diff_gutter&&this.editorExtensions.push(QA.Prec.low(Rl.of(Vi))),this.settings.tag_completion&&this.editorExtensions.push(Et),this.settings.tag_correcter&&this.editorExtensions.push(Nt),this.editorExtensions.push(Mb.EditorView.domEventHandlers({copy:SG.bind(null,this.settings)})),this.editorExtensions.push(Js.of(HF.of(this.settings.diff_gutter_hide_empty))),this.editorExtensions.push(xQ.of(Mg.of(this.settings.default_preview_mode))),this.editorExtensions.push(uQ.of(nC.of(this.settings.default_edit_mode))),this.editorExtensions.push(VQ.of(QB.of(this.settings.annotation_gutter_included_types))),this.register(DG((I,g)=>{this.settings.annotation_gutter&&I.editMode.annotationGutterWidth===void 0&&(I.editMode.annotationGutterWidth=g.annotationGutterWidth??this.settings.annotation_gutter_width,I.editMode.annotationGutterFolded=g.annotationGutterFolded??this.settings.annotation_gutter_default_fold_state)},(I,g)=>{if(this.settings.annotation_gutter){let B=I.editMode.cm.plugin(dl)?.gutters[0];B&&(I.editMode.annotationGutterWidth=B.width,I.editMode.annotationGutterFolded=B.folded),g.annotationGutterFolded=I.editMode.annotationGutterFolded,g.annotationGutterWidth=I.editMode.annotationGutterWidth}},I=>{this.annotation_gutter_config!==void 0&&(this.annotation_gutter_config.width=I.editMode.annotationGutterWidth,this.annotation_gutter_config.foldState=I.editMode.annotationGutterFolded)}))}async updateEditorExtension(){Object.keys(this.changed_settings).some(I=>JG.has(I))?(this.loadEditorExtensions(),this.app.workspace.updateOptions(),this.settings.post_processor&&wt(this.app)):Object.keys(this.changed_settings).some(I=>vG.has(I))&&gG(this.app,I=>{I.dispatch(I.state.update({effects:RQ.of(!0)}))})}async onload(){sg.app=this.app,this.registerView(FA,I=>new us(I,this)),await this.migrateSettings(await this.loadData()),this.defaultEditModeExtension=ZF(this.settings.default_edit_mode,this.settings),this.addSettingTab(new xs(this.app,this)),this.loadEditorExtensions(),this.registerEditorExtension(this.editorExtensions),this.app.workspace.onLayoutReady(()=>{this.previewModeHeaderButton=Ni(this,this.settings.toolbar_preview_button),this.editModeHeaderModeButton=ri(this,this.settings.toolbar_edit_button)}),this.previewModeStatusBarButton=Si(this,this.settings.status_bar_preview_button),this.editModeStatusBarButton=Wi(this,this.settings.status_bar_edit_button),this.metadataStatusBarButton=Ei(this,this.settings.status_bar_metadata_button),this.settings.post_processor&&(this.postProcessor=this.registerMarkdownPostProcessor(async(I,g)=>yl(I,g,this.settings),-99999),Sl(this.app)),this.registerEvent(Li(this.app)),this.registerEvent(Ri(this.app));for(let I of ui(this))this.addCommand(I);this.register(TG(this,"commentator",()=>this.database.dropDatabase()))}async migrateSettings(I){let g=this.settings;if(this.settings=Object.assign({},SQ,I),this.previous_settings=Object.assign({},g,this.settings),sg.PLUGIN_SETTINGS=this.settings,I===null)await this.setSettings();else{let B=I?.version;try{if(B!==SQ.version){if(B||this.app.workspace.onLayoutReady(async()=>{new xB.Notice("Commentator: rebuilding database for new version",5e3),new xB.Notice("Commentator: metadata and replies features are now available, you can opt-in to these features in the settings",0)}),B.localeCompare("0.2.3",void 0,{numeric:!0})<0&&I.suggestion_gutter_hide_empty){let F=[["suggestion_gutter","diff_gutter"],["suggestion_gutter_hide_empty","diff_gutter_hide_empty"],["comment_gutter_default_fold_state","annotation_gutter_default_fold_state"],["comment_gutter_fold_button","annotation_gutter_fold_button"],["comment_gutter_resize_handle","annotation_gutter_resize_handle"],["comment_gutter_width","annotation_gutter_width"],["comment_gutter_hide_empty","annotation_gutter_hide_empty"]];for(let[Q,A]of F)Q in this.settings&&(this.settings[A]=this.settings[Q],delete this.settings[Q]);this.settings.comment_style==="block"&&(this.settings.comment_style="icon",this.settings.annotation_gutter=!0)}this.settings.version=SQ.version,await this.setSettings()}}catch{new xB.Notice("Commentator: Migration to new settings failed, using the default settings provided by the plugin",0)}}}async onExternalSettingsChange(){await this.migrateSettings(await this.loadData())}async onunload(){this.previewModeHeaderButton.detachButtons(),this.editModeHeaderModeButton.detachButtons(),xB.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor),this.database.unload()}async loadSettings(){this.settings=Object.assign({},SQ,await this.loadData())}async setSettings(){sg.PLUGIN_SETTINGS=this.settings,await this.saveData(this.settings),this.changed_settings=zb(this.settings,this.previous_settings),this.previous_settings=Object.assign({},this.settings)}async saveSettings(){await this.setSettings(),this.previewModeHeaderButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.editModeHeaderModeButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.previewModeHeaderButton.setRendering(this.changed_settings.toolbar_preview_button),this.editModeHeaderModeButton.setRendering(this.changed_settings.toolbar_edit_button),this.previewModeStatusBarButton.setRendering(this.changed_settings.status_bar_preview_button),this.editModeStatusBarButton.setRendering(this.changed_settings.status_bar_edit_button),this.metadataStatusBarButton.setRendering(this.changed_settings.status_bar_metadata_button),this.changed_settings.post_processor!==void 0&&(this.changed_settings.post_processor?this.postProcessor=this.registerMarkdownPostProcessor((I,g)=>yl(I,g,this.settings),-99999):xB.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor),Sl(this.app)),this.changed_settings.annotation_gutter_width!==void 0&&RU(this.app,tl.of(this.settings.annotation_gutter_width)),this.changed_settings.annotation_gutter_hide_empty!==void 0&&RU(this.app,cl.of(this.settings.annotation_gutter_hide_empty)),this.changed_settings.diff_gutter_hide_empty!==void 0&&fb(this.app,this.editorExtensions,Js,HF,this.settings.diff_gutter_hide_empty),this.changed_settings.annotation_gutter_fold_button!==void 0&&RU(this.app,Gl.of(this.settings.annotation_gutter_fold_button)),this.changed_settings.annotation_gutter_resize_handle!==void 0&&RU(this.app,il.of(this.settings.annotation_gutter_resize_handle)),this.changed_settings.default_preview_mode!==void 0&&LU(this.editorExtensions,xQ,Mg.of(this.settings.default_preview_mode)),this.changed_settings.default_edit_mode!==void 0&&(LU(this.editorExtensions,LQ,ZF(this.settings.default_edit_mode,this.settings)),LU(this.editorExtensions,uQ,nC.of(this.settings.default_edit_mode))),await this.updateEditorExtension(),Object.keys(this.changed_settings).some(I=>kG.has(I))&&await this.database.reinitializeDatabase()}async setSetting(I,g){this.settings[I]=g,await this.saveSettings()}async activateView(){this.app.workspace.detachLeavesOfType(FA),await this.app.workspace.getRightLeaf(!1).setViewState({type:FA,active:!0}),await this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(FA)[0])}setEditMode(I,g){I&&I.editor&&(I.editor.cm.dispatch(I.editor.cm.state.update({effects:[LQ.reconfigure(ZF(g,this.settings)),uQ.reconfigure(nC.of(g))]})),this.editModeStatusBarButton.updateButton(g),this.editModeHeaderModeButton.updateButton(I,g))}setPreviewMode(I,g){I&&I instanceof xB.MarkdownView&&(I.editor&&I.editor.cm.dispatch(I.editor.cm.state.update({effects:[xQ.reconfigure(Mg.of(g))]})),I.previewMode&&I.previewMode.rerender(!0),this.previewModeStatusBarButton.updateButton(g),this.previewModeHeaderButton.updateButton(I,g))}}; + }`};function uf(i,t){bt(t,!0),ir(i,Lb);let e=(et,gt)=>{let be=()=>gt?.().autocloseSupported,Ve=()=>gt?.().todayBtnClasses,wi=()=>gt?.().clearBtnClasses,Di=()=>gt?.().onCancel,ge=()=>gt?.().onConfirm,Wi=()=>gt?.().onClear,ze=()=>gt?.().onToday,lr=()=>gt?.().isTodayDisabled,$i=()=>gt?.().i18n,go=()=>gt?.().currentMode;var yi=$e(),Nn=Et(yi);{var Lr=Ln=>{var Bn=Ob(),ur=J(Bn);{var mo=y=>{var O=Eb(),$=J(O);$.__click=function(...K){Di()?.apply(this,K)};var C=J($,!0);W($);var H=F($,2);H.__click=function(...K){ge()?.apply(this,K)};var j=J(H,!0);W(H),W(O),ct(()=>{kt($,1,Ye(wi()),"svelte-yheoi9"),Wt(C,$i().cancelBtn),kt(H,1,Ye(Ve()),"svelte-yheoi9"),Wt(j,$i().okBtn)}),V(y,O)};pt(ur,y=>{be()||y(mo)})}var b=F(ur,2);{var T=y=>{var O=Cb(),$=J(O);{var C=K=>{var Y=Tb();Y.__click=function(...ht){ze()?.apply(this,ht)};var Z=J(Y,!0);W(Y),ct(()=>{kt(Y,1,Ye(Ve()),"svelte-yheoi9"),Y.disabled=lr(),Wt(Z,$i().todayBtn)}),V(K,Y)};pt($,K=>{I()&&go()==="date"&&K(C)})}var H=F($,2);{var j=K=>{var Y=Ab();Y.__click=function(...ht){Wi()?.apply(this,ht)};var Z=J(Y,!0);W(Y),ct(()=>{kt(Y,1,Ye(wi()),"svelte-yheoi9"),Wt(Z,$i().clearBtn)}),V(K,Y)};pt(H,K=>{R()&&K(j)})}W(O),V(y,O)};pt(b,y=>{(I()||R())&&y(T)})}W(Bn),V(Ln,Bn)};pt(Nn,Ln=>{be(),Ln(Lr)})}V(et,yi)},n=B(t,"inputId",3,""),r=B(t,"name",3,"date"),s=B(t,"disabled",3,!1),o=B(t,"placeholder",3,null),a=B(t,"required",3,!1),l=B(t,"value",15,null),u=B(t,"isRange",3,!1),f=B(t,"startDate",3,null),h=B(t,"endDate",3,null),c=B(t,"pickerOnly",3,!1),p=B(t,"startView",7,2),g=B(t,"mode",3,"auto"),m=B(t,"disableDatesFn",3,null),v=B(t,"manualInput",3,!1),_=B(t,"theme",19,()=>Je.theme),S=B(t,"format",19,()=>Je.format),k=B(t,"formatType",19,()=>Je.formatType),E=B(t,"displayFormat",19,()=>Je.displayFormat),M=B(t,"displayFormatType",19,()=>Je.displayFormatType),w=B(t,"minuteIncrement",19,()=>Je.minuteIncrement),x=B(t,"weekStart",19,()=>Je.weekStart),A=B(t,"inputClasses",19,()=>Je.inputClasses),D=B(t,"todayBtnClasses",19,()=>Je.todayBtnClasses),N=B(t,"clearBtnClasses",19,()=>Je.clearBtnClasses),I=B(t,"todayBtn",19,()=>Je.todayBtn),R=B(t,"clearBtn",19,()=>Je.clearBtn),z=B(t,"clearToggle",19,()=>Je.clearToggle),U=B(t,"autocommit",19,()=>Je.autocommit),tt=B(t,"hourOnly",19,()=>Je.hourOnly),rt=B(t,"i18n",19,()=>Je.i18n),At=B(t,"validatorAction",3,null),St=B(t,"ce_valueElement",7,null),mt=B(t,"ce_displayElement",7,null),Dt=B(t,"positionResolver",3,Yg),Bt=B(t,"actionRow",3,e);u()&&Array.isArray(l());let{iDates:wt,iValues:qt,iValueCombined:ee}=Kg(l(),S(),rt(),k()),Vt=ee,Tt=at(Rt(qt)),Nt=at(Rt(wt.map(et=>new fe(et)))),Xe=at(Rt(qt)),Jt=nt(()=>d(Tt).length?d(Tt).join(","):null),L=at(Rt(ye())),q=S(),lt=E(),st=at(null),zt=nt(()=>f()?as(f(),S(),rt(),k()):null),Mt=nt(()=>h()?new Date(as(h(),S(),rt(),k()).setSeconds(1)):null),vt=nt(()=>d(zt)&&d(zt)>new Date||d(Mt)&&d(Mt)r().endsWith("]")?r().substring(0,r().length-1)+"_input]":r()+"_input"),oe=Jg(g(),S()),Yt=at(Rt(oe)),Lt=at(Rt(oe==="time"?"time":"date")),pe=Rt(u()?[{ref:null},{ref:null}]:[{ref:null}]),Q=at("date"),dt=nt(()=>U()&&(u()&&d(Yt)==="date"||!u())),ot=at(Rt(c())),Ft=at(Rt(c())),ae=c()?()=>({}):$r,gi=nt(()=>!!c()),mi=At()?At().shift():()=>{},Ae=At()||[],vi=nt(()=>c()?()=>{}:Dt()),bi=nt(()=>U()?!1:d(Tt).join()!==d(Xe).join()),Be;function ye(){return d(Nt).sort((et,gt)=>et.getTime()-gt.getTime()).map(et=>ro(et,E()||S(),rt(),M()||k())).join(" - ")}function Fe(){return u()?d(Tt).length===2?d(Tt):null:d(Tt)[0]||null}function He({type:et,date:gt,isKeyboard:be,dateIndex:Ve=0}){if(gt&&!u()&&d(Nt).length&&d(Nt)[0].getFullYear()===gt.getFullYear()&&d(Nt)[0].getMonth()===gt.getMonth()&&d(Nt)[0].getDate()===gt.getDate()&&d(Yt)==="date"&&!a()&&z()&&(gt=null),u()){if(et==="date")P(Nt,gt?(d(Nt).length===2?[new fe(gt)]:d(Nt).concat(new fe(gt))).map(wi=>wi.getTime()).sort().map(wi=>new fe(wi)):[],!0);else if(gt&&Ve!==void 0)d(Nt)[Ve]=new fe(gt);else if(et==="datetime")d(Nt)[0]=new fe(gt),d(Nt)[1]=new fe(gt);else throw new Error(`Unhandled event type: '${et}'`);P(Tt,d(Nt).map(wi=>ro(wi,S(),rt(),k())),!0)}else P(Nt,gt?[new fe(gt)]:[],!0),P(Tt,gt?[ro(gt,S(),rt(),k())]:[],!0);P(Q,et,!0),ve(et)&&Qe(),kn(et,be,Ve)}function ve(et){return!U()||u()&&d(Yt).includes("time")||u()&&(d(Yt)==="datetime"||d(Tt).length!==2)?!1:et==="minute"||et===d(Yt)||et==="hour"&&tt()||c()}function Qe(){Vt=d(Tt).join(),P(Xe,[...d(Tt)],!0),P(L,ye(),!0),l(Fe()),$u(!0),t.onChange?.(u()?d(Tt):d(Tt)[0]||null),t.onDateChange?.({value:u()?d(Tt):d(Tt)[0]||null,dateValue:u()?d(Nt):d(Nt)[0]||null,displayValue:d(L),valueFormat:S(),displayFormat:E(),event:d(Q)})}function _i(){p(2),d(Yt)==="datetime"?setTimeout(()=>{c()||P(Ft,!1),P(Lt,"date")},U()?300:0):c()||P(Ft,!1)}function kn(et,gt,be){if(gt&&Nr!=="Enter")return;if(et==="hour"&&!tt()){pe[be].ref.showMinuteView();return}let Ve=ve(et);if(d(Yt)==="datetime"&&!(et==="minute"&&!u()&&d(Yt)==="datetime"&&Ve)){et==="date"&&(u()&&d(Tt).length===2||!u())&&P(Lt,"time");return}Ve&&!gt&&_i()}function Oi(){let et=new Date;He({type:u()?"datetime":"date",dateIndex:0,date:new Date(et.getFullYear(),et.getMonth(),et.getDate(),0,0,0),isKeyboard:!1}),u()&&He({type:u()?"datetime":"date",dateIndex:1,date:new Date(et.getFullYear(),et.getMonth(),et.getDate(),23,59,59,999),isKeyboard:!1}),ve("date")===!1&&Qe(),d(Yt)==="date"&&_i()}function xe(){P(Nt,[],!0),P(Tt,[],!0),Vt=null,Qe()}function Pr(){let et=Array.isArray(l())?l().join():l()||null;(Vt!==et||U()===!1||u())&&Qe(),_i()}function on(){P(Tt,[...d(Xe)],!0),_i(),t.onCancel?.()}let Nr=null;function ps(et){if(d(Ft)||(["Backspace","Delete"].includes(et.key)&&!a()&&xe(),et.key==="Enter"&&gs()),!d(Ft)&&et.key!=="Tab"){P(Ft,et.key!=="Shift"),et.preventDefault();return}switch(Nr=et.key,et.key){case"PageDown":case"PageUp":case"ArrowDown":case"ArrowUp":case"ArrowLeft":case"ArrowRight":if(et.preventDefault(),u())return;d(Lt)==="date"?Be.handleGridNav(et.key,et.shiftKey):pe[0].ref.makeTick(["ArrowDown","ArrowLeft","PageDown"].includes(et.key)?-1:1);break;case"Escape":U()?xe():on();break;case"Backspace":if(v()&&!u())return;case"Delete":!a()&&xe();break;case"Enter":if(d(ot)&&et.preventDefault(),d(Tt).length===0){P(Ft,!1);return}if(d(Lt)==="time"&&d(Q)==="hour")return pe[0].ref.showMinuteView();if(d(Yt)==="datetime"&&d(Lt)!=="time"){P(Lt,"time");return}Pr();break;case"Tab":d(Ft)&&(P(Ft,!1),et.preventDefault());case"F5":break;default:!v()&&et.preventDefault()}}function fo(et){et.preventDefault(),et.stopPropagation();let gt=as(et.target.value,E()||S(),rt(),M()||k());ro(gt,E()||S(),rt(),M()||k())===et.target.value&&(He({type:"date",date:gt,isKeyboard:!0}),Be.focusDate(gt))}function Oa(et){p(2),P(Lt,et,!0)}let po=at(Rt(v()?"text":"none"));function Da(){v()&&d(ot)&&P(po,d(po)==="text"?"none":"text",!0),!d(Ft)&&gs()}function gs(){P(ot,!0),P(Ft,!0)}function $a(){P(ot,!1),d(dt)?Pr():on(),!mt()&&t.onBlur?.()}function $u(et){St()&&mt()&&(St().value=d(Tt).join(",")||"",mt().value=d(L),St().dispatchEvent(new Event("input")),mt().dispatchEvent(new Event("input"))),et&&t.onInput?.(d(Jt))}function Ru(et){P(st,et,!0)}rr(()=>{mt()&&(mt().onfocus=gs,mt().onblur=$a,mt().onclick=Da,mt().onkeydown=ps)});function Iu(et){let gt=Array.isArray(et)?et.join():et||null;Vt!==gt&&(P(Tt,et?Array.isArray(et)?et:[et]:[],!0),P(Nt,d(Tt).map(be=>new fe(as(be,S(),rt(),k()))),!0),P(Xe,d(Tt),!0),Vt=gt)}function Ra(et,gt){lt!==gt&&(lt=gt,P(L,ye(),!0)),q!==et&&d(Nt).length&&(q=et,P(Tt,d(Nt).map(be=>ro(be,et,rt(),k())),!0),Vt=d(Tt).join(),lt===null&<===gt&&P(L,ye(),!0),g()==="auto"&&(P(Yt,et.match(/g|hh?|ii?/i)&&et.match(/y|m|d/i)?"datetime":et.match(/g|hh?|ii?/i)?"time":"date",!0),d(Yt)==="time"&&d(Lt)!=="time"&&P(Lt,"time")),Qe())}Te(()=>Iu(l())),Te(()=>Ra(S(),E()));var ms=Nb();let Ia;var vs=J(ms);vs.__click=Da;var Pa=J(vs);{var Pu=et=>{var gt=$b(),be=Et(gt);nr(be);var Ve=F(be,2);{var wi=Di=>{var ge=Db();nr(ge);let Wi;ge.__input=function(...ze){(v()?fo:()=>{})?.apply(this,ze)},ge.__keydown=ps,au(ge,(ze,lr)=>mi?.(ze,lr),()=>Ae),ct(ze=>{It(ge,"id",n()),It(ge,"name",d(Ut)),Wi=kt(ge,1,Ye(A()),"svelte-yheoi9",Wi,ze),Or(ge,d(L)),It(ge,"placeholder",o()),ge.disabled=s(),ge.required=a(),It(ge,"inputmode",d(po)),ge.readOnly=d(ot)&&!v()&&!u()},[()=>({"value-dirty":d(bi)})]),Le("focus",ge,gs),Le("blur",ge,$a),V(Di,ge)};pt(Ve,Di=>{c()||Di(wi)})}ct(()=>{It(be,"name",r()),Or(be,l())}),V(et,gt)};pt(Pa,et=>{mt()||et(Pu)})}var Nu=F(Pa,2);Ai(Nu,()=>t.children??Se),W(vs);var Lu=F(vs,2);{var Bu=et=>{var gt=Pb();let be;gt.__mousedown=[Rb];var Ve=J(gt);Qt(Ve,21,()=>pe,se,(Di,ge,Wi)=>{var ze=Ib(),lr=J(ze);{var $i=yi=>{let Nn=nt(()=>d(Yt)?.includes("time")),Lr=nt(()=>p()>2?2:p());vn(Qc(yi,{wid:Wi,get dates(){return d(Nt)},get isRange(){return u()},get startDate(){return d(zt)},get endDate(){return d(Mt)},get enableTimeToggle(){return d(Nn)},get initialView(){return d(Lr)},get hoverDate(){return d(st)},get additionalDisableFn(){return m()},get i18n(){return rt()},get weekStart(){return x()},onupdate:He,onswitch:Oa,onhoverupdate:Ru}),Ln=>Be=Ln,()=>Be)},go=yi=>{let Nn=nt(()=>d(Nt)[Wi]||null),Lr=nt(()=>u()&&Wi===1?d(Nt)[0]:d(zt)),Ln=nt(()=>d(Yt)!=="time"),Bn=nt(()=>S().match(k()==="php"?"a|A":"p|P")!==null);vn(Zc(yi,{wid:Wi,get date(){return d(Nn)},get startDate(){return d(Lr)},get endDate(){return d(Mt)},get hasDateComponent(){return d(Ln)},get showMeridian(){return d(Bn)},get i18n(){return rt()},get minuteIncrement(){return w()},get hourOnly(){return tt()},onupdate:He,onswitch:Oa}),(ur,mo)=>mo.ref=ur,ur=>ur?.ref,()=>[d(ge)])};pt(lr,yi=>{d(Lt)==="date"?yi($i):yi(go,!1)})}W(ze),V(Di,ze)}),W(Ve);var wi=F(Ve,2);Ai(wi,Bt,()=>({autocloseSupported:d(dt),todayBtnClasses:D(),clearBtnClasses:N(),onCancel:on,onConfirm:Pr,onClear:xe,onToday:Oi,isTodayDisabled:d(vt),i18n:rt(),currentMode:d(Lt)})),W(gt),au(gt,Di=>d(vi)?.(Di)),ct(Di=>be=kt(gt,1,`sdt-calendar-wrap ${_()??""}`,"svelte-yheoi9",be,Di),[()=>({"is-popup":!d(gi),"is-range-wrap":u()})]),Ke(3,gt,()=>ae,()=>({duration:200})),V(et,gt)};pt(Lu,et=>{d(Ft)&&d(ot)&&et(Bu)})}W(ms),ct(et=>Ia=kt(ms,1,"sdt-component-wrap svelte-yheoi9",null,Ia,et),[()=>({"picker-active":d(Ft)})]),V(i,ms),_t()}jt(["click","input","keydown","mousedown"]);var Xg=uf;var Bb=G('
');function hf(i,t){bt(t,!0);var e=Bb(),n=J(e);Xg(n,{pickerOnly:!0,isRange:!0,autocommit:!1,mode:"datetime",get value(){return t.value},format:"yyyy-mm-dd hh:ii:00",onBlur:()=>t.onClose(null),onChange:r=>t.onClose(r)}),W(e),V(i,e),_t()}var Aa=class extends Qg.Modal{constructor(e,n,r){super(e.app);this.plugin=e;this.value=n;this.callback=r;this.contentEl.parentElement.addClass("cmtr-daterange-picker-modal")}view;async onOpen(){this.view=Dn(hf,{target:this.contentEl,props:{value:this.value?.map(e=>new Date(e*1e3).toISOString().split("T")[0]),onClose:async e=>{this.callback(e),super.close()}}})}onClose(){this.view&&er(this.view)}};var Zg=require("obsidian"),eL=require("@codemirror/search");var Fb=Object.values(he);function cf(i,t,e,n,r,s,o,a,l){if(!t)return[];let u=t;n!==0&&l&&(n===1?u=t.filter(([h,c])=>h.startsWith(l.parent?.path??"")):n===2&&(u=t.filter(([h,c])=>h===l.path)));let f=u.flatMap(([h,c])=>c.data.map(p=>({path:h,range:p})));return f=f.filter(h=>h.range.type!=="comment"||!h.range.attached_comment),r!==void 0&&r!==0&&(f=f.filter(h=>h.range.full_thread.some(c=>c.type===Fb[r-1]))),s!==0&&(f=f.filter(h=>h.range.full_thread.some(c=>s===1!==c.empty()))),i.settings.enable_metadata&&(i.settings.enable_author_metadata&&o!==0&&i.settings.author&&(o===1?f=f.filter(h=>h.range.full_thread.some(c=>c.fields.author===i.settings.author)):o===2&&(f=f.filter(h=>h.range.full_thread.some(c=>c.fields.author&&c.fields.author!==i.settings.author)))),i.settings.enable_timestamp_metadata&&a&&(a[0]&&a[1]?f=f.filter(h=>h.range.full_thread.some(c=>c.fields.time&&c.fields.time>=a[0]&&c.fields.time<=a[1])):a[0]?f=f.filter(h=>h.range.full_thread.some(c=>c.fields.time&&c.fields.time>=a[0])):a[1]&&(f=f.filter(h=>h.range.full_thread.some(c=>c.fields.time&&c.fields.time<=a[1]))))),e?.length&&(f=f.filter(h=>(0,Zg.prepareSimpleSearch)(e)(h.range.full_text)?.score)),f}async function Hb(i,t,e,n,r){i.key==="z"&&i.ctrlKey&&!i.shiftKey&&!i.altKey&&!i.metaKey?(i.preventDefault(),await Bh(t.plugin)):i.key==="a"&&i.ctrlKey&&!i.shiftKey&&!i.altKey&&!i.metaKey?(i.preventDefault(),P(e,[...d(n)],!0),P(r,0)):i.key==="Escape"&&(i.preventDefault(),P(e,[],!0),P(r,null))}async function Vb(i,t,e){P(t,[],!0),P(e,null)}var zb=(i,t,e)=>new Aa(t.plugin,e(),n=>{e(n?.map(r=>r?window.moment(r,"YYYY-MM-DD HH:mm:ss").unix():0))}).open(),Gb=(i,t)=>{i.preventDefault();let e=new Pn.Menu;e.addItem(n=>{n.setTitle("Clear date filter").setIcon("calendar-x").onClick(()=>{t(void 0)})}),e.addItem(n=>{n.setTitle("Filter to today").setIcon("calendar-days").onClick(()=>{let r=window.moment().startOf("day").unix();t([r,r+86400])})}),e.addItem(n=>{n.setTitle("Filter to this week").setIcon("calendar-range").onClick(()=>{let r=window.moment().startOf("day").unix();t([r-window.moment().day()*86400,r+(7-window.moment().day())*86400])})}),e.addItem(n=>{n.setTitle("Filter to this month").setIcon("calendar-clock").onClick(()=>{let r=window.moment().startOf("day").unix();t([r-window.moment().date()*86400,r+(window.moment().daysInMonth()-window.moment().date())*86400])})}),e.showAtMouseEvent(i)},qb=G(''),Wb=G(" ",1),Ub=G(" "),jb=G('
',1),Yb=G('
');function Ca(i,t){bt(t,!0);let e=B(t,"range_type_filter",23,()=>0),n=B(t,"location_filter",23,()=>0),r=B(t,"content_filter",23,()=>0),s=B(t,"author_filter",23,()=>0),o=B(t,"date_filter",7,void 0),a=at(""),l=at(null),u=t.plugin.app.workspace.on("layout-change",()=>{P(l,t.plugin.app.workspace.getActiveFile(),!0)}),f=at(!1),h=at(Rt([])),c=at(Rt([])),p=at(null),g=[{icon:"asterisk",tooltip:"All markup",value:0},{icon:"plus-circle",tooltip:"Addition markup",value:1},{icon:"minus-square",tooltip:"Deletion markup",value:2},{icon:"replace",tooltip:"Substitution markup",value:3},{icon:"highlighter",tooltip:"Highlight markup",value:4},{icon:"message-square",tooltip:"Comment markup",value:5}],m=["suggestions","insertions","deletions","replacements","highlights","comments"],v=[{icon:"vault",tooltip:"Entire vault",value:0},{icon:"folder-closed",tooltip:"Current folder",value:1},{icon:"file",tooltip:"Current file",value:2}],_=[{icon:"maximize",tooltip:"All suggestions",value:0},{icon:"square",tooltip:"Suggestions with content",value:1},{icon:"box-select",tooltip:"Empty suggestions",value:2}],S=[{icon:"users",tooltip:"All suggestions",value:0},{icon:"user",tooltip:"Own suggestions",value:1},{icon:"user-x",tooltip:"Others' suggestions",value:2}];rr(()=>{t.plugin.database.on("database-update",D=>{P(h,D,!0)}),P(h,t.plugin.database.allEntries(),!0)}),ug(()=>{t.plugin.app.workspace.offref(u)});let k=nt(()=>cf(t.plugin,d(h),d(a),n(),e(),r(),s(),o(),d(l))),E=nt(()=>`${d(k).length} ${m[e()]} in the ${v[d(l)?n():0].tooltip.toLowerCase()}`),M=(0,Pn.debounce)(cf,500),w=(0,Pn.debounce)(()=>{t.sync_props({range_type_filter:e(),location_filter:n(),content_filter:r(),author_filter:s(),date_filter:o(),search_filter:d(a)}),t.plugin.app.workspace.requestSaveLayout()},2500);Te(()=>{e(),n(),r(),s(),o(),w()}),Te(()=>{d(k),P(c,[],!0),P(p,null)});async function x(D,N,I){if(D.stopPropagation(),D.shiftKey)d(p)?P(c,[...d(k)].slice(Math.min(d(p),I),Math.max(d(p),I)+1),!0):(P(c,[d(k)[I]],!0),P(p,I,!0));else if(D.ctrlKey||D.metaKey){P(p,I,!0);let R=d(c).length,z=d(k)[I];P(c,d(c).filter(U=>!(U.path===z.path&&U.range===z.range)),!0),d(c).length===R&&P(c,[...d(c),z],!0)}}async function A(D,N,I){D.stopPropagation(),P(c,[],!0),await Dl(t.plugin,N)}_a(i,{header:I=>{ba(I,{container:z=>{var U=jb(),tt=Et(U),rt=J(tt);rs(rt,{get value(){return d(a)},type:"text",enterkeyhint:"search",placeholder:"Search...",spellcheck:!1,onChange:Jt=>{P(a,Jt,!0),M()}}),W(tt);var At=F(tt,2),St=J(At);Dr(St,{onContextMenu:Jt=>{let L=new Pn.Menu;g.map((q,lt)=>{L.addItem(st=>{st.setTitle(q.tooltip).setIcon(q.icon).onClick(()=>{e(lt)})})}),L.showAtMouseEvent(Jt)},class:"cmtr-view-action clickable-icon nav-action-button",states:g,get value(){return e()},set value(Jt){e(Jt)}});var mt=F(St,2);Dr(mt,{onContextMenu:Jt=>{let L=new Pn.Menu;v.map((q,lt)=>{L.addItem(st=>{st.setTitle(q.tooltip).setIcon(q.icon).onClick(()=>{n(lt)})})}),L.showAtMouseEvent(Jt)},class:"cmtr-view-action clickable-icon nav-action-button",states:v,get value(){return n()},set value(Jt){n(Jt)}});var Dt=F(mt,2);Dr(Dt,{onContextMenu:Jt=>{let L=new Pn.Menu;_.map((q,lt)=>{L.addItem(st=>{st.setTitle(q.tooltip).setIcon(q.icon).onClick(()=>{r(lt)})})}),L.showAtMouseEvent(Jt)},class:"cmtr-view-action clickable-icon nav-action-button",states:_,get value(){return r()},set value(Jt){r(Jt)}});var Bt=F(Dt,2);{var wt=Jt=>{var L=Wb(),q=Et(L);{var lt=Mt=>{Dr(Mt,{onContextMenu:vt=>{let Ut=new Pn.Menu;S.map((oe,Yt)=>{Ut.addItem(Lt=>{Lt.setTitle(oe.tooltip).setIcon(oe.icon).onClick(()=>{s(Yt)})})}),Ut.showAtMouseEvent(vt)},class:"cmtr-view-action clickable-icon nav-action-button",states:S,get value(){return s()},set value(vt){s(vt)}})};pt(q,Mt=>{t.plugin.settings.enable_author_metadata&&Mt(lt)})}var st=F(q,2);{var zt=Mt=>{var vt=qb();vt.__click=[zb,t,o],vt.__contextmenu=[Gb,o];var Ut=J(vt);ai(Ut,{icon:"calendar"}),W(vt),V(Mt,vt)};pt(st,Mt=>{t.plugin.settings.enable_timestamp_metadata&&Mt(zt)})}V(Jt,L)};pt(Bt,Jt=>{t.plugin.settings.enable_metadata&&Jt(wt)})}var qt=F(Bt,2);pi(qt,{class:"clickable-icon nav-action-button cmtr-view-action",icon:"more-vertical",tooltip:"More options",onClick:Jt=>{mr(!0);let L=new Pn.Menu;L.addItem(q=>{q.setTitle("Clear filters").setIcon("filter-x").setSection("filter-actions").onClick(()=>{e(0),n(0),r(0),s(0),o(void 0),P(a,"")})}),L.addItem(q=>{let lt=q.setTitle("Filter by author").setIcon("user-search").setSection("filter-actions").setSubmenu();sl(lt,s(),S,st=>{s(st)})}),L.addItem(q=>{let lt=q.setTitle("Filter by type").setIcon("space").setSection("filter-actions").setSubmenu();sl(lt,e(),g,st=>{e(st)})}),L.addItem(q=>{let lt=q.setTitle("Filter by location").setIcon("locate").setSection("filter-actions").setSubmenu();sl(lt,n(),v,st=>{n(st)})}),L.addItem(q=>{q.setTitle("Filter by date").setIcon("calendar").setSection("filter-actions").onClick(()=>{new Aa(t.plugin,o(),lt=>{o(lt?.map(st=>st?window.moment(st,"YYYY-MM-DD HH:mm:ss").unix():0))}).open()})}),L.addItem(q=>{q.setTitle("Select all").setIcon("circle").setSection("selection-actions").onClick(async()=>{P(c,[...d(k)],!0),P(p,0)})}),L.addItem(q=>{q.setTitle("Clear selection").setIcon("circle-dashed").setSection("selection-actions").onClick(()=>{P(c,[],!0),P(p,null)})}),L.addItem(q=>{q.setTitle("Invert selection").setIcon("circle-alert").setSection("selection-actions").onClick(()=>{let lt=[...d(c)].sort((Mt,vt)=>{Mt.range.from-vt.range.from}),st=[],zt=0;for(let[Mt,vt]of d(k).entries())zt{q.setTitle("Undo change").setIcon("undo").setSection("history-actions").setDisabled(!t.plugin.file_history.length).onClick(()=>{Bh(t.plugin)})}),L.showAtMouseEvent(Jt)}}),W(At);var ee=F(At,2),Vt=J(ee),Tt=J(Vt,!0);W(Vt);var Nt=F(Vt,2);{var Xe=Jt=>{var L=Ub(),q=J(L);W(L),ct(()=>Wt(q,`\xB7 ${d(c).length??""} selected`)),V(Jt,L)};pt(Nt,Jt=>{d(c).length&&Jt(Xe)})}W(ee),ct(()=>Wt(Tt,d(E))),V(z,U)},$$slots:{container:!0}})},view:I=>{var R=Yb();R.__click=[Vb,c,p],R.__keydown=[Hb,t,c,k,p];var z=J(R);va(z,{get items(){return d(k)},item:(tt,rt=Se,At=Se)=>{Jc(tt,{get plugin(){return t.plugin},get selected_ranges(){return d(c)},get row(){return rt()},get index(){return At()},onClick:x,onDblClick:A,get menu_open(){return d(f)},set menu_open(St){P(f,St,!0)}})},$$slots:{item:!0}}),W(R),V(I,R)},$$slots:{header:!0,view:!0}}),_t()}jt(["click","contextmenu","keydown"]);var Au=class extends tm.PluginSettingTab{plugin;view=null;constructor(t,e){super(t,e),this.plugin=e}display(){let{containerEl:t}=this;t.empty(),this.view=Dn(ya,{target:this.containerEl,props:{plugin:this.plugin}})}hide(){super.hide(),this.view&&er(this.view)}};var em=require("obsidian");var uo="commentator-annotations-view",Cu=class extends em.ItemView{constructor(t,e){super(t),this.plugin=e,this.props.plugin=e}view=null;#t=at(Rt({plugin:void 0,range_type_filter:void 0,location_filter:void 0,content_filter:void 0,author_filter:void 0,date_filter:void 0}));get props(){return d(this.#t)}set props(t){P(this.#t,t,!0)}async onOpen(){this.containerEl.empty(),this.containerEl.classList.add("cmtr-view")}async onClose(){this.view&&await er(this.view),this.containerEl.detach()}getViewType(){return uo}getDisplayText(){return"Vault suggestions and comments"}getIcon(){return"message-square"}getState(){let{plugin:t,...e}=this.props;return{...super.getState(),...e}}async setState(t,e){this.props.range_type_filter=t.range_type_filter||0,this.props.location_filter=t.location_filter||0,this.props.content_filter=t.content_filter||0,this.props.author_filter=t.author_filter||0,this.props.date_filter=t.date_filter||void 0,this.view||(this.props.plugin=this.plugin,this.view=Dn(Ca,{target:this.containerEl,props:{...this.props,sync_props:n=>{for(let[r,s]of Object.entries(n))this.props[r]=s}}})),await super.setState(t,e)}};var RL=require("@codemirror/state"),ff=require("obsidian");function Ou(i,t,e){let n=i.findIndex(r=>r?.compartment===t);i[n]=i[n].compartment.of(e)}function im(i,t){i.workspace.iterateAllLeaves(e=>{e.view instanceof ff.MarkdownView&&e.view.currentMode.type==="source"&&t(e.view.editor.cm)})}function ho(i,t){for(let e of i.workspace.getLeavesOfType("markdown"))e.view instanceof ff.MarkdownView&&e.view.currentMode.type==="source"&&e.view.editor.cm.dispatch({annotations:[t]})}var Du=class extends xn.Plugin{editorExtensions=[];settings=Ps;previous_settings={};changed_settings={};previewModeHeaderButton;editModeHeaderModeButton;previewModeStatusBarButton;editModeStatusBarButton;metadataStatusBarButton;defaultEditModeExtension=[];settings_tab="general";database=new zo(this,"commentator/cache","Commentator cache",Wf,"Vault-wide cache for Commentator plugin",()=>[],async(t,e)=>e?e.field(Pt).ranges.ranges:Lo(await this.app.vault.cachedRead(t),this.settings),this.settings.database_workers,t=>t.map(e=>Object.setPrototypeOf(e,Bo[e.type].prototype)),()=>this.settings);file_history=[];postProcessor;annotation_gutter_config=void 0;loadEditorExtensions(){if(this.editorExtensions.length=0,this.editorExtensions.push(Do),this.editorExtensions.push(co.Prec.highest(_h)),this.editorExtensions.push(Nh(this.settings)),this.editorExtensions.push(co.Prec.highest(ch)),this.editorExtensions.push(Ts.of(dr(this.settings.default_edit_mode,this.settings))),this.editorExtensions.push(Pt),this.settings.annotation_gutter){let t=rd(this);this.annotation_gutter_config=t[1][1].value,this.editorExtensions.push(Sl.of(co.Prec.low(t)))}this.settings.live_preview&&this.editorExtensions.push(co.Prec.low(xh(this.settings))),this.settings.diff_gutter&&this.editorExtensions.push(co.Prec.low(El.of(ud))),this.settings.tag_completion&&this.editorExtensions.push(Ih),this.settings.tag_correcter&&this.editorExtensions.push(Ph),this.editorExtensions.push(Lh(this)),this.editorExtensions.push(nm.EditorView.domEventHandlers({copy:Md.bind(null,this.settings)})),this.editorExtensions.push(Ms.of(qe.of(this.settings.default_preview_mode))),this.editorExtensions.push(Es.of(xi.of(this.settings.default_edit_mode))),this.editorExtensions.push(Ss.of(an.of(this.settings.annotation_gutter_included_types))),this.register(Kf((t,e)=>{this.settings.annotation_gutter&&t.editMode.annotationGutterWidth===void 0&&(t.editMode.annotationGutterWidth=e.annotationGutterWidth??this.settings.annotation_gutter_width,t.editMode.annotationGutterFolded=e.annotationGutterFolded??this.settings.annotation_gutter_default_fold_state)},(t,e)=>{if(this.settings.annotation_gutter){let n=t.editMode.cm.plugin(kl)?.gutters[0];n&&(t.editMode.annotationGutterWidth=n.width,t.editMode.annotationGutterFolded=n.folded),e.annotationGutterFolded=t.editMode.annotationGutterFolded,e.annotationGutterWidth=t.editMode.annotationGutterWidth}},t=>{this.annotation_gutter_config!==void 0&&(this.annotation_gutter_config.width=t.editMode.annotationGutterWidth,this.annotation_gutter_config.foldState=t.editMode.annotationGutterFolded)}))}async updateEditorExtension(){Object.keys(this.changed_settings).some(t=>Uf.has(t))?(this.loadEditorExtensions(),this.app.workspace.updateOptions(),this.settings.post_processor&&tc(this.app)):Object.keys(this.changed_settings).some(t=>jf.has(t))&&im(this.app,t=>{t.dispatch(t.state.update({effects:As.of(!0)}))})}async onload(){this.registerView(uo,t=>new Cu(t,this)),await this.migrateSettings(await this.loadData()),this.defaultEditModeExtension=dr(this.settings.default_edit_mode,this.settings),this.addSettingTab(new Au(this.app,this)),this.loadEditorExtensions(),this.registerEditorExtension(this.editorExtensions),this.app.workspace.onLayoutReady(()=>{this.previewModeHeaderButton=Wd(this,this.settings.toolbar_preview_button),this.editModeHeaderModeButton=Ud(this,this.settings.toolbar_edit_button)}),this.previewModeStatusBarButton=zd(this,this.settings.status_bar_preview_button),this.editModeStatusBarButton=Gd(this,this.settings.status_bar_edit_button),this.metadataStatusBarButton=qd(this,this.settings.status_bar_metadata_button),this.settings.post_processor&&(this.postProcessor=this.registerMarkdownPostProcessor(async(t,e)=>Bl(t,e,this),-99999),Fl(this.app)),this.registerEvent(gd(this)),this.registerEvent(md(this));for(let t of fd(this))this.addCommand(t);this.register(Jf(this,"commentator",()=>this.database.dropDatabase()))}async migrateSettings(t){let e=this.settings;if(this.settings=Object.assign({},Ps,t),this.previous_settings=Object.assign({},e,this.settings),t===null)await this.setSettings();else{let n=t?.version;try{if(n!==Ps.version){if(n||this.app.workspace.onLayoutReady(async()=>{new xn.Notice("Commentator: rebuilding database for new version",5e3),new xn.Notice("Commentator: metadata and replies features are now available, you can opt-in to these features in the settings",0)}),n.localeCompare("0.2.3",void 0,{numeric:!0})<0&&t.suggestion_gutter_hide_empty){let r=[["suggestion_gutter","diff_gutter"],["suggestion_gutter_hide_empty","diff_gutter_hide_empty"],["comment_gutter_default_fold_state","annotation_gutter_default_fold_state"],["comment_gutter_fold_button","annotation_gutter_fold_button"],["comment_gutter_resize_handle","annotation_gutter_resize_handle"],["comment_gutter_width","annotation_gutter_width"],["comment_gutter_hide_empty","annotation_gutter_hide_empty"]];for(let[s,o]of r)s in this.settings&&(this.settings[o]=this.settings[s],delete this.settings[s]);this.settings.comment_style==="block"&&(this.settings.comment_style="icon",this.settings.annotation_gutter=!0)}this.settings.version=Ps.version,await this.setSettings()}}catch{new xn.Notice("Commentator: Migration to new settings failed, using the default settings provided by the plugin",0)}}}async onExternalSettingsChange(){await this.migrateSettings(await this.loadData())}async onunload(){this.previewModeHeaderButton.detachButtons(),this.editModeHeaderModeButton.detachButtons(),xn.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor),this.database.unload()}async loadSettings(){this.settings=Object.assign({},Ps,await this.loadData())}async setSettings(){await this.saveData(this.settings),this.changed_settings=hd(this.settings,this.previous_settings),this.previous_settings=Object.assign({},this.settings)}async saveSettings(){await this.setSettings(),this.previewModeHeaderButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.editModeHeaderModeButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.previewModeHeaderButton.setRendering(this.changed_settings.toolbar_preview_button),this.editModeHeaderModeButton.setRendering(this.changed_settings.toolbar_edit_button),this.previewModeStatusBarButton.setRendering(this.changed_settings.status_bar_preview_button),this.editModeStatusBarButton.setRendering(this.changed_settings.status_bar_edit_button),this.metadataStatusBarButton.setRendering(this.changed_settings.status_bar_metadata_button),this.changed_settings.post_processor!==void 0&&(this.changed_settings.post_processor?this.postProcessor=this.registerMarkdownPostProcessor((t,e)=>Bl(t,e,this),-99999):xn.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor),Fl(this.app)),this.changed_settings.annotation_gutter_width!==void 0&&ho(this.app,_l.of(this.settings.annotation_gutter_width)),this.changed_settings.annotation_gutter_hide_empty!==void 0&&ho(this.app,wl.of(this.settings.annotation_gutter_hide_empty)),this.changed_settings.diff_gutter_hide_empty!==void 0&&ho(this.app,Ml.of(this.settings.diff_gutter_hide_empty)),this.changed_settings.annotation_gutter_fold_button!==void 0&&ho(this.app,yl.of(this.settings.annotation_gutter_fold_button)),this.changed_settings.annotation_gutter_resize_handle!==void 0&&ho(this.app,xl.of(this.settings.annotation_gutter_resize_handle)),this.changed_settings.default_preview_mode!==void 0&&Ou(this.editorExtensions,Ms,qe.of(this.settings.default_preview_mode)),this.changed_settings.default_edit_mode!==void 0&&(Ou(this.editorExtensions,Ts,dr(this.settings.default_edit_mode,this.settings)),Ou(this.editorExtensions,Es,xi.of(this.settings.default_edit_mode))),await this.updateEditorExtension(),Object.keys(this.changed_settings).some(t=>Yf.has(t))&&await this.database.reinitializeDatabase()}async setSetting(t,e){this.settings[t]=e,await this.saveSettings()}async activateView(){this.app.workspace.detachLeavesOfType(uo),await this.app.workspace.getRightLeaf(!1).setViewState({type:uo,active:!0}),await this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(uo)[0])}setEditMode(t,e){t&&t.editor&&(t.editor.cm.dispatch(t.editor.cm.state.update({effects:[Ts.reconfigure(dr(e,this.settings)),Es.reconfigure(xi.of(e))]})),this.editModeStatusBarButton.updateButton(e),this.editModeHeaderModeButton.updateButton(t,e))}setPreviewMode(t,e){t&&t instanceof xn.MarkdownView&&(t.editor&&t.editor.cm.dispatch(t.editor.cm.state.update({effects:[Ms.reconfigure(qe.of(e))]})),t.previewMode&&t.previewMode.rerender(!0),this.previewModeStatusBarButton.updateButton(e),this.previewModeHeaderButton.updateButton(t,e))}}; /*! Bundled license information: localforage/dist/localforage.js: diff --git a/.obsidian/plugins/commentator/manifest.json b/.obsidian/plugins/commentator/manifest.json index f9dded3..4196dc0 100644 --- a/.obsidian/plugins/commentator/manifest.json +++ b/.obsidian/plugins/commentator/manifest.json @@ -1 +1 @@ -{"id":"commentator","name":"Commentator","version":"0.2.4","minAppVersion":"1.5.0","description":"Add review comments to your notes using CriticMarkup syntax","author":"kometenstaub and Fevol","authorUrl":"https://github.com/fevol","isDesktopOnly":false} \ No newline at end of file +{"id":"commentator","name":"Commentator","version":"0.2.5","minAppVersion":"1.7.5","description":"Suggest edits, add comments, and annotate your notes using CriticMarkup syntax.","author":"kometenstaub and Fevol","authorUrl":"https://github.com/fevol","isDesktopOnly":false} diff --git a/.obsidian/plugins/commentator/styles.css b/.obsidian/plugins/commentator/styles.css index 00d4600..e3890af 100644 --- a/.obsidian/plugins/commentator/styles.css +++ b/.obsidian/plugins/commentator/styles.css @@ -1 +1 @@ -@charset "UTF-8";.svelcomlib-spinner{width:var(--size-4-4);height:var(--size-4-4);border:3px solid;border-color:initial;border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:svelcomlib-spinner-animation 1.5s linear infinite}@keyframes svelcomlib-spinner-animation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.svelcomlib-skeleton-placeholder{background-color:var(--color-base-30)}.svelcomlib-skeleton-placeholder:after{content:"";display:block;width:100%;height:100%;animation:svelcomlib-skeleton-animation 1.5s ease-in-out infinite;background:linear-gradient(90deg,rgba(255,255,255,0),var(--color-base-25),rgba(255,255,255,0));background-size:200px 100%;background-repeat:no-repeat;border-radius:4px}.svelcomlib-icon-text{display:flex;align-items:center;gap:4px}.svelcomlib-icon-text>*{display:flex}.svelcomlib-toggle{justify-content:space-between}.svelcomlib-extra>*{color:var(--text-on-accent)}button.svelcomlib-extra{background-color:var(--text-accent);color:var(--text-on-accent)}.svelcomlib-input-extra{color:var(--color-green);border-color:var(--color-green);border-width:3px}.svelcomlib-success>*{color:var(--text-on-accent)}button.svelcomlib-success{background-color:var(--color-green);color:var(--text-on-accent)}.svelcomlib-input-success{color:var(--color-green);border-color:var(--color-green);border-width:3px}.svelcomlib-fail>*{color:var(--text-on-accent)}button.svelcomlib-fail{background-color:var(--background-modifier-error);color:var(--text-on-accent)}.svelcomlib-input-fail{color:var(--text-error);border-color:var(--background-modifier-error);border-width:3px}.svelcomlib-input-icon{display:flex;position:absolute;background-color:var(--background-modifier-error)}.svelcomlib-virtual-list-viewport{position:relative;overflow-y:scroll;-webkit-overflow-scrolling:touch;display:block}.svelcomlib-virtual-list-contents,.svelcomlib-virtual-list-row{display:block}.svelcomlib-virtual-list-row{overflow:hidden}.svelcomlib-notice>code{background-color:var(--code-background);color:var(--code-normal)}.svelcomlib-notice-info{color:var(--text-accent)}.svelcomlib-notice-info:before{content:"\24d8 "}.svelcomlib-notice-warning{color:var(--text-error)}.svelcomlib-notice-warning:before{content:"\26a0 "}.svelcomlib-notice-error{color:var(--text-error);font-weight:700}.svelcomlib-notice-error:before{content:"\26d4 "}.svelcomlib-subsetting{margin-left:var(--size-4-8);border-color:var(--background-modifier-active-hover)}.svelcomlib-subsubsetting{margin-left:var(--size-4-16);border-color:var(--background-modifier-active-hover)}.svelcomlib-setting-subheading.svelcomlib-setting-subheading{font-size:var(--h3-font);margin-top:0;padding:.5em}.svelcomlib-setting-subsubheading.svelcomlib-setting-subsubheading{font-size:var(--h4-font);margin-top:0;padding:.25em;text-transform:uppercase}.cmtr-view-container{padding:0 0 0 var(--size-4-4);height:95%}.cmtr-view-range{border:1px solid var(--background-modifier-border);border-radius:var(--radius-l);background:var(--background-primary);margin:2px 8px 8px 2px;max-height:400px;overflow-y:scroll;word-wrap:break-word}.cmtr-view-range-top{display:flex;align-items:center;gap:var(--size-4-2);padding:var(--size-4-2);position:sticky;z-index:1;top:0;background-color:inherit}.cmtr-view-range-text{padding:0 var(--size-4-1);padding-left:30px}.cmtr-view-range-completed{background:var(--background-primary-alt);color:var(--text-muted);border-style:dashed}.cmtr-view-range-author,.cmtr-view-range-time{font-size:var(--font-smallest);color:var(--text-faint)}.cmtr-view-range:hover{box-shadow:unset;outline:2px dashed var(--interactive-accent-hover)}.cmtr-view-range-selected{box-shadow:0 0 0 2px var(--interactive-accent)}.cmtr-view-range-title{font-variant:all-small-caps;font-weight:var(--bold-weight)}.cmtr-view-range-empty{color:var(--text-faint)}.cmtr-view-range-reply{border-top:1px dashed var(--background-modifier-border)}.cmtr-view-range-reply-top{padding:0 var(--size-4-1) 0 30px}.cmtr-view-range-reply-text{padding:0 var(--size-4-1);padding-left:30px;min-height:2em}.cmtr-view-range-reply-author,.cmtr-view-range-reply-time{font-size:var(--font-smallest);color:var(--text-faint)}.cmtr-view-suggestion-buttons{position:fixed;right:0;transform:translateY(calc(-1 * (var(--scroll-offset) + 12px))) translate(-16px);z-index:2;display:flex;align-items:center;border:1px solid var(--background-modifier-border-hover);background-color:var(--background-secondary);border-radius:var(--radius-s)}.cmtr-view-suggestion-buttons>button{background:unset;box-shadow:unset;border-radius:unset;height:unset;padding:var(--size-4-1)}.cmtr-view-suggestion-buttons>button:hover{background-color:var(--background-secondary-alt)}.cmtr-view-info{color:var(--text-muted);font-size:var(--font-smallest)}.cmtr-view-action-container{display:flex;align-items:center}.cmtr-view-action{height:min-content}.cmtr-view-action-sep{height:24px;border-left:1px solid var(--background-modifier-border-hover)}.cmtr-view-suggestion-button-sep{height:26px;border-left:1px solid var(--background-modifier-border-hover);margin:0 var(--size-4-1)}.cmtr-view-search.search-input-container input{padding-inline-end:8px}.cmtr-settings-navigation-bar{display:flex;flex-direction:row;overflow-x:auto;overflow-y:hidden;flex-wrap:wrap;gap:12px;margin-bottom:var(--size-4-8);background-color:var(--background-primary-alt);padding:var(--size-4-3);border-radius:var(--radius-l)}.cmtr-settings-navigation-item{cursor:pointer;border-radius:100px;font-weight:700;display:flex;flex-direction:row;white-space:nowrap;padding:6px;align-items:center;gap:4px;outline:0 solid transparent;overflow:hidden;background-color:var(--background-primary);border:1px solid var(--background-modifier-border-hover);transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .35s cubic-bezier(.57,.04,.58,1),outline .15s ease-in-out;max-width:32px;height:fit-content}.cmtr-settings-selected-element{color:var(--color-accent);transition:color .5s ease-in-out}.cmtr-settings-navigation-item:hover{background-color:var(--background-primary);outline:3px solid var(--text-accent)}.cmtr-settings-navigation-selected-item{outline:unset!important;background-color:var(--text-accent);color:var(--text-on-accent);padding:6px 9px;max-width:200px;transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .45s cubic-bezier(.57,.04,.58,1) .2s}.cmtr-settings-navigation-selected-item:hover{background-color:var(--text-accent-hover)}.cmtr-settings-navigation-item-text{height:18px}.cmtr-settings-navigation-selected-item-text{color:transparent;overflow:clip;flex:0;transition:flex .4s ease-in}.cmtr-settings-navigation-selected-item .cmtr-settings-navigation-item-text{flex:1}.cmtr-important-buttons{position:absolute;display:flex;right:var(--size-4-6);bottom:var(--size-4-2);gap:var(--size-4-2)}.cmtr-rejected{display:none}.cmtr-addition{color:var(--addition-color)}.cmtr-addition .cmtr-focused{text-decoration:underline 3px solid var(--addition-color)}.cmtr-has-reply .cmtr-addition,.cmtr-has-reply.cmtr-addition{color:var(--text-on-accent)!important;background-color:var(--addition-color);box-shadow:0 0 0 2px var(--addition-color);transition:background-color .2s ease-in-out 0ms,box-shadow .2s ease-in-out 0ms}.cmtr-has-reply .cmtr-addition .cmtr-focused,.cmtr-has-reply.cmtr-addition .cmtr-focused{text-decoration:unset;background-color:var(--addition-color-alt)}.cmtr-has-reply .cmtr-addition:hover,.cmtr-has-reply.cmtr-addition:hover{box-shadow:0 0 0 2px var(--addition-color-alt);background-color:var(--addition-color-alt)}.cmtr-deletion{text-decoration:var(--deletion-color) 2px line-through}.cmtr-deletion:has(.cmtr-focused){text-decoration:var(--deletion-color) 2px line-through dashed}.cmtr-has-reply .cmtr-deletion,.cmtr-has-reply.cmtr-deletion{color:var(--text-on-accent);background-color:var(--deletion-color);box-shadow:0 0 0 2px var(--deletion-color);transition:background-color .2s ease-in-out 0ms;text-decoration:unset}.cmtr-has-reply .cmtr-deletion .cmtr-focused,.cmtr-has-reply.cmtr-deletion .cmtr-focused{background-color:var(--deletion-color-alt)}.cmtr-has-reply .cmtr-deletion:hover,.cmtr-has-reply.cmtr-deletion:hover{box-shadow:0 0 0 2px var(--deletion-color-alt);background-color:var(--deletion-color-alt)}.cmtr-has-reply .cmtr-substitution,.cmtr-has-reply.cmtr-substitution{color:var(--text-on-accent);background-color:var(--substitution-color);box-shadow:0 0 0 2px var(--substitution-color);transition:background-color .2s ease-in-out 0ms}.cmtr-has-reply .cmtr-substitution .cmtr-focused,.cmtr-has-reply.cmtr-substitution .cmtr-focused{background-color:var(--substitution-color-alt)}.cmtr-has-reply .cmtr-substitution:hover,.cmtr-has-reply.cmtr-substitution:hover{box-shadow:0 0 0 2px var(--substitution-color-alt);background-color:var(--substitution-color-alt)}.cmtr-highlight{background-color:var(--highlight-color)}.cmtr-highlight .cmtr-focused{background-color:var(--highlight-color-alt)}.cmtr-comment{background-color:var(--comment-color);border-bottom:2px solid var(--comment-border-color)}.cmtr-comment-icon{padding:0 0 var(--size-4-2) 0}.cmtr-comment-icon:hover{cursor:pointer}.cmtr-comment-icon svg{color:var(--comment-border-color);stroke-width:4px;transition:stroke-width .15s ease-in-out}.cmtr-comment-icon:hover svg{stroke-width:5px}.cmtr-comment-tooltip{max-height:var(--popover-height);max-width:var(--popover-width);overflow-y:scroll;position:absolute;z-index:10000;border:4px solid var(--comment-border-color);filter:drop-shadow(4px 4px 0px var(--comment-inverse-color));background-color:var(--background-primary-alt);padding:var(--size-4-2);border-radius:var(--radius-l)}.cmtr-comment-tooltip *{margin-block-start:.25em;margin-block-end:.25em}.cmtr-suggestion-status{font-size:var(--font-smallest);color:var(--text-faint);margin-right:var(--size-2-1)}.cmtr-submenu-nested{padding-left:var(--size-4-6)}.cmtr-folded-element .cmtr-anno-gutter-annotation{width:0;overflow-y:hidden}span.cm-strikethrough:has([data-type=cmtr-substitution]){text-decoration:unset}span.cm-highlight:has([data-type=cmtr-highlight]){background-color:unset}.cmtr-addition .list-bullet:after{background-color:var(--addition-color)}.cmtr-addition img{border:4px solid var(--addition-color);border-radius:12px}.cmtr-addition hr{border-color:var(--addition-color)}.cmtr-addition .callout{border:4px dashed var(--addition-color)}.cmtr-addition:has(.markdown-embed){border:4px dotted var(--addition-color)}.cmtr-addition:has(.markdown-embed) .markdown-embed{border-left:unset}.cmtr-deletion img{border:4px solid var(--deletion-color)!important;border-radius:12px}.cmtr-daterange-picker-modal{width:auto}.cmtr-daterange-picker{margin-top:var(--size-4-2);display:flex;--sdt-bg-main: var(--background-primary);--sdt-shadow-color: var(--background-modifier-box-shadow);--sdt-color: var(--text-normal);--sdt-clock-color: var(--sdt-color);--sdt-clock-color-hover: var(--sdt-color);--sdt-clock-time-bg: transparent;--sdt-clock-time-bg-hover: var(--background-modifier-hover);--sdt-clock-disabled: var(--background-modifier-disabled);--sdt-clock-disabled-bg: var(--sdt-bg-main);--sdt-header-color: var(--text-muted);--sdt-bg-selected: var(--color-accent);--sdt-clock-selected-bg: var(--sdt-bg-selected);--sdt-table-disabled-date: var(--background-modifier-disabled);--sdt-table-disabled-date-bg: var(--sdt-bg-main);--sdt-table-data-bg-hover: var(--background-modifier-hover);--sdt-table-selected-bg: var(--sdt-bg-selected);--sdt-header-btn-bg-hover: var(--background-modifier-hover);--sdt-color-selected: var(--text-on-accent);--sdt-table-today-indicator: var(--text-faint);--sdt-clock-bg: var(--background-primary-alt);--sdt-today-bg: var(--color-accent);--sdt-today-color: var(--text-on-accent);--sdt-clear-color: var(--background-modifier-error);--sdt-clear-bg: var(--sdt-bg-main);--sdt-clear-hover-color: var(--text-on-accent);--sdt-clear-hover-bg: var(--background-modifier-error)}.cmtr-daterange-picker.cmtr-daterange-picker.cmtr-daterange-picker .sdt-widget+.sdt-widget:before{background-color:var(--background-modifier-border)}.cmtr-daterange-picker button,.cmtr-daterange-picker div.sdt-calendar-wrap.sdt-calendar-wrap.sdt-calendar-wrap{box-shadow:unset}.cmtr-daterange-picker table tr:last-child td{padding-bottom:var(--size-4-1)!important}.cm-gutters.cm-gutters.cm-gutters.cm-gutters:has(.is-minimal.cmtr-anno-gutter){position:sticky!important}.cm-gutters.cm-gutters:has(>.cmtr-anno-gutter){padding-inline-end:0;margin-inline-end:0;margin-inline-start:24px}.cmtr-anno-gutter{width:100%;transition:width .4s ease-in-out}.cmtr-anno-gutter-moving .cmtr-anno-gutter{transition:width 50ms ease-out}.cmtr-anno-gutter-moving.cmtr-anno-gutter-button{transition:right 50ms ease-out}.cmtr-anno-gutter-thread{width:100%;border:2px solid var(--background-modifier-border);border-radius:var(--radius-l);background-color:var(--background-primary-alt);color:var(--text-muted);transition:border-color .1s ease-in-out 0ms,background-color .1s ease-in-out 0ms}.cmtr-anno-gutter-thread-highlight{border-color:var(--interactive-accent)}.cmtr-anno-gutter-annotation{width:100%;max-height:150px;background-color:inherit;padding:var(--size-2-2);position:relative;overflow-y:scroll;word-wrap:break-word}.cmtr-anno-gutter-annotation:first-child{border-top-left-radius:var(--radius-l);border-top-right-radius:var(--radius-l)}.cmtr-anno-gutter-annotation:last-child{border-bottom-left-radius:var(--radius-l);border-bottom-right-radius:var(--radius-l)}.cmtr-anno-gutter-annotation:not(:last-child){border-bottom:1px dashed var(--background-modifier-border)}.cmtr-anno-gutter .cm-gutterElement{transition:margin .2s ease-in-out}.cmtr-anno-gutter-annotation-desc{font-weight:var(--font-bold)}.cmtr-anno-gutter-annotation-view>*{margin-block-start:.25em;margin-block-end:.25em}.cmtr-anno-gutter-annotation:hover{box-shadow:0 0 0 2px var(--interactive-accent);background-color:var(--background-secondary);z-index:20}.cmtr-anno-gutter-annotation:focus,.cmtr-anno-gutter-annotation-editing.cmtr-anno-gutter-annotation-editing{box-shadow:0 0 0 2px var(--comment-border-color);background-color:var(--background-secondary);z-index:25}.cmtr-anno-gutter-annotation-metadata{font-size:var(--font-smallest);color:var(--text-faint);position:sticky;top:-4px;background-color:inherit;z-index:10;padding:2px 0}.cmtr-anno-gutter-annotation-editor.cm-editor{min-height:auto}.cmtr-anno-gutter-resize-handle{position:absolute;background:transparent;transition:background-color .2s ease-in-out,border-color .2s ease-in-out,opacity .2s ease-in-out;border:unset;margin:0;height:100%;transform:translate(-10px,-40px);border-inline-end-color:var(--divider-color);border-inline-end-width:var(--divider-width);border-inline-end-style:dashed;width:var(--divider-width-hover);cursor:col-resize}.cmtr-anno-gutter-resize-handle:hover,.cmtr-anno-gutter-resize-handle-hover{background:var(--divider-color-hover);border-color:var(--divider-color-hover)}.cmtr-anno-gutter-button{position:absolute;top:calc(var(--file-margins) + 20px);z-index:1000;color:var(--text-faint);transition:color .2s ease-in-out 0ms,right .4s ease-in-out,rotate .2s ease-in-out}.cmtr-anno-gutter-button:hover{color:var(--text-normal)}.cm-gutters.cm-gutters:has(+.cm-gutters){margin-right:var(--size-4-2)}.cm-gutters:has(>.cmtr-gutter-show-empty){min-width:18px}.cmtr-diff-gutter-addition{background-color:var(--addition-color);width:6px;height:100%}.cmtr-diff-gutter-deletion{background-color:var(--deletion-color);width:6px;height:100%}.cmtr-diff-gutter-addition.cmtr-diff-gutter-deletion{background:repeating-linear-gradient(45deg,var(--addition-color),var(--addition-color) 10px,var(--deletion-color) 10px,var(--deletion-color) 18px)}.cmtr-diff-gutter-substitution{background:repeating-linear-gradient(45deg,var(--addition-color),var(--addition-color) 10px,var(--deletion-color) 10px,var(--deletion-color) 18px);width:6px;height:100%}.cmtr-diff-gutter-top{border-top:1px solid var(--background-primary);border-top-left-radius:8px;border-top-right-radius:8px}.cmtr-diff-gutter-bottom{border-bottom:1px solid var(--background-primary);border-bottom-left-radius:8px;border-bottom-right-radius:8px}.cm-gutters.cm-gutters.cm-gutters.cm-gutters:has(.is-minimal.cmtr-diff-gutter){position:sticky!important;left:20px}.theme-light{--addition-color: var(--color-green);--addition-color-alt: color-mix( in srgb-linear, var(--addition-color), black 15% );--deletion-color: var(--color-red);--deletion-color-alt: color-mix( in srgb-linear, var(--deletion-color), black 15% );--substitution-color: var(--color-orange);--substitution-color-alt: color-mix( in srgb-linear, var(--substitution-color), black 15% );--highlight-color: var(--text-highlight-bg);--highlight-color-alt: color-mix( in srgb-linear, var(--text-highlight-bg), black 15% );--comment-color: #bacff4;--comment-border-color: #679af4;--comment-inverse-color: #445f8f}.theme-dark{--addition-color: var(--color-green);--addition-color-alt: color-mix( in srgb-linear, var(--addition-color), white 10% );--deletion-color: var(--color-red);--deletion-color-alt: color-mix( in srgb-linear, var(--deletion-color), white 10% );--substitution-color: var(--color-orange);--substitution-color-alt: color-mix( in srgb-linear, var(--substitution-color), white 10% );--highlight-color: var(--text-highlight-bg);--highlight-color-alt: color-mix( in srgb-linear, var(--text-highlight-bg), white 10% );--comment-color: #445f8f;--comment-border-color: #679af4;--comment-inverse-color: #bacff4}.cmtr-fail>button{background-color:var(--color-red);color:var(--text-on-accent)}.cm-gutters.gutter-hidden{display:none}.cmtr-debug-comment-line{width:100%;border-bottom:1px dashed red} +@charset "UTF-8";.svelcomlib-spinner{width:var(--size-4-4);height:var(--size-4-4);border:3px solid;border-color:initial;border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:svelcomlib-spinner-animation 1.5s linear infinite}@keyframes svelcomlib-spinner-animation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.svelcomlib-skeleton-placeholder{background-color:var(--color-base-30)}.svelcomlib-skeleton-placeholder:after{content:"";display:block;width:100%;height:100%;animation:svelcomlib-skeleton-animation 1.5s ease-in-out infinite;background:linear-gradient(90deg,rgba(255,255,255,0),var(--color-base-25),rgba(255,255,255,0));background-size:200px 100%;background-repeat:no-repeat;border-radius:4px}.svelcomlib-icon-text{display:flex;align-items:center;gap:4px}.svelcomlib-icon-text>*{display:flex}.svelcomlib-toggle{justify-content:space-between}.svelcomlib-extra>*{color:var(--text-on-accent)}button.svelcomlib-extra{background-color:var(--text-accent);color:var(--text-on-accent)}.svelcomlib-input-extra{color:var(--color-green);border-color:var(--color-green);border-width:3px}.svelcomlib-success>*{color:var(--text-on-accent)}button.svelcomlib-success{background-color:var(--color-green);color:var(--text-on-accent)}.svelcomlib-input-success{color:var(--color-green);border-color:var(--color-green);border-width:3px}.svelcomlib-fail>*{color:var(--text-on-accent)}button.svelcomlib-fail{background-color:var(--background-modifier-error);color:var(--text-on-accent)}.svelcomlib-input-fail{color:var(--text-error);border-color:var(--background-modifier-error);border-width:3px}.svelcomlib-input-icon{display:flex;position:absolute;background-color:var(--background-modifier-error)}.svelcomlib-virtual-list-viewport{position:relative;overflow-y:scroll;-webkit-overflow-scrolling:touch;display:block}.svelcomlib-virtual-list-contents,.svelcomlib-virtual-list-row{display:block}.svelcomlib-virtual-list-row{overflow:hidden}.svelcomlib-notice>code{background-color:var(--code-background);color:var(--code-normal)}.svelcomlib-notice-info{color:var(--text-accent)}.svelcomlib-notice-info:before{content:"\24d8 "}.svelcomlib-notice-warning{color:var(--text-error)}.svelcomlib-notice-warning:before{content:"\26a0 "}.svelcomlib-notice-error{color:var(--text-error);font-weight:700}.svelcomlib-notice-error:before{content:"\26d4 "}.svelcomlib-subsetting{margin-left:var(--size-4-8);border-color:var(--background-modifier-active-hover)}.svelcomlib-subsubsetting{margin-left:var(--size-4-16);border-color:var(--background-modifier-active-hover)}.svelcomlib-setting-subheading.svelcomlib-setting-subheading{font-size:var(--h3-font);margin-top:0;padding:.5em}.svelcomlib-setting-subsubheading.svelcomlib-setting-subsubheading{font-size:var(--h4-font);margin-top:0;padding:.25em;text-transform:uppercase}.cmtr-view-container{padding:0 0 0 var(--size-4-4);height:95%}.cmtr-view-range{border:1px solid var(--background-modifier-border);border-radius:var(--radius-l);background:var(--background-primary);margin:2px 8px 8px 2px;max-height:400px;overflow-y:scroll;word-wrap:break-word}.cmtr-view-range-top{display:flex;align-items:center;gap:var(--size-4-2);padding:var(--size-4-2);position:sticky;z-index:1;top:0;background-color:inherit}.cmtr-view-range-text{padding:0 var(--size-4-1);padding-left:30px}.cmtr-view-range-completed{background:var(--background-primary-alt);color:var(--text-muted);border-style:dashed}.cmtr-view-range:hover{box-shadow:unset;outline:2px dashed var(--interactive-accent-hover)}.cmtr-view-range-selected{box-shadow:0 0 0 2px var(--interactive-accent)}.cmtr-view-range-title{font-variant:all-small-caps;font-weight:var(--bold-weight)}.cmtr-view-range-empty{color:var(--text-faint)}.cmtr-view-range-reply{border-top:1px dashed var(--background-modifier-border)}.cmtr-view-range-reply-top{padding:0 var(--size-4-1) 0 30px}.cmtr-view-range-reply-text{padding:0 var(--size-4-1);padding-left:30px;min-height:2em}.cmtr-view-suggestion-buttons{position:fixed;right:0;transform:translateY(calc(-1 * (var(--scroll-offset) + 12px))) translate(-16px);z-index:2;display:flex;align-items:center;border:1px solid var(--background-modifier-border-hover);background-color:var(--background-secondary);border-radius:var(--radius-s)}.cmtr-view-suggestion-buttons>button{background:unset;box-shadow:unset;border-radius:unset;height:unset;padding:var(--size-4-1)}.cmtr-view-suggestion-buttons>button:hover{background-color:var(--background-secondary-alt)}.cmtr-view-info{color:var(--text-muted);font-size:var(--font-smallest)}.cmtr-view-action-container{display:flex;align-items:center}.cmtr-view-action{height:min-content}.cmtr-view-action-sep{height:24px;border-left:1px solid var(--background-modifier-border-hover)}.cmtr-view-suggestion-button-sep{height:26px;border-left:1px solid var(--background-modifier-border-hover);margin:0 var(--size-4-1)}.cmtr-view-search.search-input-container input{padding-inline-end:8px}.cmtr-settings-navigation-bar{display:flex;flex-direction:row;overflow-x:auto;overflow-y:hidden;flex-wrap:wrap;gap:12px;margin-bottom:var(--size-4-8);background-color:var(--background-primary-alt);padding:var(--size-4-3);border-radius:var(--radius-l)}.cmtr-settings-navigation-item{cursor:pointer;border-radius:100px;font-weight:700;display:flex;flex-direction:row;white-space:nowrap;padding:6px;align-items:center;gap:4px;outline:0 solid transparent;overflow:hidden;background-color:var(--background-primary);border:1px solid var(--background-modifier-border-hover);transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .35s cubic-bezier(.57,.04,.58,1),outline .15s ease-in-out;max-width:32px;height:fit-content}.cmtr-settings-selected-element{color:var(--color-accent);transition:color .5s ease-in-out}.cmtr-settings-navigation-item:hover{background-color:var(--background-primary);outline:3px solid var(--text-accent)}.cmtr-settings-navigation-selected-item{outline:unset!important;background-color:var(--text-accent);color:var(--text-on-accent);padding:6px 9px;max-width:200px;transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .45s cubic-bezier(.57,.04,.58,1) .2s}.cmtr-settings-navigation-selected-item:hover{background-color:var(--text-accent-hover)}.cmtr-settings-navigation-item-text{height:18px}.cmtr-settings-navigation-selected-item-text{color:transparent;overflow:clip;flex:0;transition:flex .4s ease-in}.cmtr-settings-navigation-selected-item .cmtr-settings-navigation-item-text{flex:1}.cmtr-important-buttons{position:absolute;display:flex;right:var(--size-4-6);bottom:var(--size-4-2);gap:var(--size-4-2)}:root{--cmtr-comment-tooltip-width: 250px}.cmtr-rejected{display:none}.cmtr-addition{color:var(--addition-color)}.cmtr-addition .cmtr-focused{text-decoration:underline 3px solid var(--addition-color)}.cmtr-has-reply .cmtr-addition,.cmtr-has-reply.cmtr-addition{color:var(--text-on-accent)!important;background-color:var(--addition-color);box-shadow:0 0 0 2px var(--addition-color);transition:background-color .2s ease-in-out 0ms,box-shadow .2s ease-in-out 0ms}.cmtr-has-reply .cmtr-addition .cmtr-focused,.cmtr-has-reply.cmtr-addition .cmtr-focused{text-decoration:unset;background-color:var(--addition-color-alt)}.cmtr-has-reply .cmtr-addition:hover,.cmtr-has-reply.cmtr-addition:hover{box-shadow:0 0 0 2px var(--addition-color-alt);background-color:var(--addition-color-alt)}.cmtr-deletion{text-decoration:var(--deletion-color) 2px line-through}.cmtr-deletion:has(.cmtr-focused){text-decoration:var(--deletion-color) 2px line-through dashed}.cmtr-has-reply .cmtr-deletion,.cmtr-has-reply.cmtr-deletion{color:var(--text-on-accent);background-color:var(--deletion-color);box-shadow:0 0 0 2px var(--deletion-color);transition:background-color .2s ease-in-out 0ms;text-decoration:unset}.cmtr-has-reply .cmtr-deletion .cmtr-focused,.cmtr-has-reply.cmtr-deletion .cmtr-focused{background-color:var(--deletion-color-alt)}.cmtr-has-reply .cmtr-deletion:hover,.cmtr-has-reply.cmtr-deletion:hover{box-shadow:0 0 0 2px var(--deletion-color-alt);background-color:var(--deletion-color-alt)}.cmtr-has-reply .cmtr-substitution,.cmtr-has-reply.cmtr-substitution{color:var(--text-on-accent);background-color:var(--substitution-color);box-shadow:0 0 0 2px var(--substitution-color);transition:background-color .2s ease-in-out 0ms}.cmtr-has-reply .cmtr-substitution .cmtr-focused,.cmtr-has-reply.cmtr-substitution .cmtr-focused{background-color:var(--substitution-color-alt)}.cmtr-has-reply .cmtr-substitution:hover,.cmtr-has-reply.cmtr-substitution:hover{box-shadow:0 0 0 2px var(--substitution-color-alt);background-color:var(--substitution-color-alt)}.cmtr-highlight{background-color:var(--highlight-color)}.cmtr-highlight .cmtr-focused{background-color:var(--highlight-color-alt)}.cmtr-comment{background-color:var(--comment-color);border-bottom:2px solid var(--comment-border-color)}.cmtr-comment-icon:hover{cursor:pointer}.cmtr-comment-icon>svg{color:var(--comment-border-color);stroke-width:4px;transition:stroke-width .15s ease-in-out}.cmtr-comment-icon:hover>svg{stroke-width:5px}.cmtr-comment-icon-focused>svg{fill:color-mix(in srgb-linear,var(--comment-border-color),white 30%)}.popover.hover-popover.cmtr-comment-tooltip{cursor:initial;display:flex;flex-direction:column;width:calc(var(--cmtr-comment-tooltip-width));font-size:var(--font-smallest);line-height:var(--line-height-normal)}.cmtr-comment-tooltip .markdown-source-view.mod-cm6{font-size:1em}.cmtr-comment-tooltip-preview>*,.cmtr-comment-tooltip-editor>*{margin-block-start:.25em;margin-block-end:.25em}.cmtr-comment-tooltip-range{padding:.5em}.cmtr-comment-tooltip-reply{border-top:1px dashed var(--background-modifier-border)}.popover.hover-popover.cmtr-comment-tooltip>*{width:unset}.cmtr-suggestion-status{font-size:var(--font-smallest);color:var(--text-faint);margin-right:var(--size-2-1)}.cmtr-submenu-nested{padding-left:var(--size-4-6)}.cmtr-folded-element .cmtr-anno-gutter-annotation{width:0;overflow-y:hidden}span.cm-strikethrough:has([data-type=cmtr-substitution]){text-decoration:unset}span.cm-highlight:has([data-type=cmtr-highlight]){background-color:unset}.cmtr-addition .list-bullet:after{background-color:var(--addition-color)}.cmtr-addition img{border:4px solid var(--addition-color);border-radius:12px}.cmtr-addition hr{border-color:var(--addition-color)}.cmtr-addition .callout{border:4px dashed var(--addition-color)}.cmtr-addition:has(.markdown-embed){border:4px dotted var(--addition-color)}.cmtr-addition:has(.markdown-embed) .markdown-embed{border-left:unset}.cmtr-deletion img{border:4px solid var(--deletion-color)!important;border-radius:12px}.cmtr-daterange-picker-modal{width:auto}.cmtr-daterange-picker{margin-top:var(--size-4-2);display:flex;--sdt-bg-main: var(--background-primary);--sdt-shadow-color: var(--background-modifier-box-shadow);--sdt-color: var(--text-normal);--sdt-clock-color: var(--sdt-color);--sdt-clock-color-hover: var(--sdt-color);--sdt-clock-time-bg: transparent;--sdt-clock-time-bg-hover: var(--background-modifier-hover);--sdt-clock-disabled: var(--background-modifier-disabled);--sdt-clock-disabled-bg: var(--sdt-bg-main);--sdt-header-color: var(--text-muted);--sdt-bg-selected: var(--color-accent);--sdt-clock-selected-bg: var(--sdt-bg-selected);--sdt-table-disabled-date: var(--background-modifier-disabled);--sdt-table-disabled-date-bg: var(--sdt-bg-main);--sdt-table-data-bg-hover: var(--background-modifier-hover);--sdt-table-selected-bg: var(--sdt-bg-selected);--sdt-header-btn-bg-hover: var(--background-modifier-hover);--sdt-color-selected: var(--text-on-accent);--sdt-table-today-indicator: var(--text-faint);--sdt-clock-bg: var(--background-primary-alt);--sdt-today-bg: var(--color-accent);--sdt-today-color: var(--text-on-accent);--sdt-clear-color: var(--background-modifier-error);--sdt-clear-bg: var(--sdt-bg-main);--sdt-clear-hover-color: var(--text-on-accent);--sdt-clear-hover-bg: var(--background-modifier-error)}.cmtr-daterange-picker.cmtr-daterange-picker.cmtr-daterange-picker .sdt-widget+.sdt-widget:before{background-color:var(--background-modifier-border)}.cmtr-daterange-picker button,.cmtr-daterange-picker div.sdt-calendar-wrap.sdt-calendar-wrap.sdt-calendar-wrap{box-shadow:unset}.cmtr-daterange-picker table tr:last-child td{padding-bottom:var(--size-4-1)!important}.markdown-source-view.mod-cm6.is-readable-line-width .cm-sizer{max-width:calc(var(--file-line-width) + var(--cmtr-anno-gutter-width, 0))}.cm-gutters.cm-gutters.cm-gutters.cm-gutters:has(.is-minimal.cmtr-anno-gutter){position:sticky!important}.cm-gutters.cm-gutters:has(>.cmtr-anno-gutter){padding-inline-end:0;margin-inline-end:0}.cmtr-anno-gutter{width:100%;transition:width .4s ease-in-out}.cmtr-anno-gutter-resizing .cmtr-anno-gutter{transition:width 50ms ease-out}.cmtr-anno-gutter-resizing .cmtr-anno-gutter-button{transition:right 50ms ease-out}.cmtr-anno-gutter-thread{width:100%;border:2px solid var(--background-modifier-border);border-radius:var(--radius-l);background-color:var(--background-primary-alt);color:var(--text-muted);transition:border-color .1s ease-in-out 0ms,background-color .1s ease-in-out 0ms}.cmtr-anno-gutter-thread-highlight{border-color:var(--interactive-accent)}.cmtr-anno-gutter-annotation{width:100%;max-height:150px;background-color:inherit;padding:var(--size-2-2);position:relative;overflow-y:scroll;word-wrap:break-word}.cmtr-anno-gutter-annotation:first-child{border-top-left-radius:var(--radius-l);border-top-right-radius:var(--radius-l)}.cmtr-anno-gutter-annotation:last-child{border-bottom-left-radius:var(--radius-l);border-bottom-right-radius:var(--radius-l)}.cmtr-anno-gutter-annotation:not(:last-child){border-bottom:1px dashed var(--background-modifier-border)}.cmtr-anno-gutter .cm-gutterElement{transition:margin .2s ease-in-out}.cmtr-anno-gutter-annotation-desc{font-weight:var(--font-bold)}.cmtr-anno-gutter-annotation-view>*{margin-block-start:.25em;margin-block-end:.25em}.cmtr-anno-gutter-annotation:hover{box-shadow:0 0 0 2px var(--interactive-accent);background-color:var(--background-secondary);z-index:20}.cmtr-anno-gutter-annotation:focus,.cmtr-anno-gutter-annotation-editing.cmtr-anno-gutter-annotation-editing{box-shadow:0 0 0 2px var(--comment-border-color);background-color:var(--background-secondary);z-index:25}.cmtr-anno-gutter-annotation-metadata{font-size:var(--font-smallest);color:var(--text-faint);position:sticky;top:-4px;background-color:inherit;z-index:10;padding:2px 0}.cmtr-anno-gutter-annotation-editor.cm-editor{min-height:auto}.cmtr-anno-gutter-resize-handle{position:absolute;background:transparent;transition:background-color .2s ease-in-out,border-color .2s ease-in-out,opacity .2s ease-in-out;border:unset;margin:0;height:100%;transform:translate(-10px,-40px);border-inline-end-color:var(--divider-color);border-inline-end-width:var(--divider-width);border-inline-end-style:dashed;width:var(--divider-width-hover);cursor:col-resize}.cmtr-anno-gutter-resize-handle:hover,.cmtr-anno-gutter-resize-handle-hover{background:var(--divider-color-hover);border-color:var(--divider-color-hover)}.cmtr-anno-gutter-button{position:fixed;top:calc(var(--file-margins) + 60px);transform:translate(-36px);z-index:1000}.markdown-embed .cmtr-anno-gutter-button{position:absolute;top:0}.cmtr-anno-gutter-button a{position:absolute;color:var(--text-faint);transition:color .2s ease-in-out 0ms,right .4s ease-in-out,rotate .2s ease-in-out}.cmtr-anno-gutter-button a:hover{color:var(--text-normal)}.cm-gutters.cm-gutters:has(+.cm-gutters){margin-right:var(--size-4-2)}.cm-gutters:has(>.cmtr-gutter-show-empty){min-width:18px}.cmtr-diff-gutter-addition{background-color:var(--addition-color);width:6px;height:100%}.cmtr-diff-gutter-deletion{background-color:var(--deletion-color);width:6px;height:100%}.cmtr-diff-gutter-addition.cmtr-diff-gutter-deletion{background:repeating-linear-gradient(45deg,var(--addition-color),var(--addition-color) 10px,var(--deletion-color) 10px,var(--deletion-color) 18px)}.cmtr-diff-gutter-substitution{background:repeating-linear-gradient(45deg,var(--addition-color),var(--addition-color) 10px,var(--deletion-color) 10px,var(--deletion-color) 18px);width:6px;height:100%}.cmtr-diff-gutter-top{border-top:1px solid var(--background-primary);border-top-left-radius:8px;border-top-right-radius:8px}.cmtr-diff-gutter-bottom{border-bottom:1px solid var(--background-primary);border-bottom-left-radius:8px;border-bottom-right-radius:8px}.cm-gutters.cm-gutters.cm-gutters.cm-gutters:has(.is-minimal.cmtr-diff-gutter){position:sticky!important;left:20px}.theme-light{--addition-color: var(--color-green);--addition-color-alt: color-mix( in srgb-linear, var(--addition-color), black 15% );--deletion-color: var(--color-red);--deletion-color-alt: color-mix( in srgb-linear, var(--deletion-color), black 15% );--substitution-color: var(--color-orange);--substitution-color-alt: color-mix( in srgb-linear, var(--substitution-color), black 15% );--highlight-color: var(--text-highlight-bg);--highlight-color-alt: color-mix( in srgb-linear, var(--text-highlight-bg), black 15% );--comment-color: #bacff4;--comment-border-color: #679af4;--comment-inverse-color: #445f8f}.theme-dark{--addition-color: var(--color-green);--addition-color-alt: color-mix( in srgb-linear, var(--addition-color), white 10% );--deletion-color: var(--color-red);--deletion-color-alt: color-mix( in srgb-linear, var(--deletion-color), white 10% );--substitution-color: var(--color-orange);--substitution-color-alt: color-mix( in srgb-linear, var(--substitution-color), white 10% );--highlight-color: var(--text-highlight-bg);--highlight-color-alt: color-mix( in srgb-linear, var(--text-highlight-bg), white 10% );--comment-color: #445f8f;--comment-border-color: #679af4;--comment-inverse-color: #bacff4}.cmtr-fail>button{background-color:var(--color-red);color:var(--text-on-accent)}.cm-gutters.gutter-hidden{display:none}.cmtr-debug-comment-line{width:100%;border-bottom:1px dashed red}.cmtr-metadata-info{font-size:var(--font-smallest);color:var(--text-faint);display:flex;gap:.6em;flex-wrap:wrap;flex-direction:row;align-items:center}.cmtr-metadata-info-field{display:flex;flex-wrap:nowrap;align-items:baseline}.cmtr-metadata-info-separator{line-height:.1}.cmtr-metadata-info-icon{display:flex;margin-right:.25em;--icon-size: var(--font-smallest)} diff --git a/10 Notes/Async Iterators.md b/10 Notes/Async Iterators.md index d00879f..fd2e6ff 100644 --- a/10 Notes/Async Iterators.md +++ b/10 Notes/Async Iterators.md @@ -13,3 +13,5 @@ From those discussions: - https://github.com/SirNickolas/asyncIters-Nim - [asyncIters-Nim](https://github.com/SirNickolas/asyncIters-Nim) - [Why isn’t `chronosInternalRetFuture` gensymmed?](https://github.com/status-im/nim-chronos/issues/368) + +The temporary working name for the new async iterator nim package will be `nim-async-iterators`. diff --git a/10 Notes/New Codex Requirements - various documents.md b/10 Notes/New Codex Requirements - various documents.md new file mode 100644 index 0000000..7ecd08e --- /dev/null +++ b/10 Notes/New Codex Requirements - various documents.md @@ -0,0 +1,49 @@ +- requirements sources: + - Codex Roadmap (from Corey): + - pages/Codex Notes.md (https://github.com/logos-co/petty-notes/blob/master/pages/Codex%20Notes.md#a-proposed-piecemeal-codex-deployment) + - HackMD version with some comments:: https://hackmd.io/uLOqdVq3Q1ypeBRkKDd9-A + - What Codex is and what Codex isn't from Dmitriy: https://hackmd.io/N1QGeyjfSWSK7dpFyD1VCA + - Initial draft for off chain proof verification: https://hackmd.io/@dryajov/rJtll1-Eee + - Meeting with Jacek (transcript): https://app.fireflies.ai/live/01K070SBAZK764PGQEJ0BS4W62?ref=live_chat + - Important doc about proofing system + - From Leo: https://hackmd.io/tRQJrafhTquuJnBK6iqULQ?view - empty and seems not to be used by anyone currently. + - [What Codex is and what Codex isn't](https://hackmd.io/N1QGeyjfSWSK7dpFyD1VCA) from Dmitriy + - Initial draft for off chain proof verification: https://hackmd.io/@dryajov/rJtll1-Eee + - Meeting with Jacek (transcript): https://app.fireflies.ai/live/01K070SBAZK764PGQEJ0BS4W62?ref=live_chat + - Important doc about proofing system + - Chrys: + - Some initial observations: + - some technical notes for the altruistic mode, sharing them with Giuliano, so we can see the key differences for starters and discuss possible solutions: + - Slot Management: + Current: Smart contract coordinates slot assignment via economic auction + Altruistic: Slot assignments are coordinated via DHT and gossip-based distributed consensus algorithm. + - Availability Verification: + Current: ZK proofs posted to blockchain with gas costs + Altruistic: Peers exchange lightweight heartbeat messages via gossip to signal availability. + - Repair Triggering: + Current: Smart contract detects failed proofs and triggers marketplace + Altruistic: Peers track slot availability through gossip. When data loss is detected, a repair request is broadcast to the network. + - Repair Execution: + Current: Economic incentives (collateral/payment) drive replacement storage provider + Altruistic: Community volunteers reconstruct missing data via erasure coding using the same distributed algorithm, coordinated peer-to-peer. + - So all coordination moves from on-chain marketplace mechanisms to P2P protocols, while preserving the same underlying durability guarantees through erasure coding. + - some other questions are raising: + 1. Do nodes gossip every proof or sample/rotate them? + 2. How do you handle nodes with different views of "dataset health"? + 3. What's the verification computational overhead vs. current ZK approach? + 4. How do you coordinate repair when nodes disagree on availability? + +OFAC regulations prohibit U.S. persons and entities, including those in the Web3 space, from engaging in transactions with individuals, entities, or jurisdictions on the Specially Designated Nationals (SDN) List. + +From Balazs: + +> so there is one situation when i can see the "0 durability" to still be useful: small communities which are self-incentivized to store their very own data + +Reading recommendations from Jacek: + +- GNUNet +- Swarm Book + +[An Altruistic Mode for Codex](https://hackmd.io/vuWTutZiSUalVZp5YRcImQ) - new working document from Giuliano about Altruistic mode. + +[Waku-Codex Use Cases - Refinement](https://hackmd.io/wI78LHO-SN6qTm6u7zLajQ) \ No newline at end of file diff --git "a/10 Notes/Obsidian \"Workshop\".md" "b/10 Notes/Obsidian \"Workshop\".md" index 00c6214..a983d6d 100644 --- "a/10 Notes/Obsidian \"Workshop\".md" +++ "b/10 Notes/Obsidian \"Workshop\".md" @@ -5,4 +5,7 @@ * backlinking; * pure-github flows. -* Search \ No newline at end of file +* Search + + +[Image](Pasted%20image%2020250724142014.png) diff --git a/90 Extras/92 Assets/Pasted image 20250724142014.png b/90 Extras/92 Assets/Pasted image 20250724142014.png new file mode 100644 index 0000000000000000000000000000000000000000..8eacd7648350aab17a43d5820428a24a0fbd6f91 GIT binary patch literal 52789 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 literal 0 HcmV?d00001