@memberjunction/ng-record-process-studio 6.2.0-edge.0 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.d.ts +100 -10
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.d.ts.map +1 -1
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.js +246 -66
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.js.map +1 -1
- package/dist/lib/record-process-editor/record-process-editor.component.d.ts +10 -0
- package/dist/lib/record-process-editor/record-process-editor.component.d.ts.map +1 -1
- package/dist/lib/record-process-editor/record-process-editor.component.js +25 -5
- package/dist/lib/record-process-editor/record-process-editor.component.js.map +1 -1
- package/dist/lib/record-process-history/record-process-history.component.d.ts +10 -0
- package/dist/lib/record-process-history/record-process-history.component.d.ts.map +1 -1
- package/dist/lib/record-process-history/record-process-history.component.js +30 -10
- package/dist/lib/record-process-history/record-process-history.component.js.map +1 -1
- package/dist/lib/record-process-studio/record-process-studio.component.d.ts +12 -0
- package/dist/lib/record-process-studio/record-process-studio.component.d.ts.map +1 -1
- package/dist/lib/record-process-studio/record-process-studio.component.js +31 -7
- package/dist/lib/record-process-studio/record-process-studio.component.js.map +1 -1
- package/dist/lib/run-detail.d.ts +4 -0
- package/dist/lib/run-detail.d.ts.map +1 -1
- package/dist/lib/run-detail.js +10 -2
- package/dist/lib/run-detail.js.map +1 -1
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-pipeline-builder.component.js","sourceRoot":"","sources":["../../../src/lib/feature-pipeline-builder/feature-pipeline-builder.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,uBAAuB,EACvB,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,KAAK,EAGL,MAAM,EAEN,MAAM,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAA+B,QAAQ,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAEhG,OAAO,EAMH,qBAAqB,EACrB,YAAY,GAGf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;;;;;IAqCjC,kCAAyB;IAAA,YAAc;IAAA,iBAAS;;;IAAxC,iCAAgB;IAAC,cAAc;IAAd,iCAAc;;;;IAJ/C,AADJ,8BAAmB,YACR;IAAA,+BAAe;IAAA,iBAAQ;IAC9B,iCAA4G;IAArC,4MAAU,gCAAyB,KAAC;IACvG,kCAA0B;IAAA,oDAA0B;IAAA,iBAAS;IAC7D,qHAEC;IAET,AADI,iBAAS,EACP;;;IANuB,eAA6C;IAA7C,kEAA6C;IAElE,eAEC;IAFD,mCAEC;;;;IAOL,AADJ,8BAAmB,YACR;IAAA,wBAAQ;IAAA,iBAAQ;IACvB,iCAAyI;IAAvE,yMAAS,8BAAuB,KAAC;IACvG,AADI,iBAAyI,EACvI;;;IAD2B,eAAoC;IAApC,yDAAoC;;;IAuB7D,kCAAuB;IAAA,YAAY;IAAA,iBAAS;;;IAApC,+BAAc;IAAC,cAAY;IAAZ,+BAAY;;;IAMvC,AADJ,8BAAmB,YACR;IAAA,kCAAkB;IAAA,iBAAQ;IACjC,+BAA6B;IAAA,YAA6D;IAC9F,AAD8F,iBAAM,EAC9F;;;IAD2B,eAA6D;IAA7D,oFAA6D;;;IAO9F,AADJ,+BAA0B,YACf;IAAA,0CAA0B;IAAA,gCAAoB;IAAA,oEAA+C;IAAO,AAAP,iBAAO,EAAQ;IACnH,+BAA8B;IAAA,YAA+B;IACjE,AADiE,iBAAM,EACjE;;;IAD4B,eAA+B;IAA/B,sDAA+B;;;IAmBjE,+BAA+B;IAC3B,wBAAyC;IACzC,4BAAM;IAAA,0CAA0B;IAAA,8BAAQ;IAAA,0BAAU;IAAA,iBAAS;IAAC,4DAA2C;IAC3G,AAD2G,iBAAO,EAC5G;;;IAuC0B,kCAAyB;IAAA,YAA8C;IAAA,iBAAS;;;IAAxE,iCAAgB;IAAC,cAA8C;IAA9C,gFAA8C;;;;IAJ/E,AADJ,8BAAmB,YACR;IAAA,4BAAY;IAAA,iBAAQ;IAC3B,iCAA8G;IAA7C,+QAAU,2CAAiC,KAAC;IACzG,kCAA0B;IAAA,2CAAiB;IAAA,iBAAS;IACpD,0IAEC;IAET,AADI,iBAAS,EACP;;;;IANuB,eAAuC;IAAvC,yDAAuC;IAE5D,eAEC;IAFD,kCAEC;;;IAWG,kCAAyB;IAAA,YAA6B;IAAA,iBAAS;;;IAAvD,kCAAgB;IAAC,cAA6B;IAA7B,qDAA6B;;;;IAJ9D,AADJ,8BAAmB,YACR;IAAA,4BAAY;IAAA,iBAAQ;IAC3B,iCAA+G;IAAnD,gRAAU,iDAAuC,KAAC;IAC1G,kCAA0B;IAAA,2CAAiB;IAAA,iBAAS;IACpD,0IAEC;IAET,AADI,iBAAS,EACP;;;;IANuB,eAAkC;IAAlC,oDAAkC;IAEvD,eAEC;IAFD,uCAEC;;;;IAmBL,AADJ,8BAAmB,YACR;IAAA,gCAAgB;IAAA,iBAAQ;IAC/B,iCAA4H;IAAjD,gRAAU,+CAAqC,KAAC;IACvH,kCAAqB;IAAA,wBAAQ;IAAA,iBAAS;IACtC,kCAAqB;IAAA,kCAAkB;IAAA,iBAAS;IAChD,kCAAgC;IAAA,iCAAiB;IAEzD,AADI,AADqD,iBAAS,EACrD,EACP;;;IALuB,eAAiD;IAAjD,mEAAiD;;;;IAY9E,AADJ,+BAA0B,YACf;IAAA,gDAAgC;IAAA,iBAAQ;IAC/C,iCAAgK;IAA1F,6QAAS,0CAAgC,KAAC;IACpH,AADI,iBAAgK,EAC9J;;;;IADsB,eAA6C;IAA7C,sEAA6C;;;;IAMjE,AADJ,AADJ,+BAA8B,aACP,YACR;IAAA,yBAAS;IAAA,iBAAQ;IACxB,iCAA4H;IAA3C,6QAAS,0CAAgC,KAAC;IAC/H,AADI,iBAA4H,EAC1H;IAEF,AADJ,8BAAmB,YACR;IAAA,yBAAS;IAAA,iBAAQ;IACxB,iCAA4H;IAA3C,6QAAS,0CAAgC,KAAC;IAEnI,AADI,AADI,iBAA4H,EAC1H,EACJ;;;;IANwC,eAA0C;IAA1C,mEAA0C;IAI1C,eAA0C;IAA1C,mEAA0C;;;;IA1FxF,AADJ,AADJ,+BAA6B,cACI,SACrB;IAAA,YAA0D;IAAA,iBAAK;IACnE,kCAAyE;IAA/B,oOAAS,8BAAoB,KAAC;IACpE,wBAAiC;IAAC,wBACtC;IACJ,AADI,iBAAS,EACP;IAIE,AADJ,AADJ,8BAAuB,aACA,YACR;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,kCAAmI;IAArF,0OAAS,mCAAyB,MAAM,SAAS,KAAC;IACpG,AADI,iBAAmI,EACjI;IAEF,AADJ,+BAAmB,aACR;IAAA,gCAAe;IAAA,iBAAQ;IAC9B,kCAAwI;IAAtF,0OAAS,mCAAyB,KAAK,SAAS,KAAC;IACvG,AADI,iBAAwI,EACtI;IAEF,AADJ,+BAAmB,aACR;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,kCAAkG;IAA5C,6OAAU,0CAAgC,KAAC;IAC7F,mCAAsB;IAAA,sCAAqB;IAAA,iBAAS;IACpD,mCAAsB;IAAA,mCAAkB;IAAA,iBAAS;IACjD,mCAAqB;IAAA,qCAAoB;IAGrD,AADI,AADI,AAD6C,iBAAS,EAC7C,EACP,EACJ;IAGN,gCAA8B;IAC1B,wHAAsC;IAYtC,wHAAsC;IAclC,AADJ,+BAAmB,aACR;IAAA,gCAAe;IAAA,iBAAQ;IAC9B,kCAAqH;IAAhD,6OAAU,8CAAoC,KAAC;IAChH,mCAAqB;IAAA,qCAAoB;IAAA,iBAAS;IAClD,mCAAqB;IAAA,sCAAqB;IAAA,iBAAS;IACnD,mCAAwB;IAAA,kCAAiB;IAAA,iBAAS;IAClD,mCAAwB;IAAA,wBAAO;IAAA,iBAAS;IACxC,mCAAyB;IAAA,0BAAS;IAE1C,AADI,AADsC,iBAAS,EACtC,EACP;IAEN,yHAAyB;IAU7B,iBAAM;IAGN,yHAA0C;IAM1C,yHAA6C;IAYjD,iBAAM;;;;IA9FM,eAA0D;IAA1D,sFAA0D;IASlC,eAAqB;IAArB,uCAAqB;IAIhB,eAAoB;IAApB,sCAAoB;IAIxB,eAA4B;IAA5B,8CAA4B;IAUzD,eAUC;IAVD,8DAUC;IAED,cAUC;IAVD,8DAUC;IAK4B,eAA2C;IAA3C,qGAA2C;IASxE,gBASC;IATD,iDASC;IAIL,cAKC;IALD,0GAKC;IACD,cAWC;IAXD,6GAWC;;;IAjGb,+BAA8B;IAC1B,mIAkGC;IACL,iBAAM;;;IAnGF,cAkGC;IAlGD,kCAkGC;;;;IAyCG,AADJ,AADJ,+BAA8B,aACP,YACR;IAAA,kDAAkC;IAAA,iBAAQ;IACjD,iCAA8H;IAA1E,0MAAS,mCAA4B,KAAC;IAC9F,AADI,iBAA8H,EAC5H;IAEF,AADJ,8BAAmB,YACR;IAAA,mCAAmB;IAAA,iBAAQ;IAClC,iCAAkH;IAAjC,0MAAS,6BAAsB,KAAC;IACrH,AADI,iBAAkH,EAChH;IAEF,AADJ,8BAAmB,aACR;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,kCAAwG;IAApC,8MAAU,+BAAwB,KAAC;IACnG,mCAAyB;IAAA,oDAAmC;IAAA,iBAAS;IACrE,mCAAuB;IAAA,kEAAiD;IAGpF,AADI,AADI,AAD4E,iBAAS,EAC5E,EACP,EACJ;;;IAb0B,eAA2B;IAA3B,gDAA2B;IAIb,eAA0C;IAA1C,+DAA0C;IAIvD,eAA0C;IAA1C,+DAA0C;;;IAeiD,gCAAoB;IAAA,YAAoC;IAAA,iBAAO;;;IAA3C,cAAoC;IAApC,iEAAoC;;;IAAxK,AAAJ,0BAAI,aAAQ;IAAA,YAA2C;IAAA,iBAAS;IAAA,YAAoB;IAAA,wHAA+B;IAAkE,iBAAK;;;IAA9K,eAA2C;IAA3C,mEAA2C;IAAS,cAAoB;IAApB,iDAAoB;IAAA,cAAiG;IAAjG,sDAAiG;;;IAH7L,AADJ,+BAAoD,SAC5C;IAAA,wBAAgD;IAAC,qCAAoB;IAAA,iBAAK;IAC9E,0BAAI;IACA,kIAEC;IAET,AADI,iBAAK,EACH;;;IAJE,eAEC;IAFD,sCAEC;;AAmCzB,MAAM,OAAO,+BAAgC,SAAQ,oBAAoB;IAC7D,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE/B,MAAM,GAAiC,IAAI,CAAC;IAC5C,QAAQ,GAAkB,IAAI,CAAC;IAE9B,UAAU,GAAG,IAAI,YAAY,EAAmB,CAAC;IACjD,WAAW,GAAG,IAAI,YAAY,EAAW,CAAC;IAE7C,IAAI,GAAoB;QAC3B,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;KAChC,CAAC;IAEK,gBAAgB,GAAmB,EAAE,CAAC;IACtC,aAAa,GAAsB,EAAE,CAAC;IACtC,iBAAiB,GAAiB,EAAE,CAAC;IACrC,YAAY,GAAsB,EAAE,CAAC;IACrC,cAAc,GAAwB,IAAI,CAAC;IAE3C,WAAW,GAAoC,QAAQ,CAAC;IACxD,SAAS,GAAG,EAAE,CAAC;IACf,iBAAiB,GAAG,EAAE,CAAC;IACvB,gBAAgB,GAA0B,EAAE,CAAC;IAC7C,yBAAyB,GAAG,EAAE,CAAC;IAEtC,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,CACnE,CAAC;QACF,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,OAAsB;QAC9B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC;IACL,CAAC;IAEM,cAAc;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAEhD,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,aAAa,CAAkB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACzE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACvC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;oBACzC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;oBAC3D,IAAI,CAAC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC;gBACnE,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExE,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAC9D,IAAI,cAAc,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC7D,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;QAC7G,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,WAAW;QACrB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAe;gBACvC,UAAU,EAAE,gBAAgB;gBAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC;gBACrC,UAAU,EAAE,QAAQ;aACvB,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC3B,QAAQ,CAAC,8BAA8B,GAAG,CAAC,YAAY,IAAI,eAAe,EAAE,CAAC,CAAC;YAClF,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,QAAQ,CAAC,0BAA0B,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc;QACxB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAkB;gBAC1C,UAAU,EAAE,sBAAsB;gBAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC;gBAClC,UAAU,EAAE,QAAQ;aACvB,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,QAAQ,CAAC,oCAAoC,GAAG,CAAC,YAAY,IAAI,eAAe,EAAE,CAAC,CAAC;YACxF,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,QAAQ,CAAC,gCAAgC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAEM,mBAAmB,CAAC,KAAY;QACnC,IAAI,CAAC,WAAW,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAwC,CAAC;QAChG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,iBAAiB,CAAC,KAAY;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QAC/E,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,eAAe,CAAC,KAAY;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrE,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,iBAAiB,CAAC,KAAY;QACjC,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG;aACzB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,cAAc,CAAC,KAAY;QAC9B,MAAM,QAAQ,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QAC3D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;QAC5F,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,SAAS;QACZ,MAAM,SAAS,GAAsB;YACjC,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9C,GAAG,EAAE,GAAG;YACR,MAAM,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;aACjF;SACJ,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,YAAY,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,IAAoB,EAAE,KAAY;QACrE,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,MAAM,IAAI,GAAI,KAAK,CAAC,MAA4B,CAAC,KAA6B,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,GAAG;gBACb,IAAI,EAAE,OAAO;gBACb,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;aACjF,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,GAAG;gBACb,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACnF,WAAW,EAAE,UAAU;gBACvB,GAAG,EAAE,EAAE;aACV,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,GAAG;gBACb,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,EAAE;aAChB,CAAC;QACN,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,iBAAiB,CAAC,KAAa,EAAE,KAAY;QAChD,MAAM,SAAS,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,eAAe,GAAG,SAAS,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,uBAAuB,CAAC,KAAa,EAAE,KAAY;QACtD,MAAM,UAAU,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,oBAAoB,CAAC,KAAa,EAAE,KAAY;QACnD,MAAM,IAAI,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAC1E,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACnF,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACjE,CAAC;aAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,qBAAqB,CAAC,KAAa,EAAE,KAAY;QACpD,MAAM,MAAM,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAwB,CAAC;QAC5E,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,gBAAgB,CAAC,UAA4B;QAChD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjF,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAEM,aAAa,CAAC,UAA4B;QAC7C,OAAO,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7G,CAAC;IAEM,aAAa,CAAC,UAA4B;QAC7C,OAAO,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7G,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1D,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG;aACzB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,MAAM,GAAG,GAAG,UAAU,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,MAAM,GAAG,GAAG,UAAU,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,uBAAuB,CAAC,KAAY;QACvC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAmD,CAAC;QAC5H,CAAC;IACL,CAAC;IAEM,mBAAmB,CAAC,KAAY;QACnC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,aAAa,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,KAAK,MAAM,CAAC;QACrF,CAAC;IACL,CAAC;IAEM,eAAe,CAAC,KAAY;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,KAAK,MAAM,CAAC;QACnF,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,oBAAoB,CAAC,KAAY;QACpC,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrD,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG;aAC5B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,cAAc,CAAC,KAAY;QAC9B,MAAM,GAAG,GAAG,QAAQ,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;QACxD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,gBAAgB,CAAC,KAAY;QAChC,MAAM,GAAG,GAAI,KAAK,CAAC,MAA4B,CAAC,KAA8B,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC;QAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEO,WAAW;QACf,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACK,yBAAyB;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,MAAM,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YACjD,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEO,mBAAmB;QACvB,IAAI,CAAC,yBAAyB,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClG,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,IAAI,GAAuB;gBAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,aAAa,EAAE,CAAC,CAAC,aAAa;oBAC9B,eAAe,EAAE,CAAC,CAAC,eAAe;oBAClC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC1H,CAAC,CAAC;aACN,CAAC;YACF,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAClD,CAAC,CAAC,CAAC;wBACC,IAAI,EAAE,SAAS;wBACf,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,kDAAkD;wBAC3D,iBAAiB,EAAE,mDAAmD;qBACzE,CAAC;gBACF,CAAC,CAAC,EAAE,CAAC;QACb,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC5E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;ySApaQ,+BAA+B,yBAA/B,+BAA+B;6DAA/B,+BAA+B;YApSxB,AADJ,AADJ,AAFJ,8BAAiB,iBAEY,aACE,cACD;YAAA,iBAAC;YAAA,iBAAO;YAC1B,0BAAI;YAAA,8BAAc;YACtB,AADsB,iBAAK,EACrB;YACN,4BAAoB;YAAA,gHAAgG;YAAA,iBAAI;YAIhH,AADJ,AADJ,8BAAuB,cACA,aACR;YAAA,6BAAY;YAAA,iBAAQ;YAC3B,kCAAsF;YAAvC,qHAAU,+BAA2B,IAAC;YACjF,kCAAuB;YAAA,8BAAa;YAAA,iBAAS;YAC7C,kCAAyB;YAAA,2CAA0B;YAAA,iBAAS;YAC5D,mCAAsB;YAAA,wCAAuB;YAErD,AADI,AADiD,iBAAS,EACjD,EACP;YAEN,mGAAkC;YAYlC,mGAA+B;YAQ3B,AADJ,+BAAmB,aACR;YAAA,wCAAuB;YAAA,iBAAQ;YACtC,kCAA8H;YAAlF,kHAAS,6BAAyB,IAAC;YAG3F,AADI,AADI,AADI,iBAA8H,EAC5H,EACJ,EACA;YAKF,AADJ,AADJ,mCAAyB,cACE,eACD;YAAA,kBAAC;YAAA,iBAAO;YAC1B,2BAAI;YAAA,0BAAS;YACjB,AADiB,iBAAK,EAChB;YAGE,AADJ,AADJ,gCAAuB,cACA,aACR;YAAA,uBAAM;YAAA,iBAAQ;YACrB,kCAA4F;YAAlC,qHAAU,0BAAsB,IAAC;YACvF,mCAA0B;YAAA,+CAAoB;YAAA,iBAAS;YACvD,wGAEC;YAET,AADI,iBAAS,EACP;YACN,mGAAsB;YAM1B,iBAAM;YAEN,oGAAiC;YAMrC,iBAAU;YAME,AADJ,AADJ,AADJ,mCAAyB,eACc,eACF,eACP;YAAA,kBAAC;YAAA,iBAAO;YAC1B,2BAAI;YAAA,sCAAqB;YAC7B,AAD6B,iBAAK,EAC5B;YACN,mCAAqE;YAAtB,6GAAS,eAAW,IAAC;YAChE,yBAAgC;YAAC,6BACrC;YACJ,AADI,iBAAS,EACP;YACN,6BAAoB;YAAA,+HAA8G;YAAA,iBAAI;YAOpI,AALF,oGAAkD,8EAKzC;YAuGb,iBAAU;YAKF,AADJ,AADJ,mCAAyB,cACE,eACD;YAAA,kBAAC;YAAA,iBAAO;YAC1B,2BAAI;YAAA,qCAAoB;YAC5B,AAD4B,iBAAK,EAC3B;YAGE,AADJ,AADJ,+BAAuB,cACA,aACR;YAAA,mCAAkB;YAAA,iBAAQ;YACjC,kCAAsH;YAA3C,qHAAU,mCAA+B,IAAC;YACjH,mCAAyB;YAAA,sDAAqC;YAAA,iBAAS;YACvE,mCAA0B;YAAA,uDAAsC;YAAA,iBAAS;YACzE,mCAAqB;YAAA,kDAAiC;YAE9D,AADI,AAD0D,iBAAS,EAC1D,EACP;YAGF,AADJ,+BAAmB,aACR;YAAA,uCAAsB;YAAA,iBAAQ;YACrC,kCAAmH;YAAvC,qHAAU,+BAA2B,IAAC;YAC9G,mCAAqB;YAAA,+CAAyB;YAAA,iBAAS;YACvD,mCAAsB;YAAA,+CAAyB;YAEvD,AADI,AADmD,iBAAS,EACnD,EACP;YAGF,AADJ,+BAAmB,aACR;YAAA,oCAAmB;YAAA,iBAAQ;YAClC,kCAAgH;YAAnC,qHAAU,2BAAuB,IAAC;YAC3G,mCAAqB;YAAA,yDAAmC;YAAA,iBAAS;YACjE,mCAAsB;YAAA,0CAAoB;YAGtD,AADI,AADI,AAD8C,iBAAS,EAC9C,EACP,EACJ;YAEN,qGAA8B;YAmBlC,iBAAU;YAGV,oGAAmC;YAUvC,iBAAM;;YA7PmC,gBAAqB;YAArB,uCAAqB;YAOlD,eAUC;YAVD,0DAUC;YAED,cAKC;YALD,uDAKC;YAI2B,eAAmB;YAAnB,qCAAmB;YAclB,gBAAgC;YAAhC,+EAAgC;YAErD,eAEC;YAFD,mCAEC;YAGT,eAKC;YALD,8CAKC;YAGL,cAKC;YALD,yDAKC;YAgBD,gBA2GC;YA3GD,8EA2GC;YAYgC,gBAAiD;YAAjD,gGAAiD;YASjD,gBAAkD;YAAlD,iGAAkD;YAQlD,eAAmD;YAAnD,qEAAmD;YAOpF,eAkBC;YAlBD,sDAkBC;YAIL,cASC;YATD,2DASC;4BA1QC,YAAY,EAAE,WAAW,iDAAE,iBAAiB;;iFA0S7C,+BAA+B;cA9S3C,SAAS;2BACI,6BAA6B,cAC3B,IAAI,mBACC,uBAAuB,CAAC,MAAM,WACtC,CAAC,YAAY,EAAE,WAAW,EAAE,iBAAiB,CAAC,YAC7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2QT;;kBAiCA,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kFAPE,+BAA+B","sourcesContent":["/**\n * @fileoverview Visual authoring component for a Feature Pipeline (Infer Record Process).\n * Configures the DataFeatureSpec (Context, Outputs & Constraints, Caching) and binds\n * prompt, output mapping, and watermark strategy directly on the MJRecordProcessEntity.\n *\n * @module @memberjunction/ng-record-process-studio\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityInfo, EntityFieldInfo, LogError, RunView, UserInfo } from '@memberjunction/core';\nimport { MJRecordProcessEntity, MJAIPromptEntity, MJEntityDocumentEntity } from '@memberjunction/core-entities';\nimport {\n DataFeatureSpec,\n DataFeatureOutput,\n ValueConstraint,\n OutputTarget,\n ViolationPolicy,\n renderConstraintBlock,\n validateSpec,\n type SpecValidationIssue,\n type EntityMetadataStub,\n} from '@memberjunction/feature-pipelines';\nimport { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\n\nexport type PromptOption = Pick<MJAIPromptEntity, 'ID' | 'Name' | 'Description'>;\n\nexport type EntityDocOption = Pick<MJEntityDocumentEntity, 'ID' | 'Name' | 'EntityID'>;\n\n@Component({\n selector: 'mj-feature-pipeline-builder',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, MJButtonDirective],\n template: `\n <div class=\"fpb\">\n <!-- STAGE 1: CONTEXT SOURCE -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">1</span>\n <h3>Context Source</h3>\n </div>\n <p class=\"rpe-desc\">Choose how data from each record is extracted and formatted before being sent to the LLM prompt.</p>\n\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Context Mode</label>\n <select class=\"mj-input\" [value]=\"contextMode\" (change)=\"onContextModeChange($event)\">\n <option value=\"fields\">Record Fields</option>\n <option value=\"document\">Entity Document (Template)</option>\n <option value=\"query\">Query (Graph Traversal)</option>\n </select>\n </div>\n\n @if (contextMode === 'document') {\n <div class=\"field\">\n <label>Entity Document</label>\n <select class=\"mj-input\" [value]=\"spec.Context.EntityDocumentID || ''\" (change)=\"onEntityDocChange($event)\">\n <option value=\"\" disabled>— Select Entity Document —</option>\n @for (doc of availableDocs; track doc.ID) {\n <option [value]=\"doc.ID\">{{ doc.Name }}</option>\n }\n </select>\n </div>\n }\n\n @if (contextMode === 'query') {\n <div class=\"field\">\n <label>Query ID</label>\n <input class=\"mj-input mono\" [value]=\"spec.Context.QueryID || ''\" (input)=\"onQueryIDChange($event)\" placeholder=\"UUID of approved Query\">\n </div>\n }\n\n <div class=\"field\">\n <label>Field Filter (optional)</label>\n <input class=\"mj-input\" [value]=\"fieldsCsv\" (input)=\"onFieldsCsvChange($event)\" placeholder=\"e.g. FirstName, LastName, Title\">\n </div>\n </div>\n </section>\n\n <!-- STAGE 2: PROMPT & INJECTED CONSTRAINTS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">2</span>\n <h3>AI Prompt</h3>\n </div>\n <div class=\"rpe-grid2\">\n <div class=\"field\">\n <label>Prompt</label>\n <select class=\"mj-input\" [value]=\"Record?.PromptID || ''\" (change)=\"onPromptChange($event)\">\n <option value=\"\" disabled>— Select AI Prompt —</option>\n @for (p of availablePrompts; track p.ID) {\n <option [value]=\"p.ID\">{{ p.Name }}</option>\n }\n </select>\n </div>\n @if (selectedPrompt) {\n <div class=\"field\">\n <label>Prompt Description</label>\n <div class=\"rpe-static-text\">{{ selectedPrompt.Description || 'No description provided' }}</div>\n </div>\n }\n </div>\n\n @if (renderedConstraintPreview) {\n <div class=\"field rpe-mt\">\n <label>Injected Constraint Block <span class=\"muted\">— automatically appended to prompt instructions</span></label>\n <pre class=\"fpb-code-preview\">{{ renderedConstraintPreview }}</pre>\n </div>\n }\n </section>\n\n <!-- STAGE 3: OUTPUTS & CONSTRAINTS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h fpb-split-h\">\n <div class=\"fpb-title-group\">\n <span class=\"num\">3</span>\n <h3>Outputs & Constraints</h3>\n </div>\n <button mjButton size=\"sm\" variant=\"secondary\" (click)=\"addOutput()\">\n <i class=\"fa-solid fa-plus\"></i> Add Output\n </button>\n </div>\n <p class=\"rpe-desc\">Define the structured outputs produced by the LLM, their type constraints, and target write-back destinations.</p>\n\n @if (!spec.Outputs || spec.Outputs.length === 0) {\n <div class=\"fpb-empty-outputs\">\n <i class=\"fa-solid fa-arrow-turn-up\"></i>\n <span>No outputs defined. Click <strong>Add Output</strong> to configure at least one output attribute.</span>\n </div>\n } @else {\n <div class=\"fpb-outputs-list\">\n @for (output of spec.Outputs; track $index) {\n <div class=\"fpb-output-card\">\n <div class=\"fpb-output-head\">\n <h4>Output #{{ $index + 1 }}: {{ output.Name || '(unnamed)' }}</h4>\n <button mjButton size=\"sm\" variant=\"flat\" (click)=\"removeOutput($index)\">\n <i class=\"fa-solid fa-trash\"></i> Remove\n </button>\n </div>\n\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Output Name</label>\n <input class=\"mj-input\" [value]=\"output.Name\" (input)=\"updateOutputProp($index, 'Name', $event)\" placeholder=\"e.g. SentimentScore\">\n </div>\n <div class=\"field\">\n <label>JSON Path / Ref</label>\n <input class=\"mj-input mono\" [value]=\"output.Ref\" (input)=\"updateOutputProp($index, 'Ref', $event)\" placeholder=\"e.g. $.sentiment or $\">\n </div>\n <div class=\"field\">\n <label>Target Mode</label>\n <select class=\"mj-input\" [value]=\"output.Target.Mode\" (change)=\"updateTargetMode($index, $event)\">\n <option value=\"field\">Entity Column (field)</option>\n <option value=\"child\">Child Rows (child)</option>\n <option value=\"tags\">Taxonomy Tags (tags)</option>\n </select>\n </div>\n </div>\n\n <!-- Target details -->\n <div class=\"rpe-grid3 rpe-mt\">\n @if (output.Target.Mode === 'field') {\n <div class=\"field\">\n <label>Target Field</label>\n <select class=\"mj-input\" [value]=\"output.Target.EntityFieldName\" (change)=\"updateFieldTarget($index, $event)\">\n <option value=\"\" disabled>— Select Column —</option>\n @for (f of entityFields; track f.Name) {\n <option [value]=\"f.Name\">{{ f.DisplayName || f.Name }} ({{ f.TSType }})</option>\n }\n </select>\n </div>\n }\n\n @if (output.Target.Mode === 'child') {\n <div class=\"field\">\n <label>Child Entity</label>\n <select class=\"mj-input\" [value]=\"output.Target.EntityName\" (change)=\"updateChildTargetEntity($index, $event)\">\n <option value=\"\" disabled>— Select Entity —</option>\n @for (e of availableEntities; track e.ID) {\n <option [value]=\"e.Name\">{{ e.DisplayName || e.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Constraint details -->\n <div class=\"field\">\n <label>Constraint Type</label>\n <select class=\"mj-input\" [value]=\"output.Constraint?.Type || 'none'\" (change)=\"updateConstraintType($index, $event)\">\n <option value=\"none\">None / Unconstrained</option>\n <option value=\"enum\">Enum (Allowed Values)</option>\n <option value=\"numeric\">Numeric (Min/Max)</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"freetext\">Free Text</option>\n </select>\n </div>\n\n @if (output.Constraint) {\n <div class=\"field\">\n <label>Violation Policy</label>\n <select class=\"mj-input\" [value]=\"output.Constraint.OnViolation || 'fail'\" (change)=\"updateViolationPolicy($index, $event)\">\n <option value=\"fail\">Fail Row</option>\n <option value=\"null\">Set Output to Null</option>\n <option value=\"coerce-to-other\">Coerce / Fallback</option>\n </select>\n </div>\n }\n </div>\n\n <!-- Constraint params -->\n @if (output.Constraint?.Type === 'enum') {\n <div class=\"field rpe-mt\">\n <label>Allowed Values (comma separated)</label>\n <input class=\"mj-input\" [value]=\"getEnumValuesCsv(output.Constraint)\" (input)=\"updateEnumValues($index, $event)\" placeholder=\"e.g. Positive, Neutral, Negative\">\n </div>\n }\n @if (output.Constraint?.Type === 'numeric') {\n <div class=\"rpe-grid2 rpe-mt\">\n <div class=\"field\">\n <label>Min Value</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"getNumericMin(output.Constraint)\" (input)=\"updateNumericMin($index, $event)\">\n </div>\n <div class=\"field\">\n <label>Max Value</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"getNumericMax(output.Constraint)\" (input)=\"updateNumericMax($index, $event)\">\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </section>\n\n <!-- STAGE 4: MATERIALIZATION & WATERMARK -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">4</span>\n <h3>Caching & Watermarks</h3>\n </div>\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Watermark Strategy</label>\n <select class=\"mj-input\" [value]=\"Record?.WatermarkStrategy || 'Checksum'\" (change)=\"updateWatermarkStrategy($event)\">\n <option value=\"Checksum\">Checksum (Content Hash + Prompt Hash)</option>\n <option value=\"UpdatedAt\">UpdatedAt (Compare modified timestamp)</option>\n <option value=\"None\">None (Always process all records)</option>\n </select>\n </div>\n\n <div class=\"field\">\n <label>Skip Unchanged Records</label>\n <select class=\"mj-input\" [value]=\"Record?.SkipUnchanged ? 'true' : 'false'\" (change)=\"updateSkipUnchanged($event)\">\n <option value=\"true\">Yes — Skip unchanged rows</option>\n <option value=\"false\">No — Recompute every time</option>\n </select>\n </div>\n\n <div class=\"field\">\n <label>Enable Result Cache</label>\n <select class=\"mj-input\" [value]=\"spec.Caching.Cacheable ? 'true' : 'false'\" (change)=\"updateCacheable($event)\">\n <option value=\"true\">Yes — Cache outputs by distinct key</option>\n <option value=\"false\">No — Compute per row</option>\n </select>\n </div>\n </div>\n\n @if (spec.Caching.Cacheable) {\n <div class=\"rpe-grid3 rpe-mt\">\n <div class=\"field\">\n <label>Cache Key Fields (comma separated)</label>\n <input class=\"mj-input\" [value]=\"cacheKeyFieldsCsv\" (input)=\"updateCacheKeyFields($event)\" placeholder=\"e.g. CurrentJobTitle\">\n </div>\n <div class=\"field\">\n <label>Cache TTL (Seconds)</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"spec.Caching.TTLSeconds ?? 86400\" (input)=\"updateCacheTTL($event)\">\n </div>\n <div class=\"field\">\n <label>Cache Scope</label>\n <select class=\"mj-input\" [value]=\"spec.Caching.Scope || 'pipeline'\" (change)=\"updateCacheScope($event)\">\n <option value=\"pipeline\">Pipeline (Isolated to this process)</option>\n <option value=\"prompt\">Prompt (Shared across processes with same prompt)</option>\n </select>\n </div>\n </div>\n }\n </section>\n\n <!-- VALIDATION ISSUES -->\n @if (validationErrors.length > 0) {\n <div class=\"fpb-issues-card fpb-issues-card--error\">\n <h4><i class=\"fa-solid fa-triangle-exclamation\"></i> Specification Issues</h4>\n <ul>\n @for (issue of validationErrors; track $index) {\n <li><strong>{{ issue.Field ? issue.Field + ': ' : '' }}</strong>{{ issue.Message }} @if (issue.FixRecommendation) { <span class=\"muted\">(Fix: {{ issue.FixRecommendation }})</span> }</li>\n }\n </ul>\n </div>\n }\n </div>\n `,\n styles: [`\n .fpb { display: flex; flex-direction: column; gap: 20px; }\n .rpe-desc { font-size: 13px; color: var(--mj-text-secondary); margin: -6px 0 16px 0; }\n .rpe-sec { background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-subtle); border-radius: var(--mj-radius-md, 10px); padding: 18px 20px; }\n .rpe-sec-h { display: flex; align-items: center; gap: 11px; margin-bottom: 14px; }\n .rpe-sec-h h3 { margin: 0; font-size: 16px; font-weight: 700; color: var(--mj-text-primary); }\n .rpe-sec-h .num { width: 24px; height: 24px; border-radius: 50%; background: var(--mj-brand-primary); color: #fff; display: grid; place-items: center; font-size: 12px; font-weight: 800; }\n .fpb-split-h { justify-content: space-between; }\n .fpb-title-group { display: flex; align-items: center; gap: 11px; }\n .rpe-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n .rpe-grid3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }\n .field { display: flex; flex-direction: column; gap: 6px; }\n .field label { font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); }\n .rpe-mt { margin-top: 14px; }\n .mono { font-family: monospace; font-size: 12.5px; }\n .muted { color: var(--mj-text-muted); font-weight: 400; }\n .rpe-static-text { font-size: 13px; color: var(--mj-text-muted); padding: 7px 0; }\n .fpb-code-preview { background: var(--mj-bg-surface-sunken, #0f172a); color: var(--mj-text-code, var(--mj-text-primary, #e2e8f0)); border: 1px solid var(--mj-border-subtle, #334155); padding: 12px; border-radius: 6px; font-size: 12px; font-family: var(--mj-font-mono, monospace); white-space: pre-wrap; word-break: break-word; max-height: 160px; overflow-y: auto; margin: 0; }\n .fpb-empty-outputs { display: flex; align-items: center; gap: 10px; padding: 20px; border: 1px dashed var(--mj-border-subtle); border-radius: 8px; color: var(--mj-text-muted); font-size: 13px; }\n .fpb-outputs-list { display: flex; flex-direction: column; gap: 16px; }\n .fpb-output-card { border: 1px solid var(--mj-border-subtle); border-radius: 8px; padding: 14px 16px; background: var(--mj-bg-surface); }\n .fpb-output-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; border-bottom: 1px solid var(--mj-border-subtle); padding-bottom: 8px; }\n .fpb-output-head h4 { margin: 0; font-size: 14px; font-weight: 600; }\n .fpb-issues-card { border-radius: 8px; padding: 12px 16px; font-size: 13px; }\n .fpb-issues-card--error { background: rgba(239, 68, 68, 0.08); border: 1px solid var(--mj-status-error); color: var(--mj-status-error-text); }\n .fpb-issues-card h4 { margin: 0 0 8px 0; font-size: 14px; display: flex; align-items: center; gap: 8px; }\n .fpb-issues-card ul { margin: 0; padding-left: 20px; }\n `],\n})\nexport class FeaturePipelineBuilderComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() Record: MJRecordProcessEntity | null = null;\n @Input() EntityID: string | null = null;\n\n @Output() SpecChange = new EventEmitter<DataFeatureSpec>();\n @Output() ValidChange = new EventEmitter<boolean>();\n\n public spec: DataFeatureSpec = {\n Name: '',\n Description: '',\n PromptID: '',\n Context: {},\n Outputs: [],\n Caching: { Cacheable: false },\n };\n\n public availablePrompts: PromptOption[] = [];\n public availableDocs: EntityDocOption[] = [];\n public availableEntities: EntityInfo[] = [];\n public entityFields: EntityFieldInfo[] = [];\n public selectedPrompt: PromptOption | null = null;\n\n public contextMode: 'fields' | 'document' | 'query' = 'fields';\n public fieldsCsv = '';\n public cacheKeyFieldsCsv = '';\n public validationErrors: SpecValidationIssue[] = [];\n public renderedConstraintPreview = '';\n\n async ngOnInit(): Promise<void> {\n this.availableEntities = [...this.ProviderToUse.Entities].sort((a, b) =>\n (a.DisplayName || a.Name).localeCompare(b.DisplayName || b.Name)\n );\n await this.loadPrompts();\n await this.loadEntityDocs();\n this.syncFromRecord();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Record'] || changes['EntityID']) {\n this.syncFromRecord();\n }\n }\n\n public syncFromRecord(): void {\n if (this.Record) {\n this.spec.Name = this.Record.Name || '';\n this.spec.Description = this.Record.Description || '';\n this.spec.PromptID = this.Record.PromptID || '';\n\n if (this.Record.Configuration) {\n const parsed = SafeJSONParse<DataFeatureSpec>(this.Record.Configuration);\n if (parsed && typeof parsed === 'object') {\n this.spec.Outputs = Array.isArray(parsed.Outputs) ? parsed.Outputs : [];\n this.spec.Context = parsed.Context ?? {};\n this.spec.Caching = parsed.Caching ?? { Cacheable: false };\n this.spec.ProcessorExtensionKey = parsed.ProcessorExtensionKey;\n }\n }\n }\n\n if (!this.spec.Outputs) {\n this.spec.Outputs = [];\n }\n if (!this.spec.Context) {\n this.spec.Context = {};\n }\n\n if (this.spec.Context.EntityDocumentID) {\n this.contextMode = 'document';\n } else if (this.spec.Context.QueryID) {\n this.contextMode = 'query';\n } else {\n this.contextMode = 'fields';\n }\n\n this.fieldsCsv = (this.spec.Context.Fields ?? []).join(', ');\n this.cacheKeyFieldsCsv = (this.spec.Caching.KeyFields ?? []).join(', ');\n\n const targetEntityID = this.Record?.EntityID || this.EntityID;\n if (targetEntityID) {\n const entity = this.ProviderToUse.EntityByID(targetEntityID);\n this.entityFields = entity?.Fields ? [...entity.Fields].sort((a, b) => a.Name.localeCompare(b.Name)) : [];\n } else {\n this.entityFields = [];\n }\n\n if (this.Record?.PromptID) {\n this.selectedPrompt = this.availablePrompts.find((p) => UUIDsEqual(p.ID, this.Record?.PromptID)) ?? null;\n }\n\n this.recomputeValidation();\n this.cdr.detectChanges();\n }\n\n private async loadPrompts(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<PromptOption>({\n EntityName: 'MJ: AI Prompts',\n Fields: ['ID', 'Name', 'Description'],\n ResultType: 'simple',\n });\n if (res.Success && Array.isArray(res.Results)) {\n this.availablePrompts = res.Results;\n } else {\n this.availablePrompts = [];\n LogError(`Failed to load AI Prompts: ${res.ErrorMessage || 'unknown error'}`);\n }\n } catch (error) {\n this.availablePrompts = [];\n LogError('Error loading AI Prompts', undefined, error);\n }\n }\n\n private async loadEntityDocs(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<EntityDocOption>({\n EntityName: 'MJ: Entity Documents',\n Fields: ['ID', 'Name', 'EntityID'],\n ResultType: 'simple',\n });\n if (res.Success && Array.isArray(res.Results)) {\n this.availableDocs = res.Results;\n } else {\n this.availableDocs = [];\n LogError(`Failed to load Entity Documents: ${res.ErrorMessage || 'unknown error'}`);\n }\n } catch (error) {\n this.availableDocs = [];\n LogError('Error loading Entity Documents', undefined, error);\n }\n }\n\n public onContextModeChange(event: Event): void {\n this.contextMode = (event.target as HTMLSelectElement).value as 'fields' | 'document' | 'query';\n if (!this.spec.Context) this.spec.Context = {};\n if (this.contextMode === 'fields') {\n this.spec.Context.EntityDocumentID = undefined;\n this.spec.Context.QueryID = undefined;\n } else if (this.contextMode === 'document') {\n this.spec.Context.QueryID = undefined;\n } else if (this.contextMode === 'query') {\n this.spec.Context.EntityDocumentID = undefined;\n }\n this.emitChanges();\n }\n\n public onEntityDocChange(event: Event): void {\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.EntityDocumentID = (event.target as HTMLSelectElement).value;\n this.emitChanges();\n }\n\n public onQueryIDChange(event: Event): void {\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.QueryID = (event.target as HTMLInputElement).value;\n this.emitChanges();\n }\n\n public onFieldsCsvChange(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.fieldsCsv = val;\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.Fields = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n public onPromptChange(event: Event): void {\n const promptID = (event.target as HTMLSelectElement).value;\n if (this.Record) {\n this.Record.PromptID = promptID;\n }\n this.spec.PromptID = promptID;\n this.selectedPrompt = this.availablePrompts.find((p) => UUIDsEqual(p.ID, promptID)) ?? null;\n this.emitChanges();\n }\n\n public addOutput(): void {\n const newOutput: DataFeatureOutput = {\n Name: `Output_${this.spec.Outputs.length + 1}`,\n Ref: '$',\n Target: {\n Mode: 'field',\n EntityFieldName: this.entityFields.length > 0 ? this.entityFields[0].Name : '',\n },\n };\n this.spec.Outputs.push(newOutput);\n this.emitChanges();\n }\n\n public removeOutput(index: number): void {\n this.spec.Outputs.splice(index, 1);\n this.emitChanges();\n }\n\n public updateOutputProp(index: number, prop: 'Name' | 'Ref', event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.spec.Outputs[index][prop] = val;\n this.emitChanges();\n }\n\n public updateTargetMode(index: number, event: Event): void {\n const mode = (event.target as HTMLSelectElement).value as OutputTarget['Mode'];\n const current = this.spec.Outputs[index];\n if (mode === 'field') {\n current.Target = {\n Mode: 'field',\n EntityFieldName: this.entityFields.length > 0 ? this.entityFields[0].Name : '',\n };\n } else if (mode === 'child') {\n current.Target = {\n Mode: 'child',\n EntityName: this.availableEntities.length > 0 ? this.availableEntities[0].Name : '',\n ParentField: 'ParentID',\n Map: {},\n };\n } else if (mode === 'tags') {\n current.Target = {\n Mode: 'tags',\n RootTagID: '',\n };\n }\n this.emitChanges();\n }\n\n public updateFieldTarget(index: number, event: Event): void {\n const fieldName = (event.target as HTMLSelectElement).value;\n const target = this.spec.Outputs[index].Target;\n if (target.Mode === 'field') {\n target.EntityFieldName = fieldName;\n }\n this.emitChanges();\n }\n\n public updateChildTargetEntity(index: number, event: Event): void {\n const entityName = (event.target as HTMLSelectElement).value;\n const target = this.spec.Outputs[index].Target;\n if (target.Mode === 'child') {\n target.EntityName = entityName;\n }\n this.emitChanges();\n }\n\n public updateConstraintType(index: number, event: Event): void {\n const type = (event.target as HTMLSelectElement).value;\n const output = this.spec.Outputs[index];\n if (type === 'none') {\n output.Constraint = undefined;\n } else if (type === 'enum') {\n output.Constraint = { Type: 'enum', Values: [], OnViolation: 'fail' };\n } else if (type === 'numeric') {\n output.Constraint = { Type: 'numeric', Min: 0, Max: 100, OnViolation: 'fail' };\n } else if (type === 'boolean') {\n output.Constraint = { Type: 'boolean', OnViolation: 'fail' };\n } else if (type === 'freetext') {\n output.Constraint = { Type: 'freetext', MaxLength: 500, OnViolation: 'fail' };\n }\n this.emitChanges();\n }\n\n public updateViolationPolicy(index: number, event: Event): void {\n const policy = (event.target as HTMLSelectElement).value as ViolationPolicy;\n if (this.spec.Outputs[index].Constraint) {\n this.spec.Outputs[index].Constraint.OnViolation = policy;\n }\n this.emitChanges();\n }\n\n public getEnumValuesCsv(constraint?: ValueConstraint): string {\n if (!constraint || constraint.Type !== 'enum' || !Array.isArray(constraint.Values)) {\n return '';\n }\n return constraint.Values.join(', ');\n }\n\n public getNumericMin(constraint?: ValueConstraint): number | string {\n return constraint && constraint.Type === 'numeric' && constraint.Min !== undefined ? constraint.Min : '';\n }\n\n public getNumericMax(constraint?: ValueConstraint): number | string {\n return constraint && constraint.Type === 'numeric' && constraint.Max !== undefined ? constraint.Max : '';\n }\n\n public updateEnumValues(index: number, event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n const output = this.spec.Outputs[index];\n if (!output.Constraint || output.Constraint.Type !== 'enum') {\n output.Constraint = { Type: 'enum', Values: [], OnViolation: 'fail' };\n }\n output.Constraint.Values = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n public updateNumericMin(index: number, event: Event): void {\n const val = parseFloat((event.target as HTMLInputElement).value);\n const output = this.spec.Outputs[index];\n if (output.Constraint && output.Constraint.Type === 'numeric') {\n output.Constraint.Min = isNaN(val) ? undefined : val;\n }\n this.emitChanges();\n }\n\n public updateNumericMax(index: number, event: Event): void {\n const val = parseFloat((event.target as HTMLInputElement).value);\n const output = this.spec.Outputs[index];\n if (output.Constraint && output.Constraint.Type === 'numeric') {\n output.Constraint.Max = isNaN(val) ? undefined : val;\n }\n this.emitChanges();\n }\n\n public updateWatermarkStrategy(event: Event): void {\n if (this.Record) {\n this.Record.WatermarkStrategy = (event.target as HTMLSelectElement).value as MJRecordProcessEntity['WatermarkStrategy'];\n }\n }\n\n public updateSkipUnchanged(event: Event): void {\n if (this.Record) {\n this.Record.SkipUnchanged = (event.target as HTMLSelectElement).value === 'true';\n }\n }\n\n public updateCacheable(event: Event): void {\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: false };\n this.spec.Caching.Cacheable = (event.target as HTMLSelectElement).value === 'true';\n this.emitChanges();\n }\n\n public updateCacheKeyFields(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.cacheKeyFieldsCsv = val;\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.KeyFields = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n public updateCacheTTL(event: Event): void {\n const val = parseInt((event.target as HTMLInputElement).value, 10);\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.TTLSeconds = isNaN(val) ? 86400 : val;\n this.emitChanges();\n }\n\n public updateCacheScope(event: Event): void {\n const val = (event.target as HTMLSelectElement).value as 'pipeline' | 'prompt';\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.Scope = val;\n this.emitChanges();\n }\n\n private emitChanges(): void {\n if (this.Record) {\n this.spec.Name = this.Record.Name || '';\n this.spec.Description = this.Record.Description || '';\n this.spec.PromptID = this.Record.PromptID || '';\n this.Record.Configuration = JSON.stringify(this.spec);\n this.syncOutputMappingToRecord();\n }\n this.recomputeValidation();\n this.SpecChange.emit(this.spec);\n this.cdr.detectChanges();\n }\n\n /**\n * Automatically projects spec.Outputs into the record's OutputMapping JSON\n * so that WriteBackProcessor works out of the box without duplicate manual config.\n */\n private syncOutputMappingToRecord(): void {\n if (!this.Record) return;\n const fields: Record<string, string> = Object.create(null);\n for (const out of this.spec.Outputs) {\n if (out.Target.Mode === 'field' && out.Target.EntityFieldName) {\n fields[out.Target.EntityFieldName] = out.Ref;\n }\n }\n this.Record.OutputMapping = JSON.stringify({ fields });\n }\n\n private recomputeValidation(): void {\n this.renderedConstraintPreview = renderConstraintBlock(this.spec.Outputs);\n const entity = this.Record?.EntityID ? this.ProviderToUse.EntityByID(this.Record.EntityID) : null;\n if (entity) {\n const stub: EntityMetadataStub = {\n Name: entity.Name,\n Fields: (entity.Fields ?? []).map((f) => ({\n Name: f.Name,\n TSType: f.TSType,\n IsVirtual: f.IsVirtual,\n AllowsNull: f.AllowsNull,\n RelatedEntity: f.RelatedEntity,\n RelatedEntityID: f.RelatedEntityID,\n EntityFieldValues: f.EntityFieldValues ? f.EntityFieldValues.map((v) => ({ Value: v.Value, Code: v.Code })) : undefined,\n })),\n };\n this.validationErrors = validateSpec(this.spec, stub);\n } else {\n this.validationErrors = this.spec.Outputs.length === 0\n ? [{\n Path: 'Outputs',\n Severity: 'error',\n Message: 'At least one output attribute must be configured',\n FixRecommendation: 'Click Add Output to configure an output attribute',\n }]\n : [];\n }\n const hasErrors = this.validationErrors.some((i) => i.Severity === 'error');\n this.ValidChange.emit(!hasErrors);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"feature-pipeline-builder.component.js","sourceRoot":"","sources":["../../../src/lib/feature-pipeline-builder/feature-pipeline-builder.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,uBAAuB,EACvB,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,KAAK,EAGL,MAAM,EAEN,MAAM,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAA+B,QAAQ,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAEhG,OAAO,EAMH,qBAAqB,EACrB,YAAY,GAGf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;;;;;IAqCjC,kCAAyB;IAAA,YAAc;IAAA,iBAAS;;;IAAxC,iCAAgB;IAAC,cAAc;IAAd,iCAAc;;;;IAJ/C,AADJ,8BAAmB,YACR;IAAA,+BAAe;IAAA,iBAAQ;IAC9B,iCAA4G;IAArC,4MAAU,gCAAyB,KAAC;IACvG,kCAA0B;IAAA,oDAA0B;IAAA,iBAAS;IAC7D,qHAEC;IAET,AADI,iBAAS,EACP;;;IANuB,eAA6C;IAA7C,kEAA6C;IAElE,eAEC;IAFD,mCAEC;;;;IAOL,AADJ,8BAAmB,YACR;IAAA,wBAAQ;IAAA,iBAAQ;IACvB,iCAAyI;IAAvE,yMAAS,8BAAuB,KAAC;IACvG,AADI,iBAAyI,EACvI;;;IAD2B,eAAoC;IAApC,yDAAoC;;;IAuB7D,kCAAuB;IAAA,YAAY;IAAA,iBAAS;;;IAApC,+BAAc;IAAC,cAAY;IAAZ,+BAAY;;;IAMvC,AADJ,8BAAmB,YACR;IAAA,kCAAkB;IAAA,iBAAQ;IACjC,+BAA6B;IAAA,YAA6D;IAC9F,AAD8F,iBAAM,EAC9F;;;IAD2B,eAA6D;IAA7D,oFAA6D;;;IAO9F,AADJ,+BAA0B,YACf;IAAA,0CAA0B;IAAA,gCAAoB;IAAA,oEAA+C;IAAO,AAAP,iBAAO,EAAQ;IACnH,+BAA8B;IAAA,YAA+B;IACjE,AADiE,iBAAM,EACjE;;;IAD4B,eAA+B;IAA/B,sDAA+B;;;IAmBjE,+BAA+B;IAC3B,wBAAyC;IACzC,4BAAM;IAAA,0CAA0B;IAAA,8BAAQ;IAAA,0BAAU;IAAA,iBAAS;IAAC,4DAA2C;IAC3G,AAD2G,iBAAO,EAC5G;;;IAuC0B,kCAAyB;IAAA,YAA8C;IAAA,iBAAS;;;IAAxE,iCAAgB;IAAC,cAA8C;IAA9C,gFAA8C;;;;IAJ/E,AADJ,8BAAmB,YACR;IAAA,4BAAY;IAAA,iBAAQ;IAC3B,iCAA8G;IAA7C,+QAAU,2CAAiC,KAAC;IACzG,kCAA0B;IAAA,2CAAiB;IAAA,iBAAS;IACpD,0IAEC;IAET,AADI,iBAAS,EACP;;;;IANuB,eAAuC;IAAvC,yDAAuC;IAE5D,eAEC;IAFD,kCAEC;;;IAWG,kCAAyB;IAAA,YAA6B;IAAA,iBAAS;;;IAAvD,kCAAgB;IAAC,cAA6B;IAA7B,qDAA6B;;;;IAJ9D,AADJ,8BAAmB,YACR;IAAA,4BAAY;IAAA,iBAAQ;IAC3B,iCAA+G;IAAnD,gRAAU,iDAAuC,KAAC;IAC1G,kCAA0B;IAAA,2CAAiB;IAAA,iBAAS;IACpD,0IAEC;IAET,AADI,iBAAS,EACP;;;;IANuB,eAAkC;IAAlC,oDAAkC;IAEvD,eAEC;IAFD,uCAEC;;;;IAmBL,AADJ,8BAAmB,YACR;IAAA,gCAAgB;IAAA,iBAAQ;IAC/B,iCAA4H;IAAjD,gRAAU,+CAAqC,KAAC;IACvH,kCAAqB;IAAA,wBAAQ;IAAA,iBAAS;IACtC,kCAAqB;IAAA,kCAAkB;IAAA,iBAAS;IAChD,kCAAgC;IAAA,iCAAiB;IAEzD,AADI,AADqD,iBAAS,EACrD,EACP;;;IALuB,eAAiD;IAAjD,mEAAiD;;;;IAY9E,AADJ,+BAA0B,YACf;IAAA,gDAAgC;IAAA,iBAAQ;IAC/C,iCAAgK;IAA1F,6QAAS,0CAAgC,KAAC;IACpH,AADI,iBAAgK,EAC9J;;;;IADsB,eAA6C;IAA7C,sEAA6C;;;;IAMjE,AADJ,AADJ,+BAA8B,aACP,YACR;IAAA,yBAAS;IAAA,iBAAQ;IACxB,iCAA4H;IAA3C,6QAAS,0CAAgC,KAAC;IAC/H,AADI,iBAA4H,EAC1H;IAEF,AADJ,8BAAmB,YACR;IAAA,yBAAS;IAAA,iBAAQ;IACxB,iCAA4H;IAA3C,6QAAS,0CAAgC,KAAC;IAEnI,AADI,AADI,iBAA4H,EAC1H,EACJ;;;;IANwC,eAA0C;IAA1C,mEAA0C;IAI1C,eAA0C;IAA1C,mEAA0C;;;;IA1FxF,AADJ,AADJ,+BAA6B,cACI,SACrB;IAAA,YAA0D;IAAA,iBAAK;IACnE,kCAAyE;IAA/B,oOAAS,8BAAoB,KAAC;IACpE,wBAAiC;IAAC,wBACtC;IACJ,AADI,iBAAS,EACP;IAIE,AADJ,AADJ,8BAAuB,aACA,YACR;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,kCAAmI;IAArF,0OAAS,mCAAyB,MAAM,SAAS,KAAC;IACpG,AADI,iBAAmI,EACjI;IAEF,AADJ,+BAAmB,aACR;IAAA,gCAAe;IAAA,iBAAQ;IAC9B,kCAAwI;IAAtF,0OAAS,mCAAyB,KAAK,SAAS,KAAC;IACvG,AADI,iBAAwI,EACtI;IAEF,AADJ,+BAAmB,aACR;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,kCAAkG;IAA5C,6OAAU,0CAAgC,KAAC;IAC7F,mCAAsB;IAAA,sCAAqB;IAAA,iBAAS;IACpD,mCAAsB;IAAA,mCAAkB;IAAA,iBAAS;IACjD,mCAAqB;IAAA,qCAAoB;IAGrD,AADI,AADI,AAD6C,iBAAS,EAC7C,EACP,EACJ;IAGN,gCAA8B;IAC1B,wHAAsC;IAYtC,wHAAsC;IAclC,AADJ,+BAAmB,aACR;IAAA,gCAAe;IAAA,iBAAQ;IAC9B,kCAAqH;IAAhD,6OAAU,8CAAoC,KAAC;IAChH,mCAAqB;IAAA,qCAAoB;IAAA,iBAAS;IAClD,mCAAqB;IAAA,sCAAqB;IAAA,iBAAS;IACnD,mCAAwB;IAAA,kCAAiB;IAAA,iBAAS;IAClD,mCAAwB;IAAA,wBAAO;IAAA,iBAAS;IACxC,mCAAyB;IAAA,0BAAS;IAE1C,AADI,AADsC,iBAAS,EACtC,EACP;IAEN,yHAAyB;IAU7B,iBAAM;IAGN,yHAA0C;IAM1C,yHAA6C;IAYjD,iBAAM;;;;IA9FM,eAA0D;IAA1D,sFAA0D;IASlC,eAAqB;IAArB,uCAAqB;IAIhB,eAAoB;IAApB,sCAAoB;IAIxB,eAA4B;IAA5B,8CAA4B;IAUzD,eAUC;IAVD,8DAUC;IAED,cAUC;IAVD,8DAUC;IAK4B,eAA2C;IAA3C,qGAA2C;IASxE,gBASC;IATD,iDASC;IAIL,cAKC;IALD,0GAKC;IACD,cAWC;IAXD,6GAWC;;;IAjGb,+BAA8B;IAC1B,mIAkGC;IACL,iBAAM;;;IAnGF,cAkGC;IAlGD,kCAkGC;;;;IAyCG,AADJ,AADJ,+BAA8B,aACP,YACR;IAAA,kDAAkC;IAAA,iBAAQ;IACjD,iCAA8H;IAA1E,0MAAS,mCAA4B,KAAC;IAC9F,AADI,iBAA8H,EAC5H;IAEF,AADJ,8BAAmB,YACR;IAAA,mCAAmB;IAAA,iBAAQ;IAClC,iCAAkH;IAAjC,0MAAS,6BAAsB,KAAC;IACrH,AADI,iBAAkH,EAChH;IAEF,AADJ,8BAAmB,aACR;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,kCAAwG;IAApC,8MAAU,+BAAwB,KAAC;IACnG,mCAAyB;IAAA,oDAAmC;IAAA,iBAAS;IACrE,mCAAuB;IAAA,kEAAiD;IAGpF,AADI,AADI,AAD4E,iBAAS,EAC5E,EACP,EACJ;;;IAb0B,eAA2B;IAA3B,gDAA2B;IAIb,eAA0C;IAA1C,+DAA0C;IAIvD,eAA0C;IAA1C,+DAA0C;;;IAeiD,gCAAoB;IAAA,YAAoC;IAAA,iBAAO;;;IAA3C,cAAoC;IAApC,iEAAoC;;;IAAxK,AAAJ,0BAAI,aAAQ;IAAA,YAA2C;IAAA,iBAAS;IAAA,YAAoB;IAAA,wHAA+B;IAAkE,iBAAK;;;IAA9K,eAA2C;IAA3C,mEAA2C;IAAS,cAAoB;IAApB,iDAAoB;IAAA,cAAiG;IAAjG,sDAAiG;;;IAH7L,AADJ,+BAAoD,SAC5C;IAAA,wBAAgD;IAAC,qCAAoB;IAAA,iBAAK;IAC9E,0BAAI;IACA,kIAEC;IAET,AADI,iBAAK,EACH;;;IAJE,eAEC;IAFD,sCAEC;;AAmCzB,MAAM,OAAO,+BAAgC,SAAQ,oBAAoB;IAC7D,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE/B,MAAM,GAAiC,IAAI,CAAC;IAC5C,QAAQ,GAAkB,IAAI,CAAC;IAE9B,UAAU,GAAG,IAAI,YAAY,EAAmB,CAAC;IACjD,WAAW,GAAG,IAAI,YAAY,EAAW,CAAC;IAE7C,IAAI,GAAoB;QAC3B,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;KAChC,CAAC;IAEK,gBAAgB,GAAmB,EAAE,CAAC;IAE7C,gDAAgD;IAChD,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IACD,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAAqB;QAC7C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAClC,CAAC;IACM,aAAa,GAAsB,EAAE,CAAC;IAE7C,6CAA6C;IAC7C,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAwB;QAC7C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC;IACM,iBAAiB,GAAiB,EAAE,CAAC;IAE5C,iDAAiD;IACjD,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IACD,iDAAiD;IACjD,IAAW,iBAAiB,CAAC,KAAmB;QAC5C,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACnC,CAAC;IACM,YAAY,GAAsB,EAAE,CAAC;IAE5C,4CAA4C;IAC5C,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IACD,4CAA4C;IAC5C,IAAW,YAAY,CAAC,KAAwB;QAC5C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;IACM,cAAc,GAAwB,IAAI,CAAC;IAElD,8CAA8C;IAC9C,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAA0B;QAChD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAChC,CAAC;IAEM,WAAW,GAAoC,QAAQ,CAAC;IAE/D,2CAA2C;IAC3C,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAsC;QACzD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;IACM,SAAS,GAAG,EAAE,CAAC;IAEtB,yCAAyC;IACzC,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD,yCAAyC;IACzC,IAAW,SAAS,CAAC,KAAK;QACtB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IACM,iBAAiB,GAAG,EAAE,CAAC;IAE9B,iDAAiD;IACjD,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IACD,iDAAiD;IACjD,IAAW,iBAAiB,CAAC,KAAK;QAC9B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACnC,CAAC;IACM,gBAAgB,GAA0B,EAAE,CAAC;IAEpD,gDAAgD;IAChD,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IACD,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAA4B;QACpD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAClC,CAAC;IACM,yBAAyB,GAAG,EAAE,CAAC;IAEtC,yDAAyD;IACzD,IAAW,yBAAyB;QAChC,OAAO,IAAI,CAAC,yBAAyB,CAAC;IAC1C,CAAC;IACD,yDAAyD;IACzD,IAAW,yBAAyB,CAAC,KAAK;QACtC,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,CACnE,CAAC;QACF,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,OAAsB;QAC9B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC;IACL,CAAC;IAEM,cAAc;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAEhD,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,aAAa,CAAkB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACzE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACvC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;oBACzC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;oBAC3D,IAAI,CAAC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC;gBACnE,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExE,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAC9D,IAAI,cAAc,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC7D,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;QAC7G,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,8CAA8C;IACvC,cAAc;QACjB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,WAAW;QACrB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAe;gBACvC,UAAU,EAAE,gBAAgB;gBAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC;gBACrC,UAAU,EAAE,QAAQ;aACvB,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC3B,QAAQ,CAAC,8BAA8B,GAAG,CAAC,YAAY,IAAI,eAAe,EAAE,CAAC,CAAC;YAClF,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,QAAQ,CAAC,0BAA0B,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc;QACxB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAkB;gBAC1C,UAAU,EAAE,sBAAsB;gBAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC;gBAClC,UAAU,EAAE,QAAQ;aACvB,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,QAAQ,CAAC,oCAAoC,GAAG,CAAC,YAAY,IAAI,eAAe,EAAE,CAAC,CAAC;YACxF,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,QAAQ,CAAC,gCAAgC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAEM,mBAAmB,CAAC,KAAY;QACnC,IAAI,CAAC,WAAW,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAwC,CAAC;QAChG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,mDAAmD;IAC5C,mBAAmB,CAAC,KAAY;QACnC,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,iBAAiB,CAAC,KAAY;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QAC/E,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,iDAAiD;IAC1C,iBAAiB,CAAC,KAAY;QACjC,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEM,eAAe,CAAC,KAAY;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrE,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,+CAA+C;IACxC,eAAe,CAAC,KAAY;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,iBAAiB,CAAC,KAAY;QACjC,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG;aACzB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,iDAAiD;IAC1C,iBAAiB,CAAC,KAAY;QACjC,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEM,cAAc,CAAC,KAAY;QAC9B,MAAM,QAAQ,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QAC3D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;QAC5F,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,8CAA8C;IACvC,cAAc,CAAC,KAAY;QAC9B,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAEM,SAAS;QACZ,MAAM,SAAS,GAAsB;YACjC,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9C,GAAG,EAAE,GAAG;YACR,MAAM,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;aACjF;SACJ,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,YAAY,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,4CAA4C;IACrC,YAAY,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,IAAoB,EAAE,KAAY;QACrE,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,KAAa,EAAE,IAAoB,EAAE,KAAY;QACrE,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,MAAM,IAAI,GAAI,KAAK,CAAC,MAA4B,CAAC,KAA6B,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,GAAG;gBACb,IAAI,EAAE,OAAO;gBACb,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;aACjF,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,GAAG;gBACb,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACnF,WAAW,EAAE,UAAU;gBACvB,GAAG,EAAE,EAAE;aACV,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,GAAG;gBACb,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,EAAE;aAChB,CAAC;QACN,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEM,iBAAiB,CAAC,KAAa,EAAE,KAAY;QAChD,MAAM,SAAS,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,eAAe,GAAG,SAAS,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,iDAAiD;IAC1C,iBAAiB,CAAC,KAAa,EAAE,KAAY;QAChD,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAEM,uBAAuB,CAAC,KAAa,EAAE,KAAY;QACtD,MAAM,UAAU,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,uDAAuD;IAChD,uBAAuB,CAAC,KAAa,EAAE,KAAY;QACtD,OAAO,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAEM,oBAAoB,CAAC,KAAa,EAAE,KAAY;QACnD,MAAM,IAAI,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAC1E,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACnF,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACjE,CAAC;aAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,oDAAoD;IAC7C,oBAAoB,CAAC,KAAa,EAAE,KAAY;QACnD,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAEM,qBAAqB,CAAC,KAAa,EAAE,KAAY;QACpD,MAAM,MAAM,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAwB,CAAC;QAC5E,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,qDAAqD;IAC9C,qBAAqB,CAAC,KAAa,EAAE,KAAY;QACpD,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAEM,gBAAgB,CAAC,UAA4B;QAChD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjF,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,UAA4B;QAChD,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAEM,aAAa,CAAC,UAA4B;QAC7C,OAAO,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7G,CAAC;IAED,6CAA6C;IACtC,aAAa,CAAC,UAA4B;QAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAEM,aAAa,CAAC,UAA4B;QAC7C,OAAO,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7G,CAAC;IAED,6CAA6C;IACtC,aAAa,CAAC,UAA4B;QAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1D,MAAM,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG;aACzB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,MAAM,GAAG,GAAG,UAAU,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEM,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,MAAM,GAAG,GAAG,UAAU,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,KAAa,EAAE,KAAY;QAC/C,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEM,uBAAuB,CAAC,KAAY;QACvC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAmD,CAAC;QAC5H,CAAC;IACL,CAAC;IAED,uDAAuD;IAChD,uBAAuB,CAAC,KAAY;QACvC,OAAO,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEM,mBAAmB,CAAC,KAAY;QACnC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,aAAa,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,KAAK,MAAM,CAAC;QACrF,CAAC;IACL,CAAC;IAED,mDAAmD;IAC5C,mBAAmB,CAAC,KAAY;QACnC,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,eAAe,CAAC,KAAY;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAK,KAAK,MAAM,CAAC;QACnF,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,+CAA+C;IACxC,eAAe,CAAC,KAAY;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,oBAAoB,CAAC,KAAY;QACpC,MAAM,GAAG,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACrD,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG;aAC5B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,oDAAoD;IAC7C,oBAAoB,CAAC,KAAY;QACpC,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAEM,cAAc,CAAC,KAAY;QAC9B,MAAM,GAAG,GAAG,QAAQ,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;QACxD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,8CAA8C;IACvC,cAAc,CAAC,KAAY;QAC9B,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAEM,gBAAgB,CAAC,KAAY;QAChC,MAAM,GAAG,GAAI,KAAK,CAAC,MAA4B,CAAC,KAA8B,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC;QAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,KAAY;QAChC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAEO,WAAW;QACf,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACK,yBAAyB;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,MAAM,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YACjD,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEO,mBAAmB;QACvB,IAAI,CAAC,yBAAyB,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClG,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,IAAI,GAAuB;gBAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,aAAa,EAAE,CAAC,CAAC,aAAa;oBAC9B,eAAe,EAAE,CAAC,CAAC,eAAe;oBAClC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC1H,CAAC,CAAC;aACN,CAAC;YACF,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAClD,CAAC,CAAC,CAAC;wBACC,IAAI,EAAE,SAAS;wBACf,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,kDAAkD;wBAC3D,iBAAiB,EAAE,mDAAmD;qBACzE,CAAC;gBACF,CAAC,CAAC,EAAE,CAAC;QACb,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC5E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;ySA3nBQ,+BAA+B,yBAA/B,+BAA+B;6DAA/B,+BAA+B;YApSxB,AADJ,AADJ,AAFJ,8BAAiB,iBAEY,aACE,cACD;YAAA,iBAAC;YAAA,iBAAO;YAC1B,0BAAI;YAAA,8BAAc;YACtB,AADsB,iBAAK,EACrB;YACN,4BAAoB;YAAA,gHAAgG;YAAA,iBAAI;YAIhH,AADJ,AADJ,8BAAuB,cACA,aACR;YAAA,6BAAY;YAAA,iBAAQ;YAC3B,kCAAsF;YAAvC,qHAAU,+BAA2B,IAAC;YACjF,kCAAuB;YAAA,8BAAa;YAAA,iBAAS;YAC7C,kCAAyB;YAAA,2CAA0B;YAAA,iBAAS;YAC5D,mCAAsB;YAAA,wCAAuB;YAErD,AADI,AADiD,iBAAS,EACjD,EACP;YAEN,mGAAkC;YAYlC,mGAA+B;YAQ3B,AADJ,+BAAmB,aACR;YAAA,wCAAuB;YAAA,iBAAQ;YACtC,kCAA8H;YAAlF,kHAAS,6BAAyB,IAAC;YAG3F,AADI,AADI,AADI,iBAA8H,EAC5H,EACJ,EACA;YAKF,AADJ,AADJ,mCAAyB,cACE,eACD;YAAA,kBAAC;YAAA,iBAAO;YAC1B,2BAAI;YAAA,0BAAS;YACjB,AADiB,iBAAK,EAChB;YAGE,AADJ,AADJ,gCAAuB,cACA,aACR;YAAA,uBAAM;YAAA,iBAAQ;YACrB,kCAA4F;YAAlC,qHAAU,0BAAsB,IAAC;YACvF,mCAA0B;YAAA,+CAAoB;YAAA,iBAAS;YACvD,wGAEC;YAET,AADI,iBAAS,EACP;YACN,mGAAsB;YAM1B,iBAAM;YAEN,oGAAiC;YAMrC,iBAAU;YAME,AADJ,AADJ,AADJ,mCAAyB,eACc,eACF,eACP;YAAA,kBAAC;YAAA,iBAAO;YAC1B,2BAAI;YAAA,sCAAqB;YAC7B,AAD6B,iBAAK,EAC5B;YACN,mCAAqE;YAAtB,6GAAS,eAAW,IAAC;YAChE,yBAAgC;YAAC,6BACrC;YACJ,AADI,iBAAS,EACP;YACN,6BAAoB;YAAA,+HAA8G;YAAA,iBAAI;YAOpI,AALF,oGAAkD,8EAKzC;YAuGb,iBAAU;YAKF,AADJ,AADJ,mCAAyB,cACE,eACD;YAAA,kBAAC;YAAA,iBAAO;YAC1B,2BAAI;YAAA,qCAAoB;YAC5B,AAD4B,iBAAK,EAC3B;YAGE,AADJ,AADJ,+BAAuB,cACA,aACR;YAAA,mCAAkB;YAAA,iBAAQ;YACjC,kCAAsH;YAA3C,qHAAU,mCAA+B,IAAC;YACjH,mCAAyB;YAAA,sDAAqC;YAAA,iBAAS;YACvE,mCAA0B;YAAA,uDAAsC;YAAA,iBAAS;YACzE,mCAAqB;YAAA,kDAAiC;YAE9D,AADI,AAD0D,iBAAS,EAC1D,EACP;YAGF,AADJ,+BAAmB,aACR;YAAA,uCAAsB;YAAA,iBAAQ;YACrC,kCAAmH;YAAvC,qHAAU,+BAA2B,IAAC;YAC9G,mCAAqB;YAAA,+CAAyB;YAAA,iBAAS;YACvD,mCAAsB;YAAA,+CAAyB;YAEvD,AADI,AADmD,iBAAS,EACnD,EACP;YAGF,AADJ,+BAAmB,aACR;YAAA,oCAAmB;YAAA,iBAAQ;YAClC,kCAAgH;YAAnC,qHAAU,2BAAuB,IAAC;YAC3G,mCAAqB;YAAA,yDAAmC;YAAA,iBAAS;YACjE,mCAAsB;YAAA,0CAAoB;YAGtD,AADI,AADI,AAD8C,iBAAS,EAC9C,EACP,EACJ;YAEN,qGAA8B;YAmBlC,iBAAU;YAGV,oGAAmC;YAUvC,iBAAM;;YA7PmC,gBAAqB;YAArB,uCAAqB;YAOlD,eAUC;YAVD,0DAUC;YAED,cAKC;YALD,uDAKC;YAI2B,eAAmB;YAAnB,qCAAmB;YAclB,gBAAgC;YAAhC,+EAAgC;YAErD,eAEC;YAFD,mCAEC;YAGT,eAKC;YALD,8CAKC;YAGL,cAKC;YALD,yDAKC;YAgBD,gBA2GC;YA3GD,8EA2GC;YAYgC,gBAAiD;YAAjD,gGAAiD;YASjD,gBAAkD;YAAlD,iGAAkD;YAQlD,eAAmD;YAAnD,qEAAmD;YAOpF,eAkBC;YAlBD,sDAkBC;YAIL,cASC;YATD,2DASC;4BA1QC,YAAY,EAAE,WAAW,iDAAE,iBAAiB;;iFA0S7C,+BAA+B;cA9S3C,SAAS;2BACI,6BAA6B,cAC3B,IAAI,mBACC,uBAAuB,CAAC,MAAM,WACtC,CAAC,YAAY,EAAE,WAAW,EAAE,iBAAiB,CAAC,YAC7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2QT;;kBAiCA,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kFAPE,+BAA+B","sourcesContent":["/**\n * @fileoverview Visual authoring component for a Feature Pipeline (Infer Record Process).\n * Configures the DataFeatureSpec (Context, Outputs & Constraints, Caching) and binds\n * prompt, output mapping, and watermark strategy directly on the MJRecordProcessEntity.\n *\n * @module @memberjunction/ng-record-process-studio\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityInfo, EntityFieldInfo, LogError, RunView, UserInfo } from '@memberjunction/core';\nimport { MJRecordProcessEntity, MJAIPromptEntity, MJEntityDocumentEntity } from '@memberjunction/core-entities';\nimport {\n DataFeatureSpec,\n DataFeatureOutput,\n ValueConstraint,\n OutputTarget,\n ViolationPolicy,\n renderConstraintBlock,\n validateSpec,\n type SpecValidationIssue,\n type EntityMetadataStub,\n} from '@memberjunction/feature-pipelines';\nimport { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\n\nexport type PromptOption = Pick<MJAIPromptEntity, 'ID' | 'Name' | 'Description'>;\n\nexport type EntityDocOption = Pick<MJEntityDocumentEntity, 'ID' | 'Name' | 'EntityID'>;\n\n@Component({\n selector: 'mj-feature-pipeline-builder',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, MJButtonDirective],\n template: `\n <div class=\"fpb\">\n <!-- STAGE 1: CONTEXT SOURCE -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">1</span>\n <h3>Context Source</h3>\n </div>\n <p class=\"rpe-desc\">Choose how data from each record is extracted and formatted before being sent to the LLM prompt.</p>\n\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Context Mode</label>\n <select class=\"mj-input\" [value]=\"contextMode\" (change)=\"onContextModeChange($event)\">\n <option value=\"fields\">Record Fields</option>\n <option value=\"document\">Entity Document (Template)</option>\n <option value=\"query\">Query (Graph Traversal)</option>\n </select>\n </div>\n\n @if (contextMode === 'document') {\n <div class=\"field\">\n <label>Entity Document</label>\n <select class=\"mj-input\" [value]=\"spec.Context.EntityDocumentID || ''\" (change)=\"onEntityDocChange($event)\">\n <option value=\"\" disabled>— Select Entity Document —</option>\n @for (doc of availableDocs; track doc.ID) {\n <option [value]=\"doc.ID\">{{ doc.Name }}</option>\n }\n </select>\n </div>\n }\n\n @if (contextMode === 'query') {\n <div class=\"field\">\n <label>Query ID</label>\n <input class=\"mj-input mono\" [value]=\"spec.Context.QueryID || ''\" (input)=\"onQueryIDChange($event)\" placeholder=\"UUID of approved Query\">\n </div>\n }\n\n <div class=\"field\">\n <label>Field Filter (optional)</label>\n <input class=\"mj-input\" [value]=\"fieldsCsv\" (input)=\"onFieldsCsvChange($event)\" placeholder=\"e.g. FirstName, LastName, Title\">\n </div>\n </div>\n </section>\n\n <!-- STAGE 2: PROMPT & INJECTED CONSTRAINTS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">2</span>\n <h3>AI Prompt</h3>\n </div>\n <div class=\"rpe-grid2\">\n <div class=\"field\">\n <label>Prompt</label>\n <select class=\"mj-input\" [value]=\"Record?.PromptID || ''\" (change)=\"onPromptChange($event)\">\n <option value=\"\" disabled>— Select AI Prompt —</option>\n @for (p of availablePrompts; track p.ID) {\n <option [value]=\"p.ID\">{{ p.Name }}</option>\n }\n </select>\n </div>\n @if (selectedPrompt) {\n <div class=\"field\">\n <label>Prompt Description</label>\n <div class=\"rpe-static-text\">{{ selectedPrompt.Description || 'No description provided' }}</div>\n </div>\n }\n </div>\n\n @if (renderedConstraintPreview) {\n <div class=\"field rpe-mt\">\n <label>Injected Constraint Block <span class=\"muted\">— automatically appended to prompt instructions</span></label>\n <pre class=\"fpb-code-preview\">{{ renderedConstraintPreview }}</pre>\n </div>\n }\n </section>\n\n <!-- STAGE 3: OUTPUTS & CONSTRAINTS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h fpb-split-h\">\n <div class=\"fpb-title-group\">\n <span class=\"num\">3</span>\n <h3>Outputs & Constraints</h3>\n </div>\n <button mjButton size=\"sm\" variant=\"secondary\" (click)=\"addOutput()\">\n <i class=\"fa-solid fa-plus\"></i> Add Output\n </button>\n </div>\n <p class=\"rpe-desc\">Define the structured outputs produced by the LLM, their type constraints, and target write-back destinations.</p>\n\n @if (!spec.Outputs || spec.Outputs.length === 0) {\n <div class=\"fpb-empty-outputs\">\n <i class=\"fa-solid fa-arrow-turn-up\"></i>\n <span>No outputs defined. Click <strong>Add Output</strong> to configure at least one output attribute.</span>\n </div>\n } @else {\n <div class=\"fpb-outputs-list\">\n @for (output of spec.Outputs; track $index) {\n <div class=\"fpb-output-card\">\n <div class=\"fpb-output-head\">\n <h4>Output #{{ $index + 1 }}: {{ output.Name || '(unnamed)' }}</h4>\n <button mjButton size=\"sm\" variant=\"flat\" (click)=\"removeOutput($index)\">\n <i class=\"fa-solid fa-trash\"></i> Remove\n </button>\n </div>\n\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Output Name</label>\n <input class=\"mj-input\" [value]=\"output.Name\" (input)=\"updateOutputProp($index, 'Name', $event)\" placeholder=\"e.g. SentimentScore\">\n </div>\n <div class=\"field\">\n <label>JSON Path / Ref</label>\n <input class=\"mj-input mono\" [value]=\"output.Ref\" (input)=\"updateOutputProp($index, 'Ref', $event)\" placeholder=\"e.g. $.sentiment or $\">\n </div>\n <div class=\"field\">\n <label>Target Mode</label>\n <select class=\"mj-input\" [value]=\"output.Target.Mode\" (change)=\"updateTargetMode($index, $event)\">\n <option value=\"field\">Entity Column (field)</option>\n <option value=\"child\">Child Rows (child)</option>\n <option value=\"tags\">Taxonomy Tags (tags)</option>\n </select>\n </div>\n </div>\n\n <!-- Target details -->\n <div class=\"rpe-grid3 rpe-mt\">\n @if (output.Target.Mode === 'field') {\n <div class=\"field\">\n <label>Target Field</label>\n <select class=\"mj-input\" [value]=\"output.Target.EntityFieldName\" (change)=\"updateFieldTarget($index, $event)\">\n <option value=\"\" disabled>— Select Column —</option>\n @for (f of entityFields; track f.Name) {\n <option [value]=\"f.Name\">{{ f.DisplayName || f.Name }} ({{ f.TSType }})</option>\n }\n </select>\n </div>\n }\n\n @if (output.Target.Mode === 'child') {\n <div class=\"field\">\n <label>Child Entity</label>\n <select class=\"mj-input\" [value]=\"output.Target.EntityName\" (change)=\"updateChildTargetEntity($index, $event)\">\n <option value=\"\" disabled>— Select Entity —</option>\n @for (e of availableEntities; track e.ID) {\n <option [value]=\"e.Name\">{{ e.DisplayName || e.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Constraint details -->\n <div class=\"field\">\n <label>Constraint Type</label>\n <select class=\"mj-input\" [value]=\"output.Constraint?.Type || 'none'\" (change)=\"updateConstraintType($index, $event)\">\n <option value=\"none\">None / Unconstrained</option>\n <option value=\"enum\">Enum (Allowed Values)</option>\n <option value=\"numeric\">Numeric (Min/Max)</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"freetext\">Free Text</option>\n </select>\n </div>\n\n @if (output.Constraint) {\n <div class=\"field\">\n <label>Violation Policy</label>\n <select class=\"mj-input\" [value]=\"output.Constraint.OnViolation || 'fail'\" (change)=\"updateViolationPolicy($index, $event)\">\n <option value=\"fail\">Fail Row</option>\n <option value=\"null\">Set Output to Null</option>\n <option value=\"coerce-to-other\">Coerce / Fallback</option>\n </select>\n </div>\n }\n </div>\n\n <!-- Constraint params -->\n @if (output.Constraint?.Type === 'enum') {\n <div class=\"field rpe-mt\">\n <label>Allowed Values (comma separated)</label>\n <input class=\"mj-input\" [value]=\"getEnumValuesCsv(output.Constraint)\" (input)=\"updateEnumValues($index, $event)\" placeholder=\"e.g. Positive, Neutral, Negative\">\n </div>\n }\n @if (output.Constraint?.Type === 'numeric') {\n <div class=\"rpe-grid2 rpe-mt\">\n <div class=\"field\">\n <label>Min Value</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"getNumericMin(output.Constraint)\" (input)=\"updateNumericMin($index, $event)\">\n </div>\n <div class=\"field\">\n <label>Max Value</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"getNumericMax(output.Constraint)\" (input)=\"updateNumericMax($index, $event)\">\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </section>\n\n <!-- STAGE 4: MATERIALIZATION & WATERMARK -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">4</span>\n <h3>Caching & Watermarks</h3>\n </div>\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Watermark Strategy</label>\n <select class=\"mj-input\" [value]=\"Record?.WatermarkStrategy || 'Checksum'\" (change)=\"updateWatermarkStrategy($event)\">\n <option value=\"Checksum\">Checksum (Content Hash + Prompt Hash)</option>\n <option value=\"UpdatedAt\">UpdatedAt (Compare modified timestamp)</option>\n <option value=\"None\">None (Always process all records)</option>\n </select>\n </div>\n\n <div class=\"field\">\n <label>Skip Unchanged Records</label>\n <select class=\"mj-input\" [value]=\"Record?.SkipUnchanged ? 'true' : 'false'\" (change)=\"updateSkipUnchanged($event)\">\n <option value=\"true\">Yes — Skip unchanged rows</option>\n <option value=\"false\">No — Recompute every time</option>\n </select>\n </div>\n\n <div class=\"field\">\n <label>Enable Result Cache</label>\n <select class=\"mj-input\" [value]=\"spec.Caching.Cacheable ? 'true' : 'false'\" (change)=\"updateCacheable($event)\">\n <option value=\"true\">Yes — Cache outputs by distinct key</option>\n <option value=\"false\">No — Compute per row</option>\n </select>\n </div>\n </div>\n\n @if (spec.Caching.Cacheable) {\n <div class=\"rpe-grid3 rpe-mt\">\n <div class=\"field\">\n <label>Cache Key Fields (comma separated)</label>\n <input class=\"mj-input\" [value]=\"cacheKeyFieldsCsv\" (input)=\"updateCacheKeyFields($event)\" placeholder=\"e.g. CurrentJobTitle\">\n </div>\n <div class=\"field\">\n <label>Cache TTL (Seconds)</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"spec.Caching.TTLSeconds ?? 86400\" (input)=\"updateCacheTTL($event)\">\n </div>\n <div class=\"field\">\n <label>Cache Scope</label>\n <select class=\"mj-input\" [value]=\"spec.Caching.Scope || 'pipeline'\" (change)=\"updateCacheScope($event)\">\n <option value=\"pipeline\">Pipeline (Isolated to this process)</option>\n <option value=\"prompt\">Prompt (Shared across processes with same prompt)</option>\n </select>\n </div>\n </div>\n }\n </section>\n\n <!-- VALIDATION ISSUES -->\n @if (validationErrors.length > 0) {\n <div class=\"fpb-issues-card fpb-issues-card--error\">\n <h4><i class=\"fa-solid fa-triangle-exclamation\"></i> Specification Issues</h4>\n <ul>\n @for (issue of validationErrors; track $index) {\n <li><strong>{{ issue.Field ? issue.Field + ': ' : '' }}</strong>{{ issue.Message }} @if (issue.FixRecommendation) { <span class=\"muted\">(Fix: {{ issue.FixRecommendation }})</span> }</li>\n }\n </ul>\n </div>\n }\n </div>\n `,\n styles: [`\n .fpb { display: flex; flex-direction: column; gap: 20px; }\n .rpe-desc { font-size: 13px; color: var(--mj-text-secondary); margin: -6px 0 16px 0; }\n .rpe-sec { background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-subtle); border-radius: var(--mj-radius-md, 10px); padding: 18px 20px; }\n .rpe-sec-h { display: flex; align-items: center; gap: 11px; margin-bottom: 14px; }\n .rpe-sec-h h3 { margin: 0; font-size: 16px; font-weight: 700; color: var(--mj-text-primary); }\n .rpe-sec-h .num { width: 24px; height: 24px; border-radius: 50%; background: var(--mj-brand-primary); color: #fff; display: grid; place-items: center; font-size: 12px; font-weight: 800; }\n .fpb-split-h { justify-content: space-between; }\n .fpb-title-group { display: flex; align-items: center; gap: 11px; }\n .rpe-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n .rpe-grid3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }\n .field { display: flex; flex-direction: column; gap: 6px; }\n .field label { font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); }\n .rpe-mt { margin-top: 14px; }\n .mono { font-family: monospace; font-size: 12.5px; }\n .muted { color: var(--mj-text-muted); font-weight: 400; }\n .rpe-static-text { font-size: 13px; color: var(--mj-text-muted); padding: 7px 0; }\n .fpb-code-preview { background: var(--mj-bg-surface-sunken, #0f172a); color: var(--mj-text-code, var(--mj-text-primary, #e2e8f0)); border: 1px solid var(--mj-border-subtle, #334155); padding: 12px; border-radius: 6px; font-size: 12px; font-family: var(--mj-font-mono, monospace); white-space: pre-wrap; word-break: break-word; max-height: 160px; overflow-y: auto; margin: 0; }\n .fpb-empty-outputs { display: flex; align-items: center; gap: 10px; padding: 20px; border: 1px dashed var(--mj-border-subtle); border-radius: 8px; color: var(--mj-text-muted); font-size: 13px; }\n .fpb-outputs-list { display: flex; flex-direction: column; gap: 16px; }\n .fpb-output-card { border: 1px solid var(--mj-border-subtle); border-radius: 8px; padding: 14px 16px; background: var(--mj-bg-surface); }\n .fpb-output-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; border-bottom: 1px solid var(--mj-border-subtle); padding-bottom: 8px; }\n .fpb-output-head h4 { margin: 0; font-size: 14px; font-weight: 600; }\n .fpb-issues-card { border-radius: 8px; padding: 12px 16px; font-size: 13px; }\n .fpb-issues-card--error { background: rgba(239, 68, 68, 0.08); border: 1px solid var(--mj-status-error); color: var(--mj-status-error-text); }\n .fpb-issues-card h4 { margin: 0 0 8px 0; font-size: 14px; display: flex; align-items: center; gap: 8px; }\n .fpb-issues-card ul { margin: 0; padding-left: 20px; }\n `],\n})\nexport class FeaturePipelineBuilderComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() Record: MJRecordProcessEntity | null = null;\n @Input() EntityID: string | null = null;\n\n @Output() SpecChange = new EventEmitter<DataFeatureSpec>();\n @Output() ValidChange = new EventEmitter<boolean>();\n\n public spec: DataFeatureSpec = {\n Name: '',\n Description: '',\n PromptID: '',\n Context: {},\n Outputs: [],\n Caching: { Cacheable: false },\n };\n\n public AvailablePrompts: PromptOption[] = [];\n\n /** @deprecated Use {@link AvailablePrompts}. */\n public get availablePrompts(): PromptOption[] {\n return this.AvailablePrompts;\n }\n /** @deprecated Use {@link AvailablePrompts}. */\n public set availablePrompts(value: PromptOption[]) {\n this.AvailablePrompts = value;\n }\n public AvailableDocs: EntityDocOption[] = [];\n\n /** @deprecated Use {@link AvailableDocs}. */\n public get availableDocs(): EntityDocOption[] {\n return this.AvailableDocs;\n }\n /** @deprecated Use {@link AvailableDocs}. */\n public set availableDocs(value: EntityDocOption[]) {\n this.AvailableDocs = value;\n }\n public AvailableEntities: EntityInfo[] = [];\n\n /** @deprecated Use {@link AvailableEntities}. */\n public get availableEntities(): EntityInfo[] {\n return this.AvailableEntities;\n }\n /** @deprecated Use {@link AvailableEntities}. */\n public set availableEntities(value: EntityInfo[]) {\n this.AvailableEntities = value;\n }\n public EntityFields: EntityFieldInfo[] = [];\n\n /** @deprecated Use {@link EntityFields}. */\n public get entityFields(): EntityFieldInfo[] {\n return this.EntityFields;\n }\n /** @deprecated Use {@link EntityFields}. */\n public set entityFields(value: EntityFieldInfo[]) {\n this.EntityFields = value;\n }\n public SelectedPrompt: PromptOption | null = null;\n\n /** @deprecated Use {@link SelectedPrompt}. */\n public get selectedPrompt(): PromptOption | null {\n return this.SelectedPrompt;\n }\n /** @deprecated Use {@link SelectedPrompt}. */\n public set selectedPrompt(value: PromptOption | null) {\n this.SelectedPrompt = value;\n }\n\n public ContextMode: 'fields' | 'document' | 'query' = 'fields';\n\n /** @deprecated Use {@link ContextMode}. */\n public get contextMode(): 'fields' | 'document' | 'query' {\n return this.ContextMode;\n }\n /** @deprecated Use {@link ContextMode}. */\n public set contextMode(value: 'fields' | 'document' | 'query') {\n this.ContextMode = value;\n }\n public FieldsCsv = '';\n\n /** @deprecated Use {@link FieldsCsv}. */\n public get fieldsCsv() {\n return this.FieldsCsv;\n }\n /** @deprecated Use {@link FieldsCsv}. */\n public set fieldsCsv(value) {\n this.FieldsCsv = value;\n }\n public CacheKeyFieldsCsv = '';\n\n /** @deprecated Use {@link CacheKeyFieldsCsv}. */\n public get cacheKeyFieldsCsv() {\n return this.CacheKeyFieldsCsv;\n }\n /** @deprecated Use {@link CacheKeyFieldsCsv}. */\n public set cacheKeyFieldsCsv(value) {\n this.CacheKeyFieldsCsv = value;\n }\n public ValidationErrors: SpecValidationIssue[] = [];\n\n /** @deprecated Use {@link ValidationErrors}. */\n public get validationErrors(): SpecValidationIssue[] {\n return this.ValidationErrors;\n }\n /** @deprecated Use {@link ValidationErrors}. */\n public set validationErrors(value: SpecValidationIssue[]) {\n this.ValidationErrors = value;\n }\n public RenderedConstraintPreview = '';\n\n /** @deprecated Use {@link RenderedConstraintPreview}. */\n public get renderedConstraintPreview() {\n return this.RenderedConstraintPreview;\n }\n /** @deprecated Use {@link RenderedConstraintPreview}. */\n public set renderedConstraintPreview(value) {\n this.RenderedConstraintPreview = value;\n }\n\n async ngOnInit(): Promise<void> {\n this.AvailableEntities = [...this.ProviderToUse.Entities].sort((a, b) =>\n (a.DisplayName || a.Name).localeCompare(b.DisplayName || b.Name)\n );\n await this.loadPrompts();\n await this.loadEntityDocs();\n this.SyncFromRecord();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Record'] || changes['EntityID']) {\n this.SyncFromRecord();\n }\n }\n\n public SyncFromRecord(): void {\n if (this.Record) {\n this.spec.Name = this.Record.Name || '';\n this.spec.Description = this.Record.Description || '';\n this.spec.PromptID = this.Record.PromptID || '';\n\n if (this.Record.Configuration) {\n const parsed = SafeJSONParse<DataFeatureSpec>(this.Record.Configuration);\n if (parsed && typeof parsed === 'object') {\n this.spec.Outputs = Array.isArray(parsed.Outputs) ? parsed.Outputs : [];\n this.spec.Context = parsed.Context ?? {};\n this.spec.Caching = parsed.Caching ?? { Cacheable: false };\n this.spec.ProcessorExtensionKey = parsed.ProcessorExtensionKey;\n }\n }\n }\n\n if (!this.spec.Outputs) {\n this.spec.Outputs = [];\n }\n if (!this.spec.Context) {\n this.spec.Context = {};\n }\n\n if (this.spec.Context.EntityDocumentID) {\n this.ContextMode = 'document';\n } else if (this.spec.Context.QueryID) {\n this.ContextMode = 'query';\n } else {\n this.ContextMode = 'fields';\n }\n\n this.FieldsCsv = (this.spec.Context.Fields ?? []).join(', ');\n this.CacheKeyFieldsCsv = (this.spec.Caching.KeyFields ?? []).join(', ');\n\n const targetEntityID = this.Record?.EntityID || this.EntityID;\n if (targetEntityID) {\n const entity = this.ProviderToUse.EntityByID(targetEntityID);\n this.EntityFields = entity?.Fields ? [...entity.Fields].sort((a, b) => a.Name.localeCompare(b.Name)) : [];\n } else {\n this.EntityFields = [];\n }\n\n if (this.Record?.PromptID) {\n this.SelectedPrompt = this.AvailablePrompts.find((p) => UUIDsEqual(p.ID, this.Record?.PromptID)) ?? null;\n }\n\n this.recomputeValidation();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link SyncFromRecord}. */\n public syncFromRecord(): void {\n return this.SyncFromRecord();\n }\n\n private async loadPrompts(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<PromptOption>({\n EntityName: 'MJ: AI Prompts',\n Fields: ['ID', 'Name', 'Description'],\n ResultType: 'simple',\n });\n if (res.Success && Array.isArray(res.Results)) {\n this.AvailablePrompts = res.Results;\n } else {\n this.AvailablePrompts = [];\n LogError(`Failed to load AI Prompts: ${res.ErrorMessage || 'unknown error'}`);\n }\n } catch (error) {\n this.AvailablePrompts = [];\n LogError('Error loading AI Prompts', undefined, error);\n }\n }\n\n private async loadEntityDocs(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<EntityDocOption>({\n EntityName: 'MJ: Entity Documents',\n Fields: ['ID', 'Name', 'EntityID'],\n ResultType: 'simple',\n });\n if (res.Success && Array.isArray(res.Results)) {\n this.AvailableDocs = res.Results;\n } else {\n this.AvailableDocs = [];\n LogError(`Failed to load Entity Documents: ${res.ErrorMessage || 'unknown error'}`);\n }\n } catch (error) {\n this.AvailableDocs = [];\n LogError('Error loading Entity Documents', undefined, error);\n }\n }\n\n public OnContextModeChange(event: Event): void {\n this.ContextMode = (event.target as HTMLSelectElement).value as 'fields' | 'document' | 'query';\n if (!this.spec.Context) this.spec.Context = {};\n if (this.ContextMode === 'fields') {\n this.spec.Context.EntityDocumentID = undefined;\n this.spec.Context.QueryID = undefined;\n } else if (this.ContextMode === 'document') {\n this.spec.Context.QueryID = undefined;\n } else if (this.ContextMode === 'query') {\n this.spec.Context.EntityDocumentID = undefined;\n }\n this.emitChanges();\n }\n\n /** @deprecated Use {@link OnContextModeChange}. */\n public onContextModeChange(event: Event): void {\n return this.OnContextModeChange(event);\n }\n\n public OnEntityDocChange(event: Event): void {\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.EntityDocumentID = (event.target as HTMLSelectElement).value;\n this.emitChanges();\n }\n\n /** @deprecated Use {@link OnEntityDocChange}. */\n public onEntityDocChange(event: Event): void {\n return this.OnEntityDocChange(event);\n }\n\n public OnQueryIDChange(event: Event): void {\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.QueryID = (event.target as HTMLInputElement).value;\n this.emitChanges();\n }\n\n /** @deprecated Use {@link OnQueryIDChange}. */\n public onQueryIDChange(event: Event): void {\n return this.OnQueryIDChange(event);\n }\n\n public OnFieldsCsvChange(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.FieldsCsv = val;\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.Fields = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n /** @deprecated Use {@link OnFieldsCsvChange}. */\n public onFieldsCsvChange(event: Event): void {\n return this.OnFieldsCsvChange(event);\n }\n\n public OnPromptChange(event: Event): void {\n const promptID = (event.target as HTMLSelectElement).value;\n if (this.Record) {\n this.Record.PromptID = promptID;\n }\n this.spec.PromptID = promptID;\n this.SelectedPrompt = this.AvailablePrompts.find((p) => UUIDsEqual(p.ID, promptID)) ?? null;\n this.emitChanges();\n }\n\n /** @deprecated Use {@link OnPromptChange}. */\n public onPromptChange(event: Event): void {\n return this.OnPromptChange(event);\n }\n\n public addOutput(): void {\n const newOutput: DataFeatureOutput = {\n Name: `Output_${this.spec.Outputs.length + 1}`,\n Ref: '$',\n Target: {\n Mode: 'field',\n EntityFieldName: this.EntityFields.length > 0 ? this.EntityFields[0].Name : '',\n },\n };\n this.spec.Outputs.push(newOutput);\n this.emitChanges();\n }\n\n public RemoveOutput(index: number): void {\n this.spec.Outputs.splice(index, 1);\n this.emitChanges();\n }\n\n /** @deprecated Use {@link RemoveOutput}. */\n public removeOutput(index: number): void {\n return this.RemoveOutput(index);\n }\n\n public UpdateOutputProp(index: number, prop: 'Name' | 'Ref', event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.spec.Outputs[index][prop] = val;\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateOutputProp}. */\n public updateOutputProp(index: number, prop: 'Name' | 'Ref', event: Event): void {\n return this.UpdateOutputProp(index, prop, event);\n }\n\n public UpdateTargetMode(index: number, event: Event): void {\n const mode = (event.target as HTMLSelectElement).value as OutputTarget['Mode'];\n const current = this.spec.Outputs[index];\n if (mode === 'field') {\n current.Target = {\n Mode: 'field',\n EntityFieldName: this.EntityFields.length > 0 ? this.EntityFields[0].Name : '',\n };\n } else if (mode === 'child') {\n current.Target = {\n Mode: 'child',\n EntityName: this.AvailableEntities.length > 0 ? this.AvailableEntities[0].Name : '',\n ParentField: 'ParentID',\n Map: {},\n };\n } else if (mode === 'tags') {\n current.Target = {\n Mode: 'tags',\n RootTagID: '',\n };\n }\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateTargetMode}. */\n public updateTargetMode(index: number, event: Event): void {\n return this.UpdateTargetMode(index, event);\n }\n\n public UpdateFieldTarget(index: number, event: Event): void {\n const fieldName = (event.target as HTMLSelectElement).value;\n const target = this.spec.Outputs[index].Target;\n if (target.Mode === 'field') {\n target.EntityFieldName = fieldName;\n }\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateFieldTarget}. */\n public updateFieldTarget(index: number, event: Event): void {\n return this.UpdateFieldTarget(index, event);\n }\n\n public UpdateChildTargetEntity(index: number, event: Event): void {\n const entityName = (event.target as HTMLSelectElement).value;\n const target = this.spec.Outputs[index].Target;\n if (target.Mode === 'child') {\n target.EntityName = entityName;\n }\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateChildTargetEntity}. */\n public updateChildTargetEntity(index: number, event: Event): void {\n return this.UpdateChildTargetEntity(index, event);\n }\n\n public UpdateConstraintType(index: number, event: Event): void {\n const type = (event.target as HTMLSelectElement).value;\n const output = this.spec.Outputs[index];\n if (type === 'none') {\n output.Constraint = undefined;\n } else if (type === 'enum') {\n output.Constraint = { Type: 'enum', Values: [], OnViolation: 'fail' };\n } else if (type === 'numeric') {\n output.Constraint = { Type: 'numeric', Min: 0, Max: 100, OnViolation: 'fail' };\n } else if (type === 'boolean') {\n output.Constraint = { Type: 'boolean', OnViolation: 'fail' };\n } else if (type === 'freetext') {\n output.Constraint = { Type: 'freetext', MaxLength: 500, OnViolation: 'fail' };\n }\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateConstraintType}. */\n public updateConstraintType(index: number, event: Event): void {\n return this.UpdateConstraintType(index, event);\n }\n\n public UpdateViolationPolicy(index: number, event: Event): void {\n const policy = (event.target as HTMLSelectElement).value as ViolationPolicy;\n if (this.spec.Outputs[index].Constraint) {\n this.spec.Outputs[index].Constraint.OnViolation = policy;\n }\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateViolationPolicy}. */\n public updateViolationPolicy(index: number, event: Event): void {\n return this.UpdateViolationPolicy(index, event);\n }\n\n public GetEnumValuesCsv(constraint?: ValueConstraint): string {\n if (!constraint || constraint.Type !== 'enum' || !Array.isArray(constraint.Values)) {\n return '';\n }\n return constraint.Values.join(', ');\n }\n\n /** @deprecated Use {@link GetEnumValuesCsv}. */\n public getEnumValuesCsv(constraint?: ValueConstraint): string {\n return this.GetEnumValuesCsv(constraint);\n }\n\n public GetNumericMin(constraint?: ValueConstraint): number | string {\n return constraint && constraint.Type === 'numeric' && constraint.Min !== undefined ? constraint.Min : '';\n }\n\n /** @deprecated Use {@link GetNumericMin}. */\n public getNumericMin(constraint?: ValueConstraint): number | string {\n return this.GetNumericMin(constraint);\n }\n\n public GetNumericMax(constraint?: ValueConstraint): number | string {\n return constraint && constraint.Type === 'numeric' && constraint.Max !== undefined ? constraint.Max : '';\n }\n\n /** @deprecated Use {@link GetNumericMax}. */\n public getNumericMax(constraint?: ValueConstraint): number | string {\n return this.GetNumericMax(constraint);\n }\n\n public UpdateEnumValues(index: number, event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n const output = this.spec.Outputs[index];\n if (!output.Constraint || output.Constraint.Type !== 'enum') {\n output.Constraint = { Type: 'enum', Values: [], OnViolation: 'fail' };\n }\n output.Constraint.Values = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateEnumValues}. */\n public updateEnumValues(index: number, event: Event): void {\n return this.UpdateEnumValues(index, event);\n }\n\n public UpdateNumericMin(index: number, event: Event): void {\n const val = parseFloat((event.target as HTMLInputElement).value);\n const output = this.spec.Outputs[index];\n if (output.Constraint && output.Constraint.Type === 'numeric') {\n output.Constraint.Min = isNaN(val) ? undefined : val;\n }\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateNumericMin}. */\n public updateNumericMin(index: number, event: Event): void {\n return this.UpdateNumericMin(index, event);\n }\n\n public UpdateNumericMax(index: number, event: Event): void {\n const val = parseFloat((event.target as HTMLInputElement).value);\n const output = this.spec.Outputs[index];\n if (output.Constraint && output.Constraint.Type === 'numeric') {\n output.Constraint.Max = isNaN(val) ? undefined : val;\n }\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateNumericMax}. */\n public updateNumericMax(index: number, event: Event): void {\n return this.UpdateNumericMax(index, event);\n }\n\n public UpdateWatermarkStrategy(event: Event): void {\n if (this.Record) {\n this.Record.WatermarkStrategy = (event.target as HTMLSelectElement).value as MJRecordProcessEntity['WatermarkStrategy'];\n }\n }\n\n /** @deprecated Use {@link UpdateWatermarkStrategy}. */\n public updateWatermarkStrategy(event: Event): void {\n return this.UpdateWatermarkStrategy(event);\n }\n\n public UpdateSkipUnchanged(event: Event): void {\n if (this.Record) {\n this.Record.SkipUnchanged = (event.target as HTMLSelectElement).value === 'true';\n }\n }\n\n /** @deprecated Use {@link UpdateSkipUnchanged}. */\n public updateSkipUnchanged(event: Event): void {\n return this.UpdateSkipUnchanged(event);\n }\n\n public UpdateCacheable(event: Event): void {\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: false };\n this.spec.Caching.Cacheable = (event.target as HTMLSelectElement).value === 'true';\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateCacheable}. */\n public updateCacheable(event: Event): void {\n return this.UpdateCacheable(event);\n }\n\n public UpdateCacheKeyFields(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.CacheKeyFieldsCsv = val;\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.KeyFields = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateCacheKeyFields}. */\n public updateCacheKeyFields(event: Event): void {\n return this.UpdateCacheKeyFields(event);\n }\n\n public UpdateCacheTTL(event: Event): void {\n const val = parseInt((event.target as HTMLInputElement).value, 10);\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.TTLSeconds = isNaN(val) ? 86400 : val;\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateCacheTTL}. */\n public updateCacheTTL(event: Event): void {\n return this.UpdateCacheTTL(event);\n }\n\n public UpdateCacheScope(event: Event): void {\n const val = (event.target as HTMLSelectElement).value as 'pipeline' | 'prompt';\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.Scope = val;\n this.emitChanges();\n }\n\n /** @deprecated Use {@link UpdateCacheScope}. */\n public updateCacheScope(event: Event): void {\n return this.UpdateCacheScope(event);\n }\n\n private emitChanges(): void {\n if (this.Record) {\n this.spec.Name = this.Record.Name || '';\n this.spec.Description = this.Record.Description || '';\n this.spec.PromptID = this.Record.PromptID || '';\n this.Record.Configuration = JSON.stringify(this.spec);\n this.syncOutputMappingToRecord();\n }\n this.recomputeValidation();\n this.SpecChange.emit(this.spec);\n this.cdr.detectChanges();\n }\n\n /**\n * Automatically projects spec.Outputs into the record's OutputMapping JSON\n * so that WriteBackProcessor works out of the box without duplicate manual config.\n */\n private syncOutputMappingToRecord(): void {\n if (!this.Record) return;\n const fields: Record<string, string> = Object.create(null);\n for (const out of this.spec.Outputs) {\n if (out.Target.Mode === 'field' && out.Target.EntityFieldName) {\n fields[out.Target.EntityFieldName] = out.Ref;\n }\n }\n this.Record.OutputMapping = JSON.stringify({ fields });\n }\n\n private recomputeValidation(): void {\n this.RenderedConstraintPreview = renderConstraintBlock(this.spec.Outputs);\n const entity = this.Record?.EntityID ? this.ProviderToUse.EntityByID(this.Record.EntityID) : null;\n if (entity) {\n const stub: EntityMetadataStub = {\n Name: entity.Name,\n Fields: (entity.Fields ?? []).map((f) => ({\n Name: f.Name,\n TSType: f.TSType,\n IsVirtual: f.IsVirtual,\n AllowsNull: f.AllowsNull,\n RelatedEntity: f.RelatedEntity,\n RelatedEntityID: f.RelatedEntityID,\n EntityFieldValues: f.EntityFieldValues ? f.EntityFieldValues.map((v) => ({ Value: v.Value, Code: v.Code })) : undefined,\n })),\n };\n this.ValidationErrors = validateSpec(this.spec, stub);\n } else {\n this.ValidationErrors = this.spec.Outputs.length === 0\n ? [{\n Path: 'Outputs',\n Severity: 'error',\n Message: 'At least one output attribute must be configured',\n FixRecommendation: 'Click Add Output to configure an output attribute',\n }]\n : [];\n }\n const hasErrors = this.ValidationErrors.some((i) => i.Severity === 'error');\n this.ValidChange.emit(!hasErrors);\n }\n}\n"]}
|
|
@@ -52,14 +52,24 @@ export declare class RecordProcessEditorComponent extends BaseAngularComponent i
|
|
|
52
52
|
/** Resolves the record to edit: passed instance → by ID → a fresh draft. */
|
|
53
53
|
private loadRecord;
|
|
54
54
|
/** Generic setter for the simple string/enum fields, driven by the template inputs. */
|
|
55
|
+
Set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void;
|
|
56
|
+
/** @deprecated Use {@link Set}. */
|
|
55
57
|
set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void;
|
|
58
|
+
OnEntityChange(event: Event): void;
|
|
59
|
+
/** @deprecated Use {@link OnEntityChange}. */
|
|
56
60
|
onEntityChange(event: Event): void;
|
|
61
|
+
OnRulesChange(ruleSet: FieldRuleSet): void;
|
|
62
|
+
/** @deprecated Use {@link OnRulesChange}. */
|
|
57
63
|
onRulesChange(ruleSet: FieldRuleSet): void;
|
|
64
|
+
OnFeaturePipelineSpecChange(spec: DataFeatureSpec): void;
|
|
65
|
+
/** @deprecated Use {@link OnFeaturePipelineSpecChange}. */
|
|
58
66
|
onFeaturePipelineSpecChange(spec: DataFeatureSpec): void;
|
|
59
67
|
/** Saves the record (and emits). Returns success. */
|
|
60
68
|
Save(): Promise<boolean>;
|
|
61
69
|
/** Saves (if needed) then mounts the dry-run runner against the process's default scope. */
|
|
62
70
|
Preview(): Promise<void>;
|
|
71
|
+
OnPreviewDone(_result: EntityActionUXResult): void;
|
|
72
|
+
/** @deprecated Use {@link OnPreviewDone}. */
|
|
63
73
|
onPreviewDone(_result: EntityActionUXResult): void;
|
|
64
74
|
Cancel(): void;
|
|
65
75
|
private resolveEntityName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-process-editor.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-process-editor/record-process-editor.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AACnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAA2D,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAErK,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mCAAmC,CAAC;;AAKzE,qBA+Ha,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM;IACpF,OAAO,CAAC,GAAG,CAA6B;IAExC,6FAA6F;IACpF,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAQ;IACrD,wEAAwE;IAC/D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,mFAAmF;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,kGAAkG;IACzF,eAAe,EAAE,qBAAqB,CAAC,UAAU,CAAC,GAAG,IAAI,CAAQ;IAC1E,sFAAsF;IAC7E,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACjD,iGAAiG;IACxF,WAAW,UAAQ;IAE5B,8DAA8D;IACpD,KAAK,sCAA6C;IAC5D,qCAAqC;IAC3B,SAAS,qBAA4B;IAExC,QAAQ,EAAE,UAAU,EAAE,CAAM;IAC5B,kBAAkB,SAAM;IACxB,OAAO,EAAE,YAAY,CAAiB;IACtC,UAAU,UAAQ;IAClB,oBAAoB,UAAQ;IAC5B,mBAAmB,EAAE,eAAe,GAAG,IAAI,CAAQ;IACnD,MAAM,UAAS;IACf,YAAY,SAAM;IAClB,aAAa,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,GAAG,IAAI,CAAQ;IAE5F,IAAI,OAAO,IAAI,OAAO,CAKrB;IACD,IAAI,UAAU,IAAI,OAAO,CAIxB;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,4EAA4E;YAC9D,UAAU;IAwBxB,uFAAuF;IACvF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAe5G,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOlC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAM1C,2BAA2B,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAQxD,qDAAqD;IAC/C,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAmB9B,4FAA4F;IACtF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAKlD,MAAM,IAAI,IAAI;IAEd,OAAO,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"record-process-editor.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-process-editor/record-process-editor.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AACnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAA2D,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAErK,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mCAAmC,CAAC;;AAKzE,qBA+Ha,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM;IACpF,OAAO,CAAC,GAAG,CAA6B;IAExC,6FAA6F;IACpF,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAQ;IACrD,wEAAwE;IAC/D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,mFAAmF;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,kGAAkG;IACzF,eAAe,EAAE,qBAAqB,CAAC,UAAU,CAAC,GAAG,IAAI,CAAQ;IAC1E,sFAAsF;IAC7E,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACjD,iGAAiG;IACxF,WAAW,UAAQ;IAE5B,8DAA8D;IACpD,KAAK,sCAA6C;IAC5D,qCAAqC;IAC3B,SAAS,qBAA4B;IAExC,QAAQ,EAAE,UAAU,EAAE,CAAM;IAC5B,kBAAkB,SAAM;IACxB,OAAO,EAAE,YAAY,CAAiB;IACtC,UAAU,UAAQ;IAClB,oBAAoB,UAAQ;IAC5B,mBAAmB,EAAE,eAAe,GAAG,IAAI,CAAQ;IACnD,MAAM,UAAS;IACf,YAAY,SAAM;IAClB,aAAa,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,GAAG,IAAI,CAAQ;IAE5F,IAAI,OAAO,IAAI,OAAO,CAKrB;IACD,IAAI,UAAU,IAAI,OAAO,CAIxB;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,4EAA4E;YAC9D,UAAU;IAwBxB,uFAAuF;IACvF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAe5G,mCAAmC;IACnC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAI5G,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOlC,8CAA8C;IAC9C,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIlC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAM1C,6CAA6C;IAC7C,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAI1C,2BAA2B,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAQxD,2DAA2D;IAC3D,2BAA2B,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAIxD,qDAAqD;IAC/C,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAmB9B,4FAA4F;IACtF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAKlD,6CAA6C;IAC7C,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAIlD,MAAM,IAAI,IAAI;IAEd,OAAO,CAAC,iBAAiB;yCA5LhB,4BAA4B;2CAA5B,4BAA4B;CA+LxC"}
|
|
@@ -345,7 +345,7 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
345
345
|
this.cdr.detectChanges();
|
|
346
346
|
}
|
|
347
347
|
/** Generic setter for the simple string/enum fields, driven by the template inputs. */
|
|
348
|
-
|
|
348
|
+
Set(field, event) {
|
|
349
349
|
if (!this.Record)
|
|
350
350
|
return;
|
|
351
351
|
const value = event.target.value;
|
|
@@ -372,26 +372,42 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
372
372
|
}
|
|
373
373
|
this.cdr.detectChanges();
|
|
374
374
|
}
|
|
375
|
-
|
|
375
|
+
/** @deprecated Use {@link Set}. */
|
|
376
|
+
set(field, event) {
|
|
377
|
+
return this.Set(field, event);
|
|
378
|
+
}
|
|
379
|
+
OnEntityChange(event) {
|
|
376
380
|
if (!this.Record)
|
|
377
381
|
return;
|
|
378
382
|
this.Record.EntityID = event.target.value;
|
|
379
383
|
this.resolveEntityName();
|
|
380
384
|
this.cdr.detectChanges();
|
|
381
385
|
}
|
|
382
|
-
|
|
386
|
+
/** @deprecated Use {@link OnEntityChange}. */
|
|
387
|
+
onEntityChange(event) {
|
|
388
|
+
return this.OnEntityChange(event);
|
|
389
|
+
}
|
|
390
|
+
OnRulesChange(ruleSet) {
|
|
383
391
|
this.RuleSet = ruleSet;
|
|
384
392
|
if (this.Record)
|
|
385
393
|
this.Record.Configuration = JSON.stringify(ruleSet);
|
|
386
394
|
this.cdr.detectChanges();
|
|
387
395
|
}
|
|
388
|
-
|
|
396
|
+
/** @deprecated Use {@link OnRulesChange}. */
|
|
397
|
+
onRulesChange(ruleSet) {
|
|
398
|
+
return this.OnRulesChange(ruleSet);
|
|
399
|
+
}
|
|
400
|
+
OnFeaturePipelineSpecChange(spec) {
|
|
389
401
|
this.FeaturePipelineSpec = spec;
|
|
390
402
|
if (this.Record) {
|
|
391
403
|
this.Record.Configuration = JSON.stringify(spec);
|
|
392
404
|
}
|
|
393
405
|
this.cdr.detectChanges();
|
|
394
406
|
}
|
|
407
|
+
/** @deprecated Use {@link OnFeaturePipelineSpecChange}. */
|
|
408
|
+
onFeaturePipelineSpecChange(spec) {
|
|
409
|
+
return this.OnFeaturePipelineSpecChange(spec);
|
|
410
|
+
}
|
|
395
411
|
/** Saves the record (and emits). Returns success. */
|
|
396
412
|
async Save() {
|
|
397
413
|
if (!this.Record || !this.CanSave)
|
|
@@ -446,10 +462,14 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
446
462
|
};
|
|
447
463
|
this.cdr.detectChanges();
|
|
448
464
|
}
|
|
449
|
-
|
|
465
|
+
OnPreviewDone(_result) {
|
|
450
466
|
this.PreviewDriver = null;
|
|
451
467
|
this.cdr.detectChanges();
|
|
452
468
|
}
|
|
469
|
+
/** @deprecated Use {@link OnPreviewDone}. */
|
|
470
|
+
onPreviewDone(_result) {
|
|
471
|
+
return this.OnPreviewDone(_result);
|
|
472
|
+
}
|
|
453
473
|
Cancel() { this.Cancelled.emit(); }
|
|
454
474
|
resolveEntityName() {
|
|
455
475
|
this.SelectedEntityName = this.Record?.EntityID ? (this.ProviderToUse.EntityByID(this.Record.EntityID)?.Name ?? '') : '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-process-editor.component.js","sourceRoot":"","sources":["../../../src/lib/record-process-editor/record-process-editor.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview The authoring surface for a single Record Process (a reusable bulk operation). Edits the\n * basics + target entity + scope, and — for the FieldRules work type — embeds the visual\n * `<mj-field-rules-builder>` so a business user defines rules without touching JSON. An inline \"Preview\"\n * runs the same server dry-run + diff runner used at invocation time.\n *\n * Reused in two places: standalone in the Bulk Operations hub (owns its Save/Preview toolbar), and inside\n * the custom Record Process entity form (toolbar hidden — the form owns Save).\n * @module @memberjunction/ng-record-process-studio\n */\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { type EntityInfo } from '@memberjunction/core';\nimport { SafeJSONParse, type FieldRuleSet } from '@memberjunction/global';\nimport { MJRecordProcessEntity } from '@memberjunction/core-entities';\nimport { FieldRulesBuilderComponent, EntityActionUXHostComponent, type EntityActionUXContext, type EntityActionUXResult } from '@memberjunction/ng-entity-action-ux';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { type DataFeatureSpec } from '@memberjunction/feature-pipelines';\nimport { FeaturePipelineBuilderComponent } from '../feature-pipeline-builder/feature-pipeline-builder.component';\n\ntype ScopeKind = 'Filter' | 'View' | 'List';\n\n@Component({\n selector: 'mj-record-process-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldRulesBuilderComponent, FeaturePipelineBuilderComponent, EntityActionUXHostComponent, MJButtonDirective],\n template: `\n @if (!Record) {\n <div class=\"rpe-loading\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Loading…</div>\n } @else {\n <div class=\"rpe\">\n <!-- BASICS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">1</span><h3>Basics</h3></div>\n <div class=\"rpe-grid2\">\n <div class=\"field\"><label>Name</label>\n <input class=\"mj-input\" [value]=\"Record.Name || ''\" (input)=\"set('Name', $event)\" placeholder=\"e.g. Mark idle prompts for review\"></div>\n <div class=\"field\"><label>Status</label>\n <select class=\"mj-input\" [value]=\"Record.Status || 'Active'\" (change)=\"set('Status', $event)\">\n <option value=\"Draft\">Draft</option><option value=\"Active\">Active</option><option value=\"Disabled\">Disabled</option>\n </select></div>\n </div>\n <div class=\"field rpe-mt\"><label>Description</label>\n <input class=\"mj-input\" [value]=\"Record.Description || ''\" (input)=\"set('Description', $event)\" placeholder=\"What does this process do?\"></div>\n </section>\n\n <!-- TARGET + SCOPE -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">2</span><h3>What it acts on</h3></div>\n <div class=\"rpe-grid3\">\n <div class=\"field\"><label>Entity</label>\n <select class=\"mj-input\" [value]=\"Record.EntityID || ''\" (change)=\"onEntityChange($event)\">\n <option value=\"\" disabled>— choose an entity —</option>\n @for (e of Entities; track e.ID) { <option [value]=\"e.ID\">{{ e.DisplayName || e.Name }}</option> }\n </select></div>\n <div class=\"field\"><label>Default scope</label>\n <select class=\"mj-input\" [value]=\"Record.ScopeType || 'Filter'\" (change)=\"set('ScopeType', $event)\">\n <option value=\"Filter\">Filter</option><option value=\"View\">A view</option><option value=\"List\">A list</option>\n </select></div>\n <div class=\"field\"><label>Work type</label>\n <select class=\"mj-input\" [value]=\"Record.WorkType || 'FieldRules'\" (change)=\"set('WorkType', $event)\">\n <option value=\"FieldRules\">Field Rules</option>\n <option value=\"Infer\">Feature Pipeline (Infer)</option>\n </select></div>\n </div>\n @if (Record.ScopeType === 'Filter') {\n <div class=\"field rpe-mt\"><label>Filter <span class=\"muted\">— overridden by the grid selection at run time</span></label>\n <input class=\"mj-input mono\" [value]=\"Record.ScopeFilter || ''\" (input)=\"set('ScopeFilter', $event)\" placeholder=\"e.g. Status = 'Active'\"></div>\n }\n </section>\n\n <!-- RULES -->\n @if (Record.WorkType === 'FieldRules') {\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">3</span><h3>Rules</h3>\n @if (!SelectedEntityName) { <span class=\"muted rpe-h-note\">choose an entity first</span> }\n </div>\n @if (SelectedEntityName) {\n <mj-field-rules-builder\n [EntityName]=\"SelectedEntityName\"\n [Value]=\"RuleSet\"\n [Provider]=\"Provider\"\n (ValueChange)=\"onRulesChange($event)\"\n (ValidChange)=\"RulesValid = $event\">\n </mj-field-rules-builder>\n }\n </section>\n }\n\n <!-- FEATURE PIPELINE (INFER) -->\n @if (Record.WorkType === 'Infer') {\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">3</span><h3>Feature Pipeline Configuration</h3>\n @if (!SelectedEntityName) { <span class=\"muted rpe-h-note\">choose an entity first</span> }\n </div>\n @if (SelectedEntityName) {\n <mj-feature-pipeline-builder\n [Record]=\"Record\"\n [EntityID]=\"Record.EntityID\"\n (ValidChange)=\"FeaturePipelineValid = $event\"\n (SpecChange)=\"onFeaturePipelineSpecChange($event)\">\n </mj-feature-pipeline-builder>\n }\n </section>\n }\n\n <!-- TOOLBAR -->\n @if (ShowToolbar) {\n <div class=\"rpe-bar\">\n <button mjButton variant=\"primary\" [disabled]=\"!CanSave || Saving\" (click)=\"Save()\">\n <i class=\"fa-solid\" [class.fa-floppy-disk]=\"!Saving\" [class.fa-circle-notch]=\"Saving\" [class.fa-spin]=\"Saving\"></i> Save\n </button>\n <button mjButton [disabled]=\"!CanPreview || Saving\" (click)=\"Preview()\"><i class=\"fa-solid fa-flask\"></i> Preview changes</button>\n <button mjButton variant=\"flat\" (click)=\"Cancel()\">Cancel</button>\n @if (ErrorMessage) { <span class=\"rpe-err\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ErrorMessage }}</span> }\n </div>\n }\n </div>\n\n @if (PreviewDriver) {\n <mj-entity-action-ux-host\n [DriverClass]=\"PreviewDriver.DriverClass\" [Context]=\"PreviewDriver.Context\"\n (Completed)=\"onPreviewDone($event)\" (Cancelled)=\"PreviewDriver = null\">\n </mj-entity-action-ux-host>\n }\n }\n `,\n styles: [`\n .rpe-loading{padding:30px;color:var(--mj-text-muted);display:flex;align-items:center;gap:10px}\n .rpe{display:flex;flex-direction:column;gap:22px;color:var(--mj-text-primary)}\n .rpe-sec{background:var(--mj-bg-surface-card);border:1px solid var(--mj-border-subtle);border-radius:var(--mj-radius-md,10px);padding:18px 20px}\n .rpe-sec-h{display:flex;align-items:center;gap:11px;margin-bottom:16px}\n .rpe-sec-h h3{margin:0;font-size:16px;font-weight:700}\n .rpe-sec-h .num{width:23px;height:23px;border-radius:50%;background:var(--mj-brand-primary);color:var(--mj-text-inverse);display:grid;place-items:center;font-size:12px;font-weight:800}\n .rpe-h-note{margin-left:6px;font-size:12.5px}\n .rpe-grid2{display:grid;grid-template-columns:1fr 220px;gap:16px}\n .rpe-grid3{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:16px}\n .field{display:flex;flex-direction:column;gap:6px}\n .field label{font-size:12.5px;font-weight:600;color:var(--mj-text-secondary)}\n .rpe-mt{margin-top:16px}\n .mono{font-family:var(--mj-font-mono,monospace);font-size:12.5px}\n .muted{color:var(--mj-text-muted);font-weight:400}\n .rpe-bar{display:flex;align-items:center;gap:10px;padding-top:4px}\n .rpe-bar button i{margin-right:6px}\n .rpe-err{color:var(--mj-status-error-text);font-size:13px;display:flex;align-items:center;gap:7px}\n .rpe-err i{color:var(--mj-status-error)}\n `],\n})\nexport class RecordProcessEditorComponent extends BaseAngularComponent implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n /** The process being edited. Set this OR `RecordProcessID` (or neither, for a new draft). */\n @Input() Record: MJRecordProcessEntity | null = null;\n /** Load an existing process by ID (alternative to passing `Record`). */\n @Input() RecordProcessID: string | null = null;\n /** Default EntityID for a brand-new process (e.g. the grid the user came from). */\n @Input() DefaultEntityID: string | null = null;\n /** Default WorkType for a brand-new process (e.g. 'Infer' when opened from Feature Pipelines). */\n @Input() DefaultWorkType: MJRecordProcessEntity['WorkType'] | null = null;\n /** Default CategoryID for a brand-new process (e.g. Feature Pipeline category ID). */\n @Input() DefaultCategoryID: string | null = null;\n /** Show the built-in Save / Preview / Cancel toolbar. Set false when an outer form owns Save. */\n @Input() ShowToolbar = true;\n\n /** Emitted after a successful Save (the persisted record). */\n @Output() Saved = new EventEmitter<MJRecordProcessEntity>();\n /** Emitted when the user cancels. */\n @Output() Cancelled = new EventEmitter<void>();\n\n public Entities: EntityInfo[] = [];\n public SelectedEntityName = '';\n public RuleSet: FieldRuleSet = { Rules: [] };\n public RulesValid = true;\n public FeaturePipelineValid = true;\n public FeaturePipelineSpec: DataFeatureSpec | null = null;\n public Saving = false;\n public ErrorMessage = '';\n public PreviewDriver: { DriverClass: string; Context: EntityActionUXContext } | null = null;\n\n get CanSave(): boolean {\n if (!this.Record?.Name || !this.Record?.EntityID) return false;\n if (this.Record.WorkType === 'FieldRules') return this.RulesValid;\n if (this.Record.WorkType === 'Infer') return this.FeaturePipelineValid && !!this.Record.PromptID;\n return true;\n }\n get CanPreview(): boolean {\n if (this.Record?.WorkType === 'FieldRules') return this.CanSave && this.RuleSet.Rules.length > 0;\n if (this.Record?.WorkType === 'Infer') return this.CanSave;\n return false;\n }\n\n async ngOnInit(): Promise<void> {\n const provider = this.ProviderToUse;\n this.Entities = [...provider.Entities].sort((a, b) => (a.DisplayName || a.Name).localeCompare(b.DisplayName || b.Name));\n await this.loadRecord();\n }\n\n /** Resolves the record to edit: passed instance → by ID → a fresh draft. */\n private async loadRecord(): Promise<void> {\n const provider = this.ProviderToUse;\n if (!this.Record) {\n this.Record = await provider.GetEntityObject<MJRecordProcessEntity>('MJ: Record Processes', provider.CurrentUser);\n if (this.RecordProcessID) {\n await this.Record.Load(this.RecordProcessID);\n } else {\n this.Record.NewRecord();\n this.Record.WorkType = this.DefaultWorkType ?? 'FieldRules';\n this.Record.ScopeType = 'Filter';\n this.Record.Status = 'Draft';\n if (this.DefaultEntityID) this.Record.EntityID = this.DefaultEntityID;\n if (this.DefaultCategoryID) this.Record.CategoryID = this.DefaultCategoryID;\n }\n }\n if (this.Record.WorkType === 'FieldRules') {\n this.RuleSet = this.Record.Configuration ? (SafeJSONParse<FieldRuleSet>(this.Record.Configuration) ?? { Rules: [] }) : { Rules: [] };\n } else if (this.Record.WorkType === 'Infer') {\n this.FeaturePipelineSpec = this.Record.Configuration ? SafeJSONParse<DataFeatureSpec>(this.Record.Configuration) : null;\n }\n this.resolveEntityName();\n this.cdr.detectChanges();\n }\n\n /** Generic setter for the simple string/enum fields, driven by the template inputs. */\n set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void {\n if (!this.Record) return;\n const value = (event.target as HTMLInputElement | HTMLSelectElement).value;\n // Strongly-typed assignment per field (no dynamic Set()).\n switch (field) {\n case 'Name': this.Record.Name = value; break;\n case 'Description': this.Record.Description = value; break;\n case 'Status': this.Record.Status = value as MJRecordProcessEntity['Status']; break;\n case 'ScopeType': this.Record.ScopeType = value as MJRecordProcessEntity['ScopeType']; break;\n case 'ScopeFilter': this.Record.ScopeFilter = value; break;\n case 'WorkType': this.Record.WorkType = value as MJRecordProcessEntity['WorkType']; break;\n }\n this.cdr.detectChanges();\n }\n\n onEntityChange(event: Event): void {\n if (!this.Record) return;\n this.Record.EntityID = (event.target as HTMLSelectElement).value;\n this.resolveEntityName();\n this.cdr.detectChanges();\n }\n\n onRulesChange(ruleSet: FieldRuleSet): void {\n this.RuleSet = ruleSet;\n if (this.Record) this.Record.Configuration = JSON.stringify(ruleSet);\n this.cdr.detectChanges();\n }\n\n onFeaturePipelineSpecChange(spec: DataFeatureSpec): void {\n this.FeaturePipelineSpec = spec;\n if (this.Record) {\n this.Record.Configuration = JSON.stringify(spec);\n }\n this.cdr.detectChanges();\n }\n\n /** Saves the record (and emits). Returns success. */\n async Save(): Promise<boolean> {\n if (!this.Record || !this.CanSave) return false;\n this.Saving = true; this.ErrorMessage = ''; this.cdr.detectChanges();\n if (this.Record.WorkType === 'FieldRules') {\n this.Record.Configuration = JSON.stringify(this.RuleSet);\n } else if (this.Record.WorkType === 'Infer' && this.FeaturePipelineSpec) {\n this.Record.Configuration = JSON.stringify(this.FeaturePipelineSpec);\n }\n const ok = await this.Record.Save();\n this.Saving = false;\n if (ok) {\n this.Saved.emit(this.Record);\n } else {\n this.ErrorMessage = this.Record.LatestResult?.CompleteMessage ?? 'Save failed';\n }\n this.cdr.detectChanges();\n return ok;\n }\n\n /** Saves (if needed) then mounts the dry-run runner against the process's default scope. */\n async Preview(): Promise<void> {\n if (!this.Record) return;\n if (this.Record.Dirty || !this.Record.IsSaved) {\n const ok = await this.Save();\n if (!ok) return;\n }\n const entity = this.ProviderToUse.EntityByID(this.Record.EntityID);\n if (!entity) { this.ErrorMessage = 'Target entity not found'; this.cdr.detectChanges(); return; }\n this.PreviewDriver = {\n DriverClass: 'RecordProcessRunnerUX',\n Context: {\n EntityInfo: entity,\n ScopeKind: (this.Record.ScopeType?.toLowerCase() as EntityActionUXContext['ScopeKind']) || 'filter',\n Filter: this.Record.ScopeFilter ?? undefined,\n ViewID: this.Record.ScopeViewID ?? undefined,\n ListID: this.Record.ScopeListID ?? undefined,\n Config: { RecordProcessID: this.Record.ID },\n Provider: this.ProviderToUse,\n ActionLabel: `Preview: ${this.Record.Name}`,\n },\n };\n this.cdr.detectChanges();\n }\n\n onPreviewDone(_result: EntityActionUXResult): void {\n this.PreviewDriver = null;\n this.cdr.detectChanges();\n }\n\n Cancel(): void { this.Cancelled.emit(); }\n\n private resolveEntityName(): void {\n this.SelectedEntityName = this.Record?.EntityID ? (this.ProviderToUse.EntityByID(this.Record.EntityID)?.Name ?? '') : '';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"record-process-editor.component.js","sourceRoot":"","sources":["../../../src/lib/record-process-editor/record-process-editor.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview The authoring surface for a single Record Process (a reusable bulk operation). Edits the\n * basics + target entity + scope, and — for the FieldRules work type — embeds the visual\n * `<mj-field-rules-builder>` so a business user defines rules without touching JSON. An inline \"Preview\"\n * runs the same server dry-run + diff runner used at invocation time.\n *\n * Reused in two places: standalone in the Bulk Operations hub (owns its Save/Preview toolbar), and inside\n * the custom Record Process entity form (toolbar hidden — the form owns Save).\n * @module @memberjunction/ng-record-process-studio\n */\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { type EntityInfo } from '@memberjunction/core';\nimport { SafeJSONParse, type FieldRuleSet } from '@memberjunction/global';\nimport { MJRecordProcessEntity } from '@memberjunction/core-entities';\nimport { FieldRulesBuilderComponent, EntityActionUXHostComponent, type EntityActionUXContext, type EntityActionUXResult } from '@memberjunction/ng-entity-action-ux';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { type DataFeatureSpec } from '@memberjunction/feature-pipelines';\nimport { FeaturePipelineBuilderComponent } from '../feature-pipeline-builder/feature-pipeline-builder.component';\n\ntype ScopeKind = 'Filter' | 'View' | 'List';\n\n@Component({\n selector: 'mj-record-process-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldRulesBuilderComponent, FeaturePipelineBuilderComponent, EntityActionUXHostComponent, MJButtonDirective],\n template: `\n @if (!Record) {\n <div class=\"rpe-loading\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Loading…</div>\n } @else {\n <div class=\"rpe\">\n <!-- BASICS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">1</span><h3>Basics</h3></div>\n <div class=\"rpe-grid2\">\n <div class=\"field\"><label>Name</label>\n <input class=\"mj-input\" [value]=\"Record.Name || ''\" (input)=\"set('Name', $event)\" placeholder=\"e.g. Mark idle prompts for review\"></div>\n <div class=\"field\"><label>Status</label>\n <select class=\"mj-input\" [value]=\"Record.Status || 'Active'\" (change)=\"set('Status', $event)\">\n <option value=\"Draft\">Draft</option><option value=\"Active\">Active</option><option value=\"Disabled\">Disabled</option>\n </select></div>\n </div>\n <div class=\"field rpe-mt\"><label>Description</label>\n <input class=\"mj-input\" [value]=\"Record.Description || ''\" (input)=\"set('Description', $event)\" placeholder=\"What does this process do?\"></div>\n </section>\n\n <!-- TARGET + SCOPE -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">2</span><h3>What it acts on</h3></div>\n <div class=\"rpe-grid3\">\n <div class=\"field\"><label>Entity</label>\n <select class=\"mj-input\" [value]=\"Record.EntityID || ''\" (change)=\"onEntityChange($event)\">\n <option value=\"\" disabled>— choose an entity —</option>\n @for (e of Entities; track e.ID) { <option [value]=\"e.ID\">{{ e.DisplayName || e.Name }}</option> }\n </select></div>\n <div class=\"field\"><label>Default scope</label>\n <select class=\"mj-input\" [value]=\"Record.ScopeType || 'Filter'\" (change)=\"set('ScopeType', $event)\">\n <option value=\"Filter\">Filter</option><option value=\"View\">A view</option><option value=\"List\">A list</option>\n </select></div>\n <div class=\"field\"><label>Work type</label>\n <select class=\"mj-input\" [value]=\"Record.WorkType || 'FieldRules'\" (change)=\"set('WorkType', $event)\">\n <option value=\"FieldRules\">Field Rules</option>\n <option value=\"Infer\">Feature Pipeline (Infer)</option>\n </select></div>\n </div>\n @if (Record.ScopeType === 'Filter') {\n <div class=\"field rpe-mt\"><label>Filter <span class=\"muted\">— overridden by the grid selection at run time</span></label>\n <input class=\"mj-input mono\" [value]=\"Record.ScopeFilter || ''\" (input)=\"set('ScopeFilter', $event)\" placeholder=\"e.g. Status = 'Active'\"></div>\n }\n </section>\n\n <!-- RULES -->\n @if (Record.WorkType === 'FieldRules') {\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">3</span><h3>Rules</h3>\n @if (!SelectedEntityName) { <span class=\"muted rpe-h-note\">choose an entity first</span> }\n </div>\n @if (SelectedEntityName) {\n <mj-field-rules-builder\n [EntityName]=\"SelectedEntityName\"\n [Value]=\"RuleSet\"\n [Provider]=\"Provider\"\n (ValueChange)=\"onRulesChange($event)\"\n (ValidChange)=\"RulesValid = $event\">\n </mj-field-rules-builder>\n }\n </section>\n }\n\n <!-- FEATURE PIPELINE (INFER) -->\n @if (Record.WorkType === 'Infer') {\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">3</span><h3>Feature Pipeline Configuration</h3>\n @if (!SelectedEntityName) { <span class=\"muted rpe-h-note\">choose an entity first</span> }\n </div>\n @if (SelectedEntityName) {\n <mj-feature-pipeline-builder\n [Record]=\"Record\"\n [EntityID]=\"Record.EntityID\"\n (ValidChange)=\"FeaturePipelineValid = $event\"\n (SpecChange)=\"onFeaturePipelineSpecChange($event)\">\n </mj-feature-pipeline-builder>\n }\n </section>\n }\n\n <!-- TOOLBAR -->\n @if (ShowToolbar) {\n <div class=\"rpe-bar\">\n <button mjButton variant=\"primary\" [disabled]=\"!CanSave || Saving\" (click)=\"Save()\">\n <i class=\"fa-solid\" [class.fa-floppy-disk]=\"!Saving\" [class.fa-circle-notch]=\"Saving\" [class.fa-spin]=\"Saving\"></i> Save\n </button>\n <button mjButton [disabled]=\"!CanPreview || Saving\" (click)=\"Preview()\"><i class=\"fa-solid fa-flask\"></i> Preview changes</button>\n <button mjButton variant=\"flat\" (click)=\"Cancel()\">Cancel</button>\n @if (ErrorMessage) { <span class=\"rpe-err\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ErrorMessage }}</span> }\n </div>\n }\n </div>\n\n @if (PreviewDriver) {\n <mj-entity-action-ux-host\n [DriverClass]=\"PreviewDriver.DriverClass\" [Context]=\"PreviewDriver.Context\"\n (Completed)=\"onPreviewDone($event)\" (Cancelled)=\"PreviewDriver = null\">\n </mj-entity-action-ux-host>\n }\n }\n `,\n styles: [`\n .rpe-loading{padding:30px;color:var(--mj-text-muted);display:flex;align-items:center;gap:10px}\n .rpe{display:flex;flex-direction:column;gap:22px;color:var(--mj-text-primary)}\n .rpe-sec{background:var(--mj-bg-surface-card);border:1px solid var(--mj-border-subtle);border-radius:var(--mj-radius-md,10px);padding:18px 20px}\n .rpe-sec-h{display:flex;align-items:center;gap:11px;margin-bottom:16px}\n .rpe-sec-h h3{margin:0;font-size:16px;font-weight:700}\n .rpe-sec-h .num{width:23px;height:23px;border-radius:50%;background:var(--mj-brand-primary);color:var(--mj-text-inverse);display:grid;place-items:center;font-size:12px;font-weight:800}\n .rpe-h-note{margin-left:6px;font-size:12.5px}\n .rpe-grid2{display:grid;grid-template-columns:1fr 220px;gap:16px}\n .rpe-grid3{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:16px}\n .field{display:flex;flex-direction:column;gap:6px}\n .field label{font-size:12.5px;font-weight:600;color:var(--mj-text-secondary)}\n .rpe-mt{margin-top:16px}\n .mono{font-family:var(--mj-font-mono,monospace);font-size:12.5px}\n .muted{color:var(--mj-text-muted);font-weight:400}\n .rpe-bar{display:flex;align-items:center;gap:10px;padding-top:4px}\n .rpe-bar button i{margin-right:6px}\n .rpe-err{color:var(--mj-status-error-text);font-size:13px;display:flex;align-items:center;gap:7px}\n .rpe-err i{color:var(--mj-status-error)}\n `],\n})\nexport class RecordProcessEditorComponent extends BaseAngularComponent implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n /** The process being edited. Set this OR `RecordProcessID` (or neither, for a new draft). */\n @Input() Record: MJRecordProcessEntity | null = null;\n /** Load an existing process by ID (alternative to passing `Record`). */\n @Input() RecordProcessID: string | null = null;\n /** Default EntityID for a brand-new process (e.g. the grid the user came from). */\n @Input() DefaultEntityID: string | null = null;\n /** Default WorkType for a brand-new process (e.g. 'Infer' when opened from Feature Pipelines). */\n @Input() DefaultWorkType: MJRecordProcessEntity['WorkType'] | null = null;\n /** Default CategoryID for a brand-new process (e.g. Feature Pipeline category ID). */\n @Input() DefaultCategoryID: string | null = null;\n /** Show the built-in Save / Preview / Cancel toolbar. Set false when an outer form owns Save. */\n @Input() ShowToolbar = true;\n\n /** Emitted after a successful Save (the persisted record). */\n @Output() Saved = new EventEmitter<MJRecordProcessEntity>();\n /** Emitted when the user cancels. */\n @Output() Cancelled = new EventEmitter<void>();\n\n public Entities: EntityInfo[] = [];\n public SelectedEntityName = '';\n public RuleSet: FieldRuleSet = { Rules: [] };\n public RulesValid = true;\n public FeaturePipelineValid = true;\n public FeaturePipelineSpec: DataFeatureSpec | null = null;\n public Saving = false;\n public ErrorMessage = '';\n public PreviewDriver: { DriverClass: string; Context: EntityActionUXContext } | null = null;\n\n get CanSave(): boolean {\n if (!this.Record?.Name || !this.Record?.EntityID) return false;\n if (this.Record.WorkType === 'FieldRules') return this.RulesValid;\n if (this.Record.WorkType === 'Infer') return this.FeaturePipelineValid && !!this.Record.PromptID;\n return true;\n }\n get CanPreview(): boolean {\n if (this.Record?.WorkType === 'FieldRules') return this.CanSave && this.RuleSet.Rules.length > 0;\n if (this.Record?.WorkType === 'Infer') return this.CanSave;\n return false;\n }\n\n async ngOnInit(): Promise<void> {\n const provider = this.ProviderToUse;\n this.Entities = [...provider.Entities].sort((a, b) => (a.DisplayName || a.Name).localeCompare(b.DisplayName || b.Name));\n await this.loadRecord();\n }\n\n /** Resolves the record to edit: passed instance → by ID → a fresh draft. */\n private async loadRecord(): Promise<void> {\n const provider = this.ProviderToUse;\n if (!this.Record) {\n this.Record = await provider.GetEntityObject<MJRecordProcessEntity>('MJ: Record Processes', provider.CurrentUser);\n if (this.RecordProcessID) {\n await this.Record.Load(this.RecordProcessID);\n } else {\n this.Record.NewRecord();\n this.Record.WorkType = this.DefaultWorkType ?? 'FieldRules';\n this.Record.ScopeType = 'Filter';\n this.Record.Status = 'Draft';\n if (this.DefaultEntityID) this.Record.EntityID = this.DefaultEntityID;\n if (this.DefaultCategoryID) this.Record.CategoryID = this.DefaultCategoryID;\n }\n }\n if (this.Record.WorkType === 'FieldRules') {\n this.RuleSet = this.Record.Configuration ? (SafeJSONParse<FieldRuleSet>(this.Record.Configuration) ?? { Rules: [] }) : { Rules: [] };\n } else if (this.Record.WorkType === 'Infer') {\n this.FeaturePipelineSpec = this.Record.Configuration ? SafeJSONParse<DataFeatureSpec>(this.Record.Configuration) : null;\n }\n this.resolveEntityName();\n this.cdr.detectChanges();\n }\n\n /** Generic setter for the simple string/enum fields, driven by the template inputs. */\n Set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void {\n if (!this.Record) return;\n const value = (event.target as HTMLInputElement | HTMLSelectElement).value;\n // Strongly-typed assignment per field (no dynamic Set()).\n switch (field) {\n case 'Name': this.Record.Name = value; break;\n case 'Description': this.Record.Description = value; break;\n case 'Status': this.Record.Status = value as MJRecordProcessEntity['Status']; break;\n case 'ScopeType': this.Record.ScopeType = value as MJRecordProcessEntity['ScopeType']; break;\n case 'ScopeFilter': this.Record.ScopeFilter = value; break;\n case 'WorkType': this.Record.WorkType = value as MJRecordProcessEntity['WorkType']; break;\n }\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link Set}. */\n set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void {\n return this.Set(field, event);\n }\n\n OnEntityChange(event: Event): void {\n if (!this.Record) return;\n this.Record.EntityID = (event.target as HTMLSelectElement).value;\n this.resolveEntityName();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnEntityChange}. */\n onEntityChange(event: Event): void {\n return this.OnEntityChange(event);\n }\n\n OnRulesChange(ruleSet: FieldRuleSet): void {\n this.RuleSet = ruleSet;\n if (this.Record) this.Record.Configuration = JSON.stringify(ruleSet);\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnRulesChange}. */\n onRulesChange(ruleSet: FieldRuleSet): void {\n return this.OnRulesChange(ruleSet);\n }\n\n OnFeaturePipelineSpecChange(spec: DataFeatureSpec): void {\n this.FeaturePipelineSpec = spec;\n if (this.Record) {\n this.Record.Configuration = JSON.stringify(spec);\n }\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnFeaturePipelineSpecChange}. */\n onFeaturePipelineSpecChange(spec: DataFeatureSpec): void {\n return this.OnFeaturePipelineSpecChange(spec);\n }\n\n /** Saves the record (and emits). Returns success. */\n async Save(): Promise<boolean> {\n if (!this.Record || !this.CanSave) return false;\n this.Saving = true; this.ErrorMessage = ''; this.cdr.detectChanges();\n if (this.Record.WorkType === 'FieldRules') {\n this.Record.Configuration = JSON.stringify(this.RuleSet);\n } else if (this.Record.WorkType === 'Infer' && this.FeaturePipelineSpec) {\n this.Record.Configuration = JSON.stringify(this.FeaturePipelineSpec);\n }\n const ok = await this.Record.Save();\n this.Saving = false;\n if (ok) {\n this.Saved.emit(this.Record);\n } else {\n this.ErrorMessage = this.Record.LatestResult?.CompleteMessage ?? 'Save failed';\n }\n this.cdr.detectChanges();\n return ok;\n }\n\n /** Saves (if needed) then mounts the dry-run runner against the process's default scope. */\n async Preview(): Promise<void> {\n if (!this.Record) return;\n if (this.Record.Dirty || !this.Record.IsSaved) {\n const ok = await this.Save();\n if (!ok) return;\n }\n const entity = this.ProviderToUse.EntityByID(this.Record.EntityID);\n if (!entity) { this.ErrorMessage = 'Target entity not found'; this.cdr.detectChanges(); return; }\n this.PreviewDriver = {\n DriverClass: 'RecordProcessRunnerUX',\n Context: {\n EntityInfo: entity,\n ScopeKind: (this.Record.ScopeType?.toLowerCase() as EntityActionUXContext['ScopeKind']) || 'filter',\n Filter: this.Record.ScopeFilter ?? undefined,\n ViewID: this.Record.ScopeViewID ?? undefined,\n ListID: this.Record.ScopeListID ?? undefined,\n Config: { RecordProcessID: this.Record.ID },\n Provider: this.ProviderToUse,\n ActionLabel: `Preview: ${this.Record.Name}`,\n },\n };\n this.cdr.detectChanges();\n }\n\n OnPreviewDone(_result: EntityActionUXResult): void {\n this.PreviewDriver = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnPreviewDone}. */\n onPreviewDone(_result: EntityActionUXResult): void {\n return this.OnPreviewDone(_result);\n }\n\n Cancel(): void { this.Cancelled.emit(); }\n\n private resolveEntityName(): void {\n this.SelectedEntityName = this.Record?.EntityID ? (this.ProviderToUse.EntityByID(this.Record.EntityID)?.Name ?? '') : '';\n }\n}\n"]}
|