@nest-boot/hash 7.0.2 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,42 +1,181 @@
1
1
  "use strict";
2
+ /* eslint-disable @typescript-eslint/no-deprecated */
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
3
4
  const testing_1 = require("@nestjs/testing");
4
5
  const _1 = require(".");
6
+ const TEST_SECRET = "myTestSecretThatIsAtLeast32Chars!";
7
+ const TEST_SECRET_ALT = "anotherSecretThatIsAtLeast32Char";
5
8
  describe("HashService", () => {
6
- const globalSecret = "myGlobalSecret";
7
- let hashService;
8
- beforeEach(async () => {
9
- const moduleRef = await testing_1.Test.createTestingModule({
10
- imports: [_1.HashModule.register({ secret: globalSecret })],
11
- }).compile();
12
- hashService = moduleRef.get(_1.HashService);
9
+ const globalSecret = TEST_SECRET;
10
+ describe("instance methods (via HashModule.register)", () => {
11
+ let hashService;
12
+ beforeEach(async () => {
13
+ const moduleRef = await testing_1.Test.createTestingModule({
14
+ imports: [_1.HashModule.register({ secret: globalSecret })],
15
+ }).compile();
16
+ hashService = moduleRef.get(_1.HashService);
17
+ });
18
+ describe("hash", () => {
19
+ it("should create a hash with the provided value and secret", async () => {
20
+ const value = "password";
21
+ const secret = TEST_SECRET_ALT;
22
+ const result = await hashService.hash(value, secret);
23
+ expect(result).toBeDefined();
24
+ expect(result).toContain("$argon2");
25
+ });
26
+ it("should create a hash with the provided value and default secret", async () => {
27
+ const value = "password";
28
+ const result = await hashService.hash(value);
29
+ expect(result).toBeDefined();
30
+ expect(result).toContain("$argon2");
31
+ });
32
+ });
33
+ describe("create (deprecated)", () => {
34
+ it("should create a hash with the provided value and secret", async () => {
35
+ const value = "password";
36
+ const secret = TEST_SECRET_ALT;
37
+ const result = await hashService.create(value, secret);
38
+ expect(result).toBeDefined();
39
+ expect(result).toContain("$argon2");
40
+ });
41
+ it("should create a hash with the provided value and default secret", async () => {
42
+ const value = "password";
43
+ const result = await hashService.create(value);
44
+ expect(result).toBeDefined();
45
+ expect(result).toContain("$argon2");
46
+ });
47
+ });
48
+ describe("verify", () => {
49
+ it("should verify the hashed value with the provided value and secret", async () => {
50
+ const value = "password";
51
+ const secret = TEST_SECRET_ALT;
52
+ const hashed = await hashService.hash(value, secret);
53
+ const result = await hashService.verify(hashed, value, secret);
54
+ expect(result).toBe(true);
55
+ });
56
+ it("should verify the hashed value with the provided value and default secret", async () => {
57
+ const value = "password";
58
+ const hashed = await hashService.hash(value);
59
+ const result = await hashService.verify(hashed, value);
60
+ expect(result).toBe(true);
61
+ });
62
+ it("should return false for incorrect password", async () => {
63
+ const value = "password";
64
+ const hashed = await hashService.hash(value);
65
+ const result = await hashService.verify(hashed, "wrongpassword");
66
+ expect(result).toBe(false);
67
+ });
68
+ });
13
69
  });
14
- describe("create", () => {
15
- it("should create a hash with the provided value and secret", async () => {
16
- const value = "password";
17
- const secret = "mySecret";
18
- const result = await hashService.create(value, secret);
19
- expect(result).toBeDefined();
20
- });
21
- it("should create a hash with the provided value and default secret", async () => {
22
- const value = "password";
23
- const result = await hashService.create(value);
24
- expect(result).toBeDefined();
70
+ describe("static methods", () => {
71
+ beforeEach(() => {
72
+ // Reset static instance before each test
73
+ _1.HashService._instance =
74
+ undefined;
75
+ });
76
+ describe("instance getter", () => {
77
+ it("should throw error when not initialized", () => {
78
+ expect(() => _1.HashService.instance).toThrow("HashService not initialized");
79
+ });
80
+ it("should return instance after initialization", () => {
81
+ _1.HashService.init(TEST_SECRET);
82
+ expect(_1.HashService.instance).toBeInstanceOf(_1.HashService);
83
+ });
84
+ });
85
+ describe("init", () => {
86
+ it("should initialize with secret", () => {
87
+ _1.HashService.init(TEST_SECRET);
88
+ expect(_1.HashService.instance).toBeDefined();
89
+ });
90
+ it("should initialize without secret", () => {
91
+ _1.HashService.init();
92
+ expect(_1.HashService.instance).toBeDefined();
93
+ });
94
+ });
95
+ describe("hash (static)", () => {
96
+ it("should create a hash using static method", async () => {
97
+ _1.HashService.init(TEST_SECRET);
98
+ const value = "password";
99
+ const result = await _1.HashService.hash(value);
100
+ expect(result).toBeDefined();
101
+ expect(result).toContain("$argon2");
102
+ });
103
+ it("should create a hash with custom secret using static method", async () => {
104
+ _1.HashService.init(TEST_SECRET);
105
+ const value = "password";
106
+ const secret = TEST_SECRET_ALT;
107
+ const result = await _1.HashService.hash(value, secret);
108
+ expect(result).toBeDefined();
109
+ expect(result).toContain("$argon2");
110
+ });
111
+ });
112
+ describe("verify (static)", () => {
113
+ it("should verify using static method", async () => {
114
+ _1.HashService.init(TEST_SECRET);
115
+ const value = "password";
116
+ const hashed = await _1.HashService.hash(value);
117
+ const result = await _1.HashService.verify(hashed, value);
118
+ expect(result).toBe(true);
119
+ });
120
+ it("should verify with custom secret using static method", async () => {
121
+ _1.HashService.init(TEST_SECRET);
122
+ const value = "password";
123
+ const secret = TEST_SECRET_ALT;
124
+ const hashed = await _1.HashService.hash(value, secret);
125
+ const result = await _1.HashService.verify(hashed, value, secret);
126
+ expect(result).toBe(true);
127
+ });
128
+ });
129
+ describe("hashSync (static)", () => {
130
+ it("should create a hash synchronously using static method", () => {
131
+ _1.HashService.init(TEST_SECRET);
132
+ const value = "password";
133
+ const result = _1.HashService.hashSync(value);
134
+ expect(result).toBeDefined();
135
+ expect(result).toContain("$argon2");
136
+ });
137
+ it("should create a hash synchronously with custom secret using static method", () => {
138
+ _1.HashService.init(TEST_SECRET);
139
+ const value = "password";
140
+ const secret = TEST_SECRET_ALT;
141
+ const result = _1.HashService.hashSync(value, secret);
142
+ expect(result).toBeDefined();
143
+ expect(result).toContain("$argon2");
144
+ });
145
+ });
146
+ describe("verifySync (static)", () => {
147
+ it("should verify synchronously using static method", () => {
148
+ _1.HashService.init(TEST_SECRET);
149
+ const value = "password";
150
+ const hashed = _1.HashService.hashSync(value);
151
+ const result = _1.HashService.verifySync(hashed, value);
152
+ expect(result).toBe(true);
153
+ });
154
+ it("should verify synchronously with custom secret using static method", () => {
155
+ _1.HashService.init(TEST_SECRET);
156
+ const value = "password";
157
+ const secret = TEST_SECRET_ALT;
158
+ const hashed = _1.HashService.hashSync(value, secret);
159
+ const result = _1.HashService.verifySync(hashed, value, secret);
160
+ expect(result).toBe(true);
161
+ });
162
+ it("should return false for incorrect password synchronously", () => {
163
+ _1.HashService.init(TEST_SECRET);
164
+ const value = "password";
165
+ const hashed = _1.HashService.hashSync(value);
166
+ const result = _1.HashService.verifySync(hashed, "wrongpassword");
167
+ expect(result).toBe(false);
168
+ });
25
169
  });
26
170
  });
27
- describe("verify", () => {
28
- it("should verify the hashed value with the provided value and secret", async () => {
29
- const hashed = "$argon2id$v=19$m=19456,t=2,p=1$pLzJg4HZZPyJmwa4UrBOIw$faLtt/ZlZd4Rc34V1vTV69bATK7gXULr/0pQvPhXi7k";
30
- const value = "password";
31
- const secret = "mySecret";
32
- const result = await hashService.verify(hashed, value, secret);
33
- expect(result).toBe(true);
34
- });
35
- it("should verify the hashed value with the provided value and default secret", async () => {
36
- const hashed = "$argon2id$v=19$m=19456,t=2,p=1$HMuzTfczqMM3OU1YHm3h6A$+xwVTb3sE531tRcZQvMp7ubEi0i5xj/isTz59kK5BVg";
37
- const value = "password";
38
- const result = await hashService.verify(hashed, value);
39
- expect(result).toBe(true);
171
+ describe("constructor", () => {
172
+ it("should create instance with secret", () => {
173
+ const service = new _1.HashService(TEST_SECRET);
174
+ expect(service).toBeDefined();
175
+ });
176
+ it("should create instance without secret", () => {
177
+ const service = new _1.HashService();
178
+ expect(service).toBeDefined();
40
179
  });
41
180
  });
42
181
  });
@@ -1 +1 @@
1
- {"version":3,"file":"hash.service.spec.js","sourceRoot":"","sources":["../src/hash.service.spec.ts"],"names":[],"mappings":";;AAAA,6CAAuC;AAEvC,wBAA4C;AAE5C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,YAAY,GAAG,gBAAgB,CAAC;IACtC,IAAI,WAAwB,CAAC;IAE7B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,SAAS,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC/C,OAAO,EAAE,CAAC,aAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;SACzD,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,WAAW,GAAG,SAAS,CAAC,GAAG,CAAc,cAAW,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,KAAK,GAAG,UAAU,CAAC;YACzB,MAAM,MAAM,GAAG,UAAU,CAAC;YAE1B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,KAAK,GAAG,UAAU,CAAC;YAEzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE/C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,MAAM,GACV,mGAAmG,CAAC;YACtG,MAAM,KAAK,GAAG,UAAU,CAAC;YACzB,MAAM,MAAM,GAAG,UAAU,CAAC;YAE1B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,MAAM,MAAM,GACV,mGAAmG,CAAC;YACtG,MAAM,KAAK,GAAG,UAAU,CAAC;YAEzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"hash.service.spec.js","sourceRoot":"","sources":["../src/hash.service.spec.ts"],"names":[],"mappings":";AAAA,qDAAqD;;AAErD,6CAAuC;AAEvC,wBAA4C;AAE5C,MAAM,WAAW,GAAG,mCAAmC,CAAC;AACxD,MAAM,eAAe,GAAG,kCAAkC,CAAC;AAE3D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,YAAY,GAAG,WAAW,CAAC;IAEjC,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAC1D,IAAI,WAAwB,CAAC;QAE7B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,SAAS,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;gBAC/C,OAAO,EAAE,CAAC,aAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;aACzD,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,WAAW,GAAG,SAAS,CAAC,GAAG,CAAc,cAAW,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;YACpB,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;gBACvE,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,eAAe,CAAC;gBAE/B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAErD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;gBAC/E,MAAM,KAAK,GAAG,UAAU,CAAC;gBAEzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;gBACvE,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,eAAe,CAAC;gBAE/B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;gBAC/E,MAAM,KAAK,GAAG,UAAU,CAAC;gBAEzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAE/C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;YACtB,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;gBACjF,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,eAAe,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAErD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAE/D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;gBACzF,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBAC1D,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;gBAEjE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,UAAU,CAAC,GAAG,EAAE;YACd,yCAAyC;YACxC,cAAmD,CAAC,SAAS;gBAC5D,SAAS,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;YAC/B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;gBACjD,MAAM,CAAC,GAAG,EAAE,CAAC,cAAW,CAAC,QAAQ,CAAC,CAAC,OAAO,CACxC,6BAA6B,CAC9B,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;gBACrD,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAE9B,MAAM,CAAC,cAAW,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,cAAW,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;YACpB,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;gBACvC,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAE9B,MAAM,CAAC,cAAW,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;gBAC1C,cAAW,CAAC,IAAI,EAAE,CAAC;gBAEnB,MAAM,CAAC,cAAW,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;YAC7B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;gBACxD,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBAEzB,MAAM,MAAM,GAAG,MAAM,cAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;gBAC3E,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,eAAe,CAAC;gBAE/B,MAAM,MAAM,GAAG,MAAM,cAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAErD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;YAC/B,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;gBACjD,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,cAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE7C,MAAM,MAAM,GAAG,MAAM,cAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBACpE,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,eAAe,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,cAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAErD,MAAM,MAAM,GAAG,MAAM,cAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAE/D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACjC,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;gBAChE,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBAEzB,MAAM,MAAM,GAAG,cAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;gBACnF,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,eAAe,CAAC;gBAE/B,MAAM,MAAM,GAAG,cAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;gBACzD,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,cAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAE3C,MAAM,MAAM,GAAG,cAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAErD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;gBAC5E,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,eAAe,CAAC;gBAC/B,MAAM,MAAM,GAAG,cAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAEnD,MAAM,MAAM,GAAG,cAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAE7D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;gBAClE,cAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,cAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAE3C,MAAM,MAAM,GAAG,cAAW,CAAC,UAAU,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;gBAE/D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,OAAO,GAAG,IAAI,cAAW,CAAC,WAAW,CAAC,CAAC;YAE7C,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,OAAO,GAAG,IAAI,cAAW,EAAE,CAAC;YAElC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}