@prosopo/provider 5.6.4 → 5.7.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.
Files changed (88) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +16 -15
  2. package/.turbo/turbo-build$colon$tsc.log +28 -25
  3. package/.turbo/turbo-build.log +17 -16
  4. package/CHANGELOG.md +140 -0
  5. package/dist/api/blacklistRequestInspector.d.ts +1 -1
  6. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  7. package/dist/api/blacklistRequestInspector.js +9 -12
  8. package/dist/api/blacklistRequestInspector.js.map +1 -1
  9. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +0 -1
  10. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
  11. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +1 -9
  12. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
  13. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -1
  14. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +1 -49
  15. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
  16. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  17. package/dist/api/captcha/submitPoWCaptchaSolution.js +2 -1
  18. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  19. package/dist/api/verify.d.ts.map +1 -1
  20. package/dist/api/verify.js +1 -1
  21. package/dist/api/verify.js.map +1 -1
  22. package/dist/cjs/api/blacklistRequestInspector.cjs +8 -11
  23. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +0 -9
  24. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +0 -48
  25. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +3 -2
  26. package/dist/cjs/api/verify.cjs +1 -1
  27. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +3 -5
  28. package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +30 -1
  29. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +1 -2
  30. package/dist/cjs/tasks/puzzle/puzzleDifficulty.cjs +13 -170
  31. package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +2 -2
  32. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +2 -8
  33. package/dist/tasks/frictionless/frictionlessTasks.d.ts +1 -2
  34. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  35. package/dist/tasks/frictionless/frictionlessTasks.js +2 -4
  36. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  37. package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +1 -1
  38. package/dist/tasks/frictionless/frictionlessTasksUtils.js +30 -1
  39. package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +1 -1
  40. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +1 -1
  41. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  42. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +1 -3
  43. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  44. package/dist/tasks/puzzle/puzzleDifficulty.d.ts +0 -17
  45. package/dist/tasks/puzzle/puzzleDifficulty.d.ts.map +1 -1
  46. package/dist/tasks/puzzle/puzzleDifficulty.js +11 -164
  47. package/dist/tasks/puzzle/puzzleDifficulty.js.map +1 -1
  48. package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
  49. package/dist/tasks/puzzle/puzzleRenderer.js +1 -1
  50. package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
  51. package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -1
  52. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  53. package/dist/tasks/spam/checkTrafficFilter.js +3 -9
  54. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  55. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +1 -19
  56. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  57. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js +1 -10
  58. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js.map +1 -1
  59. package/dist/tests/integration/clientSettingsPersistence.integration.test.js +1 -15
  60. package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
  61. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +35 -0
  62. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  63. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +1 -30
  64. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
  65. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.unit.test.js +0 -6
  66. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.unit.test.js.map +1 -1
  67. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +1 -62
  68. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  69. package/dist/tests/unit/tasks/captchaManager.unit.test.js +1 -10
  70. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  71. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +3 -23
  72. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  73. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +64 -0
  74. package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +1 -1
  75. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +10 -10
  76. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  77. package/dist/tests/unit/tasks/puzzleDifficulty.unit.test.js +2 -53
  78. package/dist/tests/unit/tasks/puzzleDifficulty.unit.test.js.map +1 -1
  79. package/package.json +29 -28
  80. package/dist/api/captcha/contextAwareValidation.d.ts +0 -5
  81. package/dist/api/captcha/contextAwareValidation.d.ts.map +0 -1
  82. package/dist/api/captcha/contextAwareValidation.js +0 -45
  83. package/dist/api/captcha/contextAwareValidation.js.map +0 -1
  84. package/dist/cjs/api/captcha/contextAwareValidation.cjs +0 -47
  85. package/dist/tests/unit/api/contextAwareValidation.unit.test.d.ts +0 -2
  86. package/dist/tests/unit/api/contextAwareValidation.unit.test.d.ts.map +0 -1
  87. package/dist/tests/unit/api/contextAwareValidation.unit.test.js +0 -105
  88. package/dist/tests/unit/api/contextAwareValidation.unit.test.js.map +0 -1
