@leancodepl/login-manager 10.0.2 → 10.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/dist/index.js +18 -15
- package/dist/index.umd.cjs +1 -1
- package/dist/lib/baseLoginManager.d.ts +2 -1
- package/dist/lib/baseLoginManager.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,27 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See
|
|
4
4
|
[Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [10.1.1](https://github.com/leancodepl/js_corelibrary/compare/v10.1.0...v10.1.1) (2026-02-23)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- always refresh token on non-concurrent tryRefreshToken calls
|
|
11
|
+
([b7140a2](https://github.com/leancodepl/js_corelibrary/commit/b7140a2e06ddead6372aa7815d6dd0da94919f2a))
|
|
12
|
+
|
|
13
|
+
# Change Log
|
|
14
|
+
|
|
15
|
+
All notable changes to this project will be documented in this file. See
|
|
16
|
+
[Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
17
|
+
|
|
18
|
+
# [10.1.0](https://github.com/leancodepl/js_corelibrary/compare/v10.0.2...v10.1.0) (2026-02-16)
|
|
19
|
+
|
|
20
|
+
**Note:** Version bump only for package @leancodepl/login-manager
|
|
21
|
+
|
|
22
|
+
# Change Log
|
|
23
|
+
|
|
24
|
+
All notable changes to this project will be documented in this file. See
|
|
25
|
+
[Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
26
|
+
|
|
6
27
|
## [10.0.2](https://github.com/leancodepl/js_corelibrary/compare/v10.0.1...v10.0.2) (2026-02-13)
|
|
7
28
|
|
|
8
29
|
**Note:** Version bump only for package @leancodepl/login-manager
|
package/dist/index.js
CHANGED
|
@@ -33,10 +33,10 @@ class h {
|
|
|
33
33
|
return e !== null ? await this.tryRefreshTokenInternal(e) : null;
|
|
34
34
|
}
|
|
35
35
|
async tryRefreshTokenInternal(e) {
|
|
36
|
-
return typeof navigator < "u" && "locks" in navigator ? await this.tryRefreshWithLock(
|
|
36
|
+
return typeof navigator < "u" && "locks" in navigator ? await this.tryRefreshWithLock() : (this.isRefreshingToken || (this.isRefreshingToken = !0, (async () => {
|
|
37
37
|
try {
|
|
38
|
-
const s = await this.
|
|
39
|
-
this.refreshTokenCallbacks.forEach((n) => n(s
|
|
38
|
+
const s = await this.refreshToken(e);
|
|
39
|
+
this.refreshTokenCallbacks.forEach((n) => n(s));
|
|
40
40
|
} catch {
|
|
41
41
|
this.refreshTokenCallbacks.forEach((s) => s(!1));
|
|
42
42
|
} finally {
|
|
@@ -46,24 +46,27 @@ class h {
|
|
|
46
46
|
this.refreshTokenCallbacks.push(t);
|
|
47
47
|
}));
|
|
48
48
|
}
|
|
49
|
-
async tryRefreshWithLock(
|
|
50
|
-
|
|
49
|
+
async tryRefreshWithLock() {
|
|
50
|
+
const e = await navigator.locks.request(a, { ifAvailable: !0 }, async (t) => {
|
|
51
51
|
if (!t)
|
|
52
|
-
return
|
|
53
|
-
|
|
52
|
+
return null;
|
|
53
|
+
const s = await this.storage.getToken();
|
|
54
|
+
if (s === null)
|
|
54
55
|
return !1;
|
|
55
|
-
if (e.expirationDate >= /* @__PURE__ */ new Date())
|
|
56
|
-
return !0;
|
|
57
56
|
try {
|
|
58
|
-
return
|
|
57
|
+
return await this.refreshToken(s);
|
|
59
58
|
} catch {
|
|
60
59
|
return !1;
|
|
61
60
|
}
|
|
62
61
|
});
|
|
62
|
+
return e !== null ? e : await this.waitForRefreshLockRelease();
|
|
63
63
|
}
|
|
64
|
-
async
|
|
64
|
+
async waitForRefreshLockRelease() {
|
|
65
65
|
return await navigator.locks.request(a, { mode: "shared" }, async () => await this.storage.getToken() !== null);
|
|
66
66
|
}
|
|
67
|
+
async refreshToken(e) {
|
|
68
|
+
return (await this.acquireToken(this.buildRefreshRequest(e))).type === "success";
|
|
69
|
+
}
|
|
67
70
|
onChange(e) {
|
|
68
71
|
this.callbacks.push(e);
|
|
69
72
|
}
|
|
@@ -279,7 +282,7 @@ class g {
|
|
|
279
282
|
return this.token = null, Promise.resolve();
|
|
280
283
|
}
|
|
281
284
|
}
|
|
282
|
-
class
|
|
285
|
+
class f {
|
|
283
286
|
constructor(e = "token", t = "refresh_token", s = "expiration_date") {
|
|
284
287
|
this.tokenKey = e, this.refreshKey = t, this.expiryKey = s;
|
|
285
288
|
}
|
|
@@ -309,7 +312,7 @@ class d {
|
|
|
309
312
|
sessionStorage.removeItem(e);
|
|
310
313
|
}
|
|
311
314
|
}
|
|
312
|
-
class
|
|
315
|
+
class d extends h {
|
|
313
316
|
signOut() {
|
|
314
317
|
this.storage.resetToken(), this.notify(!1);
|
|
315
318
|
}
|
|
@@ -335,6 +338,6 @@ export {
|
|
|
335
338
|
c as FacebookClient,
|
|
336
339
|
k as LocalTokenStorage,
|
|
337
340
|
g as MemoryTokenStorage,
|
|
338
|
-
|
|
339
|
-
|
|
341
|
+
f as SessionTokenStorage,
|
|
342
|
+
d as SyncLoginManager
|
|
340
343
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(n,r){typeof exports=="object"&&typeof module<"u"?r(exports):typeof define=="function"&&define.amd?define(["exports"],r):(n=typeof globalThis<"u"?globalThis:n||self,r(n["@leancodepl/login-manager"]={}))})(this,(function(n){"use strict";const r="token_refresh_lock";class h{constructor(e,t,s,i,y,u){this.storage=e,this.endpoint=t,this.clientSecret=s,this.clientId=i,this.scopes=y,this.additionalParams=u,s||(this.additionalParams={...u,client_id:i})}callbacks=[];refreshTokenCallbacks=[];isRefreshingToken=!1;trySignIn(e,t){return this.acquireToken(this.buildSignInRequest(e,t))}trySignInWithFacebook(e){return this.acquireToken(this.buildSignInWithFacebookRequest(e))}trySignInWithOneTimeToken(e){return this.acquireToken(this.buildSignInWithOneTimeTokenRequest(e))}trySignInWithGoogle(e){return this.acquireToken(this.buildSignInWithGoogleRequest(e))}trySignInWithLinkedIn(e){return this.acquireToken(this.buildSignInWithLinkedInRequest(e))}trySignInWithApple(e){return this.acquireToken(this.buildSignInWithAppleRequest(e))}async tryRefreshToken(){const e=await this.storage.getToken();return e!==null?await this.tryRefreshTokenInternal(e):null}async tryRefreshTokenInternal(e){return typeof navigator<"u"&&"locks"in navigator?await this.tryRefreshWithLock(
|
|
1
|
+
(function(n,r){typeof exports=="object"&&typeof module<"u"?r(exports):typeof define=="function"&&define.amd?define(["exports"],r):(n=typeof globalThis<"u"?globalThis:n||self,r(n["@leancodepl/login-manager"]={}))})(this,(function(n){"use strict";const r="token_refresh_lock";class h{constructor(e,t,s,i,y,u){this.storage=e,this.endpoint=t,this.clientSecret=s,this.clientId=i,this.scopes=y,this.additionalParams=u,s||(this.additionalParams={...u,client_id:i})}callbacks=[];refreshTokenCallbacks=[];isRefreshingToken=!1;trySignIn(e,t){return this.acquireToken(this.buildSignInRequest(e,t))}trySignInWithFacebook(e){return this.acquireToken(this.buildSignInWithFacebookRequest(e))}trySignInWithOneTimeToken(e){return this.acquireToken(this.buildSignInWithOneTimeTokenRequest(e))}trySignInWithGoogle(e){return this.acquireToken(this.buildSignInWithGoogleRequest(e))}trySignInWithLinkedIn(e){return this.acquireToken(this.buildSignInWithLinkedInRequest(e))}trySignInWithApple(e){return this.acquireToken(this.buildSignInWithAppleRequest(e))}async tryRefreshToken(){const e=await this.storage.getToken();return e!==null?await this.tryRefreshTokenInternal(e):null}async tryRefreshTokenInternal(e){return typeof navigator<"u"&&"locks"in navigator?await this.tryRefreshWithLock():(this.isRefreshingToken||(this.isRefreshingToken=!0,(async()=>{try{const s=await this.refreshToken(e);this.refreshTokenCallbacks.forEach(i=>i(s))}catch{this.refreshTokenCallbacks.forEach(s=>s(!1))}finally{this.isRefreshingToken=!1,this.refreshTokenCallbacks=[]}})()),new Promise(t=>{this.refreshTokenCallbacks.push(t)}))}async tryRefreshWithLock(){const e=await navigator.locks.request(r,{ifAvailable:!0},async t=>{if(!t)return null;const s=await this.storage.getToken();if(s===null)return!1;try{return await this.refreshToken(s)}catch{return!1}});return e!==null?e:await this.waitForRefreshLockRelease()}async waitForRefreshLockRelease(){return await navigator.locks.request(r,{mode:"shared"},async()=>await this.storage.getToken()!==null)}async refreshToken(e){return(await this.acquireToken(this.buildRefreshRequest(e))).type==="success"}onChange(e){this.callbacks.push(e)}removeOnChange(e){const t=this.callbacks.indexOf(e);t!==-1&&this.callbacks.splice(t,1)}async acquireToken(e){try{const t=await fetch(this.endpoint+"/connect/token",e);if(!t.ok)return t.status===400&&await this.signOut(),{type:"failure"};const s=await t.json(),i=new Date;return i.setSeconds(new Date().getSeconds()+s.expires_in),await this.storage.storeToken({token:s.access_token,refreshToken:s.refresh_token,expirationDate:i}),this.notify(!0),{type:"success"}}catch(t){return console.warn("Cannot call Auth server, error: ",t),{type:"networkError"}}}buildSignInRequest(e,t){const s={grant_type:"password",scope:this.scopes,username:e,password:t,...this.additionalParams};return{method:"POST",headers:this.prepareHeaders(),body:new URLSearchParams(s)}}buildSignInWithOneTimeTokenRequest(e){const t={grant_type:"onetime",scope:this.scopes,token:e,...this.additionalParams};return{method:"POST",headers:this.prepareHeaders(),body:new URLSearchParams(t)}}buildAssertionSignInRequest(e,t){const s={grant_type:t,scope:this.scopes,assertion:e,...this.additionalParams};return{method:"POST",headers:this.prepareHeaders(),body:new URLSearchParams(s)}}buildSignInWithFacebookRequest(e){return this.buildAssertionSignInRequest(e,"facebook")}buildSignInWithGoogleRequest(e){return this.buildAssertionSignInRequest(e,"google")}buildSignInWithLinkedInRequest(e){return this.buildAssertionSignInRequest(e,"linkedin")}buildSignInWithAppleRequest(e){return this.buildAssertionSignInRequest(e,"apple")}buildRefreshRequest(e){const t={grant_type:"refresh_token",scope:this.scopes,refresh_token:e.refreshToken||"",...this.additionalParams};return{method:"POST",headers:this.prepareHeaders(),body:new URLSearchParams(t)}}prepareHeaders(){const e=new Headers;if(this.clientSecret){const t=btoa(`${this.clientId}:${this.clientSecret}`);e.append("Authorization","Basic "+t)}return e.append("Content-Type","application/x-www-form-urlencoded"),e}notify(e){for(const t of this.callbacks)t(e)}}class a extends Error{constructor(e){super(e),this.name="CannotRefreshTokenError",Object.setPrototypeOf(this,a.prototype)}}class l extends h{async signOut(){await this.storage.resetToken(),this.notify(!1)}async isSigned(){return await this.storage.getToken()!==null}async getToken(){const e=await this.storage.getToken();if(e===null)return null;if(e.expirationDate<new Date){if(await this.tryRefreshTokenInternal(e))return(await this.storage.getToken())?.token??null;throw new a("Cannot refresh access token after it has expired")}else return e.token}async load(){const e=await this.isSigned();this.notify(e)}}class c{constructor(e,t){this.facebookAppId=e,this.facebookPermissions=t,this.isSignedIn=void 0,this.token=""}isSignedIn;token;get accessToken(){return this.token}setup(e){const t=document.getElementsByTagName("script")[0],s="facebook-jssdk";if(document.getElementById(s)){this.initializeSDK(),this.getLoginStatus(e);return}const i=document.createElement("script");i.id=s,i.async=!0,i.src="//connect.facebook.net/pl_PL/sdk.js",t.parentNode!=null&&t.parentNode.insertBefore(i,t),i.onload=()=>{this.initializeSDK(),this.getLoginStatus(e)}}login(e){FB.login(t=>{t.status==="connected"?(this.isSignedIn=!0,this.token=t.authResponse.accessToken,e&&e(t.authResponse.accessToken)):this.isSignedIn=!1},{scope:this.facebookPermissions})}getLoginStatus(e){FB.getLoginStatus(t=>{t.status==="connected"?(this.isSignedIn=!0,this.token=t.authResponse.accessToken,e&&e(t.authResponse.accessToken)):this.isSignedIn=!1})}initializeSDK(){FB.init({appId:this.facebookAppId,xfbml:!0,version:"v2.9"})}}class k{constructor(e="token",t="refresh_token",s="expiration_date"){this.tokenKey=e,this.refreshKey=t,this.expiryKey=s}getToken(){return this.hasValue(this.tokenKey)?{token:this.getValue(this.tokenKey),refreshToken:this.getValue(this.refreshKey),expirationDate:new Date(Number(this.getValue(this.expiryKey)))}:null}storeToken(e){this.setValue(this.tokenKey,e.token),this.setValue(this.refreshKey,e.refreshToken),this.setValue(this.expiryKey,e.expirationDate.getTime().toString())}resetToken(){this.remove(this.tokenKey),this.remove(this.refreshKey),this.remove(this.expiryKey)}hasValue(e){return localStorage.getItem(e)!==null}getValue(e){return localStorage.getItem(e)}setValue(e,t){localStorage.setItem(e,t)}remove(e){localStorage.removeItem(e)}}class g{token=null;getToken(){return this.token}storeToken(e){return this.token={token:e.token,refreshToken:e.refreshToken,expirationDate:e.expirationDate},Promise.resolve()}resetToken(){return this.token=null,Promise.resolve()}}class f{constructor(e="token",t="refresh_token",s="expiration_date"){this.tokenKey=e,this.refreshKey=t,this.expiryKey=s}getToken(){return this.hasValue(this.tokenKey)?{token:this.getValue(this.tokenKey),refreshToken:this.getValue(this.refreshKey),expirationDate:new Date(Number(this.getValue(this.expiryKey)))}:null}storeToken(e){this.setValue(this.tokenKey,e.token),this.setValue(this.refreshKey,e.refreshToken),this.setValue(this.expiryKey,e.expirationDate.getTime().toString())}resetToken(){this.remove(this.tokenKey),this.remove(this.refreshKey),this.remove(this.expiryKey)}hasValue(e){return sessionStorage.getItem(e)!==null}getValue(e){return sessionStorage.getItem(e)}setValue(e,t){sessionStorage.setItem(e,t)}remove(e){sessionStorage.removeItem(e)}}class d extends h{signOut(){this.storage.resetToken(),this.notify(!1)}isSigned(){return this.storage.getToken()!==null}async getToken(){const e=this.storage.getToken();if(e===null)return null;if(e.expirationDate<new Date){if(await this.tryRefreshTokenInternal(e))return this.storage.getToken()?.token??null;throw new a("Cannot refresh access token after it has expired")}else return e.token}}n.AsyncLoginManager=l,n.BaseLoginManager=h,n.CannotRefreshTokenError=a,n.FacebookClient=c,n.LocalTokenStorage=k,n.MemoryTokenStorage=g,n.SessionTokenStorage=f,n.SyncLoginManager=d,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})}));
|
|
@@ -34,7 +34,8 @@ export declare abstract class BaseLoginManager<TStorage extends TokenStorage> {
|
|
|
34
34
|
tryRefreshToken(): Promise<boolean | null>;
|
|
35
35
|
protected tryRefreshTokenInternal(token: Token): Promise<boolean>;
|
|
36
36
|
private tryRefreshWithLock;
|
|
37
|
-
private
|
|
37
|
+
private waitForRefreshLockRelease;
|
|
38
|
+
private refreshToken;
|
|
38
39
|
onChange(callback: (isSignedIn: boolean) => void): void;
|
|
39
40
|
removeOnChange(callback: (isSignedIn: boolean) => void): void;
|
|
40
41
|
acquireToken(init: RequestInit): Promise<LoginResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseLoginManager.d.ts","sourceRoot":"","sources":["../../src/lib/baseLoginManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEvE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAC9B;AAED,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,iBAAiB,GAAG,YAAY,CAAA;AAGzE,MAAM,WAAW,YAAa,SAAQ,gBAAgB,CAAC,YAAY,CAAC;CAAG;AAIvE,8BAAsB,gBAAgB,CAAC,QAAQ,SAAS,YAAY;IAOhE,SAAS,CAAC,OAAO,EAAE,QAAQ;IAC3B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;IAChB,SAAS,CAAC,MAAM,EAAE,MAAM;IACxB,SAAS,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAXrD,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,qBAAqB,CAAqC;IAClE,OAAO,CAAC,iBAAiB,CAAQ;gBAIrB,OAAO,EAAE,QAAQ,EACnB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA;aAUrC,OAAO,IAAI,QAAQ,SAAS,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;aAEpE,QAAQ,IAAI,QAAQ,SAAS,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO;aAE3E,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAE3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAInE,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhE,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI9D,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI9D,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhE,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIvD,eAAe;cASZ,uBAAuB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;YA4BzD,kBAAkB;
|
|
1
|
+
{"version":3,"file":"baseLoginManager.d.ts","sourceRoot":"","sources":["../../src/lib/baseLoginManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEvE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAC9B;AAED,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,iBAAiB,GAAG,YAAY,CAAA;AAGzE,MAAM,WAAW,YAAa,SAAQ,gBAAgB,CAAC,YAAY,CAAC;CAAG;AAIvE,8BAAsB,gBAAgB,CAAC,QAAQ,SAAS,YAAY;IAOhE,SAAS,CAAC,OAAO,EAAE,QAAQ;IAC3B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;IAChB,SAAS,CAAC,MAAM,EAAE,MAAM;IACxB,SAAS,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAXrD,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,qBAAqB,CAAqC;IAClE,OAAO,CAAC,iBAAiB,CAAQ;gBAIrB,OAAO,EAAE,QAAQ,EACnB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA;aAUrC,OAAO,IAAI,QAAQ,SAAS,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;aAEpE,QAAQ,IAAI,QAAQ,SAAS,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO;aAE3E,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAE3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAInE,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhE,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI9D,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI9D,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhE,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIvD,eAAe;cASZ,uBAAuB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;YA4BzD,kBAAkB;YA0BlB,yBAAyB;YAOzB,YAAY;IAKnB,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI;IAIhD,cAAc,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI;IAOhD,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA6B3D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAgB1E,OAAO,CAAC,kCAAkC;IAenC,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW;IAevF,OAAO,CAAC,8BAA8B;IAItC,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,8BAA8B;IAItC,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,mBAAmB;IAe3B,SAAS,CAAC,cAAc;IAWxB,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO;CAKrC"}
|