@attrx/role-morphic 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -84
- package/dist/cast.d.mts +678 -0
- package/dist/cast.d.ts +678 -0
- package/dist/cast.js +3569 -0
- package/dist/cast.js.map +1 -0
- package/dist/cast.mjs +3536 -0
- package/dist/cast.mjs.map +1 -0
- package/dist/constants-BZdBwuvJ.d.mts +168 -0
- package/dist/constants-BZdBwuvJ.d.ts +168 -0
- package/dist/convert.d.mts +1157 -0
- package/dist/convert.d.ts +1157 -0
- package/dist/convert.js +2244 -0
- package/dist/convert.js.map +1 -0
- package/dist/convert.mjs +2148 -0
- package/dist/convert.mjs.map +1 -0
- package/dist/format-Be15LzfS.d.ts +668 -0
- package/dist/format-o4Y3jPH-.d.mts +668 -0
- package/dist/format.d.mts +3 -0
- package/dist/format.d.ts +3 -0
- package/dist/format.js +2303 -0
- package/dist/format.js.map +1 -0
- package/dist/format.mjs +2286 -0
- package/dist/format.mjs.map +1 -0
- package/dist/index.d.mts +200 -601
- package/dist/index.d.ts +200 -601
- package/dist/index.js +5536 -2493
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5349 -2494
- package/dist/index.mjs.map +1 -1
- package/dist/types-mbeS1e-k.d.mts +312 -0
- package/dist/types-mbeS1e-k.d.ts +312 -0
- package/dist/validate.d.mts +884 -0
- package/dist/validate.d.ts +884 -0
- package/dist/validate.js +713 -0
- package/dist/validate.js.map +1 -0
- package/dist/validate.mjs +669 -0
- package/dist/validate.mjs.map +1 -0
- package/package.json +21 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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.js","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"]}
|