@zimic/interceptor 1.2.3-canary.7 → 1.2.4-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/errors/RunningInterceptorServerError.ts","../src/server/errors/NotRunningInterceptorServerError.ts","../src/utils/http.ts","../src/webSocket/errors/UnauthorizedWebSocketConnectionError.ts","../src/utils/webSocket.ts","../src/server/constants.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/data/isDefined.ts","../src/utils/arrays.ts","../src/utils/environment.ts","../../zimic-utils/src/import/createCachedDynamicImport.ts","../../zimic-utils/src/logging/Logger.ts","../src/utils/files.ts","../src/utils/logging.ts","../src/http/requestHandler/types/requests.ts","../src/http/interceptorWorker/constants.ts","../src/http/interceptorWorker/HttpInterceptorWorker.ts","../src/utils/data.ts","../src/utils/fetch.ts","../src/utils/crypto.ts","../src/webSocket/constants.ts","../src/webSocket/errors/InvalidWebSocketMessage.ts","../src/webSocket/errors/NotRunningWebSocketHandlerError.ts","../src/webSocket/WebSocketHandler.ts","../src/webSocket/WebSocketServer.ts","../src/server/errors/InvalidInterceptorTokenError.ts","../src/server/errors/InvalidInterceptorTokenFileError.ts","../src/server/errors/InvalidInterceptorTokenValueError.ts","../src/server/utils/auth.ts","../src/server/utils/fetch.ts","../src/server/InterceptorServer.ts","../src/server/factory.ts"],"names":["HTTP_METHODS","path","fs","color","util","interceptor","HttpHeaders","parseHttpBody","HttpSearchParams","crypto","ClientSocket","os","z","File","createServer","normalizeNodeRequest","sendNodeResponse","handler"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAM,6BAAA,GAAN,cAA4C,KAAA,CAAM;AAAA,EAChD,YAAY,iBAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,CAAA,kCAAA,EAAqC,iBAAiB,CAAA,CAAE,CAAA;AAC9D,IAAA,IAAA,CAAK,IAAA,GAAO,+BAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAO,qCAAA,GAAQ;;;ACVf,IAAM,gCAAA,GAAN,cAA+C,KAAA,CAAM;AAAA,EACnD,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,oEAAoE,CAAA;AAC1E,IAAA,IAAA,CAAK,IAAA,GAAO,kCAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAO,wCAAA,GAAQ;;;ACNf,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAC,CAAA;AAErC,IAAM,2BAAA,GAAN,cAA0C,sBAAA,CAAuB;AAAA,EACtE,YAAY,cAAA,EAAwB;AAClC,IAAA,KAAA,CAAM,CAAA,kCAAA,EAAqC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC9D,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,0BAAA,GAAN,cAAyC,sBAAA,CAAuB;AAAA,EACrE,YAAY,cAAA,EAAwB;AAClC,IAAA,KAAA,CAAM,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,wCAAwC,EAAA,GAAK,GAAA;AAE1D,eAAsB,eAAA,CACpB,MAAA,EACA,OAAA,GAII,EAAC,EACL;AACA,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,eAAA,GAAkB,uCAAsC,GAAI,OAAA;AAE7F,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,SAAS,iBAAiB,KAAA,EAAgB;AACxC,MAAA,MAAA,CAAO,GAAA,CAAI,aAAa,kBAAkB,CAAA;AAC1C,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACd;AAEA,IAAA,MAAM,YAAA,GAAe,WAAW,MAAM;AACpC,MAAA,MAAM,YAAA,GAAe,IAAI,2BAAA,CAA4B,eAAe,CAAA;AACpE,MAAA,gBAAA,CAAiB,YAAY,CAAA;AAAA,IAC/B,GAAG,eAAe,CAAA;AAElB,IAAA,SAAS,kBAAA,GAAqB;AAC5B,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,gBAAgB,CAAA;AACpC,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,gBAAgB,CAAA;AACrC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,kBAAkB,CAAA;AAAA,EAClD,CAAC,CAAA;AACH;AAEA,eAAsB,cAAA,CAAe,MAAA,EAAoB,OAAA,GAAgC,EAAC,EAAG;AAC3F,EAAA,MAAM,EAAE,OAAA,EAAS,eAAA,GAAkB,qCAAA,EAAsC,GAAI,OAAA;AAE7E,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAM,WAAA,GAAc,WAAW,MAAM;AACnC,MAAA,MAAM,YAAA,GAAe,IAAI,0BAAA,CAA2B,eAAe,CAAA;AACnE,MAAA,MAAA,CAAO,YAAY,CAAA;AAAA,IACrB,GAAG,eAAe,CAAA;AAElB,IAAA,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAU;AACtB,MAAA,YAAA,CAAa,WAAW,CAAA;AAIxB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,mBAAA,EAAoB;AAAA,EAC7B,CAAC,CAAA;AACH;AAEO,SAAS,kBAAkB,MAAA,EAAoB;AACpD,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,EAAQ;AAI/B,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAO,OAAA,EAAS,IAAA;AAAA,EAClB;AACF;AAIO,IAAM,+BAAA,uBAAsC,GAAA,CAAgB;AAAA,EACjE,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,0BAA0B,MAAA,EAAoB;AAC5D,EAAA,OAAO,+BAAA,CAAgC,IAAI,MAAM,CAAA;AACnD;;;ACxGA,IAAM,oCAAA,GAAN,cAAmD,KAAA,CAAM;AAAA,EACvD,YAAqB,KAAA,EAAmB;AACtC,IAAA,KAAA,CAAM,GAAG,KAAA,CAAM,MAAM,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AADzB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAEnB,IAAA,IAAA,CAAK,IAAA,GAAO,sCAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAO,4CAAA,GAAQ,oCAAA;;;ACLf,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAC,CAAA;AAEpC,IAAM,yBAAA,GAAN,cAAwC,qBAAA,CAAsB;AAAA,EACnE,YAAY,cAAA,EAAwB;AAClC,IAAA,KAAA,CAAM,CAAA,gCAAA,EAAmC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC5D,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,4BAAA,GAAN,cAA2C,qBAAA,CAAsB;AAAA,EACtE,YAAY,cAAA,EAAwB;AAClC,IAAA,KAAA,CAAM,CAAA,mCAAA,EAAsC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,0BAAA,GAAN,cAAyC,qBAAA,CAAsB;AAAA,EACpE,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,iCAAiC,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,0BAAA,GAAN,cAAyC,qBAAA,CAAsB;AAAA,EACpE,YAAY,cAAA,EAAwB;AAClC,IAAA,KAAA,CAAM,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,uCAAuC,EAAA,GAAK,GAAA;AAClD,IAAM,kCAAA,GAAqC,IAAI,EAAA,GAAK,GAAA;AAE3D,eAAsB,uBAAA,CACpB,MAAA,EACA,OAAA,GAGI,EAAC,EACL;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,eAAA,GAAkB,oCAAA,EAAsC,qBAAA,GAAwB,OAAM,GAAI,OAAA;AAE3G,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,UAAA,KAAe,MAAA,CAAO,IAAA;AAEnD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,SAAS,wBAAA,GAA2B;AAClC,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,mBAAmB,CAAA;AACzD,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,iBAAiB,CAAA;AACpD,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,eAAe,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAAA,IACjD;AAEA,IAAA,SAAS,gBAAgB,KAAA,EAAgB;AACvC,MAAA,wBAAA,EAAyB;AACzB,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACd;AAEA,IAAA,SAAS,YAAY,KAAA,EAAgC;AACnD,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,KAAS,IAAA;AAItC,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,iBAAA,GAAoB,IAAI,4CAAA,CAAqC,KAAK,CAAA;AACxE,QAAA,eAAA,CAAgB,iBAAiB,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,WAAW,MAAM;AACnC,MAAA,MAAM,YAAA,GAAe,IAAI,yBAAA,CAA0B,eAAe,CAAA;AAClE,MAAA,eAAA,CAAgB,YAAY,CAAA;AAAA,IAC9B,GAAG,eAAe,CAAA;AAElB,IAAA,SAAS,iBAAA,GAAoB;AAC3B,MAAA,wBAAA,EAAyB;AACzB,MAAA,YAAA,CAAa,WAAW,CAAA;AACxB,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,SAAS,oBAAoB,OAAA,EAAoC;AAC/D,MAAA,MAAM,YAAA,GAAe,QAAQ,IAAA,KAAU,mBAAA;AAIvC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,iBAAA,EAAkB;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,mBAAmB,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,iBAAiB,CAAA;AAAA,IACnD;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AAEA,eAAsB,iBAAA,CAAkB,MAAA,EAAsB,OAAA,GAAgC,EAAC,EAAG;AAChG,EAAA,MAAM,EAAE,OAAA,EAAS,eAAA,GAAkB,oCAAA,EAAqC,GAAI,OAAA;AAE5E,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,UAAA,KAAe,MAAA,CAAO,MAAA;AACrD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,SAAS,wBAAA,GAA2B;AAClC,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAAA,IACjD;AAEA,IAAA,SAAS,YAAY,KAAA,EAAgB;AACnC,MAAA,wBAAA,EAAyB;AACzB,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACd;AAEA,IAAA,MAAM,YAAA,GAAe,WAAW,MAAM;AACpC,MAAA,MAAM,YAAA,GAAe,IAAI,0BAAA,CAA2B,eAAe,CAAA;AACnE,MAAA,WAAA,CAAY,YAAY,CAAA;AAAA,IAC1B,GAAG,eAAe,CAAA;AAElB,IAAA,SAAS,WAAA,GAAc;AACrB,MAAA,wBAAA,EAAyB;AACzB,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAE5C,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf,CAAC,CAAA;AACH;AAEA,eAAsB,iBAAA,CAAkB,MAAA,EAA2C,OAAA,GAAgC,EAAC,EAAG;AACrH,EAAA,MAAM,EAAE,OAAA,EAAS,eAAA,GAAkB,oCAAA,EAAqC,GAAI,OAAA;AAE5E,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAM,YAAA,GAAe,WAAW,MAAM;AACpC,MAAA,MAAM,YAAA,GAAe,IAAI,0BAAA,CAA2B,eAAe,CAAA;AACnE,MAAA,MAAA,CAAO,YAAY,CAAA;AAAA,IACrB,GAAG,eAAe,CAAA;AAElB,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,MAAA,MAAA,CAAO,SAAA,EAAU;AAAA,IACnB;AAEA,IAAA,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAU;AACtB,MAAA,YAAA,CAAa,YAAY,CAAA;AAIzB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACrKA,IAAM,mCAAA,GAAsCA,iBAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAW1D,IAAM,8BAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,EAC1D,6BAAA,EAA+B,GAAA;AAAA,EAC/B,8BAAA,EAAgC,mCAAA;AAAA,EAChC,8BAAA,EAAgC,GAAA;AAAA,EAChC,+BAAA,EAAiC,GAAA;AAAA,EACjC,wBAAA,EAA0B;AAC5B,CAAC;AAGM,IAAM,6BAAA,GAAgC;AAEtC,IAAM,gBAAA,GAAmB,WAAA;AACzB,IAAM,8BAAA,GAAiC,IAAA;;;AC/BvC,SAAS,iCAAA,GAAoC;AAClD,EAAA,OAAO,cAAA;AACT;AAEO,SAAS,oBAAoBC,KAAAA,EAAc;AAGhD,EAAA,MAAM,gBAAgB,CAAA,KAAA,EAAQA,KAAAA,CAAK,WAAW,GAAG,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAC7D,EAAA,MAAM,YAAY,IAAI,GAAA,CAAI,GAAG,aAAa,CAAA,EAAGA,KAAI,CAAA,CAAE,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,eAAe,EAAE,CAAA;AAE5D,EAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,iCAAA,EAAA,EAAqC,MAAM,CAAA;AAClH;AAIO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAO,gFAAA;AACT;AAEO,SAAS,6BAAA,GAAgC;AAC9C,EAAA,OAAO,yEAAA;AACT;AAEO,SAAS,4BAAA,GAA+B;AAC7C,EAAA,OAAO,gHAAA;AACT;AAEO,SAAS,qCAAA,GAAwC;AACtD,EAAA,OAAO,gHAAA;AACT;AAEA,SAAS,oBAAoBA,KAAAA,EAAc;AACzC,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoBA,KAAI,CAAA,CAC9C,OAAA;IACC,qCAAA,EAAA;AACA,IAAA,CACE,MAAA,EACA,YAAA,EACA,MAAA,EACA,UAAA,EACA,aAAA,KACG;AACH,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,GAAG,YAAA,IAAgB,EAAE,IAAI,UAAU,CAAA,GAAA,EAAM,iBAAiB,EAAE,CAAA,CAAA;AACrE,MAAA;AAEA,MAAA,MAAM,yBAAyB,YAAA,KAAiB,GAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,yBAAyB,IAAA,GAAO,YAAA;AAEzD,MAAA,MAAM,wBAAwB,aAAA,KAAkB,GAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,wBAAwB,IAAA,GAAO,aAAA;AAExD,MAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,QAAA,OAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,EAAM,UAAU,SAAS,gBAAgB,CAAA,EAAA,CAAA;AACxE,MAAA,CAAA,MAAA,IAAW,gBAAA,EAAkB;AAC3B,QAAA,OAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,EAAM,UAAU,CAAA,OAAA,CAAA;AAC/C,MAAA,CAAA,MAAA,IAAW,gBAAA,EAAkB;AAC3B,QAAA,OAAO,CAAA,MAAA,EAAS,UAAU,CAAA,KAAA,EAAQ,gBAAgB,CAAA,EAAA,CAAA;MACpD,CAAA,MAAO;AACL,QAAA,OAAO,MAAM,UAAU,CAAA,MAAA,CAAA;AACzB,MAAA;AACF,IAAA;AAAA,GAAA,CAED,QAAQ,6BAAA,EAAA,EAAiC,CAAC,MAAA,EAAQ,QAA4B,UAAA,KAAuB;AACpG,IAAA,OAAO,MAAA,GAAS,CAAA,CAAA,EAAI,UAAU,CAAA,GAAA,CAAA,GAAQ,MAAM,UAAU,CAAA,IAAA,CAAA;AACxD,EAAA,CAAC,CAAA,CACA,OAAA;IACC,4BAAA,EAAA;AACA,IAAA,CACE,MAAA,EACA,YAAA,EACA,MAAA,EACA,UAAA,EACA,aAAA,KACG;AACH,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,GAAG,YAAA,IAAgB,EAAE,IAAI,UAAU,CAAA,GAAA,EAAM,iBAAiB,EAAE,CAAA,CAAA;AACrE,MAAA;AAEA,MAAA,MAAM,yBAAyB,YAAA,KAAiB,GAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,yBAAyB,IAAA,GAAO,YAAA;AAEzD,MAAA,MAAM,wBAAwB,aAAA,KAAkB,GAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,wBAAwB,IAAA,GAAO,aAAA;AAExD,MAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,QAAA,OAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,EAAM,UAAU,cAAc,gBAAgB,CAAA,CAAA,CAAA;AAC7E,MAAA,CAAA,MAAA,IAAW,gBAAA,EAAkB;AAC3B,QAAA,OAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,EAAM,UAAU,CAAA,YAAA,CAAA;AAC/C,MAAA,CAAA,MAAA,IAAW,gBAAA,EAAkB;AAC3B,QAAA,OAAO,CAAA,MAAA,EAAS,UAAU,CAAA,UAAA,EAAa,gBAAgB,CAAA,EAAA,CAAA;MACzD,CAAA,MAAO;AACL,QAAA,OAAO,MAAM,UAAU,CAAA,WAAA,CAAA;AACzB,MAAA;AACF,IAAA;AAAA,GAAA,CAED,QAAQ,oBAAA,EAAA,EAAwB,CAAC,MAAA,EAAQ,QAA4B,UAAA,KAAuB;AAC3F,IAAA,OAAO,MAAA,GAAS,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,GAAK,MAAM,UAAU,CAAA,UAAA,CAAA;EACrD,CAAC,CAAA;AAEH,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,CAAK,CAAA;AAC/C;AAEA,IAAO,2BAAA,GAAQ,mBAAA;;;ACxGf,SAAS,qBAAqB,GAAA,EAAU;AACtC,EAAA,GAAA,CAAI,IAAA,GAAO,EAAA;AACX,EAAA,GAAA,CAAI,MAAA,GAAS,EAAA;AACb,EAAA,GAAA,CAAI,QAAA,GAAW,EAAA;AACf,EAAA,GAAA,CAAI,QAAA,GAAW,EAAA;AACf,EAAA,OAAO,GAAA;AACT;AAEA,IAAO,4BAAA,GAAQ,oBAAA;;;ACRf,SAAS,UAAiB,KAAA,EAA2C;AACnE,EAAA,OAAO,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA;AAC1C;AAEA,IAAO,iBAAA,GAAQ,SAAA;;;ACJR,SAAS,gBAAA,CAAuB,OAAe,KAAA,EAAe;AACnE,EAAA,IAAI,KAAA,IAAS,CAAA,IAAK,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ;AACtC,IAAA,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAA,CAAyB,OAAe,OAAA,EAAe;AACrE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AACnC,EAAA,OAAO,gBAAA,CAAiB,OAAO,KAAK,CAAA;AACtC;;;ACNO,SAAS,YAAA,GAAe;AAC7B,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,QAAA,KAAa,WAAA;AAC9D;;;ACNA,SAAS,0BACP,uBAAA,EAC2B;AAC3B,EAAA,IAAI,kBAAA;AAEJ,EAAA,OAAO,eAAe,gCAAA,GAAmC;AACvD,IAAA,kBAAA,KAAuB,MAAM,uBAAA,EAAA;AAC7B,IAAA,OAAO,kBAAA;AACT,EAAA,CAAA;AACF;AAEA,IAAO,iCAAA,GAAQ;;;ACAf,IAAM,MAAA,GAAN,MAAM,OAAA,CAAO;AACX,EAAA,MAAA;AAEA,EAAA,GAAA;EAEA,WAAA,CAAY,OAAA,GAAyB,EAAA,EAAI;AACvC,IAAA,MAAM,EAAE,QAAA,GAAW,OAAA;AAEnB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAA,CAAK,GAAA,GAAM,MAAA,GAAS,IAAI,OAAA,CAAO,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAW,CAAA,GAAI,IAAA;AACtE,EAAA;AAEQ,EAAA,YAAA,CAAa,UAAoC,QAAA,EAAqB;AAC5E,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,GAAG,QAAQ,CAAA;IACzC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAG,QAAQ,CAAA;AAC5B,IAAA;AACF,EAAA;AAEA,EAAA,IAAA,CAAA,GAAQ,QAAA,EAAqB;AAC3B,IAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,GAAG,QAAQ,CAAA;AACtC,EAAA;AAEA,EAAA,IAAA,CAAA,GAAQ,QAAA,EAAqB;AAC3B,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,GAAG,QAAQ,CAAA;AACvC,EAAA;AAEA,EAAA,KAAA,CAAA,GAAS,QAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,GAAG,QAAQ,CAAA;AACxC,EAAA;AAEA,EAAA,KAAA,CAA+B,SAAgC,IAAA,EAAa;AAC1E,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC5C,MAAA,IAAI,cAAA,GAAiB,OAAO,KAAA,CAAM,MAAA;AAElC,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AAEjC,QAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,UAAA,cAAA,GAAiB,KAAA,CAAM,MAAA;AACzB,QAAA;AACF,MAAA;AAEA,MAAA,OAAO,cAAA;IACT,CAAC,CAAA;AAED,IAAA,MAAM,gBAA4B,EAAA;AAElC,IAAA,MAAM,cAAA,GAAiB,cAAc,GAAA,CAAI,CAAC,WAAW,QAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AACvE,IAAA,aAAA,CAAc,IAAA,CAAK,cAAA,EAAgB,EAAE,CAAA;AAErC,IAAA,KAAA,IAAS,WAAA,GAAc,CAAA,EAAG,WAAA,GAAc,OAAA,CAAQ,QAAQ,WAAA,EAAA,EAAe;AACrE,MAAA,MAAM,MAAA,GAAS,QAAQ,WAAW,CAAA;AAClC,MAAA,MAAM,YAAA,GAAe,cAAc,WAAW,CAAA;AAE9C,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,aAAA,CAAc,EAAA,CAAG,EAAE,CAAA,EAAG,IAAA,CAAK,MAAM,MAAA,CAAO,YAAA,EAAc,GAAG,CAAC,CAAA;AAC5D,IAAA;AAEA,IAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAEjC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,CAAA;AAErB,MAAA,KAAA,IAAS,WAAA,GAAc,CAAA,EAAG,WAAA,GAAc,OAAA,CAAQ,QAAQ,WAAA,EAAA,EAAe;AACrE,QAAA,MAAM,MAAA,GAAS,QAAQ,WAAW,CAAA;AAClC,QAAA,MAAM,YAAA,GAAe,cAAc,WAAW,CAAA;AAE9C,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACjC,QAAA,aAAA,CAAc,EAAA,CAAG,EAAE,CAAA,EAAG,IAAA,CAAK,MAAM,MAAA,CAAO,YAAA,EAAc,GAAG,CAAC,CAAA;AAC5D,MAAA;AACF,IAAA;AAEA,IAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAEjC,IAAA,MAAM,cAAA,GAAiB,aAAA,CACpB,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AACnB,MAAA,MAAM,cAAc,KAAA,KAAU,CAAA;AAC9B,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAO,CAAA,YAAA,EAAK,GAAA,CAAI,IAAA,CAAK,oBAAK,CAAC,CAAA,YAAA,CAAA;AAC7B,MAAA;AAEA,MAAA,MAAM,qBAAqB,KAAA,KAAU,CAAA;AACrC,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,OAAO,CAAA,YAAA,EAAK,GAAA,CAAI,IAAA,CAAK,oBAAK,CAAC,CAAA,YAAA,CAAA;AAC7B,MAAA;AAEA,MAAA,MAAM,UAAA,GAAa,KAAA,KAAU,aAAA,CAAc,MAAA,GAAS,CAAA;AACpD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,OAAO,CAAA,YAAA,EAAK,GAAA,CAAI,IAAA,CAAK,oBAAK,CAAC,CAAA,YAAA,CAAA;AAC7B,MAAA;AAEA,MAAA,OAAO,CAAA,OAAA,EAAK,GAAA,CAAI,IAAA,CAAK,UAAK,CAAC,CAAA,OAAA,CAAA;IAC7B,CAAC,CAAA,CACA,KAAK,IAAI,CAAA;AAEZ,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,cAAc,CAAA;AACzC,EAAA;AACF,CAAA;AAEA,IAAO,cAAA,GAAQ,MAAA;;;AC9GR,IAAM,UAAA,GAAa,iCAAA;AAAA;AAAA;AAAA;AAAA,EAIxB,YAAY,UAAA,CAAW,IAAA,IAAA,CAAS,MAAM,OAAO,QAAQ,CAAA,EAAG;AAC1D,CAAA;AAOO,IAAM,gBAAA,GAAmB,iCAAA,CAAqC,MAAM,OAAO,IAAI,CAAC,CAAA;AAEvF,eAAsB,WAAWA,KAAAA,EAAc;AAC7C,EAAA,MAAMC,GAAAA,GAAK,MAAM,gBAAA,EAAiB;AAElC,EAAA,IAAI;AACF,IAAA,MAAMA,GAAAA,CAAG,QAAA,CAAS,MAAA,CAAOD,KAAI,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AClBO,IAAM,MAAA,GAAS,IAAI,cAAA,CAAO;AAAA,EAC/B,MAAA,EAAQE,uBAAA,CAAM,IAAA,CAAK,sBAAsB;AAC3C,CAAC;AAuDD,IAAM,UAAA,GAAa,iCAAA,CAA0B,MAAM,OAAO,MAAM,CAAC,CAAA;AAEjE,eAAsB,gBAAA,CAAiB,KAAA,EAAgB,OAAA,GAAgC,EAAC,EAAG;AACzF,EAAA,IAAI,cAAa,EAAG;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,MAAA,GAAS,IAAA,EAAK,GAAI,OAAA;AAE1B,EAAA,MAAMC,KAAAA,GAAO,MAAM,UAAA,EAAW;AAE9B,EAAA,OAAOA,KAAAA,CAAK,QAAQ,KAAA,EAAO;AAAA,IACzB,MAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,KAAA,EAAO,QAAA;AAAA,IACP,cAAA,EAAgB,QAAA;AAAA,IAChB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;;;ACiDO,IAAM,6CAA6C,MAAA,CAAO,MAAA;AAAA,sBAC3D,GAAA,CAA6E;AAAA,IAC/E,UAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD;AACH,CAAA;AAEO,IAAM,8CAA8C,MAAA,CAAO,MAAA;AAAA,EAChE,IAAI,GAAA;AAAA,IACF;AAAA;AAEJ,CAAA;;;ACpJO,IAAM,kCAAA,GAAqC,OAAO,MAAA,CAAO;AAAA,EAC9D,KAAA,EAAO,OAAO,MAAA,CAAkD;AAAA,IAC9D,MAAA,EAAQ,QAAA;AAAA,IACR,GAAA,EAAK;AAAA,GACN,CAAA;AAAA,EACD,MAAA,EAAQ,OAAO,MAAA,CAAmD;AAAA,IAChE,MAAA,EAAQ,QAAA;AAAA,IACR,GAAA,EAAK;AAAA,GACN;AACH,CAAuF,CAAA;;;AC2BvF,IAAe,qBAAA,GAAf,MAAe,sBAAA,CAAsB;AAAA,EAGnC,QAAA,GAA2C,IAAA;AAAA,EAC3C,SAAA,GAAY,KAAA;AAAA,EAEJ,eAAA;AAAA,EACA,eAAA;AAAA,EAEA,sBAAkD,EAAC;AAAA,EAI3D,MAAgB,YAAY,aAAA,EAAoC;AAC9D,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,OAAO,IAAA,CAAK,eAAA;AAAA,IACd;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,kBAAkB,aAAA,EAAc;AACrC,MAAA,MAAM,IAAA,CAAK,eAAA;AAEX,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA,CAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AAId,MAAA,IAAI,CAAC,cAAa,EAAG;AACnB,QAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,MACrB;AAEA,MAAA,MAAM,KAAK,IAAA,EAAK;AAChB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAIA,MAAgB,WAAW,YAAA,EAA2C;AACpE,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,OAAO,IAAA,CAAK,eAAA;AAAA,IACd;AAEA,IAAA,MAAM,iBAAiB,YAAA,EAAa;AAEpC,IAAA,IAAI,0BAA0B,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AACvB,MAAA,MAAM,IAAA,CAAK,eAAA;AAAA,IACb;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AAAA,EASA,MAAgB,8BAAA,CACd,OAAA,EACA,QAAA,EACA;AACA,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,MAAM,sBAAA,CAAsB,0BAAA,CAA2B,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA;AAC/E,MAAA,OAAO,EAAE,WAAW,IAAA,EAAK;AAAA,IAC3B;AACA,IAAA,OAAO,EAAE,WAAW,KAAA,EAAM;AAAA,EAC5B;AAAA,EAEA,MAAgB,2BAAA,CAA4B,OAAA,EAAkB,eAAA,EAAsC;AAClG,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,qCAAA,CAAsC,SAAS,eAAe,CAAA;AAC5F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,wCAAA,CAAyC,UAAU,CAAA;AACzE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,yCAAyC,mBAAA,EAA6D;AAC5G,IAAA,IAAI,mBAAA,CAAoB,WAAW,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,mBAAA,CAAoB,MAAA;AAAA,MACzB,CAAC,qBAAqB,iBAAA,MAA6D;AAAA,QACjF,QAAQ,mBAAA,CAAoB,MAAA;AAAA,QAC5B,GAAA,EAAK,mBAAA,CAAoB,GAAA,IAAO,iBAAA,CAAkB;AAAA,OACpD;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,qCAAA,CACZ,OAAA,EACA,eAAA,EACiD;AACjD,IAAA,MAAM,qBAAA,GAAwB,mCAAmC,eAAe,CAAA;AAEhF,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,+BAAA,CAAgC,OAAO,CAAA;AAEhE,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,EAAM;AACnC,MAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,sCAAA,CAAuC,cAAc,WAAW,CAAA;AAEvG,MAAA,OAAO,CAAC,mBAAA,EAAqB,qBAAqB,CAAA,CAAE,OAAO,iBAAS,CAAA;AAAA,IACtE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAEnB,MAAA,OAAO,CAAC,qBAAqB,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,2BAA2B,WAAA,EAAuC;AAChE,IAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,WAAW,CAAA;AAAA,EAC3C;AAAA,EAEA,6BAA6B,WAAA,EAAuC;AAClE,IAAA,kBAAA,CAAmB,IAAA,CAAK,qBAAqB,WAAW,CAAA;AAAA,EAC1D;AAAA,EAEQ,gCAAgC,OAAA,EAAkB;AACxD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,QAAA,CAAS,CAACC,YAAAA,KAAgB;AACrE,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAWA,YAAAA,CAAY,eAAe,CAAA;AAAA,IAC3D,CAAC,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAc,sCAAA,CAAuC,OAAA,EAAkB,WAAA,EAAuC;AAC5G,IAAA,IAAI,OAAO,WAAA,CAAY,kBAAA,KAAuB,UAAA,EAAY;AACxD,MAAA,MAAM,aAAA,GAAgB,MAAM,sBAAA,CAAsB,wBAAA,CAAyB,OAAO,CAAA;AAClF,MAAA,OAAO,WAAA,CAAY,mBAAmB,aAAa,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,WAAA,CAAY,kBAAA;AAAA,EACrB;AAAA,EAUA,OAAO,6BAAA,CACL,OAAA,EACA,WAAA,EACc;AACd,IAAA,MAAM,OAAA,GAAU,IAAIC,gBAAAA,CAAY,WAAA,CAAY,OAAO,CAAA;AACnD,IAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAE3B,IAAA,MAAM,WAAA,GAAc,yBAAA,CAA0B,OAAA,CAAQ,MAAoB,KAAK,MAAA,KAAW,GAAA;AAE1F,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,IAAI,QAAA,CAAS,IAAA,EAAM,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC/C;AAEA,IAAA,IACE,OAAO,WAAA,CAAY,IAAA,KAAS,QAAA,IAC5B,WAAA,CAAY,SAAS,IAAA,IACrB,WAAA,CAAY,IAAA,KAAS,MAAA,IACrB,WAAA,CAAY,IAAA,YAAgB,YAC5B,WAAA,CAAY,IAAA,YAAgB,eAAA,IAC5B,WAAA,CAAY,IAAA,YAAgB,IAAA,IAC5B,YAAY,IAAA,YAAgB,WAAA,IAC5B,WAAA,CAAY,IAAA,YAAgB,cAAA,EAC5B;AACA,MAAA,OAAO,IAAI,SAAS,WAAA,CAAY,IAAA,IAAQ,MAAM,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,IACnE;AAEA,IAAA,OAAO,SAAS,IAAA,CAAK,WAAA,CAAY,MAAM,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC5D;AAAA,EAEA,aAAa,yBAAyB,OAAA,EAAkB;AACtD,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF;AAAA,EAEA,aAAa,eAAA,CACX,kBAAA,EACA,OAAA,EACqD;AACrD,IAAA,MAAM,UAAA,GAAa,mBAAmB,KAAA,EAAM;AAC5C,IAAA,MAAM,eAAA,GAAkB,WAAW,KAAA,EAAM;AAIzC,IAAA,MAAM,aAAa,MAAMC,kBAAA,CAA0B,UAAU,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AACvF,MAAA,MAAA,CAAO,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,IAAID,gBAAAA,CAA2B,UAAA,CAAW,OAAO,CAAA;AAEjE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAyB,UAAA,EAAY,OAAO,CAAA;AAEpE,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA;AAExC,IAAA,MAAM,YAAA,GAAe,IAAIE,qBAAAA,CAAqC,SAAA,CAAU,YAAY,CAAA;AAEpF,IAAA,MAAM,aAAA,GAAgB,IAAI,KAAA,CAAM,UAAA,EAAqE;AAAA,MACnG,GAAA,CAAI,QAAQ,QAAA,EAA4D;AACtE,QAAA,IAAI,sBAAA,CAAsB,uBAAA,CAAwB,QAAQ,CAAA,EAAG;AAC3D,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACrC,CAAA;AAAA,MAEA,GAAA,CAAI,QAAQ,QAAA,EAA4D;AACtE,QAAA,IAAI,sBAAA,CAAsB,uBAAA,CAAwB,QAAQ,CAAA,EAAG;AAC3D,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,MAC7C;AAAA,KACD,CAAA;AAED,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,MAAA,EAAQ;AAAA,MAC3C,KAAA,EAAO,UAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,SAAA,EAAW;AAAA,MAC9C,KAAA,EAAO,OAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,YAAA,EAAc;AAAA,MACjD,KAAA,EAAO,UAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,cAAA,EAAgB;AAAA,MACnD,KAAA,EAAO,YAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,KAAA,EAAO;AAAA,MAC1C,KAAA,EAAO,eAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEA,OAAe,wBAAwB,QAAA,EAAkB;AACvD,IAAA,OAAO,0CAAA,CAA2C,IAAI,QAAiB,CAAA;AAAA,EACzE;AAAA,EAEA,aAAa,iBACX,mBAAA,EAC4D;AAC5D,IAAA,MAAM,WAAA,GAAc,oBAAoB,KAAA,EAAM;AAC9C,IAAA,MAAM,gBAAA,GAAmB,YAAY,KAAA,EAAM;AAG3C,IAAA,MAAM,aAAa,MAAMD,kBAAA,CAA0B,WAAW,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AACxF,MAAA,MAAA,CAAO,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACpD,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,IAAID,gBAAAA,CAA2B,WAAA,CAAY,OAAO,CAAA;AAElE,IAAA,MAAM,aAAA,GAAgB,IAAI,KAAA,CAAM,WAAA,EAA6E;AAAA,MAC3G,GAAA,CAAI,QAAQ,QAAA,EAAmE;AAC7E,QAAA,IAAI,sBAAA,CAAsB,wBAAA,CAAyB,QAAQ,CAAA,EAAG;AAC5D,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACrC,CAAA;AAAA,MAEA,GAAA,CAAI,QAAQ,QAAA,EAAmE;AAC7E,QAAA,IAAI,sBAAA,CAAsB,wBAAA,CAAyB,QAAQ,CAAA,EAAG;AAC5D,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,MAC7C;AAAA,KACD,CAAA;AAED,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,MAAA,EAAQ;AAAA,MAC3C,KAAA,EAAO,UAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,SAAA,EAAW;AAAA,MAC9C,KAAA,EAAO,OAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,KAAA,EAAO;AAAA,MAC1C,KAAA,EAAO,gBAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEA,OAAe,yBAAyB,QAAA,EAAkB;AACxD,IAAA,OAAO,2CAAA,CAA4C,IAAI,QAAiB,CAAA;AAAA,EAC1E;AAAA,EAEA,OAAO,kBAAA,CACL,OAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,QAAQ,OAAA,EAAS,OAAA,IAAW,IAAI,EAAE,CAAA;AAClE,IAAA,MAAM,WAAA,GAAc,OAAA,EAAS,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA;AAEvD,IAAA,MAAM,SAA6C,EAAC;AAEpD,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,UAAU,CAAA,IAAK,MAAA,CAAO,QAAQ,WAAA,EAAa,MAAA,IAAU,EAAE,CAAA,EAAG;AAC/E,MAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAO,eAAe,QAAA,GAAW,kBAAA,CAAmB,UAAU,CAAA,GAAI,MAAA;AAAA,IACxF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,aAAa,0BAAA,CAA2B,UAAA,EAAqB,MAAA,EAAyC;AACpG,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAErD,IAAA,MAAM,CAAC,gBAAA,EAAkB,qBAAA,EAAuB,aAAa,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACjF,gBAAA,CAAiB,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,CAAA;AAAA,MAC3C,gBAAA,CAAiB,OAAA,CAAQ,YAAA,CAAa,QAAA,EAAU,CAAA;AAAA,MAChD,gBAAA,CAAiB,QAAQ,IAAI;AAAA,KAC9B,CAAA;AAED,IAAA,MAAA,CAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,OAAO,CAAA;AAAA,MAC3C,CAAA,EAAG,MAAA,KAAW,QAAA,GAAW,UAAA,GAAa,QAAQ,CAAA,iCAAA,EACzC,MAAA,KAAW,QAAA,GAAWH,uBAAAA,CAAM,OAAO,UAAU,CAAA,GAAIA,uBAAAA,CAAM,GAAA,CAAI,UAAU,CAAC,CAAA;;AAAA,CAAA,CAAA;AAAA,MAC3E,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA,CAAA;AAAA,MAChC,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,sBAAA;AAAA,MACA,qBAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAO,6BAAA,GAAQ,qBAAA;;;AC5XR,SAAS,2BAA2B,MAAA,EAAqB;AAC9D,EAAA,IAAI,cAAa,EAAG;AAClB,IAAA,MAAM,WAAA,GAAc,IAAI,UAAA,CAAW,MAAM,CAAA;AAEzC,IAAA,MAAM,sBAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA;AACzC,MAAA,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA,IACnC;AACA,IAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,IAAA,CAAK,EAAE,CAAA;AAElD,IAAA,OAAO,KAAK,cAAc,CAAA;AAAA,EAC5B,CAAA,MAAO;AACL,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EAC9C;AACF;AAEO,SAAS,2BAA2B,WAAA,EAAqB;AAC9D,EAAA,IAAI,cAAa,EAAG;AAClB,IAAA,MAAM,cAAA,GAAiB,KAAK,WAAW,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,WAAW,IAAA,CAAK,cAAA,EAAgB,CAAC,SAAA,KAAc,SAAA,CAAU,UAAA,CAAW,CAAC,CAAC,CAAA;AACpF,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAAA,EAC1C;AACF;AAEO,IAAM,SAAA,GAAY,aAAA;AAElB,SAAS,6BAA6B,SAAA,EAAmB;AAC9D,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,CAAC,CAAA;AAChC;AAEO,IAAM,eAAA,GAAkB,kBAAA;AAExB,SAAS,kCAAkC,SAAA,EAAmB;AACnE,EAAA,MAAM,UAAA,GAAa,6BAA6B,SAAS,CAAA;AACzD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAM,UAAA,GAAa,CAAA,GAAK,CAAC,CAAA;AACvC;;;AC/CA,eAAsB,iBAAiB,OAAA,EAAkD;AACvF,EAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,EAAM;AACnC,EAAA,MAAM,cAAA,GAAiB,aAAa,IAAA,GAAO,0BAAA,CAA2B,MAAM,YAAA,CAAa,WAAA,EAAa,CAAA,GAAI,IAAA;AAE1G,EAAA,OAAO;AAAA,IACL,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAA,EAAS,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC3C,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,IAAA,EAAM;AAAA,GACR;AACF;AAuCO,SAAS,oBAAoB,kBAAA,EAAkD;AACpF,EAAA,MAAM,mBAAmB,kBAAA,CAAmB,IAAA,GAAO,0BAAA,CAA2B,kBAAA,CAAmB,IAAI,CAAA,GAAI,IAAA;AAEzG,EAAA,OAAO,IAAI,SAAS,gBAAA,EAAkB;AAAA,IACpC,QAAQ,kBAAA,CAAmB,MAAA;AAAA,IAC3B,YAAY,kBAAA,CAAmB,UAAA;AAAA,IAC/B,OAAA,EAAS,IAAI,OAAA,CAAQ,kBAAA,CAAmB,OAAO;AAAA,GAChD,CAAA;AACH;;;AChFO,IAAM,YAAA,GAAe,kCAA4C,YAAY;AAClF,EAAA,MAAM,eAAe,UAAA,CAAW,MAAA;AAGhC,EAAA,OAAO,YAAA,IAAiB,MAAM,OAAO,QAAQ,CAAA;AAC/C,CAAC,CAAA;;;ACTM,IAAM,2BAAA,GAA8B,MAAA,CAAO,MAAA,CAAO,CAAC,mBAAmB,CAAU,CAAA;;;ACAvF,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EAC1C,YAAY,OAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,CAAA,uDAAA,EAA0D,OAAO,CAAA,CAAE,CAAA;AACzE,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAO,+BAAA,GAAQ,uBAAA;;;ACPf,IAAM,+BAAA,GAAN,cAA8C,KAAA,CAAM;AAAA,EAClD,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,oCAAoC,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,iCAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAO,uCAAA,GAAQ,+BAAA;;;ACqBf,IAAe,mBAAf,MAAgE;AAAA,EACtD,OAAA,uBAAc,GAAA,EAAkB;AAAA,EAExC,aAAA;AAAA,EACA,cAAA;AAAA,EAEQ,mBAKJ,EAAC;AAAA,EAEG,eAAA,GAAkB;AAAA,IACxB,YAAA,sBAAkB,GAAA;AAAiD,GACrE;AAAA,EAEU,YAAY,OAAA,EAA8D;AAClF,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,oCAAA;AAC9C,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,kCAAA;AAAA,EAClD;AAAA,EAIA,MAAgB,cAAA,CAAe,MAAA,EAAsB,OAAA,GAA+C,EAAC,EAAG;AACtG,IAAA,MAAM,WAAA,GAAc,wBAAwB,MAAA,EAAQ;AAAA,MAClD,SAAS,IAAA,CAAK,aAAA;AAAA,MACd,uBAAuB,OAAA,CAAQ;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,mBAAA,GAAsB,OAAO,UAAA,KAA0C;AAC3E,MAAA,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,UAAU,CAAA;AAAA,IACnD,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,mBAAmB,CAAA;AAEtD,IAAA,MAAM,WAAA;AAIN,IAAA,SAAS,kBAAkB,KAAA,EAAgC;AACzD,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,iBAAiB,CAAA;AAElD,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,mBAAmB,CAAA;AACzD,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,iBAAiB,CAAA;AACrD,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,iBAAiB,CAAA;AAErD,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,iBAAiB,CAAA;AAElD,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,EACzB;AAAA,EAEQ,mBAAA,GAAsB,OAAO,MAAA,EAAsB,UAAA,KAA0C;AACnG,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,oBAAA,CAAqB,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,sBAAA,GAAyB,IAAA,CAAK,kBAAA,CAAmB,UAAA,CAAW,IAAI,CAAA;AACtE,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,YAAA,CAAa,sBAAsB,CAAA;AAClE,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,iBAAA,EAAmB,MAAM,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAAA,EAEQ,qBAAqB,WAAA,EAAwE;AACnG,IAAA,OACE,OAAO,WAAA,KAAgB,QAAA,IAAY,2BAAA,CAA4B,SAAS,WAAsC,CAAA;AAAA,EAElH;AAAA,EAEQ,mBAAmB,IAAA,EAAyB;AAGlD,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,gCAAwB,IAAI,CAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,aAAa,kBAAA,EAAsD;AACzE,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,IAAA,CAAK,MAAM,kBAAkB,CAAA;AAAA,IAC/C,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,gCAAwB,kBAAkB,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,aAAa,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,gCAAwB,kBAAkB,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,aAAa,CAAA,EAAG;AACtC,MAAA,OAAO;AAAA,QACL,IAAI,aAAA,CAAc,EAAA;AAAA,QAClB,SAAS,aAAA,CAAc,OAAA;AAAA,QACvB,WAAW,aAAA,CAAc,SAAA;AAAA,QACzB,MAAM,aAAA,CAAc;AAAA,OACtB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,aAAA,CAAc,EAAA;AAAA,MAClB,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,MAAM,aAAA,CAAc;AAAA,KACtB;AAAA,EACF;AAAA,EAEQ,UAAU,OAAA,EAAuD;AACvE,IAAA,OACE,OAAO,YAAY,QAAA,IACnB,OAAA,KAAY,QACZ,IAAA,IAAQ,OAAA,IACR,OAAO,OAAA,CAAQ,EAAA,KAAO,QAAA,IACtB,aAAa,OAAA,IACb,OAAO,QAAQ,OAAA,KAAY,QAAA,KAC1B,EAAE,WAAA,IAAe,OAAA,CAAA,IAAY,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,CAAA;AAAA,EAE/D;AAAA,EAEA,MAAc,eAAA,CAAgB,OAAA,EAAmC,MAAA,EAAsB;AACrF,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA,EAAG;AAChC,MAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,MAAM,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,MAAM,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAc,oBAAA,CAAqB,OAAA,EAAwC,MAAA,EAAsB;AAI/F,IAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA,EAAG,KAAA,wBAAa,GAAA,EAAI;AAE3E,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,OAAO,QAAA,KAAa;AACjE,MAAA,MAAM,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,IAChC,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAAA,EACpC;AAAA,EAEA,MAAc,oBAAA,CAAqB,OAAA,EAAwC,MAAA,EAAsB;AAC/F,IAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA,EAAG,KAAA,wBAAa,GAAA,EAAI;AAE3E,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,OAAO,QAAA,KAAa;AACjE,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AAChD,MAAA,MAAM,IAAA,CAAK,MAAM,OAAA,EAAS,SAAA,EAAW,EAAE,OAAA,EAAS,CAAC,MAAM,CAAA,EAAG,CAAA;AAAA,IAC5D,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAAA,EACpC;AAAA,EAEA,MAAgB,kBAAA,CAAmB,OAAA,GAAoC,IAAA,CAAK,OAAA,EAAS;AACnF,IAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA,KAAW;AAC5D,MAAA,MAAM,kBAAkB,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,CAAK,eAAe,CAAA;AAAA,IACjE,CAAC,CAAA;AACD,IAAA,MAAM,OAAA,CAAQ,IAAI,eAAe,CAAA;AAAA,EACnC;AAAA,EAEQ,aAAa,MAAA,EAAsB;AACzC,IAAA,IAAA,CAAK,mBAAA,CAAoB,CAAC,MAAM,CAAC,CAAA;AACjC,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAc,kBAAA,CACZ,OAAA,EACA,SAAA,EACA;AACA,IAAA,MAAMM,OAAAA,GAAS,MAAM,YAAA,EAAa;AAElC,IAAA,MAAM,YAAA,GAAuD;AAAA,MAC3D,EAAA,EAAIA,QAAO,UAAA,EAAW;AAAA,MACtB,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACR;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,CACJ,OAAA,EACA,SAAA,EACA,OAAA,GAEI,EAAC,EACL;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,SAAS,CAAA;AAC9D,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,OAAA,CACJ,OAAA,EACA,WAAA,EACA,OAAA,GAEI,EAAC,EACL;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,WAAW,CAAA;AAClE,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAEzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,SAAS,OAAA,CAAQ,EAAA,EAAI,QAAQ,OAAO,CAAA;AAC7E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,YAAA,CACJ,OAAA,EACA,SAAA,EACA,OAAA,GAAoC,KAAK,OAAA,EACzC;AACA,IAAA,OAAO,IAAI,OAAA,CAAgD,CAAC,OAAA,EAAS,MAAA,KAAW;AAC9E,MAAA,MAAM,YAAA,GAAe,WAAW,MAAM;AACpC,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,aAAa,CAAA;AACpC,QAAA,IAAA,CAAK,sBAAA,CAAuB,SAAS,aAAa,CAAA;AAElD,QAAA,MAAM,YAAA,GAAe,IAAI,4BAAA,CAA6B,IAAA,CAAK,cAAc,CAAA;AACzE,QAAA,MAAA,CAAO,YAAY,CAAA;AAAA,MACrB,CAAA,EAAG,KAAK,cAAc,CAAA;AAEtB,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,CAAC,KAAA,KAAU;AACnE,QAAA,YAAA,CAAa,YAAY,CAAA;AAEzB,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,aAAa,CAAA;AACpC,QAAA,IAAA,CAAK,sBAAA,CAAuB,SAAS,aAAa,CAAA;AAElD,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAC,CAAA;AAED,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,CAAC,OAAA,KAAY;AACvD,QAAA,IAAI,OAAA,CAAQ,cAAc,SAAA,EAAW;AACnC,UAAA,YAAA,CAAa,YAAY,CAAA;AAEzB,UAAA,IAAA,CAAK,QAAA,CAAS,SAAS,aAAa,CAAA;AACpC,UAAA,IAAA,CAAK,sBAAA,CAAuB,SAAS,aAAa,CAAA;AAElD,UAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QACjB;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,eAAyD,OAAA,EAA4C;AAC3G,IAAA,OAAO,WAAA,IAAe,OAAA;AAAA,EACxB;AAAA,EAEA,MAAM,KAAA,CACJ,OAAA,EACA,SAAA,EACA,OAAA,EAGA;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,SAAS,CAAA;AAG9D,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAc,kBAAA,CACZ,OAAA,EACA,SAAA,EACA;AACA,IAAA,MAAMA,OAAAA,GAAS,MAAM,YAAA,EAAa;AAElC,IAAA,MAAM,YAAA,GAAuD;AAAA,MAC3D,EAAA,EAAIA,QAAO,UAAA,EAAW;AAAA,MACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,WAAW,OAAA,CAAQ,EAAA;AAAA,MACnB,IAAA,EAAM;AAAA,KACR;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEQ,WAAA,CACN,OAAA,EACA,OAAA,GAAoC,IAAA,CAAK,OAAA,EACzC;AACA,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,uCAAA,EAAgC;AAAA,IAC5C;AAEA,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAEjD,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAA,CAAO,KAAK,kBAAkB,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,OAAA,CACE,SACA,QAAA,EACU;AACV,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,2BAAA,CAAqC,OAAO,CAAA;AACnE,IAAA,SAAA,CAAU,KAAA,CAAM,IAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,4BAAsE,OAAA,EAAkB;AAC9F,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,IAAK;AAAA,MAClD,KAAA,sBAAW,GAAA,EAAI;AAAA,MACf,KAAA,sBAAW,GAAA;AAAI,KACjB;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,GAAI,SAAA;AAAA,IACnC;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAGE,SAAkB,QAAA,EAA8B;AAChD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,2BAAA,CAAqC,OAAO,CAAA;AACnE,IAAA,SAAA,CAAU,KAAA,CAAM,IAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,QAAA,CACE,SACA,QAAA,EACA;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG,KAAA,CAAM,OAAO,QAAQ,CAAA;AAAA,EACvD;AAAA,EAEA,QAAA,CACE,SACA,QAAA,EACA;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG,KAAA,CAAM,OAAO,QAAQ,CAAA;AAAA,EACvD;AAAA,EAEA,yBAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,mBAAmB,EAAC;AAAA,EAC3B;AAAA,EAEQ,qBAAA,CAAsB,SAAmC,QAAA,EAAoC;AACnG,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,YAAA,CAAa,IAAI,MAAM,CAAA;AAC5D,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,uBAAgB,GAAA,EAAI;AACpB,QAAA,IAAA,CAAK,eAAA,CAAgB,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,SAAS,CAAA;AAAA,MACzD;AACA,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,sBAAA,CAAuB,SAAmC,QAAA,EAAoC;AACpG,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,gBAAgB,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,mBAAA,CAAoB,OAAA,GAAoC,IAAA,CAAK,OAAA,EAAS;AACpE,IAAA,MAAM,UAAA,GAAa,IAAI,0BAAA,EAA2B;AAElD,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,YAAY,IAAA,CAAK,eAAA,CAAgB,aAAa,GAAA,CAAI,MAAM,KAAK,EAAC;AACpE,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,QAAA,CAAS,UAAU,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAEA,IAAO,wBAAA,GAAQ,gBAAA;;;AC1Yf,IAAM,EAAE,eAAA,EAAiB,YAAA,EAAa,GAAIC,6BAAA;AAc1C,IAAM,eAAA,GAAN,cAA8D,wBAAA,CAAyB;AAAA,EAC7E,eAAA;AAAA,EAEA,UAAA;AAAA,EACA,YAAA;AAAA,EAER,YAAY,OAAA,EAAiC;AAC3C,IAAA,KAAA,CAAM;AAAA,MACJ,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,gBAAgB,OAAA,CAAQ;AAAA,KACzB,CAAA;AAED,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAAA,EAC9B;AAAA,EAEA,IAAI,SAAA,GAAY;AACd,IAAA,OAAO,KAAK,eAAA,KAAoB,MAAA;AAAA,EAClC;AAAA,EAEA,KAAA,GAAQ;AACN,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,kBAAkB,IAAI,YAAA,CAAa,EAAE,MAAA,EAAQ,IAAA,CAAK,YAAY,CAAA;AAEpE,IAAA,eAAA,CAAgB,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AACrC,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,IACrB,CAAC,CAAA;AAED,IAAA,eAAA,CAAgB,EAAA,CAAG,YAAA,EAAc,OAAO,MAAA,EAAQ,OAAA,KAAY;AAC1D,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,OAAO,CAAA;AAEtD,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,MAAA,CAAO,OAAO,CAAA;AACjC,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,CAAM,eAAe,MAAM,CAAA;AACjC,QAAA,MAAA,CAAO,KAAK,mBAAqD,CAAA;AAAA,MACnE,SAAS,KAAA,EAAO;AACd,QAAA,eAAA,CAAgB,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,MACrC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA,EAEA,MAAM,IAAA,GAAO;AACX,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,CAAC,KAAK,SAAA,EAAW;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,yBAAA,EAA0B;AAChC,IAAA,KAAA,CAAM,mBAAA,EAAoB;AAC1B,IAAA,MAAM,MAAM,kBAAA,EAAmB;AAE/B,IAAA,MAAM,kBAAkB,IAAA,CAAK,eAAA,EAAiB,EAAE,OAAA,EAAS,IAAA,CAAK,eAAe,CAAA;AAC7E,IAAA,IAAA,CAAK,gBAAgB,kBAAA,EAAmB;AACxC,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AACF,CAAA;AAEA,IAAO,uBAAA,GAAQ,eAAA;;;ACtFf,IAAM,4BAAA,GAAN,cAA2C,KAAA,CAAM;AAAA,EAC/C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAE,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,8BAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAO,oCAAA,GAAQ,4BAAA;;;ACPf,IAAM,gCAAA,GAAN,cAA+C,KAAA,CAAM;AAAA,EACnD,WAAA,CAAY,eAAuB,sBAAA,EAAgC;AACjE,IAAA,KAAA,CAAM,CAAA,+BAAA,EAAkC,aAAa,CAAA,EAAA,EAAK,sBAAsB,CAAA,CAAE,CAAA;AAClF,IAAA,IAAA,CAAK,IAAA,GAAO,kCAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAO,wCAAA,GAAQ,gCAAA;;;ACPf,IAAM,iCAAA,GAAN,cAAgD,KAAA,CAAM;AAAA,EACpD,YAAY,UAAA,EAAoB;AAC9B,IAAA,KAAA,CAAM,CAAA,iCAAA,EAAoC,UAAU,CAAA,CAAE,CAAA;AACtD,IAAA,IAAA,CAAK,IAAA,GAAO,mCAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAO,yCAAA,GAAQ,iCAAA;;;ACSR,IAAM,uCAAuCT,qBAAA,CAAK,IAAA;AAAA,EACvD,QAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAS,EAA0B,CAAA;AACrC;AAEO,IAAM,+BAAA,GAAkC,EAAA;AAExC,IAAM,mCAAA,GAAsC,EAAA;AAC5C,IAAM,qCAAqC,+BAAA,GAAkC,mCAAA;AAC7E,IAAM,wCAAA,GAA2C,iCAAA;AAAA,EACtD;AACF,CAAA;AAEO,IAAM,iCAAA,GAAoC,EAAA;AAC1C,IAAM,iCAAA,GAAoC,OAAO,SAA6C,CAAA;AAC9F,IAAM,iCAAA,GAAoC,GAAA;AAC1C,IAAM,gCAAA,GAAmC,QAAA;AAEhD,IAAM,MAAA,GAASG,qBAAA,CAAK,SAAA,CAAUK,uBAAA,CAAO,MAAM,CAAA;AAE3C,eAAe,oBAAA,CAAqB,YAAoB,IAAA,EAAc;AACpE,EAAA,MAAM,aAAa,MAAM,MAAA;AAAA,IACvB,UAAA;AAAA,IACA,IAAA;AAAA,IACA,iCAAA;AAAA,IACA,6BAA6B,iCAAiC,CAAA;AAAA,IAC9D;AAAA,GACF;AAEA,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,QAAA,CAAS,KAAK,CAAA;AACtC,EAAA,OAAO,IAAA;AACT;AAgBO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOA,uBAAA,CAAO,UAAA,EAAW,CAAE,OAAA,CAAQ,cAAc,EAAE,CAAA;AACrD;AAEO,SAAS,0BAA0B,OAAA,EAAiB;AACzD,EAAA,OAAO,OAAA,CAAQ,MAAA,KAAW,+BAAA,IAAmC,SAAA,CAAU,KAAK,OAAO,CAAA;AACrF;AAEA,SAAS,6BAA6B,UAAA,EAAoB;AACxD,EAAA,OAAO,UAAA,CAAW,MAAA,KAAW,wCAAA,IAA4C,eAAA,CAAgB,KAAK,UAAU,CAAA;AAC1G;AAEA,eAAsB,iCAAiC,eAAA,EAAyB;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,qBAAA,GAAwBR,qBAAA,CAAK,OAAA,CAAQ,eAAe,CAAA;AAC1D,IAAA,MAAMC,oBAAG,QAAA,CAAS,KAAA,CAAM,uBAAuB,EAAE,SAAA,EAAW,MAAM,CAAA;AAClE,IAAA,MAAMA,mBAAA,CAAG,SAAS,KAAA,CAAM,eAAA,EAAiB,EAAE,IAAA,EAAM,GAAA,EAAO,SAAA,EAAW,IAAA,EAAM,CAAA;AACzE,IAAA,MAAMA,mBAAA,CAAG,QAAA,CAAS,UAAA,CAAWD,qBAAA,CAAK,KAAK,eAAA,EAAiB,YAAY,CAAA,EAAG,CAAA,CAAA,EAAIU,oBAAG,GAAG,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,SAAS,CAAA;AAAA,EAC5G,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,KAAA;AAAA,MACL,CAAA,EAAGR,uBAAAA,CAAM,GAAA,CAAIA,uBAAAA,CAAM,IAAA,CAAK,QAAG,CAAC,CAAC,CAAA,wCAAA,EAA2CA,uBAAAA,CAAM,OAAA,CAAQ,eAAe,CAAC,CAAA;AAAA,KACxG;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,IAAM,oCAAsCS,YAAA,CAAA,MAAA,CAAO;AAAA,EACjD,OAAA,EAAWA,qBAAQ,CAAC,CAAA;AAAA,EACpB,OAASA,YAAA,CAAA,MAAA,CAAO;AAAA,IACd,IAAMA,YAAA,CAAA,MAAA,EAAO,CAAE,OAAO,+BAA+B,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,IACtE,IAAA,EAAQA,YAAA,CAAA,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,QAAUA,YAAA,CAAA,MAAA,CAAO;AAAA,MACf,MAAQA,YAAA,CAAA,MAAA,EAAO,CAAE,OAAO,iCAAiC,CAAA,CAAE,MAAM,SAAS,CAAA;AAAA,MAC1E,MAAQA,YAAA,CAAA,MAAA,EAAO,CAAE,OAAO,iCAAiC,CAAA,CAAE,MAAM,SAAS;AAAA,KAC3E,CAAA;AAAA,IACD,SAAA,EAAaA,YAAA,CAAA,GAAA,CAAI,QAAA,EAAS,CAAE,SAAA,CAAU,CAAC,KAAA,KAAU,IAAI,IAAA,CAAK,KAAK,CAAC;AAAA,GACjE;AACH,CAAC,CAAA;AAcD,eAAsB,0BAAA,CAA2B,iBAAyB,KAAA,EAAyB;AACjG,EAAA,MAAM,YAAA,GAAeX,qBAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,MAAM,EAAE,CAAA;AAExD,EAAA,MAAM,cAAA,GAAkD;AAAA,IACtD,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,MAAM,MAAA,CAAO,IAAA;AAAA,MACnB,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,KACrB;AAAA,IACA,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA;AAAY,GACzC;AAEA,EAAA,MAAM,gBAAA,GAAmB,kCAAkC,KAAA,CAAM;AAAA,IAC/D,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACoC,CAAA;AAE7C,EAAA,MAAMC,mBAAA,CAAG,SAAS,SAAA,CAAU,YAAA,EAAc,KAAK,SAAA,CAAU,gBAAA,EAAkB,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,IACnF,IAAA,EAAM,GAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,OAAO,YAAA;AACT;AAEA,eAAsB,4BAAA,CACpB,SACA,OAAA,EAC2C;AAC3C,EAAA,IAAI,CAAC,yBAAA,CAA0B,OAAO,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,qCAA6B,OAAO,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,aAAA,GAAgBD,qBAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAChE,EAAA,MAAM,eAAA,GAAkB,MAAM,UAAA,CAAW,aAAa,CAAA;AAEtD,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,wBAAA,GAA2B,MAAMC,mBAAA,CAAG,QAAA,CAAS,SAAS,aAAA,EAAe,EAAE,QAAA,EAAU,OAAA,EAAS,CAAA;AAEhG,EAAA,MAAM,aAAa,iCAAA,CAAkC,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,wBAAwB,CAAY,CAAA;AAE9G,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,IAAA,MAAM,IAAI,wCAAA,CAAiC,aAAA,EAAe,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,WAAW,IAAA,CAAK,KAAA;AACzB;AAEA,eAAsB,sBAAA,CACpB,OAAA,GAAuD,EAAC,EAC7B;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,GAAkB,oCAAA,EAAqC,GAAI,OAAA;AAEzE,EAAA,MAAM,qBAAA,GAAwB,MAAM,UAAA,CAAW,eAAe,CAAA;AAE9D,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,MAAM,iCAAiC,eAAe,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,UAAU,wBAAA,EAAyB;AAIzC,EAAA,IAAI,CAAC,yBAAA,CAA0B,OAAO,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,qCAA6B,OAAO,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,sBAAA,GAAyB,6BAA6B,mCAAmC,CAAA;AAC/F,EAAA,MAAM,cAAcO,uBAAA,CAAO,WAAA,CAAY,sBAAsB,CAAA,CAAE,SAAS,KAAK,CAAA;AAE7E,EAAA,MAAM,0BAAA,GAA6B,6BAA6B,iCAAiC,CAAA;AACjG,EAAA,MAAM,kBAAkBA,uBAAA,CAAO,WAAA,CAAY,0BAA0B,CAAA,CAAE,SAAS,KAAK,CAAA;AACrF,EAAA,MAAM,eAAA,GAAkB,MAAM,oBAAA,CAAqB,WAAA,EAAa,eAAe,CAAA;AAE/E,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA;AAItF,EAAA,IAAI,CAAC,4BAAA,CAA6B,UAAU,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,0CAAkC,UAAU,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,sBAAe,IAAA;AAAK,GACtB;AAEA,EAAA,MAAM,0BAAA,CAA2B,iBAAiB,KAAK,CAAA;AAEvD,EAAA,OAAO,KAAA;AACT;AAEA,eAAsB,qBAAA,CAAsB,OAAA,GAAwC,EAAC,EAAG;AACtF,EAAA,MAAM,EAAE,eAAA,GAAkB,oCAAA,EAAqC,GAAI,OAAA;AAEnE,EAAA,MAAM,qBAAA,GAAwB,MAAM,UAAA,CAAW,eAAe,CAAA;AAE9D,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAMP,mBAAA,CAAG,QAAA,CAAS,QAAQ,eAAe,CAAA;AAEvD,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AAClD,IAAA,IAAI,CAAC,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,QAAQ,MAAM,4BAAA,CAA6B,OAAA,EAAS,EAAE,iBAAiB,CAAA;AAC7E,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,UAAA,CAAW,iBAAiB,CAAA;AAElE,EAAA,MAAM,SAAsC,EAAC;AAE7C,EAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAC5C,IAAA,IAAI,cAAA,CAAe,WAAW,UAAA,EAAY;AACxC,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAe,MAAM,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,cAAA,CAAe,KAAA,KAAU,IAAA,EAAM;AACxC,MAAA,MAAA,CAAO,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,EAAO,UAAA,KAAe,KAAA,CAAM,SAAA,CAAU,OAAA,EAAQ,GAAI,UAAA,CAAW,SAAA,CAAU,OAAA,EAAS,CAAA;AAE7F,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,wBAAA,CAAyB,YAAoB,OAAA,EAAsC;AACvG,EAAA,IAAI,CAAC,4BAAA,CAA6B,UAAU,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,0CAAkC,UAAU,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,oBAAoB,MAAA,CAAO,IAAA,CAAK,YAAY,WAAW,CAAA,CAAE,SAAS,KAAK,CAAA;AAE7E,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,KAAA,CAAM,CAAA,EAAG,+BAA+B,CAAA;AAC1E,EAAA,MAAM,cAAc,iBAAA,CAAkB,KAAA;AAAA,IACpC,+BAAA;AAAA,IACA,+BAAA,GAAkC;AAAA,GACpC;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAM,4BAAA,CAA6B,OAAA,EAAS,OAAO,CAAA;AAEzE,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,IAAI,0CAAkC,UAAU,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,kBAAkB,MAAM,oBAAA,CAAqB,WAAA,EAAa,aAAA,CAAc,OAAO,IAAI,CAAA;AAEzF,EAAA,IAAI,eAAA,KAAoB,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM;AACjD,IAAA,MAAM,IAAI,0CAAkC,UAAU,CAAA;AAAA,EACxD;AACF;AAEA,eAAsB,sBAAA,CAAuB,OAAA,EAAiB,OAAA,GAAwC,EAAC,EAAG;AACxG,EAAA,MAAM,EAAE,eAAA,GAAkB,oCAAA,EAAqC,GAAI,OAAA;AAInE,EAAA,IAAI,CAAC,yBAAA,CAA0B,OAAO,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,qCAA6B,OAAO,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,aAAA,GAAgBD,qBAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA;AAExD,EAAA,MAAMC,oBAAG,QAAA,CAAS,EAAA,CAAG,eAAe,EAAE,KAAA,EAAO,MAAM,CAAA;AACrD;;;ACxSA,eAAsB,WAAA,GAAiC;AACrD,EAAA,MAAMW,KAAAA,GAAO,MAAM,UAAA,EAAW;AAE9B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,EAAAA,KAAAA;AAAA,IACA,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,IAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACMA,IAAM,oBAAN,MAA2D;AAAA,EACjD,UAAA;AAAA,EACA,eAAA;AAAA,EAER,SAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA,EACA,eAAA;AAAA,EAEQ,oBAAA,GAEJ;AAAA,IACF,KAAK,EAAC;AAAA,IACN,MAAM,EAAC;AAAA,IACP,OAAO,EAAC;AAAA,IACR,KAAK,EAAC;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,MAAM,EAAC;AAAA,IACP,SAAS;AAAC,GACZ;AAAA,EAEQ,kBAAA,uBAAyB,GAAA,EAAY;AAAA,EAE7C,YAAY,OAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,QAAA,IAAY,gBAAA;AACrC,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA;AACrB,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAQ,oBAAA,IAAwB,8BAAA;AAC5D,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,eAAA;AAAA,EACjC;AAAA,EAEA,IAAI,QAAA,GAAW;AACb,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,IAAI,SAAS,WAAA,EAAqB;AAChC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,sCAA8B,yDAAyD,CAAA;AAAA,IACnG;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,WAAA;AAAA,EACnB;AAAA,EAEA,IAAI,IAAA,GAAO;AACT,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,IAAI,KAAK,OAAA,EAA6B;AACpC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,sCAA8B,qDAAqD,CAAA;AAAA,IAC/F;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AAAA,EACf;AAAA,EAEA,IAAI,SAAA,GAAY;AACd,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,UAAA,EAAY,aAAa,CAAC,CAAC,KAAK,eAAA,EAAiB,SAAA;AAAA,EACjE;AAAA,EAEA,IAAY,iBAAA,GAAgC;AAG1C,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAI,wCAAA,EAAiC;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAY,sBAAA,GAA4E;AAGtF,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,MAAM,IAAI,wCAAA,EAAiC;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,MAAM,KAAA,GAAQ;AACZ,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAaC,mBAAA,CAAa;AAAA,MAC7B,SAAA,EAAW,IAAA;AAAA,MACX,oBAAA,EAAsB;AAAA,KACvB,CAAA;AACD,IAAA,MAAM,KAAK,eAAA,EAAgB;AAE3B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,uBAAA,CAAgB;AAAA,MACzC,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,cAAc,IAAA,CAAK;AAAA,KACpB,CAAA;AAED,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA,EAEQ,+BAAA,GAA+D,OAAO,OAAA,EAAS,OAAA,KAAY;AACjG,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,6BAAA,CAA8B,OAAO,CAAA;AAE7D,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,0DAAA,EAA2D;AAAA,IAC/F;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,yBAAyB,UAAA,EAAY,EAAE,eAAA,EAAiB,IAAA,CAAK,iBAAiB,CAAA;AACpF,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,qCAAA,EAAsC;AAAA,IAC1E;AAAA,EACF,CAAA;AAAA,EAEQ,8BAA8B,OAAA,EAA0B;AAC9D,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,wBAAwB,CAAA,IAAK,EAAA;AAC/D,IAAA,MAAM,kBAAA,GAAqB,kBAAA,CAAmB,SAAS,CAAA,CAAE,MAAM,IAAI,CAAA;AAEnE,IAAA,KAAA,MAAW,qBAAqB,kBAAA,EAAoB;AAClD,MAAA,MAAM,eAAA,GAAkB,4BAAA,CAA6B,IAAA,CAAK,iBAAiB,CAAA;AAC3E,MAAA,MAAM,UAAA,GAAa,iBAAiB,MAAA,EAAQ,UAAA;AAE5C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,eAAA,GAAkB;AAC9B,IAAA,MAAM,eAAA,CAAgB,KAAK,iBAAA,EAAmB;AAAA,MAC5C,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA,CAAkB,IAAA,CAAK,iBAAiB,CAAA;AAEpD,IAAA,IAAA,CAAK,iBAAA,CAAkB,EAAA,CAAG,SAAA,EAAW,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC7D;AAAA,EAEQ,oBAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,uBAAuB,KAAA,EAAM;AAElC,IAAA,IAAA,CAAK,sBAAA,CAAuB,OAAA,CAAQ,6BAAA,EAA+B,IAAA,CAAK,YAAY,CAAA;AACpF,IAAA,IAAA,CAAK,sBAAA,CAAuB,OAAA,CAAQ,4BAAA,EAA8B,IAAA,CAAK,WAAW,CAAA;AAAA,EACpF;AAAA,EAEQ,YAAA,GAAe,CACrB,OAAA,EACA,MAAA,KACG;AACH,IAAA,MAAM,SAAS,OAAA,CAAQ,IAAA;AAEvB,IAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,8BAA8B,MAAM,CAAA;AAEzC,IAAA,OAAO,EAAC;AAAA,EACV,CAAA;AAAA,EAEQ,WAAA,GAAc,CACpB,OAAA,EACA,MAAA,KACG;AACH,IAAA,IAAA,CAAK,2BAA2B,MAAM,CAAA;AAEtC,IAAA,MAAM,oBAAoB,OAAA,CAAQ,IAAA;AAClC,IAAA,MAAM,4BAA4B,iBAAA,KAAsB,MAAA;AAExD,IAAA,IAAI,yBAAA,EAA2B;AAG7B,MAAA,IAAA,CAAK,sBAAA,CAAuB,mBAAA,CAAoB,CAAC,MAAM,CAAC,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACvC,QAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,MAAM,CAAA;AAAA,MAC1C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,8BAA8B,MAAM,CAAA;AAEzC,IAAA,OAAO,EAAC;AAAA,EACV,CAAA;AAAA,EAEQ,mBAAA,CAAoB,EAAE,EAAA,EAAI,OAAA,EAAS,QAAQ,IAAA,EAAAb,KAAAA,IAA2B,MAAA,EAAgB;AAC5F,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA;AAEtD,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,EAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,4BAAoBA,KAAI,CAAA;AAAA,MACnC;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,8BAA8B,MAAA,EAAgB;AACpD,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA,EAAG;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAA,IAAA,CAAK,2BAA2B,MAAM,CAAA;AACtC,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,MAAM,CAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,MAAM,CAAA;AAAA,EACpC;AAAA,EAEQ,2BAA2B,MAAA,EAAgB;AACjD,IAAA,KAAA,MAAW,aAAA,IAAiB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,oBAAoB,CAAA,EAAG;AACpE,MAAA,MAAM,cAAc,aAAA,CAAc,SAAA,CAAU,CAAC,YAAA,KAAiB,YAAA,CAAa,WAAW,MAAM,CAAA;AAC5F,MAAA,gBAAA,CAAiB,eAAe,WAAW,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAO;AACX,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,IAAA,MAAM,KAAK,cAAA,EAAe;AAAA,EAC5B;AAAA,EAEA,MAAc,cAAA,GAAiB;AAC7B,IAAA,MAAM,cAAA,CAAe,KAAK,iBAAiB,CAAA;AAC3C,IAAA,IAAA,CAAK,kBAAkB,kBAAA,EAAmB;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,EACpB;AAAA,EAEA,MAAc,mBAAA,GAAsB;AAClC,IAAA,IAAA,CAAK,sBAAA,CAAuB,QAAA,CAAS,6BAAA,EAA+B,IAAA,CAAK,YAAY,CAAA;AACrF,IAAA,IAAA,CAAK,sBAAA,CAAuB,QAAA,CAAS,4BAAA,EAA8B,IAAA,CAAK,WAAW,CAAA;AAEnF,IAAA,MAAM,IAAA,CAAK,uBAAuB,IAAA,EAAK;AAEvC,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AAAA,EAEQ,iBAAA,GAAoB,OAAO,WAAA,EAA8B,YAAA,KAAiC;AAChG,IAAA,MAAM,OAAA,GAAUc,2BAAA,CAAqB,WAAA,EAAa,MAAM,aAAa,CAAA;AACrE,IAAA,MAAM,iBAAA,GAAoB,MAAM,gBAAA,CAAiB,OAAO,CAAA;AAExD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAU,sBAAA,KAA2B,MAAM,IAAA,CAAK,yBAAyB,iBAAiB,CAAA;AAElG,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAA,CAAK,8BAAA,CAA+B,QAAA,EAAU,CAAC,6BAAA,EAA+B,+BAA+B,CAAC,CAAA;AAC9G,QAAA,MAAMC,uBAAA,CAAiB,QAAA,EAAU,YAAA,EAAc,WAAA,EAAa,IAAI,CAAA;AAChE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,4BAAA,GAA+B,QAAQ,MAAA,KAAW,SAAA;AAExD,MAAA,IAAI,4BAAA,EAA8B;AAChC,QAAA,MAAM,2BAA2B,IAAI,QAAA,CAAS,MAAM,EAAE,MAAA,EAAQ,+BAA+B,CAAA;AAC7F,QAAA,IAAA,CAAK,+BAA+B,wBAAwB,CAAA;AAC5D,QAAA,MAAMA,uBAAA,CAAiB,wBAAA,EAA0B,YAAA,EAAc,WAAA,EAAa,IAAI,CAAA;AAAA,MAClF;AAEA,MAAA,MAAM,0BAAA,GAA6B,CAAC,4BAAA,IAAgC,CAAC,sBAAA;AAErE,MAAA,IAAI,0BAAA,EAA4B;AAC9B,QAAA,MAAM,IAAA,CAAK,8BAAA,CAA+B,OAAA,EAAS,iBAAiB,CAAA;AAAA,MACtE;AAEA,MAAA,YAAA,CAAa,OAAA,EAAQ;AAAA,IACvB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,sBAAsB,KAAA,YAAiB,0BAAA;AAE7C,MAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnB,QAAA,MAAM,IAAA,CAAK,8BAAA,CAA+B,OAAA,EAAS,iBAAiB,CAAA;AAAA,MACtE;AAEA,MAAA,YAAA,CAAa,OAAA,EAAQ;AAAA,IACvB;AAAA,EACF,CAAA;AAAA,EAEA,MAAc,yBAAyB,OAAA,EAAgC;AACrE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,oBAAA,CAAqB,OAAA,CAAQ,MAAoB,CAAA;AAE7E,IAAA,MAAM,aAAa,4BAAA,CAAqB,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAC,CAAA;AAC5D,IAAA,MAAM,kBAAA,GAAqB,WAAW,IAAA,KAAS,CAAA,EAAG,WAAW,MAAM,CAAA,CAAA,CAAA,GAAM,UAAA,CAAW,MAAA,GAAS,UAAA,CAAW,IAAA;AAExG,IAAA,IAAI,sBAAA,GAAyB,KAAA;AAE7B,IAAA,KAAA,IAAS,eAAe,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG,YAAA,IAAgB,GAAG,YAAA,EAAA,EAAgB;AACpF,MAAA,MAAM,OAAA,GAAU,eAAe,YAAY,CAAA;AAC3C,MAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA;AAEpE,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,CAAQ,OAAA,CAAQ,SAAS,EAAE,CAAA;AAClE,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA;AAEtD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,sBAAA,GAAyB,IAAA;AAEzB,MAAA,MAAM,EAAE,QAAA,EAAU,kBAAA,EAAmB,GAAI,MAAM,KAAK,sBAAA,CAAuB,OAAA;AAAA,QACzE,+BAAA;AAAA,QACA,EAAE,SAAA,EAAW,OAAA,CAAQ,EAAA,EAAI,OAAA,EAAQ;AAAA,QACjC,EAAE,OAAA,EAAS,CAAC,OAAA,CAAQ,MAAM,CAAA;AAAE,OAC9B;AAEA,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,MAAM,QAAA,GAAW,oBAAoB,kBAAkB,CAAA;AACvD,QAAA,OAAO,EAAE,UAAU,sBAAA,EAAuB;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,sBAAA,EAAuB;AAAA,EAClD;AAAA,EAEQ,+BACN,QAAA,EACA,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,8BAA8B,CAAA,EACzD;AACA,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,+BAA+B,GAAG,CAAA;AAGhD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,8BAAA,CAA+B,OAAA,EAAsB,iBAAA,EAA0C;AAC3G,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,+BAAA,CAAgC,OAAO,CAAA;AAE5D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,SAAA,EAAW,mCAAA,EAAoC,GAAI,MAAM,KAAK,sBAAA,CAAuB,OAAA;AAAA,UAC3F,kCAAA;AAAA,UACA,EAAE,SAAS,iBAAA,EAAkB;AAAA,UAC7B,EAAE,OAAA,EAAS,CAAC,OAAA,CAAQ,MAAM,CAAA;AAAE,SAC9B;AAEA,QAAA,IAAI,mCAAA,EAAqC;AACvC,UAAA;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AASd,QAAA,MAAM,sBAAsB,KAAA,YAAiB,0BAAA;AAG7C,QAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,6BAAA,CAAsB,0BAAA,CAA2B,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC1E;AAAA,EAEQ,gCAAgC,OAAA,EAAsB;AAC5D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,oBAAA,CAAqB,OAAA,CAAQ,MAAoB,CAAA;AAE7E,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,QAAA,CAAS,CAACC,QAAAA,KAAY,QAAQ,GAAA,CAAI,UAAA,CAAWA,QAAAA,CAAQ,OAAO,CAAC,CAAA;AAC5F,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAO,yBAAA,GAAQ,iBAAA;;;AC7ZR,SAAS,uBAAA,CAAwB,OAAA,GAAoC,EAAC,EAA4B;AACvG,EAAA,OAAO,IAAI,0BAAkB,OAAO,CAAA;AACtC","file":"chunk-ZU6IGW27.js","sourcesContent":["/**\n * An error thrown when the interceptor server is running and some operation requires it to be stopped first.\n *\n * @see {@link https://zimic.dev/docs/interceptor/api/interceptor-server `@zimic/interceptor/server` API reference}\n */\nclass RunningInterceptorServerError extends Error {\n constructor(additionalMessage: string) {\n super(`The interceptor server is running.${additionalMessage}`);\n this.name = 'RunningInterceptorServerError';\n }\n}\n\nexport default RunningInterceptorServerError;\n","/* istanbul ignore next -- @preserve */\n/** An error thrown when the interceptor server is not running. */\nclass NotRunningInterceptorServerError extends Error {\n constructor() {\n super('The interceptor server is not running. Did you forget to start it?');\n this.name = 'NotRunningInterceptorServerError';\n }\n}\n\nexport default NotRunningInterceptorServerError;\n","import { HttpMethod } from '@zimic/http';\nimport { Server as HttpServer } from 'http';\n\nclass HttpServerTimeoutError extends Error {}\n\nexport class HttpServerStartTimeoutError extends HttpServerTimeoutError {\n constructor(reachedTimeout: number) {\n super(`HTTP server start timed out after ${reachedTimeout}ms.`);\n this.name = 'HttpServerStartTimeout';\n }\n}\n\nexport class HttpServerStopTimeoutError extends HttpServerTimeoutError {\n constructor(reachedTimeout: number) {\n super(`HTTP server stop timed out after ${reachedTimeout}ms.`);\n this.name = 'HttpServerStopTimeout';\n }\n}\n\nexport const DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT = 60 * 1000;\n\nexport async function startHttpServer(\n server: HttpServer,\n options: {\n hostname?: string;\n port?: number;\n timeout?: number;\n } = {},\n) {\n const { hostname, port, timeout: timeoutDuration = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } = options;\n\n await new Promise<void>((resolve, reject) => {\n function handleStartError(error: unknown) {\n server.off('listening', handleStartSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n reject(error);\n }\n\n const startTimeout = setTimeout(() => {\n const timeoutError = new HttpServerStartTimeoutError(timeoutDuration);\n handleStartError(timeoutError);\n }, timeoutDuration);\n\n function handleStartSuccess() {\n server.off('error', handleStartError);\n clearTimeout(startTimeout);\n resolve();\n }\n\n server.once('error', handleStartError);\n server.listen(port, hostname, handleStartSuccess);\n });\n}\n\nexport async function stopHttpServer(server: HttpServer, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } = options;\n\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const stopTimeout = setTimeout(() => {\n const timeoutError = new HttpServerStopTimeoutError(timeoutDuration);\n reject(timeoutError);\n }, timeoutDuration);\n\n server.close((error) => {\n clearTimeout(stopTimeout);\n\n /* istanbul ignore if -- @preserve\n * This is expected not to happen since the servers are not stopped unless they are running. */\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n\n server.closeAllConnections();\n });\n}\n\nexport function getHttpServerPort(server: HttpServer) {\n const address = server.address();\n\n /* istanbul ignore if -- @preserve\n * The address is expected to be an object because the server does not listen on a pipe or Unix domain socket. */\n if (typeof address === 'string') {\n return undefined;\n } else {\n return address?.port;\n }\n}\n\nexport const HTTP_METHODS_WITH_REQUEST_BODY = new Set<HttpMethod>(['POST', 'PUT', 'PATCH', 'DELETE']);\n\nexport const HTTP_METHODS_WITH_RESPONSE_BODY = new Set<HttpMethod>([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n]);\n\nexport function methodCanHaveResponseBody(method: HttpMethod) {\n return HTTP_METHODS_WITH_RESPONSE_BODY.has(method);\n}\n","import { CloseEvent } from 'isomorphic-ws';\n\n/** Error thrown when the connection to the interceptor web socket server is unauthorized. */\nclass UnauthorizedWebSocketConnectionError extends Error {\n constructor(readonly event: CloseEvent) {\n super(`${event.reason} (code ${event.code})`);\n this.name = 'UnauthorizedWebSocketConnectionError';\n }\n}\n\nexport default UnauthorizedWebSocketConnectionError;\n","import ClientSocket, { type WebSocketServer as ServerSocket } from 'isomorphic-ws';\n\nimport { WebSocketControlMessage } from '@/webSocket/constants';\nimport UnauthorizedWebSocketConnectionError from '@/webSocket/errors/UnauthorizedWebSocketConnectionError';\n\nclass WebSocketTimeoutError extends Error {}\n\nexport class WebSocketOpenTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket open timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketOpenTimeout';\n }\n}\n\nexport class WebSocketMessageTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket message timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketMessageTimeout';\n }\n}\n\nexport class WebSocketMessageAbortError extends WebSocketTimeoutError {\n constructor() {\n super('Web socket message was aborted.');\n this.name = 'WebSocketMessageAbortError';\n }\n}\n\nexport class WebSocketCloseTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket close timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketCloseTimeout';\n }\n}\n\nexport const DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT = 60 * 1000;\nexport const DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT = 3 * 60 * 1000;\n\nexport async function waitForOpenClientSocket(\n socket: ClientSocket,\n options: {\n timeout?: number;\n waitForAuthentication?: boolean;\n } = {},\n) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT, waitForAuthentication = false } = options;\n\n const isAlreadyOpen = socket.readyState === socket.OPEN;\n\n if (isAlreadyOpen) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n function removeAllSocketListeners() {\n socket.removeEventListener('message', handleSocketMessage); // eslint-disable-line @typescript-eslint/no-use-before-define\n socket.removeEventListener('open', handleOpenSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n socket.removeEventListener('error', handleOpenError); // eslint-disable-line @typescript-eslint/no-use-before-define\n socket.removeEventListener('close', handleClose); // eslint-disable-line @typescript-eslint/no-use-before-define\n }\n\n function handleOpenError(error: unknown) {\n removeAllSocketListeners();\n reject(error);\n }\n\n function handleClose(event: ClientSocket.CloseEvent) {\n const isUnauthorized = event.code === 1008;\n\n /* istanbul ignore else -- @preserve\n * An unauthorized close event is the only one we expect to happen here. */\n if (isUnauthorized) {\n const unauthorizedError = new UnauthorizedWebSocketConnectionError(event);\n handleOpenError(unauthorizedError);\n } else {\n handleOpenError(event);\n }\n }\n\n const openTimeout = setTimeout(() => {\n const timeoutError = new WebSocketOpenTimeoutError(timeoutDuration);\n handleOpenError(timeoutError);\n }, timeoutDuration);\n\n function handleOpenSuccess() {\n removeAllSocketListeners();\n clearTimeout(openTimeout);\n resolve();\n }\n\n function handleSocketMessage(message: ClientSocket.MessageEvent) {\n const hasValidAuth = message.data === ('socket:auth:valid' satisfies WebSocketControlMessage);\n\n /* istanbul ignore else -- @preserve\n * We currently only support the 'socket:auth:valid' message and it is the only possible control message here. */\n if (hasValidAuth) {\n handleOpenSuccess();\n }\n }\n\n if (waitForAuthentication) {\n socket.addEventListener('message', handleSocketMessage);\n } else {\n socket.addEventListener('open', handleOpenSuccess);\n }\n\n socket.addEventListener('error', handleOpenError);\n socket.addEventListener('close', handleClose);\n });\n}\n\nexport async function closeClientSocket(socket: ClientSocket, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT } = options;\n\n const isAlreadyClosed = socket.readyState === socket.CLOSED;\n if (isAlreadyClosed) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n function removeAllSocketListeners() {\n socket.removeEventListener('error', handleError); // eslint-disable-line @typescript-eslint/no-use-before-define\n socket.removeEventListener('close', handleClose); // eslint-disable-line @typescript-eslint/no-use-before-define\n }\n\n function handleError(error: unknown) {\n removeAllSocketListeners();\n reject(error);\n }\n\n const closeTimeout = setTimeout(() => {\n const timeoutError = new WebSocketCloseTimeoutError(timeoutDuration);\n handleError(timeoutError);\n }, timeoutDuration);\n\n function handleClose() {\n removeAllSocketListeners();\n clearTimeout(closeTimeout);\n resolve();\n }\n\n socket.addEventListener('error', handleError);\n socket.addEventListener('close', handleClose);\n\n socket.close();\n });\n}\n\nexport async function closeServerSocket(socket: InstanceType<typeof ServerSocket>, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT } = options;\n\n await new Promise<void>((resolve, reject) => {\n const closeTimeout = setTimeout(() => {\n const timeoutError = new WebSocketCloseTimeoutError(timeoutDuration);\n reject(timeoutError);\n }, timeoutDuration);\n\n for (const client of socket.clients) {\n client.terminate();\n }\n\n socket.close((error) => {\n clearTimeout(closeTimeout);\n\n /* istanbul ignore if -- @preserve\n * This is not expected since the server is not stopped unless it is running. */\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n","import { HTTP_METHODS, HttpSchema } from '@zimic/http';\n\nimport { DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } from '@/utils/http';\nimport { DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT } from '@/utils/webSocket';\n\nexport const DEFAULT_SERVER_LIFE_CYCLE_TIMEOUT = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT;\nexport const DEFAULT_SERVER_RPC_TIMEOUT = DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT;\n\nconst ALLOWED_ACCESS_CONTROL_HTTP_METHODS = HTTP_METHODS.join(',');\n\nexport type AccessControlHeaders = HttpSchema.Headers<{\n 'access-control-allow-origin': string;\n 'access-control-allow-methods': string;\n 'access-control-allow-headers': string;\n 'access-control-expose-headers': string;\n 'access-control-max-age'?: string;\n}>;\n\n/** The default access control headers for the server. */\nexport const DEFAULT_ACCESS_CONTROL_HEADERS = Object.freeze({\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': ALLOWED_ACCESS_CONTROL_HTTP_METHODS,\n 'access-control-allow-headers': '*',\n 'access-control-expose-headers': '*',\n 'access-control-max-age': process.env.INTERCEPTOR_SERVER_ACCESS_CONTROL_MAX_AGE,\n}) satisfies AccessControlHeaders;\n\n/** The default status code for the preflight request. */\nexport const DEFAULT_PREFLIGHT_STATUS_CODE = 204;\n\nexport const DEFAULT_HOSTNAME = 'localhost';\nexport const DEFAULT_LOG_UNHANDLED_REQUESTS = true;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function isDefined<Value>(value: Value): value is NonNullable<Value> {\n return value !== undefined && value !== null;\n}\n\nexport default isDefined;\n","export function removeArrayIndex<Item>(array: Item[], index: number) {\n if (index >= 0 && index < array.length) {\n array.splice(index, 1);\n }\n return array;\n}\n\nexport function removeArrayElement<Item>(array: Item[], element: Item) {\n const index = array.indexOf(element);\n return removeArrayIndex(array, index);\n}\n","export function isServerSide() {\n return typeof process !== 'undefined' && typeof process.versions !== 'undefined';\n}\n\nexport function isClientSide() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n","function createCachedDynamicImport<ImportType>(\n importModuleDynamically: () => Promise<ImportType>,\n): () => Promise<ImportType> {\n let cachedImportResult: ImportType | undefined;\n\n return async function importModuleDynamicallyWithCache() {\n cachedImportResult ??= await importModuleDynamically();\n return cachedImportResult;\n };\n}\n\nexport default createCachedDynamicImport;\n","export type TableLogRow = Record<string, string>;\n\nexport interface TableLogHeader<Row extends TableLogRow> {\n title: string;\n property: keyof Row;\n}\n\nexport interface LoggerOptions {\n prefix?: string;\n}\n\nclass Logger {\n prefix?: string;\n\n raw: Logger;\n\n constructor(options: LoggerOptions = {}) {\n const { prefix } = options;\n\n this.prefix = prefix;\n\n this.raw = prefix ? new Logger({ ...options, prefix: undefined }) : this;\n }\n\n private logWithLevel(level: 'log' | 'warn' | 'error', ...messages: unknown[]) {\n if (this.prefix) {\n console[level](this.prefix, ...messages);\n } else {\n console[level](...messages);\n }\n }\n\n info(...messages: unknown[]) {\n this.logWithLevel('log', ...messages);\n }\n\n warn(...messages: unknown[]) {\n this.logWithLevel('warn', ...messages);\n }\n\n error(...messages: unknown[]) {\n this.logWithLevel('error', ...messages);\n }\n\n table<Row extends TableLogRow>(headers: TableLogHeader<Row>[], rows: Row[]) {\n const columnLengths = headers.map((header) => {\n let maxValueLength = header.title.length;\n\n for (const row of rows) {\n const value = row[header.property];\n\n if (value.length > maxValueLength) {\n maxValueLength = value.length;\n }\n }\n\n return maxValueLength;\n });\n\n const formattedRows: string[][] = [];\n\n const horizontalLine = columnLengths.map((length) => '─'.repeat(length));\n formattedRows.push(horizontalLine, []);\n\n for (let headerIndex = 0; headerIndex < headers.length; headerIndex++) {\n const header = headers[headerIndex];\n const columnLength = columnLengths[headerIndex];\n\n const value = header.title;\n formattedRows.at(-1)?.push(value.padEnd(columnLength, ' '));\n }\n\n formattedRows.push(horizontalLine);\n\n for (const row of rows) {\n formattedRows.push([]);\n\n for (let headerIndex = 0; headerIndex < headers.length; headerIndex++) {\n const header = headers[headerIndex];\n const columnLength = columnLengths[headerIndex];\n\n const value = row[header.property];\n formattedRows.at(-1)?.push(value.padEnd(columnLength, ' '));\n }\n }\n\n formattedRows.push(horizontalLine);\n\n const formattedTable = formattedRows\n .map((row, index) => {\n const isFirstLine = index === 0;\n if (isFirstLine) {\n return `┌─${row.join('─┬─')}─┐`;\n }\n\n const isLineAfterHeaders = index === 2;\n if (isLineAfterHeaders) {\n return `├─${row.join('─┼─')}─┤`;\n }\n\n const isLastLine = index === formattedRows.length - 1;\n if (isLastLine) {\n return `└─${row.join('─┴─')}─┘`;\n }\n\n return `│ ${row.join(' │ ')} │`;\n })\n .join('\\n');\n\n this.logWithLevel('log', formattedTable);\n }\n}\n\nexport default Logger;\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\nimport type fs from 'fs';\n\nexport const importFile = createCachedDynamicImport(\n /* istanbul ignore next -- @preserve\n * Ignoring as Node.js >=20 provides a global File and the import fallback won't run. */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n async () => globalThis.File ?? (await import('buffer')).File,\n);\n\nexport function isGlobalFileAvailable() {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return globalThis.File !== undefined;\n}\n\nexport const importFilesystem = createCachedDynamicImport<typeof fs>(() => import('fs'));\n\nexport async function pathExists(path: string) {\n const fs = await importFilesystem();\n\n try {\n await fs.promises.access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { HttpFormData, HttpHeaders, HttpSearchParams } from '@zimic/http';\nimport createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\nimport Logger from '@zimic/utils/logging/Logger';\nimport color from 'picocolors';\n\nimport { isClientSide } from './environment';\nimport { isGlobalFileAvailable } from './files';\n\nexport const logger = new Logger({\n prefix: color.cyan('[@zimic/interceptor]'),\n});\n\nfunction stringifyJSONToLog(value: unknown): string {\n return JSON.stringify(\n value,\n (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return stringifyValueToLog(value, {\n fallback: (value) => value as string,\n });\n },\n 2,\n )\n .replace(/\\n\\s*/g, ' ')\n .replace(/\"(File { name: '.*?', type: '.*?', size: \\d*? })\"/g, '$1')\n .replace(/\"(Blob { type: '.*?', size: \\d*? })\"/g, '$1');\n}\n\nexport function stringifyValueToLog(\n value: unknown,\n options: {\n fallback?: (value: unknown) => string;\n includeClassName?: { searchParams?: boolean };\n } = {},\n): string {\n const { fallback = stringifyJSONToLog, includeClassName } = options;\n\n if (value === null || value === undefined || typeof value !== 'object') {\n return String(value);\n }\n\n if (value instanceof HttpHeaders) {\n return stringifyValueToLog(value.toObject());\n }\n\n if (value instanceof HttpHeaders || value instanceof HttpSearchParams) {\n const prefix = (includeClassName?.searchParams ?? false) ? 'URLSearchParams ' : '';\n return `${prefix}${stringifyValueToLog(value.toObject())}`;\n }\n\n if (value instanceof HttpFormData) {\n return `FormData ${stringifyValueToLog(value.toObject())}`;\n }\n\n if (isGlobalFileAvailable() && value instanceof File) {\n return `File { name: '${value.name}', type: '${value.type}', size: ${value.size} }`;\n }\n\n if (value instanceof Blob) {\n return `Blob { type: '${value.type}', size: ${value.size} }`;\n }\n\n return fallback(value);\n}\n\nconst importUtil = createCachedDynamicImport(() => import('util'));\n\nexport async function formatValueToLog(value: unknown, options: { colors?: boolean } = {}) {\n if (isClientSide()) {\n return value;\n }\n\n const { colors = true } = options;\n\n const util = await importUtil();\n\n return util.inspect(value, {\n colors,\n compact: true,\n depth: Infinity,\n maxArrayLength: Infinity,\n maxStringLength: Infinity,\n breakLength: Infinity,\n sorted: true,\n });\n}\n","import {\n HttpHeaders,\n HttpHeadersInit,\n HttpMethodSchema,\n HttpRequest,\n HttpRequestBodySchema,\n HttpRequestHeadersSchema,\n HttpRequestSearchParamsSchema,\n HttpResponse,\n HttpResponseBodySchema,\n HttpResponseHeadersSchema,\n HttpResponseSchema,\n HttpSearchParams,\n HttpStatusCode,\n InferPathParams,\n} from '@zimic/http';\nimport { Default, PartialByKey, PossiblePromise, Replace } from '@zimic/utils/types';\n\ntype HttpRequestHandlerResponseBody<\n ResponseSchema extends HttpResponseSchema,\n StatusCode extends HttpStatusCode,\n> = HttpResponseBodySchema<{ response: { [Code in StatusCode]: ResponseSchema } }, StatusCode>;\n\nexport type HttpRequestHandlerResponseWithBody<\n ResponseSchema extends HttpResponseSchema,\n StatusCode extends HttpStatusCode,\n> = unknown extends ResponseSchema['body']\n ? { body?: null }\n : undefined extends ResponseSchema['body']\n ? { body?: HttpRequestHandlerResponseBody<ResponseSchema, StatusCode> }\n : { body: HttpRequestHandlerResponseBody<ResponseSchema, StatusCode> };\n\ntype HttpRequestHandlerResponseDeclarationHeaders<ResponseSchema extends HttpResponseSchema> = HttpHeadersInit<\n PartialByKey<Default<ResponseSchema['headers']>, 'content-type'>\n>;\n\nexport type HttpRequestHandlerResponseDeclarationWithHeaders<ResponseSchema extends HttpResponseSchema> =\n undefined extends ResponseSchema['headers']\n ? { headers?: HttpRequestHandlerResponseDeclarationHeaders<ResponseSchema> }\n : Exclude<keyof ResponseSchema['headers'], symbol> extends 'content-type'\n ? { headers?: HttpRequestHandlerResponseDeclarationHeaders<ResponseSchema> }\n : { headers: HttpRequestHandlerResponseDeclarationHeaders<ResponseSchema> };\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrespond `handler.respond()` API reference} */\nexport type HttpRequestHandlerResponseDeclaration<\n MethodSchema extends HttpMethodSchema = HttpMethodSchema,\n StatusCode extends HttpStatusCode = HttpStatusCode,\n> = StatusCode extends StatusCode\n ? { status: StatusCode } & HttpRequestHandlerResponseWithBody<\n Default<Default<MethodSchema['response']>[StatusCode]>,\n StatusCode\n > &\n HttpRequestHandlerResponseDeclarationWithHeaders<Default<Default<MethodSchema['response']>[StatusCode]>>\n : never;\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrespond `handler.respond()` API reference} */\nexport type HttpRequestHandlerResponseDeclarationFactory<\n Path extends string,\n MethodSchema extends HttpMethodSchema,\n StatusCode extends HttpStatusCode = HttpStatusCode,\n> = (\n request: Omit<HttpInterceptorRequest<Path, MethodSchema>, 'response'>,\n) => PossiblePromise<HttpRequestHandlerResponseDeclaration<MethodSchema, StatusCode>>;\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerdelay `handler.delay()` API reference} */\nexport type HttpRequestHandlerResponseDelayFactory<Path extends string, MethodSchema extends HttpMethodSchema> = (\n request: Omit<HttpInterceptorRequest<Path, MethodSchema>, 'response'>,\n) => PossiblePromise<number>;\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrequests `handler.requests` API reference} */\nexport interface HttpInterceptorRequest<Path extends string, MethodSchema extends HttpMethodSchema>\n extends Omit<HttpRequest, keyof Body | 'headers' | 'clone'> {\n /**\n * The headers of the request.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/headers#using-request-headers Using request headers}\n */\n headers: HttpHeaders<Default<HttpRequestHeadersSchema<MethodSchema>>>;\n\n /**\n * The path parameters of the request. They are parsed from the path string when using dynamic paths.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/path-params#using-request-path-params Using request path parameters}\n */\n pathParams: InferPathParams<Path>;\n\n /**\n * The search parameters of the request.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/search-params#using-request-search-params Using request search parameters}\n */\n searchParams: HttpSearchParams<Default<HttpRequestSearchParamsSchema<MethodSchema>>>;\n\n /**\n * The body of the request. It is already parsed by default as detailed in\n * {@link https://zimic.dev/docs/interceptor/guides/http/bodies#default-body-parsing Default body parsing}.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/bodies#using-request-bodies Using request bodies}\n */\n body: Replace<HttpRequestBodySchema<MethodSchema>, ArrayBuffer | ReadableStream, Blob>;\n\n /** The raw request object. */\n raw: HttpRequest<HttpRequestBodySchema<MethodSchema>, Default<HttpRequestHeadersSchema<MethodSchema>>>;\n}\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrequests `handler.requests` API reference} */\nexport interface HttpInterceptorResponse<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode>\n extends Omit<HttpResponse, keyof Body | 'headers' | 'clone'> {\n /**\n * The headers of the response.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/headers#using-response-headers Using response headers}\n */\n headers: HttpHeaders<Default<HttpResponseHeadersSchema<MethodSchema, StatusCode>>>;\n\n /** The status code of the response. */\n status: StatusCode;\n\n /**\n * The body of the response. It is already parsed by default as detailed in\n * {@link https://zimic.dev/docs/interceptor/guides/http/bodies#default-body-parsing Default body parsing}.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/bodies#using-response-bodies Using response bodies}\n */\n body: Replace<HttpResponseBodySchema<MethodSchema, StatusCode>, ArrayBuffer | ReadableStream, Blob>;\n\n /** The raw response object. */\n raw: HttpResponse<\n HttpResponseBodySchema<MethodSchema, StatusCode>,\n Default<HttpResponseHeadersSchema<MethodSchema, StatusCode>>,\n StatusCode\n >;\n}\n\nexport const HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES = Object.freeze(\n new Set<Exclude<keyof HttpRequest, keyof HttpInterceptorRequest<string, never>>>([\n 'bodyUsed',\n 'arrayBuffer',\n 'blob',\n 'formData',\n 'json',\n 'text',\n 'clone',\n ]),\n);\n\nexport const HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES = Object.freeze(\n new Set<Exclude<keyof HttpResponse, keyof HttpInterceptorResponse<never, never>>>(\n HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES,\n ),\n);\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrequests `handler.requests` API reference} */\nexport interface InterceptedHttpInterceptorRequest<\n Path extends string,\n MethodSchema extends HttpMethodSchema,\n StatusCode extends HttpStatusCode = never,\n> extends HttpInterceptorRequest<Path, MethodSchema> {\n /** The response that was returned for the intercepted request. */\n response: StatusCode extends [never] ? never : HttpInterceptorResponse<MethodSchema, StatusCode>;\n}\n","import { HttpInterceptorType, UnhandledRequestStrategy } from '../interceptor/types/options';\n\nexport const DEFAULT_UNHANDLED_REQUEST_STRATEGY = Object.freeze({\n local: Object.freeze<UnhandledRequestStrategy.LocalDeclaration>({\n action: 'reject',\n log: true,\n }),\n remote: Object.freeze<UnhandledRequestStrategy.RemoteDeclaration>({\n action: 'reject',\n log: true,\n }),\n} satisfies Record<HttpInterceptorType, Readonly<UnhandledRequestStrategy.Declaration>>);\n","import {\n HttpHeadersInit,\n HttpHeaders,\n HttpBody,\n HttpResponse,\n HttpMethod,\n HttpMethodSchema,\n HttpSchema,\n HttpStatusCode,\n InferPathParams,\n parseHttpBody,\n HttpSearchParams,\n} from '@zimic/http';\nimport isDefined from '@zimic/utils/data/isDefined';\nimport { Default, PossiblePromise } from '@zimic/utils/types';\nimport color from 'picocolors';\n\nimport { removeArrayElement } from '@/utils/arrays';\nimport { isClientSide } from '@/utils/environment';\nimport { methodCanHaveResponseBody } from '@/utils/http';\nimport { formatValueToLog, logger } from '@/utils/logging';\n\nimport HttpInterceptorClient, { AnyHttpInterceptorClient } from '../interceptor/HttpInterceptorClient';\nimport { HttpInterceptorPlatform, HttpInterceptorType, UnhandledRequestStrategy } from '../interceptor/types/options';\nimport {\n UnhandledHttpInterceptorRequestPath,\n UnhandledHttpInterceptorRequestMethodSchema,\n} from '../interceptor/types/requests';\nimport {\n HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES,\n HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES,\n HttpInterceptorRequest,\n HttpInterceptorResponse,\n} from '../requestHandler/types/requests';\nimport { DEFAULT_UNHANDLED_REQUEST_STRATEGY } from './constants';\nimport { MSWHttpResponseFactory } from './types/msw';\nimport { HttpInterceptorWorkerType } from './types/options';\n\nabstract class HttpInterceptorWorker {\n abstract get type(): HttpInterceptorWorkerType;\n\n platform: HttpInterceptorPlatform | null = null;\n isRunning = false;\n\n private startingPromise?: Promise<void>;\n private stoppingPromise?: Promise<void>;\n\n private runningInterceptors: AnyHttpInterceptorClient[] = [];\n\n abstract start(): Promise<void>;\n\n protected async sharedStart(internalStart: () => Promise<void>) {\n if (this.isRunning) {\n return;\n }\n\n if (this.startingPromise) {\n return this.startingPromise;\n }\n\n try {\n this.startingPromise = internalStart();\n await this.startingPromise;\n\n this.startingPromise = undefined;\n } catch (error) {\n // In server side (e.g. Node.js), we need to manually log the error because this will be treated as an unhandled\n // promise rejection. If we don't log it, the output won't contain details about the error. In the browser,\n // uncaught promise rejections are automatically logged.\n if (!isClientSide()) {\n console.error(error);\n }\n\n await this.stop();\n throw error;\n }\n }\n\n abstract stop(): Promise<void>;\n\n protected async sharedStop(internalStop: () => PossiblePromise<void>) {\n if (!this.isRunning) {\n return;\n }\n if (this.stoppingPromise) {\n return this.stoppingPromise;\n }\n\n const stoppingResult = internalStop();\n\n if (stoppingResult instanceof Promise) {\n this.stoppingPromise = stoppingResult;\n await this.stoppingPromise;\n }\n\n this.stoppingPromise = undefined;\n }\n\n abstract use<Schema extends HttpSchema>(\n interceptor: HttpInterceptorClient<Schema>,\n method: HttpMethod,\n path: string,\n createResponse: MSWHttpResponseFactory,\n ): PossiblePromise<void>;\n\n protected async logUnhandledRequestIfNecessary(\n request: Request,\n strategy: UnhandledRequestStrategy.Declaration | null,\n ) {\n if (strategy?.log) {\n await HttpInterceptorWorker.logUnhandledRequestWarning(request, strategy.action);\n return { wasLogged: true };\n }\n return { wasLogged: false };\n }\n\n protected async getUnhandledRequestStrategy(request: Request, interceptorType: HttpInterceptorType) {\n const candidates = await this.getUnhandledRequestStrategyCandidates(request, interceptorType);\n const strategy = this.reduceUnhandledRequestStrategyCandidates(candidates);\n return strategy;\n }\n\n private reduceUnhandledRequestStrategyCandidates(candidateStrategies: UnhandledRequestStrategy.Declaration[]) {\n if (candidateStrategies.length === 0) {\n return null;\n }\n\n // Prefer strategies from first to last, overriding undefined values with the next candidate.\n return candidateStrategies.reduce(\n (accumulatedStrategy, candidateStrategy): UnhandledRequestStrategy.Declaration => ({\n action: accumulatedStrategy.action,\n log: accumulatedStrategy.log ?? candidateStrategy.log,\n }),\n );\n }\n\n private async getUnhandledRequestStrategyCandidates(\n request: Request,\n interceptorType: HttpInterceptorType,\n ): Promise<UnhandledRequestStrategy.Declaration[]> {\n const globalDefaultStrategy = DEFAULT_UNHANDLED_REQUEST_STRATEGY[interceptorType];\n\n try {\n const interceptor = this.findInterceptorByRequestBaseURL(request);\n\n if (!interceptor) {\n return [];\n }\n\n const requestClone = request.clone();\n const interceptorStrategy = await this.getInterceptorUnhandledRequestStrategy(requestClone, interceptor);\n\n return [interceptorStrategy, globalDefaultStrategy].filter(isDefined);\n } catch (error) {\n console.error(error);\n\n return [globalDefaultStrategy];\n }\n }\n\n registerRunningInterceptor(interceptor: AnyHttpInterceptorClient) {\n this.runningInterceptors.push(interceptor);\n }\n\n unregisterRunningInterceptor(interceptor: AnyHttpInterceptorClient) {\n removeArrayElement(this.runningInterceptors, interceptor);\n }\n\n private findInterceptorByRequestBaseURL(request: Request) {\n const interceptor = this.runningInterceptors.findLast((interceptor) => {\n return request.url.startsWith(interceptor.baseURLAsString);\n });\n\n return interceptor;\n }\n\n private async getInterceptorUnhandledRequestStrategy(request: Request, interceptor: AnyHttpInterceptorClient) {\n if (typeof interceptor.onUnhandledRequest === 'function') {\n const parsedRequest = await HttpInterceptorWorker.parseRawUnhandledRequest(request);\n return interceptor.onUnhandledRequest(parsedRequest);\n }\n\n return interceptor.onUnhandledRequest;\n }\n\n abstract clearHandlers(): PossiblePromise<void>;\n\n abstract clearInterceptorHandlers<Schema extends HttpSchema>(\n interceptor: HttpInterceptorClient<Schema>,\n ): PossiblePromise<void>;\n\n abstract get interceptorsWithHandlers(): AnyHttpInterceptorClient[];\n\n static createResponseFromDeclaration(\n request: Request,\n declaration: { status: number; headers?: HttpHeadersInit; body?: HttpBody },\n ): HttpResponse {\n const headers = new HttpHeaders(declaration.headers);\n const status = declaration.status;\n\n const canHaveBody = methodCanHaveResponseBody(request.method as HttpMethod) && status !== 204;\n\n if (!canHaveBody) {\n return new Response(null, { headers, status }) as HttpResponse;\n }\n\n if (\n typeof declaration.body === 'string' ||\n declaration.body === null ||\n declaration.body === undefined ||\n declaration.body instanceof FormData ||\n declaration.body instanceof URLSearchParams ||\n declaration.body instanceof Blob ||\n declaration.body instanceof ArrayBuffer ||\n declaration.body instanceof ReadableStream\n ) {\n return new Response(declaration.body ?? null, { headers, status }) as HttpResponse;\n }\n\n return Response.json(declaration.body, { headers, status }) as HttpResponse;\n }\n\n static async parseRawUnhandledRequest(request: Request) {\n return this.parseRawRequest<UnhandledHttpInterceptorRequestPath, UnhandledHttpInterceptorRequestMethodSchema>(\n request,\n );\n }\n\n static async parseRawRequest<Path extends string, MethodSchema extends HttpMethodSchema>(\n originalRawRequest: Request,\n options?: { baseURL: string; pathRegex: RegExp },\n ): Promise<HttpInterceptorRequest<Path, MethodSchema>> {\n const rawRequest = originalRawRequest.clone();\n const rawRequestClone = rawRequest.clone();\n\n type BodySchema = Default<Default<MethodSchema['request']>['body']>;\n\n const parsedBody = await parseHttpBody<BodySchema>(rawRequest).catch((error: unknown) => {\n logger.error('Failed to parse request body:', error);\n return null;\n });\n\n type HeadersSchema = Default<Default<MethodSchema['request']>['headers']>;\n const headers = new HttpHeaders<HeadersSchema>(rawRequest.headers);\n\n const pathParams = this.parseRawPathParams<Path>(rawRequest, options);\n\n const parsedURL = new URL(rawRequest.url);\n type SearchParamsSchema = Default<Default<MethodSchema['request']>['searchParams']>;\n const searchParams = new HttpSearchParams<SearchParamsSchema>(parsedURL.searchParams);\n\n const parsedRequest = new Proxy(rawRequest as unknown as HttpInterceptorRequest<Path, MethodSchema>, {\n has(target, property: keyof HttpInterceptorRequest<Path, MethodSchema>) {\n if (HttpInterceptorWorker.isHiddenRequestProperty(property)) {\n return false;\n }\n return Reflect.has(target, property);\n },\n\n get(target, property: keyof HttpInterceptorRequest<Path, MethodSchema>) {\n if (HttpInterceptorWorker.isHiddenRequestProperty(property)) {\n return undefined;\n }\n return Reflect.get(target, property, target) as unknown;\n },\n });\n\n Object.defineProperty(parsedRequest, 'body', {\n value: parsedBody,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'headers', {\n value: headers,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'pathParams', {\n value: pathParams,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'searchParams', {\n value: searchParams,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'raw', {\n value: rawRequestClone,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n return parsedRequest;\n }\n\n private static isHiddenRequestProperty(property: string) {\n return HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES.has(property as never);\n }\n\n static async parseRawResponse<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode>(\n originalRawResponse: Response,\n ): Promise<HttpInterceptorResponse<MethodSchema, StatusCode>> {\n const rawResponse = originalRawResponse.clone();\n const rawResponseClone = rawResponse.clone();\n\n type BodySchema = Default<Default<Default<MethodSchema['response']>[StatusCode]>['body']>;\n const parsedBody = await parseHttpBody<BodySchema>(rawResponse).catch((error: unknown) => {\n logger.error('Failed to parse response body:', error);\n return null;\n });\n\n type HeadersSchema = Default<Default<Default<MethodSchema['response']>[StatusCode]>['headers']>;\n const headers = new HttpHeaders<HeadersSchema>(rawResponse.headers);\n\n const parsedRequest = new Proxy(rawResponse as unknown as HttpInterceptorResponse<MethodSchema, StatusCode>, {\n has(target, property: keyof HttpInterceptorResponse<MethodSchema, StatusCode>) {\n if (HttpInterceptorWorker.isHiddenResponseProperty(property)) {\n return false;\n }\n return Reflect.has(target, property);\n },\n\n get(target, property: keyof HttpInterceptorResponse<MethodSchema, StatusCode>) {\n if (HttpInterceptorWorker.isHiddenResponseProperty(property)) {\n return undefined;\n }\n return Reflect.get(target, property, target) as unknown;\n },\n });\n\n Object.defineProperty(parsedRequest, 'body', {\n value: parsedBody,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'headers', {\n value: headers,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'raw', {\n value: rawResponseClone,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n return parsedRequest;\n }\n\n private static isHiddenResponseProperty(property: string) {\n return HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES.has(property as never);\n }\n\n static parseRawPathParams<Path extends string>(\n request: Request,\n options?: { baseURL: string; pathRegex: RegExp },\n ): InferPathParams<Path> {\n const requestPath = request.url.replace(options?.baseURL ?? '', '');\n const paramsMatch = options?.pathRegex.exec(requestPath);\n\n const params: Record<string, string | undefined> = {};\n\n for (const [paramName, paramValue] of Object.entries(paramsMatch?.groups ?? {})) {\n params[paramName] = typeof paramValue === 'string' ? decodeURIComponent(paramValue) : undefined;\n }\n\n return params as InferPathParams<Path>;\n }\n\n static async logUnhandledRequestWarning(rawRequest: Request, action: UnhandledRequestStrategy.Action) {\n const request = await this.parseRawRequest(rawRequest);\n\n const [formattedHeaders, formattedSearchParams, formattedBody] = await Promise.all([\n formatValueToLog(request.headers.toObject()),\n formatValueToLog(request.searchParams.toObject()),\n formatValueToLog(request.body),\n ]);\n\n logger[action === 'bypass' ? 'warn' : 'error'](\n `${action === 'bypass' ? 'Warning:' : 'Error:'} Request was not handled and was ` +\n `${action === 'bypass' ? color.yellow('bypassed') : color.red('rejected')}.\\n\\n `,\n `${request.method} ${request.url}`,\n '\\n Headers:',\n formattedHeaders,\n '\\n Search params:',\n formattedSearchParams,\n '\\n Body:',\n formattedBody,\n '\\n\\nLearn more: https://zimic.dev/docs/interceptor/guides/http/unhandled-requests',\n );\n }\n}\n\nexport default HttpInterceptorWorker;\n","import { isClientSide } from './environment';\n\nexport async function convertReadableStreamToBlob(\n stream: ReadableStream<Uint8Array<ArrayBuffer>>,\n options?: BlobPropertyBag,\n): Promise<Blob> {\n const chunks: Uint8Array<ArrayBuffer>[] = [];\n const reader = stream.getReader();\n\n while (true) {\n const result = await reader.read();\n\n if (result.value) {\n chunks.push(result.value);\n }\n\n if (result.done) {\n break;\n }\n }\n\n return new Blob(chunks, options);\n}\n\nexport function convertArrayBufferToBlob(buffer: ArrayBuffer, options?: BlobPropertyBag): Blob {\n return new Blob([buffer], options);\n}\n\nexport function convertArrayBufferToBase64(buffer: ArrayBuffer) {\n if (isClientSide()) {\n const bufferBytes = new Uint8Array(buffer);\n\n const bufferAsStringArray = [];\n for (const byte of bufferBytes) {\n const byteCode = String.fromCharCode(byte);\n bufferAsStringArray.push(byteCode);\n }\n const bufferAsString = bufferAsStringArray.join('');\n\n return btoa(bufferAsString);\n } else {\n return Buffer.from(buffer).toString('base64');\n }\n}\n\nexport function convertBase64ToArrayBuffer(base64Value: string) {\n if (isClientSide()) {\n const bufferAsString = atob(base64Value);\n const array = Uint8Array.from(bufferAsString, (character) => character.charCodeAt(0));\n return array.buffer;\n } else {\n return Buffer.from(base64Value, 'base64');\n }\n}\n\nexport const HEX_REGEX = /^[a-z0-9]+$/;\n\nexport function convertHexLengthToByteLength(hexLength: number) {\n return Math.ceil(hexLength / 2); // 1 byte = 2 hex characters\n}\n\nexport const BASE64URL_REGEX = /^[a-zA-Z0-9-_]+$/;\n\nexport function convertHexLengthToBase64urlLength(hexLength: number) {\n const byteLength = convertHexLengthToByteLength(hexLength);\n return Math.ceil((byteLength * 4) / 3); // 1 byte = 4/3 base64url characters\n}\n","import { JSONValue } from '@zimic/http';\n\nimport { convertArrayBufferToBase64, convertBase64ToArrayBuffer } from './data';\n\nexport type SerializedHttpRequest = JSONValue<{\n url: string;\n method: string;\n mode: RequestMode;\n headers: Record<string, string>;\n cache: RequestCache;\n credentials: RequestCredentials;\n integrity: string;\n keepalive: boolean;\n redirect: RequestRedirect;\n referrer: string;\n referrerPolicy: ReferrerPolicy;\n body: string | null;\n}>;\n\nexport async function serializeRequest(request: Request): Promise<SerializedHttpRequest> {\n const requestClone = request.clone();\n const serializedBody = requestClone.body ? convertArrayBufferToBase64(await requestClone.arrayBuffer()) : null;\n\n return {\n url: request.url,\n method: request.method,\n mode: request.mode,\n headers: Object.fromEntries(request.headers),\n cache: request.cache,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n body: serializedBody,\n };\n}\n\nexport function deserializeRequest(serializedRequest: SerializedHttpRequest): Request {\n const deserializedBody = serializedRequest.body ? convertBase64ToArrayBuffer(serializedRequest.body) : null;\n\n return new Request(serializedRequest.url, {\n method: serializedRequest.method,\n mode: serializedRequest.mode,\n headers: new Headers(serializedRequest.headers),\n cache: serializedRequest.cache,\n credentials: serializedRequest.credentials,\n integrity: serializedRequest.integrity,\n keepalive: serializedRequest.keepalive,\n redirect: serializedRequest.redirect,\n referrer: serializedRequest.referrer,\n referrerPolicy: serializedRequest.referrerPolicy,\n body: deserializedBody,\n });\n}\n\nexport type SerializedResponse = JSONValue<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string | null;\n}>;\n\nexport async function serializeResponse(response: Response): Promise<SerializedResponse> {\n const responseClone = response.clone();\n const serializedBody = responseClone.body ? convertArrayBufferToBase64(await responseClone.arrayBuffer()) : null;\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers),\n body: serializedBody,\n };\n}\n\nexport function deserializeResponse(serializedResponse: SerializedResponse): Response {\n const deserializedBody = serializedResponse.body ? convertBase64ToArrayBuffer(serializedResponse.body) : null;\n\n return new Response(deserializedBody, {\n status: serializedResponse.status,\n statusText: serializedResponse.statusText,\n headers: new Headers(serializedResponse.headers),\n });\n}\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport type IsomorphicCrypto = Crypto | typeof import('crypto');\n\nexport const importCrypto = createCachedDynamicImport<IsomorphicCrypto>(async () => {\n const globalCrypto = globalThis.crypto as typeof globalThis.crypto | undefined;\n /* istanbul ignore next -- @preserve\n * Ignoring as Node.js >=20 provides a global crypto and the import fallback won't run. */\n return globalCrypto ?? (await import('crypto'));\n});\n","export const WEB_SOCKET_CONTROL_MESSAGES = Object.freeze(['socket:auth:valid'] as const);\nexport type WebSocketControlMessage = (typeof WEB_SOCKET_CONTROL_MESSAGES)[number];\n","class InvalidWebSocketMessage extends Error {\n constructor(message: unknown) {\n super(`Web socket message is invalid and could not be parsed: ${message}`);\n this.name = 'InvalidWebSocketMessage';\n }\n}\n\nexport default InvalidWebSocketMessage;\n","class NotRunningWebSocketHandlerError extends Error {\n constructor() {\n super('Web socket handler is not running.');\n this.name = 'NotRunningWebSocketHandlerError';\n }\n}\n\nexport default NotRunningWebSocketHandlerError;\n","import { Collection } from '@zimic/utils/types';\nimport ClientSocket from 'isomorphic-ws';\n\nimport { importCrypto } from '@/utils/crypto';\nimport {\n DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT,\n DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT,\n WebSocketMessageAbortError,\n WebSocketMessageTimeoutError,\n closeClientSocket,\n waitForOpenClientSocket,\n} from '@/utils/webSocket';\n\nimport { WEB_SOCKET_CONTROL_MESSAGES, WebSocketControlMessage } from './constants';\nimport InvalidWebSocketMessage from './errors/InvalidWebSocketMessage';\nimport NotRunningWebSocketHandlerError from './errors/NotRunningWebSocketHandlerError';\nimport {\n WebSocketEventMessageListener,\n WebSocketReplyMessageListener,\n WebSocketReplyMessage,\n WebSocketEventMessage,\n WebSocketSchema,\n WebSocketChannel,\n WebSocketChannelWithReply,\n WebSocketChannelWithNoReply,\n WebSocketMessage,\n} from './types';\n\nabstract class WebSocketHandler<Schema extends WebSocketSchema> {\n private sockets = new Set<ClientSocket>();\n\n socketTimeout: number;\n messageTimeout: number;\n\n private channelListeners: {\n [Channel in WebSocketChannel<Schema>]?: {\n event: Set<WebSocketEventMessageListener<Schema, Channel>>;\n reply: Set<WebSocketReplyMessageListener<Schema, Channel>>;\n };\n } = {};\n\n private socketListeners = {\n messageAbort: new Map<ClientSocket, Set<(error: unknown) => void>>(),\n };\n\n protected constructor(options: { socketTimeout?: number; messageTimeout?: number }) {\n this.socketTimeout = options.socketTimeout ?? DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT;\n this.messageTimeout = options.messageTimeout ?? DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT;\n }\n\n abstract isRunning: boolean;\n\n protected async registerSocket(socket: ClientSocket, options: { waitForAuthentication?: boolean } = {}) {\n const openPromise = waitForOpenClientSocket(socket, {\n timeout: this.socketTimeout,\n waitForAuthentication: options.waitForAuthentication,\n });\n\n const handleSocketMessage = async (rawMessage: ClientSocket.MessageEvent) => {\n await this.handleSocketMessage(socket, rawMessage);\n };\n socket.addEventListener('message', handleSocketMessage);\n\n await openPromise;\n\n /* istanbul ignore next -- @preserve\n * It is difficult to reliably simulate socket errors in tests. */\n function handleSocketError(error: ClientSocket.ErrorEvent) {\n console.error(error);\n }\n socket.addEventListener('error', handleSocketError);\n\n const handleSocketClose = () => {\n socket.removeEventListener('message', handleSocketMessage);\n socket.removeEventListener('close', handleSocketClose);\n socket.removeEventListener('error', handleSocketError);\n\n this.removeSocket(socket);\n };\n\n socket.addEventListener('close', handleSocketClose);\n\n this.sockets.add(socket);\n }\n\n private handleSocketMessage = async (socket: ClientSocket, rawMessage: ClientSocket.MessageEvent) => {\n try {\n if (this.isControlMessageData(rawMessage.data)) {\n return;\n }\n\n const stringifiedMessageData = this.readRawMessageData(rawMessage.data);\n const parsedMessageData = this.parseMessage(stringifiedMessageData);\n await this.notifyListeners(parsedMessageData, socket);\n } catch (error) {\n console.error(error);\n }\n };\n\n private isControlMessageData(messageData: ClientSocket.Data): messageData is WebSocketControlMessage {\n return (\n typeof messageData === 'string' && WEB_SOCKET_CONTROL_MESSAGES.includes(messageData as WebSocketControlMessage)\n );\n }\n\n private readRawMessageData(data: ClientSocket.Data) {\n /* istanbul ignore else -- @preserve\n * All supported websocket messages should be encoded as strings. */\n if (typeof data === 'string') {\n return data;\n } else {\n throw new InvalidWebSocketMessage(data);\n }\n }\n\n private parseMessage(stringifiedMessage: string): WebSocketMessage<Schema> {\n let parsedMessage: unknown;\n\n try {\n parsedMessage = JSON.parse(stringifiedMessage) as unknown;\n } catch {\n throw new InvalidWebSocketMessage(stringifiedMessage);\n }\n\n if (!this.isMessage(parsedMessage)) {\n throw new InvalidWebSocketMessage(stringifiedMessage);\n }\n\n if (this.isReplyMessage(parsedMessage)) {\n return {\n id: parsedMessage.id,\n channel: parsedMessage.channel,\n requestId: parsedMessage.requestId,\n data: parsedMessage.data,\n };\n }\n\n return {\n id: parsedMessage.id,\n channel: parsedMessage.channel,\n data: parsedMessage.data,\n };\n }\n\n private isMessage(message: unknown): message is WebSocketMessage<Schema> {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'id' in message &&\n typeof message.id === 'string' &&\n 'channel' in message &&\n typeof message.channel === 'string' &&\n (!('requestId' in message) || typeof message.requestId === 'string')\n );\n }\n\n private async notifyListeners(message: WebSocketMessage<Schema>, socket: ClientSocket) {\n if (this.isReplyMessage(message)) {\n await this.notifyReplyListeners(message, socket);\n } else {\n await this.notifyEventListeners(message, socket);\n }\n }\n\n private async notifyReplyListeners(message: WebSocketReplyMessage<Schema>, socket: ClientSocket) {\n /* istanbul ignore next -- @preserve\n * Reply listeners are always present when notified in normal conditions. If they were not present, the request\n * would reach a timeout and not be responded. The empty set serves as a fallback. */\n const listeners = this.channelListeners[message.channel]?.reply ?? new Set();\n\n const listenerPromises = Array.from(listeners, async (listener) => {\n await listener(message, socket);\n });\n\n await Promise.all(listenerPromises);\n }\n\n private async notifyEventListeners(message: WebSocketEventMessage<Schema>, socket: ClientSocket) {\n const listeners = this.channelListeners[message.channel]?.event ?? new Set();\n\n const listenerPromises = Array.from(listeners, async (listener) => {\n const replyData = await listener(message, socket);\n await this.reply(message, replyData, { sockets: [socket] });\n });\n\n await Promise.all(listenerPromises);\n }\n\n protected async closeClientSockets(sockets: Collection<ClientSocket> = this.sockets) {\n const closingPromises = Array.from(sockets, async (socket) => {\n await closeClientSocket(socket, { timeout: this.socketTimeout });\n });\n await Promise.all(closingPromises);\n }\n\n private removeSocket(socket: ClientSocket) {\n this.abortSocketMessages([socket]);\n this.sockets.delete(socket);\n }\n\n private async createEventMessage<Channel extends WebSocketChannel<Schema>>(\n channel: Channel,\n eventData: WebSocketEventMessage<Schema, Channel>['data'],\n ) {\n const crypto = await importCrypto();\n\n const eventMessage: WebSocketEventMessage<Schema, Channel> = {\n id: crypto.randomUUID(),\n channel,\n data: eventData,\n };\n return eventMessage;\n }\n\n async send<Channel extends WebSocketChannelWithNoReply<Schema>>(\n channel: Channel,\n eventData: WebSocketEventMessage<Schema, Channel>['data'],\n options: {\n sockets?: Collection<ClientSocket>;\n } = {},\n ) {\n const event = await this.createEventMessage(channel, eventData);\n this.sendMessage(event, options.sockets);\n }\n\n async request<Channel extends WebSocketChannelWithReply<Schema>>(\n channel: Channel,\n requestData: WebSocketEventMessage<Schema, Channel>['data'],\n options: {\n sockets?: Collection<ClientSocket>;\n } = {},\n ) {\n const request = await this.createEventMessage(channel, requestData);\n this.sendMessage(request, options.sockets);\n\n const response = await this.waitForReply(channel, request.id, options.sockets);\n return response.data;\n }\n\n async waitForReply<Channel extends WebSocketChannelWithReply<Schema>>(\n channel: Channel,\n requestId: WebSocketEventMessage<Schema, Channel>['id'],\n sockets: Collection<ClientSocket> = this.sockets,\n ) {\n return new Promise<WebSocketReplyMessage<Schema, Channel>>((resolve, reject) => {\n const replyTimeout = setTimeout(() => {\n this.offReply(channel, replyListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n this.offAbortSocketMessages(sockets, abortListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n\n const timeoutError = new WebSocketMessageTimeoutError(this.messageTimeout);\n reject(timeoutError);\n }, this.messageTimeout);\n\n const abortListener = this.onAbortSocketMessages(sockets, (error) => {\n clearTimeout(replyTimeout);\n\n this.offReply(channel, replyListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n this.offAbortSocketMessages(sockets, abortListener);\n\n reject(error);\n });\n\n const replyListener = this.onReply(channel, (message) => {\n if (message.requestId === requestId) {\n clearTimeout(replyTimeout);\n\n this.offReply(channel, replyListener);\n this.offAbortSocketMessages(sockets, abortListener);\n\n resolve(message);\n }\n });\n });\n }\n\n private isReplyMessage<Channel extends WebSocketChannel<Schema>>(message: WebSocketMessage<Schema, Channel>) {\n return 'requestId' in message;\n }\n\n async reply<Channel extends WebSocketChannel<Schema>>(\n request: WebSocketEventMessage<Schema, Channel>,\n replyData: WebSocketReplyMessage<Schema, Channel>['data'],\n options: {\n sockets: Collection<ClientSocket>;\n },\n ) {\n const reply = await this.createReplyMessage(request, replyData);\n\n // If this handler received a request and was stopped before responding, discard any pending replies.\n if (this.isRunning) {\n this.sendMessage(reply, options.sockets);\n }\n }\n\n private async createReplyMessage<Channel extends WebSocketChannel<Schema>>(\n request: WebSocketEventMessage<Schema, Channel>,\n replyData: WebSocketReplyMessage<Schema, Channel>['data'],\n ) {\n const crypto = await importCrypto();\n\n const replyMessage: WebSocketReplyMessage<Schema, Channel> = {\n id: crypto.randomUUID(),\n channel: request.channel,\n requestId: request.id,\n data: replyData,\n };\n return replyMessage;\n }\n\n private sendMessage<Channel extends WebSocketChannel<Schema>>(\n message: WebSocketMessage<Schema, Channel>,\n sockets: Collection<ClientSocket> = this.sockets,\n ) {\n if (!this.isRunning) {\n throw new NotRunningWebSocketHandlerError();\n }\n\n const stringifiedMessage = JSON.stringify(message);\n\n for (const socket of sockets) {\n socket.send(stringifiedMessage);\n }\n }\n\n onEvent<Channel extends WebSocketChannel<Schema>, Listener extends WebSocketEventMessageListener<Schema, Channel>>(\n channel: Channel,\n listener: Listener,\n ): Listener {\n const listeners = this.getOrCreateChannelListeners<Channel>(channel);\n listeners.event.add(listener);\n return listener;\n }\n\n private getOrCreateChannelListeners<Channel extends WebSocketChannel<Schema>>(channel: Channel) {\n const listeners = this.channelListeners[channel] ?? {\n event: new Set(),\n reply: new Set(),\n };\n\n if (!this.channelListeners[channel]) {\n this.channelListeners[channel] = listeners;\n }\n\n return listeners;\n }\n\n onReply<\n Channel extends WebSocketChannelWithReply<Schema>,\n Listener extends WebSocketReplyMessageListener<Schema, Channel>,\n >(channel: Channel, listener: Listener): Listener {\n const listeners = this.getOrCreateChannelListeners<Channel>(channel);\n listeners.reply.add(listener);\n return listener;\n }\n\n offEvent<Channel extends WebSocketChannel<Schema>>(\n channel: Channel,\n listener: WebSocketEventMessageListener<Schema, Channel>,\n ) {\n this.channelListeners[channel]?.event.delete(listener);\n }\n\n offReply<Channel extends WebSocketChannelWithReply<Schema>>(\n channel: Channel,\n listener: WebSocketReplyMessageListener<Schema, Channel>,\n ) {\n this.channelListeners[channel]?.reply.delete(listener);\n }\n\n removeAllChannelListeners() {\n this.channelListeners = {};\n }\n\n private onAbortSocketMessages(sockets: Collection<ClientSocket>, listener: (error: unknown) => void) {\n for (const socket of sockets) {\n let listeners = this.socketListeners.messageAbort.get(socket);\n if (!listeners) {\n listeners = new Set();\n this.socketListeners.messageAbort.set(socket, listeners);\n }\n listeners.add(listener);\n }\n\n return listener;\n }\n\n private offAbortSocketMessages(sockets: Collection<ClientSocket>, listener: (error: unknown) => void) {\n for (const socket of sockets) {\n this.socketListeners.messageAbort.get(socket)?.delete(listener);\n }\n }\n\n abortSocketMessages(sockets: Collection<ClientSocket> = this.sockets) {\n const abortError = new WebSocketMessageAbortError();\n\n for (const socket of sockets) {\n const listeners = this.socketListeners.messageAbort.get(socket) ?? [];\n for (const listener of listeners) {\n listener(abortError);\n }\n }\n }\n}\n\nexport default WebSocketHandler;\n","import { PossiblePromise } from '@zimic/utils/types';\nimport { Server as HttpServer, IncomingMessage } from 'http';\nimport ClientSocket from 'isomorphic-ws';\n\nimport { closeServerSocket } from '@/utils/webSocket';\n\nimport { WebSocketControlMessage } from './constants';\nimport { WebSocketSchema } from './types';\nimport WebSocketHandler from './WebSocketHandler';\n\nconst { WebSocketServer: ServerSocket } = ClientSocket;\n\nexport type WebSocketServerAuthenticate = (\n socket: ClientSocket,\n request: IncomingMessage,\n) => PossiblePromise<{ isValid: true } | { isValid: false; message: string }>;\n\ninterface WebSocketServerOptions {\n httpServer: HttpServer;\n socketTimeout?: number;\n messageTimeout?: number;\n authenticate?: WebSocketServerAuthenticate;\n}\n\nclass WebSocketServer<Schema extends WebSocketSchema> extends WebSocketHandler<Schema> {\n private webSocketServer?: InstanceType<typeof ServerSocket>;\n\n private httpServer: HttpServer;\n private authenticate?: WebSocketServerOptions['authenticate'];\n\n constructor(options: WebSocketServerOptions) {\n super({\n socketTimeout: options.socketTimeout,\n messageTimeout: options.messageTimeout,\n });\n\n this.httpServer = options.httpServer;\n this.authenticate = options.authenticate;\n }\n\n get isRunning() {\n return this.webSocketServer !== undefined;\n }\n\n start() {\n if (this.isRunning) {\n return;\n }\n\n const webSocketServer = new ServerSocket({ server: this.httpServer });\n\n webSocketServer.on('error', (error) => {\n console.error(error);\n });\n\n webSocketServer.on('connection', async (socket, request) => {\n if (this.authenticate) {\n const result = await this.authenticate(socket, request);\n\n if (!result.isValid) {\n socket.close(1008, result.message);\n return;\n }\n }\n\n try {\n await super.registerSocket(socket);\n socket.send('socket:auth:valid' satisfies WebSocketControlMessage);\n } catch (error) {\n webSocketServer.emit('error', error);\n }\n });\n\n this.webSocketServer = webSocketServer;\n }\n\n async stop() {\n if (!this.webSocketServer || !this.isRunning) {\n return;\n }\n\n super.removeAllChannelListeners();\n super.abortSocketMessages();\n await super.closeClientSockets();\n\n await closeServerSocket(this.webSocketServer, { timeout: this.socketTimeout });\n this.webSocketServer.removeAllListeners();\n this.webSocketServer = undefined;\n }\n}\n\nexport default WebSocketServer;\n","/**\n * Error thrown when an interceptor token is invalid.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/remote-interceptors#interceptor-server-authentication Interceptor server authentication}\n */\nclass InvalidInterceptorTokenError extends Error {\n constructor(tokenId: string) {\n super(`Invalid interceptor token: ${tokenId}`);\n this.name = 'InvalidInterceptorTokenError';\n }\n}\n\nexport default InvalidInterceptorTokenError;\n","/**\n * Error thrown when an interceptor token file is invalid.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/remote-interceptors#interceptor-server-authentication Interceptor server authentication}\n */\nclass InvalidInterceptorTokenFileError extends Error {\n constructor(tokenFilePath: string, validationErrorMessage: string) {\n super(`Invalid interceptor token file ${tokenFilePath}: ${validationErrorMessage}`);\n this.name = 'InvalidInterceptorTokenFileError';\n }\n}\n\nexport default InvalidInterceptorTokenFileError;\n","/**\n * Error thrown when an interceptor token value is invalid.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/remote-interceptors#interceptor-server-authentication Interceptor server authentication}\n */\nclass InvalidInterceptorTokenValueError extends Error {\n constructor(tokenValue: string) {\n super(`Invalid interceptor token value: ${tokenValue}`);\n this.name = 'InvalidInterceptorTokenValueError';\n }\n}\n\nexport default InvalidInterceptorTokenValueError;\n","import crypto from 'crypto';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport color from 'picocolors';\nimport util from 'util';\nimport * as z from 'zod';\n\nimport {\n BASE64URL_REGEX,\n convertHexLengthToBase64urlLength,\n convertHexLengthToByteLength,\n HEX_REGEX,\n} from '@/utils/data';\nimport { pathExists } from '@/utils/files';\nimport { logger } from '@/utils/logging';\n\nimport InvalidInterceptorTokenError from '../errors/InvalidInterceptorTokenError';\nimport InvalidInterceptorTokenFileError from '../errors/InvalidInterceptorTokenFileError';\nimport InvalidInterceptorTokenValueError from '../errors/InvalidInterceptorTokenValueError';\n\nexport const DEFAULT_INTERCEPTOR_TOKENS_DIRECTORY = path.join(\n '.zimic',\n 'interceptor',\n 'server',\n `tokens${process.env.VITEST_POOL_ID}`,\n);\n\nexport const INTERCEPTOR_TOKEN_ID_HEX_LENGTH = 32;\n\nexport const INTERCEPTOR_TOKEN_SECRET_HEX_LENGTH = 64;\nexport const INTERCEPTOR_TOKEN_VALUE_HEX_LENGTH = INTERCEPTOR_TOKEN_ID_HEX_LENGTH + INTERCEPTOR_TOKEN_SECRET_HEX_LENGTH;\nexport const INTERCEPTOR_TOKEN_VALUE_BASE64URL_LENGTH = convertHexLengthToBase64urlLength(\n INTERCEPTOR_TOKEN_VALUE_HEX_LENGTH,\n);\n\nexport const INTERCEPTOR_TOKEN_SALT_HEX_LENGTH = 64;\nexport const INTERCEPTOR_TOKEN_HASH_ITERATIONS = Number(process.env.INTERCEPTOR_TOKEN_HASH_ITERATIONS);\nexport const INTERCEPTOR_TOKEN_HASH_HEX_LENGTH = 128;\nexport const INTERCEPTOR_TOKEN_HASH_ALGORITHM = 'sha512';\n\nconst pbkdf2 = util.promisify(crypto.pbkdf2);\n\nasync function hashInterceptorToken(plainToken: string, salt: string) {\n const hashBuffer = await pbkdf2(\n plainToken,\n salt,\n INTERCEPTOR_TOKEN_HASH_ITERATIONS,\n convertHexLengthToByteLength(INTERCEPTOR_TOKEN_HASH_HEX_LENGTH),\n INTERCEPTOR_TOKEN_HASH_ALGORITHM,\n );\n\n const hash = hashBuffer.toString('hex');\n return hash;\n}\n\ninterface InterceptorTokenSecret {\n hash: string;\n salt: string;\n value: string;\n}\n\nexport interface InterceptorToken {\n id: string;\n name?: string;\n secret: InterceptorTokenSecret;\n value: string;\n createdAt: Date;\n}\n\nexport function createInterceptorTokenId() {\n return crypto.randomUUID().replace(/[^a-z0-9]/g, '');\n}\n\nexport function isValidInterceptorTokenId(tokenId: string) {\n return tokenId.length === INTERCEPTOR_TOKEN_ID_HEX_LENGTH && HEX_REGEX.test(tokenId);\n}\n\nfunction isValidInterceptorTokenValue(tokenValue: string) {\n return tokenValue.length === INTERCEPTOR_TOKEN_VALUE_BASE64URL_LENGTH && BASE64URL_REGEX.test(tokenValue);\n}\n\nexport async function createInterceptorTokensDirectory(tokensDirectory: string) {\n try {\n const parentTokensDirectory = path.dirname(tokensDirectory);\n await fs.promises.mkdir(parentTokensDirectory, { recursive: true });\n await fs.promises.mkdir(tokensDirectory, { mode: 0o700, recursive: true });\n await fs.promises.appendFile(path.join(tokensDirectory, '.gitignore'), `*${os.EOL}`, { encoding: 'utf-8' });\n } catch (error) {\n logger.error(\n `${color.red(color.bold('✖'))} Failed to create the tokens directory: ${color.magenta(tokensDirectory)}`,\n );\n throw error;\n }\n}\n\nconst interceptorTokenFileContentSchema = z.object({\n version: z.literal(1),\n token: z.object({\n id: z.string().length(INTERCEPTOR_TOKEN_ID_HEX_LENGTH).regex(HEX_REGEX),\n name: z.string().optional(),\n secret: z.object({\n hash: z.string().length(INTERCEPTOR_TOKEN_HASH_HEX_LENGTH).regex(HEX_REGEX),\n salt: z.string().length(INTERCEPTOR_TOKEN_SALT_HEX_LENGTH).regex(HEX_REGEX),\n }),\n createdAt: z.iso.datetime().transform((value) => new Date(value)),\n }),\n});\n\nexport type InterceptorTokenFileContent = z.infer<typeof interceptorTokenFileContentSchema>;\n\nexport namespace InterceptorTokenFileContent {\n export type Input = z.input<typeof interceptorTokenFileContentSchema>;\n}\n\nexport type PersistedInterceptorToken = InterceptorTokenFileContent['token'];\n\nnamespace PersistedInterceptorToken {\n export type Input = InterceptorTokenFileContent.Input['token'];\n}\n\nexport async function saveInterceptorTokenToFile(tokensDirectory: string, token: InterceptorToken) {\n const tokeFilePath = path.join(tokensDirectory, token.id);\n\n const persistedToken: PersistedInterceptorToken.Input = {\n id: token.id,\n name: token.name,\n secret: {\n hash: token.secret.hash,\n salt: token.secret.salt,\n },\n createdAt: token.createdAt.toISOString(),\n };\n\n const tokenFileContent = interceptorTokenFileContentSchema.parse({\n version: 1,\n token: persistedToken,\n } satisfies InterceptorTokenFileContent.Input);\n\n await fs.promises.writeFile(tokeFilePath, JSON.stringify(tokenFileContent, null, 2), {\n mode: 0o600,\n encoding: 'utf-8',\n });\n\n return tokeFilePath;\n}\n\nexport async function readInterceptorTokenFromFile(\n tokenId: InterceptorToken['id'],\n options: { tokensDirectory: string },\n): Promise<PersistedInterceptorToken | null> {\n if (!isValidInterceptorTokenId(tokenId)) {\n throw new InvalidInterceptorTokenError(tokenId);\n }\n\n const tokenFilePath = path.join(options.tokensDirectory, tokenId);\n const tokenFileExists = await pathExists(tokenFilePath);\n\n if (!tokenFileExists) {\n return null;\n }\n\n const tokenFileContentAsString = await fs.promises.readFile(tokenFilePath, { encoding: 'utf-8' });\n\n const validation = interceptorTokenFileContentSchema.safeParse(JSON.parse(tokenFileContentAsString) as unknown);\n\n if (!validation.success) {\n throw new InvalidInterceptorTokenFileError(tokenFilePath, validation.error.message);\n }\n\n return validation.data.token;\n}\n\nexport async function createInterceptorToken(\n options: { name?: string; tokensDirectory?: string } = {},\n): Promise<InterceptorToken> {\n const { name, tokensDirectory = DEFAULT_INTERCEPTOR_TOKENS_DIRECTORY } = options;\n\n const tokensDirectoryExists = await pathExists(tokensDirectory);\n\n if (!tokensDirectoryExists) {\n await createInterceptorTokensDirectory(tokensDirectory);\n }\n\n const tokenId = createInterceptorTokenId();\n\n /* istanbul ignore if -- @preserve\n * This should never happen, but let's check that the token identifier is valid after generated. */\n if (!isValidInterceptorTokenId(tokenId)) {\n throw new InvalidInterceptorTokenError(tokenId);\n }\n\n const tokenSecretSizeInBytes = convertHexLengthToByteLength(INTERCEPTOR_TOKEN_SECRET_HEX_LENGTH);\n const tokenSecret = crypto.randomBytes(tokenSecretSizeInBytes).toString('hex');\n\n const tokenSecretSaltSizeInBytes = convertHexLengthToByteLength(INTERCEPTOR_TOKEN_SALT_HEX_LENGTH);\n const tokenSecretSalt = crypto.randomBytes(tokenSecretSaltSizeInBytes).toString('hex');\n const tokenSecretHash = await hashInterceptorToken(tokenSecret, tokenSecretSalt);\n\n const tokenValue = Buffer.from(`${tokenId}${tokenSecret}`, 'hex').toString('base64url');\n\n /* istanbul ignore if -- @preserve\n * This should never happen, but let's check that the token value is valid after generated. */\n if (!isValidInterceptorTokenValue(tokenValue)) {\n throw new InvalidInterceptorTokenValueError(tokenValue);\n }\n\n const token: InterceptorToken = {\n id: tokenId,\n name,\n secret: {\n hash: tokenSecretHash,\n salt: tokenSecretSalt,\n value: tokenSecret,\n },\n value: tokenValue,\n createdAt: new Date(),\n };\n\n await saveInterceptorTokenToFile(tokensDirectory, token);\n\n return token;\n}\n\nexport async function listInterceptorTokens(options: { tokensDirectory?: string } = {}) {\n const { tokensDirectory = DEFAULT_INTERCEPTOR_TOKENS_DIRECTORY } = options;\n\n const tokensDirectoryExists = await pathExists(tokensDirectory);\n\n if (!tokensDirectoryExists) {\n return [];\n }\n\n const files = await fs.promises.readdir(tokensDirectory);\n\n const tokenReadPromises = files.map(async (file) => {\n if (!isValidInterceptorTokenId(file)) {\n return null;\n }\n\n const tokenId = file;\n const token = await readInterceptorTokenFromFile(tokenId, { tokensDirectory });\n return token;\n });\n\n const tokenCandidates = await Promise.allSettled(tokenReadPromises);\n\n const tokens: PersistedInterceptorToken[] = [];\n\n for (const tokenCandidate of tokenCandidates) {\n if (tokenCandidate.status === 'rejected') {\n console.error(tokenCandidate.reason);\n } else if (tokenCandidate.value !== null) {\n tokens.push(tokenCandidate.value);\n }\n }\n\n tokens.sort((token, otherToken) => token.createdAt.getTime() - otherToken.createdAt.getTime());\n\n return tokens;\n}\n\nexport async function validateInterceptorToken(tokenValue: string, options: { tokensDirectory: string }) {\n if (!isValidInterceptorTokenValue(tokenValue)) {\n throw new InvalidInterceptorTokenValueError(tokenValue);\n }\n\n const decodedTokenValue = Buffer.from(tokenValue, 'base64url').toString('hex');\n\n const tokenId = decodedTokenValue.slice(0, INTERCEPTOR_TOKEN_ID_HEX_LENGTH);\n const tokenSecret = decodedTokenValue.slice(\n INTERCEPTOR_TOKEN_ID_HEX_LENGTH,\n INTERCEPTOR_TOKEN_ID_HEX_LENGTH + INTERCEPTOR_TOKEN_VALUE_HEX_LENGTH,\n );\n\n const tokenFromFile = await readInterceptorTokenFromFile(tokenId, options);\n\n if (!tokenFromFile) {\n throw new InvalidInterceptorTokenValueError(tokenValue);\n }\n\n const tokenSecretHash = await hashInterceptorToken(tokenSecret, tokenFromFile.secret.salt);\n\n if (tokenSecretHash !== tokenFromFile.secret.hash) {\n throw new InvalidInterceptorTokenValueError(tokenValue);\n }\n}\n\nexport async function removeInterceptorToken(tokenId: string, options: { tokensDirectory?: string } = {}) {\n const { tokensDirectory = DEFAULT_INTERCEPTOR_TOKENS_DIRECTORY } = options;\n\n /* istanbul ignore if -- @preserve\n * At this point, we should have a valid tokenId. This is just a sanity check. */\n if (!isValidInterceptorTokenId(tokenId)) {\n throw new InvalidInterceptorTokenError(tokenId);\n }\n\n const tokenFilePath = path.join(tokensDirectory, tokenId);\n\n await fs.promises.rm(tokenFilePath, { force: true });\n}\n","import { FetchAPI } from '@whatwg-node/server';\n\nimport { importFile } from '@/utils/files';\n\nexport async function getFetchAPI(): Promise<FetchAPI> {\n const File = await importFile();\n\n return {\n fetch,\n Request,\n Response,\n Headers,\n FormData,\n ReadableStream,\n WritableStream,\n TransformStream,\n CompressionStream,\n DecompressionStream,\n TextDecoderStream,\n TextEncoderStream,\n Blob,\n File,\n crypto: globalThis.crypto,\n btoa,\n TextEncoder,\n TextDecoder,\n URLPattern,\n URL,\n URLSearchParams,\n };\n}\n","import { normalizeNodeRequest, sendNodeResponse } from '@whatwg-node/server';\nimport { HttpRequest, HttpMethod } from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport { createServer, Server as HttpServer, IncomingMessage, ServerResponse } from 'http';\nimport type { WebSocket as Socket } from 'isomorphic-ws';\n\nimport HttpInterceptorWorker from '@/http/interceptorWorker/HttpInterceptorWorker';\nimport { removeArrayIndex } from '@/utils/arrays';\nimport { deserializeResponse, SerializedHttpRequest, serializeRequest } from '@/utils/fetch';\nimport { getHttpServerPort, startHttpServer, stopHttpServer } from '@/utils/http';\nimport { WebSocketMessageAbortError } from '@/utils/webSocket';\nimport { WebSocketEventMessage } from '@/webSocket/types';\nimport WebSocketServer, { WebSocketServerAuthenticate } from '@/webSocket/WebSocketServer';\n\nimport {\n DEFAULT_ACCESS_CONTROL_HEADERS,\n DEFAULT_PREFLIGHT_STATUS_CODE,\n DEFAULT_LOG_UNHANDLED_REQUESTS,\n DEFAULT_HOSTNAME,\n} from './constants';\nimport NotRunningInterceptorServerError from './errors/NotRunningInterceptorServerError';\nimport RunningInterceptorServerError from './errors/RunningInterceptorServerError';\nimport { InterceptorServerOptions } from './types/options';\nimport { InterceptorServer as PublicInterceptorServer } from './types/public';\nimport { HttpHandlerCommit, InterceptorServerWebSocketSchema } from './types/schema';\nimport { validateInterceptorToken } from './utils/auth';\nimport { getFetchAPI } from './utils/fetch';\n\ninterface HttpHandler {\n id: string;\n baseURL: string;\n pathRegex: RegExp;\n socket: Socket;\n}\n\nclass InterceptorServer implements PublicInterceptorServer {\n private httpServer?: HttpServer;\n private webSocketServer?: WebSocketServer<InterceptorServerWebSocketSchema>;\n\n _hostname: string;\n _port: number | undefined;\n logUnhandledRequests: boolean;\n tokensDirectory?: string;\n\n private httpHandlersByMethod: {\n [Method in HttpMethod]: HttpHandler[];\n } = {\n GET: [],\n POST: [],\n PATCH: [],\n PUT: [],\n DELETE: [],\n HEAD: [],\n OPTIONS: [],\n };\n\n private knownWorkerSockets = new Set<Socket>();\n\n constructor(options: InterceptorServerOptions) {\n this._hostname = options.hostname ?? DEFAULT_HOSTNAME;\n this._port = options.port;\n this.logUnhandledRequests = options.logUnhandledRequests ?? DEFAULT_LOG_UNHANDLED_REQUESTS;\n this.tokensDirectory = options.tokensDirectory;\n }\n\n get hostname() {\n return this._hostname;\n }\n\n set hostname(newHostname: string) {\n if (this.isRunning) {\n throw new RunningInterceptorServerError('Did you forget to stop it before changing the hostname?');\n }\n this._hostname = newHostname;\n }\n\n get port() {\n return this._port;\n }\n\n set port(newPort: number | undefined) {\n if (this.isRunning) {\n throw new RunningInterceptorServerError('Did you forget to stop it before changing the port?');\n }\n this._port = newPort;\n }\n\n get isRunning() {\n return !!this.httpServer?.listening && !!this.webSocketServer?.isRunning;\n }\n\n private get httpServerOrThrow(): HttpServer {\n /* istanbul ignore if -- @preserve\n * The HTTP server is initialized before using this method in normal conditions. */\n if (!this.httpServer) {\n throw new NotRunningInterceptorServerError();\n }\n return this.httpServer;\n }\n\n private get webSocketServerOrThrow(): WebSocketServer<InterceptorServerWebSocketSchema> {\n /* istanbul ignore if -- @preserve\n * The web socket server is initialized before using this method in normal conditions. */\n if (!this.webSocketServer) {\n throw new NotRunningInterceptorServerError();\n }\n return this.webSocketServer;\n }\n\n async start() {\n if (this.isRunning) {\n return;\n }\n\n this.httpServer = createServer({\n keepAlive: true,\n joinDuplicateHeaders: true,\n });\n await this.startHttpServer();\n\n this.webSocketServer = new WebSocketServer({\n httpServer: this.httpServer,\n authenticate: this.authenticateWebSocketConnection,\n });\n\n this.startWebSocketServer();\n }\n\n private authenticateWebSocketConnection: WebSocketServerAuthenticate = async (_socket, request) => {\n if (!this.tokensDirectory) {\n return { isValid: true };\n }\n\n const tokenValue = this.getWebSocketRequestTokenValue(request);\n\n if (!tokenValue) {\n return { isValid: false, message: 'An interceptor token is required, but none was provided.' };\n }\n\n try {\n await validateInterceptorToken(tokenValue, { tokensDirectory: this.tokensDirectory });\n return { isValid: true };\n } catch (error) {\n console.error(error);\n return { isValid: false, message: 'The interceptor token is not valid.' };\n }\n };\n\n private getWebSocketRequestTokenValue(request: IncomingMessage) {\n const protocols = request.headers['sec-websocket-protocol'] ?? '';\n const parametersAsString = decodeURIComponent(protocols).split(', ');\n\n for (const parameterAsString of parametersAsString) {\n const tokenValueMatch = /^token=(?<tokenValue>.+?)$/.exec(parameterAsString);\n const tokenValue = tokenValueMatch?.groups?.tokenValue;\n\n if (tokenValue) {\n return tokenValue;\n }\n }\n\n return undefined;\n }\n\n private async startHttpServer() {\n await startHttpServer(this.httpServerOrThrow, {\n hostname: this.hostname,\n port: this.port,\n });\n this.port = getHttpServerPort(this.httpServerOrThrow);\n\n this.httpServerOrThrow.on('request', this.handleHttpRequest);\n }\n\n private startWebSocketServer() {\n this.webSocketServerOrThrow.start();\n\n this.webSocketServerOrThrow.onEvent('interceptors/workers/commit', this.commitWorker);\n this.webSocketServerOrThrow.onEvent('interceptors/workers/reset', this.resetWorker);\n }\n\n private commitWorker = (\n message: WebSocketEventMessage<InterceptorServerWebSocketSchema, 'interceptors/workers/commit'>,\n socket: Socket,\n ) => {\n const commit = message.data;\n\n this.registerHttpHandler(commit, socket);\n this.registerWorkerSocketIfUnknown(socket);\n\n return {};\n };\n\n private resetWorker = (\n message: WebSocketEventMessage<InterceptorServerWebSocketSchema, 'interceptors/workers/reset'>,\n socket: Socket,\n ) => {\n this.removeHttpHandlersBySocket(socket);\n\n const handlersToResetTo = message.data;\n const isWorkerNoLongerCommitted = handlersToResetTo === undefined;\n\n if (isWorkerNoLongerCommitted) {\n // When a worker is no longer committed, we should abort all requests that were using it.\n // This ensures that we only wait for responses from committed worker sockets.\n this.webSocketServerOrThrow.abortSocketMessages([socket]);\n } else {\n for (const handler of handlersToResetTo) {\n this.registerHttpHandler(handler, socket);\n }\n }\n\n this.registerWorkerSocketIfUnknown(socket);\n\n return {};\n };\n\n private registerHttpHandler({ id, baseURL, method, path }: HttpHandlerCommit, socket: Socket) {\n const handlerGroups = this.httpHandlersByMethod[method];\n\n handlerGroups.push({\n id,\n baseURL,\n pathRegex: createRegexFromPath(path),\n socket,\n });\n }\n\n private registerWorkerSocketIfUnknown(socket: Socket) {\n if (this.knownWorkerSockets.has(socket)) {\n return;\n }\n\n socket.addEventListener('close', () => {\n this.removeHttpHandlersBySocket(socket);\n this.knownWorkerSockets.delete(socket);\n });\n\n this.knownWorkerSockets.add(socket);\n }\n\n private removeHttpHandlersBySocket(socket: Socket) {\n for (const handlerGroups of Object.values(this.httpHandlersByMethod)) {\n const socketIndex = handlerGroups.findIndex((handlerGroup) => handlerGroup.socket === socket);\n removeArrayIndex(handlerGroups, socketIndex);\n }\n }\n\n async stop() {\n if (!this.isRunning) {\n return;\n }\n\n await this.stopWebSocketServer();\n await this.stopHttpServer();\n }\n\n private async stopHttpServer() {\n await stopHttpServer(this.httpServerOrThrow);\n this.httpServerOrThrow.removeAllListeners();\n this.httpServer = undefined;\n }\n\n private async stopWebSocketServer() {\n this.webSocketServerOrThrow.offEvent('interceptors/workers/commit', this.commitWorker);\n this.webSocketServerOrThrow.offEvent('interceptors/workers/reset', this.resetWorker);\n\n await this.webSocketServerOrThrow.stop();\n\n this.webSocketServer = undefined;\n }\n\n private handleHttpRequest = async (nodeRequest: IncomingMessage, nodeResponse: ServerResponse) => {\n const request = normalizeNodeRequest(nodeRequest, await getFetchAPI());\n const serializedRequest = await serializeRequest(request);\n\n try {\n const { response, matchedSomeInterceptor } = await this.createResponseForRequest(serializedRequest);\n\n if (response) {\n this.setDefaultAccessControlHeaders(response, ['access-control-allow-origin', 'access-control-expose-headers']);\n await sendNodeResponse(response, nodeResponse, nodeRequest, true);\n return;\n }\n\n const isUnhandledPreflightResponse = request.method === 'OPTIONS';\n\n if (isUnhandledPreflightResponse) {\n const defaultPreflightResponse = new Response(null, { status: DEFAULT_PREFLIGHT_STATUS_CODE });\n this.setDefaultAccessControlHeaders(defaultPreflightResponse);\n await sendNodeResponse(defaultPreflightResponse, nodeResponse, nodeRequest, true);\n }\n\n const shouldWarnUnhandledRequest = !isUnhandledPreflightResponse && !matchedSomeInterceptor;\n\n if (shouldWarnUnhandledRequest) {\n await this.logUnhandledRequestIfNecessary(request, serializedRequest);\n }\n\n nodeResponse.destroy();\n } catch (error) {\n const isMessageAbortError = error instanceof WebSocketMessageAbortError;\n\n if (!isMessageAbortError) {\n console.error(error);\n await this.logUnhandledRequestIfNecessary(request, serializedRequest);\n }\n\n nodeResponse.destroy();\n }\n };\n\n private async createResponseForRequest(request: SerializedHttpRequest) {\n const methodHandlers = this.httpHandlersByMethod[request.method as HttpMethod];\n\n const requestURL = excludeNonPathParams(new URL(request.url));\n const requestURLAsString = requestURL.href === `${requestURL.origin}/` ? requestURL.origin : requestURL.href;\n\n let matchedSomeInterceptor = false;\n\n for (let handlerIndex = methodHandlers.length - 1; handlerIndex >= 0; handlerIndex--) {\n const handler = methodHandlers[handlerIndex];\n const matchesBaseURL = requestURLAsString.startsWith(handler.baseURL);\n\n if (!matchesBaseURL) {\n continue;\n }\n\n const requestPath = requestURLAsString.replace(handler.baseURL, '');\n const matchesPath = handler.pathRegex.test(requestPath);\n\n if (!matchesPath) {\n continue;\n }\n\n matchedSomeInterceptor = true;\n\n const { response: serializedResponse } = await this.webSocketServerOrThrow.request(\n 'interceptors/responses/create',\n { handlerId: handler.id, request },\n { sockets: [handler.socket] },\n );\n\n if (serializedResponse) {\n const response = deserializeResponse(serializedResponse);\n return { response, matchedSomeInterceptor };\n }\n }\n\n return { response: null, matchedSomeInterceptor };\n }\n\n private setDefaultAccessControlHeaders(\n response: Response,\n headersToSet = Object.keys(DEFAULT_ACCESS_CONTROL_HEADERS),\n ) {\n for (const key of headersToSet) {\n if (response.headers.has(key)) {\n continue;\n }\n\n const value = DEFAULT_ACCESS_CONTROL_HEADERS[key];\n /* istanbul ignore else -- @preserve\n * This is always true during tests because we force max-age=0 to disable CORS caching. */\n if (value) {\n response.headers.set(key, value);\n }\n }\n }\n\n private async logUnhandledRequestIfNecessary(request: HttpRequest, serializedRequest: SerializedHttpRequest) {\n const handler = this.findHttpHandlerByRequestBaseURL(request);\n\n if (handler) {\n try {\n const { wasLogged: wasRequestLoggedByRemoteInterceptor } = await this.webSocketServerOrThrow.request(\n 'interceptors/responses/unhandled',\n { request: serializedRequest },\n { sockets: [handler.socket] },\n );\n\n if (wasRequestLoggedByRemoteInterceptor) {\n return;\n }\n } catch (error) {\n /* istanbul ignore next -- @preserve\n *\n * If the socket is closed before receiving a response, the message is aborted with an error. This can happen if\n * we send a request message and the interceptor worker closes the socket before sending a response. In this\n * case, we can safely ignore the error because we know that the worker is shutting down and won't handle\n * any more requests.\n *\n * Due to the rare nature of this edge case, we can't reliably reproduce it in tests. */\n const isMessageAbortError = error instanceof WebSocketMessageAbortError;\n\n /* istanbul ignore next -- @preserve */\n if (!isMessageAbortError) {\n throw error;\n }\n }\n }\n\n if (!this.logUnhandledRequests) {\n return;\n }\n\n await HttpInterceptorWorker.logUnhandledRequestWarning(request, 'reject');\n }\n\n private findHttpHandlerByRequestBaseURL(request: HttpRequest) {\n const methodHandlers = this.httpHandlersByMethod[request.method as HttpMethod];\n\n const handler = methodHandlers.findLast((handler) => request.url.startsWith(handler.baseURL));\n return handler;\n }\n}\n\nexport default InterceptorServer;\n","import InterceptorServer from './InterceptorServer';\nimport { InterceptorServerOptions } from './types/options';\nimport { InterceptorServer as PublicInterceptorServer } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/create-interceptor-server `createInterceptorServer` API reference} */\nexport function createInterceptorServer(options: InterceptorServerOptions = {}): PublicInterceptorServer {\n return new InterceptorServer(options);\n}\n"]}