@@ -1,47 +0,0 @@
1
- let _prosopo_types = require("@prosopo/types");
2
- //#region src/api/captcha/contextAwareValidation.ts
3
- /**
4
- * Determines the context a request belongs to — its device family crossed
5
- * with whether it is running in a webview.
6
- *
7
- * `userAgent` is the raw header value, not the hashed one carried on the
8
- * decrypted payload. The entropy sweep classifies stored sessions from the
9
- * same header through the same function, so the two sides agree on which
10
- * bucket a session lands in.
11
- *
12
- * @param userAgent - Raw `user-agent` request header
13
- * @param webView - Whether the request is from a WebView
14
- */
15
- function determineContextType(userAgent, webView) {
16
- return (0, _prosopo_types.contextTypeFromSession)(userAgent, webView);
17
- }
18
- /**
19
- * Whether the client has this context configured.
20
- *
21
- * A context the customer has not enabled is not validated at all — the
22
- * request passes through this stage untouched. That is a change from the
23
- * pre-device-type behaviour, where configuring a single context validated
24
- * *every* request against it: with six contexts, applying a tablet baseline
25
- * to desktop traffic would reject real users wholesale.
26
- */
27
- function isContextConfigured(settings, contextType) {
28
- return (0, _prosopo_types.expandContexts)(settings.contextAware?.contexts)[contextType] !== void 0;
29
- }
30
- /**
31
- * Gets the threshold for a specific context type from client settings.
32
- *
33
- * Falls back to the global default when the context is unconfigured, so a
34
- * caller that skipped `isContextConfigured` still gets a sane number rather
35
- * than NaN.
36
- *
37
- * @param settings - Client settings
38
- * @param contextType - The context type to get the threshold for
39
- * @returns The threshold for the context type, or the global threshold if not configured
40
- */
41
- function getContextThreshold(settings, contextType) {
42
- return (0, _prosopo_types.expandContexts)(settings.contextAware?.contexts)[contextType]?.threshold ?? _prosopo_types.contextAwareThresholdDefault;
43
- }
44
- //#endregion
45
- exports.determineContextType = determineContextType;
46
- exports.getContextThreshold = getContextThreshold;
47
- exports.isContextConfigured = isContextConfigured;
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=contextAwareValidation.unit.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contextAwareValidation.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit/api/contextAwareValidation.unit.test.ts"],"names":[],"mappings":""}
@@ -1,105 +0,0 @@
1
- import { ContextType, contextAwareThresholdDefault, } from "@prosopo/types";
2
- import { describe, expect, it } from "vitest";
3
- import { determineContextType, getContextThreshold, isContextConfigured, } from "../../../api/captcha/contextAwareValidation.js";
4
- const DESKTOP_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
5
- const IPHONE_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
6
- const IPAD_UA = "Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
7
- const ANDROID_PHONE_UA = "Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36";
8
- const ANDROID_TABLET_UA = "Mozilla/5.0 (Linux; Android 13; SM-X710) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
9
- const settingsWith = (contexts) => ({
10
- contextAware: { enabled: true, contexts },
11
- });
12
- describe("contextAwareValidation", () => {
13
- describe("determineContextType", () => {
14
- it("classifies desktop browsers", () => {
15
- expect(determineContextType(DESKTOP_UA, false)).toBe(ContextType.Desktop);
16
- });
17
- it("classifies phones", () => {
18
- expect(determineContextType(IPHONE_UA, false)).toBe(ContextType.Mobile);
19
- expect(determineContextType(ANDROID_PHONE_UA, false)).toBe(ContextType.Mobile);
20
- });
21
- it("classifies tablets, including an iPad whose UA carries a Mobile token", () => {
22
- expect(determineContextType(IPAD_UA, false)).toBe(ContextType.Tablet);
23
- expect(determineContextType(ANDROID_TABLET_UA, false)).toBe(ContextType.Tablet);
24
- });
25
- it("crosses each device family with the webview flag", () => {
26
- expect(determineContextType(DESKTOP_UA, true)).toBe(ContextType.DesktopWebview);
27
- expect(determineContextType(IPHONE_UA, true)).toBe(ContextType.MobileWebview);
28
- expect(determineContextType(IPAD_UA, true)).toBe(ContextType.TabletWebview);
29
- });
30
- it("falls back to desktop for a missing user agent", () => {
31
- expect(determineContextType(undefined, false)).toBe(ContextType.Desktop);
32
- });
33
- });
34
- describe("isContextConfigured", () => {
35
- it("is false when contextAware is not set", () => {
36
- expect(isContextConfigured({}, ContextType.Mobile)).toBe(false);
37
- });
38
- it("is true only for the device contexts that are configured", () => {
39
- const settings = settingsWith({
40
- [ContextType.Mobile]: { type: ContextType.Mobile, threshold: 0.8 },
41
- });
42
- expect(isContextConfigured(settings, ContextType.Mobile)).toBe(true);
43
- expect(isContextConfigured(settings, ContextType.Desktop)).toBe(false);
44
- expect(isContextConfigured(settings, ContextType.MobileWebview)).toBe(false);
45
- });
46
- it("expands a legacy default context over every non-webview family", () => {
47
- const settings = settingsWith({
48
- [ContextType.Default]: { type: ContextType.Default, threshold: 0.75 },
49
- });
50
- expect(isContextConfigured(settings, ContextType.Desktop)).toBe(true);
51
- expect(isContextConfigured(settings, ContextType.Mobile)).toBe(true);
52
- expect(isContextConfigured(settings, ContextType.Tablet)).toBe(true);
53
- expect(isContextConfigured(settings, ContextType.MobileWebview)).toBe(false);
54
- });
55
- it("expands a legacy webview context over every webview family", () => {
56
- const settings = settingsWith({
57
- [ContextType.Webview]: { type: ContextType.Webview, threshold: 0.75 },
58
- });
59
- expect(isContextConfigured(settings, ContextType.MobileWebview)).toBe(true);
60
- expect(isContextConfigured(settings, ContextType.TabletWebview)).toBe(true);
61
- expect(isContextConfigured(settings, ContextType.DesktopWebview)).toBe(true);
62
- expect(isContextConfigured(settings, ContextType.Mobile)).toBe(false);
63
- });
64
- });
65
- describe("getContextThreshold", () => {
66
- it("returns the default threshold when contextAware is not set", () => {
67
- const settings = {};
68
- expect(getContextThreshold(settings, ContextType.Desktop)).toBe(contextAwareThresholdDefault);
69
- });
70
- it("returns the device context's own threshold", () => {
71
- const settings = settingsWith({
72
- [ContextType.Mobile]: { type: ContextType.Mobile, threshold: 0.9 },
73
- [ContextType.Desktop]: { type: ContextType.Desktop, threshold: 0.6 },
74
- });
75
- expect(getContextThreshold(settings, ContextType.Mobile)).toBe(0.9);
76
- expect(getContextThreshold(settings, ContextType.Desktop)).toBe(0.6);
77
- });
78
- it("inherits a legacy context's threshold across its family", () => {
79
- const settings = settingsWith({
80
- [ContextType.Default]: { type: ContextType.Default, threshold: 0.85 },
81
- });
82
- expect(getContextThreshold(settings, ContextType.Desktop)).toBe(0.85);
83
- expect(getContextThreshold(settings, ContextType.Tablet)).toBe(0.85);
84
- });
85
- it("lets a device context override the legacy threshold that covers it", () => {
86
- const settings = settingsWith({
87
- [ContextType.Default]: { type: ContextType.Default, threshold: 0.85 },
88
- [ContextType.Mobile]: { type: ContextType.Mobile, threshold: 0.6 },
89
- });
90
- expect(getContextThreshold(settings, ContextType.Mobile)).toBe(0.6);
91
- expect(getContextThreshold(settings, ContextType.Desktop)).toBe(0.85);
92
- });
93
- it("returns the default threshold for an unconfigured context", () => {
94
- const settings = settingsWith({
95
- [ContextType.Mobile]: { type: ContextType.Mobile, threshold: 0.9 },
96
- });
97
- expect(getContextThreshold(settings, ContextType.Desktop)).toBe(contextAwareThresholdDefault);
98
- });
99
- it("handles an empty contexts object", () => {
100
- const settings = settingsWith({});
101
- expect(getContextThreshold(settings, ContextType.Desktop)).toBe(contextAwareThresholdDefault);
102
- });
103
- });
104
- });
105
- //# sourceMappingURL=contextAwareValidation.unit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contextAwareValidation.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/api/contextAwareValidation.unit.test.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,WAAW,EAEX,4BAA4B,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACN,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,gDAAgD,CAAC;AAExD,MAAM,UAAU,GACf,uHAAuH,CAAC;AACzH,MAAM,SAAS,GACd,yIAAyI,CAAC;AAC3I,MAAM,OAAO,GACZ,gIAAgI,CAAC;AAClI,MAAM,gBAAgB,GACrB,uHAAuH,CAAC;AACzH,MAAM,iBAAiB,GACtB,gHAAgH,CAAC;AAElH,MAAM,YAAY,GAAG,CACpB,QAAkE,EAClD,EAAE,CAClB,CAAC;IACA,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;CACzC,CAA6B,CAAC;AAEhC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACxE,MAAM,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CACzD,WAAW,CAAC,MAAM,CAClB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;YAChF,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACtE,MAAM,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAC1D,WAAW,CAAC,MAAM,CAClB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAClD,WAAW,CAAC,cAAc,CAC1B,CAAC;YACF,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CACjD,WAAW,CAAC,aAAa,CACzB,CAAC;YACF,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAC/C,WAAW,CAAC,aAAa,CACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACzD,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAChD,MAAM,CACL,mBAAmB,CAAC,EAA8B,EAAE,WAAW,CAAC,MAAM,CAAC,CACvE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YACnE,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC7B,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE;aAClE,CAAC,CAAC;YAEH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CACpE,KAAK,CACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACzE,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC7B,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;aACrE,CAAC,CAAC;YAEH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CACpE,KAAK,CACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACrE,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC7B,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;aACrE,CAAC,CAAC;YAEH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CACpE,IAAI,CACJ,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CACpE,IAAI,CACJ,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CACrE,IAAI,CACJ,CAAC;YACF,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACrE,MAAM,QAAQ,GAAG,EAA8B,CAAC;YAChD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC9D,4BAA4B,CAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACrD,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC7B,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE;gBAClE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE;aACpE,CAAC,CAAC;YAEH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YAClE,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC7B,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;aACrE,CAAC,CAAC;YAEH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC7E,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC7B,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE;aAClE,CAAC,CAAC;YAEH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACpE,MAAM,QAAQ,GAAG,YAAY,CAAC;gBAC7B,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE;aAClE,CAAC,CAAC;YAEH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC9D,4BAA4B,CAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC9D,4BAA4B,CAC5B,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}