From bc8a35aedd8136d58f6af74e5a52f0a1d0f83041 Mon Sep 17 00:00:00 2001 From: Ayman Jundi Date: Sun, 3 Aug 2025 16:36:03 -0400 Subject: [PATCH] Added nix flake and shell files for nixos users who want to work on development. You can use flake method => 'nix develop' or non flake method =>`nix-shell' The shell.nix file is used for both flake and non-flake invocations. The lock file is also set at a version where the project works. Note the none-flake method will follow the version of the system and isn't guaranteed to work on older installations if they haven't been updated in a while. Added Documentation for using Nix package manager for development ./Documentation/LinuxDevelopmentSetupUsingNix.md Signed-off-by: Ayman Jundi --- .../LinuxDevelopmentSetupUsingNix.md | 64 ++++++++++++++++++ .../images/StartingDebuggingInVSCode.png | Bin 0 -> 18704 bytes flake.lock | 27 ++++++++ flake.nix | 16 +++++ shell.nix | 19 ++++++ 5 files changed, 126 insertions(+) create mode 100644 Documentation/LinuxDevelopmentSetupUsingNix.md create mode 100644 Documentation/images/StartingDebuggingInVSCode.png create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 shell.nix diff --git a/Documentation/LinuxDevelopmentSetupUsingNix.md b/Documentation/LinuxDevelopmentSetupUsingNix.md new file mode 100644 index 00000000..aab90db2 --- /dev/null +++ b/Documentation/LinuxDevelopmentSetupUsingNix.md @@ -0,0 +1,64 @@ +# Development Environment Setup using Nix or Nix Flakes on Linux x86_64 +[Nix flakes](https://nixos.wiki/wiki/Flakes) can be used to provide version controlled reproducible and cross-platform development environments. The key files are: +- `flake.nix`: Defines the flake inputs and outputs, including development shells. +- `shell.nix`: This file defines the dependencies and additionally adds support for the Impure `nix-shell` method. This is used by the flake to create the dev environment. +- `flake.lock`: Locks the versions of inputs for reproducibility. +--- +## Prerequisites +- [Nix](https://nixos.org/download.html) the package manager or NixOs installed on Linux (x86_64-linux) +- Optional: flakes support enabled. +--- +## Using the Development Shell +You have two primary ways to enter the development shell with Nix: +### 1. Using `nix develop` (flake-native command) +This is the recommended way if you have Nix with flakes support. Flake guarantee the versions of the dependencies and can be controlled through `flake.nix` and `flake.lock`. +``` +nix develop +``` +This will open a shell with all dependencies and environment configured as per the `flake.nix` for (`x86_64-linux`) systems only at this time. + +--- +### 2. Using `nix-shell` (that's why shell.nix is a separate file) +If you want to use traditional `nix-shell` tooling which uses the nixpkgs version of your system: +``` +nix-shell +``` +This will drop you into the shell environment defined in `shell.nix`. Note that this is not flake-native method and does not use the locked nixpkgs in `flake.lock` so exact versions of the dependancies is not guaranteed. + +--- +## What’s inside the dev shell? +- The environment variables and packages configured in `shell.nix` will be available. +- The package set (`pkgs`) used aligns with the versions locked in `flake.lock` to ensure reproducibility. + +--- +## Example Workflow using flakes +``` +# Navigate to the project root folder which contains the flake.nix, flake.lock and shell.nix files. +cd /home/user/dev/Libation +# Enter the flake development shell (Linux x86_64) +nix develop +# run VSCode or VSCodium from the current shell environment +code . +# Run or Debug using VSCode and VSCodium using the linux Launch configuration. +``` +![Debug using VSCode and VSCodium](./images/StartingDebuggingInVSCode.png) + +You can also Build and run your application inside the shell. +``` +dotnet build ./Source/LibationAvalonia/LibationAvalonia.csproj -p:TargetFrameworks=net9.0 -p:TargetFramework=net9.0 -p:RuntimeIdentifier=linux-x64 +``` + +--- + +## Notes +- Leaving the current shell environemnt will drop all added dependancies and you will not be able to run or debug the program unless your system has those dependancies defined globally. +- To exit the shell environment voluntarily use `exit` inside the shell. +- Ensure you have no conflicting `nix.conf` or `global.json` that might affect SDK versions or runtime identifiers. +- Keep your `flake.lock` file committed to ensure builds are reproducible for all collaborators. + +--- +## References + +- [Nix Flakes - NixOS Wiki](https://nixos.wiki/wiki/Flakes) +- [Nix.dev - Introduction to Nix flakes](https://nix.dev/manual/nix/2.28/command-ref/new-cli/nix3-flake-init) +- [Nix-shell Manual](https://nixos.org/manual/nix/stable/command-ref/nix-shell.html) diff --git a/Documentation/images/StartingDebuggingInVSCode.png b/Documentation/images/StartingDebuggingInVSCode.png new file mode 100644 index 0000000000000000000000000000000000000000..1e43b2b550f0f5d032be915d2d158e90853dbc2e GIT binary patch literal 18704 zcmb8X1yq%56fL?j5Jkd3q(PAu5D)#_=4^X77K0vA(tDoNIo5l9qghb%XE*3WdTFc`Yc5LS52>pO-Pv;oo}N zFLL2O*DYSFSffzb4ags~aC&Sac=3jfkg|=bxq*?+TT^8ev)-Iw_W$Em6%?~B1!F9{ ziiy0}TE|LH&kSXyYrz~xd~%3Fk)uQeU&=dZu1z?q%MV^OZx1otTt$7v%*&{tH_N2m zNQsD6WvqzMS3DTJNAGSts;@da)Yp-pwvd+^z7VgKT9{w{hcW6jWco9CJL+;hLmgib zk+q&2+AY5B=HyphoQs-1Z>x9Xt-E+$-ND73et|*ZiOWB(q-y&Cmmhwnak||GFJMr7 zM!T+uynx&I-jfA+kFWL%{%GVkf=|d3#gX46-4BwcLf$NM^EJ(#f1gIbK^ex=H}i;a zFWyseGb``*zegNfG$)ED56*1J{m$%|sJo%(5l{Yo-Oq5}On#Fq;+~GZjQi1{Gn6=iKosf2C*>jQRKUmz|??I&MHSB?Th6ye~uSE_o26@y0QU5}rr zA0dy#FmBwCEvdZt`0=B1q3)+0hl90|fn2r21oTG1NJfpLwW98U#=|wOixd1Br+ry` zd@-CpYrIB*(}VTnt$LinM*I0V`^mS{KR&F?o~F4R@0gAji)b)-(!6l8eW{6kesl{v z_d_8Tmt4t&AMwSp4l0jq!e2|;-qfzV+T_Xdry==Q_xxK!sr$<;fcW*b5wY^%dHahF~z0POFb?pP*vc-_6FD*UI4IXXrG4vD{sdu(d4s z?so1Z97x)Eyt^3AA|)lIn6KH{lPK`%)2G%xRSZkMaZ8$h6t!FQC#{L*ZP%1=S+h!) zn|>o#7)jq>F6N@MaZLCl_Ubi9sict-ZteMj8oTN6H}2B0b(E)<7pAi0TmLk>R;3~EqNsLhyt=~C z_?pO2_pD4Jg%ghZ3y)X(cGD_(KLn!dXUZS%g)wQxU&Xw)wbw88Jlw!(_7nBeSQ*pC z#zrikd%Q}KKHic~)Pz~xIwzWZj&iU}van39>QilP?co9)AGvdg{G(YvCgx~y@hIjG zEP8F<4SOHtY1MTdZO_GxPSV2sZlYg)ZnsAM^eJA^NXN!RRk%})W;blwa!=xA!T@iL zD!c9VvMK$sv8Bbu=9b`xnQCQ>nVFe68dZt}ZOr#?R&V{nEH5a*fM_?zXv)U~NPvX=Y&xmtC+t*x!aCPUZ( z!UD?5_pKMZ6yk>_3RQDq!*AWbJ$tu}%WkdZ>r<2W{xiur-A}6ydpcvDsgxMwZPpyd z_pw%*jX6h(WzPXtKsxuGYm7 z*%>&89F9AbsK=_sZ+^T-3uDwEteWVmv|T-dvmd^wHn8#M>v!GO+Yyh|nu@x4#iCjC z$}MIt6&Z9d?98{Xr1AT@v>nD4D&{{du`xr?|dP8=X{2r<6o{Xl$%vIi#rHANPgo5(&cXgWlWuDPnKomf#usm2( zf!7-vKHa&Fjjj0X@-&NQT`kZC5Y$uF1NEZ;Whj@RpmdIHfXqtOW~ovBhp zm0x>8SMQBA7yODeQLD~vMIVKPW42O0i^J9%D)Fcv-(Grzz5Ro)>F{B+#ANqi%$(I? z`h|XXd|ZA)y5sHw_r=++cpO)_+xbZWOugv~iC8!tfi)f)KR-V*d8X>EOXju5R6l?I zEQSDYSJ{|^qb+J-!JL;zAXYJurQlbn*FJgAf_(8Xs8fFq4hNg*Fz$Q!G98v^!@iX3 zs_&Zk^1ZQ$td@EbbJDBmd3kvU@-$+!+>V7b<|+B|O3v1E-7m%W1jehFtJ(;w^Mo)!GzJc0fp+5!bZp|+>gvQn+v+%^+$}K6sAuM+ z`PDl&V5I(pPd`K4$yVAJ#XHPipC>l%<~?NyrIJX3C4&4GcuUz5kh)m7o~=46ga(QvWR9Vi0YaAHvM8PXr% zG<~<47d2%k+TPwa9WR%$)txCATlXj9i-(bIjTj_6c{j>N_|!OMz{k^b3$k=bY^=Dd zDq-E(j#z0Ttk&m&9F@>;dL`|$u?nYsI;g#JqjqbJd~;c{9!)^Vhjllja$et8!7bi^~LDWFOs!e?t65wF@gC5QmrKivFY&lm&>laPJ1+Xbn?=p z+3x^XL>rV^FG{8-u);$frQ&#;BRoB?z2>L4g%WrZf3HLTq zqO}X6=e9Su+=th(i{sJC(Mun#&q@vwY)-=5Mk;NycQ{}zhcKh->i7V9Sf5CXN=P&s zvfU=rV&-u)uip0Vk7a4Ozau6pYIPFCly$5g4atsPF=x7Jv-Tk+r6&&W(fdH&6JNjw zGf+F0dXvLvNOBd$R8_yO+$6{+`vKKDoCT^4ROVhowxgq?@xed(WMm0rPD-#-3wI+1 z^CLU;1@gNO$JnLnF8)3zd2UC^z~Eo{Zj4Ugi*ZGb4>lQZ2PRYXd&TT|IGZ{P9nr(< zc3+>FWB-6MQQ>x8X*E8<5-t9s>2zhZ#GlA$p)Jc8z0{%G7=x%<7IT{ z%=&t+@qXa1SYOk!vFlh^sQ}@wT)leh)~%N=F5EE9s`bn2j~N-UA#5PI_zoH?DA7-C z4Dvj3Jm((D*P8=F6 zZrEOj<pm0tcqOS7{{+}^(~YV@fY8Nc+WOBp;5i_c_^SCU-JfwP%k zb3h1@q~P`pPNI#O{113ye+erOkH&FP{Y(q8yif|m_=p08xp{aXbG7vGV^~t}@VGe6 z_c+Zm5({oBV8={+=v??FzWXxF==i~h^Mzzfdaq72!tTO1TU7Hqw?clo|FF^J6mizi zl2S?m*u6YjLJ!6L(vQKxa6lnhsuM)HimQ8MKOjkd`utfN3bbK~YIRMGb@eSY7N;}O zNXCG`K&cNdYI*XRw*hK8I6Kd+tccDv1!QVem0DfXH8iAw^rFa^Bb@wX%<+|sjEs7@ z#fO=CpSg_EG#~FvAp-f#P3U& zB0D+Ul!AroF)nHId7GBxrV;sAO}I$EGtALeDPJ=cO04KPBRoD%u1;rOdI@Y>pe1Es-#C?>ezb}l>YYbpRkp#%< zu$o&&qgKiQFmr9P=DF6Y@BC0lbk|Q->$t*9xpWq*Kd%vB2`KkyIXwXYSccq~xItI! z+ry2Cj=1NMOG`_{LuzeII5;?(uKNmYkxYS->2r`lfe?lP8bf_|IkrN_A?<+b5N=-1 z_xDJr6n_v>t0%&m8vXE-dkuZRe9;Gz*wD~`KxR#+!SGFd0}tso11->mJHJ*Vw#{>#g5{YYPp|>_a?uh7o*js&Ohvd{RP;IiFuDf`pZa} zIawT+tyN{!t|ke$L(r!?)O}^Mu-j}1o3YqT}B#Y)iGNvAs`!fKMC<3u|mxB?5Fj_h9jEoF^6$@2gpHEceobwo}Gqdbn6iwKS4nF_L6X5PLQ@hy10*$dGZHrh0B zwBUIlIefJ4=J`*Bn4J{)UlIdl*uMwdz5M@2spvU9JTd=D)=ql=@87@N zE!|p(mhm9;=6~P$|LL*cl<+|Zd6^-T>|Oa9gW|@(NRh#y5DptiCcgZkv9URfxA}c9 z%`7ixGCEDSZl&VReh7BFWye9BMM%+5pG0|a8VSmY!#Ai4Y=i-o${5>0J%((L*rSk1 za!XSNU8fLTvHhQV3+WBllfAc4YXM$)Ls87m-mJP5x3oDwFO+y|OMksHjl>ef2>ErC+5g3{kwyY{IZV4U1L3;~U@smy_jmLpH*Aw-Y1C ziv++{+%L|b#XK`tBvbukqp7J$mWjEk2+w~lA~FMo5TcKB?1D})#}^7^AomW&Vpm+f zcEu@XAw;KskqV-Epr4(cy_S+v!oS>;VUCOC^gCHK=0!+Ss7UqKIwnJO4~k~%&$A|N zVYK5A!6rj_nc1YTQ$@pP;lxm}vE9uc%*tbAMkEN~0K!-%jcEg}{Do?FXv45%Azb-~p2H+?lZt0Zxcm94R-5JZ>(^n2%qFW_KVHS;a6T}t)x-okjj%AkdyjioStpGz&NtmvYMe@} z{2d%r`g2km(s~y571hUyS`))xy=I*_k7O&!Qpjd``|Aq3*?0>unb?)4Kr$&q!;Bqs zD@bJJm6cp2DlqklD*JS(?2_}*wIB_cUeqXnZUA6ZuFCG+`1tti*RQ96<>#oDh)xts zcf|9=0L-;K*)y^oyqs*a+*f_NQH6vQB^6axHW>}bFHK`(F_1H}vr$Ws;;@L=bwLPO zp|jhZ)W}HOd@Bulgxkfr{XHg4aga`+CW7<(Cw?u}z z+1c6QDtji7QRqs4u5~_}qU7X^*6;kfy-~Hf1Bfa+MwcF5!6xDQ4j8#B?saP@aC5me=c{EFc4VL7RXEIe;SU4Ay-e1ELUt0ebB0FM0m-4m z{C>PEEg*plDCHFuZ<+58D2((OvLO=0vq=XJs8|NhGhHdYh8Wkc zzlCk|Ct&r)qgUi8(Soe-P}qMOYC9zt7gu|5872;n0VE>s-40fu`vMy4e1lFj#>e%itkL3dxDr4; zc;dLDYswx|`RSK_(Zs>#)2il`!W@7q2sZ%sl`5O|_l@gXL9@e3X8P9QA%YNd)yfKi zVWCt@O+_GHIP5owrTEU-0C{wLed-5?p)X&H4{E=Zl@$wYaC_+@4^!N8`!rCr9Gsj& zzJ6^3t>$>Qn-9(5e18Z6s9H|yCsIgZ^^q8StX7%=BLf-GV|w}x$Yk#4`}nZEj~+k9 zYFUZ{hRy^mxly~|JBXuz713z4YPkVKPy&-9r=|S_m0SOL)@@we7l^Ld?fy48Y~DsQ zx%YLQ+qq%SH#Cq{?odm9hp?EPn?t+LqKnbn+j|8aUAD|jgW(?L#p%>V7*l09odSX~ zuUxtE4M2&%{~t(GP5MQ&?gsO1;efQ)Mv8p)SBDJ7tWyV#mwS`1!LkUa_ai4Zf=Npf z=6=u5i|^tr6lOJPNkar*gQ$0!HD6^@MV~;r0F73nJDz9z-~iE&7}QGrA!l78s7V3z zD6d!ndC1^*j>_58#W@+a4^Z8s_mJc)*M^^v>)c(0Pn>~1-ZrH&tm$^FhtM%lh4S() zeS@qIbJ>9toRPhueDU`jjsW)LH#^!xlNf%zEPz7Tp$H zM2m)fOyQF2tzfd(QiSXTp)OsdFF~#|TvTp6QTY@pU@(c5EK`D;=yn_9A^>a<* z_f5bD8ws3LvB=xR#2trI?)d}rX^?tAEzb7yYEhiUyOStqXR+slLC2o^Vu)6QMv3qA zZT<6^m6bL?R|TrM+~<4!D=U}gp-_!-R@>Fz0pGrnQ%QVnhnvYjpRUCe;G*V#wse0(t!CFHhQ*wF=9HB%Q5Zvf%<93>IRx=5TTj;vQ)vP27BO%-qQa0wD<4 zacx#QY=j^DndCT);5?lkZYnJ}3keAo*l%i%78})rEQ#t_-DglK6s$;0gs}qLoL9Bn z80Q4?j;xjWs#m+%Z`VtKq&%Pf{4i^4Yk?@~8ig07q)2L_N39+ewA; z=&ldxM;_$J=&zP%N0vZ$(SE=g_5J)g3HoqI7X&%!Q1T=bc#+1_Cx8DdEPuOTH&UNb zKY0=i`EUn-r0(-)-(ez>{T7g_9T(&5dzNj6P1!;Cv$VE`pjC6k+V~B}IGkwwU~{S) zM5S-W!9}2R^nH7I8G_|y<7d2M03b!{$MoX*MbUu!wiaT{FVW;%!lq_`Kmi<@ZY#!d zrzkBNkTO@Cq=x#R4Z5)XrQXY-tu|wnL$AnO2bQ-zOxK1B0Ey~%L?xaj0Uq7j+OjY< zU?VJA7xMe^WdYg|x&s+9BiJJZ0m2|+9<_Pm0FY5o88XhPnIt z4y6C?A#V2aqS9!$^L-^4Y~na7c+4c2Q;M-4^h}tb4zN$rXk3+J`MrgL$e1~$lDjh3 z7;kOwTH1zI*+HWQI&D8d32LEEa0yw*k9CLYbI8WYyDJ<$&g&2$oGdqu^8NHF5eCyX z2MIMDCl$&EqUyo(!&y9jB3lyHe4IFF94<1i!slYOS|j5g^@x&^qs9(2jAf(U{r%4E zMfAm>h+{A2s=6^lHm(Vo$bQEF;fJ6nfxwx{0C*UBk?GhT<>egn-P32WbwKh#i);>} z5coc}o}*Uw1@=RmjnMo#BNY|8l9CeO)z~(QIs3hF>+W8_HmM9eJS0%DU{#^z1yZ2D zuudsodtA%OsP4H+Vd%tam0tV3G|9L&APQk`yOSaS1t@8`rtTRVvk^jb_y}k=CR@;B zt=ib%xoWJC5FwhI`clP?;TPe(-#TLG<6RF_kc1ArVZ&j`3N~})0g{)~o3VW!PCeA* zykNHu?$?L_^l9gG_Du}%v=5ovn?EhVE@#`#&{%?MF91Lo#5jloCz*7^lK<5|WcfM9a>LchAd4qD{0mrCNrx`oF zQXC?EAu~O`?Eovuj{02@lJh~!Yc?)fI96SosET~)fxg|r+Wj4xIWC9OpL_y^vsDh@WJ^of)mRF@HcD{Ewr@(w$^Z@Ftu+k>E4|?9(8qfa?uG1 z338iXxtOUaDJ|AVpHfN1ugSZmSK2J|gZdrKX-x&^{r*k#bVoJ2s`FAD%YADFzOoz; z3*lLc`1DrK*|U+YCVFVaWiBp$)2SvN!ig5G?F};sR?BzQtzs@4mW_d?bq#ux-+-z4 z-+%HEN^$}SULQR?;zm!7kD>B?95JnZ9QBBb3gK8^NO@M|<6GO?F>@8OuN*oDk9F%5 zjl{b7j7%s$HS8e=)m_X39cyD{!Q*2HK?j160cJtpjIrkh`W9q)B%EPY!%`U^Jb2(R z9}Yqe35Ugd;6|*#%g3A?{6^QGsB#=b6VI=#>=_iHhdexSv~p?8(8WTi;dq5Lh=P@m z1@#KY)?ENpBJx-^q6`B7E0P-lSR)8rC9aJH0_?052N6eWj~9r5Z2kgmr|WdHF5z81 z@t+CM|GOAei+vFkV9-UJKDW>n*IqW|)(#E7c1VfXx-OU<>m}cn8Ia}=(%ym=F|+w3 zHy8q1L2C-P#(c|Qp3?7$&9*|+Ft}x6>S#X3bF~m6pcm4a?USHeHxNDsiek}u(9p6C zh?w(rRR#K;gwRm~^l%LXlk)QN>BYrYke^W)n3!|W=t?yn%zDvuHVRFXc`lrFs4PdP zr$|KZIq^VEgXXASIoorm8d7|G{CPf5`ZHxy%Pr@;`{epd->IeRKzmaXC_{KcjZuFZ zaH{7et(|}s!c9^Yvl}}*1FYuTGGpdxsi>Na2ts1Jh{(vK1O=}^ApU46f2xz5%R%A)Em+zsZ-nbf~xK^Ky_LFmB$IUuh4g ze+5kkxqMAU!hojb!*I1tB{RtUaZVbbHpHc}&pBzPi4y?S{0V@TfY*fs(3s@A&$7^+ z0v(zujG|rq;j1r{4<393&L)>CikCjwK_TFcOH3>dZBnE&0ZK-j)t_@q`?}-XFip3% z1QP6Po7KBtc8;LSQE|Wwowb(bZKzMnBSq3Q{kp=2Zvuh{ zr}xW}>d^)H1UbjFYE3`Lw2vCDCoat9Eq)3lYt}C)FqlkGAGbbydy|EC*mx+auLlM`|I0B$DU=4nhhs*q&|VWF!izP<)dHY!K?GA_xpk zfb9^?2ztDdS{y|JPx4M!qN5_4n=cw^Da=-e#p*1w|pA4-vWG4uXEFw zU{iv&NfPh`7+LVwuU}Uk@fp=yKnG0s=ZJl7|E0ouaiK~n58A)g2cssC%%QskP8OMk z<<6)l9>5EC0Xm07L^Q#V=4zXa{ov$)hGX^l!5HY!va+(nB_@$9?gfzU0KzX0w*y;y zoX%7aYK!DE_4y$LkpmlofP4s*2ZRi|-EL@N3IZ8I`~;APh&io1VWKQHOVa72{UOkg z=DA7C5d`R{FHM5T#l;2A1@c+5iAtD&D4eEDnPl|3zbDxzTMyE&V_>vQRXy{AHm>e- zmuNXhGZyNTY;#l#j=TGXI`!ZUij4%IK|zR!i2lv2Y!o@GsREIl-}i7cuM^mh&Nue= zvx1Tqg23^4SY}Sfm@V=r_iu_vvmibVUK2_!MQ5)H zoa~VD(Id{sT9$QqDm2zhHz}Wz@>`wremh_6O0bzWkD(q|{!;N<&f)L=LrtH1$(Ah* z78If^*L5FIgDa%P*0{j~5jIyISdzKIvyL^*cim`0q$4!5xVG1+wRdxq@~qMZgNX+c zif?poUytz?8+WwDq-YT6nz0x!mG{7%oe7z8^uYOARn@qJovMh_`aDSQ?Y_I`zzW5R zHihSl*5>D-& z4)5`r)(^ZaB|-1TzQGm-)%6Q_ia6iJ6nBl|_L*-6Sq~Z=9m=6qldk!+d)9r=+PwSQ zP$YALB%wwtlg<+t=i}Kp-Xl-kS+c8yZMW~-Q32zboQi2#exkqJEtHlmlhjv;5SnU#JK^A+ixY@Sy0QI-z?+rYEr%4RE z$)<<&*-{71Hz+7_(*owA^b zFm-1;FMi)^pYJV&MKoo%wq8+VSTRP?4V$K10cTL0s8ngFVeQXg2nIhm9BCF zXFbjFa`@N5B#7hVvDl%nDJhxeL>kkn)o&Q)s#XF<9k2|x{M7I&T-zw@Xw}-#XF1TX zvu3me$(}}%Wzi4oNz8WZTQa^9`ZE3~1|1OKE83qc=sm2eVz8E-i0D#kwKE-I_+&@h z`&s`?YegHywyZxcWiEq{NwE?7#?NbWcGjY%-ojSFsR_oW1%O)5K2pzYoJgHKbHu{d zGOrr@v9Nh%65~Doaq7_9cZ#rd?X0xCPO{jO6}=xLt?&vBF--r(0c9DD1bebz*`1YDe==yG`@YCRJ8V|Z zs{Qn@+T;s?zYE#mnQW?aaT#7%5zX+!G_R_VY3>hw?8H;w-#;i3r`}q4*ZT@9EK4*r zQ>G8Leff21HSnzi7?oWw7o4D9`W9H{%S&O_%{- z(=Jinw&TDMlcZv9_q^Z;KxdVvXlGuWBPAv7Sp_4?%lsiR<~#hp#N&gph0bq%IW1rP z6vL2lF)SJNFKK$89}*IKiQtEcnOTRZge_g@j2H|i;Q>MIUH&j)uDCBh73pi_{TjQT z-5<{DmthxUioRU#W^yEpxIX{nwK%tZuHv*_0KLg!y<{k?5NS|l$RMU5Pe|VYc#GeS zMF6)0eL254=Bdd&5CfWLEO0@`1P>Qzt0|D6T%ZvwS_L`05Y(~v#NGQl?M(eZh*7d~ zaus&#gdj5M0~SK~J3ODodO;j;XSfcu4~f`KrAaS?0R0(i4fC5HsCcIp+VP1AFjcSs zx|~Dm%{#A_z*jknysXi&ZC{K^#F_77NKeE$3M5mI^l*klOQ}Wj(;DsW_O=ZE1XVga zi1;AiN5cazP5;-8MVfH;{H_9r0GR#K#)b_@RP)r7<7U^^77pSLvDZI%#Ew`l3rvi^zIrLF?`E_>WY7~A+8XGC z1s7HG&5*qS16Cp+lof3uP?6)Deih!p#Jv1XuRQ|A_HOjkRTd6&Q$6OxfZqgVD33~So#G2w}|AcP?05<1}^ zc!G71cXbBk;NZ|xX={Q43t@KF`75`sr+{Vwki7)>8O3RxR>`FX30NPLR7ARjAzOog z2V4YA(D7^ne)Sr3(g7cg;Pfsdqw3g@S@{DfYkg`z#nSuV{$6#QX!fbwb5g7*-)hW# z+JW>H1t&#yX~aZC-h$H;#xO}6wZAq3=Buw;0Ca;RA|mE73?OU};~!9yUg)6eE%o*H zheEHy3UC|5BhnuLIR;T7+6rJ#=3yAqB}1AI!J&eTm2;PG$C~jy@B`$LfI_gqx8~Pt zXp_|~>EOUI*BoeYcJxoG1S*7RWq^;2hQCul>);VQSC))Q@XMt&JAEojj&LEPlIocS zZx8>T)PITE)WSYpCsVe1VOiu?E-BlHuQ~?Bj^YCWg7+h)3-vgBDS(D;Kx_l<(hoz2 zX?Y6S4n?WL`Gls_f8K)Rn;PiXuFcKP^24-|jtq$7=qygvEECYQyMBiXfQf&4IyJl6 zf#3YXqB?4^J7E#}1|T?J1CNf&zExv$^Br)M07M6aFA5|ggaZNMw6L~LhI5jY?Aa2J zeZ<8}TE`%;$o?iOhG<)N{7ur(Dr-brIbJnOWEW^mWrNV;ZPENxd&@T6CP zq+qG~@Z*QSmlar%eEs~yYP+r?@=#x2pCLR0&IibeGN7@e06*t?)`A$V7q5(1M|$uG z2t)v#f{ThST`D0BnkFxVE$%$v6Q-i>7vA4okW*6nTV0|VU1%3=EL*3U4@s{j7O8*f zw@KQ_bvQreh)Mhb>9T5Rs*Vp)Od-Q)X=#D3;Op!A2FwYfRgh1%j^+a8K>1~ORSz1& z@^HaJ0q>hLpfOZ~YZhe#Y9Sb0{+y~KCMDw%;6!*JScvjRP^7?<`$|ldP@uGCdlmxX zqx<;|FkdV<#E@TsW&n0G=zz7q6EnaFj(gSLf6O$9$nXkI|&YdR_Hui;2F<~ zMubI>qMu{|*A!+c(l6^bH_NSHm&(BH1eq<-v(JC|ea8btCDZmv%#tZ#0@HZLG`l-H zNkELDTQLh%NHV?Nl-(LM4a8S7<$jUND~KWE`8742Rk$Re@51JIOjraQ0YB-Ar4N>p z1N)MMFxA!7!8uO{##f{@1Pvaq8+aMudW~e#(gz$)ne|)nHve5-^QyRt?d_$)u!#Xf zhmlS!qHi@%1H~^v&Al7Ie_ap49Ff-$<^zZK78%*5eEy(urb6~T5E>9MTxX)v7F1S_ zl3VYhnqjl%B*+(h}2&EbbO+Q-Eo!e$(!plMsD1hR^!AA%DHXSm& zz02Et+0+{-XwE1Mf;C0KZj464(pGOO7nf>`2I|GO^tZ${P&=UuAp^}QTZJ!xRY0oy z18I9C&xp#i+_}?wSa@0NzemTxqrs9i1EdtnizY!xhZwlgxA*twp@k~1be&@3L)k=E zta_U4{*)qvk!a(T5RB_1233lzGe*#bbl&8@hA5}hnxtgqM(CAxv3^vnU@v>H-0uTDCTl2B;3p7~mAwt7L~JAj+0=IuiLe$~kN@!{ZHE-$YcPmp7l-}j{on6lp z0MqC~ZcN%`kYi;!;xJg-2{)da0_9X-vDX~2sa;M@obdSN~ z3zbG)MhRA{hmMRa$(GB_()Q7ye!V4qkX~MCey<_Nw|<#^vvdJfLauKWBjSb;PC(#r zN~><@A=!?K${SE{Mz$xe{m-P{?~VO((UH-%j|*}>tU|FT>FYxQs|DpA%umP_Gnq@{ z3N)dQ7@;_j`7WV6Ti6v!1dQFQnMZt~(6MQSnrWA6pZyjiR~^Wr%|bX*9y}Xb1oYZlh>)N_PBPue>M}u6I&WB2SKFs3N)q z_Azb;__a(&1t?0yWPz)2KH9l?M9LMYk+Uj_Oz5tTlaEK_+}!o@r>4h#KG%HAB(}QM z`30anw8F(XUv1HA)%VGy0@R$f|1Phzb)$O}>UwMDN5&&x{t|imO{4cex3{lMsMhd} zzj^bis;W>r=U;Vn{P*34@Bd!E&h2D!>?enQd6%2}bsb&{)X&15ItYpofxH#|yR0?0 z?-=Q^U$$s!^co>0O_@+_)k^QDt%15oA$qT(5L3pV`yER!@1v{lcNrO7)|WpWE0XuG z?n94|pb+Bpw&+3a-K40ckXZ4^Ke{N!%5vuRcE7tZ5-NTS*2A*MR49?Dd~+4OAvL8+ z%r2V0NYBI+V#-dg(;|zUm@pSu;qvZ}eSJ&eQ5oEl*Ssfh7)FoL%(Lk_HocjCCM9KC z0K>f&1Z%!ggvt)j3C=#r_0rybD3mM{(b_^=4gk=Bxkb>Og7l4D6-oBsXXqkZnh;ST zp+>b#duNt+Y-72V9R~;M7^q$L#CgSKX6Rrb+e{Dr@yc||NDK%>3AQe^Ye407YfE+YLN6G zuD=5_$+7?b8`2C0c=kac(!yPH$_sw9I7XgzKObF2ckjoQ5b5nEw zTcIVG5GOG<(u0Hr@P><4;G#lw06`%k&XR1Xu4ZOtXVAm~7JSFA@fWn^Ijk3MLOQcG zrvEnuW|%?*EiW%=_Mj-ZdrJj^VU{Sk)%ZM|`q87rp;bK-0@yfy?mf7DI{%1^i?BtR z@nI;qa-W*~Mhfxqq>Bo&wMi+J>707Uwonql9Uz>on2UjdK@QzuFapjkEHnY;8SMP$ zK_%r9y4{9C-0jd10N#!T23{)QtU#hcvr9GuArIEJhqh1}onZB=#$cG9Sl9=X--OD~ zYcSsP{(W$AyH6Uq&yam17z7Iru1@6!Pv+R0UAbbHsX&<@jDg#n@e zJ}rBop?oY4_Qbz`Pt5_qKs|`+L>yPhl`ObYhW2AcL&a9!dm((>h-B#}&aLY!bY6qh zr#k;OSoEv&4Lx)Zw4#wUd42X6`0&y`L7W9)RbwXUk9wi{aRa)om2RaVl8Aq6xM6v; z1Dyf+Tvfc}Uf)*TOW(i)2JXx}&6*qUc@KyqMBP+ylI5_NjE{(ptaWXNa-&2ZoQ|M#t==!bXPzyc`&!VLlQ8x%g1W&@l?xVmfk_skK{3i^AoaZZNtug^)! zW<0M?1+pq`kPX$c1<;pI+-o79Q~noAJ|7STF&-TkAh{TL*r28G1K7#R04<>Pz(M1y zKa6u;cd$-<>=Lro-2mnE>{<2aNgE-JRPe~ztGYoc0>u8(wmXr5FNAQ9`ai|g-@WVS zZiA|A!5yS3LoK4+FiLWFb0j@Qb6q2_wfwSIV6e?mAPG)ih$<9KPfhOaM20QH&*c7n$6IO2`bZTO(V<55WK6}W7df>bP)l=6Nm9NI=N;}( z8g$1|L1Zj0wD3gVklFZ++G-;2s5|y|tN$%JDZ0>qzr&!gqDJaDoZ$b%m2)VH$g=#O zjN1pJJ<@qtSPGGt{}%26<^Ob(H@*nYUt%KVR-KM+5adcpL4EIN_PM;V(G`Gvv85Dc z*e7+z;dP`=zw;BKwdNoOD8fdFMHoOOW`aCw{PA_Y2e0OH6*a&3B^P%t$eR_7d{@nd z`U##KMCHXzLV*Ynoa=35eZ^-h`Gdo>ez|MHUWCCbE`TSa5XEEFH+dV5U+1N0PK&IF#b8C<@1dSdmv(aVUJ zR~-fEi%2D9iR(8ODN!xpf}`YAjPsTpZf~{4g+o$U z7a){|Q|Fts)8oZr@8j_-G~`IhiiL4SbUIA29T%J#Yj!q-SlB+7ed@P+uttp72m#Ra zBW(fxyYY~{5JCkWs0DCf&43ez!LHt&q`xofYt(DJ!Adn$=8wg^JeT=d{*&Cv#GDJf zD?HOH7Vys-3l59+o#Cge3Fd@?I%Z)-FO?bzbKP~dC)y}s;y+D`O1(axuZCp z$iU1T1Z_Fo+qaSS7--%8l`6rQ-^ZfEqFx^k$lKzfhS&(x$}6pel4nF>u%7*pNd8%G z);wWsd*f+^cOv(tUcPh5L#eqv8(vBAKijgYx-&}1Lfr@Q6tN8aYGF`G3-J{qMt<-{ zhkg|xr!%E6GV1UPY;F(Uod`q2zNR&mzG%;9{HcOE7lG97APCMV3a&2E+ zn*G7a!vfySQjJ??3|Bs2j*7IyEb&gx&V$3l8Q`eMN>6|F`0-;x5|WZqgMd)G5}`*zHwA7r z9)1_P`S5SWu)SFReyw}AE7efsNu2LnnkMSWO&C1ShAN`8w-qEeJx|FdK8Fh=0^(N2L&f=fcoa4h-FMp%LPaJ;Y>}JjjJ>PGr zW$$MjkwZtl_t51D6WPXBE-NWn20`E0&`?@VE)0FmQAg+Omn5Y0foRzhTMpK7u^ye?H5>x_naaiCn(YS244mUK;h)U-IC2u)~8Z?8-or?s$zghX3=dq2Qm zTTs^F@suB<+vofEcu3FL`LqBOtyIMh2sO?|6P$Aq$Mdx&ytslw6+TW*G&MEt;Mx

