{"version":3,"file":"core24.js","sourceRoot":"","sources":["../../../src/targets/snap/core24.ts"],"names":[],"mappings":";;;AAAA,+CAA8H;AAC9H,uCAA0D;AAC1D,6BAA4B;AAE5B,6CAAuC;AAEvC,yDAA8F;AAC9F,gCAA+B;AAC/B,+DAAsE;AAEtE,wGAAwG;AACxG,MAAa,UAAW,SAAQ,qBAAuB;IAAvD;;QACE,qGAAqG;QACrG,oGAAoG;QACpG,iBAAY,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;QAElJ,uBAAuB;QACvB,uEAAuE;QACvE,6DAA6D;QACpD,uBAAkB,GAAG,MAAM,CAAA;QAC3B,oBAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;IA+dtE,CAAC;IA7dC,KAAK,CAAC,gBAAgB,CAAC,IAAU;QAC/B,OAAO,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAA;IACjD,CAAC;IAED,iHAAiH;IACjH,KAAK,CAAC,SAAS,CAAC,MAA0G;QACxH,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;QAE1D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACvE,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAA;QAEtE,wDAAwD;QACxD,sFAAsF;QACtF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;QAC9D,MAAM,IAAA,gBAAK,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAE3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,yCAAsB,CAAC,CAAA;QAC3D,MAAM,IAAA,oBAAS,EAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QACvD,kBAAG,CAAC,KAAK,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAA;QAE3C,mCAAmC;QACnC,wEAAwE;QACxE,MAAM,iBAAiB,GAA2B,EAAE,CAAA;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAA;QACpC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;YACxD,MAAM,IAAA,eAAI,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;YACpD,iFAAiF;YACjF,iBAAiB,CAAC,IAAI,GAAG,qBAAqB,YAAY,EAAE,CAAA;QAC9D,CAAC;QAED,6CAA6C;QAC7C,wEAAwE;QACxE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACpG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,KAAK,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAA;QAE3H,sEAAsE;QACtE,oEAAoE;QACpE,0DAA0D;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC5C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,kBAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,kBAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,kBAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,iDAAiD,CAAC,CAAA;YACzH,MAAM,IAAA,sBAAO,EAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAClC,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,sEAAsE;QACtE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,kBAAO,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACjD,MAAM,QAAQ,GAA4B,OAAO,CAAC,QAAmC,IAAI,EAAE,CAAA;gBAC3F,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,SAAQ;oBACV,CAAC;oBACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBACpB,SAAQ;oBACV,CAAC;oBACD,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK,EAAE,CAAA;gBAClC,CAAC;gBACD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,yCAAsB,CAAC,CAAA;gBAC3D,MAAM,IAAA,oBAAS,EAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;gBACvD,kBAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,8CAA8C,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,kBAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,gDAAgD,CAAC,CAAA;QAClF,CAAC;QAED,MAAM,SAAS,GAAG;YAChB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI;YACpC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,IAAI;YAChD,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,KAAK,IAAI;YAC5D,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,SAAS;SACnD,CAAA;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,IAAI,IAAI,EAAE,CAAC;YAClE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC,CAAA;YACtG,IAAI,UAAU,EAAE,CAAC;gBACf,OAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAA;QAClD,MAAM,IAAA,4BAAS,EAAC;YACd,eAAe,EAAE,IAAI;YACrB,YAAY;YACZ,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO;YAC7B,GAAG,SAAS;SACb,CAAC,CAAA;IACJ,CAAC;IAED,4GAA4G;IAC5G,KAAK,CAAC,6BAA6B,CAAC,IAAU;;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAA;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,CAAA;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,2FAA2F;QAC3F,gGAAgG;QAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAClC,MAAM,cAAc,GAAa,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QACjH,IAAI,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,wCAAyB,CACjC,sFAAsF;gBACpF,6EAA6E;gBAC7E,4EAA4E;gBAC5E,mCAAmC;gBACnC,sFAAsF;gBACtF,0CAA0C;gBAC1C,yFAAyF;gBACzF,gFAAgF;gBAChF,gDAAgD,CACnD,CAAA;QACH,CAAC;QACD,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;QACjF,MAAM,iBAAiB,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAE1D,sBAAsB;QACtB,MAAM,OAAO,GAAS;YACpB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,CAAA,MAAA,OAAO,CAAC,aAAa,0CAAE,MAAM,EAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YACnF,gBAAgB,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,aAAa,EAAE,yCAAsB,CAAC;YAC3F,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YACpD,KAAK,EAAE,CAAA,MAAA,OAAO,CAAC,YAAY,0CAAE,MAAM,EAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;SACvE,CAAA;QAED,0BAA0B;QAC1B,gFAAgF;QAChF,oFAAoF;QACpF,IAAI,SAA0C,CAAA;QAC9C,IAAI,QAA8B,CAAA;QAElC,IAAI,iBAAiB,EAAE,CAAC;YACtB,gEAAgE;YAChE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;YAC3G,SAAS,GAAG,MAAM,CAAC,IAAI,CAAA;YACvB,wEAAwE;YACxE,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,MAAM,gBAAgB,GAAwB;gBAC5C,cAAc,EAAE;oBACd,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,uBAAuB;oBAC/B,kBAAkB,EAAE,mBAAmB;iBACxC;gBACD,aAAa,EAAE;oBACb,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,sBAAsB;oBAC9B,kBAAkB,EAAE,mBAAmB;iBACxC;gBACD,cAAc,EAAE;oBACd,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,uBAAuB;oBAC/B,kBAAkB,EAAE,mBAAmB;iBACxC;gBACD,eAAe,EAAE;oBACf,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,sBAAsB;oBAC9B,kBAAkB,EAAE,eAAe;iBACpC;gBACD,UAAU,EAAE;oBACV,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,gBAAgB;oBACxB,kBAAkB,EAAE,WAAW;iBAChC;aACF,CAAA;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK;gBAC1B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxC,CAAC,CAAC,QAAQ;oBACR,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE;oBAC7C,CAAC,CAAC;wBACE,IAAI,EAAE,gBAAgB;wBACtB,GAAG,EAAE,IAAI,CAAC,YAAY;qBACvB,CAAA;YACP,SAAS,GAAG,MAAM,CAAC,IAAI,CAAA;YACvB,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;QACvB,CAAC;QAED,+EAA+E;QAC/E,oFAAoF;QACpF,sFAAsF;QACtF,gFAAgF;QAChF,qEAAqE;QACrE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAA;YACxG,IAAI,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA,EAAE,CAAC;gBAC3C,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;QAEvI,qDAAqD;QACrD,mFAAmF;QACnF,kFAAkF;QAClF,wDAAwD;QACxD,MAAM,SAAS,GAAa,CAAC,GAAG,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,cAAc,mCAAI,EAAE,CAAC,CAAC,CAAA;QACpE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBAChD,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,mCAAmC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC;YACzG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;QACD,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAE3E,+BAA+B;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAC/D,MAAM,GAAG,GAAQ;YACf,OAAO,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,aAAa,EAAE;YAC9D,eAAe,EAAE,SAAS,EAAE,6FAA6F;YACzH,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,eAAe,UAAU,CAAC,CAAC,CAAC,SAAS;YACvE,OAAO,EAAE,YAAY,eAAe,UAAU;YAC9C,UAAU,EAAE,kBAAkB;SAC/B,CAAA;QAED,mFAAmF;QACnF,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAE5H,8BAA8B;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAA;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAE5E,0EAA0E;QAC1E,6DAA6D;QAC7D,MAAM,KAAK,GAAyB;YAClC,CAAC,OAAO,CAAC,EAAE,OAAO;SACnB,CAAA;QAED,uEAAuE;QACvE,oEAAoE;QACpE,8DAA8D;QAE9D,oCAAoC;QACpC,MAAM,SAAS,GAAkB;YAC/B,kBAAkB;YAClB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,QAAQ;YAC5C,KAAK,EAAE,KAAK;YAEZ,yEAAyE;YACzE,qEAAqE;YACrE,GAAG,CAAC,IAAI,KAAK,IAAA,6BAAc,EAAC,OAAO,CAAC,IAAI,CAAC;gBACvC,CAAC,CAAC;oBACE,SAAS,EAAE;wBACT,CAAC,IAAA,gCAAiB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE;4BACjC,WAAW,EAAE,IAAA,gCAAiB,EAAC,IAAI,EAAE,MAAM,CAAC;4BAC5C,UAAU,EAAE,IAAA,gCAAiB,EAAC,IAAA,6BAAc,EAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;yBACpE;qBACF;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YAEP,yCAAyC;YACzC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,WAAW;YAC/C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC;YAChD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW;YAC3C,IAAI,EAAE,QAAQ;YAEd,sBAAsB;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS;YAC7C,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC;YAEnD,cAAc;YACd,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAE3C,sHAAsH;YACtH,MAAM,EAAE,MAAA,OAAO,CAAC,MAAM,mCAAI,CAAC,iBAAiB,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAExG,aAAa;YACb,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAEhB,QAAQ;YACR,KAAK,EAAE,KAAK;YAEZ,OAAO;YACP,IAAI,EAAE;gBACJ,CAAC,OAAO,CAAC,EAAE,GAAG;aACf;SACF,CAAA;QAED,OAAO,IAAA,4BAAa,EAAC,SAAS,CAAC,CAAA;IACjC,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAsB;;QAC7C,MAAM,GAAG,GAAkC,EAAE,CAAA;QAE7C,gDAAgD;QAChD,IAAI,CAAC,CAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,MAAM,CAAA,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,GAAG,kBAAkB,CAAA;QACjC,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,IAAA,iCAAU,EAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;QACtC,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IACtD,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,OAAsB;QAC/C,mDAAmD;QACnD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,OAAO,CAAC,MAAM,CAAA;QACvB,CAAC;QAED,sFAAsF;QACtF,OAAO;YACL,uDAAuD,EAAE;gBACvD,IAAI,EAAE,2EAA2E;aAClF;YACD,uDAAuD,EAAE;gBACvD,IAAI,EAAE,2EAA2E;aAClF;YACD,0BAA0B,EAAE;gBAC1B,IAAI,EAAE,8CAA8C;aACrD;YACD,mBAAmB,EAAE;gBACnB,IAAI,EAAE,uBAAuB;aAC9B;YACD,oBAAoB,EAAE;gBACpB,OAAO,EAAE,wBAAwB;aAClC;SACF,CAAA;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,SAAiB;QAC1C,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAA;YACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAA;YAC3D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBACzF,MAAM,IAAI,wCAAyB,CAAC,kFAAkF,QAAQ,IAAI,CAAC,CAAA;YACrI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAA,kBAAO,EAAC,QAAQ,CAAC,CAAA;YAEzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,SAAS,CAAA;YAClB,CAAC;YAED,MAAM,KAAK,GAAwB,EAAE,CAAA;YACrC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAChE,IAAI,CAAC,IAAA,iCAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,wCAAyB,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAA;gBACvE,CAAC;gBACD,KAAK,CAAC,QAAQ,CAAC,GAAG;gBAChB,iEAAiE;gBACjE,uCAAuC;iBACxC,CAAA;YACH,CAAC;YAED,OAAO,KAAK,CAAA;QACd,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,kBAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,uCAAuC,CAAC,CAAA;YAC1E,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAyC;QAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,CAAC,CAAA;QAClB,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IACjD,CAAC;IAED;;OAEG;IACH,kBAAkB,CAChB,KAAQ;QAKR,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;QAC5C,CAAC;QACD,MAAM,IAAI,GAA4B,EAAE,CAAA;QACxC,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,kCAAkC;QAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;gBAC/C,IAAI,CAAC,IAAA,iCAAU,EAAC,IAAI,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;gBACpD,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;gBACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC,CAAC,CAAA;YACF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;QACtB,CAAC;QAED,2CAA2C;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAC3E,KAAK,MAAM,IAAI,IAAI,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,EAAE,EAAE,CAAC;YACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,0BAA0B;gBAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;oBAC9C,IAAI,CAAC,IAAA,iCAAU,EAAC,IAAI,CAAC,EAAE,CAAC;wBACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;oBACpD,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;oBACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChB,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IACzG,CAAC;IAEO,uBAAuB,CAAC,KAAsC;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,MAAK,iBAAiB,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5E,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAI,KAAoB,EAAE,QAAa;QAClE,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YAC1B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/C,CAAC;CACF;AAxeD,gCAweC","sourcesContent":["import { Arch, archFromString, copyDir, InvalidConfigurationError, log, removeNullish, toLinuxArchString } from \"builder-util\"\nimport { copy, mkdir, readdir, writeFile } from \"fs-extra\"\nimport * as path from \"path\"\nimport { PlugDescriptor, SlotDescriptor, SnapOptions24 } from \"../../options/SnapOptions\"\nimport { SnapCore } from \"./SnapTarget\"\nimport { App, Part, SnapcraftYAML } from \"./snapcraft\"\nimport { buildSnap, DEFAULT_STAGE_PACKAGES, SNAPCRAFT_YAML_OPTIONS } from \"./snapcraftBuilder\"\nimport * as yaml from \"js-yaml\"\nimport { deepAssign, isValidKey, Nullish } from \"builder-util-runtime\"\n\n/** Snap build strategy for core24 — generates a native snapcraft.yaml and invokes the snapcraft CLI. */\nexport class SnapCore24 extends SnapCore<SnapOptions24> {\n  // browser-support is intentionally absent here; it is auto-injected in mapSnapOptionsToSnapcraftYAML\n  // when the user has not provided custom plugs, so it always lands in both root plugs and app plugs.\n  defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"wayland\", \"unity7\", \"network\", \"gsettings\", \"audio-playback\", \"pulseaudio\", \"opengl\"]\n\n  // Snap file hierarchy:\n  // - snap/gui/ gets automatically copied to meta/gui/ in the final snap\n  // - Desktop files in meta/gui/ are used for menu integration\n  readonly configRelativePath = \"snap\"\n  readonly guiRelativePath = path.join(this.configRelativePath, \"gui\")\n\n  async createDescriptor(arch: Arch): Promise<SnapcraftYAML> {\n    return await this.mapSnapOptionsToSnapcraftYAML(arch)\n  }\n\n  private isHostMode(): boolean {\n    return this.options.useDestructiveMode === true\n  }\n\n  /** Writes the snapcraft.yaml, stages app files, then invokes `buildSnap()` to run the actual snapcraft build. */\n  async buildSnap(params: { snap: SnapcraftYAML; appOutDir: string; stageDir: string; snapArch: Arch; artifactPath: string }): Promise<void> {\n    const { snap, appOutDir, stageDir, artifactPath } = params\n\n    const snapDirResolved = path.resolve(stageDir, this.configRelativePath)\n    const snapcraftYamlPath = path.join(snapDirResolved, \"snapcraft.yaml\")\n\n    // Create snap/gui directory for desktop files and icons\n    // Snapcraft will automatically copy snap/gui/ contents to meta/gui/ in the final snap\n    const guiOutput = path.resolve(stageDir, this.guiRelativePath)\n    await mkdir(guiOutput, { recursive: true })\n\n    const yamlContent = yaml.dump(snap, SNAPCRAFT_YAML_OPTIONS)\n    await writeFile(snapcraftYamlPath, yamlContent, \"utf8\")\n    log.debug(snap, \"generated snapcraft.yaml\")\n\n    // Copy icon to snap/gui/ directory\n    // Snapcraft will automatically copy this to meta/gui/ in the final snap\n    const desktopExtraProps: Record<string, string> = {}\n    const icon = this.helper.maxIconPath\n    if (icon) {\n      const iconFileName = `${snap.name}${path.extname(icon)}`\n      await copy(icon, path.join(guiOutput, iconFileName))\n      // Icon path will be available at ${SNAP}/meta/gui/<icon-file> after installation\n      desktopExtraProps.Icon = `\\${SNAP}/meta/gui/${iconFileName}`\n    }\n\n    // Create desktop file in snap/gui/ directory\n    // Snapcraft will automatically copy this to meta/gui/ in the final snap\n    const desktopFilePath = path.join(guiOutput, `${this.helper.getDesktopFileName(snap.name)}.desktop`)\n    await this.helper.writeDesktopEntry(this.options, this.packager.executableName + \" %U\", desktopFilePath, desktopExtraProps)\n\n    // Copy app files to the project root `app` directory so `source: app`\n    // in the generated `snapcraft.yaml` (which is under `snap/`) can be\n    // resolved by snapcraft running in the build environment.\n    const appDir = path.resolve(stageDir, \"app\")\n    if (path.resolve(appDir) !== path.resolve(appOutDir)) {\n      log.debug({ to: log.filePath(appDir), from: log.filePath(appOutDir) }, \"copying app files to project root app directory\")\n      await copyDir(appOutDir, appDir)\n    }\n\n    // Auto-generate `organize` mapping for the app part so top-level helper\n    // binaries and resources are placed under `app/` inside the snap. Update\n    // the already-written `snapcraft.yaml` so the build sees the mapping.\n    try {\n      const appPart = snap.parts[snap.name]\n      if (appPart) {\n        const entries = (await readdir(appOutDir)).sort()\n        const organize: Record<string, string> = (appPart.organize as Record<string, string>) || {}\n        for (const entry of entries) {\n          if (!entry) {\n            continue\n          }\n          if (organize[entry]) {\n            continue\n          }\n          organize[entry] = `app/${entry}`\n        }\n        appPart.organize = organize\n\n        const updatedYaml = yaml.dump(snap, SNAPCRAFT_YAML_OPTIONS)\n        await writeFile(snapcraftYamlPath, updatedYaml, \"utf8\")\n        log.debug({ organize }, \"updated snapcraft.yaml with organize mapping\")\n      }\n    } catch (e: any) {\n      log.warn({ error: e.message }, \"failed to generate and update organize mapping\")\n    }\n\n    const buildMode = {\n      useLXD: this.options.useLXD === true,\n      useMultipass: this.options.useMultipass === true,\n      useDestructiveMode: this.options.useDestructiveMode === true,\n      remoteBuild: this.options.remoteBuild || undefined,\n    }\n\n    if (this.packager.packagerOptions.effectiveOptionComputed != null) {\n      const shouldSkip = await this.packager.packagerOptions.effectiveOptionComputed({ snap, ...buildMode })\n      if (shouldSkip) {\n        return\n      }\n    }\n\n    const rootOptions = this.packager.config.snapcraft\n    await buildSnap({\n      snapcraftConfig: snap,\n      artifactPath,\n      stageDir,\n      packager: this.packager,\n      cscLink: rootOptions?.cscLink,\n      ...buildMode,\n    })\n  }\n\n  /** Converts `SnapOptions24` into a fully resolved `SnapcraftYAML` descriptor for the given architecture. */\n  async mapSnapOptionsToSnapcraftYAML(arch: Arch): Promise<SnapcraftYAML> {\n    const appInfo = this.packager.appInfo\n    const appName = this.packager.executableName.toLowerCase()\n    const options = this.options\n\n    // Default to [\"gnome\"] in normal builds; no extensions in host/destructive-mode (where the\n    // gnome extension is incompatible). Throw if the user explicitly includes \"gnome\" in host mode.\n    const hostMode = this.isHostMode()\n    const extensionsList: string[] = options.extensions != null ? [...options.extensions] : hostMode ? [] : [\"gnome\"]\n    if (hostMode && extensionsList.includes(\"gnome\")) {\n      throw new InvalidConfigurationError(\n        `The \"gnome\" snapcraft extension is incompatible with host/destructive-mode builds.\\n` +\n          `In this mode snapcraft cannot resolve the extension's command-chain source ` +\n          `(/usr/share/snapcraft/extensions/desktop/command-chain) and will fail.\\n\\n` +\n          `To resolve this, choose one of:\\n` +\n          `  1. Remove \"gnome\" from snapcraft.core24.extensions (or set it to []) and add any\\n` +\n          `     required stage-packages manually.\\n` +\n          `  2. Switch to an isolated build environment by setting snapcraft.core24.useLXD: true\\n` +\n          `     or snapcraft.core24.useMultipass: true instead of useDestructiveMode.\\n\\n` +\n          `See: https://snapcraft.io/docs/gnome-extension`\n      )\n    }\n    const resolvedExtensions = extensionsList.length > 0 ? extensionsList : undefined\n    const useGnomeExtension = extensionsList.includes(\"gnome\")\n\n    // Create the app part\n    const appPart: Part = {\n      plugin: \"dump\",\n      source: \"app\",\n      \"build-packages\": options.buildPackages?.length ? options.buildPackages : undefined,\n      \"stage-packages\": this.expandDefaultsInArray(options.stagePackages, DEFAULT_STAGE_PACKAGES),\n      after: this.expandDefaultsInArray(options.after, []),\n      stage: options.appPartStage?.length ? options.appPartStage : undefined,\n    }\n\n    // Process plugs and slots\n    // When using GNOME extension, we don't need to manually configure content snaps\n    // The extension will handle: gnome-46-2404, gtk-3-themes, icon-themes, sound-themes\n    let rootPlugs: Record<string, any> | undefined\n    let appPlugs: string[] | undefined\n\n    if (useGnomeExtension) {\n      // With GNOME extension, only process user-provided custom plugs\n      const result = options.plugs ? this.processPlugOrSlots(options.plugs) : { root: undefined, app: undefined }\n      rootPlugs = result.root\n      // Extension automatically adds common plugs, so we only add custom ones\n      appPlugs = result.app\n    } else {\n      // Without GNOME extension, we need manual content snaps\n      const defaultRootPlugs: Record<string, any> = {\n        \"gtk-3-themes\": {\n          interface: \"content\",\n          target: \"$SNAP/data-dir/themes\",\n          \"default-provider\": \"gtk-common-themes\",\n        },\n        \"icon-themes\": {\n          interface: \"content\",\n          target: \"$SNAP/data-dir/icons\",\n          \"default-provider\": \"gtk-common-themes\",\n        },\n        \"sound-themes\": {\n          interface: \"content\",\n          target: \"$SNAP/data-dir/sounds\",\n          \"default-provider\": \"gtk-common-themes\",\n        },\n        \"gnome-46-2404\": {\n          interface: \"content\",\n          target: \"$SNAP/gnome-platform\",\n          \"default-provider\": \"gnome-46-2404\",\n        },\n        \"gpu-2404\": {\n          interface: \"content\",\n          target: \"$SNAP/gpu-2404\",\n          \"default-provider\": \"mesa-2404\",\n        },\n      }\n\n      const result = options.plugs\n        ? this.processPlugOrSlots(options.plugs)\n        : hostMode\n          ? { root: undefined, app: this.defaultPlugs }\n          : {\n              root: defaultRootPlugs,\n              app: this.defaultPlugs,\n            }\n      rootPlugs = result.root\n      appPlugs = result.app\n    }\n\n    // Always add browser-support with allow-sandbox so Chromium's internal sandbox\n    // can create user namespaces under strict confinement.  Without allow-sandbox: true\n    // the app crashes immediately with \"FATAL: Permission denied (13)\" in credentials.cc.\n    // Skip the injection only when the user has explicitly provided their own plugs\n    // (they are responsible for including browser-support in that case).\n    if (!options.plugs) {\n      rootPlugs = { ...rootPlugs, \"browser-support\": { interface: \"browser-support\", \"allow-sandbox\": true } }\n      if (!appPlugs?.includes(\"browser-support\")) {\n        appPlugs = [...(appPlugs ?? []), \"browser-support\"]\n      }\n    }\n\n    const { root: rootSlots, app: appSlots } = options.slots ? this.processPlugOrSlots(options.slots) : { root: undefined, app: undefined }\n\n    // Build the effective arg list for the snap command.\n    // Start with any user-supplied executableArgs, then conditionally add --no-sandbox\n    // if browser-support with allow-sandbox:true is not present in the resolved plugs\n    // (mirrors the same logic in SnapCoreLegacy.buildSnap).\n    const extraArgs: string[] = [...(this.options.executableArgs ?? [])]\n    if (this.options.forceX11 === true) {\n      if (!extraArgs.includes(\"--ozone-platform=x11\")) {\n        extraArgs.push(\"--ozone-platform=x11\")\n      }\n    }\n    if (this.helper.isElectronVersionGreaterOrEqualThan(\"5.0.0\") && !this.isBrowserSandboxAllowed(rootPlugs)) {\n      if (!extraArgs.includes(\"--no-sandbox\")) {\n        extraArgs.push(\"--no-sandbox\")\n      }\n    }\n    const commandSuffix = extraArgs.length > 0 ? ` ${extraArgs.join(\" \")}` : \"\"\n\n    // Create the app configuration\n    const desktopBaseName = this.helper.getDesktopFileName(appName)\n    const app: App = {\n      command: `app/${this.packager.executableName}${commandSuffix}`,\n      \"command-chain\": undefined, // explicitly undefined so removeNullish strips it; extensions supply their own command-chain\n      plugs: appPlugs,\n      slots: appSlots,\n      autostart: options.autoStart ? `${desktopBaseName}.desktop` : undefined,\n      desktop: `meta/gui/${desktopBaseName}.desktop`,\n      extensions: resolvedExtensions,\n    }\n\n    // Icon path — build-time relative path so snapcraft can find the file in snap/gui/\n    await this.helper.icons\n    const iconPath = this.helper.maxIconPath != null ? `snap/gui/${appName}${path.extname(this.helper.maxIconPath)}` : undefined\n\n    // Process hooks if configured\n    const hooksConfig = options.hooks\n    const hooks = hooksConfig ? await this.processHooks(hooksConfig) : undefined\n\n    // Parts configuration - the extension automatically adds a gnome/sdk part\n    // Don't manually add desktop-launch when using the extension\n    const parts: Record<string, Part> = {\n      [appName]: appPart,\n    }\n\n    // Note: `organize` will be generated later in `buildSnap` based on the\n    // actual contents of the built app directory so helper binaries and\n    // resources are automatically moved under `app/` in the snap.\n\n    // Build the snapcraft configuration\n    const snapcraft: SnapcraftYAML = {\n      // Required fields\n      name: appName,\n      base: \"core24\",\n      confinement: options.confinement || \"strict\",\n      parts: parts,\n\n      // Architecture/Platform — only needed for cross-compilation; snapcraft 8\n      // defaults to host arch and snapcraft 7 rejects this field entirely.\n      ...(arch !== archFromString(process.arch)\n        ? {\n            platforms: {\n              [toLinuxArchString(arch, \"snap\")]: {\n                \"build-for\": toLinuxArchString(arch, \"snap\"),\n                \"build-on\": toLinuxArchString(archFromString(process.arch), \"snap\"),\n              },\n            },\n          }\n        : {}),\n\n      // Metadata - with fallbacks from appInfo\n      version: appInfo.version,\n      summary: options.summary || appInfo.productName,\n      description: this.helper.getDescription(options),\n      grade: options.grade || \"stable\",\n      title: options.title || appInfo.productName,\n      icon: iconPath,\n\n      // Build configuration\n      compression: options.compression || undefined,\n      assumes: this.normalizeAssumesList(options.assumes),\n\n      // Environment\n      environment: this.buildEnvironment(options),\n\n      // User-supplied layout always wins. Without gnome extension and not in host mode, fall back to content-snap defaults.\n      layout: options.layout ?? (useGnomeExtension || hostMode ? undefined : this.buildDefaultLayout(options)),\n\n      // Interfaces\n      plugs: rootPlugs,\n      slots: rootSlots,\n\n      // Hooks\n      hooks: hooks,\n\n      // Apps\n      apps: {\n        [appName]: app,\n      },\n    }\n\n    return removeNullish(snapcraft)\n  }\n\n  /**\n   * Build environment variables with proper defaults\n   */\n  private buildEnvironment(options: SnapOptions24): Record<string, string | null> | undefined {\n    const env: Record<string, string | null> = {}\n\n    // Add default TMPDIR for Electron/Chromium apps\n    if (!options.environment?.TMPDIR) {\n      env.TMPDIR = \"$XDG_RUNTIME_DIR\"\n    }\n\n    if (options.environment) {\n      deepAssign(env, options.environment)\n    }\n\n    return Object.keys(env).length > 0 ? env : undefined\n  }\n\n  /**\n   * Build default layout for core24 with GNOME platform content snaps (non-extension mode)\n   * This allows the app to access libraries from the gnome-46-2404 and mesa-2404 content snaps\n   */\n  private buildDefaultLayout(options: SnapOptions24): Record<string, any> | undefined {\n    // If user provides custom layout, use that instead\n    if (options.layout) {\n      return options.layout\n    }\n\n    // Default layout for core24 Electron apps using GNOME content snaps WITHOUT extension\n    return {\n      \"/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.0\": {\n        bind: \"$SNAP/gnome-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.0\",\n      },\n      \"/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.1\": {\n        bind: \"$SNAP/gnome-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/webkit2gtk-4.1\",\n      },\n      \"/usr/share/xml/iso-codes\": {\n        bind: \"$SNAP/gnome-platform/usr/share/xml/iso-codes\",\n      },\n      \"/usr/share/libdrm\": {\n        bind: \"$SNAP/gpu-2404/libdrm\",\n      },\n      \"/usr/share/drirc.d\": {\n        symlink: \"$SNAP/gpu-2404/drirc.d\",\n      },\n    }\n  }\n\n  /**\n   * Process hooks directory into hook definitions\n   */\n  private async processHooks(hooksPath: string): Promise<Record<string, any> | undefined> {\n    try {\n      const buildResourcesDir = this.packager.buildResourcesDir\n      const hooksDir = path.resolve(buildResourcesDir, hooksPath)\n      if (!hooksDir.startsWith(buildResourcesDir + path.sep) && hooksDir !== buildResourcesDir) {\n        throw new InvalidConfigurationError(`snapcraft.core24.hooks must resolve within the build resources directory (got \"${hooksDir}\")`)\n      }\n      const hookFiles = await readdir(hooksDir)\n\n      if (hookFiles.length === 0) {\n        return undefined\n      }\n\n      const hooks: Record<string, any> = {}\n      for (const hookFile of hookFiles) {\n        const hookName = path.basename(hookFile, path.extname(hookFile))\n        if (!isValidKey(hookName)) {\n          throw new InvalidConfigurationError(`Invalid hook name: ${hookName}`)\n        }\n        hooks[hookName] = {\n          // Hook definitions will be populated by snapcraft from the files\n          // Just register that these hooks exist\n        }\n      }\n\n      return hooks\n    } catch (e: any) {\n      log.error({ message: e.message }, \"error processing Snap hooks directory\")\n      throw e\n    }\n  }\n\n  /**\n   * Normalize assumes list (can be string or array)\n   */\n  normalizeAssumesList(assumes: Array<string> | string | Nullish): string[] | undefined {\n    if (!assumes) {\n      return undefined\n    }\n    if (typeof assumes === \"string\") {\n      return [assumes]\n    }\n    return assumes.length > 0 ? assumes : undefined\n  }\n\n  /**\n   * Process plugs or slots into root-level definitions and app-level references\n   */\n  processPlugOrSlots<T extends Array<string | SlotDescriptor | PlugDescriptor> | SlotDescriptor | PlugDescriptor | null>(\n    items: T\n  ): {\n    root: Record<string, unknown> | undefined\n    app: string[] | undefined\n  } {\n    if (!items || (Array.isArray(items) && items.length === 0)) {\n      return { root: undefined, app: undefined }\n    }\n    const root: Record<string, unknown> = {}\n    const app: string[] = []\n\n    // Handle single descriptor object\n    if (!Array.isArray(items)) {\n      Object.entries(items).forEach(([name, config]) => {\n        if (!isValidKey(name)) {\n          throw new Error(`Invalid plug/slot name: ${name}`)\n        }\n        root[name] = config\n        app.push(name)\n      })\n      return { root, app }\n    }\n\n    // Handle array - support \"default\" keyword\n    const processedItems = this.expandDefaultsInArray(items, this.defaultPlugs)\n    for (const item of processedItems ?? []) {\n      if (typeof item === \"string\") {\n        // Simple string reference\n        app.push(item)\n      } else {\n        // Descriptor object with configuration\n        Object.entries(item).forEach(([name, config]) => {\n          if (!isValidKey(name)) {\n            throw new Error(`Invalid plug/slot name: ${name}`)\n          }\n          root[name] = config\n          app.push(name)\n        })\n      }\n    }\n\n    return { root: Object.keys(root).length > 0 ? root : undefined, app: app.length > 0 ? app : undefined }\n  }\n\n  private isBrowserSandboxAllowed(plugs: Record<string, any> | undefined): boolean {\n    if (!plugs) {\n      return false\n    }\n    for (const plug of Object.values(plugs)) {\n      if (plug?.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * Expand \"default\" keyword in arrays of anything\n   */\n  private expandDefaultsInArray<T>(items: T[] | Nullish, defaults: T[]): T[] | undefined {\n    const result: Array<T> = []\n    for (const item of items ?? []) {\n      if (typeof item === \"string\" && item === \"default\") {\n        result.push(...defaults)\n      } else {\n        result.push(item)\n      }\n    }\n    return result.length > 0 ? result : undefined\n  }\n}\n"]}