{"version":3,"sources":["../src/roles/area/constants.ts","../src/roles/area/format.ts","../src/roles/length/constants.ts","../src/roles/length/format.ts","../src/roles/mass/constants.ts","../src/roles/mass/format.ts","../src/roles/temperature/constants.ts","../src/roles/temperature/format.ts","../src/roles/volume/constants.ts","../src/roles/volume/format.ts","../src/roles/speed/constants.ts","../src/roles/speed/format.ts","../src/roles/energy/constants.ts","../src/roles/energy/format.ts","../src/roles/power/constants.ts","../src/roles/power/format.ts","../src/roles/pressure/constants.ts","../src/roles/pressure/format.ts","../src/roles/frequency/constants.ts","../src/roles/frequency/format.ts","../src/roles/angle/constants.ts","../src/roles/angle/format.ts","../src/roles/time/constants.ts","../src/roles/time/format.ts","../src/roles/digital/constants.ts","../src/roles/digital/format.ts","../src/roles/color/types.ts","../src/roles/color/convert.ts","../src/roles/color/format.ts","../src/roles/date/format.ts","../src/roles/currency/constants.ts","../src/roles/currency/format.ts"],"names":["p","q","formatWithIntl"],"mappings":";AAmDO,IAAM,UAAiD,GAAA;AAAA;AAAA,EAE5D,gBAAkB,EAAA;AAAA,IAChB,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,SAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,GAAK,EAAA;AAAA,IACH,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,KAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,mBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,mBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,gBAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,YAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,UAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,UAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,QAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAqDsD,MAAO,CAAA,WAAA;AAAA,EAC3D,MAAA,CAAO,QAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACjD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;ACxIO,SAAS,UACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA6B,EACrB,EAAA;AACR,EAAA,MAAM,EAAE,QAAW,GAAA,CAAA,EAAG,UAAU,KAAO,EAAA,MAAA,EAAQ,UAAa,GAAA,OAAA;AAC5D,EAAM,MAAA,IAAA,GAAO,WAAW,OAAO,CAAA;AAE/B,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAyB,sBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAIpD,EAAI,IAAA,cAAA;AAEJ,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,MAAM,aAA0C,GAAA;AAAA,MAC9C,qBAAuB,EAAA,CAAA;AAAA,MACvB,qBAAuB,EAAA;AAAA,KACzB;AAEA,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,aAAA,CAAc,QAAW,GAAA,QAAA;AAAA;AAG3B,IAAiB,cAAA,GAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,GACtD,MAAA;AACL,IAAA,cAAA,GAAiB,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAS,EAAA;AAAA;AAI5D,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,OAAA,GAAU,EAAK,GAAA,GAAA;AAEtC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,MAAM,IAAO,GAAA,KAAA,KAAU,CAAI,GAAA,IAAA,CAAK,WAAW,IAAK,CAAA,MAAA;AAChD,IAAA,OAAO,CAAG,EAAA,cAAc,CAAI,CAAA,EAAA,IAAA,IAAQ,KAAK,MAAM,CAAA,CAAA;AAAA;AAGjD,EAAA,OAAO,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA;AACpD;;;ACjCO,IAAM,YAAqD,GAAA;AAAA;AAAA,EAEhE,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,EAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,QAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,aAAe,EAAA;AAAA,IACb,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,MAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,OAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,SAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,QAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAyD0D,MAAO,CAAA,WAAA;AAAA,EAC/D,MAAA,CAAO,QAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACnD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;AClLO,SAAS,YACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA+B,EACvB,EAAA;AACR,EAAA,MAAM,EAAE,QAAW,GAAA,CAAA,EAAG,UAAU,KAAO,EAAA,MAAA,EAAQ,UAAa,GAAA,OAAA;AAC5D,EAAM,MAAA,IAAA,GAAO,aAAa,OAAO,CAAA;AAEjC,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAA2B,wBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAItD,EAAI,IAAA,cAAA;AAEJ,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,MAAM,aAA0C,GAAA;AAAA,MAC9C,qBAAuB,EAAA,CAAA;AAAA,MACvB,qBAAuB,EAAA;AAAA,KACzB;AAEA,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,aAAA,CAAc,QAAW,GAAA,QAAA;AAAA;AAG3B,IAAiB,cAAA,GAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,GACtD,MAAA;AACL,IAAA,cAAA,GAAiB,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAS,EAAA;AAAA;AAI5D,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,OAAA,GAAU,EAAK,GAAA,GAAA;AAEtC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,MAAM,IAAO,GAAA,KAAA,KAAU,CAAI,GAAA,IAAA,CAAK,WAAW,IAAK,CAAA,MAAA;AAChD,IAAA,OAAO,CAAG,EAAA,cAAc,CAAI,CAAA,EAAA,IAAA,IAAQ,KAAK,MAAM,CAAA,CAAA;AAAA;AAGjD,EAAA,OAAO,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA;AACpD;;;AC3BO,IAAM,UAAiD,GAAA;AAAA;AAAA;AAAA;AAAA,EAI5D,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA;AAAA,EAKA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,YAAA;AAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,SAAA;AAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,UAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,UAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,cAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,kBAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,WAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA;AAAA,EAKA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,YAAA;AAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,YAAA;AAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,aAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AA+DsD,MAAO,CAAA,WAAA;AAAA,EAC3D,MAAA,CAAO,QAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACjD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;AC9MO,SAAS,UACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA6B,EACrB,EAAA;AACR,EAAA,MAAM,EAAE,QAAW,GAAA,CAAA,EAAG,UAAU,KAAO,EAAA,MAAA,EAAQ,UAAa,GAAA,OAAA;AAC5D,EAAM,MAAA,IAAA,GAAO,WAAW,OAAO,CAAA;AAE/B,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAyB,sBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAIpD,EAAI,IAAA,cAAA;AAEJ,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,MAAM,aAA0C,GAAA;AAAA,MAC9C,qBAAuB,EAAA,CAAA;AAAA,MACvB,qBAAuB,EAAA;AAAA,KACzB;AAEA,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,aAAA,CAAc,QAAW,GAAA,QAAA;AAAA;AAG3B,IAAiB,cAAA,GAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,GACtD,MAAA;AACL,IAAA,cAAA,GAAiB,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAS,EAAA;AAAA;AAI5D,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,OAAA,GAAU,EAAK,GAAA,GAAA;AAEtC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,MAAM,IAAO,GAAA,KAAA,KAAU,CAAI,GAAA,IAAA,CAAK,WAAW,IAAK,CAAA,MAAA;AAChD,IAAA,OAAO,CAAG,EAAA,cAAc,CAAI,CAAA,EAAA,IAAA,IAAQ,KAAK,MAAM,CAAA,CAAA;AAAA;AAGjD,EAAA,OAAO,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA;AACpD;;;AC7CO,IAAM,iBAA+D,GAAA;AAAA,EAC1E,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,gBAAA;AAAA,IACV,MAAQ,EAAA,iBAAA;AAAA,IACR,MAAA,EAAQ,CAAC,CAAc,KAAA,CAAA;AAAA,IACvB,QAAA,EAAU,CAAC,CAAc,KAAA,CAAA;AAAA,IACzB,OAAS,EAAA;AAAA;AAAA,GACX;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,mBAAA;AAAA,IACV,MAAQ,EAAA,oBAAA;AAAA,IACR,MAAQ,EAAA,CAAC,CAAe,KAAA,CAAA,CAAA,GAAI,OAAO,CAAI,GAAA,CAAA,CAAA;AAAA,IACvC,QAAU,EAAA,CAAC,CAAc,KAAA,CAAA,IAAK,IAAI,CAAK,CAAA,GAAA,EAAA;AAAA,IACvC,OAAS,EAAA;AAAA;AAAA,GACX;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA,SAAA;AAAA,IACR,MAAA,EAAQ,CAAC,CAAA,KAAc,CAAI,GAAA,MAAA;AAAA,IAC3B,QAAA,EAAU,CAAC,CAAA,KAAc,CAAI,GAAA;AAAA;AAAA,GAE/B;AAAA,EACA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,gBAAA;AAAA,IACV,MAAQ,EAAA,iBAAA;AAAA,IACR,MAAQ,EAAA,CAAC,CAAe,KAAA,CAAA,CAAA,GAAI,WAAW,CAAI,GAAA,CAAA,CAAA;AAAA,IAC3C,QAAU,EAAA,CAAC,CAAe,KAAA,CAAA,CAAA,GAAI,WAAW,CAAI,GAAA,CAAA,CAAA;AAAA,IAC7C,OAAS,EAAA;AAAA;AAAA;AAEb,CAAA;;;AC3BO,SAAS,iBACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAAoC,EAC5B,EAAA;AACR,EAAA,MAAM,EAAE,QAAW,GAAA,CAAA,EAAG,UAAU,KAAO,EAAA,MAAA,EAAQ,UAAa,GAAA,OAAA;AAC5D,EAAM,MAAA,IAAA,GAAO,kBAAkB,OAAO,CAAA;AAEtC,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAgC,6BAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAI3D,EAAI,IAAA,cAAA;AAEJ,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,MAAM,aAA0C,GAAA;AAAA,MAC9C,qBAAuB,EAAA,CAAA;AAAA,MACvB,qBAAuB,EAAA;AAAA,KACzB;AAEA,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,aAAA,CAAc,QAAW,GAAA,QAAA;AAAA;AAG3B,IAAiB,cAAA,GAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,GACtD,MAAA;AACL,IAAA,cAAA,GAAiB,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAS,EAAA;AAAA;AAK5D,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,OAAA,GAAU,EAAK,GAAA,GAAA;AAEtC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,MAAM,IAAO,GAAA,KAAA,KAAU,CAAI,GAAA,IAAA,CAAK,WAAW,IAAK,CAAA,MAAA;AAChD,IAAA,OAAO,CAAG,EAAA,cAAc,CAAI,CAAA,EAAA,IAAA,IAAQ,KAAK,MAAM,CAAA,CAAA;AAAA;AAGjD,EAAA,OAAO,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA;AACpD;;;ACrBO,IAAM,YAAqD,GAAA;AAAA;AAAA,EAEhE,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,iBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,EAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,WAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,WAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,WAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,YAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,KAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,MAAQ,EAAA,eAAA;AAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,aAAe,EAAA;AAAA,IACb,MAAQ,EAAA,gBAAA;AAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,gBAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,OAAA;AAAA,IACR,MAAQ,EAAA,UAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,UAAA;AAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,MAAQ,EAAA,YAAA;AAAA;AAAA,IACR,MAAQ,EAAA,YAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,aAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,WAAA;AAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,YAAA;AAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,aAAA;AAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAyF0D,MAAO,CAAA,WAAA;AAAA,EAC/D,MAAA,CAAO,QAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACnD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;ACrRO,SAAS,YACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA+B,EACvB,EAAA;AACR,EAAA,MAAM,EAAE,QAAW,GAAA,CAAA,EAAG,UAAU,KAAO,EAAA,MAAA,EAAQ,UAAa,GAAA,OAAA;AAC5D,EAAM,MAAA,IAAA,GAAO,aAAa,OAAO,CAAA;AAEjC,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAA2B,wBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAItD,EAAI,IAAA,cAAA;AAEJ,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,MAAM,aAA0C,GAAA;AAAA,MAC9C,qBAAuB,EAAA,CAAA;AAAA,MACvB,qBAAuB,EAAA;AAAA,KACzB;AAEA,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,aAAA,CAAc,QAAW,GAAA,QAAA;AAAA;AAG3B,IAAiB,cAAA,GAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,GACtD,MAAA;AACL,IAAA,cAAA,GAAiB,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAS,EAAA;AAAA;AAI5D,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,OAAA,GAAU,EAAK,GAAA,GAAA;AAEtC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,MAAM,IAAO,GAAA,KAAA,KAAU,CAAI,GAAA,IAAA,CAAK,WAAW,IAAK,CAAA,MAAA;AAChD,IAAA,OAAO,CAAG,EAAA,cAAc,CAAI,CAAA,EAAA,IAAA,IAAQ,KAAK,MAAM,CAAA,CAAA;AAAA;AAGjD,EAAA,OAAO,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA;AACpD;;;ACzCO,IAAM,WAAmD,GAAA;AAAA;AAAA,EAE9D,gBAAkB,EAAA;AAAA,IAChB,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,QAAQ,GAAO,GAAA,IAAA;AAAA;AAAA,IACf,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,oBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,aAAe,EAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,MAAQ,EAAA,MAAA;AAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,iBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,IAAM,EAAA;AAAA,IACJ,QAAQ,IAAO,GAAA,IAAA;AAAA;AAAA,IACf,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,MAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,MAAQ,EAAA,SAAA;AAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,gBAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAyCwD,MAAO,CAAA,WAAA;AAAA,EAC7D,MAAA,CAAO,QAAQ,WAAW,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IAClD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;AC/FO,SAAS,WACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA8B,EACtB,EAAA;AACR,EAAA,MAAM,EAAE,QAAW,GAAA,CAAA,EAAG,UAAU,KAAO,EAAA,MAAA,EAAQ,UAAa,GAAA,OAAA;AAC5D,EAAM,MAAA,IAAA,GAAO,YAAY,OAAO,CAAA;AAEhC,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAA0B,uBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAIrD,EAAI,IAAA,cAAA;AAEJ,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,MAAM,aAA0C,GAAA;AAAA,MAC9C,qBAAuB,EAAA,CAAA;AAAA,MACvB,qBAAuB,EAAA;AAAA,KACzB;AAEA,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,aAAA,CAAc,QAAW,GAAA,QAAA;AAAA;AAG3B,IAAiB,cAAA,GAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,GACtD,MAAA;AACL,IAAA,cAAA,GAAiB,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAS,EAAA;AAAA;AAI5D,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,OAAA,GAAU,EAAK,GAAA,GAAA;AAEtC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,MAAM,IAAO,GAAA,KAAA,KAAU,CAAI,GAAA,IAAA,CAAK,WAAW,IAAK,CAAA,MAAA;AAChD,IAAA,OAAO,CAAG,EAAA,cAAc,CAAI,CAAA,EAAA,IAAA,IAAQ,KAAK,MAAM,CAAA,CAAA;AAAA;AAGjD,EAAA,OAAO,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA;AACpD;;;AC1BO,IAAM,YAAqD,GAAA;AAAA;AAAA,EAEhE,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA,EAIA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,SAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA,EAIA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,aAAe,EAAA;AAAA,IACb,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,aAAe,EAAA;AAAA,IACb,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,aAAe,EAAA;AAAA,IACb,MAAQ,EAAA,KAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA,EAIA,GAAK,EAAA;AAAA,IACH,MAAQ,EAAA,aAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,KAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,eAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA,EAIA,YAAc,EAAA;AAAA,IACZ,MAAQ,EAAA,cAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,MAAQ,EAAA,cAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,MAAQ,EAAA,cAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,GAAK,EAAA;AAAA,IACH,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,KAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA,EAIA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,kBAAA;AAAA,IACR,MAAQ,EAAA,aAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAwD0D,MAAO,CAAA,WAAA;AAAA,EAC/D,MAAA,CAAO,QAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACnD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;ACzMO,SAAS,YACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA+B,EACvB,EAAA;AACR,EAAA,MAAM,EAAE,QAAW,GAAA,CAAA,EAAG,UAAU,KAAO,EAAA,MAAA,EAAQ,UAAa,GAAA,OAAA;AAC5D,EAAM,MAAA,IAAA,GAAO,aAAa,OAAO,CAAA;AAEjC,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAA2B,wBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAItD,EAAI,IAAA,cAAA;AAEJ,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,MAAM,aAA0C,GAAA;AAAA,MAC9C,qBAAuB,EAAA,CAAA;AAAA,MACvB,qBAAuB,EAAA;AAAA,KACzB;AAEA,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,aAAA,CAAc,QAAW,GAAA,QAAA;AAAA;AAG3B,IAAiB,cAAA,GAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,GACtD,MAAA;AACL,IAAA,cAAA,GAAiB,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAS,EAAA;AAAA;AAI5D,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,OAAA,GAAU,EAAK,GAAA,GAAA;AAEtC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,MAAM,IAAO,GAAA,KAAA,KAAU,CAAI,GAAA,IAAA,CAAK,WAAW,IAAK,CAAA,MAAA;AAChD,IAAA,OAAO,CAAG,EAAA,cAAc,CAAI,CAAA,EAAA,IAAA,IAAQ,KAAK,MAAM,CAAA,CAAA;AAAA;AAGjD,EAAA,OAAO,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA;AACpD;;;AClCO,IAAM,WAAmD,GAAA;AAAA;AAAA,EAE9D,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAuB,EAAA;AAAA,IACrB,MAAQ,EAAA,eAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,iBAAmB,EAAA;AAAA,IACjB,MAAQ,EAAA,SAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,mBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,mBAAqB,EAAA;AAAA,IACnB,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,qBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,iBAAmB,EAAA;AAAA,IACjB,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,mBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA,EAIA,YAAc,EAAA;AAAA,IACZ,MAAQ,EAAA,gBAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,cAAgB,EAAA;AAAA,IACd,MAAQ,EAAA,aAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,gBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA;AAAA,EAIA,oBAAsB,EAAA;AAAA,IACpB,MAAQ,EAAA,eAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,sBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,qBAAuB,EAAA;AAAA,IACrB,MAAQ,EAAA,kBAAA;AAAA,IACR,MAAQ,EAAA,eAAA;AAAA,IACR,QAAU,EAAA,uBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,kBAAoB,EAAA;AAAA,IAClB,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,oBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAEA,oBAAsB,EAAA;AAAA,IACpB,MAAQ,EAAA,KAAA;AAAA,IACR,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,sBAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAyDwD,MAAO,CAAA,WAAA;AAAA,EAC7D,MAAA,CAAO,QAAQ,WAAW,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IAClD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;ACtLO,SAAS,WACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA8B,EACtB,EAAA;AACR,EAAM,MAAA,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAGlD,EAAA,MAAM,EAAE,QAAU,EAAA,OAAA,GAAU,OAAO,MAAQ,EAAA,QAAA,GAAW,YAAe,GAAA,OAAA;AAGrE,EAAI,IAAA,eAAA;AAEJ,EAAI,IAAA,MAAA,IAAU,aAAa,UAAY,EAAA;AACrC,IAAM,MAAA,WAAA,GAAwC,EAAE,QAAS,EAAA;AACzD,IAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AACpC,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AAAA;AAEtC,IAAA,eAAA,GAAkB,IAAI,IAAK,CAAA,YAAA,CAAa,QAAQ,WAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,GAC3E,MAAA,IAAW,aAAa,MAAW,EAAA;AACjC,IAAkB,eAAA,GAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAAA,GACnC,MAAA;AAEL,IAAA,eAAA,GAAkB,OAAO,KAAM,CAAA,WAAA,CAAY,EAAE,CAAC,EAAE,QAAS,EAAA;AAAA;AAI3D,EAAM,MAAA,SAAA,GAAY,UACd,KAAU,KAAA,CAAA,GACR,OAAO,QACP,GAAA,MAAA,CAAO,SACT,MAAO,CAAA,MAAA;AAEX,EAAO,OAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACxC;;;AChCO,IAAM,cAAyD,GAAA;AAAA;AAAA,EAEpE,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,GAAK,EAAA;AAAA,IACH,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,KAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,IAAM,EAAA;AAAA,IACJ,QAAQ,MAAS,GAAA,GAAA;AAAA;AAAA,IACjB,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,aAAA;AAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,uBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,QAAA;AAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,iBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,GAAK,EAAA;AAAA,IACH,MAAQ,EAAA,cAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,uBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,GAAK,EAAA;AAAA,IACH,MAAQ,EAAA,gBAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,2BAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,OAAA;AAAA;AAAA,IACR,MAAQ,EAAA,YAAA;AAAA,IACR,QAAU,EAAA,qBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,SAAA;AAAA;AAAA,IACR,MAAQ,EAAA,YAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAkDE,MAAO,CAAA,WAAA;AAAA,EACL,MAAA,CAAO,QAAQ,cAAc,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACrD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;AC5JK,SAAS,cACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAAiC,EACzB,EAAA;AACR,EAAM,MAAA,MAAA,GAAS,eAAe,OAAO,CAAA;AACrC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAA0B,uBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAGrD,EAAA,MAAM,EAAE,QAAU,EAAA,OAAA,GAAU,OAAO,MAAQ,EAAA,QAAA,GAAW,YAAe,GAAA,OAAA;AAGrE,EAAI,IAAA,eAAA;AAEJ,EAAI,IAAA,MAAA,IAAU,aAAa,UAAY,EAAA;AACrC,IAAM,MAAA,WAAA,GAAwC,EAAE,QAAS,EAAA;AACzD,IAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AACpC,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AAAA;AAEtC,IAAA,eAAA,GAAkB,IAAI,IAAK,CAAA,YAAA,CAAa,QAAQ,WAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,GAC3E,MAAA,IAAW,aAAa,MAAW,EAAA;AACjC,IAAkB,eAAA,GAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAAA,GACnC,MAAA;AAEL,IAAA,eAAA,GAAkB,OAAO,KAAM,CAAA,WAAA,CAAY,EAAE,CAAC,EAAE,QAAS,EAAA;AAAA;AAI3D,EAAM,MAAA,SAAA,GAAY,UACd,KAAU,KAAA,CAAA,GACR,OAAO,QACP,GAAA,MAAA,CAAO,SACT,MAAO,CAAA,MAAA;AAEX,EAAO,OAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACxC;;;AC1CO,IAAM,eAA2D,GAAA;AAAA;AAAA,EAEtE,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,UAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,GAAK,EAAA;AAAA,IACH,QAAQ,CAAI,GAAA,EAAA;AAAA;AAAA,IACZ,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,uBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,GAAK,EAAA;AAAA,IACH,QAAQ,CAAI,GAAA,EAAA;AAAA;AAAA,IACZ,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,iBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,MAAA,EAAQ,CAAK,IAAA,CAAA,GAAI,IAAK,CAAA,EAAA,CAAA;AAAA;AAAA,IACtB,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,mBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,QAAQ,CAAI,GAAA,EAAA;AAAA;AAAA,IACZ,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AA6CE,MAAO,CAAA,WAAA;AAAA,EACL,MAAA,CAAO,QAAQ,eAAe,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACtD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;ACnHK,SAAS,eACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAAkC,EAC1B,EAAA;AACR,EAAM,MAAA,MAAA,GAAS,gBAAgB,OAAO,CAAA;AACtC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAA2B,wBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAGtD,EAAA,MAAM,EAAE,QAAU,EAAA,OAAA,GAAU,OAAO,MAAQ,EAAA,QAAA,GAAW,YAAe,GAAA,OAAA;AAGrE,EAAI,IAAA,eAAA;AAEJ,EAAI,IAAA,MAAA,IAAU,aAAa,UAAY,EAAA;AACrC,IAAM,MAAA,WAAA,GAAwC,EAAE,QAAS,EAAA;AACzD,IAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AACpC,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AAAA;AAEtC,IAAA,eAAA,GAAkB,IAAI,IAAK,CAAA,YAAA,CAAa,QAAQ,WAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,GAC3E,MAAA,IAAW,aAAa,MAAW,EAAA;AACjC,IAAkB,eAAA,GAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAAA,GACnC,MAAA;AAEL,IAAA,eAAA,GAAkB,OAAO,KAAM,CAAA,WAAA,CAAY,EAAE,CAAC,EAAE,QAAS,EAAA;AAAA;AAI3D,EAAM,MAAA,SAAA,GAAY,UACd,KAAU,KAAA,CAAA,GACR,OAAO,QACP,GAAA,MAAA,CAAO,SACT,MAAO,CAAA,MAAA;AAEX,EAAO,OAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACxC;;;ACjDA,IAAM,kBAAA,GAAqB,MAAM,IAAK,CAAA,EAAA;AAKtC,IAAM,uBAAA,GAA0B,GAAO,IAAA,GAAA,GAAO,IAAK,CAAA,EAAA,CAAA;AAmB5C,IAAM,WAAmD,GAAA;AAAA;AAAA,EAE9D,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,GAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA,SAAA;AAAA,IACR,OAAS,EAAA;AAAA;AAAA,GACX;AAAA;AAAA,EAGA,SAAW,EAAA;AAAA,IACT,QAAQ,CAAI,GAAA,EAAA;AAAA;AAAA,IACZ,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA,YAAA;AAAA,IACR,OAAS,EAAA;AAAA;AAAA,GACX;AAAA,EACA,SAAW,EAAA;AAAA,IACT,QAAQ,CAAI,GAAA,IAAA;AAAA;AAAA,IACZ,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA,YAAA;AAAA,IACR,OAAS,EAAA;AAAA;AAAA,GACX;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,QAAQ,CAAI,GAAA,IAAA;AAAA;AAAA,IACZ,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,gBAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,kBAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,uBAAA;AAAA;AAAA,IACR,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,GAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,SAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AA2CwD,MAAO,CAAA,WAAA;AAAA,EAC7D,MAAA,CAAO,QAAQ,WAAW,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IAClD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;ACzHO,SAAS,WACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA8B,EACtB,EAAA;AACR,EAAM,MAAA,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAGlD,EAAA,MAAM,EAAE,QAAU,EAAA,OAAA,GAAU,OAAO,MAAQ,EAAA,QAAA,GAAW,YAAe,GAAA,OAAA;AAGrE,EAAI,IAAA,eAAA;AAEJ,EAAI,IAAA,MAAA,IAAU,aAAa,UAAY,EAAA;AACrC,IAAM,MAAA,WAAA,GAAwC,EAAE,QAAS,EAAA;AACzD,IAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AACpC,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AAAA;AAEtC,IAAA,eAAA,GAAkB,IAAI,IAAK,CAAA,YAAA,CAAa,QAAQ,WAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,GAC3E,MAAA,IAAW,aAAa,MAAW,EAAA;AACjC,IAAkB,eAAA,GAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAAA,GACnC,MAAA;AAEL,IAAA,eAAA,GAAkB,OAAO,KAAM,CAAA,WAAA,CAAY,EAAE,CAAC,EAAE,QAAS,EAAA;AAAA;AAI3D,EAAM,MAAA,SAAA,GAAY,UACd,KAAU,KAAA,CAAA,GACR,OAAO,QACP,GAAA,MAAA,CAAO,SACT,MAAO,CAAA,MAAA;AAGX,EAAA,MAAM,SAAY,GAAA,MAAA,CAAO,OAAW,IAAA,CAAC,UAAU,EAAK,GAAA,GAAA;AAEpD,EAAA,OAAO,CAAG,EAAA,eAAe,CAAG,EAAA,SAAS,GAAG,SAAS,CAAA,CAAA;AACnD;;;ACvCO,IAAM,UAAiD,GAAA;AAAA;AAAA,EAE5D,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,SAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,EAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,IAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,GAAK,EAAA;AAAA,IACH,MAAQ,EAAA,KAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,KAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,MAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,KAAO,EAAA;AAAA,IACL,MAAQ,EAAA,OAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,QAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,SAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,UAAA;AAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,SAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,UAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAmDsD,MAAO,CAAA,WAAA;AAAA,EAC3D,MAAA,CAAO,QAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACjD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;AC7IO,SAAS,UACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAA6B,EACrB,EAAA;AACR,EAAM,MAAA,MAAA,GAAS,WAAW,OAAO,CAAA;AACjC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAsB,mBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAGjD,EAAA,MAAM,EAAE,QAAU,EAAA,OAAA,GAAU,OAAO,MAAQ,EAAA,QAAA,GAAW,YAAe,GAAA,OAAA;AAGrE,EAAI,IAAA,eAAA;AAEJ,EAAI,IAAA,MAAA,IAAU,aAAa,UAAY,EAAA;AACrC,IAAM,MAAA,WAAA,GAAwC,EAAE,QAAS,EAAA;AACzD,IAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AACpC,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AAAA;AAEtC,IAAA,eAAA,GAAkB,IAAI,IAAK,CAAA,YAAA,CAAa,QAAQ,WAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,GAC3E,MAAA,IAAW,aAAa,MAAW,EAAA;AACjC,IAAkB,eAAA,GAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAAA,GACnC,MAAA;AAEL,IAAA,eAAA,GAAkB,OAAO,KAAM,CAAA,WAAA,CAAY,EAAE,CAAC,EAAE,QAAS,EAAA;AAAA;AAI3D,EAAM,MAAA,SAAA,GAAY,UACd,KAAU,KAAA,CAAA,GACR,OAAO,QACP,GAAA,MAAA,CAAO,SACT,MAAO,CAAA,MAAA;AAEX,EAAO,OAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACxC;;;AChCO,IAAM,aAAuD,GAAA;AAAA;AAAA,EAElE,GAAK,EAAA;AAAA,IACH,MAAQ,EAAA,KAAA;AAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,KAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,OAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,UAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,aAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,gBAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,kBAAA;AAAA;AAAA,IACR,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA;AAAA,EAGA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,OAAS,EAAA;AAAA,IACP,MAAQ,EAAA,IAAA;AAAA;AAAA,IACR,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,SAAA;AAAA,IACV,MAAQ,EAAA;AAAA;AAEZ,CAAA;AAiD4D,MAAO,CAAA,WAAA;AAAA,EACjE,MAAA,CAAO,QAAQ,aAAa,CAAA,CAAE,IAAI,CAAC,CAAC,IAAM,EAAA,MAAM,CAAM,KAAA;AAAA,IACpD,IAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB;AACH;;;ACrJO,SAAS,aACd,CAAA,OAAA,EACA,KACA,EAAA,OAAA,GAAgC,EACxB,EAAA;AACR,EAAM,MAAA,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAyB,sBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAGpD,EAAA,MAAM,EAAE,QAAU,EAAA,OAAA,GAAU,OAAO,MAAQ,EAAA,QAAA,GAAW,YAAe,GAAA,OAAA;AAGrE,EAAI,IAAA,eAAA;AAEJ,EAAI,IAAA,MAAA,IAAU,aAAa,UAAY,EAAA;AACrC,IAAM,MAAA,WAAA,GAAwC,EAAE,QAAS,EAAA;AACzD,IAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AACpC,MAAA,WAAA,CAAY,qBAAwB,GAAA,QAAA;AAAA;AAEtC,IAAA,eAAA,GAAkB,IAAI,IAAK,CAAA,YAAA,CAAa,QAAQ,WAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,GAC3E,MAAA,IAAW,aAAa,MAAW,EAAA;AACjC,IAAkB,eAAA,GAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAAA,GACnC,MAAA;AAEL,IAAA,eAAA,GAAkB,OAAO,KAAM,CAAA,WAAA,CAAY,EAAE,CAAC,EAAE,QAAS,EAAA;AAAA;AAI3D,EAAM,MAAA,SAAA,GAAY,UACd,KAAU,KAAA,CAAA,GACR,OAAO,QACP,GAAA,MAAA,CAAO,SACT,MAAO,CAAA,MAAA;AAEX,EAAO,OAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACxC;;;AC0EO,SAAS,KAAA,CAAM,KAAe,EAAA,GAAA,EAAa,GAAqB,EAAA;AACrE,EAAA,OAAO,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,KAAO,EAAA,GAAG,GAAG,GAAG,CAAA;AAC3C;AAKO,SAAS,oBAAoB,KAAuB,EAAA;AACzD,EAAA,OAAO,MAAM,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,EAAG,GAAG,GAAG,CAAA;AACxC;AAKO,SAAS,eAAe,KAAmC,EAAA;AAChE,EAAI,IAAA,KAAA,KAAU,QAAkB,OAAA,CAAA;AAChC,EAAO,OAAA,KAAA,CAAM,KAAO,EAAA,CAAA,EAAG,CAAC,CAAA;AAC1B;AAKO,SAAS,QAAA,CACd,CACA,EAAA,CAAA,EACA,CACqC,EAAA;AACrC,EAAK,CAAA,IAAA,GAAA;AACL,EAAK,CAAA,IAAA,GAAA;AACL,EAAK,CAAA,IAAA,GAAA;AAEL,EAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAM,MAAA,CAAA,GAAA,CAAK,MAAM,GAAO,IAAA,CAAA;AAExB,EAAA,IAAI,QAAQ,GAAK,EAAA;AACf,IAAA,OAAO,EAAE,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,IAAI,GAAI,EAAA;AAAA;AAGlC,EAAA,MAAM,IAAI,GAAM,GAAA,GAAA;AAChB,EAAM,MAAA,CAAA,GAAI,IAAI,GAAM,GAAA,CAAA,IAAK,IAAI,GAAM,GAAA,GAAA,CAAA,GAAO,KAAK,GAAM,GAAA,GAAA,CAAA;AAErD,EAAI,IAAA,CAAA;AACJ,EAAA,QAAQ,GAAK;AAAA,IACX,KAAK,CAAA;AACH,MAAA,CAAA,GAAA,CAAA,CAAM,IAAI,CAAK,IAAA,CAAA,IAAK,CAAI,GAAA,CAAA,GAAI,IAAI,CAAM,CAAA,IAAA,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAM,CAAA,GAAA,CAAA,CAAA,CAAA,GAAI,CAAK,IAAA,CAAA,GAAI,CAAK,IAAA,CAAA;AACxB,MAAA;AAAA,IACF;AACE,MAAM,CAAA,GAAA,CAAA,CAAA,CAAA,GAAI,CAAK,IAAA,CAAA,GAAI,CAAK,IAAA,CAAA;AACxB,MAAA;AAAA;AAGJ,EAAO,OAAA;AAAA,IACL,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,CAAA,GAAI,GAAG,CAAA;AAAA,IACrB,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,CAAA,GAAI,GAAG,CAAA;AAAA,IACrB,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,CAAA,GAAI,GAAG;AAAA,GACvB;AACF;AAKO,SAAS,QAAA,CACd,CACA,EAAA,CAAA,EACA,CACqC,EAAA;AACrC,EAAK,CAAA,IAAA,GAAA;AACL,EAAK,CAAA,IAAA,GAAA;AACL,EAAK,CAAA,IAAA,GAAA;AAEL,EAAA,IAAI,MAAM,CAAG,EAAA;AACX,IAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,GAAI,GAAG,CAAA;AAC/B,IAAA,OAAO,EAAE,CAAG,EAAA,IAAA,EAAM,CAAG,EAAA,IAAA,EAAM,GAAG,IAAK,EAAA;AAAA;AAGrC,EAAA,MAAM,OAAU,GAAA,CAACA,EAAWC,EAAAA,EAAAA,EAAW,CAAsB,KAAA;AAC3D,IAAI,IAAA,CAAA,GAAI,GAAQ,CAAA,IAAA,CAAA;AAChB,IAAI,IAAA,CAAA,GAAI,GAAQ,CAAA,IAAA,CAAA;AAChB,IAAA,IAAI,IAAI,CAAI,GAAA,CAAA,SAAUD,EAAKC,GAAAA,CAAAA,EAAAA,GAAID,MAAK,CAAI,GAAA,CAAA;AACxC,IAAI,IAAA,CAAA,GAAI,CAAI,GAAA,CAAA,EAAUC,OAAAA,EAAAA;AACtB,IAAI,IAAA,CAAA,GAAI,IAAI,CAAG,EAAA,OAAOD,MAAKC,EAAID,GAAAA,EAAAA,KAAM,CAAI,GAAA,CAAA,GAAI,CAAK,CAAA,GAAA,CAAA;AAClD,IAAOA,OAAAA,EAAAA;AAAA,GACT;AAEA,EAAM,MAAA,CAAA,GAAI,IAAI,GAAM,GAAA,CAAA,IAAK,IAAI,CAAK,CAAA,GAAA,CAAA,GAAI,IAAI,CAAI,GAAA,CAAA;AAC9C,EAAM,MAAA,CAAA,GAAI,IAAI,CAAI,GAAA,CAAA;AAElB,EAAO,OAAA;AAAA,IACL,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,GAAG,CAAI,GAAA,CAAA,GAAI,CAAC,CAAA,GAAI,GAAG,CAAA;AAAA,IAC5C,CAAA,EAAG,KAAK,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAG,EAAA,CAAC,IAAI,GAAG,CAAA;AAAA,IACpC,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,GAAG,CAAI,GAAA,CAAA,GAAI,CAAC,CAAA,GAAI,GAAG;AAAA,GAC9C;AACF;;;ACtNO,SAAS,UAAU,GAAmB,EAAA;AAC3C,EAAI,IAAA,CAAA,GAAI,IAAI,IAAK,EAAA;AACjB,EAAA,IAAI,EAAE,UAAW,CAAA,GAAG,GAAO,CAAA,GAAA,CAAA,CAAE,MAAM,CAAC,CAAA;AAEpC,EAAI,IAAA,CAAA,EAAW,GAAW,CAAW,EAAA,CAAA;AAErC,EAAI,IAAA,CAAA,CAAE,WAAW,CAAG,EAAA;AAClB,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAC5B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAC5B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAC5B,IAAI,CAAA,GAAA,CAAA;AAAA,GACN,MAAA,IAAW,CAAE,CAAA,MAAA,KAAW,CAAG,EAAA;AACzB,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAC5B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAC5B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAC5B,IAAI,CAAA,GAAA,QAAA,CAAS,EAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA,EAAG,EAAE,CAAI,GAAA,GAAA;AAAA,GAClC,MAAA,IAAW,CAAE,CAAA,MAAA,KAAW,CAAG,EAAA;AACzB,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,CAAC,GAAG,EAAE,CAAA;AAC9B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,CAAC,GAAG,EAAE,CAAA;AAC9B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,CAAC,GAAG,EAAE,CAAA;AAC9B,IAAI,CAAA,GAAA,CAAA;AAAA,GACN,MAAA,IAAW,CAAE,CAAA,MAAA,KAAW,CAAG,EAAA;AACzB,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,CAAC,GAAG,EAAE,CAAA;AAC9B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,CAAC,GAAG,EAAE,CAAA;AAC9B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,CAAC,GAAG,EAAE,CAAA;AAC9B,IAAA,CAAA,GAAI,SAAS,CAAE,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAI,GAAA,GAAA;AAAA,GAC7B,MAAA;AACL,IAAA,MAAM,IAAI,KAAA,CAAM,CAAsB,mBAAA,EAAA,GAAG,CAAE,CAAA,CAAA;AAAA;AAG7C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAE,EAAA;AACtB;AAKO,SAAS,gBAAgB,GAA2B,EAAA;AACzD,EAAO,OAAA;AAAA,IACL,CAAA,EAAG,mBAAoB,CAAA,GAAA,CAAI,CAAC,CAAA;AAAA,IAC5B,CAAA,EAAG,mBAAoB,CAAA,GAAA,CAAI,CAAC,CAAA;AAAA,IAC5B,CAAA,EAAG,mBAAoB,CAAA,GAAA,CAAI,CAAC,CAAA;AAAA,IAC5B,CAAA,EAAG,cAAe,CAAA,GAAA,CAAI,CAAC;AAAA,GACzB;AACF;AAKO,SAAS,gBAAgB,GAAmB,EAAA;AACjD,EAAM,MAAA,KAAA,GAAQ,GAAI,CAAA,KAAA,CAAM,+EAA+E,CAAA;AACvG,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,GAAG,CAAE,CAAA,CAAA;AAAA;AAG9C,EAAO,OAAA;AAAA,IACL,GAAG,mBAAoB,CAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAC,CAAA;AAAA,IAC3C,GAAG,mBAAoB,CAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAC,CAAA;AAAA,IAC3C,GAAG,mBAAoB,CAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAC,CAAA;AAAA,IAC3C,CAAA,EAAG,KAAM,CAAA,CAAC,CAAM,KAAA,MAAA,GAAY,cAAe,CAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAC,CAAI,GAAA;AAAA,GACrE;AACF;AAKO,SAAS,gBAAgB,GAA2B,EAAA;AACzD,EAAM,MAAA,EAAE,CAAG,EAAA,CAAA,EAAG,CAAE,EAAA,GAAI,QAAS,CAAA,GAAA,CAAI,CAAG,EAAA,GAAA,CAAI,CAAG,EAAA,GAAA,CAAI,CAAC,CAAA;AAChD,EAAO,OAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA,EAAG,cAAe,CAAA,GAAA,CAAI,CAAC;AAAA,GACzB;AACF;AAKO,SAAS,gBAAgB,GAAmB,EAAA;AACjD,EAAM,MAAA,KAAA,GAAQ,GAAI,CAAA,KAAA,CAAM,mFAAmF,CAAA;AAC3G,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,GAAG,CAAE,CAAA,CAAA;AAAA;AAG9C,EAAA,MAAM,CAAI,GAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA;AAC7B,EAAA,MAAM,CAAI,GAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA;AAC7B,EAAA,MAAM,CAAI,GAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA;AAC7B,EAAM,MAAA,CAAA,GAAI,MAAM,CAAC,CAAA,KAAM,SAAY,UAAW,CAAA,KAAA,CAAM,CAAC,CAAC,CAAI,GAAA,CAAA;AAE1D,EAAM,MAAA,EAAE,GAAG,CAAG,EAAA,CAAA,KAAM,QAAS,CAAA,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,EAAA,OAAO,EAAE,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,EAAA,cAAA,CAAe,CAAC,CAAE,EAAA;AACzC;AAKO,SAAS,WAAA,CAAY,SAAuB,KAAsB,EAAA;AACvE,EAAA,QAAQ,OAAS;AAAA,IACf,KAAK,KAAA;AACH,MAAA,OAAO,UAAU,KAAe,CAAA;AAAA,IAClC,KAAK,YAAA;AACH,MAAA,OAAO,gBAAgB,KAAuB,CAAA;AAAA,IAChD,KAAK,YAAA;AACH,MAAA,OAAO,gBAAgB,KAAe,CAAA;AAAA,IACxC,KAAK,YAAA;AACH,MAAA,OAAO,gBAAgB,KAAuB,CAAA;AAAA,IAChD,KAAK,YAAA;AACH,MAAA,OAAO,gBAAgB,KAAe,CAAA;AAAA,IACxC;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAA0B,uBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAEzD;;;ACrIA,IAAM,eAAsC,GAAA;AAAA,EAC1C,SAAW,EAAA,KAAA;AAAA,EACX,YAAc,EAAA,KAAA;AAAA,EACd,OAAS,EAAA;AACX,CAAA;AASA,SAAS,WAAA,CAAY,MAAY,OAAqC,EAAA;AACpE,EAAM,MAAA,CAAA,GAAI,KAAK,CAAE,CAAA,QAAA,CAAS,EAAE,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AAC7C,EAAM,MAAA,CAAA,GAAI,KAAK,CAAE,CAAA,QAAA,CAAS,EAAE,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AAC7C,EAAM,MAAA,CAAA,GAAI,KAAK,CAAE,CAAA,QAAA,CAAS,EAAE,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AAE7C,EAAI,IAAA,GAAA;AAEJ,EAAA,IAAI,OAAQ,CAAA,YAAA,IAAgB,IAAK,CAAA,CAAA,GAAI,CAAG,EAAA;AACtC,IAAA,MAAM,CAAI,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,CAAI,GAAA,GAAG,CAC9B,CAAA,QAAA,CAAS,EAAE,CAAA,CACX,QAAS,CAAA,CAAA,EAAG,GAAG,CAAA;AAClB,IAAA,GAAA,GAAM,IAAI,CAAC,CAAA,EAAG,CAAC,CAAG,EAAA,CAAC,GAAG,CAAC,CAAA,CAAA;AAAA,GAClB,MAAA;AACL,IAAA,GAAA,GAAM,CAAI,CAAA,EAAA,CAAC,CAAG,EAAA,CAAC,GAAG,CAAC,CAAA,CAAA;AAAA;AAIrB,EAAA,IAAI,QAAQ,OAAW,IAAA,CAAC,QAAQ,YAAgB,IAAA,IAAA,CAAK,MAAM,CAAG,EAAA;AAC5D,IAAA,IAAI,EAAE,CAAC,CAAA,KAAM,CAAE,CAAA,CAAC,KAAK,CAAE,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,CAAC,CAAK,IAAA,CAAA,CAAE,CAAC,CAAM,KAAA,CAAA,CAAE,CAAC,CAAG,EAAA;AACnD,MAAM,GAAA,GAAA,CAAA,CAAA,EAAI,CAAE,CAAA,CAAC,CAAC,CAAA,EAAG,CAAE,CAAA,CAAC,CAAC,CAAA,EAAG,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA;AAC9B;AAGF,EAAA,OAAO,QAAQ,SAAY,GAAA,GAAA,CAAI,WAAY,EAAA,GAAI,IAAI,WAAY,EAAA;AACjE;AAKA,SAAS,iBAAA,CAAkB,MAAY,OAAqC,EAAA;AAC1E,EAAA,IAAI,OAAQ,CAAA,YAAA,IAAgB,IAAK,CAAA,CAAA,GAAI,CAAG,EAAA;AACtC,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAO,OAAA,CAAA,KAAA,EAAQ,IAAK,CAAA,CAAC,CAAI,CAAA,EAAA,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAK,CAAA,CAAC,CAAI,CAAA,EAAA,IAAA,CAAK,CAAC,CAAA,CAAA,CAAA;AAAA;AAErD,IAAO,OAAA,CAAA,KAAA,EAAQ,IAAK,CAAA,CAAC,CAAK,EAAA,EAAA,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,IAAK,CAAA,CAAC,CAAK,EAAA,EAAA,IAAA,CAAK,CAAC,CAAA,CAAA,CAAA;AAAA;AAGxD,EAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,IAAO,OAAA,CAAA,IAAA,EAAO,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA;AAE1C,EAAO,OAAA,CAAA,IAAA,EAAO,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAC5C;AAKA,SAAS,iBAAA,CAAkB,MAAY,OAAqC,EAAA;AAC1E,EAAM,MAAA,EAAE,CAAG,EAAA,CAAA,EAAG,CAAE,EAAA,GAAI,QAAS,CAAA,IAAA,CAAK,CAAG,EAAA,IAAA,CAAK,CAAG,EAAA,IAAA,CAAK,CAAC,CAAA;AAEnD,EAAA,IAAI,OAAQ,CAAA,YAAA,IAAgB,IAAK,CAAA,CAAA,GAAI,CAAG,EAAA;AACtC,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAO,OAAA,CAAA,KAAA,EAAQ,CAAC,CAAI,CAAA,EAAA,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA;AAExC,IAAO,OAAA,CAAA,KAAA,EAAQ,CAAC,CAAK,EAAA,EAAA,CAAC,MAAM,CAAC,CAAA,GAAA,EAAM,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA;AAG3C,EAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,IAAA,OAAO,CAAO,IAAA,EAAA,CAAC,CAAI,CAAA,EAAA,CAAC,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA;AAE5B,EAAA,OAAO,CAAO,IAAA,EAAA,CAAC,CAAK,EAAA,EAAA,CAAC,MAAM,CAAC,CAAA,EAAA,CAAA;AAC9B;AAMA,SAAS,iBAAA,CAAkB,MAAY,OAAqC,EAAA;AAE1E,EAAO,OAAA,iBAAA,CAAkB,MAAM,OAAO,CAAA;AACxC;AAMA,SAAS,iBAAA,CAAkB,MAAY,OAAqC,EAAA;AAE1E,EAAO,OAAA,iBAAA,CAAkB,MAAM,OAAO,CAAA;AACxC;AAwBO,SAAS,WAAA,CACd,OACA,EAAA,KAAA,EACA,OACQ,EAAA;AACR,EAAA,MAAM,IAAO,GAAA,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAQ,EAAA;AAG9C,EAAI,IAAA,IAAA;AAGJ,EACE,IAAA,OAAO,KAAU,KAAA,QAAA,IACjB,KAAU,KAAA,IAAA,IACV,OAAO,KACP,IAAA,GAAA,IAAO,KACP,IAAA,GAAA,IAAO,KACP,EAAA;AACA,IAAA,MAAM,GAAM,GAAA,KAAA;AACZ,IAAO,IAAA,GAAA;AAAA,MACL,GAAG,GAAI,CAAA,CAAA;AAAA,MACP,GAAG,GAAI,CAAA,CAAA;AAAA,MACP,GAAG,GAAI,CAAA,CAAA;AAAA,MACP,CAAA,EAAG,IAAI,CAAK,IAAA;AAAA,KACd;AAAA,GACF,MAAA,IACE,OAAO,KAAA,KAAU,QACjB,IAAA,KAAA,KAAU,IACV,IAAA,GAAA,IAAO,KACP,IAAA,GAAA,IAAO,KACP,IAAA,GAAA,IAAO,KACP,EAAA;AAEA,IAAO,IAAA,GAAA,WAAA,CAAY,cAAc,KAAK,CAAA;AAAA,GACxC,MAAA,IAAW,OAAO,KAAA,KAAU,QAAU,EAAA;AAEpC,IAAA,IAAA,GAAO,WAAY,CAAA,mBAAA,CAAoB,KAAK,CAAA,EAAG,KAAK,CAAA;AAAA,GAC/C,MAAA;AACL,IAAA,MAAM,IAAI,KAAM,CAAA,CAAA,qBAAA,EAAwB,MAAO,CAAA,KAAK,CAAC,CAAE,CAAA,CAAA;AAAA;AAIzD,EAAA,QAAQ,OAAS;AAAA,IACf,KAAK,KAAA;AACH,MAAO,OAAA,WAAA,CAAY,MAAM,IAAI,CAAA;AAAA,IAC/B,KAAK,YAAA;AACH,MAAO,OAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAAA,IACrC,KAAK,YAAA;AACH,MAAO,OAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAAA,IACrC,KAAK,YAAA;AACH,MAAO,OAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAAA,IACrC,KAAK,YAAA;AACH,MAAO,OAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAAA,IACrC;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAA0B,uBAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAAA;AAEzD;AAKA,SAAS,oBAAoB,KAA6B,EAAA;AACxD,EAAA,MAAM,OAAU,GAAA,KAAA,CAAM,IAAK,EAAA,CAAE,WAAY,EAAA;AAEzC,EAAI,IAAA,oBAAA,CAAqB,IAAK,CAAA,OAAO,CAAG,EAAA;AACtC,IAAO,OAAA,KAAA;AAAA;AAET,EAAI,IAAA,cAAA,CAAe,IAAK,CAAA,OAAO,CAAG,EAAA;AAChC,IAAO,OAAA,YAAA;AAAA;AAET,EAAI,IAAA,cAAA,CAAe,IAAK,CAAA,OAAO,CAAG,EAAA;AAChC,IAAO,OAAA,YAAA;AAAA;AAIT,EAAO,OAAA,KAAA;AACT;;;ACvLO,SAAS,SAAA,CAAU,OAAgB,OAAqC,EAAA;AAC7E,EAAM,MAAA,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAE3B,EAAA,IAAI,KAAM,CAAA,IAAA,CAAK,OAAQ,EAAC,CAAG,EAAA;AACzB,IAAO,OAAA,cAAA;AAAA;AAIT,EAAA,IACE,CAAC,OAAA,IACA,CAAC,OAAA,CAAQ,SAAa,IAAA,CAAC,OAAQ,CAAA,SAAA,IAAa,CAAC,OAAA,CAAQ,QAAY,IAAA,CAAC,QAAQ,QAC3E,EAAA;AACA,IAAO,OAAA,KAAA;AAAA;AAGT,EAAO,OAAA,cAAA,CAAe,MAAM,OAAO,CAAA;AACrC;AAgBO,SAAS,eAAA,CAAgB,OAAsB,OAAqC,EAAA;AACzF,EAAM,MAAA,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAE3B,EAAA,IAAI,KAAM,CAAA,IAAA,CAAK,OAAQ,EAAC,CAAG,EAAA;AACzB,IAAO,OAAA,cAAA;AAAA;AAIT,EAAA,IACE,CAAC,OAAA,IACA,CAAC,OAAA,CAAQ,SAAa,IAAA,CAAC,OAAQ,CAAA,SAAA,IAAa,CAAC,OAAA,CAAQ,QAAY,IAAA,CAAC,QAAQ,QAC3E,EAAA;AACA,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA;AAGrB,EAAO,OAAA,cAAA,CAAe,MAAM,OAAO,CAAA;AACrC;AAgBO,SAAS,WAAA,CAAY,OAAkB,OAAqC,EAAA;AACjF,EAAA,MAAM,IAAO,GAAA,IAAI,IAAK,CAAA,KAAA,GAAQ,GAAI,CAAA;AAElC,EAAA,IAAI,KAAM,CAAA,IAAA,CAAK,OAAQ,EAAC,CAAG,EAAA;AACzB,IAAO,OAAA,cAAA;AAAA;AAIT,EAAA,IACE,CAAC,OAAA,IACA,CAAC,OAAA,CAAQ,SAAa,IAAA,CAAC,OAAQ,CAAA,SAAA,IAAa,CAAC,OAAA,CAAQ,QAAY,IAAA,CAAC,QAAQ,QAC3E,EAAA;AACA,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA;AAGrB,EAAO,OAAA,cAAA,CAAe,MAAM,OAAO,CAAA;AACrC;AAqBO,SAAS,UAAA,CACd,OACA,EAAA,KAAA,EACA,OACQ,EAAA;AACR,EAAA,QAAQ,OAAS;AAAA,IACf,KAAK,KAAA;AACH,MAAO,OAAA,SAAA,CAAU,OAAkB,OAAO,CAAA;AAAA,IAC5C,KAAK,WAAA;AACH,MAAO,OAAA,eAAA,CAAgB,OAAwB,OAAO,CAAA;AAAA,IACxD,KAAK,OAAA;AACH,MAAO,OAAA,WAAA,CAAY,OAAoB,OAAO,CAAA;AAAA,IAChD;AACE,MAAO,OAAA,cAAA;AAAA;AAEb;AASA,SAAS,cAAA,CAAe,MAAY,OAAoC,EAAA;AACtE,EAAM,MAAA,MAAA,GAAS,QAAQ,MAAU,IAAA,OAAA;AACjC,EAAA,MAAM,gBAA4C,EAAC;AAEnD,EAAA,IAAI,QAAQ,QAAU,EAAA;AACpB,IAAA,aAAA,CAAc,WAAW,OAAQ,CAAA,QAAA;AAAA;AAGnC,EAAA,IAAI,QAAQ,QAAU,EAAA;AACpB,IAAc,aAAA,CAAA,SAAA,GAAY,QAAQ,SAAa,IAAA,QAAA;AAAA,GACjD,MAAA,IAAW,QAAQ,QAAU,EAAA;AAC3B,IAAc,aAAA,CAAA,SAAA,GAAY,QAAQ,SAAa,IAAA,QAAA;AAAA,GAC1C,MAAA;AACL,IAAA,IAAI,OAAQ,CAAA,SAAA,EAAyB,aAAA,CAAA,SAAA,GAAY,OAAQ,CAAA,SAAA;AACzD,IAAA,IAAI,OAAQ,CAAA,SAAA,EAAyB,aAAA,CAAA,SAAA,GAAY,OAAQ,CAAA,SAAA;AAAA;AAG3D,EAAA,OAAO,IAAI,IAAK,CAAA,cAAA,CAAe,QAAQ,aAAa,CAAA,CAAE,OAAO,IAAI,CAAA;AACnE;;;ACrGO,IAAM,gBAAyD,GAAA;AAAA;AAAA;AAAA;AAAA,EAIpE,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,WAAA;AAAA,IACV,MAAQ,EAAA,YAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,MAAA;AAAA,IACV,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,KAAA;AAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,MAAQ,EAAA,gBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA,cAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,KAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,MAAQ,EAAA,cAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,MAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA,cAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,iBAAA;AAAA,IACV,MAAQ,EAAA,kBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,mBAAA;AAAA,IACV,MAAQ,EAAA,oBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA,EAKA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,IAAA;AAAA,IACR,QAAU,EAAA,gBAAA;AAAA,IACV,MAAQ,EAAA,iBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA,eAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,gBAAA;AAAA,IACV,MAAQ,EAAA,iBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA,eAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,gBAAA;AAAA,IACV,MAAQ,EAAA,iBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA,EAKA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA,eAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,kBAAA;AAAA,IACV,MAAQ,EAAA,kBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,MAAQ,EAAA,gBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,KAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,QAAA;AAAA,IACR,QAAU,EAAA,cAAA;AAAA,IACV,MAAQ,EAAA,cAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,QAAU,EAAA,oBAAA;AAAA,IACV,MAAQ,EAAA,oBAAA;AAAA,IACR,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,IAAA;AAAA,IACb,kBAAoB,EAAA,GAAA;AAAA,IACpB,gBAAkB,EAAA;AAAA;AAEtB,CAAA;;;ACzMO,SAAS,cAAA,CACd,OACA,OACQ,EAAA;AACR,EAAM,MAAA,MAAA,GAAS,gBAAiB,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAEhD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAA0B,uBAAA,EAAA,OAAA,CAAQ,QAAQ,CAAE,CAAA,CAAA;AAAA;AAI9D,EAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,IAAOE,OAAAA,eAAAA,CAAe,KAAO,EAAA,OAAA,EAAS,MAAM,CAAA;AAAA;AAI9C,EAAO,OAAA,YAAA,CAAa,KAAO,EAAA,OAAA,EAAS,MAAM,CAAA;AAC5C;AAKA,SAASA,eAAAA,CACP,KACA,EAAA,OAAA,EACA,MACQ,EAAA;AACR,EAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,QAAA,IAAY,MAAO,CAAA,QAAA;AAE5C,EAAA,MAAM,WAAwC,GAAA;AAAA,IAC5C,KAAA,EAAO,OAAQ,CAAA,UAAA,GAAa,SAAY,GAAA,UAAA;AAAA,IACxC,UAAU,MAAO,CAAA,IAAA;AAAA,IACjB,qBAAuB,EAAA,QAAA;AAAA,IACvB,qBAAuB,EAAA;AAAA,GACzB;AAEA,EAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,IAAA,WAAA,CAAY,eAAkB,GAAA,MAAA;AAAA;AAGhC,EAAA,IAAI,YAAY,IAAI,IAAA,CAAK,aAAa,OAAQ,CAAA,MAAA,EAAQ,WAAW,CAAE,CAAA,MAAA;AAAA,IACjE;AAAA,GACF;AAEA,EAAI,IAAA,OAAA,CAAQ,gBAAoB,IAAA,KAAA,GAAQ,CAAG,EAAA;AACzC,IAAA,SAAA,GAAY,GAAM,GAAA,SAAA;AAAA;AAGpB,EAAO,OAAA,SAAA;AACT;AAKA,SAAS,YAAA,CACP,KACA,EAAA,OAAA,EACA,MACQ,EAAA;AACR,EAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,QAAA,IAAY,MAAO,CAAA,QAAA;AAC5C,EAAA,MAAM,aAAa,KAAQ,GAAA,CAAA;AAC3B,EAAM,MAAA,QAAA,GAAW,IAAK,CAAA,GAAA,CAAI,KAAK,CAAA;AAG/B,EAAA,MAAM,eAAkB,GAAA,YAAA;AAAA,IACtB,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAO,CAAA,kBAAA;AAAA,IACP,MAAO,CAAA;AAAA,GACT;AAGA,EAAA,IAAI,MAAS,GAAA,EAAA;AAGb,EAAA,IAAI,UAAY,EAAA;AACd,IAAU,MAAA,IAAA,GAAA;AAAA,GACZ,MAAA,IAAW,QAAQ,gBAAkB,EAAA;AACnC,IAAU,MAAA,IAAA,GAAA;AAAA;AAIZ,EAAA,IAAI,QAAQ,UAAY,EAAA;AACtB,IAAU,MAAA,IAAA,eAAA;AAAA,GACZ,MAAA,IAAW,QAAQ,OAAS,EAAA;AAE1B,IAAA,MAAM,IAAO,GAAA,QAAA,KAAa,CAAI,GAAA,MAAA,CAAO,WAAW,MAAO,CAAA,MAAA;AACvD,IAAU,MAAA,IAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,GAC/B,MAAA;AAEL,IAAA,MAAM,cACJ,OAAQ,CAAA,WAAA,KAAgB,MACpB,GAAA,OAAA,CAAQ,cACR,MAAO,CAAA,WAAA;AAEb,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,MAAA,IAAU,CAAG,EAAA,MAAA,CAAO,MAAM,CAAA,EAAG,eAAe,CAAA,CAAA;AAAA,KACvC,MAAA;AACL,MAAA,MAAA,IAAU,CAAG,EAAA,eAAe,CAAI,CAAA,EAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA;AAC/C;AAGF,EAAO,OAAA,MAAA;AACT;AAKA,SAAS,YACP,CAAA,KAAA,EACA,QACA,EAAA,kBAAA,EACA,gBACQ,EAAA;AAER,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAGpC,EAAA,MAAM,CAAC,OAAS,EAAA,OAAO,CAAI,GAAA,KAAA,CAAM,MAAM,GAAG,CAAA;AAG1C,EAAA,MAAM,YAAe,GAAA,OAAA,CAAQ,OAAQ,CAAA,uBAAA,EAAyB,kBAAkB,CAAA;AAGhF,EAAI,IAAA,QAAA,GAAW,KAAK,OAAS,EAAA;AAC3B,IAAA,OAAO,CAAG,EAAA,YAAY,CAAG,EAAA,gBAAgB,GAAG,OAAO,CAAA,CAAA;AAAA;AAGrD,EAAO,OAAA,YAAA;AACT","file":"format.mjs","sourcesContent":["/**\n * Area Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de área.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AreaUnit =\n  // SI\n  | \"square_kilometer\"\n  | \"hectare\"\n  | \"are\"\n  | \"square_meter\"\n  | \"square_decimeter\"\n  | \"square_centimeter\"\n  | \"square_millimeter\"\n  // Imperial/US\n  | \"square_mile\"\n  | \"acre\"\n  | \"square_yard\"\n  | \"square_foot\"\n  | \"square_inch\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de área.\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Imperial: derivados de (comprimento)² onde comprimento é exato desde 1959\n *\n * Relações imperiais:\n * - 1 in² = (0.0254 m)² = 0.00064516 m²\n * - 1 ft² = (0.3048 m)² = 0.09290304 m²\n * - 1 yd² = (0.9144 m)² = 0.83612736 m²\n * - 1 mi² = (1609.344 m)² = 2589988.110336 m²\n * - 1 acre = 43560 ft² = 4046.8564224 m²\n */\nexport const AREA_UNITS: Record<AreaUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  square_kilometer: {\n    factor: 1_000_000,\n    symbol: \"km²\",\n    singular: \"square kilometer\",\n    plural: \"square kilometers\",\n  },\n  hectare: {\n    factor: 10_000,\n    symbol: \"ha\",\n    singular: \"hectare\",\n    plural: \"hectares\",\n  },\n  are: {\n    factor: 100,\n    symbol: \"a\",\n    singular: \"are\",\n    plural: \"ares\",\n  },\n  square_meter: {\n    factor: 1,\n    symbol: \"m²\",\n    singular: \"square meter\",\n    plural: \"square meters\",\n  },\n  square_decimeter: {\n    factor: 0.01,\n    symbol: \"dm²\",\n    singular: \"square decimeter\",\n    plural: \"square decimeters\",\n  },\n  square_centimeter: {\n    factor: 0.0001,\n    symbol: \"cm²\",\n    singular: \"square centimeter\",\n    plural: \"square centimeters\",\n  },\n  square_millimeter: {\n    factor: 0.000001,\n    symbol: \"mm²\",\n    singular: \"square millimeter\",\n    plural: \"square millimeters\",\n  },\n\n  // Imperial/US (todos exatos, derivados de comprimento² desde 1959)\n  square_mile: {\n    factor: 2_589_988.110336,\n    symbol: \"mi²\",\n    singular: \"square mile\",\n    plural: \"square miles\",\n  },\n  acre: {\n    factor: 4_046.8564224,\n    symbol: \"ac\",\n    singular: \"acre\",\n    plural: \"acres\",\n  },\n  square_yard: {\n    factor: 0.83612736,\n    symbol: \"yd²\",\n    singular: \"square yard\",\n    plural: \"square yards\",\n  },\n  square_foot: {\n    factor: 0.09290304,\n    symbol: \"ft²\",\n    singular: \"square foot\",\n    plural: \"square feet\",\n  },\n  square_inch: {\n    factor: 0.00064516,\n    symbol: \"in²\",\n    singular: \"square inch\",\n    plural: \"square inches\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const AREA_ALIASES: UnitAliases = {\n  // square_kilometer\n  \"km²\": \"square_kilometer\",\n  km2: \"square_kilometer\",\n  // hectare\n  ha: \"hectare\",\n  // are\n  a: \"are\",\n  // square_meter\n  \"m²\": \"square_meter\",\n  m2: \"square_meter\",\n  // square_decimeter\n  \"dm²\": \"square_decimeter\",\n  dm2: \"square_decimeter\",\n  // square_centimeter\n  \"cm²\": \"square_centimeter\",\n  cm2: \"square_centimeter\",\n  // square_millimeter\n  \"mm²\": \"square_millimeter\",\n  mm2: \"square_millimeter\",\n  // square_mile\n  \"mi²\": \"square_mile\",\n  mi2: \"square_mile\",\n  // acre\n  ac: \"acre\",\n  // square_yard\n  \"yd²\": \"square_yard\",\n  yd2: \"square_yard\",\n  // square_foot\n  \"ft²\": \"square_foot\",\n  ft2: \"square_foot\",\n  // square_inch\n  \"in²\": \"square_inch\",\n  in2: \"square_inch\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const AREA_UNIT_LIST = Object.keys(AREA_UNITS) as AreaUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const AREA_FACTORS: Record<AreaUnit, number> = Object.fromEntries(\n  Object.entries(AREA_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<AreaUnit, number>;\n","/**\n * Area Role - Format Pillar\n *\n * Formata valores de área para apresentação.\n *\n * @example\n * import { formatArea } from '@attrx/role-morphic/area/format';\n *\n * formatArea('hectare', 2.5);                      // \"2.5 ha\"\n * formatArea('hectare', 2.5, { verbose: true });   // \"2.5 hectares\"\n * formatArea('hectare', 1000, { locale: 'pt-BR' }); // \"1.000 ha\"\n */\n\nimport { AREA_UNITS, type AreaUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AreaFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de área para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatArea('hectare', 2.5);                        // \"2.5 ha\"\n * formatArea('hectare', 2.5, { verbose: true });     // \"2.5 hectares\"\n * formatArea('hectare', 1, { verbose: true });       // \"1 hectare\"\n * formatArea('hectare', 1000, { locale: 'pt-BR' });  // \"1.000 ha\"\n * formatArea('hectare', 1500, { decimals: 0 });      // \"1500 ha\"\n */\nexport function formatArea(\n  variant: AreaUnit,\n  value: number,\n  options: AreaFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = AREA_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown area variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getAreaSymbol('hectare');  // \"ha\"\n * getAreaSymbol('acre');     // \"ac\"\n */\nexport function getAreaSymbol(variant: AreaUnit): string {\n  const unit = AREA_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown area variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getAreaName('hectare', 1);   // \"hectare\"\n * getAreaName('hectare', 2);   // \"hectares\"\n */\nexport function getAreaName(variant: AreaUnit, count: number = 1): string {\n  const unit = AREA_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown area variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Length Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de comprimento.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type LengthUnit =\n  // SI\n  | \"kilometer\"\n  | \"hectometer\"\n  | \"decameter\"\n  | \"meter\"\n  | \"decimeter\"\n  | \"centimeter\"\n  | \"millimeter\"\n  | \"micrometer\"\n  | \"nanometer\"\n  // Imperial/US\n  | \"inch\"\n  | \"foot\"\n  | \"yard\"\n  | \"mile\"\n  // Nautical\n  | \"nautical_mile\"\n  // Other\n  | \"fathom\"\n  | \"furlong\"\n  | \"league\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de comprimento.\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Imperial: exatos desde International Yard and Pound Agreement (1959)\n *   - 1 yard = 0.9144 m (exato por definição)\n *   - 1 foot = 0.3048 m (= yard/3)\n *   - 1 inch = 0.0254 m (= foot/12)\n *   - 1 mile = 1609.344 m (= 5280 feet)\n */\nexport const LENGTH_UNITS: Record<LengthUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  kilometer: {\n    factor: 1000,\n    symbol: \"km\",\n    singular: \"kilometer\",\n    plural: \"kilometers\",\n  },\n  hectometer: {\n    factor: 100,\n    symbol: \"hm\",\n    singular: \"hectometer\",\n    plural: \"hectometers\",\n  },\n  decameter: {\n    factor: 10,\n    symbol: \"dam\",\n    singular: \"decameter\",\n    plural: \"decameters\",\n  },\n  meter: {\n    factor: 1,\n    symbol: \"m\",\n    singular: \"meter\",\n    plural: \"meters\",\n  },\n  decimeter: {\n    factor: 0.1,\n    symbol: \"dm\",\n    singular: \"decimeter\",\n    plural: \"decimeters\",\n  },\n  centimeter: {\n    factor: 0.01,\n    symbol: \"cm\",\n    singular: \"centimeter\",\n    plural: \"centimeters\",\n  },\n  millimeter: {\n    factor: 0.001,\n    symbol: \"mm\",\n    singular: \"millimeter\",\n    plural: \"millimeters\",\n  },\n  micrometer: {\n    factor: 0.000001,\n    symbol: \"μm\",\n    singular: \"micrometer\",\n    plural: \"micrometers\",\n  },\n  nanometer: {\n    factor: 0.000000001,\n    symbol: \"nm\",\n    singular: \"nanometer\",\n    plural: \"nanometers\",\n  },\n\n  // Imperial/US (exatos desde 1959)\n  inch: {\n    factor: 0.0254,\n    symbol: \"in\",\n    singular: \"inch\",\n    plural: \"inches\",\n  },\n  foot: {\n    factor: 0.3048,\n    symbol: \"ft\",\n    singular: \"foot\",\n    plural: \"feet\",\n  },\n  yard: {\n    factor: 0.9144,\n    symbol: \"yd\",\n    singular: \"yard\",\n    plural: \"yards\",\n  },\n  mile: {\n    factor: 1609.344,\n    symbol: \"mi\",\n    singular: \"mile\",\n    plural: \"miles\",\n  },\n\n  // Nautical (exato por definição internacional)\n  nautical_mile: {\n    factor: 1852,\n    symbol: \"nmi\",\n    singular: \"nautical mile\",\n    plural: \"nautical miles\",\n  },\n\n  // Other (derivados, portanto exatos)\n  fathom: {\n    factor: 1.8288, // 6 feet\n    symbol: \"ftm\",\n    singular: \"fathom\",\n    plural: \"fathoms\",\n  },\n  furlong: {\n    factor: 201.168, // 660 feet = 1/8 mile\n    symbol: \"fur\",\n    singular: \"furlong\",\n    plural: \"furlongs\",\n  },\n  league: {\n    factor: 4828.032, // 3 miles\n    symbol: \"lea\",\n    singular: \"league\",\n    plural: \"leagues\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const LENGTH_ALIASES: UnitAliases = {\n  // kilometer\n  km: \"kilometer\",\n  // hectometer\n  hm: \"hectometer\",\n  // decameter\n  dam: \"decameter\",\n  // meter\n  m: \"meter\",\n  // decimeter\n  dm: \"decimeter\",\n  // centimeter\n  cm: \"centimeter\",\n  // millimeter\n  mm: \"millimeter\",\n  // micrometer\n  \"μm\": \"micrometer\",\n  um: \"micrometer\",\n  // nanometer\n  nm: \"nanometer\",\n  // inch\n  in: \"inch\",\n  '\"': \"inch\",\n  // foot\n  ft: \"foot\",\n  \"'\": \"foot\",\n  // yard\n  yd: \"yard\",\n  // mile\n  mi: \"mile\",\n  // nautical_mile\n  nmi: \"nautical_mile\",\n  // fathom\n  ftm: \"fathom\",\n  // furlong\n  fur: \"furlong\",\n  // league\n  lea: \"league\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const LENGTH_UNIT_LIST = Object.keys(LENGTH_UNITS) as LengthUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const LENGTH_FACTORS: Record<LengthUnit, number> = Object.fromEntries(\n  Object.entries(LENGTH_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<LengthUnit, number>;\n","/**\n * Length Role - Format Pillar\n *\n * Formata valores de comprimento para apresentação.\n *\n * @example\n * import { formatLength } from '@attrx/role-morphic/length/format';\n *\n * formatLength('kilometer', 42.195);                      // \"42.2 km\"\n * formatLength('kilometer', 42.195, { verbose: true });   // \"42.2 kilometers\"\n * formatLength('meter', 1000, { locale: 'pt-BR' });       // \"1.000 m\"\n */\n\nimport { LENGTH_UNITS, type LengthUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface LengthFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de comprimento para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatLength('kilometer', 42.195);                        // \"42.2 km\"\n * formatLength('kilometer', 42.195, { verbose: true });     // \"42.2 kilometers\"\n * formatLength('kilometer', 1, { verbose: true });          // \"1 kilometer\"\n * formatLength('meter', 1000, { locale: 'pt-BR' });         // \"1.000 m\"\n * formatLength('meter', 1500, { decimals: 0 });             // \"1500 m\"\n */\nexport function formatLength(\n  variant: LengthUnit,\n  value: number,\n  options: LengthFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = LENGTH_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown length variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getLengthSymbol('kilometer');  // \"km\"\n * getLengthSymbol('mile');       // \"mi\"\n */\nexport function getLengthSymbol(variant: LengthUnit): string {\n  const unit = LENGTH_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown length variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getLengthName('kilometer', 1);   // \"kilometer\"\n * getLengthName('kilometer', 2);   // \"kilometers\"\n */\nexport function getLengthName(variant: LengthUnit, count: number = 1): string {\n  const unit = LENGTH_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown length variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Mass Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de massa.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n *\n * Nota: Massa ≠ Peso\n * - Massa: quantidade de matéria (invariante)\n * - Peso: força gravitacional (varia com localização)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type MassUnit =\n  // SI / Metric\n  | \"metric_ton\"\n  | \"kilogram\"\n  | \"hectogram\"\n  | \"decagram\"\n  | \"gram\"\n  | \"decigram\"\n  | \"centigram\"\n  | \"milligram\"\n  | \"microgram\"\n  // Avoirdupois (US/UK)\n  | \"long_ton\"\n  | \"short_ton\"\n  | \"stone\"\n  | \"pound\"\n  | \"ounce\"\n  | \"dram\"\n  | \"grain\"\n  // Troy (metais preciosos)\n  | \"troy_pound\"\n  | \"troy_ounce\"\n  | \"pennyweight\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de massa.\n *\n * Base: kilogram (kg) - Unidade SI de massa\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Avoirdupois: exatos desde International Yard and Pound Agreement (1959)\n *   - 1 pound = 0.45359237 kg (exato por definição)\n *   - Outras derivadas de pound\n * - Troy: derivados de grain e pound avoirdupois\n */\nexport const MASS_UNITS: Record<MassUnit, SimpleUnitConfig> = {\n  // ===========================================================================\n  // SI / Metric\n  // ===========================================================================\n  metric_ton: {\n    factor: 1000,\n    symbol: \"t\",\n    singular: \"metric ton\",\n    plural: \"metric tons\",\n  },\n  kilogram: {\n    factor: 1,\n    symbol: \"kg\",\n    singular: \"kilogram\",\n    plural: \"kilograms\",\n  },\n  hectogram: {\n    factor: 0.1,\n    symbol: \"hg\",\n    singular: \"hectogram\",\n    plural: \"hectograms\",\n  },\n  decagram: {\n    factor: 0.01,\n    symbol: \"dag\",\n    singular: \"decagram\",\n    plural: \"decagrams\",\n  },\n  gram: {\n    factor: 0.001,\n    symbol: \"g\",\n    singular: \"gram\",\n    plural: \"grams\",\n  },\n  decigram: {\n    factor: 0.0001,\n    symbol: \"dg\",\n    singular: \"decigram\",\n    plural: \"decigrams\",\n  },\n  centigram: {\n    factor: 0.00001,\n    symbol: \"cg\",\n    singular: \"centigram\",\n    plural: \"centigrams\",\n  },\n  milligram: {\n    factor: 0.000001,\n    symbol: \"mg\",\n    singular: \"milligram\",\n    plural: \"milligrams\",\n  },\n  microgram: {\n    factor: 0.000000001,\n    symbol: \"μg\",\n    singular: \"microgram\",\n    plural: \"micrograms\",\n  },\n\n  // ===========================================================================\n  // Avoirdupois (US/UK) - Sistema padrão para peso comum\n  // ===========================================================================\n  long_ton: {\n    factor: 1016.0469088, // 2240 lb (exato)\n    symbol: \"long tn\",\n    singular: \"long ton\",\n    plural: \"long tons\",\n  },\n  short_ton: {\n    factor: 907.18474, // 2000 lb (exato)\n    symbol: \"sh tn\",\n    singular: \"short ton\",\n    plural: \"short tons\",\n  },\n  stone: {\n    factor: 6.35029318, // 14 lb (exato)\n    symbol: \"st\",\n    singular: \"stone\",\n    plural: \"stone\", // stone não muda no plural em inglês\n  },\n  pound: {\n    factor: 0.45359237, // Exato desde 1959\n    symbol: \"lb\",\n    singular: \"pound\",\n    plural: \"pounds\",\n  },\n  ounce: {\n    factor: 0.028349523125, // 1/16 lb (exato)\n    symbol: \"oz\",\n    singular: \"ounce\",\n    plural: \"ounces\",\n  },\n  dram: {\n    factor: 0.0017718451953125, // 1/16 oz (exato)\n    symbol: \"dr\",\n    singular: \"dram\",\n    plural: \"drams\",\n  },\n  grain: {\n    factor: 0.00006479891, // 1/7000 lb (exato)\n    symbol: \"gr\",\n    singular: \"grain\",\n    plural: \"grains\",\n  },\n\n  // ===========================================================================\n  // Troy (metais preciosos)\n  // ===========================================================================\n  troy_pound: {\n    factor: 0.3732417216, // 12 troy oz (exato)\n    symbol: \"lb t\",\n    singular: \"troy pound\",\n    plural: \"troy pounds\",\n  },\n  troy_ounce: {\n    factor: 0.0311034768, // 480 grains (exato)\n    symbol: \"oz t\",\n    singular: \"troy ounce\",\n    plural: \"troy ounces\",\n  },\n  pennyweight: {\n    factor: 0.00155517384, // 1/20 troy oz (exato)\n    symbol: \"dwt\",\n    singular: \"pennyweight\",\n    plural: \"pennyweights\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const MASS_ALIASES: UnitAliases = {\n  // metric_ton\n  t: \"metric_ton\",\n  // kilogram\n  kg: \"kilogram\",\n  // hectogram\n  hg: \"hectogram\",\n  // decagram\n  dag: \"decagram\",\n  // gram\n  g: \"gram\",\n  // decigram\n  dg: \"decigram\",\n  // centigram\n  cg: \"centigram\",\n  // milligram\n  mg: \"milligram\",\n  // microgram\n  \"μg\": \"microgram\",\n  ug: \"microgram\",\n  mcg: \"microgram\",\n  // long_ton\n  \"long tn\": \"long_ton\",\n  // short_ton\n  \"sh tn\": \"short_ton\",\n  // stone\n  st: \"stone\",\n  // pound\n  lb: \"pound\",\n  lbs: \"pound\",\n  \"#\": \"pound\",\n  // ounce\n  oz: \"ounce\",\n  // dram\n  dr: \"dram\",\n  // grain\n  gr: \"grain\",\n  // troy_pound\n  \"lb t\": \"troy_pound\",\n  // troy_ounce\n  \"oz t\": \"troy_ounce\",\n  ozt: \"troy_ounce\",\n  // pennyweight\n  dwt: \"pennyweight\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const MASS_UNIT_LIST = Object.keys(MASS_UNITS) as MassUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const MASS_FACTORS: Record<MassUnit, number> = Object.fromEntries(\n  Object.entries(MASS_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<MassUnit, number>;\n","/**\n * Mass Role - Format Pillar\n *\n * Formata valores de massa para apresentação.\n *\n * @example\n * import { formatMass } from '@attrx/role-morphic/mass/format';\n *\n * formatMass('kilogram', 75.5);                      // \"75.5 kg\"\n * formatMass('kilogram', 75.5, { verbose: true });   // \"75.5 kilograms\"\n * formatMass('pound', 1000, { locale: 'en-US' });    // \"1,000 lb\"\n */\n\nimport { MASS_UNITS, type MassUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface MassFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de massa para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatMass('kilogram', 75.5);                        // \"75.5 kg\"\n * formatMass('kilogram', 75.5, { verbose: true });     // \"75.5 kilograms\"\n * formatMass('kilogram', 1, { verbose: true });        // \"1 kilogram\"\n * formatMass('pound', 1000, { locale: 'en-US' });      // \"1,000 lb\"\n * formatMass('gram', 1500, { decimals: 0 });           // \"1500 g\"\n */\nexport function formatMass(\n  variant: MassUnit,\n  value: number,\n  options: MassFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = MASS_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown mass variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getMassSymbol('kilogram');  // \"kg\"\n * getMassSymbol('pound');     // \"lb\"\n */\nexport function getMassSymbol(variant: MassUnit): string {\n  const unit = MASS_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown mass variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getMassName('kilogram', 1);   // \"kilogram\"\n * getMassName('kilogram', 2);   // \"kilograms\"\n */\nexport function getMassName(variant: MassUnit, count: number = 1): string {\n  const unit = MASS_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown mass variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Temperature Role - Constants\n *\n * Fórmulas de conversão, símbolos e aliases para unidades de temperatura.\n *\n * IMPORTANTE: Temperatura usa FÓRMULAS, não fatores multiplicativos.\n * Isso porque as escalas têm offsets diferentes (0°C ≠ 0°F ≠ 0K).\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type TemperatureUnit = \"celsius\" | \"fahrenheit\" | \"kelvin\" | \"rankine\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de temperatura.\n *\n * Base: celsius (°C)\n *\n * Fórmulas de conversão:\n * - Celsius ↔ Fahrenheit: °F = °C × 9/5 + 32\n * - Celsius ↔ Kelvin: K = °C + 273.15\n * - Celsius ↔ Rankine: °R = (°C + 273.15) × 9/5\n *\n * Pontos de referência:\n * | Descrição        | Celsius | Fahrenheit | Kelvin  | Rankine |\n * |------------------|---------|------------|---------|---------|\n * | Zero absoluto    | -273.15 | -459.67    | 0       | 0       |\n * | Congelamento H₂O | 0       | 32         | 273.15  | 491.67  |\n * | Corpo humano     | 37      | 98.6       | 310.15  | 558.27  |\n * | Ebulição H₂O     | 100     | 212        | 373.15  | 671.67  |\n */\nexport const TEMPERATURE_UNITS: Record<TemperatureUnit, SimpleUnitConfig> = {\n  celsius: {\n    symbol: \"°C\",\n    singular: \"degree Celsius\",\n    plural: \"degrees Celsius\",\n    toBase: (c: number) => c,\n    fromBase: (c: number) => c,\n    noSpace: true, // 25°C não 25 °C\n  },\n  fahrenheit: {\n    symbol: \"°F\",\n    singular: \"degree Fahrenheit\",\n    plural: \"degrees Fahrenheit\",\n    toBase: (f: number) => (f - 32) * (5 / 9),\n    fromBase: (c: number) => c * (9 / 5) + 32,\n    noSpace: true, // 77°F não 77 °F\n  },\n  kelvin: {\n    symbol: \"K\",\n    singular: \"kelvin\",\n    plural: \"kelvins\",\n    toBase: (k: number) => k - 273.15,\n    fromBase: (c: number) => c + 273.15,\n    // Kelvin usa espaço: \"273 K\" (convenção SI)\n  },\n  rankine: {\n    symbol: \"°R\",\n    singular: \"degree Rankine\",\n    plural: \"degrees Rankine\",\n    toBase: (r: number) => (r - 491.67) * (5 / 9),\n    fromBase: (c: number) => (c + 273.15) * (9 / 5),\n    noSpace: true, // 500°R não 500 °R\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const TEMPERATURE_ALIASES: UnitAliases = {\n  // celsius\n  c: \"celsius\",\n  \"°c\": \"celsius\",\n  // fahrenheit\n  f: \"fahrenheit\",\n  \"°f\": \"fahrenheit\",\n  // kelvin\n  k: \"kelvin\",\n  // rankine\n  r: \"rankine\",\n  \"°r\": \"rankine\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const TEMPERATURE_UNIT_LIST = Object.keys(\n  TEMPERATURE_UNITS,\n) as TemperatureUnit[];\n\n/**\n * Constantes importantes\n */\nexport const TEMPERATURE_CONSTANTS = {\n  /** Zero absoluto em Celsius */\n  ABSOLUTE_ZERO_CELSIUS: -273.15,\n  /** Zero absoluto em Fahrenheit */\n  ABSOLUTE_ZERO_FAHRENHEIT: -459.67,\n  /** Offset Celsius → Kelvin */\n  CELSIUS_TO_KELVIN_OFFSET: 273.15,\n  /** Offset Fahrenheit → Rankine (são a mesma escala, só diferente offset) */\n  FAHRENHEIT_TO_RANKINE_OFFSET: 459.67,\n  /** Ponto de congelamento da água em Fahrenheit */\n  WATER_FREEZING_FAHRENHEIT: 32,\n  /** Ponto de ebulição da água em Fahrenheit */\n  WATER_BOILING_FAHRENHEIT: 212,\n} as const;\n","/**\n * Temperature Role - Format Pillar\n *\n * Formata valores de temperatura para apresentação.\n *\n * @example\n * import { formatTemperature } from '@attrx/role-morphic/temperature/format';\n *\n * formatTemperature('celsius', 37);                        // \"37°C\"\n * formatTemperature('fahrenheit', 98.6, { verbose: true }); // \"98.6 degrees Fahrenheit\"\n * formatTemperature('kelvin', 273.15);                     // \"273.15 K\"\n */\n\nimport { TEMPERATURE_UNITS, type TemperatureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TemperatureFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de temperatura para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatTemperature('celsius', 37);                          // \"37°C\"\n * formatTemperature('fahrenheit', 98.6);                     // \"98.6°F\"\n * formatTemperature('kelvin', 273.15);                       // \"273.15 K\"\n * formatTemperature('celsius', 37, { verbose: true });       // \"37 degrees Celsius\"\n * formatTemperature('celsius', 1000, { locale: 'pt-BR' });   // \"1.000°C\"\n */\nexport function formatTemperature(\n  variant: TemperatureUnit,\n  value: number,\n  options: TemperatureFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = TEMPERATURE_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown temperature variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  // Nota: °C, °F, °R não têm espaço (noSpace: true), mas K tem espaço\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getTemperatureSymbol('celsius');     // \"°C\"\n * getTemperatureSymbol('fahrenheit');  // \"°F\"\n * getTemperatureSymbol('kelvin');      // \"K\"\n */\nexport function getTemperatureSymbol(variant: TemperatureUnit): string {\n  const unit = TEMPERATURE_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown temperature variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getTemperatureName('celsius', 1);   // \"degree Celsius\"\n * getTemperatureName('celsius', 2);   // \"degrees Celsius\"\n * getTemperatureName('kelvin', 1);    // \"kelvin\"\n * getTemperatureName('kelvin', 2);    // \"kelvins\"\n */\nexport function getTemperatureName(variant: TemperatureUnit, count: number = 1): string {\n  const unit = TEMPERATURE_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown temperature variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Volume Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de volume.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - NIST Handbook 44 (2024)\n * - SI Brochure, 9th Edition (2019)\n *\n * Notas:\n * - Base: liter (L) - unidade aceita para uso com o SI\n * - 1 L = 1 dm³ = 0.001 m³\n * - Galão US vs UK: ~20% diferença (UK é maior)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type VolumeUnit =\n  // SI / Métrico\n  | \"cubic_meter\"\n  | \"cubic_decimeter\"\n  | \"cubic_centimeter\"\n  | \"cubic_millimeter\"\n  | \"hectoliter\"\n  | \"decaliter\"\n  | \"liter\"\n  | \"deciliter\"\n  | \"centiliter\"\n  | \"milliliter\"\n  | \"microliter\"\n  // US Customary\n  | \"gallon_us\"\n  | \"quart_us\"\n  | \"pint_us\"\n  | \"cup_us\"\n  | \"fluid_ounce_us\"\n  | \"tablespoon_us\"\n  | \"teaspoon_us\"\n  // Imperial (UK)\n  | \"gallon_uk\"\n  | \"quart_uk\"\n  | \"pint_uk\"\n  | \"fluid_ounce_uk\"\n  // Other\n  | \"barrel_oil\"\n  | \"cubic_inch\"\n  | \"cubic_foot\"\n  | \"cubic_yard\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de volume.\n *\n * Base: liter (L)\n *\n * Fatores exatos:\n * - SI: derivados de potências de 10\n * - US: baseados em 1 gallon US = 231 in³ (exato)\n * - UK: 1 gallon UK = 4.54609 L (exato, definição 1985)\n */\nexport const VOLUME_UNITS: Record<VolumeUnit, SimpleUnitConfig> = {\n  // SI / Métrico\n  cubic_meter: {\n    factor: 1000,\n    symbol: \"m³\",\n    singular: \"cubic meter\",\n    plural: \"cubic meters\",\n  },\n  cubic_decimeter: {\n    factor: 1,\n    symbol: \"dm³\",\n    singular: \"cubic decimeter\",\n    plural: \"cubic decimeters\",\n  },\n  cubic_centimeter: {\n    factor: 0.001,\n    symbol: \"cm³\",\n    singular: \"cubic centimeter\",\n    plural: \"cubic centimeters\",\n  },\n  cubic_millimeter: {\n    factor: 0.000001,\n    symbol: \"mm³\",\n    singular: \"cubic millimeter\",\n    plural: \"cubic millimeters\",\n  },\n  hectoliter: {\n    factor: 100,\n    symbol: \"hL\",\n    singular: \"hectoliter\",\n    plural: \"hectoliters\",\n  },\n  decaliter: {\n    factor: 10,\n    symbol: \"daL\",\n    singular: \"decaliter\",\n    plural: \"decaliters\",\n  },\n  liter: {\n    factor: 1,\n    symbol: \"L\",\n    singular: \"liter\",\n    plural: \"liters\",\n  },\n  deciliter: {\n    factor: 0.1,\n    symbol: \"dL\",\n    singular: \"deciliter\",\n    plural: \"deciliters\",\n  },\n  centiliter: {\n    factor: 0.01,\n    symbol: \"cL\",\n    singular: \"centiliter\",\n    plural: \"centiliters\",\n  },\n  milliliter: {\n    factor: 0.001,\n    symbol: \"mL\",\n    singular: \"milliliter\",\n    plural: \"milliliters\",\n  },\n  microliter: {\n    factor: 0.000001,\n    symbol: \"μL\",\n    singular: \"microliter\",\n    plural: \"microliters\",\n  },\n\n  // US Customary (baseado em 1 gallon = 231 in³ = 3.785411784 L)\n  gallon_us: {\n    factor: 3.785411784,\n    symbol: \"gal\",\n    singular: \"gallon\",\n    plural: \"gallons\",\n  },\n  quart_us: {\n    factor: 0.946352946, // gallon/4\n    symbol: \"qt\",\n    singular: \"quart\",\n    plural: \"quarts\",\n  },\n  pint_us: {\n    factor: 0.473176473, // gallon/8\n    symbol: \"pt\",\n    singular: \"pint\",\n    plural: \"pints\",\n  },\n  cup_us: {\n    factor: 0.2365882365, // gallon/16\n    symbol: \"cup\",\n    singular: \"cup\",\n    plural: \"cups\",\n  },\n  fluid_ounce_us: {\n    factor: 0.0295735295625, // gallon/128\n    symbol: \"fl oz\",\n    singular: \"fluid ounce\",\n    plural: \"fluid ounces\",\n  },\n  tablespoon_us: {\n    factor: 0.01478676478125, // fl oz/2\n    symbol: \"tbsp\",\n    singular: \"tablespoon\",\n    plural: \"tablespoons\",\n  },\n  teaspoon_us: {\n    factor: 0.00492892159375, // tbsp/3\n    symbol: \"tsp\",\n    singular: \"teaspoon\",\n    plural: \"teaspoons\",\n  },\n\n  // Imperial UK (1 gallon UK = 4.54609 L exato)\n  gallon_uk: {\n    factor: 4.54609,\n    symbol: \"gal (UK)\",\n    singular: \"gallon (UK)\",\n    plural: \"gallons (UK)\",\n  },\n  quart_uk: {\n    factor: 1.1365225, // gallon/4\n    symbol: \"qt (UK)\",\n    singular: \"quart (UK)\",\n    plural: \"quarts (UK)\",\n  },\n  pint_uk: {\n    factor: 0.56826125, // gallon/8\n    symbol: \"pt (UK)\",\n    singular: \"pint (UK)\",\n    plural: \"pints (UK)\",\n  },\n  fluid_ounce_uk: {\n    factor: 0.0284130625, // gallon/160\n    symbol: \"fl oz (UK)\",\n    singular: \"fluid ounce (UK)\",\n    plural: \"fluid ounces (UK)\",\n  },\n\n  // Other\n  barrel_oil: {\n    factor: 158.987294928, // 42 US gallons (petroleum)\n    symbol: \"bbl\",\n    singular: \"barrel\",\n    plural: \"barrels\",\n  },\n  cubic_inch: {\n    factor: 0.016387064, // (0.0254)³ × 1000\n    symbol: \"in³\",\n    singular: \"cubic inch\",\n    plural: \"cubic inches\",\n  },\n  cubic_foot: {\n    factor: 28.316846592, // (0.3048)³ × 1000\n    symbol: \"ft³\",\n    singular: \"cubic foot\",\n    plural: \"cubic feet\",\n  },\n  cubic_yard: {\n    factor: 764.554857984, // (0.9144)³ × 1000\n    symbol: \"yd³\",\n    singular: \"cubic yard\",\n    plural: \"cubic yards\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const VOLUME_ALIASES: UnitAliases = {\n  // cubic_meter\n  \"m³\": \"cubic_meter\",\n  m3: \"cubic_meter\",\n  // cubic_decimeter\n  \"dm³\": \"cubic_decimeter\",\n  dm3: \"cubic_decimeter\",\n  // cubic_centimeter\n  \"cm³\": \"cubic_centimeter\",\n  cm3: \"cubic_centimeter\",\n  cc: \"cubic_centimeter\",\n  // cubic_millimeter\n  \"mm³\": \"cubic_millimeter\",\n  mm3: \"cubic_millimeter\",\n  // hectoliter\n  hL: \"hectoliter\",\n  hl: \"hectoliter\",\n  // decaliter\n  daL: \"decaliter\",\n  dal: \"decaliter\",\n  // liter\n  L: \"liter\",\n  l: \"liter\",\n  // deciliter\n  dL: \"deciliter\",\n  dl: \"deciliter\",\n  // centiliter\n  cL: \"centiliter\",\n  cl: \"centiliter\",\n  // milliliter\n  mL: \"milliliter\",\n  ml: \"milliliter\",\n  // microliter\n  \"μL\": \"microliter\",\n  uL: \"microliter\",\n  ul: \"microliter\",\n  // gallon_us\n  gal: \"gallon_us\",\n  // quart_us\n  qt: \"quart_us\",\n  // pint_us\n  pt: \"pint_us\",\n  // cup_us\n  cup: \"cup_us\",\n  // fluid_ounce_us\n  \"fl oz\": \"fluid_ounce_us\",\n  floz: \"fluid_ounce_us\",\n  // tablespoon_us\n  tbsp: \"tablespoon_us\",\n  // teaspoon_us\n  tsp: \"teaspoon_us\",\n  // gallon_uk\n  \"gal uk\": \"gallon_uk\",\n  // quart_uk\n  \"qt uk\": \"quart_uk\",\n  // pint_uk\n  \"pt uk\": \"pint_uk\",\n  // fluid_ounce_uk\n  \"fl oz uk\": \"fluid_ounce_uk\",\n  // barrel_oil\n  bbl: \"barrel_oil\",\n  // cubic_inch\n  \"in³\": \"cubic_inch\",\n  in3: \"cubic_inch\",\n  // cubic_foot\n  \"ft³\": \"cubic_foot\",\n  ft3: \"cubic_foot\",\n  // cubic_yard\n  \"yd³\": \"cubic_yard\",\n  yd3: \"cubic_yard\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const VOLUME_UNIT_LIST = Object.keys(VOLUME_UNITS) as VolumeUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const VOLUME_FACTORS: Record<VolumeUnit, number> = Object.fromEntries(\n  Object.entries(VOLUME_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<VolumeUnit, number>;\n","/**\n * Volume Role - Format Pillar\n *\n * Formata valores de volume para apresentação.\n *\n * @example\n * import { formatVolume } from '@attrx/role-morphic/volume/format';\n *\n * formatVolume('liter', 2.5);                      // \"2.5 L\"\n * formatVolume('liter', 2.5, { verbose: true });   // \"2.5 liters\"\n * formatVolume('milliliter', 1000, { locale: 'pt-BR' }); // \"1.000 mL\"\n */\n\nimport { VOLUME_UNITS, type VolumeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface VolumeFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de volume para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatVolume('liter', 2.5);                        // \"2.5 L\"\n * formatVolume('liter', 2.5, { verbose: true });     // \"2.5 liters\"\n * formatVolume('liter', 1, { verbose: true });       // \"1 liter\"\n * formatVolume('milliliter', 1000, { locale: 'pt-BR' }); // \"1.000 mL\"\n * formatVolume('gallon_us', 5, { decimals: 0 });     // \"5 gal\"\n */\nexport function formatVolume(\n  variant: VolumeUnit,\n  value: number,\n  options: VolumeFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = VOLUME_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown volume variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getVolumeSymbol('liter');       // \"L\"\n * getVolumeSymbol('gallon_us');   // \"gal\"\n * getVolumeSymbol('milliliter');  // \"mL\"\n */\nexport function getVolumeSymbol(variant: VolumeUnit): string {\n  const unit = VOLUME_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown volume variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getVolumeName('liter', 1);       // \"liter\"\n * getVolumeName('liter', 2);       // \"liters\"\n * getVolumeName('gallon_us', 1);   // \"gallon\"\n */\nexport function getVolumeName(variant: VolumeUnit, count: number = 1): string {\n  const unit = VOLUME_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown volume variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Speed Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de velocidade.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n * - International Yard and Pound Agreement (1959)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type SpeedUnit =\n  // SI\n  | \"meter_per_second\"\n  | \"kilometer_per_hour\"\n  // Imperial/US\n  | \"mile_per_hour\"\n  | \"foot_per_second\"\n  // Nautical\n  | \"knot\"\n  // Scientific\n  | \"mach\"\n  | \"speed_of_light\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de velocidade.\n *\n * Fatores exatos:\n * - km/h = 1000/3600 m/s = 0.277777... m/s\n * - mph = 1609.344/3600 m/s = 0.44704 m/s (exato, derivado de mile)\n * - ft/s = 0.3048 m/s (exato, derivado de foot)\n * - knot = 1852/3600 m/s = 0.514444... m/s (exato, derivado de nautical mile)\n *\n * Fatores aproximados:\n * - Mach: varia com temperatura/altitude, usando 340.29 m/s (nível do mar, 15°C)\n * - Velocidade da luz: exato por definição SI (299792458 m/s)\n */\nexport const SPEED_UNITS: Record<SpeedUnit, SimpleUnitConfig> = {\n  // SI Units\n  meter_per_second: {\n    factor: 1,\n    symbol: \"m/s\",\n    singular: \"meter per second\",\n    plural: \"meters per second\",\n  },\n  kilometer_per_hour: {\n    factor: 1000 / 3600, // 0.277777...\n    symbol: \"km/h\",\n    singular: \"kilometer per hour\",\n    plural: \"kilometers per hour\",\n  },\n\n  // Imperial/US (exatos desde 1959)\n  mile_per_hour: {\n    factor: 0.44704, // 1609.344 / 3600 (exato)\n    symbol: \"mph\",\n    singular: \"mile per hour\",\n    plural: \"miles per hour\",\n  },\n  foot_per_second: {\n    factor: 0.3048, // exato\n    symbol: \"ft/s\",\n    singular: \"foot per second\",\n    plural: \"feet per second\",\n  },\n\n  // Nautical (exato)\n  knot: {\n    factor: 1852 / 3600, // 0.514444...\n    symbol: \"kn\",\n    singular: \"knot\",\n    plural: \"knots\",\n  },\n\n  // Scientific\n  mach: {\n    factor: 340.29, // velocidade do som ao nível do mar, 15°C (aproximado)\n    symbol: \"Ma\",\n    singular: \"mach\",\n    plural: \"mach\",\n  },\n  speed_of_light: {\n    factor: 299792458, // exato por definição SI\n    symbol: \"c\",\n    singular: \"speed of light\",\n    plural: \"speed of light\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const SPEED_ALIASES: UnitAliases = {\n  // meter_per_second\n  \"m/s\": \"meter_per_second\",\n  mps: \"meter_per_second\",\n  // kilometer_per_hour\n  \"km/h\": \"kilometer_per_hour\",\n  kmh: \"kilometer_per_hour\",\n  kph: \"kilometer_per_hour\",\n  // mile_per_hour\n  mph: \"mile_per_hour\",\n  \"mi/h\": \"mile_per_hour\",\n  // foot_per_second\n  \"ft/s\": \"foot_per_second\",\n  fps: \"foot_per_second\",\n  // knot\n  kn: \"knot\",\n  kt: \"knot\",\n  kts: \"knot\",\n  // mach\n  ma: \"mach\",\n  // speed_of_light\n  c: \"speed_of_light\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const SPEED_UNIT_LIST = Object.keys(SPEED_UNITS) as SpeedUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const SPEED_FACTORS: Record<SpeedUnit, number> = Object.fromEntries(\n  Object.entries(SPEED_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<SpeedUnit, number>;\n","/**\n * Speed Role - Format Pillar\n *\n * Formata valores de velocidade para apresentação.\n *\n * @example\n * import { formatSpeed } from '@attrx/role-morphic/speed/format';\n *\n * formatSpeed('kilometer_per_hour', 120);                        // \"120 km/h\"\n * formatSpeed('kilometer_per_hour', 120, { verbose: true });     // \"120 kilometers per hour\"\n * formatSpeed('mile_per_hour', 60);                              // \"60 mph\"\n */\n\nimport { SPEED_UNITS, type SpeedUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SpeedFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de velocidade para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatSpeed('kilometer_per_hour', 120);                        // \"120 km/h\"\n * formatSpeed('kilometer_per_hour', 120, { verbose: true });     // \"120 kilometers per hour\"\n * formatSpeed('kilometer_per_hour', 1, { verbose: true });       // \"1 kilometer per hour\"\n * formatSpeed('mile_per_hour', 1000, { locale: 'en-US' });       // \"1,000 mph\"\n */\nexport function formatSpeed(\n  variant: SpeedUnit,\n  value: number,\n  options: SpeedFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = SPEED_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown speed variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getSpeedSymbol('kilometer_per_hour');  // \"km/h\"\n * getSpeedSymbol('mile_per_hour');       // \"mph\"\n * getSpeedSymbol('knot');                // \"kn\"\n */\nexport function getSpeedSymbol(variant: SpeedUnit): string {\n  const unit = SPEED_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown speed variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getSpeedName('kilometer_per_hour', 1);   // \"kilometer per hour\"\n * getSpeedName('kilometer_per_hour', 2);   // \"kilometers per hour\"\n * getSpeedName('knot', 1);                 // \"knot\"\n */\nexport function getSpeedName(variant: SpeedUnit, count: number = 1): string {\n  const unit = SPEED_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown speed variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Energy Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de energia.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n * - CODATA 2018 (electronvolt)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EnergyUnit =\n  // SI\n  | \"gigajoule\"\n  | \"megajoule\"\n  | \"kilojoule\"\n  | \"joule\"\n  | \"millijoule\"\n  // Calories\n  | \"calorie\"\n  | \"kilocalorie\"\n  // Watt-hour\n  | \"watt_hour\"\n  | \"kilowatt_hour\"\n  | \"megawatt_hour\"\n  | \"gigawatt_hour\"\n  // BTU\n  | \"btu\"\n  | \"therm\"\n  // Scientific\n  | \"electronvolt\"\n  | \"kiloelectronvolt\"\n  | \"megaelectronvolt\"\n  | \"erg\"\n  // Mechanical\n  | \"foot_pound\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de energia.\n *\n * Base: joule (J) - unidade SI de energia\n * 1 joule = 1 newton × 1 metro = 1 kg⋅m²/s²\n *\n * Fatores exatos:\n * - SI: prefixos são potências de 10\n * - Calorie (IT): 4.1868 J (International Table, recomendado)\n * - Watt-hour: 3600 J (1 W × 1 h)\n * - BTU (IT): 1055.05585262 J (International Table)\n * - Electronvolt: 1.602176634e-19 J (SI 2019, exato)\n * - Erg: 1e-7 J (CGS)\n */\nexport const ENERGY_UNITS: Record<EnergyUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  gigajoule: {\n    factor: 1_000_000_000,\n    symbol: \"GJ\",\n    singular: \"gigajoule\",\n    plural: \"gigajoules\",\n  },\n  megajoule: {\n    factor: 1_000_000,\n    symbol: \"MJ\",\n    singular: \"megajoule\",\n    plural: \"megajoules\",\n  },\n  kilojoule: {\n    factor: 1_000,\n    symbol: \"kJ\",\n    singular: \"kilojoule\",\n    plural: \"kilojoules\",\n  },\n  joule: {\n    factor: 1,\n    symbol: \"J\",\n    singular: \"joule\",\n    plural: \"joules\",\n  },\n  millijoule: {\n    factor: 0.001,\n    symbol: \"mJ\",\n    singular: \"millijoule\",\n    plural: \"millijoules\",\n  },\n\n  // Calories (International Table - IT)\n  // 1 cal (IT) = 4.1868 J (exato por definição)\n  calorie: {\n    factor: 4.1868,\n    symbol: \"cal\",\n    singular: \"calorie\",\n    plural: \"calories\",\n  },\n  // 1 kcal = 1000 cal = 4186.8 J (= 1 \"food Calorie\")\n  kilocalorie: {\n    factor: 4186.8,\n    symbol: \"kcal\",\n    singular: \"kilocalorie\",\n    plural: \"kilocalories\",\n  },\n\n  // Watt-hour (exatos)\n  // 1 Wh = 1 W × 3600 s = 3600 J\n  watt_hour: {\n    factor: 3600,\n    symbol: \"Wh\",\n    singular: \"watt-hour\",\n    plural: \"watt-hours\",\n  },\n  kilowatt_hour: {\n    factor: 3_600_000,\n    symbol: \"kWh\",\n    singular: \"kilowatt-hour\",\n    plural: \"kilowatt-hours\",\n  },\n  megawatt_hour: {\n    factor: 3_600_000_000,\n    symbol: \"MWh\",\n    singular: \"megawatt-hour\",\n    plural: \"megawatt-hours\",\n  },\n  gigawatt_hour: {\n    factor: 3_600_000_000_000,\n    symbol: \"GWh\",\n    singular: \"gigawatt-hour\",\n    plural: \"gigawatt-hours\",\n  },\n\n  // BTU (International Table)\n  // 1 BTU (IT) = 1055.05585262 J (definição)\n  btu: {\n    factor: 1055.05585262,\n    symbol: \"BTU\",\n    singular: \"BTU\",\n    plural: \"BTUs\",\n  },\n  // 1 therm = 100,000 BTU (IT)\n  therm: {\n    factor: 105505585.262,\n    symbol: \"thm\",\n    singular: \"therm\",\n    plural: \"therms\",\n  },\n\n  // Scientific\n  // 1 eV = 1.602176634e-19 J (SI 2019, exato por definição)\n  electronvolt: {\n    factor: 1.602176634e-19,\n    symbol: \"eV\",\n    singular: \"electronvolt\",\n    plural: \"electronvolts\",\n  },\n  kiloelectronvolt: {\n    factor: 1.602176634e-16,\n    symbol: \"keV\",\n    singular: \"kiloelectronvolt\",\n    plural: \"kiloelectronvolts\",\n  },\n  megaelectronvolt: {\n    factor: 1.602176634e-13,\n    symbol: \"MeV\",\n    singular: \"megaelectronvolt\",\n    plural: \"megaelectronvolts\",\n  },\n  // 1 erg = 1e-7 J (CGS, exato)\n  erg: {\n    factor: 1e-7,\n    symbol: \"erg\",\n    singular: \"erg\",\n    plural: \"ergs\",\n  },\n\n  // Mechanical\n  // 1 ft⋅lbf = 1.3558179483314004 J (derivado de foot e pound-force)\n  foot_pound: {\n    factor: 1.3558179483314004,\n    symbol: \"ft⋅lbf\",\n    singular: \"foot-pound\",\n    plural: \"foot-pounds\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const ENERGY_ALIASES: UnitAliases = {\n  // gigajoule\n  gj: \"gigajoule\",\n  // megajoule\n  mj: \"megajoule\",\n  // kilojoule\n  kj: \"kilojoule\",\n  // joule\n  j: \"joule\",\n  // calorie\n  cal: \"calorie\",\n  // kilocalorie\n  kcal: \"kilocalorie\",\n  Cal: \"kilocalorie\",\n  // watt_hour\n  wh: \"watt_hour\",\n  // kilowatt_hour\n  kwh: \"kilowatt_hour\",\n  // megawatt_hour\n  mwh: \"megawatt_hour\",\n  // gigawatt_hour\n  gwh: \"gigawatt_hour\",\n  // btu\n  btu: \"btu\",\n  // therm\n  thm: \"therm\",\n  // electronvolt\n  ev: \"electronvolt\",\n  // kiloelectronvolt\n  kev: \"kiloelectronvolt\",\n  // megaelectronvolt\n  mev: \"megaelectronvolt\",\n  // erg\n  erg: \"erg\",\n  // foot_pound\n  \"ft-lb\": \"foot_pound\",\n  \"ft-lbf\": \"foot_pound\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const ENERGY_UNIT_LIST = Object.keys(ENERGY_UNITS) as EnergyUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const ENERGY_FACTORS: Record<EnergyUnit, number> = Object.fromEntries(\n  Object.entries(ENERGY_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<EnergyUnit, number>;\n","/**\n * Energy Role - Format Pillar\n *\n * Formata valores de energia para apresentação.\n *\n * @example\n * import { formatEnergy } from '@attrx/role-morphic/energy/format';\n *\n * formatEnergy('kilowatt_hour', 2.5);                      // \"2.5 kWh\"\n * formatEnergy('kilowatt_hour', 2.5, { verbose: true });   // \"2.5 kilowatt-hours\"\n * formatEnergy('joule', 1000, { locale: 'pt-BR' });        // \"1.000 J\"\n */\n\nimport { ENERGY_UNITS, type EnergyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface EnergyFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de energia para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatEnergy('kilowatt_hour', 2.5);                        // \"2.5 kWh\"\n * formatEnergy('kilowatt_hour', 2.5, { verbose: true });     // \"2.5 kilowatt-hours\"\n * formatEnergy('kilowatt_hour', 1, { verbose: true });       // \"1 kilowatt-hour\"\n * formatEnergy('joule', 1000, { locale: 'pt-BR' });          // \"1.000 J\"\n * formatEnergy('kilocalorie', 1500, { decimals: 0 });        // \"1500 kcal\"\n */\nexport function formatEnergy(\n  variant: EnergyUnit,\n  value: number,\n  options: EnergyFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = ENERGY_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown energy variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getEnergySymbol('kilowatt_hour');  // \"kWh\"\n * getEnergySymbol('kilocalorie');    // \"kcal\"\n */\nexport function getEnergySymbol(variant: EnergyUnit): string {\n  const unit = ENERGY_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown energy variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getEnergyName('kilowatt_hour', 1);   // \"kilowatt-hour\"\n * getEnergyName('kilowatt_hour', 2);   // \"kilowatt-hours\"\n */\nexport function getEnergyName(variant: EnergyUnit, count: number = 1): string {\n  const unit = ENERGY_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown energy variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Power Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de potência.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type PowerUnit =\n  // SI\n  | \"gigawatt\"\n  | \"megawatt\"\n  | \"kilowatt\"\n  | \"watt\"\n  | \"milliwatt\"\n  | \"microwatt\"\n  // Horsepower\n  | \"horsepower_mechanical\"\n  | \"horsepower_metric\"\n  | \"horsepower_electric\"\n  | \"horsepower_boiler\"\n  // BTU-based\n  | \"btu_per_hour\"\n  | \"btu_per_second\"\n  // Other\n  | \"ton_of_refrigeration\"\n  | \"foot_pound_per_second\"\n  | \"calorie_per_second\"\n  | \"kilocalorie_per_hour\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de potência.\n *\n * Base: watt (W) - unidade SI de potência\n * 1 watt = 1 joule por segundo = 1 kg⋅m²/s³\n *\n * Cavalos-vapor (existem várias definições):\n * - Mechanical (imperial): 550 ft⋅lbf/s = 745.69987158227 W\n * - Metric (PS, CV, pk): 75 kgf⋅m/s = 735.49875 W (exato)\n * - Electrical: 746 W (exato por definição)\n * - Boiler: 9809.5 W (33,475 BTU/h)\n */\nexport const POWER_UNITS: Record<PowerUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  gigawatt: {\n    factor: 1_000_000_000,\n    symbol: \"GW\",\n    singular: \"gigawatt\",\n    plural: \"gigawatts\",\n  },\n  megawatt: {\n    factor: 1_000_000,\n    symbol: \"MW\",\n    singular: \"megawatt\",\n    plural: \"megawatts\",\n  },\n  kilowatt: {\n    factor: 1_000,\n    symbol: \"kW\",\n    singular: \"kilowatt\",\n    plural: \"kilowatts\",\n  },\n  watt: {\n    factor: 1,\n    symbol: \"W\",\n    singular: \"watt\",\n    plural: \"watts\",\n  },\n  milliwatt: {\n    factor: 0.001,\n    symbol: \"mW\",\n    singular: \"milliwatt\",\n    plural: \"milliwatts\",\n  },\n  microwatt: {\n    factor: 0.000001,\n    symbol: \"μW\",\n    singular: \"microwatt\",\n    plural: \"microwatts\",\n  },\n\n  // Horsepower variants\n  // Mechanical (imperial): 550 ft⋅lbf/s\n  // = 550 × 0.3048 m × 4.4482216152605 N / s = 745.69987158227 W\n  horsepower_mechanical: {\n    factor: 745.69987158227,\n    symbol: \"hp\",\n    singular: \"horsepower\",\n    plural: \"horsepower\",\n  },\n  // Metric (PS, CV, pk): 75 kgf⋅m/s = 75 × 9.80665 W = 735.49875 W (exato)\n  horsepower_metric: {\n    factor: 735.49875,\n    symbol: \"PS\",\n    singular: \"metric horsepower\",\n    plural: \"metric horsepower\",\n  },\n  // Electrical: 746 W (exato por definição)\n  horsepower_electric: {\n    factor: 746,\n    symbol: \"hp(E)\",\n    singular: \"electric horsepower\",\n    plural: \"electric horsepower\",\n  },\n  // Boiler: 33,475 BTU/h = 9809.5 W\n  horsepower_boiler: {\n    factor: 9809.5,\n    symbol: \"hp(S)\",\n    singular: \"boiler horsepower\",\n    plural: \"boiler horsepower\",\n  },\n\n  // BTU-based\n  // 1 BTU/h = 1055.05585262 J / 3600 s = 0.29307107017222 W\n  btu_per_hour: {\n    factor: 0.29307107017222,\n    symbol: \"BTU/h\",\n    singular: \"BTU per hour\",\n    plural: \"BTUs per hour\",\n  },\n  // 1 BTU/s = 1055.05585262 W\n  btu_per_second: {\n    factor: 1055.05585262,\n    symbol: \"BTU/s\",\n    singular: \"BTU per second\",\n    plural: \"BTUs per second\",\n  },\n\n  // Other\n  // 1 ton of refrigeration = 12000 BTU/h = 3516.8528420667 W\n  ton_of_refrigeration: {\n    factor: 3516.8528420667,\n    symbol: \"TR\",\n    singular: \"ton of refrigeration\",\n    plural: \"tons of refrigeration\",\n  },\n  // 1 ft⋅lbf/s = 1.3558179483314004 W\n  foot_pound_per_second: {\n    factor: 1.3558179483314004,\n    symbol: \"ft⋅lbf/s\",\n    singular: \"foot-pound per second\",\n    plural: \"foot-pounds per second\",\n  },\n  // 1 cal/s = 4.1868 W\n  calorie_per_second: {\n    factor: 4.1868,\n    symbol: \"cal/s\",\n    singular: \"calorie per second\",\n    plural: \"calories per second\",\n  },\n  // 1 kcal/h = 4186.8 / 3600 = 1.163 W\n  kilocalorie_per_hour: {\n    factor: 1.163,\n    symbol: \"kcal/h\",\n    singular: \"kilocalorie per hour\",\n    plural: \"kilocalories per hour\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const POWER_ALIASES: UnitAliases = {\n  // gigawatt\n  gw: \"gigawatt\",\n  // megawatt\n  mw: \"megawatt\",\n  // kilowatt\n  kw: \"kilowatt\",\n  // watt\n  w: \"watt\",\n  // microwatt\n  \"μw\": \"microwatt\",\n  uw: \"microwatt\",\n  // horsepower_mechanical\n  hp: \"horsepower_mechanical\",\n  // horsepower_metric\n  ps: \"horsepower_metric\",\n  cv: \"horsepower_metric\",\n  // horsepower_electric\n  \"hp(e)\": \"horsepower_electric\",\n  // horsepower_boiler\n  \"hp(s)\": \"horsepower_boiler\",\n  bhp: \"horsepower_boiler\",\n  // btu_per_hour\n  \"btu/h\": \"btu_per_hour\",\n  \"btu/hr\": \"btu_per_hour\",\n  // btu_per_second\n  \"btu/s\": \"btu_per_second\",\n  // ton_of_refrigeration\n  tr: \"ton_of_refrigeration\",\n  rt: \"ton_of_refrigeration\",\n  // foot_pound_per_second\n  \"ft-lb/s\": \"foot_pound_per_second\",\n  \"ft-lbf/s\": \"foot_pound_per_second\",\n  // calorie_per_second\n  \"cal/s\": \"calorie_per_second\",\n  // kilocalorie_per_hour\n  \"kcal/h\": \"kilocalorie_per_hour\",\n  \"kcal/hr\": \"kilocalorie_per_hour\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const POWER_UNIT_LIST = Object.keys(POWER_UNITS) as PowerUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const POWER_FACTORS: Record<PowerUnit, number> = Object.fromEntries(\n  Object.entries(POWER_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<PowerUnit, number>;\n","/**\n * Power Role - Format Pillar\n *\n * Formatação de valores de potência para exibição.\n *\n * @example\n * import { formatPower, getPowerSymbol, getPowerName } from '@attrx/role-morphic/power/format';\n *\n * formatPower('kilowatt', 2.5);                     // \"2.5 kW\"\n * formatPower('kilowatt', 2.5, { verbose: true });  // \"2.5 kilowatts\"\n * getPowerSymbol('kilowatt');                       // \"kW\"\n * getPowerName('kilowatt', 2);                      // \"kilowatts\"\n */\n\nimport { POWER_UNITS, type PowerUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PowerFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de potência para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatPower('kilowatt', 2.5);                     // \"2.5 kW\"\n * formatPower('kilowatt', 2.5, { verbose: true });  // \"2.5 kilowatts\"\n * formatPower('kilowatt', 1, { verbose: true });    // \"1 kilowatt\"\n * formatPower('watt', 1000, { decimals: 0 });       // \"1000 W\"\n */\nexport function formatPower(\n  variant: PowerUnit,\n  value: number,\n  options: PowerFormatOptions = {},\n): string {\n  const config = POWER_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown power unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getPowerSymbol('kilowatt');              // \"kW\"\n * getPowerSymbol('horsepower_mechanical'); // \"hp\"\n */\nexport function getPowerSymbol(variant: PowerUnit): string {\n  const config = POWER_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown power unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getPowerName('kilowatt', 1);  // \"kilowatt\"\n * getPowerName('kilowatt', 2);  // \"kilowatts\"\n */\nexport function getPowerName(variant: PowerUnit, count: number = 1): string {\n  const config = POWER_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown power unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Pressure Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de pressão.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811\n * - 10th CGPM (1954) - definição da atmosfera padrão\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type PressureUnit =\n  // SI\n  | \"megapascal\"\n  | \"kilopascal\"\n  | \"hectopascal\"\n  | \"pascal\"\n  // Bar\n  | \"bar\"\n  | \"millibar\"\n  // Atmosphere\n  | \"atmosphere\"\n  // Mercury\n  | \"torr\"\n  | \"mmhg\"\n  | \"inhg\"\n  // Imperial\n  | \"psi\"\n  | \"ksi\"\n  // Water column\n  | \"cmh2o\"\n  | \"inh2o\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de pressão.\n *\n * Base: pascal (Pa) = 1 N/m² = 1 kg/(m·s²)\n *\n * Relações importantes:\n * - 1 atm = 101325 Pa (exato, CGPM 1954)\n * - 1 bar = 100000 Pa (exato por definição)\n * - 1 Torr = 101325/760 Pa (exato)\n * - 1 psi = 6894.757293168 Pa (derivado de lb/in²)\n */\nexport const PRESSURE_UNITS: Record<PressureUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  megapascal: {\n    factor: 1e6,\n    symbol: \"MPa\",\n    singular: \"megapascal\",\n    plural: \"megapascals\",\n  },\n  kilopascal: {\n    factor: 1000,\n    symbol: \"kPa\",\n    singular: \"kilopascal\",\n    plural: \"kilopascals\",\n  },\n  hectopascal: {\n    factor: 100,\n    symbol: \"hPa\",\n    singular: \"hectopascal\",\n    plural: \"hectopascals\",\n  },\n  pascal: {\n    factor: 1,\n    symbol: \"Pa\",\n    singular: \"pascal\",\n    plural: \"pascals\",\n  },\n\n  // Bar (exatos por definição)\n  bar: {\n    factor: 100000,\n    symbol: \"bar\",\n    singular: \"bar\",\n    plural: \"bar\",\n  },\n  millibar: {\n    factor: 100, // = 1 hPa\n    symbol: \"mbar\",\n    singular: \"millibar\",\n    plural: \"millibar\",\n  },\n\n  // Atmosphere (exato, CGPM 1954)\n  atmosphere: {\n    factor: 101325,\n    symbol: \"atm\",\n    singular: \"atmosphere\",\n    plural: \"atmospheres\",\n  },\n\n  // Mercury column\n  torr: {\n    factor: 101325 / 760, // ≈ 133.322368421\n    symbol: \"Torr\",\n    singular: \"torr\",\n    plural: \"torr\",\n  },\n  mmhg: {\n    factor: 133.322387415, // Convenção NIST\n    symbol: \"mmHg\",\n    singular: \"millimeter of mercury\",\n    plural: \"millimeters of mercury\",\n  },\n  inhg: {\n    factor: 3386.389, // Polegadas de mercúrio\n    symbol: \"inHg\",\n    singular: \"inch of mercury\",\n    plural: \"inches of mercury\",\n  },\n\n  // Imperial (derivados de lb/in²)\n  psi: {\n    factor: 6894.757293168, // 1 lbf/in²\n    symbol: \"psi\",\n    singular: \"pound per square inch\",\n    plural: \"pounds per square inch\",\n  },\n  ksi: {\n    factor: 6894757.293168, // 1000 psi\n    symbol: \"ksi\",\n    singular: \"kilopound per square inch\",\n    plural: \"kilopounds per square inch\",\n  },\n\n  // Water column\n  cmh2o: {\n    factor: 98.0665, // cm de água a 4°C\n    symbol: \"cmH₂O\",\n    singular: \"centimeter of water\",\n    plural: \"centimeters of water\",\n  },\n  inh2o: {\n    factor: 249.08891, // polegadas de água\n    symbol: \"inH₂O\",\n    singular: \"inch of water\",\n    plural: \"inches of water\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const PRESSURE_ALIASES: UnitAliases = {\n  // megapascal\n  mpa: \"megapascal\",\n  // kilopascal\n  kpa: \"kilopascal\",\n  // hectopascal\n  hpa: \"hectopascal\",\n  // pascal\n  pa: \"pascal\",\n  // bar\n  bar: \"bar\",\n  // millibar\n  mbar: \"millibar\",\n  mb: \"millibar\",\n  // atmosphere\n  atm: \"atmosphere\",\n  // torr\n  torr: \"torr\",\n  // mmhg\n  mmhg: \"mmhg\",\n  // inhg\n  inhg: \"inhg\",\n  // psi\n  psi: \"psi\",\n  // ksi\n  ksi: \"ksi\",\n  // cmh2o\n  cmh2o: \"cmh2o\",\n  // inh2o\n  inh2o: \"inh2o\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const PRESSURE_UNIT_LIST = Object.keys(PRESSURE_UNITS) as PressureUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const PRESSURE_FACTORS: Record<PressureUnit, number> =\n  Object.fromEntries(\n    Object.entries(PRESSURE_UNITS).map(([unit, config]) => [\n      unit,\n      config.factor ?? 1,\n    ]),\n  ) as Record<PressureUnit, number>;\n","/**\n * Pressure Role - Format Pillar\n *\n * Formatação de valores de pressão para exibição.\n *\n * @example\n * import { formatPressure, getPressureSymbol, getPressureName } from '@attrx/role-morphic/pressure/format';\n *\n * formatPressure('bar', 2.5);                     // \"2.5 bar\"\n * formatPressure('bar', 2.5, { verbose: true });  // \"2.5 bar\"\n * getPressureSymbol('pascal');                    // \"Pa\"\n * getPressureName('atmosphere', 2);               // \"atmospheres\"\n */\n\nimport { PRESSURE_UNITS, type PressureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PressureFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de pressão para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatPressure('bar', 2.5);                     // \"2.5 bar\"\n * formatPressure('bar', 2.5, { verbose: true });  // \"2.5 bar\"\n * formatPressure('atmosphere', 1, { verbose: true }); // \"1 atmosphere\"\n * formatPressure('pascal', 1000, { decimals: 0 }); // \"1000 Pa\"\n */\nexport function formatPressure(\n  variant: PressureUnit,\n  value: number,\n  options: PressureFormatOptions = {},\n): string {\n  const config = PRESSURE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown pressure unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getPressureSymbol('bar');        // \"bar\"\n * getPressureSymbol('atmosphere'); // \"atm\"\n */\nexport function getPressureSymbol(variant: PressureUnit): string {\n  const config = PRESSURE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown pressure unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getPressureName('atmosphere', 1);  // \"atmosphere\"\n * getPressureName('atmosphere', 2);  // \"atmospheres\"\n */\nexport function getPressureName(variant: PressureUnit, count: number = 1): string {\n  const config = PRESSURE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown pressure unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Frequency Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de frequência.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type FrequencyUnit =\n  // SI\n  | \"terahertz\"\n  | \"gigahertz\"\n  | \"megahertz\"\n  | \"kilohertz\"\n  | \"hertz\"\n  | \"millihertz\"\n  | \"microhertz\"\n  // Other\n  | \"rpm\"\n  | \"bpm\"\n  | \"radians_per_second\"\n  | \"cycles_per_minute\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de frequência.\n *\n * Base: hertz (Hz) = 1 ciclo por segundo\n *\n * Relações:\n * - 1 RPM = 1/60 Hz (rotações por minuto)\n * - 1 rad/s = 1/(2π) Hz\n */\nexport const FREQUENCY_UNITS: Record<FrequencyUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  terahertz: {\n    factor: 1e12,\n    symbol: \"THz\",\n    singular: \"terahertz\",\n    plural: \"terahertz\",\n  },\n  gigahertz: {\n    factor: 1e9,\n    symbol: \"GHz\",\n    singular: \"gigahertz\",\n    plural: \"gigahertz\",\n  },\n  megahertz: {\n    factor: 1e6,\n    symbol: \"MHz\",\n    singular: \"megahertz\",\n    plural: \"megahertz\",\n  },\n  kilohertz: {\n    factor: 1000,\n    symbol: \"kHz\",\n    singular: \"kilohertz\",\n    plural: \"kilohertz\",\n  },\n  hertz: {\n    factor: 1,\n    symbol: \"Hz\",\n    singular: \"hertz\",\n    plural: \"hertz\",\n  },\n  millihertz: {\n    factor: 0.001,\n    symbol: \"mHz\",\n    singular: \"millihertz\",\n    plural: \"millihertz\",\n  },\n  microhertz: {\n    factor: 0.000001,\n    symbol: \"μHz\",\n    singular: \"microhertz\",\n    plural: \"microhertz\",\n  },\n\n  // Other units\n  rpm: {\n    factor: 1 / 60, // 1 RPM = 1/60 Hz\n    symbol: \"rpm\",\n    singular: \"revolution per minute\",\n    plural: \"revolutions per minute\",\n  },\n  bpm: {\n    factor: 1 / 60, // 1 BPM = 1/60 Hz\n    symbol: \"bpm\",\n    singular: \"beat per minute\",\n    plural: \"beats per minute\",\n  },\n  radians_per_second: {\n    factor: 1 / (2 * Math.PI), // 1 rad/s = 1/(2π) Hz ≈ 0.159154943\n    symbol: \"rad/s\",\n    singular: \"radian per second\",\n    plural: \"radians per second\",\n  },\n  cycles_per_minute: {\n    factor: 1 / 60, // same as RPM\n    symbol: \"cpm\",\n    singular: \"cycle per minute\",\n    plural: \"cycles per minute\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const FREQUENCY_ALIASES: UnitAliases = {\n  // terahertz\n  thz: \"terahertz\",\n  // gigahertz\n  ghz: \"gigahertz\",\n  // megahertz\n  mhz: \"megahertz\",\n  // kilohertz\n  khz: \"kilohertz\",\n  // hertz\n  hz: \"hertz\",\n  cps: \"hertz\",\n  // microhertz\n  \"μhz\": \"microhertz\",\n  uhz: \"microhertz\",\n  // rpm\n  rpm: \"rpm\",\n  // bpm\n  bpm: \"bpm\",\n  // radians_per_second\n  \"rad/s\": \"radians_per_second\",\n  // cycles_per_minute\n  cpm: \"cycles_per_minute\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const FREQUENCY_UNIT_LIST = Object.keys(\n  FREQUENCY_UNITS,\n) as FrequencyUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const FREQUENCY_FACTORS: Record<FrequencyUnit, number> =\n  Object.fromEntries(\n    Object.entries(FREQUENCY_UNITS).map(([unit, config]) => [\n      unit,\n      config.factor ?? 1,\n    ]),\n  ) as Record<FrequencyUnit, number>;\n","/**\n * Frequency Role - Format Pillar\n *\n * Formatação de valores de frequência para exibição.\n *\n * @example\n * import { formatFrequency, getFrequencySymbol, getFrequencyName } from '@attrx/role-morphic/frequency/format';\n *\n * formatFrequency('gigahertz', 2.4);                     // \"2.4 GHz\"\n * formatFrequency('gigahertz', 2.4, { verbose: true });  // \"2.4 gigahertz\"\n * getFrequencySymbol('megahertz');                       // \"MHz\"\n * getFrequencyName('hertz', 2);                          // \"hertz\"\n */\n\nimport { FREQUENCY_UNITS, type FrequencyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FrequencyFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de frequência para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatFrequency('gigahertz', 2.4);                     // \"2.4 GHz\"\n * formatFrequency('gigahertz', 2.4, { verbose: true });  // \"2.4 gigahertz\"\n * formatFrequency('hertz', 1, { verbose: true });        // \"1 hertz\"\n * formatFrequency('megahertz', 100, { decimals: 0 });    // \"100 MHz\"\n */\nexport function formatFrequency(\n  variant: FrequencyUnit,\n  value: number,\n  options: FrequencyFormatOptions = {},\n): string {\n  const config = FREQUENCY_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown frequency unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getFrequencySymbol('megahertz');  // \"MHz\"\n * getFrequencySymbol('rpm');        // \"rpm\"\n */\nexport function getFrequencySymbol(variant: FrequencyUnit): string {\n  const config = FREQUENCY_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown frequency unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getFrequencyName('hertz', 1);  // \"hertz\"\n * getFrequencyName('hertz', 2);  // \"hertz\"\n * getFrequencyName('rpm', 2);    // \"revolutions per minute\"\n */\nexport function getFrequencyName(variant: FrequencyUnit, count: number = 1): string {\n  const config = FREQUENCY_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown frequency unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Angle Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de ângulo.\n *\n * Base: degree (grau) - mais comum em aplicações práticas.\n * Nota: Embora radiano seja a unidade SI, grau é mais intuitivo para a maioria dos casos.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811 (2008)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AngleUnit =\n  | \"turn\"\n  | \"degree\"\n  | \"arcminute\"\n  | \"arcsecond\"\n  | \"milliarcsecond\"\n  | \"radian\"\n  | \"milliradian\"\n  | \"gradian\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/**\n * Fator exato: 180/π graus por radiano\n * Valor: 57.29577951308232...\n */\nconst DEGREES_PER_RADIAN = 180 / Math.PI;\n\n/**\n * Fator exato: 180/(1000π) graus por milirradiano\n */\nconst DEGREES_PER_MILLIRADIAN = 180 / (1000 * Math.PI);\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de ângulo.\n *\n * Fatores EXATOS:\n * - turn: 360 (definição)\n * - degree: 1 (base)\n * - arcminute: 1/60 (definição)\n * - arcsecond: 1/3600 (definição)\n * - milliarcsecond: 1/3600000 (definição)\n * - gradian: 360/400 = 0.9 (definição)\n * - radian: 180/π (exato por definição matemática)\n * - milliradian: 180/(1000π) (derivado)\n */\nexport const ANGLE_UNITS: Record<AngleUnit, SimpleUnitConfig> = {\n  // Volta completa\n  turn: {\n    factor: 360,\n    symbol: \"tr\",\n    singular: \"turn\",\n    plural: \"turns\",\n  },\n\n  // Base\n  degree: {\n    factor: 1,\n    symbol: \"°\",\n    singular: \"degree\",\n    plural: \"degrees\",\n    noSpace: true, // 45° não 45 °\n  },\n\n  // Subdivisões do grau\n  arcminute: {\n    factor: 1 / 60, // 0.016666...\n    symbol: \"′\",\n    singular: \"arcminute\",\n    plural: \"arcminutes\",\n    noSpace: true, // 30′ não 30 ′\n  },\n  arcsecond: {\n    factor: 1 / 3600, // 0.000277...\n    symbol: \"″\",\n    singular: \"arcsecond\",\n    plural: \"arcseconds\",\n    noSpace: true, // 45″ não 45 ″\n  },\n  milliarcsecond: {\n    factor: 1 / 3600000, // 2.777...e-7\n    symbol: \"mas\",\n    singular: \"milliarcsecond\",\n    plural: \"milliarcseconds\",\n  },\n\n  // Radianos (unidade SI)\n  radian: {\n    factor: DEGREES_PER_RADIAN, // 180/π ≈ 57.2958\n    symbol: \"rad\",\n    singular: \"radian\",\n    plural: \"radians\",\n  },\n  milliradian: {\n    factor: DEGREES_PER_MILLIRADIAN, // 180/(1000π) ≈ 0.0573\n    symbol: \"mrad\",\n    singular: \"milliradian\",\n    plural: \"milliradians\",\n  },\n\n  // Gradiano (gon)\n  gradian: {\n    factor: 0.9, // 360/400\n    symbol: \"gon\",\n    singular: \"gradian\",\n    plural: \"gradians\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const ANGLE_ALIASES: UnitAliases = {\n  // turn\n  tr: \"turn\",\n  rev: \"turn\",\n  // degree\n  \"°\": \"degree\",\n  deg: \"degree\",\n  // arcminute\n  \"′\": \"arcminute\",\n  \"'\": \"arcminute\",\n  arcmin: \"arcminute\",\n  // arcsecond\n  \"″\": \"arcsecond\",\n  '\"': \"arcsecond\",\n  arcsec: \"arcsecond\",\n  // milliarcsecond\n  mas: \"milliarcsecond\",\n  // radian\n  rad: \"radian\",\n  // milliradian\n  mrad: \"milliradian\",\n  // gradian\n  gon: \"gradian\",\n  grad: \"gradian\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const ANGLE_UNIT_LIST = Object.keys(ANGLE_UNITS) as AngleUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const ANGLE_FACTORS: Record<AngleUnit, number> = Object.fromEntries(\n  Object.entries(ANGLE_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<AngleUnit, number>;\n","/**\n * Angle Role - Format Pillar\n *\n * Formatação de valores de ângulo para exibição.\n *\n * @example\n * import { formatAngle, getAngleSymbol, getAngleName } from '@attrx/role-morphic/angle/format';\n *\n * formatAngle('degree', 45);                     // \"45°\"\n * formatAngle('degree', 45, { verbose: true });  // \"45 degrees\"\n * getAngleSymbol('degree');                      // \"°\"\n * getAngleName('degree', 2);                     // \"degrees\"\n */\n\nimport { ANGLE_UNITS, type AngleUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AngleFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de ângulo para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatAngle('degree', 45);                     // \"45°\"\n * formatAngle('degree', 45, { verbose: true });  // \"45 degrees\"\n * formatAngle('radian', 3.14159);                // \"3.14159 rad\"\n * formatAngle('degree', 90, { decimals: 0 });    // \"90°\"\n */\nexport function formatAngle(\n  variant: AngleUnit,\n  value: number,\n  options: AngleFormatOptions = {},\n): string {\n  const config = ANGLE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown angle unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  // Some angle units don't use space (e.g., 45° not 45 °)\n  const separator = config.noSpace && !verbose ? \"\" : \" \";\n\n  return `${formattedNumber}${separator}${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getAngleSymbol('degree');  // \"°\"\n * getAngleSymbol('radian');  // \"rad\"\n */\nexport function getAngleSymbol(variant: AngleUnit): string {\n  const config = ANGLE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown angle unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getAngleName('degree', 1);  // \"degree\"\n * getAngleName('degree', 2);  // \"degrees\"\n */\nexport function getAngleName(variant: AngleUnit, count: number = 1): string {\n  const config = ANGLE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown angle unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Time Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de tempo/duração.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - Gregorian calendar (365.2425 dias/ano)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type TimeUnit =\n  // SI prefixes\n  | \"nanosecond\"\n  | \"microsecond\"\n  | \"millisecond\"\n  | \"second\"\n  // Common\n  | \"minute\"\n  | \"hour\"\n  | \"day\"\n  | \"week\"\n  // Calendar (approximate)\n  | \"month\"\n  | \"year\"\n  | \"decade\"\n  | \"century\"\n  | \"millennium\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de tempo.\n *\n * Fatores exatos:\n * - SI: prefixos são exatos por definição\n * - day, hour, minute: exatos (86400s, 3600s, 60s)\n * - week: exato (7 dias = 604800s)\n *\n * Fatores aproximados (baseados no calendário Gregoriano):\n * - year: 365.2425 dias (média do ciclo de 400 anos)\n * - month: year/12\n */\nexport const TIME_UNITS: Record<TimeUnit, SimpleUnitConfig> = {\n  // SI prefixes (exatos)\n  nanosecond: {\n    factor: 1e-9,\n    symbol: \"ns\",\n    singular: \"nanosecond\",\n    plural: \"nanoseconds\",\n  },\n  microsecond: {\n    factor: 1e-6,\n    symbol: \"μs\",\n    singular: \"microsecond\",\n    plural: \"microseconds\",\n  },\n  millisecond: {\n    factor: 0.001,\n    symbol: \"ms\",\n    singular: \"millisecond\",\n    plural: \"milliseconds\",\n  },\n  second: {\n    factor: 1,\n    symbol: \"s\",\n    singular: \"second\",\n    plural: \"seconds\",\n  },\n\n  // Common (exatos)\n  minute: {\n    factor: 60,\n    symbol: \"min\",\n    singular: \"minute\",\n    plural: \"minutes\",\n  },\n  hour: {\n    factor: 3600,\n    symbol: \"h\",\n    singular: \"hour\",\n    plural: \"hours\",\n  },\n  day: {\n    factor: 86400,\n    symbol: \"d\",\n    singular: \"day\",\n    plural: \"days\",\n  },\n  week: {\n    factor: 604800,\n    symbol: \"wk\",\n    singular: \"week\",\n    plural: \"weeks\",\n  },\n\n  // Calendar (aproximados - baseados no ano Gregoriano)\n  month: {\n    factor: 2629746, // 31556952 / 12\n    symbol: \"mo\",\n    singular: \"month\",\n    plural: \"months\",\n  },\n  year: {\n    factor: 31556952, // 365.2425 * 86400\n    symbol: \"yr\",\n    singular: \"year\",\n    plural: \"years\",\n  },\n  decade: {\n    factor: 315569520, // 10 * year\n    symbol: \"dec\",\n    singular: \"decade\",\n    plural: \"decades\",\n  },\n  century: {\n    factor: 3155695200, // 100 * year\n    symbol: \"c\",\n    singular: \"century\",\n    plural: \"centuries\",\n  },\n  millennium: {\n    factor: 31556952000, // 1000 * year\n    symbol: \"ky\",\n    singular: \"millennium\",\n    plural: \"millennia\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const TIME_ALIASES: UnitAliases = {\n  // nanosecond\n  ns: \"nanosecond\",\n  // microsecond\n  \"μs\": \"microsecond\",\n  us: \"microsecond\",\n  // millisecond\n  ms: \"millisecond\",\n  // second\n  s: \"second\",\n  sec: \"second\",\n  // minute\n  min: \"minute\",\n  // hour\n  h: \"hour\",\n  hr: \"hour\",\n  hrs: \"hour\",\n  // day\n  d: \"day\",\n  // week\n  wk: \"week\",\n  // month\n  mo: \"month\",\n  // year\n  yr: \"year\",\n  y: \"year\",\n  // decade\n  dec: \"decade\",\n  // century\n  c: \"century\",\n  // millennium\n  ky: \"millennium\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const TIME_UNIT_LIST = Object.keys(TIME_UNITS) as TimeUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const TIME_FACTORS: Record<TimeUnit, number> = Object.fromEntries(\n  Object.entries(TIME_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<TimeUnit, number>;\n","/**\n * Time Role - Format Pillar\n *\n * Formatação de valores de tempo para exibição.\n *\n * @example\n * import { formatTime, getTimeSymbol, getTimeName } from '@attrx/role-morphic/time/format';\n *\n * formatTime('hour', 2.5);                     // \"2.5 h\"\n * formatTime('hour', 2.5, { verbose: true });  // \"2.5 hours\"\n * getTimeSymbol('minute');                     // \"min\"\n * getTimeName('hour', 2);                      // \"hours\"\n */\n\nimport { TIME_UNITS, type TimeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TimeFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de tempo para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatTime('hour', 2.5);                     // \"2.5 h\"\n * formatTime('hour', 2.5, { verbose: true });  // \"2.5 hours\"\n * formatTime('second', 1, { verbose: true });  // \"1 second\"\n * formatTime('millisecond', 100, { decimals: 0 }); // \"100 ms\"\n */\nexport function formatTime(\n  variant: TimeUnit,\n  value: number,\n  options: TimeFormatOptions = {},\n): string {\n  const config = TIME_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown time unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getTimeSymbol('minute');  // \"min\"\n * getTimeSymbol('hour');    // \"h\"\n */\nexport function getTimeSymbol(variant: TimeUnit): string {\n  const config = TIME_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown time unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getTimeName('hour', 1);  // \"hour\"\n * getTimeName('hour', 2);  // \"hours\"\n */\nexport function getTimeName(variant: TimeUnit, count: number = 1): string {\n  const config = TIME_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown time unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Digital Storage Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de armazenamento digital.\n *\n * Fontes:\n * - IEC 60027-2 (prefixos binários)\n * - SI Brochure, 9th Edition (2019)\n *\n * IMPORTANTE: Esta biblioteca suporta AMBOS os sistemas:\n * - SI (decimal): kB, MB, GB, TB (base 1000)\n * - IEC (binário): KiB, MiB, GiB, TiB (base 1024)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type DigitalUnit =\n  // Fundamental\n  | \"bit\"\n  | \"byte\"\n  // IEC Binary (base 1024)\n  | \"kibibyte\"\n  | \"mebibyte\"\n  | \"gibibyte\"\n  | \"tebibyte\"\n  | \"pebibyte\"\n  | \"exbibyte\"\n  // SI Decimal (base 1000)\n  | \"kilobyte\"\n  | \"megabyte\"\n  | \"gigabyte\"\n  | \"terabyte\"\n  | \"petabyte\"\n  | \"exabyte\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de armazenamento digital.\n *\n * TODOS os fatores são EXATOS:\n * - IEC: potências de 2 (1024^n)\n * - SI: potências de 10 (1000^n)\n *\n * Convenção:\n * - byte é a BASE (fator = 1)\n * - bit = 1/8 byte (fator = 0.125)\n */\nexport const DIGITAL_UNITS: Record<DigitalUnit, SimpleUnitConfig> = {\n  // Fundamental\n  bit: {\n    factor: 0.125, // 1/8 byte\n    symbol: \"b\",\n    singular: \"bit\",\n    plural: \"bits\",\n  },\n  byte: {\n    factor: 1,\n    symbol: \"B\",\n    singular: \"byte\",\n    plural: \"bytes\",\n  },\n\n  // IEC Binary (base 1024) - RAM, cache, file systems\n  kibibyte: {\n    factor: 1024, // 2^10\n    symbol: \"KiB\",\n    singular: \"kibibyte\",\n    plural: \"kibibytes\",\n  },\n  mebibyte: {\n    factor: 1048576, // 2^20\n    symbol: \"MiB\",\n    singular: \"mebibyte\",\n    plural: \"mebibytes\",\n  },\n  gibibyte: {\n    factor: 1073741824, // 2^30\n    symbol: \"GiB\",\n    singular: \"gibibyte\",\n    plural: \"gibibytes\",\n  },\n  tebibyte: {\n    factor: 1099511627776, // 2^40\n    symbol: \"TiB\",\n    singular: \"tebibyte\",\n    plural: \"tebibytes\",\n  },\n  pebibyte: {\n    factor: 1125899906842624, // 2^50\n    symbol: \"PiB\",\n    singular: \"pebibyte\",\n    plural: \"pebibytes\",\n  },\n  exbibyte: {\n    factor: 1152921504606846976, // 2^60\n    symbol: \"EiB\",\n    singular: \"exbibyte\",\n    plural: \"exbibytes\",\n  },\n\n  // SI Decimal (base 1000) - HD marketing, network speeds\n  kilobyte: {\n    factor: 1000, // 10^3\n    symbol: \"kB\",\n    singular: \"kilobyte\",\n    plural: \"kilobytes\",\n  },\n  megabyte: {\n    factor: 1000000, // 10^6\n    symbol: \"MB\",\n    singular: \"megabyte\",\n    plural: \"megabytes\",\n  },\n  gigabyte: {\n    factor: 1000000000, // 10^9\n    symbol: \"GB\",\n    singular: \"gigabyte\",\n    plural: \"gigabytes\",\n  },\n  terabyte: {\n    factor: 1000000000000, // 10^12\n    symbol: \"TB\",\n    singular: \"terabyte\",\n    plural: \"terabytes\",\n  },\n  petabyte: {\n    factor: 1000000000000000, // 10^15\n    symbol: \"PB\",\n    singular: \"petabyte\",\n    plural: \"petabytes\",\n  },\n  exabyte: {\n    factor: 1000000000000000000, // 10^18\n    symbol: \"EB\",\n    singular: \"exabyte\",\n    plural: \"exabytes\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const DIGITAL_ALIASES: UnitAliases = {\n  // bit\n  b: \"bit\",\n  // byte\n  B: \"byte\",\n  // kibibyte (IEC)\n  KiB: \"kibibyte\",\n  // mebibyte (IEC)\n  MiB: \"mebibyte\",\n  // gibibyte (IEC)\n  GiB: \"gibibyte\",\n  // tebibyte (IEC)\n  TiB: \"tebibyte\",\n  // pebibyte (IEC)\n  PiB: \"pebibyte\",\n  // exbibyte (IEC)\n  EiB: \"exbibyte\",\n  // kilobyte (SI)\n  kB: \"kilobyte\",\n  kb: \"kilobyte\",\n  // megabyte (SI)\n  MB: \"megabyte\",\n  // gigabyte (SI)\n  GB: \"gigabyte\",\n  // terabyte (SI)\n  TB: \"terabyte\",\n  // petabyte (SI)\n  PB: \"petabyte\",\n  // exabyte (SI)\n  EB: \"exabyte\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const DIGITAL_UNIT_LIST = Object.keys(DIGITAL_UNITS) as DigitalUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const DIGITAL_FACTORS: Record<DigitalUnit, number> = Object.fromEntries(\n  Object.entries(DIGITAL_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<DigitalUnit, number>;\n","/**\n * Digital Role - Format Pillar\n *\n * Formatação de valores de armazenamento digital para exibição.\n *\n * @example\n * import { formatDigital, getDigitalSymbol, getDigitalName } from '@attrx/role-morphic/digital/format';\n *\n * formatDigital('gigabyte', 2.5);                     // \"2.5 GB\"\n * formatDigital('gigabyte', 2.5, { verbose: true });  // \"2.5 gigabytes\"\n * getDigitalSymbol('mebibyte');                       // \"MiB\"\n * getDigitalName('byte', 2);                          // \"bytes\"\n */\n\nimport { DIGITAL_UNITS, type DigitalUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DigitalFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de armazenamento digital para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatDigital('gigabyte', 2.5);                     // \"2.5 GB\"\n * formatDigital('gigabyte', 2.5, { verbose: true });  // \"2.5 gigabytes\"\n * formatDigital('byte', 1, { verbose: true });        // \"1 byte\"\n * formatDigital('mebibyte', 100, { decimals: 0 });    // \"100 MiB\"\n */\nexport function formatDigital(\n  variant: DigitalUnit,\n  value: number,\n  options: DigitalFormatOptions = {},\n): string {\n  const config = DIGITAL_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown digital unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getDigitalSymbol('megabyte');  // \"MB\"\n * getDigitalSymbol('mebibyte');  // \"MiB\"\n */\nexport function getDigitalSymbol(variant: DigitalUnit): string {\n  const config = DIGITAL_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown digital unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getDigitalName('byte', 1);  // \"byte\"\n * getDigitalName('byte', 2);  // \"bytes\"\n */\nexport function getDigitalName(variant: DigitalUnit, count: number = 1): string {\n  const config = DIGITAL_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown digital unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Color Role - Types\n *\n * Tipos para representação de cores nas diferentes variantes.\n */\n\n// =============================================================================\n// BASE TYPE\n// =============================================================================\n\n/**\n * Tipo base para Color: objeto RGBA com valores 0-255 e alpha 0-1\n *\n * @example\n * const red: RGBA = { r: 255, g: 0, b: 0, a: 1 };\n * const semiTransparent: RGBA = { r: 0, g: 0, b: 255, a: 0.5 };\n */\nexport interface RGBA {\n  r: number; // 0-255\n  g: number; // 0-255\n  b: number; // 0-255\n  a: number; // 0-1\n}\n\n// =============================================================================\n// VARIANT TYPES\n// =============================================================================\n\n/**\n * Variante Hex\n *\n * @example\n * \"#ff0000\"     // RGB (6 chars)\n * \"#ff0000ff\"   // RGBA (8 chars)\n * \"#f00\"        // RGB shorthand (3 chars)\n * \"#f00f\"       // RGBA shorthand (4 chars)\n */\nexport type ColorHex = string;\n\n/**\n * Variante RGB Object\n *\n * @example\n * { r: 255, g: 0, b: 0 }\n * { r: 255, g: 0, b: 0, a: 0.5 }\n */\nexport interface ColorRgbObject {\n  r: number;\n  g: number;\n  b: number;\n  a?: number;\n}\n\n/**\n * Variante RGB String\n *\n * @example\n * \"rgb(255, 0, 0)\"\n * \"rgba(255, 0, 0, 0.5)\"\n */\nexport type ColorRgbString = string;\n\n/**\n * Variante HSL Object\n *\n * @example\n * { h: 0, s: 100, l: 50 }        // Red\n * { h: 0, s: 100, l: 50, a: 0.5 } // Semi-transparent red\n */\nexport interface ColorHslObject {\n  h: number; // 0-360\n  s: number; // 0-100\n  l: number; // 0-100\n  a?: number; // 0-1\n}\n\n/**\n * Variante HSL String\n *\n * @example\n * \"hsl(0, 100%, 50%)\"\n * \"hsla(0, 100%, 50%, 0.5)\"\n */\nexport type ColorHslString = string;\n\n// =============================================================================\n// VARIANT NAMES\n// =============================================================================\n\nexport type ColorVariant =\n  | \"hex\"\n  | \"rgb_object\"\n  | \"rgb_string\"\n  | \"hsl_object\"\n  | \"hsl_string\";\n\n// =============================================================================\n// FORMAT OPTIONS\n// =============================================================================\n\nimport type { BaseFormatOptions } from \"../../types\";\n\nexport interface ColorFormatOptions extends BaseFormatOptions {\n  /** Se true, usa letras maiúsculas para hex */\n  uppercase?: boolean;\n\n  /** Se true, inclui alpha mesmo quando é 1 */\n  includeAlpha?: boolean;\n\n  /** Se true, usa formato compacto (shorthand hex, sem espaços em rgb) */\n  compact?: boolean;\n}\n\n// =============================================================================\n// NAMED COLORS\n// =============================================================================\n\n/**\n * CSS Named Colors mais comuns\n */\nexport const NAMED_COLORS: Record<string, RGBA> = {\n  // Basic colors\n  black: { r: 0, g: 0, b: 0, a: 1 },\n  white: { r: 255, g: 255, b: 255, a: 1 },\n  red: { r: 255, g: 0, b: 0, a: 1 },\n  green: { r: 0, g: 128, b: 0, a: 1 },\n  blue: { r: 0, g: 0, b: 255, a: 1 },\n  yellow: { r: 255, g: 255, b: 0, a: 1 },\n  cyan: { r: 0, g: 255, b: 255, a: 1 },\n  magenta: { r: 255, g: 0, b: 255, a: 1 },\n\n  // Extended colors\n  orange: { r: 255, g: 165, b: 0, a: 1 },\n  purple: { r: 128, g: 0, b: 128, a: 1 },\n  pink: { r: 255, g: 192, b: 203, a: 1 },\n  brown: { r: 165, g: 42, b: 42, a: 1 },\n  gray: { r: 128, g: 128, b: 128, a: 1 },\n  grey: { r: 128, g: 128, b: 128, a: 1 },\n\n  // Web colors\n  lime: { r: 0, g: 255, b: 0, a: 1 },\n  aqua: { r: 0, g: 255, b: 255, a: 1 },\n  fuchsia: { r: 255, g: 0, b: 255, a: 1 },\n  silver: { r: 192, g: 192, b: 192, a: 1 },\n  maroon: { r: 128, g: 0, b: 0, a: 1 },\n  olive: { r: 128, g: 128, b: 0, a: 1 },\n  navy: { r: 0, g: 0, b: 128, a: 1 },\n  teal: { r: 0, g: 128, b: 128, a: 1 },\n\n  // Transparent\n  transparent: { r: 0, g: 0, b: 0, a: 0 },\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Clamp um valor entre min e max\n */\nexport function clamp(value: number, min: number, max: number): number {\n  return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Normaliza um canal RGB para 0-255\n */\nexport function normalizeRgbChannel(value: number): number {\n  return clamp(Math.round(value), 0, 255);\n}\n\n/**\n * Normaliza alpha para 0-1\n */\nexport function normalizeAlpha(value: number | undefined): number {\n  if (value === undefined) return 1;\n  return clamp(value, 0, 1);\n}\n\n/**\n * Converte RGB para HSL\n */\nexport function rgbToHsl(\n  r: number,\n  g: number,\n  b: number,\n): { h: number; s: number; l: number } {\n  r /= 255;\n  g /= 255;\n  b /= 255;\n\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n\n  if (max === min) {\n    return { h: 0, s: 0, l: l * 100 };\n  }\n\n  const d = max - min;\n  const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n  let h: number;\n  switch (max) {\n    case r:\n      h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n      break;\n    case g:\n      h = ((b - r) / d + 2) / 6;\n      break;\n    default:\n      h = ((r - g) / d + 4) / 6;\n      break;\n  }\n\n  return {\n    h: Math.round(h * 360),\n    s: Math.round(s * 100),\n    l: Math.round(l * 100),\n  };\n}\n\n/**\n * Converte HSL para RGB\n */\nexport function hslToRgb(\n  h: number,\n  s: number,\n  l: number,\n): { r: number; g: number; b: number } {\n  h /= 360;\n  s /= 100;\n  l /= 100;\n\n  if (s === 0) {\n    const gray = Math.round(l * 255);\n    return { r: gray, g: gray, b: gray };\n  }\n\n  const hue2rgb = (p: number, q: number, t: number): number => {\n    if (t < 0) t += 1;\n    if (t > 1) t -= 1;\n    if (t < 1 / 6) return p + (q - p) * 6 * t;\n    if (t < 1 / 2) return q;\n    if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n    return p;\n  };\n\n  const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n  const p = 2 * l - q;\n\n  return {\n    r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n    g: Math.round(hue2rgb(p, q, h) * 255),\n    b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n  };\n}\n","/**\n * Color Role - Convert Pillar\n *\n * Conversão entre variantes de cor usando hub-and-spoke (via rgb_object/RGBA).\n *\n * @example\n * import { convertColor, hexToRgba, rgbaToHex } from '@attrx/role-morphic/color/convert';\n *\n * convertColor('hex', 'rgb_object', '#ff0000');  // { r: 255, g: 0, b: 0, a: 1 }\n * convertColor('rgb_object', 'hsl_string', { r: 255, g: 0, b: 0 }); // \"hsl(0, 100%, 50%)\"\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject } from \"./types\";\nimport { rgbToHsl, hslToRgb, normalizeAlpha, normalizeRgbChannel, clamp } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nexport const COLOR_BASE: ColorVariant = \"rgb_object\";\n\nexport const COLOR_VARIANTS: ColorVariant[] = [\n  \"hex\",\n  \"rgb_object\",\n  \"rgb_string\",\n  \"hsl_object\",\n  \"hsl_string\",\n];\n\n// =============================================================================\n// TO BASE (→ RGBA)\n// =============================================================================\n\n/**\n * Converte hex para RGBA\n */\nexport function hexToRgba(hex: string): RGBA {\n  let h = hex.trim();\n  if (h.startsWith(\"#\")) h = h.slice(1);\n\n  let r: number, g: number, b: number, a: number;\n\n  if (h.length === 3) {\n    r = parseInt(h[0] + h[0], 16);\n    g = parseInt(h[1] + h[1], 16);\n    b = parseInt(h[2] + h[2], 16);\n    a = 1;\n  } else if (h.length === 4) {\n    r = parseInt(h[0] + h[0], 16);\n    g = parseInt(h[1] + h[1], 16);\n    b = parseInt(h[2] + h[2], 16);\n    a = parseInt(h[3] + h[3], 16) / 255;\n  } else if (h.length === 6) {\n    r = parseInt(h.slice(0, 2), 16);\n    g = parseInt(h.slice(2, 4), 16);\n    b = parseInt(h.slice(4, 6), 16);\n    a = 1;\n  } else if (h.length === 8) {\n    r = parseInt(h.slice(0, 2), 16);\n    g = parseInt(h.slice(2, 4), 16);\n    b = parseInt(h.slice(4, 6), 16);\n    a = parseInt(h.slice(6, 8), 16) / 255;\n  } else {\n    throw new Error(`Invalid hex color: ${hex}`);\n  }\n\n  return { r, g, b, a };\n}\n\n/**\n * Converte RGB object para RGBA\n */\nexport function rgbObjectToRgba(rgb: ColorRgbObject): RGBA {\n  return {\n    r: normalizeRgbChannel(rgb.r),\n    g: normalizeRgbChannel(rgb.g),\n    b: normalizeRgbChannel(rgb.b),\n    a: normalizeAlpha(rgb.a),\n  };\n}\n\n/**\n * Converte RGB string para RGBA\n */\nexport function rgbStringToRgba(rgb: string): RGBA {\n  const match = rgb.match(/rgba?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i);\n  if (!match) {\n    throw new Error(`Invalid RGB string: ${rgb}`);\n  }\n\n  return {\n    r: normalizeRgbChannel(parseFloat(match[1])),\n    g: normalizeRgbChannel(parseFloat(match[2])),\n    b: normalizeRgbChannel(parseFloat(match[3])),\n    a: match[4] !== undefined ? normalizeAlpha(parseFloat(match[4])) : 1,\n  };\n}\n\n/**\n * Converte HSL object para RGBA\n */\nexport function hslObjectToRgba(hsl: ColorHslObject): RGBA {\n  const { r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l);\n  return {\n    r,\n    g,\n    b,\n    a: normalizeAlpha(hsl.a),\n  };\n}\n\n/**\n * Converte HSL string para RGBA\n */\nexport function hslStringToRgba(hsl: string): RGBA {\n  const match = hsl.match(/hsla?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%?\\s*,\\s*([\\d.]+)%?\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i);\n  if (!match) {\n    throw new Error(`Invalid HSL string: ${hsl}`);\n  }\n\n  const h = parseFloat(match[1]);\n  const s = parseFloat(match[2]);\n  const l = parseFloat(match[3]);\n  const a = match[4] !== undefined ? parseFloat(match[4]) : 1;\n\n  const { r, g, b } = hslToRgb(h, s, l);\n  return { r, g, b, a: normalizeAlpha(a) };\n}\n\n/**\n * Converte qualquer variante para RGBA (base)\n */\nexport function toBaseColor(variant: ColorVariant, value: unknown): RGBA {\n  switch (variant) {\n    case \"hex\":\n      return hexToRgba(value as string);\n    case \"rgb_object\":\n      return rgbObjectToRgba(value as ColorRgbObject);\n    case \"rgb_string\":\n      return rgbStringToRgba(value as string);\n    case \"hsl_object\":\n      return hslObjectToRgba(value as ColorHslObject);\n    case \"hsl_string\":\n      return hslStringToRgba(value as string);\n    default:\n      throw new Error(`Unknown color variant: ${variant}`);\n  }\n}\n\n// =============================================================================\n// FROM BASE (RGBA →)\n// =============================================================================\n\n/**\n * Converte RGBA para hex\n */\nexport function rgbaToHex(rgba: RGBA, includeAlpha = false): string {\n  const r = rgba.r.toString(16).padStart(2, \"0\");\n  const g = rgba.g.toString(16).padStart(2, \"0\");\n  const b = rgba.b.toString(16).padStart(2, \"0\");\n\n  if (includeAlpha || rgba.a < 1) {\n    const a = Math.round(rgba.a * 255)\n      .toString(16)\n      .padStart(2, \"0\");\n    return `#${r}${g}${b}${a}`;\n  }\n\n  return `#${r}${g}${b}`;\n}\n\n/**\n * Converte RGBA para RGB object\n */\nexport function rgbaToRgbObject(rgba: RGBA): ColorRgbObject {\n  if (rgba.a < 1) {\n    return { r: rgba.r, g: rgba.g, b: rgba.b, a: rgba.a };\n  }\n  return { r: rgba.r, g: rgba.g, b: rgba.b };\n}\n\n/**\n * Converte RGBA para RGB string\n */\nexport function rgbaToRgbString(rgba: RGBA): string {\n  if (rgba.a < 1) {\n    return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n  }\n  return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n}\n\n/**\n * Converte RGBA para HSL object\n */\nexport function rgbaToHslObject(rgba: RGBA): ColorHslObject {\n  const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n  if (rgba.a < 1) {\n    return { h, s, l, a: rgba.a };\n  }\n  return { h, s, l };\n}\n\n/**\n * Converte RGBA para HSL string\n */\nexport function rgbaToHslString(rgba: RGBA): string {\n  const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n  if (rgba.a < 1) {\n    return `hsla(${h}, ${s}%, ${l}%, ${rgba.a})`;\n  }\n  return `hsl(${h}, ${s}%, ${l}%)`;\n}\n\n/**\n * Converte RGBA (base) para qualquer variante\n */\nexport function fromBaseColor(variant: ColorVariant, rgba: RGBA): unknown {\n  switch (variant) {\n    case \"hex\":\n      return rgbaToHex(rgba);\n    case \"rgb_object\":\n      return rgbaToRgbObject(rgba);\n    case \"rgb_string\":\n      return rgbaToRgbString(rgba);\n    case \"hsl_object\":\n      return rgbaToHslObject(rgba);\n    case \"hsl_string\":\n      return rgbaToHslString(rgba);\n    default:\n      throw new Error(`Unknown color variant: ${variant}`);\n  }\n}\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte entre duas variantes de cor\n *\n * @param from - Variante de origem\n * @param to - Variante de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertColor('hex', 'rgb_object', '#ff0000');\n * // { r: 255, g: 0, b: 0 }\n */\nexport function convertColor<TFrom = unknown, TTo = unknown>(\n  from: ColorVariant,\n  to: ColorVariant,\n  value: TFrom,\n): TTo {\n  // Otimização: mesma variante\n  if (from === to) {\n    return value as unknown as TTo;\n  }\n\n  // Converte via base (RGBA)\n  const rgba = toBaseColor(from, value);\n  return fromBaseColor(to, rgba) as TTo;\n}\n\n/**\n * Versão safe de convertColor que retorna Result\n */\nexport function tryConvertColor<TFrom = unknown, TTo = unknown>(\n  from: ColorVariant,\n  to: ColorVariant,\n  value: TFrom,\n): Result<TTo> {\n  try {\n    const result = convertColor<TFrom, TTo>(from, to, value);\n    return { ok: true, value: result };\n  } catch (error) {\n    return {\n      ok: false,\n      error: error instanceof Error ? error.message : String(error),\n    };\n  }\n}\n\n/**\n * Verifica se variante existe\n */\nexport function hasColorVariant(variant: string): variant is ColorVariant {\n  return COLOR_VARIANTS.includes(variant as ColorVariant);\n}\n\n/**\n * Retorna lista de variantes\n */\nexport function getColorVariants(): ColorVariant[] {\n  return [...COLOR_VARIANTS];\n}\n","/**\n * Color Role - Format Pillar\n *\n * Formatação de cores para apresentação.\n *\n * @example\n * import { formatColor } from '@attrx/role-morphic/color/format';\n *\n * formatColor('hex', '#ff0000', { uppercase: true }); // '#FF0000'\n * formatColor('rgb_string', { r: 255, g: 0, b: 0 });  // 'rgb(255, 0, 0)'\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject, ColorFormatOptions } from \"./types\";\nimport { rgbToHsl } from \"./types\";\nimport { toBaseColor } from \"./convert\";\n\n// =============================================================================\n// FORMAT OPTIONS DEFAULTS\n// =============================================================================\n\nconst DEFAULT_OPTIONS: ColorFormatOptions = {\n  uppercase: false,\n  includeAlpha: false,\n  compact: false,\n};\n\n// =============================================================================\n// FORMAT BY VARIANT\n// =============================================================================\n\n/**\n * Formata RGBA como hex\n */\nfunction formatAsHex(rgba: RGBA, options: ColorFormatOptions): string {\n  const r = rgba.r.toString(16).padStart(2, \"0\");\n  const g = rgba.g.toString(16).padStart(2, \"0\");\n  const b = rgba.b.toString(16).padStart(2, \"0\");\n\n  let hex: string;\n\n  if (options.includeAlpha || rgba.a < 1) {\n    const a = Math.round(rgba.a * 255)\n      .toString(16)\n      .padStart(2, \"0\");\n    hex = `#${r}${g}${b}${a}`;\n  } else {\n    hex = `#${r}${g}${b}`;\n  }\n\n  // Compact: try to use shorthand if possible\n  if (options.compact && !options.includeAlpha && rgba.a === 1) {\n    if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) {\n      hex = `#${r[0]}${g[0]}${b[0]}`;\n    }\n  }\n\n  return options.uppercase ? hex.toUpperCase() : hex.toLowerCase();\n}\n\n/**\n * Formata RGBA como RGB string\n */\nfunction formatAsRgbString(rgba: RGBA, options: ColorFormatOptions): string {\n  if (options.includeAlpha || rgba.a < 1) {\n    if (options.compact) {\n      return `rgba(${rgba.r},${rgba.g},${rgba.b},${rgba.a})`;\n    }\n    return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n  }\n\n  if (options.compact) {\n    return `rgb(${rgba.r},${rgba.g},${rgba.b})`;\n  }\n  return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n}\n\n/**\n * Formata RGBA como HSL string\n */\nfunction formatAsHslString(rgba: RGBA, options: ColorFormatOptions): string {\n  const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n\n  if (options.includeAlpha || rgba.a < 1) {\n    if (options.compact) {\n      return `hsla(${h},${s}%,${l}%,${rgba.a})`;\n    }\n    return `hsla(${h}, ${s}%, ${l}%, ${rgba.a})`;\n  }\n\n  if (options.compact) {\n    return `hsl(${h},${s}%,${l}%)`;\n  }\n  return `hsl(${h}, ${s}%, ${l}%)`;\n}\n\n/**\n * Formata RGBA como RGB object (formato CSS rgb())\n * Nota: rgb_object format usa a mesma representação de rgb_string\n */\nfunction formatAsRgbObject(rgba: RGBA, options: ColorFormatOptions): string {\n  // rgb_object format outputs RGB string representation (same as rgb_string)\n  return formatAsRgbString(rgba, options);\n}\n\n/**\n * Formata RGBA como HSL object (formato CSS hsl())\n * Nota: hsl_object format usa a mesma representação de hsl_string\n */\nfunction formatAsHslObject(rgba: RGBA, options: ColorFormatOptions): string {\n  // hsl_object format outputs HSL string representation (same as hsl_string)\n  return formatAsHslString(rgba, options);\n}\n\n// =============================================================================\n// MAIN FORMAT\n// =============================================================================\n\n/**\n * Formata cor para apresentação\n *\n * @param variant - Variante de saída\n * @param value - Valor da cor (qualquer variante)\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatColor('hex', '#ff0000', { uppercase: true });\n * // '#FF0000'\n *\n * formatColor('rgb_string', { r: 255, g: 0, b: 0 });\n * // 'rgb(255, 0, 0)'\n *\n * formatColor('hex', '#ff0000', { compact: true });\n * // '#f00'\n */\nexport function formatColor(\n  variant: ColorVariant,\n  value: unknown,\n  options?: ColorFormatOptions,\n): string {\n  const opts = { ...DEFAULT_OPTIONS, ...options };\n\n  // Primeiro converte para RGBA (base)\n  let rgba: RGBA;\n\n  // Se o value já é um objeto com r,g,b,a, usa direto\n  if (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"r\" in value &&\n    \"g\" in value &&\n    \"b\" in value\n  ) {\n    const obj = value as ColorRgbObject;\n    rgba = {\n      r: obj.r,\n      g: obj.g,\n      b: obj.b,\n      a: obj.a ?? 1,\n    };\n  } else if (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"h\" in value &&\n    \"s\" in value &&\n    \"l\" in value\n  ) {\n    // HSL object - converte para RGBA\n    rgba = toBaseColor(\"hsl_object\", value);\n  } else if (typeof value === \"string\") {\n    // String - detecta formato e converte\n    rgba = toBaseColor(detectStringVariant(value), value);\n  } else {\n    throw new Error(`Cannot format color: ${String(value)}`);\n  }\n\n  // Formata na variante de saída\n  switch (variant) {\n    case \"hex\":\n      return formatAsHex(rgba, opts);\n    case \"rgb_string\":\n      return formatAsRgbString(rgba, opts);\n    case \"hsl_string\":\n      return formatAsHslString(rgba, opts);\n    case \"rgb_object\":\n      return formatAsRgbObject(rgba, opts);\n    case \"hsl_object\":\n      return formatAsHslObject(rgba, opts);\n    default:\n      throw new Error(`Unknown color variant: ${variant}`);\n  }\n}\n\n/**\n * Detecta variante de uma string\n */\nfunction detectStringVariant(value: string): ColorVariant {\n  const trimmed = value.trim().toLowerCase();\n\n  if (/^#?[0-9a-f]{3,8}$/i.test(trimmed)) {\n    return \"hex\";\n  }\n  if (/^rgba?\\s*\\(/i.test(trimmed)) {\n    return \"rgb_string\";\n  }\n  if (/^hsla?\\s*\\(/i.test(trimmed)) {\n    return \"hsl_string\";\n  }\n\n  // Default to hex\n  return \"hex\";\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Formata como hex\n */\nexport function formatHex(value: unknown, options?: ColorFormatOptions): string {\n  return formatColor(\"hex\", value, options);\n}\n\n/**\n * Formata como RGB string\n */\nexport function formatRgbString(value: unknown, options?: ColorFormatOptions): string {\n  return formatColor(\"rgb_string\", value, options);\n}\n\n/**\n * Formata como HSL string\n */\nexport function formatHslString(value: unknown, options?: ColorFormatOptions): string {\n  return formatColor(\"hsl_string\", value, options);\n}\n","/**\n * Date Role - Format Pillar\n *\n * Formatação de datas para apresentação.\n *\n * @example\n * import { formatDate, formatIso, formatTimestamp } from '@attrx/role-morphic/date/format';\n *\n * formatDate('iso', '2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' });\n * // \"quinta-feira, 5 de dezembro de 2024\"\n */\n\nimport type { DateVariant, DateIso, DateTimestamp, DateEpoch, DateFormatOptions } from \"./types\";\n\n// =============================================================================\n// FORMAT ISO\n// =============================================================================\n\n/**\n * Formata ISO string para apresentação\n *\n * @example\n * formatIso('2024-12-05T19:30:00.000Z');\n * // '2024-12-05T19:30:00.000Z'\n *\n * formatIso('2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' });\n * // 'quinta-feira, 5 de dezembro de 2024'\n */\nexport function formatIso(value: DateIso, options?: DateFormatOptions): string {\n  const date = new Date(value);\n\n  if (isNaN(date.getTime())) {\n    return \"Invalid Date\";\n  }\n\n  // Se não especificar opções de formatação, retorna o ISO string original\n  if (\n    !options ||\n    (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n  ) {\n    return value;\n  }\n\n  return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// FORMAT TIMESTAMP\n// =============================================================================\n\n/**\n * Formata timestamp (ms) para apresentação\n *\n * @example\n * formatTimestamp(1733425800000);\n * // '1733425800000'\n *\n * formatTimestamp(1733425800000, { dateStyle: 'medium', locale: 'en-US' });\n * // 'Dec 5, 2024'\n */\nexport function formatTimestamp(value: DateTimestamp, options?: DateFormatOptions): string {\n  const date = new Date(value);\n\n  if (isNaN(date.getTime())) {\n    return \"Invalid Date\";\n  }\n\n  // Se não especificar opções, retorna o timestamp como string\n  if (\n    !options ||\n    (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n  ) {\n    return String(value);\n  }\n\n  return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// FORMAT EPOCH\n// =============================================================================\n\n/**\n * Formata epoch (segundos) para apresentação\n *\n * @example\n * formatEpoch(1733425800);\n * // '1733425800'\n *\n * formatEpoch(1733425800, { dateStyle: 'short', timeStyle: 'short' });\n * // '12/5/24, 7:30 PM'\n */\nexport function formatEpoch(value: DateEpoch, options?: DateFormatOptions): string {\n  const date = new Date(value * 1000);\n\n  if (isNaN(date.getTime())) {\n    return \"Invalid Date\";\n  }\n\n  // Se não especificar opções, retorna o epoch como string\n  if (\n    !options ||\n    (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n  ) {\n    return String(value);\n  }\n\n  return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// MAIN FORMAT\n// =============================================================================\n\n/**\n * Formata data para apresentação\n *\n * @param variant - Variante da data (\"iso\", \"timestamp\", \"epoch\")\n * @param value - Valor da data\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatDate('iso', '2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' });\n * // 'quinta-feira, 5 de dezembro de 2024'\n *\n * formatDate('timestamp', 1733425800000, { dateOnly: true, dateStyle: 'medium' });\n * // 'Dec 5, 2024'\n */\nexport function formatDate(\n  variant: DateVariant,\n  value: unknown,\n  options?: DateFormatOptions\n): string {\n  switch (variant) {\n    case \"iso\":\n      return formatIso(value as DateIso, options);\n    case \"timestamp\":\n      return formatTimestamp(value as DateTimestamp, options);\n    case \"epoch\":\n      return formatEpoch(value as DateEpoch, options);\n    default:\n      return \"Invalid Date\";\n  }\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Formata Date usando Intl.DateTimeFormat\n */\nfunction formatWithIntl(date: Date, options: DateFormatOptions): string {\n  const locale = options.locale || \"en-US\";\n  const formatOptions: Intl.DateTimeFormatOptions = {};\n\n  if (options.timeZone) {\n    formatOptions.timeZone = options.timeZone;\n  }\n\n  if (options.dateOnly) {\n    formatOptions.dateStyle = options.dateStyle || \"medium\";\n  } else if (options.timeOnly) {\n    formatOptions.timeStyle = options.timeStyle || \"medium\";\n  } else {\n    if (options.dateStyle) formatOptions.dateStyle = options.dateStyle;\n    if (options.timeStyle) formatOptions.timeStyle = options.timeStyle;\n  }\n\n  return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n}\n\n// =============================================================================\n// RELATIVE TIME HELPERS\n// =============================================================================\n\n/**\n * Formata diferença de tempo relativa (ex: \"2 hours ago\", \"in 3 days\")\n *\n * @param timestamp - Timestamp em milissegundos\n * @param options - Opções de formatação\n *\n * @example\n * formatRelative(Date.now() - 3600000, { locale: 'en-US' });\n * // '1 hour ago'\n */\nexport function formatRelative(\n  timestamp: DateTimestamp,\n  options?: { locale?: string; now?: DateTimestamp }\n): string {\n  const locale = options?.locale || \"en-US\";\n  const now = options?.now || Date.now();\n  const diff = timestamp - now;\n  const absDiff = Math.abs(diff);\n\n  // Escolhe a unidade apropriada\n  let value: number;\n  let unit: Intl.RelativeTimeFormatUnit;\n\n  if (absDiff < 60000) {\n    // < 1 minuto\n    value = Math.round(diff / 1000);\n    unit = \"second\";\n  } else if (absDiff < 3600000) {\n    // < 1 hora\n    value = Math.round(diff / 60000);\n    unit = \"minute\";\n  } else if (absDiff < 86400000) {\n    // < 1 dia\n    value = Math.round(diff / 3600000);\n    unit = \"hour\";\n  } else if (absDiff < 2592000000) {\n    // < 30 dias\n    value = Math.round(diff / 86400000);\n    unit = \"day\";\n  } else if (absDiff < 31536000000) {\n    // < 1 ano\n    value = Math.round(diff / 2592000000);\n    unit = \"month\";\n  } else {\n    value = Math.round(diff / 31536000000);\n    unit = \"year\";\n  }\n\n  const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n  return rtf.format(value, unit);\n}\n","/**\n * Currency Role - Constants\n *\n * Códigos de moeda, símbolos e configurações de formatação.\n *\n * Currency é sobre VALOR MONETÁRIO, não sobre tipos de moeda.\n * O código da moeda (BRL, USD, etc) é METADATA usado apenas para formatação.\n *\n * NÃO há conversão entre moedas - isso é operação de negócio com taxas externas.\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Códigos de moeda ISO 4217\n */\nexport type CurrencyCode =\n  // Major currencies\n  | \"USD\"\n  | \"EUR\"\n  | \"GBP\"\n  | \"JPY\"\n  | \"CHF\"\n  | \"CNY\"\n  | \"CAD\"\n  | \"AUD\"\n  // Latin America\n  | \"BRL\"\n  | \"MXN\"\n  | \"ARS\"\n  | \"CLP\"\n  | \"COP\"\n  // Other important\n  | \"INR\"\n  | \"KRW\"\n  | \"RUB\"\n  | \"TRY\"\n  | \"ZAR\";\n\n/**\n * Configuração de uma moeda para formatação\n */\nexport interface CurrencyConfig {\n  /** Código ISO 4217 */\n  code: CurrencyCode;\n  /** Símbolo da moeda */\n  symbol: string;\n  /** Nome singular */\n  singular: string;\n  /** Nome plural */\n  plural: string;\n  /** Casas decimais padrão */\n  decimals: number;\n  /** Símbolo vem antes do valor? */\n  symbolFirst: boolean;\n  /** Separador de milhares */\n  thousandsSeparator: string;\n  /** Separador decimal */\n  decimalSeparator: string;\n}\n\n// =============================================================================\n// CURRENCY CONFIGS\n// =============================================================================\n\n/**\n * Configuração de cada moeda para formatação\n */\nexport const CURRENCY_CONFIGS: Record<CurrencyCode, CurrencyConfig> = {\n  // ===========================================================================\n  // Major Currencies\n  // ===========================================================================\n  USD: {\n    code: \"USD\",\n    symbol: \"$\",\n    singular: \"US dollar\",\n    plural: \"US dollars\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  EUR: {\n    code: \"EUR\",\n    symbol: \"€\",\n    singular: \"euro\",\n    plural: \"euros\",\n    decimals: 2,\n    symbolFirst: false, // 100 € (europeu) ou €100 (varia)\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  GBP: {\n    code: \"GBP\",\n    symbol: \"£\",\n    singular: \"British pound\",\n    plural: \"British pounds\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  JPY: {\n    code: \"JPY\",\n    symbol: \"¥\",\n    singular: \"Japanese yen\",\n    plural: \"Japanese yen\",\n    decimals: 0, // Yen não tem centavos\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  CHF: {\n    code: \"CHF\",\n    symbol: \"CHF\",\n    singular: \"Swiss franc\",\n    plural: \"Swiss francs\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \"'\",\n    decimalSeparator: \".\",\n  },\n  CNY: {\n    code: \"CNY\",\n    symbol: \"¥\",\n    singular: \"Chinese yuan\",\n    plural: \"Chinese yuan\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  CAD: {\n    code: \"CAD\",\n    symbol: \"C$\",\n    singular: \"Canadian dollar\",\n    plural: \"Canadian dollars\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  AUD: {\n    code: \"AUD\",\n    symbol: \"A$\",\n    singular: \"Australian dollar\",\n    plural: \"Australian dollars\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n\n  // ===========================================================================\n  // Latin America\n  // ===========================================================================\n  BRL: {\n    code: \"BRL\",\n    symbol: \"R$\",\n    singular: \"Brazilian real\",\n    plural: \"Brazilian reais\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  MXN: {\n    code: \"MXN\",\n    symbol: \"$\",\n    singular: \"Mexican peso\",\n    plural: \"Mexican pesos\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  ARS: {\n    code: \"ARS\",\n    symbol: \"$\",\n    singular: \"Argentine peso\",\n    plural: \"Argentine pesos\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  CLP: {\n    code: \"CLP\",\n    symbol: \"$\",\n    singular: \"Chilean peso\",\n    plural: \"Chilean pesos\",\n    decimals: 0, // Peso chileno não tem centavos\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  COP: {\n    code: \"COP\",\n    symbol: \"$\",\n    singular: \"Colombian peso\",\n    plural: \"Colombian pesos\",\n    decimals: 0, // Peso colombiano praticamente não usa centavos\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n\n  // ===========================================================================\n  // Other Important\n  // ===========================================================================\n  INR: {\n    code: \"INR\",\n    symbol: \"₹\",\n    singular: \"Indian rupee\",\n    plural: \"Indian rupees\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  KRW: {\n    code: \"KRW\",\n    symbol: \"₩\",\n    singular: \"South Korean won\",\n    plural: \"South Korean won\",\n    decimals: 0, // Won não tem centavos\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  RUB: {\n    code: \"RUB\",\n    symbol: \"₽\",\n    singular: \"Russian ruble\",\n    plural: \"Russian rubles\",\n    decimals: 2,\n    symbolFirst: false,\n    thousandsSeparator: \" \",\n    decimalSeparator: \",\",\n  },\n  TRY: {\n    code: \"TRY\",\n    symbol: \"₺\",\n    singular: \"Turkish lira\",\n    plural: \"Turkish lira\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  ZAR: {\n    code: \"ZAR\",\n    symbol: \"R\",\n    singular: \"South African rand\",\n    plural: \"South African rand\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \" \",\n    decimalSeparator: \",\",\n  },\n};\n\n// =============================================================================\n// SYMBOL TO CODE MAPPING\n// =============================================================================\n\n/**\n * Mapeamento de símbolos para códigos de moeda\n * Usado no cast para detectar moeda a partir de string\n *\n * NOTA: Alguns símbolos são ambíguos ($ é usado por várias moedas)\n * O cast retorna apenas o valor numérico, não infere a moeda\n */\nexport const CURRENCY_SYMBOLS: Record<string, CurrencyCode[]> = {\n  $: [\"USD\", \"CAD\", \"AUD\", \"MXN\", \"ARS\", \"CLP\", \"COP\"],\n  \"€\": [\"EUR\"],\n  \"£\": [\"GBP\"],\n  \"¥\": [\"JPY\", \"CNY\"],\n  \"R$\": [\"BRL\"],\n  \"C$\": [\"CAD\"],\n  \"A$\": [\"AUD\"],\n  CHF: [\"CHF\"],\n  \"₹\": [\"INR\"],\n  \"₩\": [\"KRW\"],\n  \"₽\": [\"RUB\"],\n  \"₺\": [\"TRY\"],\n  R: [\"ZAR\"],\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todos os códigos de moeda */\nexport const CURRENCY_CODE_LIST = Object.keys(CURRENCY_CONFIGS) as CurrencyCode[];\n\n/**\n * Retorna configuração de uma moeda\n */\nexport function getCurrencyConfig(code: CurrencyCode): CurrencyConfig {\n  return CURRENCY_CONFIGS[code];\n}\n\n/**\n * Verifica se é um código de moeda válido\n */\nexport function isCurrencyCode(code: string): code is CurrencyCode {\n  return code.toUpperCase() in CURRENCY_CONFIGS;\n}\n","/**\n * Currency Role - Format Pillar\n *\n * Formata valores monetários para apresentação.\n * Usa metadata (código da moeda) para determinar formatação.\n *\n * @example\n * import { formatCurrency } from '@attrx/role-morphic/currency/format';\n *\n * formatCurrency(1500.50, { currency: 'BRL' });  // \"R$ 1.500,50\"\n * formatCurrency(1000, { currency: 'USD' });     // \"$1,000.00\"\n * formatCurrency(99.99, { currency: 'EUR' });    // \"99,99 €\"\n */\n\nimport {\n  CURRENCY_CONFIGS,\n  type CurrencyCode,\n  type CurrencyConfig,\n} from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface CurrencyFormatOptions {\n  /** Código da moeda (obrigatório) */\n  currency: CurrencyCode;\n  /** Casas decimais (default: decimais padrão da moeda) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Esconde símbolo, retorna só o número formatado */\n  hideSymbol?: boolean;\n  /** Força símbolo antes do valor */\n  symbolFirst?: boolean;\n  /** Usa Intl.NumberFormat com locale */\n  locale?: string;\n  /** Mostra sinal de positivo para valores positivos */\n  showPositiveSign?: boolean;\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor monetário para apresentação\n *\n * @param value - Valor numérico\n * @param options - Opções de formatação (currency obrigatório)\n * @returns String formatada\n *\n * @example\n * formatCurrency(1500.50, { currency: 'BRL' });                    // \"R$ 1.500,50\"\n * formatCurrency(1000, { currency: 'USD' });                       // \"$1,000.00\"\n * formatCurrency(99.99, { currency: 'EUR' });                      // \"99,99 €\"\n * formatCurrency(1500, { currency: 'JPY' });                       // \"¥1,500\"\n * formatCurrency(1500.50, { currency: 'BRL', verbose: true });     // \"1.500,50 Brazilian reais\"\n * formatCurrency(1500.50, { currency: 'BRL', hideSymbol: true });  // \"1.500,50\"\n * formatCurrency(1500.50, { currency: 'BRL', locale: 'pt-BR' });   // \"R$ 1.500,50\" (via Intl)\n */\nexport function formatCurrency(\n  value: number,\n  options: CurrencyFormatOptions\n): string {\n  const config = CURRENCY_CONFIGS[options.currency];\n\n  if (!config) {\n    throw new Error(`Unknown currency code: ${options.currency}`);\n  }\n\n  // Se locale especificado, usa Intl.NumberFormat\n  if (options.locale) {\n    return formatWithIntl(value, options, config);\n  }\n\n  // Formatação manual\n  return formatManual(value, options, config);\n}\n\n/**\n * Formata usando Intl.NumberFormat (mais preciso para i18n)\n */\nfunction formatWithIntl(\n  value: number,\n  options: CurrencyFormatOptions,\n  config: CurrencyConfig\n): string {\n  const decimals = options.decimals ?? config.decimals;\n\n  const intlOptions: Intl.NumberFormatOptions = {\n    style: options.hideSymbol ? \"decimal\" : \"currency\",\n    currency: config.code,\n    minimumFractionDigits: decimals,\n    maximumFractionDigits: decimals,\n  };\n\n  if (options.verbose) {\n    intlOptions.currencyDisplay = \"name\";\n  }\n\n  let formatted = new Intl.NumberFormat(options.locale, intlOptions).format(\n    value\n  );\n\n  if (options.showPositiveSign && value > 0) {\n    formatted = \"+\" + formatted;\n  }\n\n  return formatted;\n}\n\n/**\n * Formatação manual (mais controle, sem dependência de locale)\n */\nfunction formatManual(\n  value: number,\n  options: CurrencyFormatOptions,\n  config: CurrencyConfig\n): string {\n  const decimals = options.decimals ?? config.decimals;\n  const isNegative = value < 0;\n  const absValue = Math.abs(value);\n\n  // Formata o número\n  const formattedNumber = formatNumber(\n    absValue,\n    decimals,\n    config.thousandsSeparator,\n    config.decimalSeparator\n  );\n\n  // Monta o resultado\n  let result = \"\";\n\n  // Sinal\n  if (isNegative) {\n    result += \"-\";\n  } else if (options.showPositiveSign) {\n    result += \"+\";\n  }\n\n  // Símbolo e valor\n  if (options.hideSymbol) {\n    result += formattedNumber;\n  } else if (options.verbose) {\n    // Modo verbose: \"1.500,50 Brazilian reais\"\n    const name = absValue === 1 ? config.singular : config.plural;\n    result += `${formattedNumber} ${name}`;\n  } else {\n    // Modo normal com símbolo\n    const symbolFirst =\n      options.symbolFirst !== undefined\n        ? options.symbolFirst\n        : config.symbolFirst;\n\n    if (symbolFirst) {\n      result += `${config.symbol}${formattedNumber}`;\n    } else {\n      result += `${formattedNumber} ${config.symbol}`;\n    }\n  }\n\n  return result;\n}\n\n/**\n * Formata número com separadores\n */\nfunction formatNumber(\n  value: number,\n  decimals: number,\n  thousandsSeparator: string,\n  decimalSeparator: string\n): string {\n  // Fixa decimais\n  const fixed = value.toFixed(decimals);\n\n  // Separa inteiro e decimal\n  const [intPart, decPart] = fixed.split(\".\");\n\n  // Adiciona separador de milhares\n  const intFormatted = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSeparator);\n\n  // Junta com separador decimal\n  if (decimals > 0 && decPart) {\n    return `${intFormatted}${decimalSeparator}${decPart}`;\n  }\n\n  return intFormatted;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna apenas o símbolo da moeda\n *\n * @example\n * getCurrencySymbol('BRL');  // \"R$\"\n * getCurrencySymbol('USD');  // \"$\"\n */\nexport function getCurrencySymbol(code: CurrencyCode): string {\n  const config = CURRENCY_CONFIGS[code];\n  if (!config) {\n    throw new Error(`Unknown currency code: ${code}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome da moeda (singular ou plural)\n *\n * @example\n * getCurrencyName('BRL', 1);   // \"Brazilian real\"\n * getCurrencyName('BRL', 2);   // \"Brazilian reais\"\n */\nexport function getCurrencyName(code: CurrencyCode, count: number = 1): string {\n  const config = CURRENCY_CONFIGS[code];\n  if (!config) {\n    throw new Error(`Unknown currency code: ${code}`);\n  }\n  return count === 1 ? config.singular : config.plural;\n}\n\n/**\n * Retorna casas decimais padrão da moeda\n *\n * @example\n * getCurrencyDecimals('BRL');  // 2\n * getCurrencyDecimals('JPY');  // 0\n */\nexport function getCurrencyDecimals(code: CurrencyCode): number {\n  const config = CURRENCY_CONFIGS[code];\n  if (!config) {\n    throw new Error(`Unknown currency code: ${code}`);\n  }\n  return config.decimals;\n}\n"]}