@r5n/hydra 0.3.10 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +206 -58
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,46 +1,88 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
var Vt=Object.create;var{getPrototypeOf:Ft,defineProperty:Yn,getOwnPropertyNames:Dt}=Object;var nr=Object.prototype.hasOwnProperty;var un=(t,r,o)=>{o=t!=null?Vt(Ft(t)):{};let e=r||!t||!t.__esModule?Yn(o,"default",{value:t,enumerable:!0}):o;for(let i of Dt(t))if(!nr.call(e,i))Yn(e,i,{get:()=>t[i],enumerable:!0});return e};var Qn=(t,r)=>()=>(r||t((r={exports:{}}).exports,r),r.exports);var Nn=Qn((Xo,Zn)=>{var kn={to(t,r){if(!r)return`\x1B[${t+1}G`;return`\x1B[${r+1};${t+1}H`},move(t,r){let o="";if(t<0)o+=`\x1B[${-t}D`;else if(t>0)o+=`\x1B[${t}C`;if(r<0)o+=`\x1B[${-r}A`;else if(r>0)o+=`\x1B[${r}B`;return o},up:(t=1)=>`\x1B[${t}A`,down:(t=1)=>`\x1B[${t}B`,forward:(t=1)=>`\x1B[${t}C`,backward:(t=1)=>`\x1B[${t}D`,nextLine:(t=1)=>"\x1B[E".repeat(t),prevLine:(t=1)=>"\x1B[F".repeat(t),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},tr={up:(t=1)=>"\x1B[S".repeat(t),down:(t=1)=>"\x1B[T".repeat(t)},rr={screen:"\x1B[2J",up:(t=1)=>"\x1B[1J".repeat(t),down:(t=1)=>"\x1B[J".repeat(t),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(t){let r="";for(let o=0;o<t;o++)r+=this.line+(o<t-1?kn.up():"");if(t)r+=kn.left;return r}};Zn.exports={cursor:kn,scroll:tr,erase:rr,beep:"\x07"}});var Pn=Qn((_o,vn)=>{var hn=process||{},Vn=hn.argv||[],dn=hn.env||{},or=!(!!dn.NO_COLOR||Vn.includes("--no-color"))&&(!!dn.FORCE_COLOR||Vn.includes("--color")||hn.platform==="win32"||(hn.stdout||{}).isTTY&&dn.TERM!=="dumb"||!!dn.CI),er=(t,r,o=t)=>(e)=>{let i=""+e,s=i.indexOf(r,t.length);return~s?t+ir(i,r,o,s)+r:t+i+r},ir=(t,r,o,e)=>{let i="",s=0;do i+=t.substring(s,e)+o,s=e+r.length,e=t.indexOf(r,s);while(~e);return i+t.substring(s)},Fn=(t=or)=>{let r=t?er:()=>String;return{isColorSupported:t,reset:r("\x1B[0m","\x1B[0m"),bold:r("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:r("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:r("\x1B[3m","\x1B[23m"),underline:r("\x1B[4m","\x1B[24m"),inverse:r("\x1B[7m","\x1B[27m"),hidden:r("\x1B[8m","\x1B[28m"),strikethrough:r("\x1B[9m","\x1B[29m"),black:r("\x1B[30m","\x1B[39m"),red:r("\x1B[31m","\x1B[39m"),green:r("\x1B[32m","\x1B[39m"),yellow:r("\x1B[33m","\x1B[39m"),blue:r("\x1B[34m","\x1B[39m"),magenta:r("\x1B[35m","\x1B[39m"),cyan:r("\x1B[36m","\x1B[39m"),white:r("\x1B[37m","\x1B[39m"),gray:r("\x1B[90m","\x1B[39m"),bgBlack:r("\x1B[40m","\x1B[49m"),bgRed:r("\x1B[41m","\x1B[49m"),bgGreen:r("\x1B[42m","\x1B[49m"),bgYellow:r("\x1B[43m","\x1B[49m"),bgBlue:r("\x1B[44m","\x1B[49m"),bgMagenta:r("\x1B[45m","\x1B[49m"),bgCyan:r("\x1B[46m","\x1B[49m"),bgWhite:r("\x1B[47m","\x1B[49m"),blackBright:r("\x1B[90m","\x1B[39m"),redBright:r("\x1B[91m","\x1B[39m"),greenBright:r("\x1B[92m","\x1B[39m"),yellowBright:r("\x1B[93m","\x1B[39m"),blueBright:r("\x1B[94m","\x1B[39m"),magentaBright:r("\x1B[95m","\x1B[39m"),cyanBright:r("\x1B[96m","\x1B[39m"),whiteBright:r("\x1B[97m","\x1B[39m"),bgBlackBright:r("\x1B[100m","\x1B[49m"),bgRedBright:r("\x1B[101m","\x1B[49m"),bgGreenBright:r("\x1B[102m","\x1B[49m"),bgYellowBright:r("\x1B[103m","\x1B[49m"),bgBlueBright:r("\x1B[104m","\x1B[49m"),bgMagentaBright:r("\x1B[105m","\x1B[49m"),bgCyanBright:r("\x1B[106m","\x1B[49m"),bgWhiteBright:r("\x1B[107m","\x1B[49m")}};vn.exports=Fn();vn.exports.createColors=Fn});var C=un(Nn(),1),ct=un(Pn(),1);import{stdin as st,stdout as at}from"process";import*as W from"readline";import Dn from"readline";import{Writable as sr}from"stream";function ar({onlyFirst:t=!1}={}){let r=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(r,t?void 0:"g")}var cr=ar();function ft(t){if(typeof t!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof t}\``);return t.replace(cr,"")}function mt(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var lt={exports:{}};(function(t){var r={};t.exports=r,r.eastAsianWidth=function(e){var i=e.charCodeAt(0),s=e.length==2?e.charCodeAt(1):0,n=i;return 55296<=i&&i<=56319&&56320<=s&&s<=57343&&(i&=1023,s&=1023,n=i<<10|s,n+=65536),n==12288||65281<=n&&n<=65376||65504<=n&&n<=65510?"F":n==8361||65377<=n&&n<=65470||65474<=n&&n<=65479||65482<=n&&n<=65487||65490<=n&&n<=65495||65498<=n&&n<=65500||65512<=n&&n<=65518?"H":4352<=n&&n<=4447||4515<=n&&n<=4519||4602<=n&&n<=4607||9001<=n&&n<=9002||11904<=n&&n<=11929||11931<=n&&n<=12019||12032<=n&&n<=12245||12272<=n&&n<=12283||12289<=n&&n<=12350||12353<=n&&n<=12438||12441<=n&&n<=12543||12549<=n&&n<=12589||12593<=n&&n<=12686||12688<=n&&n<=12730||12736<=n&&n<=12771||12784<=n&&n<=12830||12832<=n&&n<=12871||12880<=n&&n<=13054||13056<=n&&n<=19903||19968<=n&&n<=42124||42128<=n&&n<=42182||43360<=n&&n<=43388||44032<=n&&n<=55203||55216<=n&&n<=55238||55243<=n&&n<=55291||63744<=n&&n<=64255||65040<=n&&n<=65049||65072<=n&&n<=65106||65108<=n&&n<=65126||65128<=n&&n<=65131||110592<=n&&n<=110593||127488<=n&&n<=127490||127504<=n&&n<=127546||127552<=n&&n<=127560||127568<=n&&n<=127569||131072<=n&&n<=194367||177984<=n&&n<=196605||196608<=n&&n<=262141?"W":32<=n&&n<=126||162<=n&&n<=163||165<=n&&n<=166||n==172||n==175||10214<=n&&n<=10221||10629<=n&&n<=10630?"Na":n==161||n==164||167<=n&&n<=168||n==170||173<=n&&n<=174||176<=n&&n<=180||182<=n&&n<=186||188<=n&&n<=191||n==198||n==208||215<=n&&n<=216||222<=n&&n<=225||n==230||232<=n&&n<=234||236<=n&&n<=237||n==240||242<=n&&n<=243||247<=n&&n<=250||n==252||n==254||n==257||n==273||n==275||n==283||294<=n&&n<=295||n==299||305<=n&&n<=307||n==312||319<=n&&n<=322||n==324||328<=n&&n<=331||n==333||338<=n&&n<=339||358<=n&&n<=359||n==363||n==462||n==464||n==466||n==468||n==470||n==472||n==474||n==476||n==593||n==609||n==708||n==711||713<=n&&n<=715||n==717||n==720||728<=n&&n<=731||n==733||n==735||768<=n&&n<=879||913<=n&&n<=929||931<=n&&n<=937||945<=n&&n<=961||963<=n&&n<=969||n==1025||1040<=n&&n<=1103||n==1105||n==8208||8211<=n&&n<=8214||8216<=n&&n<=8217||8220<=n&&n<=8221||8224<=n&&n<=8226||8228<=n&&n<=8231||n==8240||8242<=n&&n<=8243||n==8245||n==8251||n==8254||n==8308||n==8319||8321<=n&&n<=8324||n==8364||n==8451||n==8453||n==8457||n==8467||n==8470||8481<=n&&n<=8482||n==8486||n==8491||8531<=n&&n<=8532||8539<=n&&n<=8542||8544<=n&&n<=8555||8560<=n&&n<=8569||n==8585||8592<=n&&n<=8601||8632<=n&&n<=8633||n==8658||n==8660||n==8679||n==8704||8706<=n&&n<=8707||8711<=n&&n<=8712||n==8715||n==8719||n==8721||n==8725||n==8730||8733<=n&&n<=8736||n==8739||n==8741||8743<=n&&n<=8748||n==8750||8756<=n&&n<=8759||8764<=n&&n<=8765||n==8776||n==8780||n==8786||8800<=n&&n<=8801||8804<=n&&n<=8807||8810<=n&&n<=8811||8814<=n&&n<=8815||8834<=n&&n<=8835||8838<=n&&n<=8839||n==8853||n==8857||n==8869||n==8895||n==8978||9312<=n&&n<=9449||9451<=n&&n<=9547||9552<=n&&n<=9587||9600<=n&&n<=9615||9618<=n&&n<=9621||9632<=n&&n<=9633||9635<=n&&n<=9641||9650<=n&&n<=9651||9654<=n&&n<=9655||9660<=n&&n<=9661||9664<=n&&n<=9665||9670<=n&&n<=9672||n==9675||9678<=n&&n<=9681||9698<=n&&n<=9701||n==9711||9733<=n&&n<=9734||n==9737||9742<=n&&n<=9743||9748<=n&&n<=9749||n==9756||n==9758||n==9792||n==9794||9824<=n&&n<=9825||9827<=n&&n<=9829||9831<=n&&n<=9834||9836<=n&&n<=9837||n==9839||9886<=n&&n<=9887||9918<=n&&n<=9919||9924<=n&&n<=9933||9935<=n&&n<=9953||n==9955||9960<=n&&n<=9983||n==10045||n==10071||10102<=n&&n<=10111||11093<=n&&n<=11097||12872<=n&&n<=12879||57344<=n&&n<=63743||65024<=n&&n<=65039||n==65533||127232<=n&&n<=127242||127248<=n&&n<=127277||127280<=n&&n<=127337||127344<=n&&n<=127386||917760<=n&&n<=917999||983040<=n&&n<=1048573||1048576<=n&&n<=1114109?"A":"N"},r.characterLength=function(e){var i=this.eastAsianWidth(e);return i=="F"||i=="W"||i=="A"?2:1};function o(e){return e.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}r.length=function(e){for(var i=o(e),s=0,n=0;n<i.length;n++)s=s+this.characterLength(i[n]);return s},r.slice=function(e,i,s){textLen=r.length(e),i=i||0,s=s||1,i<0&&(i=textLen+i),s<0&&(s=textLen+s);for(var n="",a=0,c=o(e),l=0;l<c.length;l++){var f=c[l],m=r.length(f);if(a>=i-(m==2?1:0))if(a+m<=s)n+=f;else break;a+=m}return n}})(lt);var fr=lt.exports,mr=mt(fr),lr=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g},pr=mt(lr);function sn(t,r={}){if(typeof t!="string"||t.length===0||(r={ambiguousIsNarrow:!0,...r},t=ft(t),t.length===0))return 0;t=t.replace(pr()," ");let o=r.ambiguousIsNarrow?1:2,e=0;for(let i of t){let s=i.codePointAt(0);if(s<=31||s>=127&&s<=159||s>=768&&s<=879)continue;switch(mr.eastAsianWidth(i)){case"F":case"W":e+=2;break;case"A":e+=o;break;default:e+=1}}return e}var Gn=10,nt=(t=0)=>(r)=>`\x1B[${r+t}m`,tt=(t=0)=>(r)=>`\x1B[${38+t};5;${r}m`,rt=(t=0)=>(r,o,e)=>`\x1B[${38+t};2;${r};${o};${e}m`,$={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys($.modifier);var gr=Object.keys($.color),ur=Object.keys($.bgColor);[...gr];function dr(){let t=new Map;for(let[r,o]of Object.entries($)){for(let[e,i]of Object.entries(o))$[e]={open:`\x1B[${i[0]}m`,close:`\x1B[${i[1]}m`},o[e]=$[e],t.set(i[0],i[1]);Object.defineProperty($,r,{value:o,enumerable:!1})}return Object.defineProperty($,"codes",{value:t,enumerable:!1}),$.color.close="\x1B[39m",$.bgColor.close="\x1B[49m",$.color.ansi=nt(),$.color.ansi256=tt(),$.color.ansi16m=rt(),$.bgColor.ansi=nt(Gn),$.bgColor.ansi256=tt(Gn),$.bgColor.ansi16m=rt(Gn),Object.defineProperties($,{rgbToAnsi256:{value:(r,o,e)=>r===o&&o===e?r<8?16:r>248?231:Math.round((r-8)/247*24)+232:16+36*Math.round(r/255*5)+6*Math.round(o/255*5)+Math.round(e/255*5),enumerable:!1},hexToRgb:{value:(r)=>{let o=/[a-f\d]{6}|[a-f\d]{3}/i.exec(r.toString(16));if(!o)return[0,0,0];let[e]=o;e.length===3&&(e=[...e].map((s)=>s+s).join(""));let i=Number.parseInt(e,16);return[i>>16&255,i>>8&255,i&255]},enumerable:!1},hexToAnsi256:{value:(r)=>$.rgbToAnsi256(...$.hexToRgb(r)),enumerable:!1},ansi256ToAnsi:{value:(r)=>{if(r<8)return 30+r;if(r<16)return 90+(r-8);let o,e,i;if(r>=232)o=((r-232)*10+8)/255,e=o,i=o;else{r-=16;let a=r%36;o=Math.floor(r/36)/5,e=Math.floor(a/6)/5,i=a%6/5}let s=Math.max(o,e,i)*2;if(s===0)return 30;let n=30+(Math.round(i)<<2|Math.round(e)<<1|Math.round(o));return s===2&&(n+=60),n},enumerable:!1},rgbToAnsi:{value:(r,o,e)=>$.ansi256ToAnsi($.rgbToAnsi256(r,o,e)),enumerable:!1},hexToAnsi:{value:(r)=>$.ansi256ToAnsi($.hexToAnsi256(r)),enumerable:!1}}),$}var hr=dr(),xn=new Set(["\x1B","\x9B"]),br=39,_n="\x07",pt="[",yr="]",gt="m",An=`${yr}8;;`,ot=(t)=>`${xn.values().next().value}${pt}${t}${gt}`,et=(t)=>`${xn.values().next().value}${An}${t}${_n}`,xr=(t)=>t.split(" ").map((r)=>sn(r)),Mn=(t,r,o)=>{let e=[...r],i=!1,s=!1,n=sn(ft(t[t.length-1]));for(let[a,c]of e.entries()){let l=sn(c);if(n+l<=o?t[t.length-1]+=c:(t.push(c),n=0),xn.has(c)&&(i=!0,s=e.slice(a+1).join("").startsWith(An)),i){s?c===_n&&(i=!1,s=!1):c===gt&&(i=!1);continue}n+=l,n===o&&a<e.length-1&&(t.push(""),n=0)}!n&&t[t.length-1].length>0&&t.length>1&&(t[t.length-2]+=t.pop())},$r=(t)=>{let r=t.split(" "),o=r.length;for(;o>0&&!(sn(r[o-1])>0);)o--;return o===r.length?t:r.slice(0,o).join(" ")+r.slice(o).join("")},wr=(t,r,o={})=>{if(o.trim!==!1&&t.trim()==="")return"";let e="",i,s,n=xr(t),a=[""];for(let[l,f]of t.split(" ").entries()){o.trim!==!1&&(a[a.length-1]=a[a.length-1].trimStart());let m=sn(a[a.length-1]);if(l!==0&&(m>=r&&(o.wordWrap===!1||o.trim===!1)&&(a.push(""),m=0),(m>0||o.trim===!1)&&(a[a.length-1]+=" ",m++)),o.hard&&n[l]>r){let p=r-m,d=1+Math.floor((n[l]-p-1)/r);Math.floor((n[l]-1)/r)<d&&a.push(""),Mn(a,f,r);continue}if(m+n[l]>r&&m>0&&n[l]>0){if(o.wordWrap===!1&&m<r){Mn(a,f,r);continue}a.push("")}if(m+n[l]>r&&o.wordWrap===!1){Mn(a,f,r);continue}a[a.length-1]+=f}o.trim!==!1&&(a=a.map((l)=>$r(l)));let c=[...a.join(`
|
|
3
|
-
`)];for(let[
|
|
4
|
-
`?(s&&(e+=
|
|
5
|
-
`&&(i&&
|
|
2
|
+
var Lo=Object.create;var{getPrototypeOf:No,defineProperty:ht,getOwnPropertyNames:Go}=Object;var Ao=Object.prototype.hasOwnProperty;var $n=(n,o,r)=>{r=n!=null?Lo(No(n)):{};let e=o||!n||!n.__esModule?ht(r,"default",{value:n,enumerable:!0}):r;for(let i of Go(n))if(!Ao.call(e,i))ht(e,i,{get:()=>n[i],enumerable:!0});return e};var bt=(n,o)=>()=>(o||n((o={exports:{}}).exports,o),o.exports);var In=bt((Je,yt)=>{var Wn={to(n,o){if(!o)return`\x1B[${n+1}G`;return`\x1B[${o+1};${n+1}H`},move(n,o){let r="";if(n<0)r+=`\x1B[${-n}D`;else if(n>0)r+=`\x1B[${n}C`;if(o<0)r+=`\x1B[${-o}A`;else if(o>0)r+=`\x1B[${o}B`;return r},up:(n=1)=>`\x1B[${n}A`,down:(n=1)=>`\x1B[${n}B`,forward:(n=1)=>`\x1B[${n}C`,backward:(n=1)=>`\x1B[${n}D`,nextLine:(n=1)=>"\x1B[E".repeat(n),prevLine:(n=1)=>"\x1B[F".repeat(n),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},Xo={up:(n=1)=>"\x1B[S".repeat(n),down:(n=1)=>"\x1B[T".repeat(n)},_o={screen:"\x1B[2J",up:(n=1)=>"\x1B[1J".repeat(n),down:(n=1)=>"\x1B[J".repeat(n),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(n){let o="";for(let r=0;r<n;r++)o+=this.line+(r<n-1?Wn.up():"");if(n)o+=Wn.left;return o}};yt.exports={cursor:Wn,scroll:Xo,erase:_o,beep:"\x07"}});var zn=bt((Ye,Kn)=>{var On=process||{},wt=On.argv||[],En=On.env||{},Uo=!(!!En.NO_COLOR||wt.includes("--no-color"))&&(!!En.FORCE_COLOR||wt.includes("--color")||On.platform==="win32"||(On.stdout||{}).isTTY&&En.TERM!=="dumb"||!!En.CI),qo=(n,o,r=n)=>(e)=>{let i=""+e,s=i.indexOf(o,n.length);return~s?n+Co(i,o,r,s)+o:n+i+o},Co=(n,o,r,e)=>{let i="",s=0;do i+=n.substring(s,e)+r,s=e+o.length,e=n.indexOf(o,s);while(~e);return i+n.substring(s)},xt=(n=Uo)=>{let o=n?qo:()=>String;return{isColorSupported:n,reset:o("\x1B[0m","\x1B[0m"),bold:o("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:o("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:o("\x1B[3m","\x1B[23m"),underline:o("\x1B[4m","\x1B[24m"),inverse:o("\x1B[7m","\x1B[27m"),hidden:o("\x1B[8m","\x1B[28m"),strikethrough:o("\x1B[9m","\x1B[29m"),black:o("\x1B[30m","\x1B[39m"),red:o("\x1B[31m","\x1B[39m"),green:o("\x1B[32m","\x1B[39m"),yellow:o("\x1B[33m","\x1B[39m"),blue:o("\x1B[34m","\x1B[39m"),magenta:o("\x1B[35m","\x1B[39m"),cyan:o("\x1B[36m","\x1B[39m"),white:o("\x1B[37m","\x1B[39m"),gray:o("\x1B[90m","\x1B[39m"),bgBlack:o("\x1B[40m","\x1B[49m"),bgRed:o("\x1B[41m","\x1B[49m"),bgGreen:o("\x1B[42m","\x1B[49m"),bgYellow:o("\x1B[43m","\x1B[49m"),bgBlue:o("\x1B[44m","\x1B[49m"),bgMagenta:o("\x1B[45m","\x1B[49m"),bgCyan:o("\x1B[46m","\x1B[49m"),bgWhite:o("\x1B[47m","\x1B[49m"),blackBright:o("\x1B[90m","\x1B[39m"),redBright:o("\x1B[91m","\x1B[39m"),greenBright:o("\x1B[92m","\x1B[39m"),yellowBright:o("\x1B[93m","\x1B[39m"),blueBright:o("\x1B[94m","\x1B[39m"),magentaBright:o("\x1B[95m","\x1B[39m"),cyanBright:o("\x1B[96m","\x1B[39m"),whiteBright:o("\x1B[97m","\x1B[39m"),bgBlackBright:o("\x1B[100m","\x1B[49m"),bgRedBright:o("\x1B[101m","\x1B[49m"),bgGreenBright:o("\x1B[102m","\x1B[49m"),bgYellowBright:o("\x1B[103m","\x1B[49m"),bgBlueBright:o("\x1B[104m","\x1B[49m"),bgMagentaBright:o("\x1B[105m","\x1B[49m"),bgCyanBright:o("\x1B[106m","\x1B[49m"),bgWhiteBright:o("\x1B[107m","\x1B[49m")}};Kn.exports=xt();Kn.exports.createColors=xt});var G=$n(In(),1),Xt=$n(zn(),1);import{stdin as Gt,stdout as At}from"process";import*as Q from"readline";import $t from"readline";import{Writable as vo}from"stream";function Ho({onlyFirst:n=!1}={}){let o=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(o,n?void 0:"g")}var Po=Ho();function _t(n){if(typeof n!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof n}\``);return n.replace(Po,"")}function Ut(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var qt={exports:{}};(function(n){var o={};n.exports=o,o.eastAsianWidth=function(e){var i=e.charCodeAt(0),s=e.length==2?e.charCodeAt(1):0,t=i;return 55296<=i&&i<=56319&&56320<=s&&s<=57343&&(i&=1023,s&=1023,t=i<<10|s,t+=65536),t==12288||65281<=t&&t<=65376||65504<=t&&t<=65510?"F":t==8361||65377<=t&&t<=65470||65474<=t&&t<=65479||65482<=t&&t<=65487||65490<=t&&t<=65495||65498<=t&&t<=65500||65512<=t&&t<=65518?"H":4352<=t&&t<=4447||4515<=t&&t<=4519||4602<=t&&t<=4607||9001<=t&&t<=9002||11904<=t&&t<=11929||11931<=t&&t<=12019||12032<=t&&t<=12245||12272<=t&&t<=12283||12289<=t&&t<=12350||12353<=t&&t<=12438||12441<=t&&t<=12543||12549<=t&&t<=12589||12593<=t&&t<=12686||12688<=t&&t<=12730||12736<=t&&t<=12771||12784<=t&&t<=12830||12832<=t&&t<=12871||12880<=t&&t<=13054||13056<=t&&t<=19903||19968<=t&&t<=42124||42128<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||55216<=t&&t<=55238||55243<=t&&t<=55291||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65106||65108<=t&&t<=65126||65128<=t&&t<=65131||110592<=t&&t<=110593||127488<=t&&t<=127490||127504<=t&&t<=127546||127552<=t&&t<=127560||127568<=t&&t<=127569||131072<=t&&t<=194367||177984<=t&&t<=196605||196608<=t&&t<=262141?"W":32<=t&&t<=126||162<=t&&t<=163||165<=t&&t<=166||t==172||t==175||10214<=t&&t<=10221||10629<=t&&t<=10630?"Na":t==161||t==164||167<=t&&t<=168||t==170||173<=t&&t<=174||176<=t&&t<=180||182<=t&&t<=186||188<=t&&t<=191||t==198||t==208||215<=t&&t<=216||222<=t&&t<=225||t==230||232<=t&&t<=234||236<=t&&t<=237||t==240||242<=t&&t<=243||247<=t&&t<=250||t==252||t==254||t==257||t==273||t==275||t==283||294<=t&&t<=295||t==299||305<=t&&t<=307||t==312||319<=t&&t<=322||t==324||328<=t&&t<=331||t==333||338<=t&&t<=339||358<=t&&t<=359||t==363||t==462||t==464||t==466||t==468||t==470||t==472||t==474||t==476||t==593||t==609||t==708||t==711||713<=t&&t<=715||t==717||t==720||728<=t&&t<=731||t==733||t==735||768<=t&&t<=879||913<=t&&t<=929||931<=t&&t<=937||945<=t&&t<=961||963<=t&&t<=969||t==1025||1040<=t&&t<=1103||t==1105||t==8208||8211<=t&&t<=8214||8216<=t&&t<=8217||8220<=t&&t<=8221||8224<=t&&t<=8226||8228<=t&&t<=8231||t==8240||8242<=t&&t<=8243||t==8245||t==8251||t==8254||t==8308||t==8319||8321<=t&&t<=8324||t==8364||t==8451||t==8453||t==8457||t==8467||t==8470||8481<=t&&t<=8482||t==8486||t==8491||8531<=t&&t<=8532||8539<=t&&t<=8542||8544<=t&&t<=8555||8560<=t&&t<=8569||t==8585||8592<=t&&t<=8601||8632<=t&&t<=8633||t==8658||t==8660||t==8679||t==8704||8706<=t&&t<=8707||8711<=t&&t<=8712||t==8715||t==8719||t==8721||t==8725||t==8730||8733<=t&&t<=8736||t==8739||t==8741||8743<=t&&t<=8748||t==8750||8756<=t&&t<=8759||8764<=t&&t<=8765||t==8776||t==8780||t==8786||8800<=t&&t<=8801||8804<=t&&t<=8807||8810<=t&&t<=8811||8814<=t&&t<=8815||8834<=t&&t<=8835||8838<=t&&t<=8839||t==8853||t==8857||t==8869||t==8895||t==8978||9312<=t&&t<=9449||9451<=t&&t<=9547||9552<=t&&t<=9587||9600<=t&&t<=9615||9618<=t&&t<=9621||9632<=t&&t<=9633||9635<=t&&t<=9641||9650<=t&&t<=9651||9654<=t&&t<=9655||9660<=t&&t<=9661||9664<=t&&t<=9665||9670<=t&&t<=9672||t==9675||9678<=t&&t<=9681||9698<=t&&t<=9701||t==9711||9733<=t&&t<=9734||t==9737||9742<=t&&t<=9743||9748<=t&&t<=9749||t==9756||t==9758||t==9792||t==9794||9824<=t&&t<=9825||9827<=t&&t<=9829||9831<=t&&t<=9834||9836<=t&&t<=9837||t==9839||9886<=t&&t<=9887||9918<=t&&t<=9919||9924<=t&&t<=9933||9935<=t&&t<=9953||t==9955||9960<=t&&t<=9983||t==10045||t==10071||10102<=t&&t<=10111||11093<=t&&t<=11097||12872<=t&&t<=12879||57344<=t&&t<=63743||65024<=t&&t<=65039||t==65533||127232<=t&&t<=127242||127248<=t&&t<=127277||127280<=t&&t<=127337||127344<=t&&t<=127386||917760<=t&&t<=917999||983040<=t&&t<=1048573||1048576<=t&&t<=1114109?"A":"N"},o.characterLength=function(e){var i=this.eastAsianWidth(e);return i=="F"||i=="W"||i=="A"?2:1};function r(e){return e.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}o.length=function(e){for(var i=r(e),s=0,t=0;t<i.length;t++)s=s+this.characterLength(i[t]);return s},o.slice=function(e,i,s){textLen=o.length(e),i=i||0,s=s||1,i<0&&(i=textLen+i),s<0&&(s=textLen+s);for(var t="",f=0,a=r(e),c=0;c<a.length;c++){var m=a[c],l=o.length(m);if(f>=i-(l==2?1:0))if(f+l<=s)t+=m;else break;f+=l}return t}})(qt);var Mo=qt.exports,Bo=Ut(Mo),Wo=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g},Io=Ut(Wo);function dn(n,o={}){if(typeof n!="string"||n.length===0||(o={ambiguousIsNarrow:!0,...o},n=_t(n),n.length===0))return 0;n=n.replace(Io()," ");let r=o.ambiguousIsNarrow?1:2,e=0;for(let i of n){let s=i.codePointAt(0);if(s<=31||s>=127&&s<=159||s>=768&&s<=879)continue;switch(Bo.eastAsianWidth(i)){case"F":case"W":e+=2;break;case"A":e+=r;break;default:e+=1}}return e}var kn=10,Et=(n=0)=>(o)=>`\x1B[${o+n}m`,Ot=(n=0)=>(o)=>`\x1B[${38+n};5;${o}m`,Rt=(n=0)=>(o,r,e)=>`\x1B[${38+n};2;${o};${r};${e}m`,O={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(O.modifier);var Ko=Object.keys(O.color),zo=Object.keys(O.bgColor);[...Ko];function ko(){let n=new Map;for(let[o,r]of Object.entries(O)){for(let[e,i]of Object.entries(r))O[e]={open:`\x1B[${i[0]}m`,close:`\x1B[${i[1]}m`},r[e]=O[e],n.set(i[0],i[1]);Object.defineProperty(O,o,{value:r,enumerable:!1})}return Object.defineProperty(O,"codes",{value:n,enumerable:!1}),O.color.close="\x1B[39m",O.bgColor.close="\x1B[49m",O.color.ansi=Et(),O.color.ansi256=Ot(),O.color.ansi16m=Rt(),O.bgColor.ansi=Et(kn),O.bgColor.ansi256=Ot(kn),O.bgColor.ansi16m=Rt(kn),Object.defineProperties(O,{rgbToAnsi256:{value:(o,r,e)=>o===r&&r===e?o<8?16:o>248?231:Math.round((o-8)/247*24)+232:16+36*Math.round(o/255*5)+6*Math.round(r/255*5)+Math.round(e/255*5),enumerable:!1},hexToRgb:{value:(o)=>{let r=/[a-f\d]{6}|[a-f\d]{3}/i.exec(o.toString(16));if(!r)return[0,0,0];let[e]=r;e.length===3&&(e=[...e].map((s)=>s+s).join(""));let i=Number.parseInt(e,16);return[i>>16&255,i>>8&255,i&255]},enumerable:!1},hexToAnsi256:{value:(o)=>O.rgbToAnsi256(...O.hexToRgb(o)),enumerable:!1},ansi256ToAnsi:{value:(o)=>{if(o<8)return 30+o;if(o<16)return 90+(o-8);let r,e,i;if(o>=232)r=((o-232)*10+8)/255,e=r,i=r;else{o-=16;let f=o%36;r=Math.floor(o/36)/5,e=Math.floor(f/6)/5,i=f%6/5}let s=Math.max(r,e,i)*2;if(s===0)return 30;let t=30+(Math.round(i)<<2|Math.round(e)<<1|Math.round(r));return s===2&&(t+=60),t},enumerable:!1},rgbToAnsi:{value:(o,r,e)=>O.ansi256ToAnsi(O.rgbToAnsi256(o,r,e)),enumerable:!1},hexToAnsi:{value:(o)=>O.ansi256ToAnsi(O.hexToAnsi256(o)),enumerable:!1}}),O}var Jo=ko(),Tn=new Set(["\x1B","\x9B"]),Yo=39,jn="\x07",Ct="[",jo="]",vt="m",Zn=`${jo}8;;`,St=(n)=>`${Tn.values().next().value}${Ct}${n}${vt}`,Tt=(n)=>`${Tn.values().next().value}${Zn}${n}${jn}`,Zo=(n)=>n.split(" ").map((o)=>dn(o)),Jn=(n,o,r)=>{let e=[...o],i=!1,s=!1,t=dn(_t(n[n.length-1]));for(let[f,a]of e.entries()){let c=dn(a);if(t+c<=r?n[n.length-1]+=a:(n.push(a),t=0),Tn.has(a)&&(i=!0,s=e.slice(f+1).join("").startsWith(Zn)),i){s?a===jn&&(i=!1,s=!1):a===vt&&(i=!1);continue}t+=c,t===r&&f<e.length-1&&(n.push(""),t=0)}!t&&n[n.length-1].length>0&&n.length>1&&(n[n.length-2]+=n.pop())},Qo=(n)=>{let o=n.split(" "),r=o.length;for(;r>0&&!(dn(o[r-1])>0);)r--;return r===o.length?n:o.slice(0,r).join(" ")+o.slice(r).join("")},Vo=(n,o,r={})=>{if(r.trim!==!1&&n.trim()==="")return"";let e="",i,s,t=Zo(n),f=[""];for(let[c,m]of n.split(" ").entries()){r.trim!==!1&&(f[f.length-1]=f[f.length-1].trimStart());let l=dn(f[f.length-1]);if(c!==0&&(l>=o&&(r.wordWrap===!1||r.trim===!1)&&(f.push(""),l=0),(l>0||r.trim===!1)&&(f[f.length-1]+=" ",l++)),r.hard&&t[c]>o){let u=o-l,b=1+Math.floor((t[c]-u-1)/o);Math.floor((t[c]-1)/o)<b&&f.push(""),Jn(f,m,o);continue}if(l+t[c]>o&&l>0&&t[c]>0){if(r.wordWrap===!1&&l<o){Jn(f,m,o);continue}f.push("")}if(l+t[c]>o&&r.wordWrap===!1){Jn(f,m,o);continue}f[f.length-1]+=m}r.trim!==!1&&(f=f.map((c)=>Qo(c)));let a=[...f.join(`
|
|
3
|
+
`)];for(let[c,m]of a.entries()){if(e+=m,Tn.has(m)){let{groups:u}=new RegExp(`(?:\\${Ct}(?<code>\\d+)m|\\${Zn}(?<uri>.*)${jn})`).exec(a.slice(c).join(""))||{groups:{}};if(u.code!==void 0){let b=Number.parseFloat(u.code);i=b===Yo?void 0:b}else u.uri!==void 0&&(s=u.uri.length===0?void 0:u.uri)}let l=Jo.codes.get(Number(i));a[c+1]===`
|
|
4
|
+
`?(s&&(e+=Tt("")),i&&l&&(e+=St(l))):m===`
|
|
5
|
+
`&&(i&&l&&(e+=St(i)),s&&(e+=Tt(s)))}return e};function Lt(n,o,r){return String(n).normalize().replace(/\r\n/g,`
|
|
6
6
|
`).split(`
|
|
7
|
-
`).map((e)=>
|
|
8
|
-
`)}var
|
|
9
|
-
`),e=
|
|
10
|
-
`),i=[];for(let s=0;s<Math.max(
|
|
11
|
-
`),
|
|
12
|
-
`).length-1;this.output.write(
|
|
13
|
-
`);this.output.write(e[
|
|
14
|
-
`).slice(
|
|
15
|
-
`)),this._prevFrame=
|
|
16
|
-
${
|
|
17
|
-
`,
|
|
18
|
-
${
|
|
19
|
-
${
|
|
20
|
-
`;case"submit":return`${
|
|
21
|
-
${
|
|
22
|
-
${
|
|
23
|
-
`}}}).prompt();var
|
|
24
|
-
${
|
|
25
|
-
`,i=this.value?r
|
|
26
|
-
${
|
|
27
|
-
${
|
|
28
|
-
`}}}).prompt()}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
${
|
|
33
|
-
|
|
34
|
-
`)}
|
|
35
|
-
|
|
7
|
+
`).map((e)=>Vo(e,o,r)).join(`
|
|
8
|
+
`)}var Fo=["up","down","left","right","space","enter","cancel"],Sn={actions:new Set(Fo),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]])};function Qn(n,o){if(typeof n=="string")return Sn.aliases.get(n)===o;for(let r of n)if(r!==void 0&&Qn(r,o))return!0;return!1}function Do(n,o){if(n===o)return;let r=n.split(`
|
|
9
|
+
`),e=o.split(`
|
|
10
|
+
`),i=[];for(let s=0;s<Math.max(r.length,e.length);s++)r[s]!==e[s]&&i.push(s);return i}var nr=globalThis.process.platform.startsWith("win"),Yn=Symbol("clack:cancel");function U(n){return n===Yn}function Rn(n,o){let r=n;r.isTTY&&r.setRawMode(o)}function Ht({input:n=Gt,output:o=At,overwrite:r=!0,hideCursor:e=!0}={}){let i=Q.createInterface({input:n,output:o,prompt:"",tabSize:1});Q.emitKeypressEvents(n,i),n.isTTY&&n.setRawMode(!0);let s=(t,{name:f,sequence:a})=>{let c=String(t);if(Qn([c,f,a],"cancel")){e&&o.write(G.cursor.show),process.exit(0);return}if(!r)return;Q.moveCursor(o,f==="return"?0:-1,f==="return"?-1:0,()=>{Q.clearLine(o,1,()=>{n.once("keypress",s)})})};return e&&o.write(G.cursor.hide),n.once("keypress",s),()=>{n.off("keypress",s),e&&o.write(G.cursor.show),n.isTTY&&!nr&&n.setRawMode(!1),i.terminal=!1,i.close()}}var tr=Object.defineProperty,or=(n,o,r)=>(o in n)?tr(n,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[o]=r,H=(n,o,r)=>(or(n,typeof o!="symbol"?o+"":o,r),r);class Ln{constructor(n,o=!0){H(this,"input"),H(this,"output"),H(this,"_abortSignal"),H(this,"rl"),H(this,"opts"),H(this,"_render"),H(this,"_track",!1),H(this,"_prevFrame",""),H(this,"_subscribers",new Map),H(this,"_cursor",0),H(this,"state","initial"),H(this,"error",""),H(this,"value");let{input:r=Gt,output:e=At,render:i,signal:s,...t}=n;this.opts=t,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=i.bind(this),this._track=o,this._abortSignal=s,this.input=r,this.output=e}unsubscribe(){this._subscribers.clear()}setSubscriber(n,o){let r=this._subscribers.get(n)??[];r.push(o),this._subscribers.set(n,r)}on(n,o){this.setSubscriber(n,{cb:o})}once(n,o){this.setSubscriber(n,{cb:o,once:!0})}emit(n,...o){let r=this._subscribers.get(n)??[],e=[];for(let i of r)i.cb(...o),i.once&&e.push(()=>r.splice(r.indexOf(i),1));for(let i of e)i()}prompt(){return new Promise((n,o)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),n(Yn);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}let r=new vo;r._write=(e,i,s)=>{this._track&&(this.value=this.rl?.line.replace(/\t/g,""),this._cursor=this.rl?.cursor??0,this.emit("value",this.value)),s()},this.input.pipe(r),this.rl=$t.createInterface({input:this.input,output:r,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),$t.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),Rn(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(G.cursor.show),this.output.off("resize",this.render),Rn(this.input,!1),n(this.value)}),this.once("cancel",()=>{this.output.write(G.cursor.show),this.output.off("resize",this.render),Rn(this.input,!1),n(Yn)})})}onKeypress(n,o){if(this.state==="error"&&(this.state="active"),o?.name&&(!this._track&&Sn.aliases.has(o.name)&&this.emit("cursor",Sn.aliases.get(o.name)),Sn.actions.has(o.name)&&this.emit("cursor",o.name)),n&&(n.toLowerCase()==="y"||n.toLowerCase()==="n")&&this.emit("confirm",n.toLowerCase()==="y"),n==="\t"&&this.opts.placeholder&&(this.value||(this.rl?.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),n&&this.emit("key",n.toLowerCase()),o?.name==="return"){if(this.opts.validate){let r=this.opts.validate(this.value);r&&(this.error=r instanceof Error?r.message:r,this.state="error",this.rl?.write(this.value))}this.state!=="error"&&(this.state="submit")}Qn([n,o?.name,o?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
|
|
11
|
+
`),Rn(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let n=Lt(this._prevFrame,process.stdout.columns,{hard:!0}).split(`
|
|
12
|
+
`).length-1;this.output.write(G.cursor.move(-999,n*-1))}render(){let n=Lt(this._render(this)??"",process.stdout.columns,{hard:!0});if(n!==this._prevFrame){if(this.state==="initial")this.output.write(G.cursor.hide);else{let o=Do(this._prevFrame,n);if(this.restoreCursor(),o&&o?.length===1){let r=o[0];this.output.write(G.cursor.move(0,r)),this.output.write(G.erase.lines(1));let e=n.split(`
|
|
13
|
+
`);this.output.write(e[r]),this._prevFrame=n,this.output.write(G.cursor.move(0,e.length-r-1));return}if(o&&o?.length>1){let r=o[0];this.output.write(G.cursor.move(0,r)),this.output.write(G.erase.down());let e=n.split(`
|
|
14
|
+
`).slice(r);this.output.write(e.join(`
|
|
15
|
+
`)),this._prevFrame=n;return}this.output.write(G.erase.down())}this.output.write(n),this.state==="initial"&&(this.state="active"),this._prevFrame=n}}}class Vn extends Ln{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(n){super(n,!1),this.value=!!n.initialValue,this.on("value",()=>{this.value=this._value}),this.on("confirm",(o)=>{this.output.write(G.cursor.move(0,-1)),this.value=o,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}var rr;rr=new WeakMap;var er=Object.defineProperty,ir=(n,o,r)=>(o in n)?er(n,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[o]=r,Nt=(n,o,r)=>(ir(n,typeof o!="symbol"?o+"":o,r),r);class Fn extends Ln{constructor(n){super(n,!1),Nt(this,"options"),Nt(this,"cursor",0),this.options=n.options,this.cursor=this.options.findIndex(({value:o})=>o===n.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",(o)=>{switch(o){case"left":case"up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case"down":case"right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue()})}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value}}class Dn extends Ln{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return`${this.value}\u2588`;let n=this.value.slice(0,this.cursor),[o,...r]=this.value.slice(this.cursor);return`${n}${Xt.default.inverse(o)}${r.join("")}`}get cursor(){return this._cursor}constructor(n){super(n),this.on("finalize",()=>{this.value||(this.value=n.defaultValue)})}}var d=$n(zn(),1),Nn=$n(In(),1);import z from"process";function sr(){return z.platform!=="win32"?z.env.TERM!=="linux":!!z.env.CI||!!z.env.WT_SESSION||!!z.env.TERMINUS_SUBLIME||z.env.ConEmuTask==="{cmd::Cmder}"||z.env.TERM_PROGRAM==="Terminus-Sublime"||z.env.TERM_PROGRAM==="vscode"||z.env.TERM==="xterm-256color"||z.env.TERM==="alacritty"||z.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var nt=sr(),N=(n,o)=>nt?n:o,fr=N("\u25C6","*"),Pt=N("\u25A0","x"),Mt=N("\u25B2","x"),rt=N("\u25C7","o"),ar=N("\u250C","T"),S=N("\u2502","|"),fn=N("\u2514","\u2014"),tt=N("\u25CF",">"),ot=N("\u25CB"," "),ii=N("\u25FB","[\u2022]"),si=N("\u25FC","[+]"),fi=N("\u25FB","[ ]"),ai=N("\u25AA","\u2022"),ci=N("\u2500","-"),mi=N("\u256E","+"),li=N("\u251C","+"),pi=N("\u256F","+"),cr=N("\u25CF","\u2022"),mr=N("\u25C6","*"),lr=N("\u25B2","!"),pr=N("\u25A0","x"),et=(n)=>{switch(n){case"initial":case"active":return d.default.cyan(fr);case"cancel":return d.default.red(Pt);case"error":return d.default.yellow(Mt);case"submit":return d.default.green(rt)}},ur=(n)=>{let{cursor:o,options:r,style:e}=n,i=n.maxItems??Number.POSITIVE_INFINITY,s=Math.max(process.stdout.rows-4,0),t=Math.min(s,Math.max(i,5)),f=0;o>=f+t-3?f=Math.max(Math.min(o-t+3,r.length-t),0):o<f+2&&(f=Math.max(o-2,0));let a=t<r.length&&f>0,c=t<r.length&&f+t<r.length;return r.slice(f,f+t).map((m,l,u)=>{let b=l===0&&a,g=l===u.length-1&&c;return b||g?d.default.dim("..."):e(m,l+f===o)})},q=(n)=>new Dn({validate:n.validate,placeholder:n.placeholder,defaultValue:n.defaultValue,initialValue:n.initialValue,render(){let o=`${d.default.gray(S)}
|
|
16
|
+
${et(this.state)} ${n.message}
|
|
17
|
+
`,r=n.placeholder?d.default.inverse(n.placeholder[0])+d.default.dim(n.placeholder.slice(1)):d.default.inverse(d.default.hidden("_")),e=this.value?this.valueWithCursor:r;switch(this.state){case"error":return`${o.trim()}
|
|
18
|
+
${d.default.yellow(S)} ${e}
|
|
19
|
+
${d.default.yellow(fn)} ${d.default.yellow(this.error)}
|
|
20
|
+
`;case"submit":return`${o}${d.default.gray(S)} ${d.default.dim(this.value||n.placeholder)}`;case"cancel":return`${o}${d.default.gray(S)} ${d.default.strikethrough(d.default.dim(this.value??""))}${this.value?.trim()?`
|
|
21
|
+
${d.default.gray(S)}`:""}`;default:return`${o}${d.default.cyan(S)} ${e}
|
|
22
|
+
${d.default.cyan(fn)}
|
|
23
|
+
`}}}).prompt();var C=(n)=>{let o=n.active??"Yes",r=n.inactive??"No";return new Vn({active:o,inactive:r,initialValue:n.initialValue??!0,render(){let e=`${d.default.gray(S)}
|
|
24
|
+
${et(this.state)} ${n.message}
|
|
25
|
+
`,i=this.value?o:r;switch(this.state){case"submit":return`${e}${d.default.gray(S)} ${d.default.dim(i)}`;case"cancel":return`${e}${d.default.gray(S)} ${d.default.strikethrough(d.default.dim(i))}
|
|
26
|
+
${d.default.gray(S)}`;default:return`${e}${d.default.cyan(S)} ${this.value?`${d.default.green(tt)} ${o}`:`${d.default.dim(ot)} ${d.default.dim(o)}`} ${d.default.dim("/")} ${this.value?`${d.default.dim(ot)} ${d.default.dim(r)}`:`${d.default.green(tt)} ${r}`}
|
|
27
|
+
${d.default.cyan(fn)}
|
|
28
|
+
`}}}).prompt()},Gn=(n)=>{let o=(r,e)=>{let i=r.label??String(r.value);switch(e){case"selected":return`${d.default.dim(i)}`;case"active":return`${d.default.green(tt)} ${i} ${r.hint?d.default.dim(`(${r.hint})`):""}`;case"cancelled":return`${d.default.strikethrough(d.default.dim(i))}`;default:return`${d.default.dim(ot)} ${d.default.dim(i)}`}};return new Fn({options:n.options,initialValue:n.initialValue,render(){let r=`${d.default.gray(S)}
|
|
29
|
+
${et(this.state)} ${n.message}
|
|
30
|
+
`;switch(this.state){case"submit":return`${r}${d.default.gray(S)} ${o(this.options[this.cursor],"selected")}`;case"cancel":return`${r}${d.default.gray(S)} ${o(this.options[this.cursor],"cancelled")}
|
|
31
|
+
${d.default.gray(S)}`;default:return`${r}${d.default.cyan(S)} ${ur({cursor:this.cursor,options:this.options,maxItems:n.maxItems,style:(e,i)=>o(e,i?"active":"inactive")}).join(`
|
|
32
|
+
${d.default.cyan(S)} `)}
|
|
33
|
+
${d.default.cyan(fn)}
|
|
34
|
+
`}}}).prompt()};var it=(n="")=>{process.stdout.write(`${d.default.gray(fn)} ${d.default.red(n)}
|
|
35
|
+
|
|
36
|
+
`)},Bt=(n="")=>{process.stdout.write(`${d.default.gray(ar)} ${n}
|
|
37
|
+
`)},Wt=(n="")=>{process.stdout.write(`${d.default.gray(S)}
|
|
38
|
+
${d.default.gray(fn)} ${n}
|
|
39
|
+
|
|
40
|
+
`)},h={message:(n="",{symbol:o=d.default.gray(S)}={})=>{let r=[`${d.default.gray(S)}`];if(n){let[e,...i]=n.split(`
|
|
41
|
+
`);r.push(`${o} ${e}`,...i.map((s)=>`${d.default.gray(S)} ${s}`))}process.stdout.write(`${r.join(`
|
|
36
42
|
`)}
|
|
37
|
-
`)},info:(
|
|
38
|
-
`);let
|
|
39
|
-
`);process.stdout.write(
|
|
40
|
-
`);let
|
|
41
|
-
`):process.stdout.write(`${
|
|
42
|
-
`),u(),i()};return{start:y,stop:B,message:(x="")=>{a=k(x??a)}}},Rt=async(t,r)=>{let o={},e=Object.keys(t);for(let i of e){let s=t[i],n=await s({results:o})?.catch((a)=>{throw a});if(typeof r?.onCancel=="function"&&T(n)){o[i]="canceled",r.onCancel({results:o});continue}o[i]=n}return o};var _r=!process.env.NO_COLOR&&(process.env.FORCE_COLOR||process.stdout.isTTY),Ar=["blue","cyan","gray","green","magenta","red","white","yellow"],Ur=["bold","dim","italic","underline","reset"],St={bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",reset:"\x1B[0m",underline:"\x1B[4m"},qr={"\x1B[30m":"\x1B[90m","\x1B[31m":"\x1B[91m","\x1B[32m":"\x1B[92m","\x1B[33m":"\x1B[93m","\x1B[34m":"\x1B[94m","\x1B[35m":"\x1B[95m","\x1B[36m":"\x1B[96m","\x1B[37m":"\x1B[97m"};function Wn(t){return(r)=>_r?`${t}${r}${St.reset}`:r}function Ot({bright:t=!1,color:r}){let o=Bun.color(r,"ansi");if(!o)return"";return t?qr[o]||o:o}var Hr=Ar.reduce((t,r)=>{return t[r]=Wn(Ot({color:r})),t[`${r}Bright`]=Wn(Ot({bright:!0,color:r})),t},{}),Lr=Ur.reduce((t,r)=>{return t[r]=Wn(St[r]),t},{}),b={...Hr,...Lr};var O=({prefix:t="",level:r=process.env.DEBUG?0:1}={})=>{function o(...a){if(r<=0){let c=a.join(" ");console.log(wn({level:b.dim("DEBUG"),message:c,prefix:t}))}}function e(...a){if(r<=1){let c=a.join(" ");console.info(wn({level:b.cyan("INFO "),message:c,prefix:t}))}}function i(...a){if(r<=2){let c=a.join(" ");console.warn(wn({level:b.yellow("WARN "),message:c,prefix:t}))}}function s(...a){if(r<=3){let c=a.join(" ");console.error(wn({level:b.red("ERROR"),message:c,prefix:t}))}}function n(a){return O({level:r,prefix:`${t}:${a}`})}return{child:n,debug:o,error:s,info:e,warn:i}},zn=O();function wn({prefix:t,level:r,message:o}){let e=new Date().toISOString().split("T")[1]?.split(".")[0]||"",i=t?`[${t}] `:"";return`${b.dim(e||"")} ${r} ${i}${o}`}var h={arrow:b.yellow,bold:b.bold,boolean:b.cyan,bullet:b.yellow,busy:b.yellow,command:b.green,dim:b.dim,error:b.red,flag:b.yellow,info:b.cyan,number:b.magenta,offline:b.red,online:b.green,separator:b.dim,string:b.green,success:b.green,value:b.cyan,warning:b.yellow};var xe=O({prefix:"cli-core"}).child("error");var j=new Uint32Array(65536),Br=(t,r)=>{let o=t.length,e=r.length,i=1<<o-1,s=-1,n=0,a=o,c=o;while(c--)j[t.charCodeAt(c)]|=1<<c;for(c=0;c<e;c++){let l=j[r.charCodeAt(c)],f=l|n;if(l|=(l&s)+s^s,n|=~(l|s),s&=l,n&i)a++;if(s&i)a--;n=n<<1|1,s=s<<1|~(f|n),n&=f}c=o;while(c--)j[t.charCodeAt(c)]=0;return a},Ir=(t,r)=>{let o=r.length,e=t.length,i=[],s=[],n=Math.ceil(o/32),a=Math.ceil(e/32);for(let u=0;u<n;u++)s[u]=-1,i[u]=0;let c=0;for(;c<a-1;c++){let u=0,E=-1,k=c*32,q=Math.min(32,e)+k;for(let y=k;y<q;y++)j[t.charCodeAt(y)]|=1<<y;for(let y=0;y<o;y++){let B=j[r.charCodeAt(y)],x=s[y/32|0]>>>y&1,w=i[y/32|0]>>>y&1,N=B|u,I=((B|w)&E)+E^E|B|w,Y=u|~(I|E),gn=E&I;if(Y>>>31^x)s[y/32|0]^=1<<y;if(gn>>>31^w)i[y/32|0]^=1<<y;Y=Y<<1|x,gn=gn<<1|w,E=gn|~(N|Y),u=Y&N}for(let y=k;y<q;y++)j[t.charCodeAt(y)]=0}let l=0,f=-1,m=c*32,p=Math.min(32,e-m)+m;for(let u=m;u<p;u++)j[t.charCodeAt(u)]|=1<<u;let d=e;for(let u=0;u<o;u++){let E=j[r.charCodeAt(u)],k=s[u/32|0]>>>u&1,q=i[u/32|0]>>>u&1,y=E|l,B=((E|q)&f)+f^f|E|q,x=l|~(B|f),w=f&B;if(d+=x>>>e-1&1,d-=w>>>e-1&1,x>>>31^k)s[u/32|0]^=1<<u;if(w>>>31^q)i[u/32|0]^=1<<u;x=x<<1|k,w=w<<1|q,f=w|~(y|x),l=x&y}for(let u=m;u<p;u++)j[t.charCodeAt(u)]=0;return d},Ct=(t,r)=>{if(t.length<r.length){let o=r;r=t,t=o}if(r.length===0)return t.length;if(t.length<=32)return Br(t,r);return Ir(t,r)};function Tt(t,r,o=3){return r.map((s)=>({distance:Ct(t.toLowerCase(),s.toLowerCase()),option:s})).filter(({distance:s})=>s<=Math.max(3,t.length/2)).sort((s,n)=>s.distance-n.distance).slice(0,o).map(({option:s})=>s)}function kt(t,r){return r[t.toLowerCase()]||null}var Nt=O({prefix:"cli-core"}).child("graceful");async function tn(t,r={}){let{fallback:o,logLevel:e="warn",message:i="Operation failed gracefully"}=r;try{return await t()}catch(s){let n=s instanceof Error?s.message:String(s);if(Nt[e](`${i}: ${n}`),o)try{await o()}catch(a){Nt.error(`Fallback also failed: ${a instanceof Error?a.message:String(a)}`)}return}}var jr={backoffMultiplier:2,initialDelay:1000,maxAttempts:3,maxDelay:30000,onRetry:(t,r)=>{zn.warn(`Retry attempt ${t}: ${r.message}`)},retryableErrors:["ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENOTFOUND","rate limit","429","503","502","504","npm ERR!","EPUBLISHCONFLICT"]};async function cn(t,r={}){let o={...jr,...r},e=new Error("Operation failed");for(let i=1;i<=o.maxAttempts;i++)try{return await t()}catch(s){if(e=s instanceof Error?s:new Error(String(s)),!o.retryableErrors.some((c)=>e.message.toLowerCase().includes(c.toLowerCase()))||i===o.maxAttempts)throw e;o.onRetry(i,e);let a=Math.min(o.initialDelay*o.backoffMultiplier**(i-1),o.maxDelay);await new Promise((c)=>setTimeout(c,a))}throw e}var H=(t)=>{return t.map=(r)=>H((o)=>r(t(o))),t.or=(r)=>H((o)=>{try{return t(o)}catch(e){return r(o)}}),t},En=()=>"bad banditype"();var vt=(t)=>H((r)=>t.includes(r)?r:En()),Rn=(t)=>H((r)=>typeof r===typeof t?r:En()),fn=()=>Rn(""),Pt=()=>Rn(0),Gt=()=>Rn(!0);var Mt=()=>Rn();var Xt=(t)=>H((r)=>r instanceof t?r:En()),Kn=(t)=>Xt(Object).map((r)=>{let o={};for(let e in r){let i=t(r[e]);i!==void 0&&(o[e]=i)}return o}),rn=(t)=>Xt(Object).map((r)=>{let o={};for(let e in t){let i=t[e](r[e]);i!==void 0&&(o[e]=i)}return o});function Wr(t,r){return H((o)=>{try{return t(o)}catch{try{return r(o)}catch{throw new Error("No matching schema in union")}}})}function Q(t,r){return(o)=>{if(o===void 0)return r;return t(o)}}function _t(){return H((t)=>{let r=Pt()(t);if(!Number.isInteger(r)||r<=0)throw new Error("Must be a positive integer");return r})}function At(){return H((t)=>{let r=fn()(t);try{return new URL(r),r}catch{throw new Error("Must be a valid URL")}})}function Ut(t,r){return H((o)=>{let e=fn()(o);if(!t.test(e))throw new Error(r||`Must match pattern ${t}`);return e})}function mn(t){return{parse(r){try{return t(r)}catch(o){throw new Error(o instanceof Error?o.message:"Validation failed")}},safeParse(r){try{return{data:t(r),success:!0}}catch(o){return{error:o instanceof Error?o:new Error("Validation failed"),success:!1}}},validator:t}}function Z(){return Wr(Mt(),fn())}function V(t){return Q(fn(),t)}function on(t){return Q(Gt(),t)}function On(t,r){return Q(vt(t),r)}import{parseArgs as ro}from"util";var{$:X}=globalThis.Bun;import{join as Bt}from"path";var{$:Lt}=globalThis.Bun;import{tmpdir as zr}from"os";var qt={MACHINES_DIR:"machines",TEMP_DIR:zr()};var Kr=rn({directory:V("./gh-runners"),labels:Z(),name:V("runner"),numberOfMachines:Q(_t(),1),os:On(["osx","linux","windows"],"osx"),overwrite:on(!1),run:on(!1),runnerGroup:Z(),url:Z()}),Jr=mn(Kr),Ht=mn(rn({defaultProfile:Z(),profiles:Kn(Jr.validator)}));var Yr=["hydra.json",".hydra.json","hydra.toml",".hydra.toml"];async function Qr(t=process.cwd()){for(let r of Yr){let o=Bt(t,r);if(await Bun.file(o).exists())return o}return null}async function K(t){let r=t?.configPath||await Qr();if(!r)return null;let o=Bun.file(r);if(!await o.exists())return null;try{let e=await o.text(),i=r.endsWith(".toml")?await Zr(e):JSON.parse(e);return Ht.parse(i)}catch(e){if(e instanceof Error)throw new Error(`Invalid config file: ${e.message}`);throw e}}async function J(t,r){if(!t)return null;let o=r||t.defaultProfile;if(!o)return null;return t.profiles[o]||null}async function Zr(t){let r=Bt(qt.TEMP_DIR,`hydra-config-${Date.now()}.toml`);await Bun.write(r,t);try{let o=await import(r);return await Lt`rm -f ${r}`.quiet(),o.default}catch(o){throw await Lt`rm -f ${r}`.quiet(),new Error(`Failed to parse TOML configuration: ${o}`)}}function ln(){let t=import.meta.path,r=t.substring(0,t.lastIndexOf("/"));return r.substring(0,r.lastIndexOf("/"))}var Vr=rn({directory:V(`${process.cwd()}/gh-runners`),labels:Z(),name:V("runner"),numberOfMachines:Q(Ut(/^\d+$/,"Number of machines must be a positive integer"),"1"),os:On(["osx","linux","windows"],"osx"),overwrite:on(!1),run:on(!1),token:V(process.env.GITHUB_PERSONAL_ACCESS_TOKEN??""),url:At()}),ri=mn(Vr);var F=O({prefix:"WorkerManager"}),G=new Set,It=!1;function Fr(){if(It)return;It=!0;let t=()=>{if(G.size>0)F.info("Cleaning up workers...");jt()};process.on("exit",t),process.on("SIGINT",t),process.on("SIGTERM",t),process.on("uncaughtException",(r)=>{F.error("Uncaught exception:",r),t(),process.exit(1)})}function Dr(t){G.add(t),F.debug(`Worker added. Total workers: ${G.size}`),t.addEventListener("exit",()=>{G.delete(t),F.debug(`Worker exited. Remaining workers: ${G.size}`)})}function no(t){if(G.has(t))t.terminate(),G.delete(t),F.debug(`Worker removed. Remaining workers: ${G.size}`)}function jt(){if(G.size>0){F.info(`Terminating ${G.size} workers...`);for(let t of G)try{t.terminate()}catch(r){F.error("Failed to terminate worker:",r)}G.clear()}}function to(){return G.size}Fr();var Sn={add:Dr,remove:no,get size(){return to()},terminateAll:jt};var M=O({prefix:"createMachines"});async function Wt(){let t=await eo(),{overwrite:r,directory:o,numberOfMachines:e,os:i,run:s,name:n,labels:a,runnerGroup:c}=t,{token:l,url:f}=t;if(!f)throw new Error("URL (-u) parameter is required");if(!l){let d=oo(f),u=await z({message:`No token provided. Would you like to open GitHub to get a runner token?
|
|
43
|
-
${d}`});if(T(u)||!u)throw new Error("Token is required to create runners");M.info("Opening GitHub runner settings..."),await X`open ${d}`.quiet();let E=await P({message:"Enter the runner registration token:",placeholder:"AXXXXXXXXXXXXXXXXXXXXXXXXX",validate:(k)=>{if(!k||k.trim().length===0)return"Token is required";return}});if(T(E))throw new Error("Token is required to create runners");l=E.trim()}if(M.info(`Creating ${e} runners in ${o}`),M.debug(`OS: ${i}, Name: ${n}, Labels: ${a||"none"}`),await Bun.file(o).exists())if(r)M.warn(`Directory ${o} exists, removing...`),await X`rm -rf ${o}`;else throw new Error(`Directory ${o} already exists`);let p=await io({directory:o,os:i});if(await so({directory:o,numberOfMachines:e,overwrite:r,runnerBase:p}),!s){M.info("Runners created but not started");return}ao({directory:o,labels:a,name:n,numberOfMachines:e,runnerGroup:c,token:l,url:f})}function oo(t){try{let r=new URL(t),o=r.pathname.split("/").filter(Boolean);if(r.hostname==="github.com"||r.hostname==="www.github.com"){if(o[0]==="orgs"&&o[1])return`https://github.com/organizations/${o[1]}/settings/actions/runners/new`;else if(o.length>=2)return`https://github.com/${o[0]}/${o[1]}/settings/actions/runners/new`}else if(o[0]==="orgs"&&o[1])return`${r.origin}/organizations/${o[1]}/settings/actions/runners/new`;else if(o.length>=2)return`${r.origin}/${o[0]}/${o[1]}/settings/actions/runners/new`;return t}catch{return t}}async function eo(){let{values:t}=ro({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},labels:{short:"l",type:"string"},name:{default:"runner",short:"n",type:"string"},numberOfMachines:{default:"1",short:"m",type:"string"},os:{default:"osx",short:"s",type:"string"},overwrite:{default:!1,short:"f",type:"boolean"},profile:{short:"p",type:"string"},run:{default:!1,short:"r",type:"boolean"},runnerGroup:{short:"g",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),r=await K({configPath:t.config}),o=await J(r,t.profile),e={directory:t.directory,labels:t.labels,name:t.name,numberOfMachines:t.numberOfMachines,os:t.os,overwrite:t.overwrite,run:t.run,runnerGroup:t.runnerGroup,token:t.token,url:t.url};if(o)return{directory:e.directory??o.directory??`${process.cwd()}/gh-runners`,labels:e.labels??o.labels,name:e.name??o.name??"runner",numberOfMachines:e.numberOfMachines??String(o.numberOfMachines)??"1",os:e.os??o.os??"osx",overwrite:e.overwrite??o.overwrite??!1,run:e.run??o.run??!1,runnerGroup:e.runnerGroup??o.runnerGroup,token:e.token,url:e.url??o.url};return{directory:e.directory,labels:e.labels,name:e.name,numberOfMachines:e.numberOfMachines,os:e.os,overwrite:e.overwrite,run:e.run,runnerGroup:e.runnerGroup,token:e.token,url:e.url}}async function io({directory:t,os:r}){let o=M.child("download");o.info(`Fetching latest runner version for ${r}...`);let e=await cn(async()=>(await X`curl -Ls -o /dev/null -w "%{url_effective}" https://github.com/actions/runner/releases/latest`).text(),{onRetry:(l,f)=>{o.warn(`Retrying GitHub API call (attempt ${l}): ${f.message}`)}}),s=(await X`basename ${e}`).text().trim().replace("v",""),n=`actions-runner-${r}-x64-${s}.tar.gz`,a=`https://github.com/actions/runner/releases/download/v${s}/${n}`;if(o.debug(`Runner version: ${s}`),o.debug(`Download URL: ${a}`),await X`mkdir -p ${t}`,await X`mkdir -p ${t}/machines`,!await Bun.file(`${t}/${n}`).exists())o.info("Downloading runner image..."),await cn(async()=>await X`curl -o ${t}/${n} -L ${a}`,{maxAttempts:5,onRetry:(l,f)=>{o.warn(`Retrying runner download (attempt ${l}): ${f.message}`)}}),o.info("Download complete");else o.info("Runner image already exists, skipping download");return n}async function so({overwrite:t,numberOfMachines:r,directory:o,runnerBase:e}){let i=M.child("extract"),s=Number(r),n=(()=>{try{let f=Bun.spawnSync(["nproc"]);return Number.parseInt(f.stdout.toString().trim(),10)||4}catch{try{let f=Bun.spawnSync(["sysctl","-n","hw.ncpu"]);return Number.parseInt(f.stdout.toString().trim(),10)||4}catch{return 4}}})(),a=Math.min(Math.max(2,Math.floor(n/2)),s,8);i.info(`Extracting ${s} runners with concurrency of ${a}`);let c=Array.from({length:s},(f,m)=>m+1).map((f)=>({execute:async()=>{let m=`${o}/machines/${f}`;if(await Bun.file(m).exists())if(t)i.debug(`Machine ${f} already exists, removing...`),await X`rm -rf ${m}`;else{i.debug(`Machine ${f} already exists, skipping...`);return}await X`mkdir -p ${m}`,await X`tar xzf ${e} -C ${m.replace(`${o}/`,"")}`.cwd(o);let d=`${ln()}/src/runner`;await X`cp -R ${d}/hooks ${m}`,await X`cp -R ${d}/.runner-env ${m}/.runner-env`,i.debug(`Machine ${f} extracted successfully`)},runnerIndex:f})),l=[];for(let f=0;f<c.length;f+=a){let m=c.slice(f,f+a),p=await Promise.allSettled(m.map((d)=>d.execute()));for(let[d,u]of p.entries())if(u.status==="rejected")throw i.error(`Failed to extract runner ${m[d]?.runnerIndex}: ${u.reason}`),u.reason;l.push(...p)}i.info(`Successfully extracted ${s} runners`)}function ao({directory:t,numberOfMachines:r,token:o,url:e,name:i,labels:s,runnerGroup:n}){M.info(`Starting ${r} runners...`);for(let a=1;a<=Number(r);a++){let c=`${ln()}/src/runner-worker.ts`,l=`${i}-${a}`,f=new Worker(c,{name:l,ref:!0});f.addEventListener("open",()=>{M.info(`Worker ${l} started`),f.postMessage({index:a,labels:s,machineCwd:`${t}/machines/${a}`,name:i,runnerGroup:n,token:o,url:e})}),f.addEventListener("message",({data:m})=>{let p=m.type==="error"?"error":"info";M[p](`${l}: ${m.message}`)}),f.addEventListener("error",(m)=>{M.error(`Worker ${l} error:`,m)}),f.addEventListener("exit",(m)=>{M.info(`Worker ${l} exited with code ${m}`)}),Sn.add(f)}M.info("All workers started. Press Ctrl+C to stop all machines")}var zt="0.3.10";var Kt={create:`
|
|
43
|
+
`)},info:(n)=>{h.message(n,{symbol:d.default.blue(cr)})},success:(n)=>{h.message(n,{symbol:d.default.green(mr)})},step:(n)=>{h.message(n,{symbol:d.default.green(rt)})},warn:(n)=>{h.message(n,{symbol:d.default.yellow(lr)})},warning:(n)=>{h.warn(n)},error:(n)=>{h.message(n,{symbol:d.default.red(pr)})}},ui=`${d.default.gray(S)} `;var W=({indicator:n="dots"}={})=>{let o=nt?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],r=nt?80:120,e=process.env.CI==="true",i,s,t=!1,f="",a,c=performance.now(),m=(E)=>{let R=E>1?"Something went wrong":"Canceled";t&&B(R,E)},l=()=>m(2),u=()=>m(1),b=()=>{process.on("uncaughtExceptionMonitor",l),process.on("unhandledRejection",l),process.on("SIGINT",u),process.on("SIGTERM",u),process.on("exit",m)},g=()=>{process.removeListener("uncaughtExceptionMonitor",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u),process.removeListener("exit",m)},$=()=>{if(a===void 0)return;e&&process.stdout.write(`
|
|
44
|
+
`);let E=a.split(`
|
|
45
|
+
`);process.stdout.write(Nn.cursor.move(-999,E.length-1)),process.stdout.write(Nn.erase.down(E.length))},L=(E)=>E.replace(/\.+$/,""),_=(E)=>{let R=(performance.now()-E)/1000,v=Math.floor(R/60),Y=Math.floor(R%60);return v>0?`[${v}m ${Y}s]`:`[${Y}s]`},y=(E="")=>{t=!0,i=Ht(),f=L(E),c=performance.now(),process.stdout.write(`${d.default.gray(S)}
|
|
46
|
+
`);let R=0,v=0;b(),s=setInterval(()=>{if(e&&f===a)return;$(),a=f;let Y=d.default.magenta(o[R]);if(e)process.stdout.write(`${Y} ${f}...`);else if(n==="timer")process.stdout.write(`${Y} ${f} ${_(c)}`);else{let D=".".repeat(Math.floor(v)).slice(0,3);process.stdout.write(`${Y} ${f}${D}`)}R=R+1<o.length?R+1:0,v=v<o.length?v+0.125:0},r)},B=(E="",R=0)=>{t=!1,clearInterval(s),$();let v=R===0?d.default.green(rt):R===1?d.default.red(Pt):d.default.red(Mt);f=L(E??f),n==="timer"?process.stdout.write(`${v} ${f} ${_(c)}
|
|
47
|
+
`):process.stdout.write(`${v} ${f}
|
|
48
|
+
`),g(),i()};return{start:y,stop:B,message:(E="")=>{f=L(E??f)}}},It=async(n,o)=>{let r={},e=Object.keys(n);for(let i of e){let s=n[i],t=await s({results:r})?.catch((f)=>{throw f});if(typeof o?.onCancel=="function"&&U(t)){r[i]="canceled",o.onCancel({results:r});continue}r[i]=t}return r};var dr=!process.env.NO_COLOR&&(process.env.FORCE_COLOR||process.stdout.isTTY),gr=["blue","cyan","gray","green","magenta","red","white","yellow"],hr=["bold","dim","italic","underline","reset"],zt={bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",reset:"\x1B[0m",underline:"\x1B[4m"},br={"\x1B[30m":"\x1B[90m","\x1B[31m":"\x1B[91m","\x1B[32m":"\x1B[92m","\x1B[33m":"\x1B[93m","\x1B[34m":"\x1B[94m","\x1B[35m":"\x1B[95m","\x1B[36m":"\x1B[96m","\x1B[37m":"\x1B[97m"};function st(n){return(o)=>dr?`${n}${o}${zt.reset}`:o}function Kt({bright:n=!1,color:o}){let r=Bun.color(o,"ansi");if(!r)return"";return n?br[r]||r:r}var yr=gr.reduce((n,o)=>{return n[o]=st(Kt({color:o})),n[`${o}Bright`]=st(Kt({bright:!0,color:o})),n},{}),wr=hr.reduce((n,o)=>{return n[o]=st(zt[o]),n},{}),w={...yr,...wr};var x=({prefix:n="",level:o=process.env.DEBUG?0:1}={})=>{function r(...f){if(o<=0){let a=f.join(" ");console.log(An({level:w.dim("DEBUG"),message:a,prefix:n}))}}function e(...f){if(o<=1){let a=f.join(" ");console.info(An({level:w.cyan("INFO "),message:a,prefix:n}))}}function i(...f){if(o<=2){let a=f.join(" ");console.warn(An({level:w.yellow("WARN "),message:a,prefix:n}))}}function s(...f){if(o<=3){let a=f.join(" ");console.error(An({level:w.red("ERROR"),message:a,prefix:n}))}}function t(f){return x({level:o,prefix:`${n}:${f}`})}return{child:t,debug:r,error:s,info:e,warn:i}},ft=x();function An({prefix:n,level:o,message:r}){let e=new Date().toISOString().split("T")[1]?.split(".")[0]||"",i=n?`[${n}] `:"";return`${w.dim(e||"")} ${o} ${i}${r}`}var p={arrow:w.yellow,bold:w.bold,boolean:w.cyan,bullet:w.yellow,busy:w.yellow,command:w.green,dim:w.dim,error:w.red,flag:w.yellow,info:w.cyan,number:w.magenta,offline:w.red,online:w.green,separator:w.dim,string:w.green,success:w.green,value:w.cyan,warning:w.yellow};var Ai=x({prefix:"cli-core"}).child("error");var j=new Uint32Array(65536),xr=(n,o)=>{let r=n.length,e=o.length,i=1<<r-1,s=-1,t=0,f=r,a=r;while(a--)j[n.charCodeAt(a)]|=1<<a;for(a=0;a<e;a++){let c=j[o.charCodeAt(a)],m=c|t;if(c|=(c&s)+s^s,t|=~(c|s),s&=c,t&i)f++;if(s&i)f--;t=t<<1|1,s=s<<1|~(m|t),t&=m}a=r;while(a--)j[n.charCodeAt(a)]=0;return f},$r=(n,o)=>{let r=o.length,e=n.length,i=[],s=[],t=Math.ceil(r/32),f=Math.ceil(e/32);for(let g=0;g<t;g++)s[g]=-1,i[g]=0;let a=0;for(;a<f-1;a++){let g=0,$=-1,L=a*32,_=Math.min(32,e)+L;for(let y=L;y<_;y++)j[n.charCodeAt(y)]|=1<<y;for(let y=0;y<r;y++){let B=j[o.charCodeAt(y)],E=s[y/32|0]>>>y&1,R=i[y/32|0]>>>y&1,v=B|g,Y=((B|R)&$)+$^$|B|R,D=g|~(Y|$),xn=$&Y;if(D>>>31^E)s[y/32|0]^=1<<y;if(xn>>>31^R)i[y/32|0]^=1<<y;D=D<<1|E,xn=xn<<1|R,$=xn|~(v|D),g=D&v}for(let y=L;y<_;y++)j[n.charCodeAt(y)]=0}let c=0,m=-1,l=a*32,u=Math.min(32,e-l)+l;for(let g=l;g<u;g++)j[n.charCodeAt(g)]|=1<<g;let b=e;for(let g=0;g<r;g++){let $=j[o.charCodeAt(g)],L=s[g/32|0]>>>g&1,_=i[g/32|0]>>>g&1,y=$|c,B=(($|_)&m)+m^m|$|_,E=c|~(B|m),R=m&B;if(b+=E>>>e-1&1,b-=R>>>e-1&1,E>>>31^L)s[g/32|0]^=1<<g;if(R>>>31^_)i[g/32|0]^=1<<g;E=E<<1|L,R=R<<1|_,m=R|~(y|E),c=E&y}for(let g=l;g<u;g++)j[n.charCodeAt(g)]=0;return b},kt=(n,o)=>{if(n.length<o.length){let r=o;o=n,n=r}if(o.length===0)return n.length;if(n.length<=32)return xr(n,o);return $r(n,o)};function Jt(n,o,r=3){return o.map((s)=>({distance:kt(n.toLowerCase(),s.toLowerCase()),option:s})).filter(({distance:s})=>s<=Math.max(3,n.length/2)).sort((s,t)=>s.distance-t.distance).slice(0,r).map(({option:s})=>s)}function Yt(n,o){return o[n.toLowerCase()]||null}var jt=x({prefix:"cli-core"}).child("graceful");async function an(n,o={}){let{fallback:r,logLevel:e="warn",message:i="Operation failed gracefully"}=o;try{return await n()}catch(s){let t=s instanceof Error?s.message:String(s);if(jt[e](`${i}: ${t}`),r)try{await r()}catch(f){jt.error(`Fallback also failed: ${f instanceof Error?f.message:String(f)}`)}return}}var Er={backoffMultiplier:2,initialDelay:1000,maxAttempts:3,maxDelay:30000,onRetry:(n,o)=>{ft.warn(`Retry attempt ${n}: ${o.message}`)},retryableErrors:["ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENOTFOUND","rate limit","429","503","502","504","npm ERR!","EPUBLISHCONFLICT"]};async function Z(n,o={}){let r={...Er,...o},e=new Error("Operation failed");for(let i=1;i<=r.maxAttempts;i++)try{return await n()}catch(s){if(e=s instanceof Error?s:new Error(String(s)),!r.retryableErrors.some((a)=>e.message.toLowerCase().includes(a.toLowerCase()))||i===r.maxAttempts)throw e;r.onRetry(i,e);let f=Math.min(r.initialDelay*r.backoffMultiplier**(i-1),r.maxDelay);await new Promise((a)=>setTimeout(a,f))}throw e}var k=(n)=>{return n.map=(o)=>k((r)=>o(n(r))),n.or=(o)=>k((r)=>{try{return n(r)}catch(e){return o(r)}}),n},Xn=()=>"bad banditype"();var Zt=(n)=>k((o)=>n.includes(o)?o:Xn()),_n=(n)=>k((o)=>typeof o===typeof n?o:Xn()),gn=()=>_n(""),Qt=()=>_n(0),Vt=()=>_n(!0);var Ft=()=>_n();var Dt=(n)=>k((o)=>o instanceof n?o:Xn()),at=(n)=>Dt(Object).map((o)=>{let r={};for(let e in o){let i=n(o[e]);i!==void 0&&(r[e]=i)}return r}),cn=(n)=>Dt(Object).map((o)=>{let r={};for(let e in n){let i=n[e](o[e]);i!==void 0&&(r[e]=i)}return r});function Or(n,o){return k((r)=>{try{return n(r)}catch{try{return o(r)}catch{throw new Error("No matching schema in union")}}})}function nn(n,o){return(r)=>{if(r===void 0)return o;return n(r)}}function no(){return k((n)=>{let o=Qt()(n);if(!Number.isInteger(o)||o<=0)throw new Error("Must be a positive integer");return o})}function to(){return k((n)=>{let o=gn()(n);try{return new URL(o),o}catch{throw new Error("Must be a valid URL")}})}function oo(n,o){return k((r)=>{let e=gn()(r);if(!n.test(e))throw new Error(o||`Must match pattern ${n}`);return e})}function hn(n){return{parse(o){try{return n(o)}catch(r){throw new Error(r instanceof Error?r.message:"Validation failed")}},safeParse(o){try{return{data:n(o),success:!0}}catch(r){return{error:r instanceof Error?r:new Error("Validation failed"),success:!1}}},validator:n}}function tn(){return Or(Ft(),gn())}function on(n){return nn(gn(),n)}function mn(n){return nn(Vt(),n)}function Un(n,o){return nn(Zt(n),o)}import{existsSync as V}from"fs";import{copyFile as Ar,mkdir as ln,readdir as mt}from"fs/promises";import{join as T,resolve as Xr}from"path";import{parseArgs as _r}from"util";var{$:pn}=globalThis.Bun;import{join as so}from"path";var{$:io}=globalThis.Bun;import{tmpdir as Rr}from"os";var ro={MACHINES_DIR:"machines",TEMP_DIR:Rr()};var Sr=cn({directory:on("./gh-runners"),labels:tn(),name:on("runner"),numberOfMachines:nn(no(),1),os:Un(["osx","linux","windows"],"osx"),overwrite:mn(!1),run:mn(!1),runnerGroup:tn(),url:tn()}),Tr=hn(Sr),eo=hn(cn({defaultProfile:tn(),profiles:at(Tr.validator)}));var Lr=["hydra.json",".hydra.json","hydra.toml",".hydra.toml"];async function Nr(n=process.cwd()){for(let o of Lr){let r=so(n,o);if(await Bun.file(r).exists())return r}return null}async function A(n){let o=n?.configPath||await Nr();if(!o)return null;let r=Bun.file(o);if(!await r.exists())return null;try{let e=await r.text(),i=o.endsWith(".toml")?await Gr(e):JSON.parse(e);return eo.parse(i)}catch(e){if(e instanceof Error)throw new Error(`Invalid config file: ${e.message}`);throw e}}async function X(n,o){if(!n)return null;let r=o||n.defaultProfile;if(!r)return null;return n.profiles[r]||null}async function Gr(n){let o=so(ro.TEMP_DIR,`hydra-config-${Date.now()}.toml`);await Bun.write(o,n);try{let r=await import(o);return await io`rm -f ${o}`.quiet(),r.default}catch(r){throw await io`rm -f ${o}`.quiet(),new Error(`Failed to parse TOML configuration: ${r}`)}}var Ur=x({prefix:"hydra"}).child("backup");async function qr(){let{values:n}=_r({allowPositionals:!0,args:Bun.argv,options:{compress:{default:!0,type:"boolean"},config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},list:{default:!1,short:"l",type:"boolean"},output:{short:"o",type:"string"},profile:{short:"p",type:"string"},restore:{short:"r",type:"string"}},strict:!0}),o=await A({configPath:n.config}),r=await X(o,n.profile);return{compress:n.compress,directory:n.directory||r?.directory||`${process.cwd()}/gh-runners`,list:n.list,output:n.output,restore:n.restore}}async function fo(){try{let n=await qr();if(n.list){await vr(n.output||T(n.directory,"backups"));return}if(n.restore){await Hr(n);return}await Cr(n)}catch(n){Ur.error("Backup operation failed:",n),process.exit(1)}}async function Cr(n){let o=Xr(n.directory),r=T(o,"machines");if(!V(r)){h.error(`No runners found in ${n.directory}`);return}let e=W();e.start("Creating backup...");try{let i=await mt(r);if(i.length===0){e.stop("No runners to backup");return}let s=`backup-${new Date().toISOString().replace(/[:.]/g,"-")}`,t=n.output||T(o,"backups"),f=T(t,s);await ln(f,{recursive:!0});let a=0,c=[];for(let l of i){let u=T(r,l),b=T(f,"runners",l);await ln(b,{recursive:!0});let g=[".runner",".credentials",".credentials_rsaparams",".path",".env","config.sh"];for(let $ of g){let L=T(u,$);if(V(L)){let _=T(b,$);await Ar(L,_);let y=await Bun.file(L).stat();a+=y.size,c.push(`runners/${l}/${$}`)}}}let m={configFiles:c,date:new Date,id:s,runnerCount:i.length,size:a};if(await Bun.write(T(f,"metadata.json"),JSON.stringify(m,null,2)),n.compress){e.message("Compressing backup..."),await pn`cd ${t} && tar -czf ${s}.tar.gz ${s}`.quiet(),await pn`rm -rf ${f}`.quiet();let l=await Bun.file(T(t,`${s}.tar.gz`)).stat();e.stop(`Backup created: ${s}.tar.gz (${ct(l.size)})`)}else e.stop(`Backup created: ${s} (${ct(a)})`);h.success(`Backed up ${i.length} runner(s)`)}catch(i){throw e.stop("Backup failed"),i}}async function vr(n){if(!V(n)){h.info("No backups found");return}let o=W();o.start("Scanning backups...");try{let r=await mt(n),e=[];for(let i of r){let s=T(n,i);if(i.endsWith(".tar.gz")){let t=i.replace(".tar.gz",""),f=await Bun.file(s).stat();e.push({configFiles:[],date:new Date(f.mtime),id:t,runnerCount:0,size:f.size})}else{let t=T(s,"metadata.json");if(V(t)){let f=await Bun.file(t).json();e.push(f)}}}if(o.stop("Found backups"),e.length===0){h.info("No backups found");return}console.log(),console.log(p.bold("\uD83D\uDCE6 Available Backups")),console.log("\u2500".repeat(80));for(let i of e.sort((s,t)=>new Date(t.date).getTime()-new Date(s.date).getTime())){let s=new Date(i.date).toLocaleString(),t=ct(i.size),f=i.runnerCount>0?`${i.runnerCount} runners`:"compressed";console.log(`${p.value(i.id)}`),console.log(` Date: ${s}`),console.log(` Size: ${t}`),console.log(` Content: ${f}`),console.log()}}catch(r){throw o.stop("Failed to list backups"),r}}async function Hr(n){let o=n.output||T(n.directory,"backups"),r=T(o,n.restore),e=`${r}.tar.gz`,i=V(e),s=V(r);if(!i&&!s){h.error(`Backup not found: ${n.restore}`);return}if(!await C({initialValue:!1,message:"This will overwrite existing runner configurations. Continue?"})){h.info("Restore cancelled");return}let f=W();f.start("Restoring backup...");try{let a=r;if(i){f.message("Extracting backup...");let g=T(o,`temp-${Date.now()}`);await ln(g,{recursive:!0}),await pn`cd ${g} && tar -xzf ${e}`.quiet(),a=T(g,n.restore)}let c=T(a,"metadata.json");if(!V(c))throw new Error("Invalid backup: metadata.json not found");await Bun.file(c).json();let m=T(a,"runners"),l=T(n.directory,"machines");await ln(l,{recursive:!0});let u=await mt(m),b=0;for(let g of u){let $=T(m,g),L=T(l,g);if(V(L)){let _=await Gn({message:`Runner ${g} already exists. What should we do?`,options:[{label:"Skip",value:"skip"},{label:"Overwrite",value:"overwrite"},{label:"Rename",value:"rename"}]});if(_==="skip")continue;else if(_==="rename"){let y=await q({message:"Enter new runner name:",placeholder:`${g}-restored`});if(!y)continue;let B=T(l,y);await ln(B,{recursive:!0}),await pn`cp -r ${$}/* ${B}/`.quiet(),b++;continue}}await ln(L,{recursive:!0}),await pn`cp -r ${$}/* ${L}/`.quiet(),b++}if(i){let g=a.replace(`/${n.restore}`,"");await pn`rm -rf ${g}`.quiet()}f.stop("Restore completed"),h.success(`Restored ${b} runner(s) from backup ${n.restore}`)}catch(a){throw f.stop("Restore failed"),a}}function ct(n){if(n<1024)return`${n}B`;if(n<1048576)return`${(n/1024).toFixed(1)}KB`;if(n<1073741824)return`${(n/1048576).toFixed(1)}MB`;return`${(n/1073741824).toFixed(2)}GB`}import{parseArgs as Kr}from"util";var{$:I}=globalThis.Bun;function bn(){let n=import.meta.path,o=n.substring(0,n.lastIndexOf("/"));return o.substring(0,o.lastIndexOf("/"))}var Pr=cn({directory:on(`${process.cwd()}/gh-runners`),labels:tn(),name:on("runner"),numberOfMachines:nn(oo(/^\d+$/,"Number of machines must be a positive integer"),"1"),os:Un(["osx","linux","windows"],"osx"),overwrite:mn(!1),run:mn(!1),token:on(process.env.GITHUB_PERSONAL_ACCESS_TOKEN??""),url:to()}),Os=hn(Pr);var rn=x({prefix:"WorkerManager"}),P=new Set,ao=!1;function Mr(){if(ao)return;ao=!0;let n=()=>{if(P.size>0)rn.info("Cleaning up workers...");co()};process.on("exit",n),process.on("SIGINT",n),process.on("SIGTERM",n),process.on("uncaughtException",(o)=>{rn.error("Uncaught exception:",o),n(),process.exit(1)})}function Br(n){P.add(n),rn.debug(`Worker added. Total workers: ${P.size}`),n.addEventListener("exit",()=>{P.delete(n),rn.debug(`Worker exited. Remaining workers: ${P.size}`)})}function Wr(n){if(P.has(n))n.terminate(),P.delete(n),rn.debug(`Worker removed. Remaining workers: ${P.size}`)}function co(){if(P.size>0){rn.info(`Terminating ${P.size} workers...`);for(let n of P)try{n.terminate()}catch(o){rn.error("Failed to terminate worker:",o)}P.clear()}}function Ir(){return P.size}Mr();var qn={add:Br,remove:Wr,get size(){return Ir()},terminateAll:co};var M=x({prefix:"createMachines"});async function Cn(){let n=await kr(),{overwrite:o,directory:r,numberOfMachines:e,os:i,run:s,name:t,labels:f,runnerGroup:a}=n,{token:c,url:m}=n;if(!m)throw new Error("URL (-u) parameter is required");if(!c){let b=zr(m),g=await C({message:`No token provided. Would you like to open GitHub to get a runner token?
|
|
49
|
+
${b}`});if(U(g)||!g)throw new Error("Token is required to create runners");M.info("Opening GitHub runner settings..."),await I`open ${b}`.quiet();let $=await q({message:"Enter the runner registration token:",placeholder:"AXXXXXXXXXXXXXXXXXXXXXXXXX",validate:(L)=>{if(!L||L.trim().length===0)return"Token is required";return}});if(U($))throw new Error("Token is required to create runners");c=$.trim()}if(M.info(`Creating ${e} runners in ${r}`),M.debug(`OS: ${i}, Name: ${t}, Labels: ${f||"none"}`),await Bun.file(r).exists())if(o)M.warn(`Directory ${r} exists, removing...`),await I`rm -rf ${r}`;else throw new Error(`Directory ${r} already exists`);let u=await Jr({directory:r,os:i});if(await Yr({directory:r,numberOfMachines:e,overwrite:o,runnerBase:u}),!s){M.info("Runners created but not started");return}jr({directory:r,labels:f,name:t,numberOfMachines:e,runnerGroup:a,token:c,url:m})}function zr(n){try{let o=new URL(n),r=o.pathname.split("/").filter(Boolean);if(o.hostname==="github.com"||o.hostname==="www.github.com"){if(r[0]==="orgs"&&r[1])return`https://github.com/organizations/${r[1]}/settings/actions/runners/new`;else if(r.length>=2)return`https://github.com/${r[0]}/${r[1]}/settings/actions/runners/new`}else if(r[0]==="orgs"&&r[1])return`${o.origin}/organizations/${r[1]}/settings/actions/runners/new`;else if(r.length>=2)return`${o.origin}/${r[0]}/${r[1]}/settings/actions/runners/new`;return n}catch{return n}}async function kr(){let{values:n}=Kr({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},labels:{short:"l",type:"string"},name:{default:"runner",short:"n",type:"string"},numberOfMachines:{default:"1",short:"m",type:"string"},os:{default:"osx",short:"s",type:"string"},overwrite:{default:!1,short:"f",type:"boolean"},profile:{short:"p",type:"string"},run:{default:!1,short:"r",type:"boolean"},runnerGroup:{short:"g",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),o=await A({configPath:n.config}),r=await X(o,n.profile),e={directory:n.directory,labels:n.labels,name:n.name,numberOfMachines:n.numberOfMachines,os:n.os,overwrite:n.overwrite,run:n.run,runnerGroup:n.runnerGroup,token:n.token,url:n.url};if(r)return{directory:e.directory??r.directory??`${process.cwd()}/gh-runners`,labels:e.labels??r.labels,name:e.name??r.name??"runner",numberOfMachines:e.numberOfMachines??String(r.numberOfMachines)??"1",os:e.os??r.os??"osx",overwrite:e.overwrite??r.overwrite??!1,run:e.run??r.run??!1,runnerGroup:e.runnerGroup??r.runnerGroup,token:e.token,url:e.url??r.url};return{directory:e.directory,labels:e.labels,name:e.name,numberOfMachines:e.numberOfMachines,os:e.os,overwrite:e.overwrite,run:e.run,runnerGroup:e.runnerGroup,token:e.token,url:e.url}}async function Jr({directory:n,os:o}){let r=M.child("download");r.info(`Fetching latest runner version for ${o}...`);let e=await Z(async()=>(await I`curl -Ls -o /dev/null -w "%{url_effective}" https://github.com/actions/runner/releases/latest`).text(),{onRetry:(c,m)=>{r.warn(`Retrying GitHub API call (attempt ${c}): ${m.message}`)}}),s=(await I`basename ${e}`).text().trim().replace("v",""),t=`actions-runner-${o}-x64-${s}.tar.gz`,f=`https://github.com/actions/runner/releases/download/v${s}/${t}`;if(r.debug(`Runner version: ${s}`),r.debug(`Download URL: ${f}`),await I`mkdir -p ${n}`,await I`mkdir -p ${n}/machines`,!await Bun.file(`${n}/${t}`).exists())r.info("Downloading runner image..."),await Z(async()=>await I`curl -o ${n}/${t} -L ${f}`,{maxAttempts:5,onRetry:(c,m)=>{r.warn(`Retrying runner download (attempt ${c}): ${m.message}`)}}),r.info("Download complete");else r.info("Runner image already exists, skipping download");return t}async function Yr({overwrite:n,numberOfMachines:o,directory:r,runnerBase:e}){let i=M.child("extract"),s=Number(o),t=(()=>{try{let m=Bun.spawnSync(["nproc"]);return Number.parseInt(m.stdout.toString().trim(),10)||4}catch{try{let m=Bun.spawnSync(["sysctl","-n","hw.ncpu"]);return Number.parseInt(m.stdout.toString().trim(),10)||4}catch{return 4}}})(),f=Math.min(Math.max(2,Math.floor(t/2)),s,8);i.info(`Extracting ${s} runners with concurrency of ${f}`);let a=Array.from({length:s},(m,l)=>l+1).map((m)=>({execute:async()=>{let l=`${r}/machines/${m}`;if(await Bun.file(l).exists())if(n)i.debug(`Machine ${m} already exists, removing...`),await I`rm -rf ${l}`;else{i.debug(`Machine ${m} already exists, skipping...`);return}await I`mkdir -p ${l}`,await I`tar xzf ${e} -C ${l.replace(`${r}/`,"")}`.cwd(r);let b=`${bn()}/src/runner`;await I`cp -R ${b}/hooks ${l}`,await I`cp -R ${b}/.runner-env ${l}/.runner-env`,i.debug(`Machine ${m} extracted successfully`)},runnerIndex:m})),c=[];for(let m=0;m<a.length;m+=f){let l=a.slice(m,m+f),u=await Promise.allSettled(l.map((b)=>b.execute()));for(let[b,g]of u.entries())if(g.status==="rejected")throw i.error(`Failed to extract runner ${l[b]?.runnerIndex}: ${g.reason}`),g.reason;c.push(...u)}i.info(`Successfully extracted ${s} runners`)}function jr({directory:n,numberOfMachines:o,token:r,url:e,name:i,labels:s,runnerGroup:t}){M.info(`Starting ${o} runners...`);for(let f=1;f<=Number(o);f++){let a=`${bn()}/src/runner-worker.ts`,c=`${i}-${f}`,m=new Worker(a,{name:c,ref:!0});m.addEventListener("open",()=>{M.info(`Worker ${c} started`),m.postMessage({index:f,labels:s,machineCwd:`${n}/machines/${f}`,name:i,runnerGroup:t,token:r,url:e})}),m.addEventListener("message",({data:l})=>{let u=l.type==="error"?"error":"info";M[u](`${c}: ${l.message}`)}),m.addEventListener("error",(l)=>{M.error(`Worker ${c} error:`,l)}),m.addEventListener("exit",(l)=>{M.info(`Worker ${c} exited with code ${l}`)}),qn.add(m)}M.info("All workers started. Press Ctrl+C to stop all machines")}import{existsSync as yn}from"fs";import{readdir as mo}from"fs/promises";import{join as F,resolve as Zr}from"path";import{parseArgs as Qr}from"util";var{$:lt}=globalThis.Bun;var Vr=x({prefix:"hydra"}).child("health");async function Fr(){let{values:n}=Qr({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},fix:{default:!1,short:"f",type:"boolean"},json:{default:!1,short:"j",type:"boolean"},profile:{short:"p",type:"string"},runner:{short:"r",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),o=await A({configPath:n.config}),r=await X(o,n.profile);return{directory:n.directory||r?.directory||`${process.cwd()}/gh-runners`,fix:n.fix,json:n.json,runner:n.runner,token:n.token,url:n.url||r?.url}}async function lo(){try{let n=await Fr(),o=Zr(n.directory),r=F(o,"machines");if(!yn(r)){h.error(`No runners found in ${n.directory}`);return}let e=W();e.start("Performing health checks...");let i=await mo(r),s=[];for(let t of i){if(n.runner&&t!==n.runner)continue;let f=F(r,t),a=await Dr(t,f,n);s.push(a)}if(e.stop("Health checks completed"),n.json){console.log(JSON.stringify(s,null,2));return}if(re(s),n.fix)await ee(s,n)}catch(n){Vr.error("Failed to perform health checks:",n),process.exit(1)}}async function Dr(n,o,r){let e=[],i={configuration:!1,connectivity:!1,disk:{percentage:0,total:0,used:0},lastActivity:null,process:!1};try{let t=F(o,".runner");if(yn(t)){let f=await Bun.file(t).text(),a=await ne(f.trim());if(i.process=a,!a)e.push("Runner process is not running")}else e.push("No PID file found")}catch{e.push("Could not check process status")}try{let t=await te(o);if(i.disk=t,t.percentage>90)e.push(`Low disk space: ${t.percentage.toFixed(1)}% used`)}catch{e.push("Could not check disk space")}try{let t=F(o,"_diag");if(yn(t)){let f=await mo(t),a=null;for(let c of f)if(c.endsWith(".log")){let m=await Bun.file(F(t,c)).stat();if(!a||m.mtime>a)a=new Date(m.mtime)}if(i.lastActivity=a,a){let c=(Date.now()-a.getTime())/3600000;if(c>24)e.push(`No activity for ${Math.floor(c)} hours`)}}}catch{e.push("Could not check last activity")}try{let t=F(o,".runner"),f=F(o,".credentials");if(i.configuration=yn(t)&&yn(f),!i.configuration)e.push("Missing configuration files")}catch{e.push("Could not check configuration")}if(r.token&&r.url)try{let t=await oe(r.url,r.token);if(i.connectivity=t,!t)e.push("Cannot connect to GitHub API")}catch{e.push("Failed to check GitHub connectivity")}let s="healthy";if(e.length===0)s="healthy";else if(e.some((t)=>t.includes("not running")||t.includes("Missing configuration")||t.includes("Cannot connect")))s="critical";else if(e.length>0)s="warning";return{checks:i,issues:e,runner:n,status:s}}async function ne(n){try{return await lt`kill -0 ${n}`.quiet(),!0}catch{return!1}}async function te(n){let r=(await lt`df -k ${n} | tail -1`.text()).trim().split(/\s+/),e=parseInt(r[1]||"0",10)*1024,i=parseInt(r[2]||"0",10)*1024;return{percentage:parseInt(r[4]?.replace("%","")||"0",10),total:e,used:i}}async function oe(n,o){return Z(async()=>{let r=n.match(/github\.com[:/]([^/]+)(?:\/([^/.]+))?/);if(!r)return!1;let[,e,i]=r,s=i?`https://api.github.com/repos/${e}/${i}`:`https://api.github.com/orgs/${e}`;return(await fetch(s,{headers:{Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${o}`}})).ok},{maxAttempts:3})}function re(n){console.log(),console.log(p.bold("\uD83C\uDFE5 Runner Health Status")),console.log("\u2500".repeat(80));let o={critical:"\u274C",healthy:"\u2705",unknown:"\u2753",warning:"\u26A0\uFE0F"},r={critical:p.error,healthy:p.success,unknown:p.dim,warning:p.warning};for(let i of n){let s=o[i.status],t=r[i.status];if(console.log(`${s} ${p.bold(`Runner ${i.runner}`)}: ${t(i.status.toUpperCase())}`),console.log(` Process: ${i.checks.process?"\u2705 Running":"\u274C Not running"}`),console.log(` Config: ${i.checks.configuration?"\u2705 Valid":"\u274C Missing"}`),i.checks.disk.total>0){let f=i.checks.disk.percentage>90?p.error:p.success;console.log(` Disk: ${f(`${i.checks.disk.percentage.toFixed(1)}% used`)}`)}if(i.checks.lastActivity){let a=(Date.now()-i.checks.lastActivity.getTime())/3600000>24?p.warning:p.success;console.log(` Last Activity: ${a(ie(i.checks.lastActivity))}`)}if(i.checks.connectivity!==null)console.log(` GitHub API: ${i.checks.connectivity?"\u2705 Connected":"\u274C Disconnected"}`);if(i.issues.length>0){console.log(" Issues:");for(let f of i.issues)console.log(` - ${p.dim(f)}`)}console.log()}let e={critical:n.filter((i)=>i.status==="critical").length,healthy:n.filter((i)=>i.status==="healthy").length,total:n.length,warning:n.filter((i)=>i.status==="warning").length};console.log("\u2500".repeat(80)),console.log(`Summary: Total: ${e.total} | ${p.success(`Healthy: ${e.healthy}`)} | ${p.warning(`Warning: ${e.warning}`)} | ${p.error(`Critical: ${e.critical}`)}`)}async function ee(n,o){let r=n.filter((i)=>i.status==="critical");if(r.length===0){h.info("No critical issues found that require fixing");return}if(console.log(),!await C({initialValue:!1,message:`Found ${r.length} runners with critical issues. Attempt to fix?`}))return;for(let i of r){if(console.log(),h.info(`Attempting to fix runner ${i.runner}...`),!i.checks.process&&i.checks.configuration){h.info("Attempting to restart runner...");try{let s=F(o.directory,"machines",i.runner);await lt`cd ${s} && ./run.sh`.quiet(),h.success(`Runner ${i.runner} restarted successfully`)}catch(s){h.error(`Failed to restart runner ${i.runner}`)}}if(!i.checks.configuration)h.warning(`Runner ${i.runner} needs to be reconfigured. Run 'hydra create' to set up again.`)}}function ie(n){let r=new Date().getTime()-n.getTime(),e=Math.floor(r/3600000);if(e<1)return`${Math.floor(r/60000)}m ago`;if(e<24)return`${e}h ago`;return`${Math.floor(e/24)}d ago`}var po="0.4.0";var uo={backup:`
|
|
50
|
+
hydra backup - Backup and restore runner configurations
|
|
51
|
+
|
|
52
|
+
USAGE
|
|
53
|
+
hydra backup [options]
|
|
54
|
+
|
|
55
|
+
OPTIONS
|
|
56
|
+
-d, --directory Runners directory [string]
|
|
57
|
+
-o, --output Backup output directory [string]
|
|
58
|
+
-l, --list List available backups [boolean]
|
|
59
|
+
-r, --restore Restore from backup ID [string]
|
|
60
|
+
--compress Compress backup (tar.gz) [boolean] (default: true)
|
|
61
|
+
-p, --profile Configuration profile [string]
|
|
62
|
+
-c, --config Configuration file path [string]
|
|
63
|
+
|
|
64
|
+
EXAMPLES
|
|
65
|
+
# Create a backup
|
|
66
|
+
hydra backup
|
|
67
|
+
|
|
68
|
+
# Create backup in custom location
|
|
69
|
+
hydra backup -o /path/to/backups
|
|
70
|
+
|
|
71
|
+
# List available backups
|
|
72
|
+
hydra backup --list
|
|
73
|
+
|
|
74
|
+
# Restore from backup
|
|
75
|
+
hydra backup --restore backup-2024-01-15T10-30-00-000Z
|
|
76
|
+
|
|
77
|
+
# Create uncompressed backup
|
|
78
|
+
hydra backup --no-compress
|
|
79
|
+
|
|
80
|
+
NOTES
|
|
81
|
+
- Backs up runner configuration files (.runner, .credentials, etc.)
|
|
82
|
+
- Does NOT backup work directories or logs
|
|
83
|
+
- Compressed backups save space but take longer
|
|
84
|
+
- Restore will prompt before overwriting existing runners
|
|
85
|
+
`,create:`
|
|
44
86
|
hydra create - Create and register new GitHub runner machines
|
|
45
87
|
|
|
46
88
|
USAGE
|
|
@@ -67,6 +109,37 @@ EXAMPLES
|
|
|
67
109
|
|
|
68
110
|
# Create using profile
|
|
69
111
|
hydra create -p production -t TOKEN
|
|
112
|
+
`,health:`
|
|
113
|
+
hydra health - Check runner health and diagnose issues
|
|
114
|
+
|
|
115
|
+
USAGE
|
|
116
|
+
hydra health [options]
|
|
117
|
+
|
|
118
|
+
OPTIONS
|
|
119
|
+
-d, --directory Runners directory [string]
|
|
120
|
+
-r, --runner Specific runner ID [string]
|
|
121
|
+
-t, --token GitHub Personal Access Token [string]
|
|
122
|
+
-u, --url GitHub repository or org URL [string]
|
|
123
|
+
-f, --fix Attempt to fix issues [boolean]
|
|
124
|
+
-j, --json Output in JSON format [boolean]
|
|
125
|
+
-p, --profile Configuration profile [string]
|
|
126
|
+
-c, --config Configuration file path [string]
|
|
127
|
+
|
|
128
|
+
EXAMPLES
|
|
129
|
+
# Check health of all runners
|
|
130
|
+
hydra health
|
|
131
|
+
|
|
132
|
+
# Check specific runner
|
|
133
|
+
hydra health --runner 1
|
|
134
|
+
|
|
135
|
+
# Check with GitHub connectivity test
|
|
136
|
+
hydra health -t TOKEN -u URL
|
|
137
|
+
|
|
138
|
+
# Attempt to fix issues
|
|
139
|
+
hydra health --fix
|
|
140
|
+
|
|
141
|
+
# Output as JSON
|
|
142
|
+
hydra health --json
|
|
70
143
|
`,init:`
|
|
71
144
|
hydra init - Initialize a new Hydra configuration file
|
|
72
145
|
|
|
@@ -82,6 +155,32 @@ EXAMPLES
|
|
|
82
155
|
|
|
83
156
|
# Initialize with TOML format
|
|
84
157
|
hydra init --toml
|
|
158
|
+
`,logs:`
|
|
159
|
+
hydra logs - View runner logs and diagnostics
|
|
160
|
+
|
|
161
|
+
USAGE
|
|
162
|
+
hydra logs [options]
|
|
163
|
+
|
|
164
|
+
OPTIONS
|
|
165
|
+
-d, --directory Runners directory [string]
|
|
166
|
+
-l, --list List all available logs [boolean]
|
|
167
|
+
-r, --runner Specific runner ID [string]
|
|
168
|
+
-t, --type Log type (runner/worker/actions) [string]
|
|
169
|
+
-p, --profile Configuration profile [string]
|
|
170
|
+
-c, --config Configuration file path [string]
|
|
171
|
+
|
|
172
|
+
EXAMPLES
|
|
173
|
+
# View logs interactively
|
|
174
|
+
hydra logs
|
|
175
|
+
|
|
176
|
+
# List all available logs
|
|
177
|
+
hydra logs --list
|
|
178
|
+
|
|
179
|
+
# View specific runner's log
|
|
180
|
+
hydra logs --runner 1 --type runner
|
|
181
|
+
|
|
182
|
+
# View logs using profile
|
|
183
|
+
hydra logs -p production
|
|
85
184
|
`,remove:`
|
|
86
185
|
hydra remove - Remove GitHub runner machines
|
|
87
186
|
|
|
@@ -128,6 +227,45 @@ EXAMPLES
|
|
|
128
227
|
|
|
129
228
|
# Run specific runners
|
|
130
229
|
hydra run -m 2 -n custom -t TOKEN -u URL
|
|
230
|
+
`,scale:`
|
|
231
|
+
hydra scale - Automatically scale runners based on job queue
|
|
232
|
+
|
|
233
|
+
USAGE
|
|
234
|
+
hydra scale [options]
|
|
235
|
+
|
|
236
|
+
OPTIONS
|
|
237
|
+
-t, --token GitHub Personal Access Token [string] (required)
|
|
238
|
+
-u, --url GitHub repository or org URL [string] (required)
|
|
239
|
+
-m, --min Minimum number of runners [number] (default: 1)
|
|
240
|
+
-M, --max Maximum number of runners [number] (default: 5)
|
|
241
|
+
-w, --watch Watch mode - continuous scaling [boolean]
|
|
242
|
+
-i, --interval Check interval in seconds [number] (default: 60)
|
|
243
|
+
--scale-up-threshold Jobs in queue to trigger scale up [number] (default: 2)
|
|
244
|
+
--scale-down-idle Minutes idle before scale down [number] (default: 30)
|
|
245
|
+
--dry Preview actions without changes [boolean]
|
|
246
|
+
-d, --directory Runners directory [string]
|
|
247
|
+
-p, --profile Configuration profile [string]
|
|
248
|
+
-c, --config Configuration file path [string]
|
|
249
|
+
|
|
250
|
+
EXAMPLES
|
|
251
|
+
# Check and scale once
|
|
252
|
+
hydra scale -t TOKEN -u URL
|
|
253
|
+
|
|
254
|
+
# Watch mode with custom thresholds
|
|
255
|
+
hydra scale -t TOKEN -u URL --watch --min 2 --max 10
|
|
256
|
+
|
|
257
|
+
# Scale with faster response time
|
|
258
|
+
hydra scale -t TOKEN -u URL -w -i 30 --scale-up-threshold 1
|
|
259
|
+
|
|
260
|
+
# Preview scaling decisions
|
|
261
|
+
hydra scale -t TOKEN -u URL --dry
|
|
262
|
+
|
|
263
|
+
NOTES
|
|
264
|
+
- Monitors GitHub job queue and automatically adjusts runner count
|
|
265
|
+
- Scale up when pending jobs exceed threshold
|
|
266
|
+
- Scale down when runners are idle for specified duration
|
|
267
|
+
- Respects min/max limits to control costs
|
|
268
|
+
- Watch mode runs continuously until stopped (Ctrl+C)
|
|
131
269
|
`,status:`
|
|
132
270
|
hydra status - Check the status of GitHub runner machines
|
|
133
271
|
|
|
@@ -151,24 +289,34 @@ EXAMPLES
|
|
|
151
289
|
|
|
152
290
|
# Status using profile
|
|
153
291
|
hydra status -p production
|
|
154
|
-
`};function
|
|
155
|
-
`).map((e)=>{if(e.startsWith("hydra"))return
|
|
156
|
-
`);console.info(
|
|
157
|
-
${
|
|
292
|
+
`};function wn(n){if(n&&uo[n]){let r=uo[n].split(`
|
|
293
|
+
`).map((e)=>{if(e.startsWith("hydra"))return p.bold(e);if(e==="USAGE"||e==="OPTIONS"||e==="EXAMPLES")return p.bold(e);if(e.startsWith(" -")){let i=e.match(/^(\s+-\w,\s--\w+)\s+(.+)$/);if(i){let[,s="",t=""]=i,f=t.replace("(required)",p.error("(required)")).replace(/\(default: ([^)]+)\)/g,(a,c)=>p.dim(`(default: ${c})`)).replace(/\[boolean\]/g,p.boolean("[boolean]")).replace(/\[string\]/g,p.string("[string]")).replace(/\[number\]/g,p.number("[number]"));return` ${p.flag(s.padEnd(26))} ${f}`}}if(e.startsWith(" # "))return p.dim(e);if(e.startsWith(" hydra"))return` ${p.value(e.trim())}`;return e}).join(`
|
|
294
|
+
`);console.info(r);return}console.info(`
|
|
295
|
+
${p.bold(`Hydra@${po} - GitHub self-hosted runner manager`)}
|
|
158
296
|
|
|
159
|
-
${
|
|
297
|
+
${p.bold("USAGE")}
|
|
160
298
|
hydra <command> [options]
|
|
161
299
|
|
|
162
|
-
${
|
|
163
|
-
${
|
|
164
|
-
${
|
|
165
|
-
${
|
|
166
|
-
${
|
|
167
|
-
${
|
|
168
|
-
${
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
${
|
|
173
|
-
|
|
174
|
-
|
|
300
|
+
${p.bold("COMMANDS")}
|
|
301
|
+
${p.command("init")} Initialize a new Hydra configuration file
|
|
302
|
+
${p.command("create")} Create and register new GitHub runner machines
|
|
303
|
+
${p.command("run")} Start existing GitHub runner machines
|
|
304
|
+
${p.command("remove")} Remove GitHub runner machines
|
|
305
|
+
${p.command("status")} Check the status of GitHub runner machines
|
|
306
|
+
${p.command("logs")} View runner logs and diagnostics
|
|
307
|
+
${p.command("health")} Check runner health and diagnose issues
|
|
308
|
+
${p.command("scale")} Automatically scale runners based on job queue
|
|
309
|
+
${p.command("backup")} Backup and restore runner configurations
|
|
310
|
+
${p.command("help")} Show this help message
|
|
311
|
+
|
|
312
|
+
Use ${p.value("hydra <command> --help")} for more information about a command.
|
|
313
|
+
`)}import{resolve as fe}from"path";import{parseArgs as ae}from"util";var{$:pt}=globalThis.Bun;var en=x({prefix:"hydra"}).child("init");async function go(){let{toml:n}=me(),o=n?"hydra.toml":"hydra.json",r=fe(process.cwd(),o);if(await Bun.file(r).exists()){let l=await C({initialValue:!1,message:`Configuration file ${o} already exists. Overwrite?`});if(U(l)||!l)it("Configuration cancelled"),process.exit(0)}Bt(w.cyan("\uD83D\uDE80 Hydra Configuration Setup")),en.info("This will create a configuration file with your runner settings."),en.info("You can always edit the file later or create additional profiles.");let i=await It({profileName:()=>q({message:"Profile name?",placeholder:"default"}),directory:()=>q({defaultValue:"./gh-runners",message:"Directory to store runners?",placeholder:"./gh-runners"}),name:()=>q({defaultValue:"runner",message:"Runner name prefix?",placeholder:"runner"}),labels:({results:l})=>{let u=l.name||"runner";return q({defaultValue:u,message:"Runner labels (comma-separated)?",placeholder:u})},numberOfMachines:()=>q({defaultValue:"1",message:"Number of runner machines?",placeholder:"1",validate:(l)=>{let u=Number.parseInt(l,10);if(Number.isNaN(u)||u<1)return"Please enter a valid number greater than 0";return}}),url:()=>q({message:"GitHub repository or organization URL? (optional)",placeholder:"https://github.com/org/repo"})},{onCancel:()=>{it("Configuration cancelled"),process.exit(0)}}),{profileName:s,labels:t,numberOfMachines:f,...a}=i,c={defaultProfile:s,profiles:{[s]:{...a,labels:t,numberOfMachines:Number.parseInt(f,10),os:"osx",overwrite:!1,run:!1}}},m=JSON.stringify(c,null,2);if(await Bun.write(r,m),await an(async()=>{await pt`chmod 600 ${r}`.quiet()},{logLevel:"warn",message:"Could not set secure file permissions"}),Wt(w.green(`\u2713 Configuration saved to ${o}`)),en.info("Example usage:"),en.info(` hydra create -p ${s} --token YOUR_TOKEN${i.url?"":" --url REPO_URL"}`),en.info("You can add more profiles by editing the configuration file."),i.url)await ce(i.url)}async function ce(n){let o=/github\.com[:/]([^/]+)(?:\/([^/.]+))?/,r=n.match(o);if(!r)return;let[,e,i]=r,t=`https://github.com/${i?`${e}/${i}`:`organizations/${e}`}/settings/actions/runners`;en.info(`Opening GitHub settings: ${t}`),await an(async()=>{await pt`open ${t}`.quiet()},{fallback:async()=>{await an(async()=>{await pt`xdg-open ${t}`.quiet()},{fallback:()=>{en.info("Please open the URL manually to add a new runner token.")},logLevel:"info",message:"Alternative browser open method also failed"})},logLevel:"info",message:"Could not open browser automatically"})}function me(){let{values:n}=ae({allowPositionals:!0,args:Bun.argv,options:{toml:{default:!1,short:"t",type:"boolean"}},strict:!0});return n}import{existsSync as ho}from"fs";import{readdir as bo}from"fs/promises";import{join as vn,resolve as le}from"path";import{parseArgs as pe}from"util";var ue=x({prefix:"hydra"}).child("logs");async function de(){let{values:n}=pe({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},list:{default:!1,short:"l",type:"boolean"},profile:{short:"p",type:"string"},runner:{short:"r",type:"string"},type:{short:"t",type:"string"}},strict:!0}),o=await A({configPath:n.config}),r=await X(o,n.profile);return{directory:n.directory||r?.directory||`${process.cwd()}/gh-runners`,list:n.list,runner:n.runner,type:n.type}}async function yo(){try{let n=await de(),o=le(n.directory),r=vn(o,"machines");if(!ho(r)){h.error(`No runners found in ${n.directory}`);return}let e=W();e.start("Scanning for runner logs...");let i=await bo(r),s=[];for(let f of i){let a=vn(r,f),c=vn(a,"_diag");if(ho(c)){let m=await ge(c);if(m.length>0)s.push({logs:m,runner:f})}}if(e.stop("Found runner logs"),s.length===0){h.info("No log files found");return}if(n.list){he(s);return}if(n.runner&&n.type){await ye(s,n.runner,n.type);return}let t=await be(s);if(t)await wo(t)}catch(n){ue.error("Failed to retrieve logs:",n),process.exit(1)}}async function ge(n){let o=await bo(n),r=[];for(let e of o)if(e.endsWith(".log")){let i=vn(n,e),s=await Bun.file(i).stat();r.push({modified:new Date(s.mtime),name:e,path:i,size:s.size})}return r.sort((e,i)=>i.modified.getTime()-e.modified.getTime())}function he(n){console.log(p.bold(`
|
|
314
|
+
\uD83D\uDCCB Available Logs
|
|
315
|
+
`));for(let{runner:o,logs:r}of n){console.log(`${p.bold(`Runner ${o}:`)}`);for(let e of r){let i=ut(e.size),s=dt(e.modified),t=Hn(e.name);console.log(` ${p.value(t.padEnd(20))} ${p.dim(i.padEnd(10))} ${p.dim(s)}`)}console.log()}}async function be(n){let o=[];for(let{runner:e,logs:i}of n)for(let s of i)o.push({hint:`${ut(s.size)} - ${dt(s.modified)}`,label:`Runner ${e} - ${Hn(s.name)}`,value:s});return await Gn({message:"Select a log file to view",options:o})}async function ye(n,o,r){let e=n.find(({runner:s})=>s===o);if(!e){h.error(`Runner ${o} not found`);return}let i=e.logs.find((s)=>Hn(s.name).toLowerCase().includes(r.toLowerCase()));if(!i){h.error(`Log type '${r}' not found for runner ${o}`);return}await wo(i)}async function wo(n){console.log(),console.log(p.bold(`\uD83D\uDCC4 ${Hn(n.name)}`)),console.log(p.dim(`Size: ${ut(n.size)} | Modified: ${dt(n.modified)}`)),console.log(p.dim("\u2500".repeat(80))),console.log();let o=await Bun.file(n.path).text(),r=o.split(`
|
|
316
|
+
`);if(r.length>100){let e=r.slice(-100);console.log(p.dim(`... (showing last 100 lines of ${r.length} total)
|
|
317
|
+
`)),console.log(e.join(`
|
|
318
|
+
`))}else console.log(o)}function Hn(n){if(n.includes("Runner_"))return"Runner Log";if(n.includes("Worker_"))return"Worker Log";if(n.includes("Actions"))return"Actions Log";if(n.includes("Listener"))return"Listener Log";return n.replace(".log","")}function ut(n){if(n<1024)return`${n}B`;if(n<1048576)return`${(n/1024).toFixed(1)}KB`;return`${(n/1048576).toFixed(1)}MB`}function dt(n){let r=new Date().getTime()-n.getTime(),e=Math.floor(r/3600000);if(e<1)return`${Math.floor(r/60000)}m ago`;if(e<24)return`${e}h ago`;let i=Math.floor(e/24);if(i<7)return`${i}d ago`;return n.toLocaleDateString()}import{parseArgs as we}from"util";var{$:sn}=globalThis.Bun;var K=x({prefix:"hydra"}).child("remove");async function Pn(){let n=await xe(),{directory:o,numberOfMachines:r,force:e}=n,{token:i,url:s}=n,t=`${o}/machines`;if(!await Bun.file(t).exists())throw new Error(`Machines directory not found at ${t}. Nothing to remove.`);if(!i&&!e){if(!s)throw K.warn("No token or URL provided. Runners will not be unregistered from GitHub."),K.warn("Use --force to remove runners without unregistering them."),new Error("Token (-t) and URL (-u) parameters are required or use --force");let a=Oe(s),c=await C({message:`No token provided. Would you like to open GitHub to get a runner token for unregistration?
|
|
319
|
+
${a}`});if(U(c)||!c)throw K.warn("Use --force to remove runners without unregistering them."),new Error("Token is required to unregister runners (or use --force)");K.info("Opening GitHub runner settings..."),await sn`open ${a}`.quiet();let m=await q({message:"Enter the runner removal token:",placeholder:"AXXXXXXXXXXXXXXXXXXXXXXXXX",validate:(l)=>{if(!l||l.trim().length===0)return"Token is required";return}});if(U(m))throw K.warn("Use --force to remove runners without unregistering them."),new Error("Token is required to unregister runners (or use --force)");i=m.trim()}if(i&&s)K.info("Unregistering runners from GitHub..."),await $e({directory:o,numberOfMachines:r,token:i});else if(!e)throw K.warn("No token or URL provided. Runners will not be unregistered from GitHub."),K.warn("Use --force to remove runners without unregistering them."),new Error("Token (-t) and URL (-u) parameters are required or use --force");await Ee({directory:o,numberOfMachines:r}),K.info("Runners successfully removed")}async function xe(){let{values:n}=we({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},force:{default:!1,short:"f",type:"boolean"},numberOfMachines:{default:"1",short:"m",type:"string"},profile:{short:"p",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),o=await A({configPath:n.config}),r=await X(o,n.profile),e={directory:n.directory,force:n.force,numberOfMachines:n.numberOfMachines,token:n.token,url:n.url};if(r)return{directory:e.directory??r.directory??`${process.cwd()}/gh-runners`,force:e.force,numberOfMachines:e.numberOfMachines??String(r.numberOfMachines)??"1",token:e.token,url:e.url??r.url};return e}async function $e({directory:n,numberOfMachines:o,token:r}){let e=K.child("unregister"),i=Number(o),s=(()=>{try{let u=Bun.spawnSync(["nproc"]);return Number.parseInt(u.stdout.toString().trim(),10)||4}catch{try{let u=Bun.spawnSync(["sysctl","-n","hw.ncpu"]);return Number.parseInt(u.stdout.toString().trim(),10)||4}catch{return 4}}})(),t=Math.min(Math.max(2,Math.floor(s/2)),i,8);e.info(`Unregistering ${i} runners with concurrency of ${t}`);let f=Array.from({length:i},(u,b)=>b+1).map((u)=>({execute:async()=>{let b=`${n}/machines/${u}`;if(!await Bun.file(b).exists())return e.debug(`Machine ${u} doesn't exist, skipping...`),{runnerIndex:u,status:"skipped"};try{return e.debug(`Unregistering machine ${u}...`),await sn`${b}/config.sh remove --token ${r}`.quiet(),e.info(`Successfully unregistered machine ${u} from GitHub`),{runnerIndex:u,status:"success"}}catch($){return e.warn(`Unable to unregister machine ${u}: ${$}`),{error:$,runnerIndex:u,status:"failed"}}},runnerIndex:u})),a=[];for(let u=0;u<f.length;u+=t){let b=f.slice(u,u+t),g=await Promise.allSettled(b.map(($)=>$.execute()));a.push(...g)}let c=a.filter((u)=>u.status==="fulfilled"&&u.value?.status==="success").length,m=a.filter((u)=>u.status==="fulfilled"&&u.value?.status==="failed").length,l=a.filter((u)=>u.status==="fulfilled"&&u.value?.status==="skipped").length;e.info(`Unregistration complete: ${c} successful, ${m} failed, ${l} skipped`)}async function Ee({directory:n,numberOfMachines:o}){let r=K.child("removeDirectories"),e=Number(o),i=Array.from({length:e},(a,c)=>c+1).map((a)=>({execute:async()=>{let c=`${n}/machines/${a}`;if(!await Bun.file(c).exists())return{runnerIndex:a,status:"skipped"};try{return await sn`rm -rf ${c}`.quiet(),r.debug(`Removed machine ${a} directory`),{runnerIndex:a,status:"success"}}catch(l){return r.error(`Error removing machine ${a} directory: ${l}`),{error:l,runnerIndex:a,status:"failed"}}},runnerIndex:a})),s=await Promise.allSettled(i.map((a)=>a.execute())),t=s.filter((a)=>a.status==="fulfilled"&&a.value?.status==="success").length,f=s.filter((a)=>a.status==="fulfilled"&&a.value?.status==="failed").length;if(r.info(`Directory removal complete: ${t} removed, ${f} failed`),f>0)throw new Error(`Failed to remove ${f} runner directories`);try{let a=`${n}/machines`;if(!(await sn`ls -A ${a}`.text()).trim()){if(await sn`rm -rf ${a}`.quiet(),!(await sn`ls -A ${n}`.text()).trim())await sn`rm -rf ${n}`.quiet();K.info("Removed empty directories")}}catch(a){}}function Oe(n){try{let o=new URL(n),r=o.pathname.split("/").filter(Boolean);if(o.hostname==="github.com"||o.hostname==="www.github.com"){if(r[0]==="orgs"&&r[1])return`https://github.com/organizations/${r[1]}/settings/actions/runners`;else if(r.length>=2)return`https://github.com/${r[0]}/${r[1]}/settings/actions/runners`}else if(r[0]==="orgs"&&r[1])return`${o.origin}/organizations/${r[1]}/settings/actions/runners`;else if(r.length>=2)return`${o.origin}/${r[0]}/${r[1]}/settings/actions/runners`;return n}catch{return n}}import{parseArgs as Re}from"util";var{$:Se}=globalThis.Bun;var J=x({prefix:"runMachines"});async function xo(){let n=await Te(),{directory:o,numberOfMachines:r,name:e,labels:i,runnerGroup:s}=n,{token:t,url:f}=n;if(!f)throw new Error("URL (-u) parameter is required");if(!t){let c=Ne(f),m=await C({message:`No token provided. Would you like to open GitHub to get a runner token?
|
|
320
|
+
${c}`});if(U(m)||!m)throw new Error("Token is required to run machines");J.info("Opening GitHub runner settings..."),await Se`open ${c}`.quiet();let l=await q({message:"Enter the runner registration token:",placeholder:"AXXXXXXXXXXXXXXXXXXXXXXXXX",validate:(u)=>{if(!u||u.trim().length===0)return"Token is required";return}});if(U(l))throw new Error("Token is required to run machines");t=l.trim()}if(J.info(`Starting ${r} runners from ${o}`),J.debug(`Name: ${e}, Labels: ${i||"none"}`),!await Bun.file(`${o}/machines`).exists())throw new Error(`Machines directory not found at ${o}/machines. Run 'hydra create' first.`);await Le({directory:o,labels:i,name:e,numberOfMachines:r,runnerGroup:s,token:t,url:f})}async function Te(){let{values:n}=Re({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},labels:{short:"l",type:"string"},name:{default:"runner",short:"n",type:"string"},numberOfMachines:{default:"1",short:"m",type:"string"},profile:{short:"p",type:"string"},runnerGroup:{short:"g",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),o=await A({configPath:n.config}),r=await X(o,n.profile),e={directory:n.directory,labels:n.labels,name:n.name,numberOfMachines:n.numberOfMachines,runnerGroup:n.runnerGroup,token:n.token,url:n.url};if(r)return{directory:e.directory??r.directory??`${process.cwd()}/gh-runners`,labels:e.labels??r.labels,name:e.name??r.name??"runner",numberOfMachines:e.numberOfMachines??String(r.numberOfMachines)??"1",runnerGroup:e.runnerGroup??r.runnerGroup,token:e.token,url:e.url??r.url};return e}async function Le({directory:n,numberOfMachines:o,token:r,url:e,name:i,labels:s,runnerGroup:t}){J.info(`Starting ${o} workers...`);for(let f=1;f<=Number(o);f++){let a=`${n}/machines/${f}`;if(!await Bun.file(a).exists()){J.warn(`Machine ${f} doesn't exist, skipping...`);continue}let m=`${bn()}/src/runner-worker.ts`,l=`${i}-${f}`,u=new Worker(m,{name:l,ref:!0});u.addEventListener("message",({data:b})=>{let g=b.type==="error"?"error":"info";J[g](`${l}: ${b.message}`)}),u.addEventListener("error",(b)=>{J.error(`Worker ${l} error:`,b)}),u.addEventListener("exit",(b)=>{J.info(`Worker ${l} exited with code ${b}`)}),u.postMessage({index:f,labels:s,machineCwd:a,name:i,runnerGroup:t,token:r,url:e}),J.info(`Worker ${l} starting...`),qn.add(u)}J.info("All workers started. Press Ctrl+C to stop all machines")}function Ne(n){try{let o=new URL(n),r=o.pathname.split("/").filter(Boolean);if(o.hostname==="github.com"||o.hostname==="www.github.com"){if(r[0]==="orgs"&&r[1])return`https://github.com/organizations/${r[1]}/settings/actions/runners/new`;else if(r.length>=2)return`https://github.com/${r[0]}/${r[1]}/settings/actions/runners/new`}else if(r[0]==="orgs"&&r[1])return`${o.origin}/organizations/${r[1]}/settings/actions/runners/new`;else if(r.length>=2)return`${o.origin}/${r[0]}/${r[1]}/settings/actions/runners/new`;return n}catch{return n}}import{parseArgs as Ge}from"util";var $o=x({prefix:"hydra"}).child("scale");async function Ae(){let{values:n}=Ge({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},dry:{default:!1,type:"boolean"},interval:{default:"60",short:"i",type:"string"},max:{default:"5",short:"M",type:"string"},min:{default:"1",short:"m",type:"string"},profile:{short:"p",type:"string"},"scale-down-idle":{default:"30",type:"string"},"scale-up-threshold":{default:"2",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"},watch:{default:!1,short:"w",type:"boolean"}},strict:!0}),o=await A({configPath:n.config}),r=await X(o,n.profile);return{directory:n.directory||r?.directory||`${process.cwd()}/gh-runners`,dry:n.dry,scaleConfig:{checkIntervalSeconds:parseInt(n.interval,10),maxRunners:parseInt(n.max,10),minRunners:parseInt(n.min,10),scaleDownIdleMinutes:parseInt(n["scale-down-idle"],10),scaleUpThreshold:parseInt(n["scale-up-threshold"],10)},token:n.token,url:n.url||r?.url,watch:n.watch}}async function Eo(){try{let n=await Ae();if(!n.token||!n.url)throw new Error("Token (-t) and URL (-u) parameters are required");if(n.scaleConfig.minRunners>n.scaleConfig.maxRunners)throw new Error("Minimum runners cannot be greater than maximum runners");if(h.info("Autoscale Configuration:"),console.log(` Min Runners: ${p.value(String(n.scaleConfig.minRunners))}`),console.log(` Max Runners: ${p.value(String(n.scaleConfig.maxRunners))}`),console.log(` Scale Up Threshold: ${p.value(String(n.scaleConfig.scaleUpThreshold))} pending jobs`),console.log(` Scale Down After: ${p.value(String(n.scaleConfig.scaleDownIdleMinutes))} minutes idle`),console.log(),n.watch)await _e(n);else await Xe(n)}catch(n){$o.error("Failed to scale runners:",n),process.exit(1)}}async function Xe(n){let o=W();o.start("Analyzing queue and runners...");try{let r=await Oo(n.url,n.token,n.directory);o.stop("Analysis complete"),Ce(r);let e=Ro(r,n.scaleConfig);if(e.type==="none"){h.info("No scaling action needed");return}if(console.log(),e.type==="scale-up")h.info(`Recommendation: Scale UP by ${e.count} runner(s)`),h.info(`Reason: ${e.reason}`);else h.info(`Recommendation: Scale DOWN by ${e.count} runner(s)`),h.info(`Reason: ${e.reason}`);if(n.dry){h.info("Dry run - no changes made");return}if(!await C({initialValue:!0,message:`Proceed with ${e.type}?`})){h.info("Cancelled");return}await So(e,n)}catch(r){throw o.stop("Failed"),r}}async function _e(n){h.info(`Starting autoscale watch mode (checking every ${n.scaleConfig.checkIntervalSeconds}s)`),console.log(`Press Ctrl+C to stop
|
|
321
|
+
`);let o=new Map;while(!0)try{let r=await Oo(n.url,n.token,n.directory);await qe(o,r,n);let e=Ro(r,n.scaleConfig,o),i=new Date().toLocaleTimeString();if(console.log(`[${i}] Queue: ${r.pendingJobs} | Active: ${r.activeRunners} | Idle: ${r.idleRunners} | Total: ${r.totalRunners}`),e.type!=="none"){if(console.log(`[${i}] ${p.warning(`Action: ${e.type} by ${e.count} - ${e.reason}`)}`),!n.dry)await So(e,n)}await Bun.sleep(n.scaleConfig.checkIntervalSeconds*1000)}catch(r){$o.error("Error in watch cycle:",r),await Bun.sleep(n.scaleConfig.checkIntervalSeconds*1000)}}async function Oo(n,o,r){let e=await Ue(n,o),i=await gt(n,o,r),s=i.filter((a)=>a.busy).length,t=i.filter((a)=>a.status==="online"&&!a.busy).length,f=i.length;return{activeRunners:s,idleRunners:t,pendingJobs:e,totalRunners:f}}async function Ue(n,o){let r=n.match(/github\.com[:/]([^/]+)(?:\/([^/.]+))?/);if(!r)throw new Error("Invalid GitHub URL");let[,e,i]=r,s=i?`https://api.github.com/repos/${e}/${i}/actions/runs?status=queued&per_page=100`:`https://api.github.com/orgs/${e}/actions/runs?status=queued&per_page=100`;return Z(async()=>{let t=await fetch(s,{headers:{Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${o}`}});if(!t.ok)throw new Error(`GitHub API error: ${t.status}`);let f=await t.json(),a=0;for(let c of f.workflow_runs||[]){let m=await fetch(`https://api.github.com/repos/${e}/${i}/actions/runs/${c.id}/jobs`,{headers:{Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${o}`}});if(m.ok){let l=await m.json();a+=l.jobs?.filter((u)=>u.status==="queued").length||0}}return a},{maxAttempts:3})}async function gt(n,o,r){let e=n.match(/github\.com[:/]([^/]+)(?:\/([^/.]+))?/);if(!e)return[];let[,i,s]=e,t=s?`https://api.github.com/repos/${i}/${s}/actions/runners`:`https://api.github.com/orgs/${i}/actions/runners`,f=await fetch(t,{headers:{Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${o}`}});if(!f.ok)return[];return(await f.json()).runners||[]}function Ro(n,o,r){if(n.pendingJobs>=o.scaleUpThreshold&&n.totalRunners<o.maxRunners)return{count:Math.min(n.totalRunners+Math.ceil(n.pendingJobs/2),o.maxRunners)-n.totalRunners,reason:`${n.pendingJobs} jobs pending (threshold: ${o.scaleUpThreshold})`,type:"scale-up"};if(n.idleRunners>0&&n.totalRunners>o.minRunners){let e=0;if(r){let i=new Date;for(let[,s]of r)if((i.getTime()-s.getTime())/60000>=o.scaleDownIdleMinutes)e++}else e=n.idleRunners;if(e>0)return{count:Math.min(e,n.totalRunners-o.minRunners),reason:`${e} runners idle for ${o.scaleDownIdleMinutes}+ minutes`,type:"scale-down"}}return{count:0,reason:"",type:"none"}}async function So(n,o){if(n.type==="scale-up"){h.info(`Scaling up by ${n.count} runner(s)...`);let r=process.argv;try{process.argv=[process.argv[0],process.argv[1],"create","-t",o.token,"-u",o.url,"-m",String(n.count),"-d",o.directory],await Cn(),h.success(`Successfully added ${n.count} runner(s)`)}finally{process.argv=r}}else if(n.type==="scale-down"){h.info(`Scaling down by ${n.count} runner(s)...`);let e=(await gt(o.url,o.token,o.directory)).filter((s)=>s.status==="online"&&!s.busy).slice(0,n.count);if(e.length===0){h.warning("No idle runners to remove");return}let i=process.argv;try{for(let s of e){let t=s.name.match(/runner-(\d+)/)?.[1];if(!t)continue;process.argv=[process.argv[0],process.argv[1],"remove","-t",o.token,"-u",o.url,"-n",`runner-${t}`,"-d",o.directory,"-f"],await Pn()}h.success(`Successfully removed ${e.length} runner(s)`)}finally{process.argv=i}}}async function qe(n,o,r){let e=await gt(r.url,r.token,r.directory);for(let s of e)if(s.status==="online"&&!s.busy){if(!n.has(s.name))n.set(s.name,new Date)}else n.delete(s.name);let i=new Set(e.map((s)=>s.name));for(let[s]of n)if(!i.has(s))n.delete(s)}function Ce(n){console.log(),console.log(p.bold("\uD83D\uDCCA Current Status")),console.log(` Pending Jobs: ${p.value(String(n.pendingJobs))}`),console.log(` Total Runners: ${p.value(String(n.totalRunners))}`),console.log(` Active Runners: ${p.success(String(n.activeRunners))}`),console.log(` Idle Runners: ${p.warning(String(n.idleRunners))}`)}import{parseArgs as ve}from"util";var{$:He}=globalThis.Bun;var un=x({prefix:"hydra"}).child("status");async function To(){let n=await Pe(),{directory:o,token:r,url:e,json:i}=n;if(!r||!e)throw new Error("Token (-t) and URL (-u) parameters are required");let s=W();s.start("Fetching runner status...");try{let t=await Me(o),f=await Be(e,r),a=We(t,f);if(s.stop("Runner status fetched"),i)un.info(JSON.stringify(a,null,2));else Ie(a)}catch(t){throw s.stop("Failed to fetch runner status"),t}}async function Pe(){let{values:n}=ve({allowPositionals:!0,args:Bun.argv,options:{config:{short:"c",type:"string"},directory:{default:`${process.cwd()}/gh-runners`,short:"d",type:"string"},json:{default:!1,short:"j",type:"boolean"},profile:{short:"p",type:"string"},token:{short:"t",type:"string"},url:{short:"u",type:"string"}},strict:!0}),o=await A({configPath:n.config}),r=await X(o,n.profile);return{directory:n.directory||r?.directory||`${process.cwd()}/gh-runners`,json:n.json,token:n.token,url:n.url||r?.url}}async function Me(n){let o=`${n}/machines`;return await an(async()=>{return(await He`ls ${o} 2>/dev/null || true`.quiet()).stdout.toString().trim().split(`
|
|
322
|
+
`).filter(Boolean)},{fallback:()=>{},logLevel:"debug",message:"No local runners found"})||[]}async function Be(n,o){let r=n.match(/github\.com[:/]([^/]+)(?:\/([^/.]+))?/);if(!r)throw new Error("Invalid GitHub URL");let[,e,i]=r,s=i?`https://api.github.com/repos/${e}/${i}/actions/runners`:`https://api.github.com/orgs/${e}/actions/runners`;return Z(async()=>{let t={Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${o}`},f=await fetch(s,{headers:t});if(!f.ok)throw new Error(`GitHub API error: ${f.status} ${f.statusText}`);return await f.json()},{onRetry:(t,f)=>{h.warn(`Retrying GitHub API call (attempt ${t}): ${f.message}`)}})}function We(n,o){let r=[],e=new Map(o.runners.map((i)=>[i.name,i]));for(let i of n){let s=`runner-${i}`,t=e.get(s);if(t)r.push({busy:t.busy,labels:t.labels.map((f)=>f.name),name:s,os:t.os,status:t.busy?"busy":t.status==="online"?"online":"offline"});else r.push({busy:!1,labels:[],name:s,os:"unknown",status:"offline"})}return r}function Ie(n){if(n.length===0){h.info("No runners found");return}un.info("Runner Status:"),un.info("\u2500".repeat(80));let o={busy:p.busy,offline:p.offline,online:p.online};for(let e of n){let i=o[e.status],s=e.status.toUpperCase().padEnd(7);un.info(`${i("\u25CF")} ${i(s)} ${p.value(e.name.padEnd(20))} ${p.dim(`OS: ${e.os.padEnd(10)}`)} ${e.labels.length>0?p.dim(`Labels: ${e.labels.join(", ")}`):""}`)}un.info("\u2500".repeat(80));let r={busy:n.filter((e)=>e.status==="busy").length,offline:n.filter((e)=>e.status==="offline").length,online:n.filter((e)=>e.status==="online").length,total:n.length};un.info(`Summary: Total: ${r.total} | ${p.online(`Online: ${r.online}`)} | ${p.busy(`Busy: ${r.busy}`)} | ${p.offline(`Offline: ${r.offline}`)}`)}var Mn=["init","create","run","remove","status","logs","health","scale","backup","help"],Bn=x({prefix:"hydra"}),Ke={auto:"scale",autoscale:"scale",b:"backup",back:"backup",bak:"backup",c:"create",ceate:"create",check:"health",craete:"create",cretae:"create",del:"remove",delete:"remove",diagnose:"health",h:"help",heal:"health",healthy:"health",i:"init",info:"status",initialise:"init",inti:"init",intialize:"init",l:"logs",list:"status",log:"logs",ls:"status",new:"create",r:"run",remvoe:"remove",resize:"scale",restore:"backup",rm:"remove",rmove:"remove",rnu:"run",runn:"run",s:"status",save:"backup",scal:"scale",start:"run",stat:"status",stop:"remove",sttaus:"status",t:"troubleshoot",tail:"logs"};async function ze(){try{let[,,n,...o]=process.argv;if(!n||n==="--help"||n==="-h")wn(),process.exit(0);let r=n;if(!Mn.includes(n)){let e=Yt(n,Ke);if(e&&Mn.includes(e))r=e,Bn.warn(`Assuming you meant '${e}'`)}if(!Mn.includes(r)){Bn.error(`Unknown command: ${n}`);let e=Jt(n,Mn);if(e.length>0){Bn.error("Did you mean one of these?");for(let i of e)Bn.error(` ${i}`)}wn(),process.exit(1)}if(o.includes("--help")||o.includes("-h"))wn(r),process.exit(0);switch(r){case"init":await go();break;case"create":await Cn();break;case"run":await xo();break;case"remove":await Pn();break;case"status":await To();break;case"logs":await yo();break;case"health":await lo();break;case"scale":await Eo();break;case"backup":await fo();break;case"help":{let e=o[0];wn(e);break}default:throw new Error(`Unknown command: ${r}`)}process.exit(0)}catch(n){let o=n instanceof Error?n:new Error(String(n));h.error(o.message),process.exit(1)}}await ze();
|
package/package.json
CHANGED