=*U>^fzmizXG=hWzs|xj#s-bN28#m<72bG-OGM*{9Fwt@y%36I1fWH=H zB%;#0>?Ul(5GWSzTYtZYgxr40&YqQ$BIxSs3cc%)l1KC*2Ko9Day)67q-APTf)7qq z*s}h{67MhkX^9P}JG>3nsj&#WHfVu7Oz2ME*|8Flb$74(_;Z?CAbMzZ5Flo;`-K}8 z4o-GOg^E->cR{IM+|$^J?$%zdMQnwqp)1HZ^q+^}-MiN|w{2)@Dh?)u9_aWCj*Zca zj20OLwzaj{fZG}G?p;GGE7^w+A7XAWF)=B*y4HOD{Mlx6lIN<&OIW5k+D8pAOKfX@#y!4R~6U@2lw{a%whG(>){K) zDMX8lk&%@pO2+3F22%!TySOSKAdr=lGtko$1cpr}kx{tK3)*7p__#WZwxq0#{@!W9 z;+O&1OH)hlTkf9+2{n;$9>&%q<8_gK^~&c98DHM)thNT|E~5`bR+g5c_;Txti{J-Uwd#0zqrQXr{EJ)6}7%%@Q3Jn#+St<}s3C3rU5ag=MYf9}*QIOChns=x032p7{ zRuJMqawL1J0flP89!p$+L#V^<}|uQL1QcWo^%Xy~Rdv0&qtM|gWL0QFab$A}WJyF`Ssi(K8<`fuoD z*c@(Xm=M65j9^wF#XwU;WHmJ6V9yqshjP`@PfnafWEB(!&p6;c5&F)@eT%!9m6fU! z6BAh(8PYU&`#_?6B!Y*B7m~8EVFsd{l$@NL@w;~twIu)Zsdw(&F*Y&j2cLhj<(%-b zOYJf9!QQf*7e7Uf>!~6{3LzO;**FaJz0J+@nNt-Jy1%cq7V_1^(w6Ir3%>RN_q(>Id5Y w?IX$M {}}: let + libPath = with pkgs; + lib.makeLibraryPath [ + # load external libraries that you need in your dotnet project here + xorg.libX11 + xorg.libICE + xorg.libSM + libGL + fontconfig + ]; +in + pkgs.mkShell { + buildInputs = with pkgs; [ + dotnet-sdk_9 + ]; + + DOTNET_ROOT = "${pkgs.dotnet-sdk_9}/share/dotnet"; + LD_LIBRARY_PATH =libPath; + }