@sambath999/localize-token 19.0.7 → 19.0.8
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sambath999-localize-token.mjs","sources":["../../../../../../localize.token.18.0.0/dev/src/localize-token/localize.token.storage.ts","../../../../../../localize.token.18.0.0/dev/src/localize-token/localize.token.ts","../../../../../../localize.token.18.0.0/dev/src/localize-token/localize.token.service.ts","../../../../../../localize.token.18.0.0/dev/src/localize-logindlg/localize-logindlg.component.ts","../../../../../../localize.token.18.0.0/dev/src/localize-logindlg/localize-logindlg.service.ts","../../../../../../localize.token.18.0.0/dev/src/localize-logindlg/localize-logindlg.module.ts","../../../../../../localize.token.18.0.0/dev/src/localize-token/helpers/localize.api.assets.ts","../../../../../../localize.token.18.0.0/dev/src/localize-token/helpers/interfaces.ts","../../../../../../localize.token.18.0.0/dev/src/localize-token/helpers/loccalize.api.helper.ts","../../../../../../localize.token.18.0.0/dev/src/localize-token/localize.api.service.ts","../../../../../../localize.token.18.0.0/dev/src/localize-token/localize.token.module.ts","../../../../../../localize.token.18.0.0/dev/src/localize-api-token/localize-api-token.service.ts","../../../../../../localize.token.18.0.0/dev/src/localize-api-token/localize-api-token.module.ts","../../../../../../localize.token.18.0.0/dev/src/public-api.ts","../../../../../../localize.token.18.0.0/dev/src/sambath999-localize-token.ts"],"sourcesContent":["import { extractMainDomain } from \"./localize.token\";\r\n\r\nexport interface ICookieOptions {\r\n /**\r\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\r\n */\r\n expires?: number | Date;\r\n path?: string;\r\n domain?: string;\r\n secure?: boolean;\r\n samesite?: \"strict\" | \"lax\" | \"none\";\r\n}\r\n\r\n/**\r\n* Assembly of @package ng2-cookies @see https://www.npmjs.com/package/ng2-cookies\r\n*\r\n* Reassembled by\r\n* @author sambath999\r\n* @date_29_09_2021\r\n* Updated from raw parameters to\r\n* @param {ICookieOptions} options and added another newer cookie flag\r\n* @param {string} samesite\r\n* @param {constant} SameSiteTypes, @param {string} strict \"strict\", @param {string} lax \"lax\", @param {string} none \"none\"\r\n*\r\n* @enum\r\n*/\r\nexport class LocalizeTokenStorage {\r\n\r\n private get getDefaultOptions(): ICookieOptions {\r\n const mainDomain = extractMainDomain(window.location.hostname);\r\n return {\r\n path: '/',\r\n domain: mainDomain,\r\n secure: true,\r\n // samesite: SameSiteType.strict,\r\n expires: 1\r\n }\r\n }\r\n\r\n private readonly defaultOptions: ICookieOptions;\r\n constructor(_defaultOptions?: ICookieOptions) {\r\n this.defaultOptions = _defaultOptions ?? this.getDefaultOptions;\r\n }\r\n\r\n /**\r\n * Checks the existence of a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the cookie\r\n * @returns existence of the cookie\r\n */\r\n check(name: string): boolean {\r\n if (typeof document === \"undefined\") return false;\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n return regexp.test(document.cookie);\r\n }\r\n\r\n /**\r\n * Retrieves a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the Cookie\r\n * @returns The Cookie's value\r\n */\r\n get(name: string): string | undefined {\r\n if (!this.check(name)) return undefined;\r\n\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n const result = regexp.exec(document.cookie);\r\n return result ? decodeURIComponent(result[1]) : undefined;\r\n }\r\n\r\n /**\r\n * Retrieves a a list of all cookie avaiable\r\n *\r\n * @returns Object with all Cookies\r\n */\r\n getAll(): any {\r\n const cookies: any = {};\r\n if (document.cookie) {\r\n const split = document.cookie.split(';');\r\n for (const s of split) {\r\n const currCookie = s.split('=');\r\n currCookie[0] = currCookie[0].trim();\r\n cookies[decodeURIComponent(currCookie[0])] = decodeURIComponent(currCookie[1]);\r\n }\r\n }\r\n\r\n return cookies;\r\n }\r\n\r\n set(name: string, value: string, options?: ICookieOptions) {\r\n options ??= this.defaultOptions;\r\n const { expires, path, domain, secure, samesite } = { ...this.defaultOptions, ...options };\r\n let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)};`;\r\n\r\n if (expires) {\r\n const dtExpires = typeof expires === 'number' ? new Date(Date.now() + expires * 864e5) : expires;\r\n cookieStr += `expires=${dtExpires.toUTCString()};`;\r\n }\r\n\r\n cookieStr += path ? `path=${path};` : '';\r\n cookieStr += domain ? `domain=${domain};` : '';\r\n cookieStr += secure ? 'secure;' : '';\r\n cookieStr += samesite ? `samesite=${samesite};` : '';\r\n\r\n document.cookie = cookieStr;\r\n }\r\n\r\n /**\r\n * Removes specified Cookie\r\n *\r\n * @param {string} name Cookie's identification\r\n * @param {string} path Path relative to the domain where the cookie should be avaiable. Default /\r\n * @param {string} domain Domain where the cookie should be avaiable. Default current domain\r\n */\r\n delete(name: string, path: string = '/', domain: string = window.location.hostname): void {\r\n this.set(name, '', { path, domain, expires: -1 });\r\n }\r\n\r\n /**\r\n * Delete all cookie avaiable\r\n */\r\n deleteAll(path?: string, domain?: string): void {\r\n const cookies = this.getAll();\r\n\r\n for (const cookieName of Object.keys(cookies)) {\r\n this.delete(cookieName, path, domain);\r\n }\r\n }\r\n\r\n}\r\n","import { LocalizeTokenStorage } from \"./localize.token.storage\";\r\n\r\ninterface ILocalizeTokenTokens {\r\n name: string;\r\n requestUrl?: string;\r\n}\r\n\r\nexport interface ILocalizeTokenConfig {\r\n /**\r\n * The main domain of the application to set the cookies to be available for cross application with subdomains.\r\n * \r\n * Default is location.hostname (current domain) and automatically set extracted main domain if it is subdomain.\r\n */\r\n mainDomain?: string;\r\n\r\n isProduction: boolean;\r\n authToken?: ILocalizeTokenTokens;\r\n refreshToken?: ILocalizeTokenTokens;\r\n tenantToken?: ILocalizeTokenTokens;\r\n requiredTenant?: boolean;\r\n}\r\n\r\nexport class LocalizeToken {\r\n\r\n static readonly storage = new LocalizeTokenStorage();\r\n\r\n static readonly httpHeaders = {\r\n AUTHORIZATION: 'Authorization',\r\n X_TENANT: 'X-Tenant',\r\n X_REFRESH_TOKEN: 'X-RefreshToken',\r\n CONTENT_TYPE: 'Content-Type',\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Waits for a specified amount of time.\r\n * @param milliseconds - The milliseconds to wait.\r\n * @param when - The condition to wait for. Default is true.\r\n * @returns - Promise<void>\r\n */\r\nexport async function waitFor(milliseconds: number, when: boolean = true) {\r\n if (!when) return;\r\n await new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n/**\r\n * Waits until the condition is met.\r\n * @param when - The condition to wait for.\r\n * @param intervalNumber - The interval number in milliseconds to check the condition. Default is 50.\r\n */\r\nexport async function waitUntil(when: () => any, intervalNumber: number = 50) {\r\n\r\n async function isConditionMet() {\r\n const cond = when();\r\n const result = cond instanceof Promise\r\n ? await cond\r\n : cond;\r\n return result;\r\n }\r\n\r\n if (await isConditionMet()) return;\r\n\r\n await new Promise(resolve => {\r\n const interval = setInterval(async () => {\r\n if (await isConditionMet()) {\r\n clearInterval(interval);\r\n resolve(true);\r\n }\r\n }, intervalNumber);\r\n });\r\n}\r\n\r\nexport function extractMainDomain(subdomain?: string): string {\r\n subdomain ??= window.location.hostname;\r\n const parts = subdomain.split('.');\r\n return parts.length > 2 ? parts.slice(-2).join('.') : subdomain;\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { extractMainDomain, ILocalizeTokenConfig, LocalizeToken } from './localize.token';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport * as jwt_decode from 'jwt-decode';\r\nexport interface JwtPayload extends jwt_decode.JwtPayload {\r\n // Define the structure of your JWT payload here\r\n email: string;\r\n sub: string;\r\n name: string;\r\n iat: number;\r\n exp: number;\r\n // Add other fields as needed\r\n}\r\n\r\ninterface IAuthToken {\r\n token: string;\r\n revoke: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class LocalizeTokenService implements OnDestroy {\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeTokenConfig>>({});\r\n readonly isRevokingTokenSubject = new BehaviorSubject<boolean>(false);\r\n private readonly defaultConfig: Partial<ILocalizeTokenConfig> = {\r\n mainDomain: extractMainDomain(),\r\n authToken: {\r\n name: 'auth-token',\r\n },\r\n refreshToken: {\r\n name: 'refresh-token',\r\n requestUrl: '/api/token/revoke'\r\n },\r\n }\r\n\r\n get config(): ILocalizeTokenConfig {\r\n this.throwIfNotInitialized();\r\n return this.configSubject.value as ILocalizeTokenConfig;\r\n }\r\n\r\n private isInitialized = false;\r\n\r\n init(config: ILocalizeTokenConfig) {\r\n console.log('LocalizeTokenService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n this.isInitialized = true;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // this.configSubject.complete();\r\n // this.isRevokingTokenSubject.complete();\r\n }\r\n\r\n private get authToken() { return this.storageGet() }\r\n private set authToken(value: IAuthToken | undefined) {\r\n value\r\n ? this.storageSet(value)\r\n : LocalizeToken.storage.delete(this.config.authToken?.name!);\r\n }\r\n\r\n get tenantToken() { return LocalizeToken.storage.get(this.config.tenantToken?.name || '') }\r\n\r\n get refreshToken() { return LocalizeToken.storage.get(this.config.refreshToken?.name || '') }\r\n get accessToken() { return this.authToken?.token }\r\n\r\n set accessToken(value: string | undefined) {\r\n value && (this.authToken = { token: value, revoke: false })\r\n }\r\n\r\n get isRevokingToken() { return this.isRevokingTokenSubject.value /* this.authToken?.revoke ?? false */ }\r\n\r\n set isRevokingToken(value: boolean) {\r\n this.isRevokingTokenSubject.next(value);\r\n this.authToken && (this.authToken = { ...this.authToken, revoke: value })\r\n }\r\n\r\n private storageGet() {\r\n try {\r\n const encoded = LocalizeToken.storage.get(this.config.authToken?.name || '');\r\n const decoded = atob(encoded || '');\r\n return JSON.parse(decoded) as IAuthToken;\r\n } catch {\r\n return undefined\r\n }\r\n }\r\n\r\n private storageSet(value: IAuthToken) {\r\n const base64 = btoa(JSON.stringify(value));\r\n LocalizeToken.storage.set(this.config.authToken?.name || '', base64);\r\n }\r\n\r\n tokensValid(): boolean | undefined {\r\n if (!this.refreshToken?.length) return false;\r\n if (this.config.requiredTenant && !this.tenantToken?.length) return false;\r\n return true;\r\n }\r\n\r\n decodeToken = (token: string) => jwt_decode.jwtDecode<JwtPayload>(token);\r\n get decodeRefreshToken() {\r\n const token = this.refreshToken;\r\n return !token ? null : this.decodeToken(token);\r\n }\r\n\r\n private throwIfNotInitialized() {\r\n if (!this.isInitialized) {\r\n throw new Error('LocalizeTokenService is not initialized. Call init() method before using it.');\r\n }\r\n }\r\n\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport { MessageService } from \"primeng/api\";\r\nimport { DynamicDialogConfig, DynamicDialogRef } from \"primeng/dynamicdialog\";\r\nimport { JwtPayload, LocalizeTokenService } from \"../localize-token/localize.token.service\";\r\nimport { LocalizeToken } from \"../localize-token/localize.token\";\r\nimport { ILoginDialogConfig, ILoginDialogProperties } from \"./localize-logindlg.service\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\n\r\n@Component({\r\n standalone: false,\r\n styles: [`\r\n #login-dlg-wrap {\r\n width: 100%;\r\n max-width: 400px;\r\n margin: 0 auto;\r\n padding: 30px;\r\n height: 100%;\r\n }\r\n \r\n .login-dlg-elm {\r\n margin-top: 1rem;\r\n }\r\n\r\n .login-dlg-elm.login-dlg-suggest {\r\n display: flex ;\r\n align-items: center;\r\n user-select: none;\r\n border-bottom: solid 1px #ddd;\r\n border-radius: 5px;\r\n padding: 5px 10px;\r\n background: #f9f9f9;\r\n box-shadow: 1px 5px 10px -12px #000;\r\n }\r\n \r\n #login-dlg-header {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n \r\n #login-dlg-header h3 {\r\n font-weight: bold;\r\n font-size: 0.9rem;\r\n color: orange;\r\n text-align: center;\r\n }\r\n \r\n #login-logo {\r\n height: 55px;\r\n width: 55px;\r\n /* background: url(\"/assets/images/logo-300px.png\") no-repeat; */\r\n background-size: contain !important;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup {\r\n height: 45px;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon {\r\n height: 45px;\r\n border-radius: 15px 0 0 15px;\r\n width: 50px;\r\n }\r\n #login-dlg-content *{\r\n font-size: .9rem;\r\n /* font-family: 'Lexend', 'Roboto', sans-serif, 'material-icons-round'; */\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon * {\r\n font-size: 1rem;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup input {\r\n height: 45px;\r\n border-radius: 0 15px 15px 0;\r\n }\r\n \r\n #login-dlg-content button {\r\n height: 45px;\r\n border-radius: 15px;\r\n }\r\n \r\n /*check animation block*/\r\n \r\n .check-animation-wrap {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: calc(100% - 200px);\r\n min-height: 400px;\r\n }\r\n \r\n .check-main-container {\r\n width: 100%;\r\n height: 100vh;\r\n display: flex;\r\n flex-flow: column;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n \r\n .check-container {\r\n width: 6.25rem;\r\n height: 7.5rem;\r\n display: flex;\r\n flex-flow: column;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n \r\n .check-container .check-background {\r\n width: 100%;\r\n height: calc(100% - 1.25rem);\r\n background: linear-gradient(to bottom right, #5de593, #41d67c);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n transform: scale(0.84);\r\n border-radius: 50%;\r\n animation: animateContainer 0.75s ease-out forwards 0.75s;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n }\r\n \r\n .check-container .check-background svg {\r\n width: 65%;\r\n transform: translateY(0.25rem);\r\n stroke-dasharray: 80;\r\n stroke-dashoffset: 80;\r\n animation: animateCheck 0.35s forwards 1.25s ease-out;\r\n min-width: auto !important;\r\n }\r\n \r\n .check-container .check-shadow {\r\n bottom: calc(-15% - 5px);\r\n left: 0;\r\n border-radius: 50%;\r\n background: radial-gradient(closest-side, rgba(73, 218, 131, 1), transparent);\r\n animation: animateShadow 0.75s ease-out forwards 0.75s;\r\n }\r\n \r\n @keyframes animateContainer {\r\n 0% {\r\n opacity: 0;\r\n transform: scale(0);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 25% {\r\n opacity: 1;\r\n transform: scale(0.9);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 43.75% {\r\n transform: scale(1.15);\r\n box-shadow: 0px 0px 0px 43.334px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 62.5% {\r\n transform: scale(1);\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 21.667px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 81.25% {\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 100% {\r\n opacity: 1;\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n }\r\n \r\n @keyframes animateCheck {\r\n from {\r\n stroke-dashoffset: 80;\r\n }\r\n \r\n to {\r\n stroke-dashoffset: 0;\r\n }\r\n }\r\n \r\n @keyframes animateShadow {\r\n 0% {\r\n opacity: 0;\r\n width: 100%;\r\n height: 15%;\r\n }\r\n \r\n 25% {\r\n opacity: 0.25;\r\n }\r\n \r\n 43.75% {\r\n width: 40%;\r\n height: 7%;\r\n opacity: 0.35;\r\n }\r\n \r\n 100% {\r\n width: 85%;\r\n height: 15%;\r\n opacity: 0.25;\r\n }\r\n }\r\n #login-dlg-wrap .loader-wrap {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height:100%;\r\n width:100%;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 100;\r\n background: #ffffff42;\r\n backdrop-filter: blur(1px);\r\n }\r\n\r\n #login-dlg-wrap .login-dlg-loader {\r\n border: 15px solid #e7e7e7;\r\n border-top: 15px solid #52dba1;\r\n border-radius: 50%;\r\n width: 100px;\r\n height: 100px;\r\n animation: spinloader 2s linear infinite;\r\n }\r\n\r\n #login-dlg-wrap .loader-wrap::before {\r\n content: \"\";\r\n position: absolute;\r\n width: 70px;\r\n height: 70px;\r\n transform: translate(-50%, -50%);\r\n z-index: 1;\r\n border: 15px solid #e7e7e700;\r\n border-top: 15px solid #52dba1c9;\r\n border-radius: 50%;\r\n animation: spinloader .75s linear infinite;\r\n }\r\n\r\n @keyframes spinloader {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n template: `<p-toast key=\"$login-dlg\" position=\"top-center\"></p-toast>\r\n <div id=\"login-dlg-wrap\">\r\n <div id=\"login-dlg-header\">\r\n <div id=\"login-logo\" class=\"p-mb-2\" style=\"background: url('{{properties.logoImage}}') no-repeat\"></div>\r\n <h3 *ngIf=\"!success\" [innerHTML]=\"sanitizedTitle\"></h3>\r\n <h3 *ngIf=\"success\" style=\"color:green !important;\">{{properties.loginSuccessMessage}}</h3>\r\n </div>\r\n <div id=\"login-dlg-content\">\r\n <ng-container *ngIf=\"!success\">\r\n <div *ngIf=\"loading\" class=\"loader-wrap\">\r\n <div class=\"login-dlg-loader\"></div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <div class=\"p-inputgroup\">\r\n <span class=\"p-inputgroup-addon\">\r\n <i class=\"material-icons-round\">person</i>\r\n </span>\r\n <input disabled pInputText type=\"text\" placeholder=\"{{properties.username?.placeHolder}}\" [value]=\"decodeToken?.email\" />\r\n </div>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm\">\r\n <div class=\"p-inputgroup\">\r\n <span class=\"p-inputgroup-addon\">\r\n <i class=\"material-icons-round\">lock</i>\r\n </span>\r\n <input [disabled]=\"loading\" (keydown.enter)=\"clickLogin()\" pInputText type=\"password\" \r\n placeholder=\"{{properties.password?.placeHolder}}\" [(ngModel)]=\"password\"\r\n autofocus />\r\n </div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <button style=\"width: 100%;\" pButton type=\"button\" label=\"{{properties.loginButton?.placeHolder}}\" (click)=\"clickLogin()\"\r\n [disabled]=\"!password || loading\"></button>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm login-dlg-suggest\" style=\"display:flex;align-items: center;user-select: none;\">\r\n <span>{{properties.logoutButton?.message}}</span>\r\n <button class=\"p-button-text\" pButton type=\"button\" label=\"{{properties.logoutButton?.placeHolder}}\" \r\n (click)=\"clickLogout()\"></button>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"success\">\r\n <div style=\"margin-top:35px;\"></div>\r\n <div class=\"check-animation-wrap\">\r\n <div class=\"check-main-container\">\r\n <div class=\"check-container\">\r\n <div class=\"check-background\">\r\n <svg viewBox=\"0 0 65 51\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 25L27.3077 44L58.5 7\" stroke=\"white\" stroke-width=\"13\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>`,\r\n selector: \"app-localize-logindlg\",\r\n providers: [MessageService],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class LocalizeLogindlgComponent implements OnInit {\r\n readonly messageKey = \"$login-dlg\";\r\n password: any;\r\n readonly decodeToken: JwtPayload | null;\r\n loading = false;\r\n success = false;\r\n private get config() { return this.tokenService.config; }\r\n private readonly loginConfig: ILoginDialogConfig\r\n\r\n private logout?: () => any\r\n private loginUrl?: string;\r\n readonly properties: ILoginDialogProperties;\r\n\r\n\r\n constructor(\r\n private readonly messageService: MessageService,\r\n private readonly cdt: ChangeDetectorRef,\r\n private readonly dlgRef: DynamicDialogRef,\r\n private readonly dlgConfig: DynamicDialogConfig,\r\n private readonly tokenService: LocalizeTokenService,\r\n private readonly httpClient: HttpClient,\r\n private readonly sanitizer: DomSanitizer\r\n ) {\r\n this.decodeToken = this.tokenService.decodeRefreshToken;\r\n this.loginConfig = this.dlgConfig.data.loginConfig;\r\n this.properties = this.loginConfig.properties!;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.dlgConfig.closable = false;\r\n this.logout = this.loginConfig.logoutFunc;\r\n this.loginUrl = this.loginConfig.loginUrl\r\n\r\n if (!this.decodeToken) {\r\n this.showMessage(\"error\", \"Token is invalid\");\r\n setTimeout(() => this.logout?.(), 2000);\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.cdt.detectChanges();\r\n }\r\n\r\n async clickLogin() {\r\n if (!this.isValidPassword) {\r\n return this.showMessage(\"error\", \"Password is required and must be at least 6 characters\");\r\n }\r\n\r\n this.loading = true;\r\n const loginRes = await this.login();\r\n if (!loginRes?.status) {\r\n return this.showMessage(\"error\", loginRes.message ?? \"An error occurred\");\r\n }\r\n\r\n this.tokenService.accessToken = loginRes.tokens.accessToken;\r\n const cookieOptions = { expires: this.loginConfig.expire ?? 365 }\r\n LocalizeToken.storage.set(this.config.refreshToken?.name || '', loginRes.tokens.refreshToken, cookieOptions);\r\n this.success = true;\r\n setTimeout(() => {\r\n this.dlgConfig.dismissableMask = true;\r\n this.dlgConfig.modal = false;\r\n this.dlgRef.close(true);\r\n }, 2000);\r\n }\r\n\r\n private async login() {\r\n if (!this.loginUrl?.trim().length) {\r\n this.showMessage(\"error\", \"Login url is required\");\r\n throw new Error(\"Login url is required\");\r\n }\r\n\r\n try {\r\n\r\n if (this.loginConfig.loginFunction) {\r\n console.log(\"Using custom login function\");\r\n return await this.loginConfig.loginFunction(this.decodeToken?.email ?? '', this.password.trim(), this.getHeaders());\r\n }\r\n\r\n return await new Promise<any>((resolve, reject) =>\r\n this.httpClient.post(this.loginUrl!,\r\n { password: this.password.trim() },\r\n { headers: this.getHeaders() }).subscribe({ next: resolve, error: reject }));\r\n\r\n } catch (e: any) {\r\n this.showMessage(\"error\", e.message);\r\n return null;\r\n }\r\n }\r\n\r\n private getHeaders() {\r\n return {\r\n [LocalizeToken.httpHeaders.X_REFRESH_TOKEN]: this.tokenService.refreshToken ?? \"\",\r\n [LocalizeToken.httpHeaders.X_TENANT]: this.tokenService.tenantToken ?? \"\",\r\n };\r\n }\r\n\r\n get isValidPassword(): boolean {\r\n this.loading = false;\r\n return this.properties.passwordValidator\r\n ? this.properties.passwordValidator(this.password)\r\n : this.password && this.password.trim().length >= 6 && this.password.trim().length <= 50;\r\n }\r\n\r\n clickLogout = () => this.logout?.();\r\n\r\n private showMessage(severity: string, summary: string) {\r\n this.messageService.add({ key: this.messageKey, severity, summary });\r\n this.loading = false;\r\n }\r\n\r\n get sanitizedTitle() {\r\n return this.sanitizer.bypassSecurityTrustHtml(this.properties.title ?? '');\r\n }\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\nimport { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog';\nimport { LocalizeLogindlgComponent } from './localize-logindlg.component';\nexport interface ILoginDialogPlaceHolder {\n /**\n * Message to display in the input field, typically used for error messages or hints.\n * This is optional and can be used to provide additional context or instructions to the user.\n */\n message?: string;\n /**\n * Placeholder or label text for the input field\n */\n placeHolder?: string;\n}\n\nexport interface ILoginDialogProperties {\n /**\n * Title of the login dialog\n */\n title?: string;\n loginSuccessMessage?: string;\n /**\n * Logog image path or URL to display in the login dialog\n * If not provided, the \"/assets/images/logo-300px.png\" image will be used.\n */\n logoImage?: string;\n username?: ILoginDialogPlaceHolder;\n password?: ILoginDialogPlaceHolder;\n loginButton?: ILoginDialogPlaceHolder;\n logoutButton?: ILoginDialogPlaceHolder;\n /**\n * Function to validate the password.\n * If not provided, the default validation checks if the password is between 6 and 50 characters long.\n * @param password\n * @returns\n */\n passwordValidator?: (password: string) => boolean;\n}\n\nexport interface ILoginDialogConfig {\n loginUrl?: string;\n logoutUrl?: string;\n loginFunction?: (username: string, password: string, headers?: { [key: string]: string }) => Promise<any>;\n logoutFunc?: () => void;\n /**\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\n */\n expire?: number;\n /**\n * Configuration for the login dialog.\n * This interface defines the properties that can be used to customize the login dialog's behavior and appearance\n */\n properties?: ILoginDialogProperties;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeLogindlgService {\n\n constructor(private readonly injector: Injector) { }\n\n async openLoginDialog(loginConfig: ILoginDialogConfig, config?: DynamicDialogConfig) {\n\n config = this.intercepDialogConfig(config);\n this.initConfig(loginConfig);\n\n config.data = { ...(config.data || {}), ...{ loginConfig } };\n\n const dialogService = this.injector.get(DialogService);\n const dialog = dialogService.open(LocalizeLogindlgComponent, config);\n\n await new Promise<void>((resolve) =>\n dialog.onClose.subscribe(res => {\n if (res) {\n resolve();\n }\n }));\n }\n\n private intercepDialogConfig(config?: DynamicDialogConfig) {\n config ??= {\n header: 'Login',\n style: { 'max-width': '400px', width: '100%', 'height': '650px' },\n modal: true,\n closable: false,\n showHeader: false,\n }\n\n config = {\n ...config, ...{\n contentStyle: { 'height': '100%', 'border-radius': '20px' }\n }\n }\n config.style = { ...config.style, ...{ 'border-radius': '20px' } };\n return config;\n }\n\n\n private initConfig(loginConfig: ILoginDialogConfig) {\n loginConfig ??= {}\n loginConfig.properties ??= {\n title: 'Your session is expired!<br/> Please login again to continue.',\n loginSuccessMessage: 'You have successfully logged in.',\n logoImage: '/assets/images/logo-300px.png',\n username: { placeHolder: 'Username' },\n password: { placeHolder: 'Password' },\n loginButton: { placeHolder: 'Login' },\n logoutButton: {\n message: 'No, I want to login with another user.',\n placeHolder: 'Logout'\n }\n }\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { LocalizeLogindlgComponent } from \"./localize-logindlg.component\";\nimport { InputTextModule } from \"primeng/inputtext\";\nimport { ButtonModule } from \"primeng/button\";\nimport { ToastModule } from 'primeng/toast';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { LocalizeLogindlgService } from \"./localize-logindlg.service\";\n\n@NgModule({\n declarations: [LocalizeLogindlgComponent],\n exports: [LocalizeLogindlgComponent],\n imports: [\n CommonModule,\n ToastModule,\n InputTextModule,\n BrowserModule,\n FormsModule,\n ButtonModule,\n ],\n providers: [LocalizeLogindlgService],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class LocalizeLogindlgModule { }\n","export const LOCALIZE_API_ASSETS = {\r\n network: {\r\n noConnection: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <svg id=\"lze-no-connection\" data-name=\"Layer 2\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 77.29 70.98\">\r\n <defs>\r\n <style> .cls-1 { fill: #fff; } .cls-2, .cls-3 { fill: #e30613; } .cls-3 { stroke: #e30613; stroke-miterlimit: 10; stroke-width: .25px; } </style>\r\n </defs>\r\n <g id=\"Layer_3\" data-name=\"Layer 3\">\r\n <g>\r\n <path class=\"cls-1\" d=\"m73.29,35c-1.2,0-2.33-.53-3.09-1.46-.48-.57-11.23-13.2-31.55-13.2s-31.11,12.66-31.56,13.2c-1.4,1.71-3.92,1.95-5.63.55-1.71-1.4-1.95-3.92-.55-5.63.54-.66,13.47-16.12,37.74-16.12s37.2,15.46,37.74,16.12c1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.61.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m63.96,45.66c-1.19,0-2.32-.53-3.08-1.44-5.79-6.05-13.86-9.39-22.24-9.21-8.38-.18-16.45,3.16-22.24,9.22-1.46,1.65-3.99,1.81-5.64.35-1.57-1.39-1.8-3.77-.52-5.43,7.32-7.89,17.64-12.29,28.4-12.12,10.76-.17,21.08,4.24,28.4,12.12,1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.6.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m53.3,56.32c-1.24,0-2.41-.57-3.16-1.55-5.73-6.35-15.52-6.85-21.87-1.13-.4.36-.77.73-1.13,1.13-1.36,1.73-3.88,2.03-5.61.67-1.71-1.34-2.03-3.8-.73-5.54,8.39-9.85,23.18-11.04,33.03-2.65.95.81,1.84,1.69,2.65,2.65,1.34,1.75,1,4.26-.75,5.6-.7.53-1.55.82-2.43.82Z\"/>\r\n </g>\r\n <path class=\"cls-2\" d=\"m47.21,9.45l-4.06,41.36c-.64,5.42-8.39,5.39-9.01,0,0,0-4.06-41.36-4.06-41.36-.46-4.73,2.99-8.94,7.72-9.4,5.33-.58,9.97,4.09,9.4,9.4h0Z\"/>\r\n <circle class=\"cls-3\" cx=\"38.64\" cy=\"64.79\" r=\"6.07\"/>\r\n </g>\r\n </svg>`\r\n }\r\n}","import { HttpErrorResponse } from \"@angular/common/http\";\r\n\r\n/**\r\n * Http method options\r\n */\r\nexport enum EMethod {\r\n POST = 'post',\r\n GET = 'get',\r\n PUT = 'put',\r\n DELETE = 'delete',\r\n PATCH = 'patch',\r\n}\r\n\r\nexport interface IOnConnectionError {\r\n /**\r\n * Callback function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n callback?: (error: HttpErrorResponse) => Promise<void> | any;\r\n /**\r\n * If true, the request will block the screen with overlay on connection errors.\r\n * Default is false.\r\n */\r\n blockScreen?: boolean;\r\n\r\n /** Optional z-index for the block screen overlay.\r\n * Default is 10000.\r\n */\r\n blockScreenZIndex?: number;\r\n\r\n /**\r\n * Optional message to display when a connection error occurs.\r\n */\r\n message?: string;\r\n suggestionMessage?: string;\r\n}\r\n\r\ninterface IRetryOptions {\r\n\r\n /**\r\n * Maximum number of retries for a failed request.\r\n * Default is 100.\r\n */\r\n maxRetries?: number;\r\n\r\n /**\r\n * Delay in milliseconds before retrying a failed request.\r\n * Default is 500ms.\r\n */\r\n delay?: number;\r\n\r\n /**\r\n * Function to determine if a request should be retried based on the error.\r\n * If not provided, the default function will retry for network errors and server errors (status 500-599).\r\n * @param error - The error object from the failed request.\r\n * @returns true if the request should be retried, false otherwise.\r\n */\r\n retryFunction?: (error: HttpErrorResponse) => Promise<boolean> | any;\r\n\r\n /**\r\n * Function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n onConnectionError?: IOnConnectionError;\r\n\r\n}\r\n\r\nexport interface ILocalizeApiConfigs {\r\n onPrepareRequest?: () => Promise<void> | any;\r\n onAutoLogout?: () => Promise<void> | any;\r\n onRevokeUnauthorized?: () => Promise<void> | any;\r\n\r\n waitEachRequest?: {\r\n milliseconds: number;\r\n };\r\n enableRequestCancellation?: boolean;\r\n\r\n /**\r\n * Config for retrying failed requests.\r\n * If not provided, the default retry options will be used.\r\n */\r\n retryOptions?: IRetryOptions;\r\n}\r\n\r\nexport interface IApiOptions {\r\n headers?: { [key: string]: string };\r\n method: EMethod;\r\n requestUrl: string;\r\n requestBody?: any;\r\n isFormData?: boolean;\r\n /**\r\n * If true, the request will use the refresh token for authorization.\r\n */\r\n refreshToken?: boolean;\r\n}\r\n\r\nexport interface IHeader {\r\n [key: string]: string;\r\n}\r\n\r\n// export interface INormalizedError {\r\n// error: any;\r\n// code: string;\r\n// message: string;\r\n// details?: any;\r\n// status: number;\r\n// }\r\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { IApiOptions, ILocalizeApiConfigs, IOnConnectionError } from \"./interfaces\";\r\nimport { takeUntil, catchError, throwError, Subject } from \"rxjs\";\r\nimport { waitFor } from \"../localize.token\";\r\nimport { LOCALIZE_API_ASSETS } from \"./localize.api.assets\";\r\n\r\ninterface IRequestInstance {\r\n client: HttpClient;\r\n destroy$: () => Subject<void>;\r\n}\r\n\r\ninterface IRetryOptions {\r\n maxRetries: () => number;\r\n delay: number;\r\n callback: () => Promise<any> | any;\r\n retryUnless?: (error: any) => boolean;\r\n onError?: (error: any) => Promise<void> | any;\r\n connectionError?: IOnConnectionError\r\n}\r\n\r\nclass LocalizeApiHelper {\r\n\r\n readonly defaultRetryOptions: Partial<IRetryOptions> = {\r\n connectionError: {\r\n message: 'Connection error occurred. Please wait',\r\n blockScreen: true,\r\n blockScreenZIndex: 10000\r\n }\r\n };\r\n\r\n async performRetry<T = any>(options: IRetryOptions): Promise<T> {\r\n let attempts = 0;\r\n let lastError: any;\r\n let consoleCount = 0;\r\n\r\n // Merge default retry options with provided options\r\n options = { ...this.defaultRetryOptions, ...options }\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n\r\n while (attempts < options.maxRetries()) {\r\n try {\r\n const result = await options.callback();\r\n this.removeBlocker(styleElement);\r\n return result;\r\n\r\n } catch (error: any) {\r\n lastError = error;\r\n\r\n if (consoleCount >= 7) {\r\n console.clear();\r\n consoleCount = 0;\r\n }\r\n\r\n if (options.retryUnless && !options.retryUnless(error))\r\n throw error; // If the error should not be retried, rethrow it\r\n\r\n // Handle connection error\r\n styleElement = await this.onConnectionError(options, error);\r\n\r\n if (options.onError)\r\n await this.invokeHook(options.onError.bind(this, error));\r\n\r\n if (attempts >= options.maxRetries() - 1)\r\n throw error;\r\n\r\n attempts++;\r\n consoleCount++;\r\n console.warn(`Attempt ${attempts} failed. Retrying...`, error);\r\n await waitFor(options.delay);\r\n }\r\n }\r\n\r\n console.warn(`Failed after ${options.maxRetries} attempts`);\r\n throw lastError;\r\n }\r\n\r\n async performRequestWithRetry<T = any>(\r\n options: IApiOptions,\r\n config: ILocalizeApiConfigs,\r\n performRequest: <T = any>(options: IApiOptions) => Promise<T>\r\n ): Promise<T> {\r\n\r\n const retryUnless = config.retryOptions?.retryFunction\r\n || this.isConnectionError;\r\n\r\n return await this.performRetry({\r\n connectionError: config.retryOptions?.onConnectionError,\r\n maxRetries: () => config.retryOptions?.maxRetries ?? 1000,\r\n delay: config.retryOptions?.delay ?? 500,\r\n callback: () => performRequest<T>(options),\r\n retryUnless: retryUnless,\r\n })\r\n }\r\n\r\n buildUrl(baseUrl: string, path: string): string {\r\n const normalizedUrl = `${baseUrl.trim().replace(/\\/?$/, '/')}${path.trim().replace(/^\\//, '')}`;\r\n return normalizedUrl.endsWith('/')\r\n ? normalizedUrl.slice(0, -1)\r\n : normalizedUrl;\r\n }\r\n\r\n async invokeHook(callback?: () => Promise<any> | any): Promise<any> {\r\n if (!callback) return;\r\n\r\n const result = callback();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n\r\n createRequest<T = any>(\r\n instance: Required<IRequestInstance>,\r\n method: string,\r\n url: string,\r\n body: any,\r\n options: { headers: HttpHeaders }\r\n ) {\r\n const request$ = instance.client.request<T>(method, url, {\r\n ...options,\r\n body,\r\n observe: 'response',\r\n }).pipe(\r\n takeUntil(instance.destroy$()),\r\n catchError((error: HttpErrorResponse) => {\r\n // Convert to a non-observable error to handle in the promise\r\n return throwError(() => error);\r\n })\r\n );\r\n\r\n return request$;\r\n }\r\n\r\n defaultRetryFunction(error: HttpErrorResponse): boolean {\r\n\r\n // Don't retry for other errors (like 400, 401, 403, etc.)\r\n if (!this.isConnectionError(error))\r\n throw error;\r\n\r\n return true;\r\n }\r\n\r\n isConnectionError(error: HttpErrorResponse): boolean {\r\n const isNetworkError = error.status === 0;\r\n const isServerError = error.status >= 1000 && error.status < 600;\r\n return isNetworkError || isServerError;\r\n }\r\n\r\n async onConnectionError(\r\n options: IRetryOptions,\r\n error: any\r\n ): Promise<Promise<void> | any> {\r\n\r\n if (!options.connectionError)\r\n return;\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n if (this.isConnectionError(error)) {\r\n\r\n styleElement = this.screenBlocker(options, error, true);\r\n\r\n await this.invokeHook(options.connectionError.callback?.bind(this, error));\r\n return styleElement;\r\n } else {\r\n this.screenBlocker(options, error, false);\r\n styleElement?.remove();\r\n }\r\n }\r\n\r\n screenBlocker(optons: IRetryOptions,\r\n error?: HttpErrorResponse,\r\n add: boolean = true): HTMLStyleElement | undefined {\r\n\r\n if (!optons.connectionError?.blockScreen)\r\n return;\r\n\r\n const message = optons.connectionError?.message\r\n || 'Connection error occurred. Please wait';\r\n const errorMessage = error?.error?.message || 'An error occurred';\r\n const suggestinMessage = optons.connectionError?.suggestionMessage\r\n || 'Please check your internet connection or the server status.';\r\n\r\n const zIndex = optons.connectionError?.blockScreenZIndex || 10000;\r\n\r\n const body = document.body;\r\n const blcokerHtml = `\r\n <div class=\"lze-blocker\">\r\n ${LOCALIZE_API_ASSETS.network.noConnection}\r\n <div class=\"lze-blocker__message\">\r\n ${message}\r\n <span class=\"lze-blocker__dotting\">\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n </span>\r\n </div>\r\n <div class=\"lze-blocker__error\">${errorMessage}</div>\r\n <div class=\"lze-blocker__error_suggestion\">${suggestinMessage}</div>\r\n </div>\r\n `;\r\n const style = `\r\n div.lze-blocker {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.85) !important;\r\n z-index: ${zIndex};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n color: #fff !important;\r\n font-family: Arial, sans-serif;\r\n text-align: center;\r\n padding: 20px;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n svg#lze-no-connection {\r\n width: 75px;\r\n height: 75px;\r\n margin-bottom: 20px;\r\n }\r\n \r\n div.lze-blocker__message {\r\n color: #fff !important;\r\n font-size: 18px !important;\r\n margin-bottom: 10px;\r\n }\r\n \r\n .lze-blocker__dotting {\r\n display: inline-block;\r\n vertical-align: middle;\r\n }\r\n span.lze-blocker__dot {\r\n display: inline-block;\r\n width: 7px;\r\n height: 7px;\r\n background-color: #ffffff !important;\r\n border-radius: 50%;\r\n margin-left: 3px;\r\n opacity: 0.3;\r\n animation: dotting 1s infinite;\r\n }\r\n .lze-blocker__dot:nth-child(1) {\r\n animation-delay: 0s;\r\n opacity: 1;\r\n }\r\n .lze-blocker__dot:nth-child(2) {\r\n animation-delay: 0.2s;\r\n }\r\n .lze-blocker__dot:nth-child(3) {\r\n animation-delay: 0.4s;\r\n }\r\n\r\n @keyframes dotting {\r\n 0%, 80%, 100% { opacity: 0.3; }\r\n 40% { opacity: 1; }\r\n }\r\n\r\n div.lze-blocker__error {\r\n color: #f00;\r\n font-size: 14px !important;\r\n margin-bottom: 10px;\r\n text-shadow: 0 0 1px #ff5f5f !important;\r\n }\r\n\r\n div.lze-blocker__error_suggestion {\r\n color: #ccc !important;\r\n font-size: 14px !important;\r\n margin-top: 10px;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `;\r\n\r\n const styleElement = document.createElement('style');\r\n\r\n if (add) {\r\n if (!document.querySelector('.lze-blocker')) {\r\n styleElement.innerHTML = style;\r\n document.head.appendChild(styleElement);\r\n body.insertAdjacentHTML('beforeend', blcokerHtml);\r\n }\r\n } else {\r\n this.removeBlocker(styleElement);\r\n }\r\n\r\n return styleElement;\r\n }\r\n\r\n private removeBlocker(styleElement: HTMLStyleElement | undefined): void {\r\n const blocker = document.querySelector('.lze-blocker');\r\n blocker?.remove();\r\n styleElement?.remove();\r\n }\r\n}\r\n\r\nexport const ApiHelper = new LocalizeApiHelper();","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { LocalizeTokenService } from \"./localize.token.service\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { LocalizeToken, waitFor, waitUntil } from \"./localize.token\";\r\nimport { BehaviorSubject, Subject } from \"rxjs\";\r\nimport { ILocalizeApiConfigs, IApiOptions, EMethod, IHeader } from \"./helpers/interfaces\";\r\nimport { ApiHelper } from \"./helpers/loccalize.api.helper\";\r\n\r\nconst SCHEMES = LocalizeToken.httpHeaders;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiService implements OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeApiConfigs>>({});\r\n readonly isRequestingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isResolvingStartupSubject = new BehaviorSubject<boolean>(false);\r\n get isResolvingStartup() { return this.isResolvingStartupSubject.value; }\r\n\r\n get needTenant(): boolean { return this.localizeTokenService.config.tenantToken !== undefined; }\r\n\r\n get isRequesting() { return this.isRequestingSubject.value; }\r\n get isRevokingToken() { return this.localizeTokenService.isRevokingToken; }\r\n set isRevokingToken(value: boolean) { this.localizeTokenService.isRevokingToken = value; }\r\n\r\n get accessToken(): string | undefined { return this.localizeTokenService.accessToken; }\r\n set accessToken(value: string | undefined) { this.localizeTokenService.accessToken = value; }\r\n\r\n get refreshToken(): string | undefined { return this.localizeTokenService.refreshToken; }\r\n get tenantToken(): string | undefined { return this.localizeTokenService.tenantToken; }\r\n\r\n private defaultConfig: Partial<ILocalizeApiConfigs> = {\r\n waitEachRequest: { milliseconds: 0 },\r\n enableRequestCancellation: true,\r\n\r\n retryOptions: {\r\n maxRetries: 1000,\r\n delay: 1000,\r\n retryFunction: ApiHelper.defaultRetryFunction.bind(this),\r\n },\r\n\r\n };\r\n\r\n private get config(): Partial<ILocalizeApiConfigs> {\r\n this.validateConfig();\r\n return this.configSubject.value;\r\n }\r\n\r\n private apiOptions: Partial<IApiOptions> = {\r\n method: EMethod.GET,\r\n requestBody: null,\r\n };\r\n\r\n constructor(readonly httpClient: HttpClient,\r\n private readonly localizeTokenService: LocalizeTokenService\r\n ) { }\r\n\r\n /**\r\n * Initialize the API service.\r\n * @param apiConfigs - The API configurations.\r\n */\r\n init(apiConfigs: ILocalizeApiConfigs) {\r\n console.log('LocalizeApiService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...apiConfigs });\r\n }\r\n\r\n cancelPendingRequests(): void {\r\n this.config.enableRequestCancellation\r\n && this.destroy$.next();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * A higher-order function that returns a curried function for making API requests.\r\n *\r\n * @param baseUrl - The base URL of the API.\r\n * @returns A curried function that can be used to make API requests.\r\n */\r\n func = (baseUrl: string) =>\r\n <T = any>(path: string, method: EMethod = EMethod.GET, reqBody: any = null, reqHeaders?: IHeader) =>\r\n this.request<T>(baseUrl, path, method, reqBody, reqHeaders)\r\n\r\n public async request<T = any>(baseUrl: string,\r\n path: string,\r\n method: EMethod = EMethod.GET,\r\n reqBody: any = null,\r\n reqHeaders?: IHeader): Promise<T> {\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 500);\r\n\r\n await ApiHelper.invokeHook(this.config.onPrepareRequest);\r\n\r\n const apiOptions = this.buildApiOptions(baseUrl, path, method, reqBody, reqHeaders);\r\n\r\n try {\r\n await this.toWaitForPreviousRequest();\r\n\r\n return await ApiHelper.performRequestWithRetry<T>(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n }\r\n catch (error: any) {\r\n return await this.handleOnRequestError(error, apiOptions);\r\n }\r\n }\r\n\r\n private async handleOnRequestError(error: HttpErrorResponse, options: IApiOptions): Promise<any> {\r\n if (error.status !== 401)\r\n throw error;\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 50);\r\n\r\n return await ApiHelper.performRetry({\r\n maxRetries: () => 1000,\r\n delay: 10,\r\n retryUnless: (error) => error.status === 401 || ApiHelper.isConnectionError(error),\r\n callback: async () => {\r\n // Only handle 401 Unauthorized errors\r\n await this.revokeToken();\r\n\r\n // Retry the request with the new access token\r\n return await this.performRequest(options);\r\n }\r\n })\r\n\r\n }\r\n\r\n private async performRequest<T = any>(options: IApiOptions): Promise<T> {\r\n\r\n // Build the request options\r\n const buildOptions = { headers: this.buildHeaderOptions(options) };\r\n\r\n // Create the request observable\r\n const request$ = ApiHelper.createRequest<T>({\r\n client: this.httpClient,\r\n destroy$: () => this.destroy$\r\n }, options.method, options.requestUrl, options.requestBody, buildOptions);\r\n\r\n // Set the isRequesting state to true before making the request\r\n this.isRequestingSubject.next(true);\r\n\r\n const response = await new Promise<any>((resolve, reject) =>\r\n request$.subscribe({ next: (res) => resolve(res.body), error: reject }));\r\n\r\n // Reset the isRequesting state after the request completes\r\n this.isRequestingSubject.next(false);\r\n\r\n return response;\r\n }\r\n\r\n private async revokeToken(): Promise<void> {\r\n\r\n try {\r\n if (await this.interceptRevokeToken())\r\n return;\r\n\r\n this.isRevokingToken = true;\r\n\r\n const apiOptions: IApiOptions = {\r\n ...this.buildApiOptions(this.localizeTokenService.config.refreshToken?.requestUrl || ''),\r\n refreshToken: true,\r\n }\r\n\r\n // const revokeToken = await this.performRequest(apiOptions);\r\n const revokeToken = await ApiHelper.performRequestWithRetry(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n await this.handleOnTokenRevoked(revokeToken);\r\n\r\n } catch (error: any) {\r\n // Handle the error, log it\r\n await ApiHelper.invokeHook(this.config.onAutoLogout);\r\n\r\n } finally {\r\n // Reset the revoking token state\r\n this.isRevokingToken = false;\r\n }\r\n }\r\n\r\n /** default http request options */\r\n private buildHeaderOptions(options: IApiOptions): HttpHeaders {\r\n\r\n const headers: { [key: string]: string } = {\r\n ...(options.refreshToken && { [SCHEMES.X_REFRESH_TOKEN]: `${this.refreshToken}` }),\r\n ...(!options.isFormData && { [SCHEMES.CONTENT_TYPE]: 'application/json' }),\r\n [SCHEMES.AUTHORIZATION]: `Bearer ${this.accessToken}`,\r\n ...(this.needTenant && { [SCHEMES.X_TENANT]: `${this.tenantToken}` })\r\n };\r\n\r\n return new HttpHeaders({ ...headers, ...options.headers });\r\n }\r\n\r\n private buildApiOptions(\r\n baseUrl: string,\r\n path: string = '',\r\n method: EMethod = EMethod.GET,\r\n requestBody: any = null,\r\n headers?: { [key: string]: string }\r\n ): IApiOptions {\r\n\r\n const requestUrl = ApiHelper.buildUrl(baseUrl, path);\r\n const isFormData = requestBody && requestBody instanceof FormData;\r\n return {\r\n ...this.apiOptions,\r\n ...{ headers, method, requestUrl, requestBody, isFormData }\r\n };\r\n }\r\n\r\n\r\n private async toWaitForPreviousRequest() {\r\n if (this.isRevokingToken) {\r\n await waitUntil(() => !this.isRevokingToken);\r\n }\r\n\r\n // to wait for each request in 50ms, even if the request is not completed\r\n const waitMilliseconds = this.config.waitEachRequest?.milliseconds;\r\n if (waitMilliseconds && this.isRequesting) {\r\n // console.warn(`Request throttling: Another request is in progress. Waiting for ${waitMilliseconds}ms.`);\r\n await waitFor(waitMilliseconds, this.isRequesting);\r\n }\r\n }\r\n\r\n\r\n private async handleOnTokenRevoked(response: any): Promise<void> {\r\n\r\n if (response?.status) {\r\n // If the response is successful, update the access token\r\n this.accessToken = response.message;\r\n\r\n } else {\r\n // If the response indicates an error, invoke the onRevokeUnauthorized hook\r\n console.warn('Token revocation failed, refresh token is expired.', response.message);\r\n await ApiHelper.invokeHook(this.config.onRevokeUnauthorized);\r\n }\r\n\r\n }\r\n\r\n private async interceptRevokeToken() {\r\n\r\n if (this.isRevokingToken) {\r\n console.warn('Token is already being revoked. Waiting for the current operation to complete...');\r\n await waitUntil(() => !this.isRevokingToken);\r\n return true;\r\n }\r\n\r\n if (!this.refreshToken) {\r\n // await ApiHelper.invokeHook(this.apiConfigs.onAutoLogout);\r\n throw new Error('Refresh token is missing. Please login again.');\r\n }\r\n return false;\r\n }\r\n\r\n validateConfig(): void {\r\n if (this.localizeTokenService.config.requiredTenant\r\n && !this.localizeTokenService.config.tenantToken?.name?.trim().length) {\r\n throw Error('Tenant token is required but tenantTokenName is not configured');\r\n }\r\n\r\n if (!this.localizeTokenService.config.refreshToken?.requestUrl?.trim().length) {\r\n throw Error('Revoke token URL is not configured - token refresh will not work');\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { LocalizeTokenService } from './localize.token.service';\r\nimport { LocalizeApiService } from './localize.api.service';\r\n\r\n@NgModule({\r\n providers: [\r\n LocalizeTokenService,\r\n LocalizeApiService\r\n ]\r\n})\r\nexport class LocalizeTokenModule { }","import { Injectable } from '@angular/core';\nimport { LocalizeLogindlgService } from '../localize-logindlg/localize-logindlg.service';\nimport { ILocalizeApiConfigs } from '../localize-token/helpers/interfaces';\nimport { LocalizeApiService } from '../localize-token/localize.api.service';\nimport { ILocalizeTokenConfig } from '../localize-token/localize.token';\nimport { LocalizeTokenService } from '../localize-token/localize.token.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeApiTokenService {\n readonly api: LocalizeApiService;\n readonly token: LocalizeTokenService;\n readonly loginDialog: LocalizeLogindlgService;\n\n constructor(tokenService: LocalizeTokenService,\n apiService: LocalizeApiService,\n loginDialogService: LocalizeLogindlgService) {\n this.api = apiService;\n this.token = tokenService;\n this.loginDialog = loginDialogService;\n }\n\n initialize(tokenConfig: ILocalizeTokenConfig, apiConfig: ILocalizeApiConfigs) {\n // Initialize the LocalizeTokenService with the provided token configuration\n this.token.init(tokenConfig);\n\n // Initialize the LocalizeApiService with the provided API configuration\n this.api.init(apiConfig);\n\n console.log('LocalizeApiTokenService initialized with token and API configurations.');\n\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LocalizeLogindlgModule } from '../localize-logindlg/localize-logindlg.module';\nimport { LocalizeTokenModule } from '../localize-token/localize.token.module';\nimport { LocalizeApiTokenService } from './localize-api-token.service';\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n LocalizeTokenModule,\n LocalizeLogindlgModule\n ],\n providers: [\n LocalizeApiTokenService\n ]\n})\nexport class LocalizeApiTokenModule { }\n","//#region login dialog\r\nexport * from './localize-logindlg/localize-logindlg.component'\r\nexport * from './localize-logindlg/localize-logindlg.module'\r\nexport * from './localize-logindlg/localize-logindlg.service'\r\n\r\n//#region localize token\r\nexport * from './localize-token/helpers/localize.api.assets';\r\nexport * from './localize-token/helpers/interfaces';\r\nexport * from './localize-token/helpers/loccalize.api.helper';\r\nexport * from './localize-token/localize.token.service';\r\nexport * from './localize-token/localize.token';\r\nexport * from './localize-token/localize.token.storage';\r\nexport * from './localize-token/localize.token.module';\r\nexport * from './localize-token/localize.api.service';\r\n\r\n//#region localize api token\r\nexport * from './localize-api-token/localize-api-token.service';\r\nexport * from './localize-api-token/localize-api-token.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.LocalizeTokenService","i1","i2.LocalizeTokenService","i1.LocalizeTokenService","i2.LocalizeApiService","i3.LocalizeLogindlgService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAaA;;;;;;;;;;;;AAYE;MACW,oBAAoB,CAAA;AAE/B,IAAA,IAAY,iBAAiB,GAAA;QAC3B,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC9D,OAAO;AACL,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,MAAM,EAAE,UAAU;AAClB,YAAA,MAAM,EAAE,IAAI;;AAEZ,YAAA,OAAO,EAAE;SACV;;AAGc,IAAA,cAAc;AAC/B,IAAA,WAAA,CAAY,eAAgC,EAAA;QAC1C,IAAI,CAAC,cAAc,GAAG,eAAe,IAAI,IAAI,CAAC,iBAAiB;;AAGjE;;;;;AAKG;AACH,IAAA,KAAK,CAAC,IAAY,EAAA;QAChB,IAAI,OAAO,QAAQ,KAAK,WAAW;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,gBAAgB,EAAE,GAAG,CAAC;QAClF,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAGrC;;;;;AAKG;AACH,IAAA,GAAG,CAAC,IAAY,EAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,SAAS;AAEvC,QAAA,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,gBAAgB,EAAE,GAAG,CAAC;QAClF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC3C,QAAA,OAAO,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;;AAG3D;;;;AAIG;IACH,MAAM,GAAA;QACJ,MAAM,OAAO,GAAQ,EAAE;AACvB,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;YACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AACxC,YAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;gBACrB,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC/B,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACpC,gBAAA,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;;;AAIlF,QAAA,OAAO,OAAO;;AAGhB,IAAA,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,OAAwB,EAAA;AACvD,QAAA,OAAO,KAAK,IAAI,CAAC,cAAc;QAC/B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,OAAO,EAAE;AAC1F,QAAA,IAAI,SAAS,GAAG,CAAG,EAAA,kBAAkB,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAkB,CAAC,KAAK,CAAC,GAAG;QAE3E,IAAI,OAAO,EAAE;YACX,MAAM,SAAS,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,GAAG,OAAO;AAChG,YAAA,SAAS,IAAI,CAAW,QAAA,EAAA,SAAS,CAAC,WAAW,EAAE,GAAG;;AAGpD,QAAA,SAAS,IAAI,IAAI,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,CAAG,GAAG,EAAE;AACxC,QAAA,SAAS,IAAI,MAAM,GAAG,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,CAAG,GAAG,EAAE;QAC9C,SAAS,IAAI,MAAM,GAAG,SAAS,GAAG,EAAE;AACpC,QAAA,SAAS,IAAI,QAAQ,GAAG,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,CAAG,GAAG,EAAE;AAEpD,QAAA,QAAQ,CAAC,MAAM,GAAG,SAAS;;AAG7B;;;;;;AAMG;IACH,MAAM,CAAC,IAAY,EAAE,IAAe,GAAA,GAAG,EAAE,MAAA,GAAiB,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAA;AAChF,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;;AAGnD;;AAEG;IACH,SAAS,CAAC,IAAa,EAAE,MAAe,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE;QAE7B,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC7C,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC;;;AAI1C;;MC7GY,aAAa,CAAA;AAExB,IAAA,OAAgB,OAAO,GAAG,IAAI,oBAAoB,EAAE;IAEpD,OAAgB,WAAW,GAAG;AAC5B,QAAA,aAAa,EAAE,eAAe;AAC9B,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,eAAe,EAAE,gBAAgB;AACjC,QAAA,YAAY,EAAE,cAAc;KAC7B;;AAIH;;;;;AAKG;AACI,eAAe,OAAO,CAAC,YAAoB,EAAE,OAAgB,IAAI,EAAA;AACtE,IAAA,IAAI,CAAC,IAAI;QAAE;AACX,IAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACjE;AAEA;;;;AAIG;AACI,eAAe,SAAS,CAAC,IAAe,EAAE,iBAAyB,EAAE,EAAA;AAE1E,IAAA,eAAe,cAAc,GAAA;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,EAAE;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,YAAY;cAC3B,MAAM;cACN,IAAI;AACR,QAAA,OAAO,MAAM;;IAGf,IAAI,MAAM,cAAc,EAAE;QAAE;AAE5B,IAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAG;AAC1B,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAW;AACtC,YAAA,IAAI,MAAM,cAAc,EAAE,EAAE;gBAC1B,aAAa,CAAC,QAAQ,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC;;SAEhB,EAAE,cAAc,CAAC;AACpB,KAAC,CAAC;AACJ;AAEM,SAAU,iBAAiB,CAAC,SAAkB,EAAA;AAClD,IAAA,SAAS,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;IAClC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS;AACjE;;MCzDa,oBAAoB,CAAA;AACZ,IAAA,aAAa,GAAG,IAAI,eAAe,CAAgC,EAAE,CAAC;AAC9E,IAAA,sBAAsB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACpD,IAAA,aAAa,GAAkC;QAC5D,UAAU,EAAE,iBAAiB,EAAE;AAC/B,QAAA,SAAS,EAAE;AACP,YAAA,IAAI,EAAE,YAAY;AACrB,SAAA;AACD,QAAA,YAAY,EAAE;AACV,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,UAAU,EAAE;AACf,SAAA;KACJ;AAED,IAAA,IAAI,MAAM,GAAA;QACN,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,KAA6B;;IAGnD,aAAa,GAAG,KAAK;AAE7B,IAAA,IAAI,CAAC,MAA4B,EAAA;AAC7B,QAAA,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC;AACnD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;AAC7D,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;IAG7B,WAAW,GAAA;;;;IAKX,IAAY,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,EAAE,CAAA;IAClD,IAAY,SAAS,CAAC,KAA6B,EAAA;QAC/C;AACI,cAAE,IAAI,CAAC,UAAU,CAAC,KAAK;AACvB,cAAE,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAK,CAAC;;IAGpE,IAAI,WAAW,KAAK,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;IAEzF,IAAI,YAAY,KAAK,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;IAC3F,IAAI,WAAW,GAAK,EAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,CAAA;IAEhD,IAAI,WAAW,CAAC,KAAyB,EAAA;AACrC,QAAA,KAAK,KAAK,IAAI,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;AAG/D,IAAA,IAAI,eAAe,GAAA,EAAK,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAA;IAEhE,IAAI,eAAe,CAAC,KAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;IAGrE,UAAU,GAAA;AACd,QAAA,IAAI;AACA,YAAA,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;YAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;AACnC,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe;;AAC1C,QAAA,MAAM;AACJ,YAAA,OAAO,SAAS;;;AAIhB,IAAA,UAAU,CAAC,KAAiB,EAAA;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1C,QAAA,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC;;IAGxE,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM;AAAE,YAAA,OAAO,KAAK;QAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM;AAAE,YAAA,OAAO,KAAK;AACzE,QAAA,OAAO,IAAI;;AAGf,IAAA,WAAW,GAAG,CAAC,KAAa,KAAK,UAAU,CAAC,SAAS,CAAa,KAAK,CAAC;AACxE,IAAA,IAAI,kBAAkB,GAAA;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY;AAC/B,QAAA,OAAO,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;IAG1C,qBAAqB,GAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACrB,YAAA,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC;;;uGApF9F,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCiTrB,yBAAyB,CAAA;AAejB,IAAA,cAAA;AACA,IAAA,GAAA;AACA,IAAA,MAAA;AACA,IAAA,SAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,SAAA;IApBV,UAAU,GAAG,YAAY;AAClC,IAAA,QAAQ;AACC,IAAA,WAAW;IACpB,OAAO,GAAG,KAAK;IACf,OAAO,GAAG,KAAK;IACf,IAAY,MAAM,GAAK,EAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AACtC,IAAA,WAAW;AAEpB,IAAA,MAAM;AACN,IAAA,QAAQ;AACP,IAAA,UAAU;AAGnB,IAAA,WAAA,CACmB,cAA8B,EAC9B,GAAsB,EACtB,MAAwB,EACxB,SAA8B,EAC9B,YAAkC,EAClC,UAAsB,EACtB,SAAuB,EAAA;QANvB,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAG,CAAA,GAAA,GAAH,GAAG;QACH,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAY,CAAA,YAAA,GAAZ,YAAY;QACZ,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAS,CAAA,SAAA,GAAT,SAAS;QAE1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAW;;IAGhD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,KAAK;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;AAEzC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC;AAC7C,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC;;;IAI3C,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;AAG1B,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,wDAAwD,CAAC;;AAG5F,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;AACnC,QAAA,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,mBAAmB,CAAC;;QAG3E,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW;AAC3D,QAAA,MAAM,aAAa,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,GAAG,EAAE;QACjE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC;AAC5G,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,eAAe,GAAG,IAAI;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;SACxB,EAAE,IAAI,CAAC;;AAGF,IAAA,MAAM,KAAK,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,uBAAuB,CAAC;AAClD,YAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC;;AAG1C,QAAA,IAAI;AAEF,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;AAClC,gBAAA,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;gBAC1C,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;YAGrH,OAAO,MAAM,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,KAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAS,EACjC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAClC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;;QAEhF,OAAO,CAAM,EAAE;YACf,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;AACpC,YAAA,OAAO,IAAI;;;IAIP,UAAU,GAAA;QAChB,OAAO;AACL,YAAA,CAAC,aAAa,CAAC,WAAW,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,IAAI,EAAE;AACjF,YAAA,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,IAAI,EAAE;SAC1E;;AAGH,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC;cACnB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ;cAC/C,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE;;IAG5F,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,IAAI;IAE3B,WAAW,CAAC,QAAgB,EAAE,OAAe,EAAA;AACnD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACpE,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;AAGtB,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;;uGA/GjE,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAHzB,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,CAAC,cAAc,CAAC,EA7DjB,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DH,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,mkHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAKI,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAtTrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,EAqPP,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA2DH,EACG,QAAA,EAAA,uBAAuB,aACtB,CAAC,cAAc,CAAC,EACZ,aAAA,EAAA,iBAAiB,CAAC,IAAI,EAAA,MAAA,EAAA,CAAA,mkHAAA,CAAA,EAAA;;;MCxQ1B,uBAAuB,CAAA;AAEL,IAAA,QAAA;AAA7B,IAAA,WAAA,CAA6B,QAAkB,EAAA;QAAlB,IAAQ,CAAA,QAAA,GAAR,QAAQ;;AAErC,IAAA,MAAM,eAAe,CAAC,WAA+B,EAAE,MAA4B,EAAA;AAEjF,QAAA,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;AAC1C,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;AAE5B,QAAA,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE;QAE5D,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;QACtD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC;AAEpE,QAAA,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,KAC9B,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAG;YAC7B,IAAI,GAAG,EAAE;AACP,gBAAA,OAAO,EAAE;;SAEZ,CAAC,CAAC;;AAGC,IAAA,oBAAoB,CAAC,MAA4B,EAAA;AACvD,QAAA,MAAM,KAAK;AACT,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE;AACjE,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,UAAU,EAAE,KAAK;SAClB;AAED,QAAA,MAAM,GAAG;YACP,GAAG,MAAM,EAAE,GAAG;gBACZ,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;AAC1D;SACF;AACD,QAAA,MAAM,CAAC,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE;AAClE,QAAA,OAAO,MAAM;;AAIP,IAAA,UAAU,CAAC,WAA+B,EAAA;QAChD,WAAW,KAAK,EAAE;QAClB,WAAW,CAAC,UAAU,KAAK;AACzB,YAAA,KAAK,EAAE,+DAA+D;AACtE,YAAA,mBAAmB,EAAE,kCAAkC;AACvD,YAAA,SAAS,EAAE,+BAA+B;AAC1C,YAAA,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;AACrC,YAAA,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;AACrC,YAAA,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;AACrC,YAAA,YAAY,EAAE;AACZ,gBAAA,OAAO,EAAE,wCAAwC;AACjD,gBAAA,WAAW,EAAE;AACd;SACF;;uGAtDQ,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCjCY,sBAAsB,CAAA;uGAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAAtB,sBAAsB,EAAA,YAAA,EAAA,CAblB,yBAAyB,CAAA,EAAA,OAAA,EAAA,CAGtC,YAAY;YACZ,WAAW;YACX,eAAe;YACf,aAAa;YACb,WAAW;AACX,YAAA,YAAY,aAPJ,yBAAyB,CAAA,EAAA,CAAA;AAYxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,EAHtB,SAAA,EAAA,CAAC,uBAAuB,CAAC,YAPlC,YAAY;YACZ,WAAW;YACX,eAAe;YACf,aAAa;YACb,WAAW;YACX,YAAY,CAAA,EAAA,CAAA;;2FAKH,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAdlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,yBAAyB,CAAC;oBACzC,OAAO,EAAE,CAAC,yBAAyB,CAAC;AACpC,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,aAAa;wBACb,WAAW;wBACX,YAAY;AACb,qBAAA;oBACD,SAAS,EAAE,CAAC,uBAAuB,CAAC;oBACpC,OAAO,EAAE,CAAC,sBAAsB,CAAC;AAClC,iBAAA;;;ACvBY,MAAA,mBAAmB,GAAG;AAC/B,IAAA,OAAO,EAAE;AACL,QAAA,YAAY,EAAE,CAAA;;;;;;;;;;;;;;AAcH,kBAAA;AACd;;;ACfL;;AAEG;IACS;AAAZ,CAAA,UAAY,OAAO,EAAA;AACf,IAAA,OAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,OAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,OAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,OAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,OAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACnB,CAAC,EANW,OAAO,KAAP,OAAO,GAMlB,EAAA,CAAA,CAAA;AAyFD;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA,MAAM,iBAAiB,CAAA;AAEV,IAAA,mBAAmB,GAA2B;AACnD,QAAA,eAAe,EAAE;AACb,YAAA,OAAO,EAAE,wCAAwC;AACjD,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,iBAAiB,EAAE;AACtB;KACJ;IAED,MAAM,YAAY,CAAU,OAAsB,EAAA;QAC9C,IAAI,QAAQ,GAAG,CAAC;AAChB,QAAA,IAAI,SAAc;QAClB,IAAI,YAAY,GAAG,CAAC;;QAGpB,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,GAAG,OAAO,EAAE;AAErD,QAAA,IAAI,YAA0C;AAE9C,QAAA,OAAO,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE;AACpC,YAAA,IAAI;AACA,gBAAA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE;AACvC,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;AAChC,gBAAA,OAAO,MAAM;;YAEf,OAAO,KAAU,EAAE;gBACjB,SAAS,GAAG,KAAK;AAEjB,gBAAA,IAAI,YAAY,IAAI,CAAC,EAAE;oBACnB,OAAO,CAAC,KAAK,EAAE;oBACf,YAAY,GAAG,CAAC;;gBAGpB,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;oBAClD,MAAM,KAAK,CAAC;;gBAGhB,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC;gBAE3D,IAAI,OAAO,CAAC,OAAO;AACf,oBAAA,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAE5D,gBAAA,IAAI,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;AACpC,oBAAA,MAAM,KAAK;AAEf,gBAAA,QAAQ,EAAE;AACV,gBAAA,YAAY,EAAE;gBACd,OAAO,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,QAAQ,CAAsB,oBAAA,CAAA,EAAE,KAAK,CAAC;AAC9D,gBAAA,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;;;QAIpC,OAAO,CAAC,IAAI,CAAC,CAAA,aAAA,EAAgB,OAAO,CAAC,UAAU,CAAW,SAAA,CAAA,CAAC;AAC3D,QAAA,MAAM,SAAS;;AAGnB,IAAA,MAAM,uBAAuB,CACzB,OAAoB,EACpB,MAA2B,EAC3B,cAA6D,EAAA;AAG7D,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,EAAE;eAClC,IAAI,CAAC,iBAAiB;AAE7B,QAAA,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC;AAC3B,YAAA,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,iBAAiB;YACvD,UAAU,EAAE,MAAM,MAAM,CAAC,YAAY,EAAE,UAAU,IAAI,IAAI;AACzD,YAAA,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,IAAI,GAAG;AACxC,YAAA,QAAQ,EAAE,MAAM,cAAc,CAAI,OAAO,CAAC;AAC1C,YAAA,WAAW,EAAE,WAAW;AAC3B,SAAA,CAAC;;IAGN,QAAQ,CAAC,OAAe,EAAE,IAAY,EAAA;QAClC,MAAM,aAAa,GAAG,CAAA,EAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAE;AAC/F,QAAA,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG;cAC3B,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;cACzB,aAAa;;IAGvB,MAAM,UAAU,CAAC,QAAmC,EAAA;AAChD,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,MAAM,MAAM,GAAG,QAAQ,EAAE;AACzB,QAAA,IAAI,MAAM,YAAY,OAAO,EAAE;AAC3B,YAAA,MAAM,MAAM;;;IAIpB,aAAa,CACT,QAAoC,EACpC,MAAc,EACd,GAAW,EACX,IAAS,EACT,OAAiC,EAAA;QAEjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAI,MAAM,EAAE,GAAG,EAAE;AACrD,YAAA,GAAG,OAAO;YACV,IAAI;AACJ,YAAA,OAAO,EAAE,UAAU;AACtB,SAAA,CAAC,CAAC,IAAI,CACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAC9B,UAAU,CAAC,CAAC,KAAwB,KAAI;;AAEpC,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;SACjC,CAAC,CACL;AAED,QAAA,OAAO,QAAQ;;AAGnB,IAAA,oBAAoB,CAAC,KAAwB,EAAA;;AAGzC,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC9B,YAAA,MAAM,KAAK;AAEf,QAAA,OAAO,IAAI;;AAGf,IAAA,iBAAiB,CAAC,KAAwB,EAAA;AACtC,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC;AACzC,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QAChE,OAAO,cAAc,IAAI,aAAa;;AAG1C,IAAA,MAAM,iBAAiB,CACnB,OAAsB,EACtB,KAAU,EAAA;QAGV,IAAI,CAAC,OAAO,CAAC,eAAe;YACxB;AAEJ,QAAA,IAAI,YAA0C;AAC9C,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;YAE/B,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAEvD,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1E,YAAA,OAAO,YAAY;;aAChB;YACH,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;YACzC,YAAY,EAAE,MAAM,EAAE;;;AAI9B,IAAA,aAAa,CAAC,MAAqB,EAC/B,KAAyB,EACzB,MAAe,IAAI,EAAA;AAEnB,QAAA,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,WAAW;YACpC;AAEJ,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE;AACjC,eAAA,wCAAwC;QAC/C,MAAM,YAAY,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,mBAAmB;AACjE,QAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,EAAE;AAC1C,eAAA,6DAA6D;QAEpE,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,iBAAiB,IAAI,KAAK;AAEjE,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC1B,QAAA,MAAM,WAAW,GAAG,CAAA;;cAEd,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAA;;kBAEpC,OAAO,CAAA;;;;;;;8CAOqB,YAAY,CAAA;yDACD,gBAAgB,CAAA;;SAEhE;AACD,QAAA,MAAM,KAAK,GAAG,CAAA;;;;;;;;uBAQC,MAAM,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAyEpB;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QAEpD,IAAI,GAAG,EAAE;YACL,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;AACzC,gBAAA,YAAY,CAAC,SAAS,GAAG,KAAK;AAC9B,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;AACvC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC;;;aAElD;AACH,YAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;;AAGpC,QAAA,OAAO,YAAY;;AAGf,IAAA,aAAa,CAAC,YAA0C,EAAA;QAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE;QACjB,YAAY,EAAE,MAAM,EAAE;;AAE7B;AAEY,MAAA,SAAS,GAAG,IAAI,iBAAiB;;ACzS9C,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW;MAK5B,kBAAkB,CAAA;AAyCR,IAAA,UAAA;AACF,IAAA,oBAAA;AAzCF,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,IAAA,aAAa,GAAG,IAAI,eAAe,CAA+B,EAAE,CAAC;AAC7E,IAAA,mBAAmB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACzD,IAAA,yBAAyB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;IACxE,IAAI,kBAAkB,GAAK,EAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;AAEvE,IAAA,IAAI,UAAU,GAAA,EAAc,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC;IAE9F,IAAI,YAAY,GAAK,EAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;IAC3D,IAAI,eAAe,GAAK,EAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC;AACzE,IAAA,IAAI,eAAe,CAAC,KAAc,EAAA,EAAI,IAAI,CAAC,oBAAoB,CAAC,eAAe,GAAG,KAAK,CAAC;IAExF,IAAI,WAAW,GAAyB,EAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;AACrF,IAAA,IAAI,WAAW,CAAC,KAAyB,EAAA,EAAI,IAAI,CAAC,oBAAoB,CAAC,WAAW,GAAG,KAAK,CAAC;IAE3F,IAAI,YAAY,GAAyB,EAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC;IACvF,IAAI,WAAW,GAAyB,EAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;AAE7E,IAAA,aAAa,GAAiC;AACpD,QAAA,eAAe,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;AACpC,QAAA,yBAAyB,EAAE,IAAI;AAE/B,QAAA,YAAY,EAAE;AACZ,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,KAAK,EAAE,IAAI;YACX,aAAa,EAAE,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;AACzD,SAAA;KAEF;AAED,IAAA,IAAY,MAAM,GAAA;QAChB,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK;;AAGzB,IAAA,UAAU,GAAyB;QACzC,MAAM,EAAE,OAAO,CAAC,GAAG;AACnB,QAAA,WAAW,EAAE,IAAI;KAClB;IAED,WAAqB,CAAA,UAAsB,EACxB,oBAA0C,EAAA;QADxC,IAAU,CAAA,UAAA,GAAV,UAAU;QACZ,IAAoB,CAAA,oBAAA,GAApB,oBAAoB;;AAGvC;;;AAGG;AACH,IAAA,IAAI,CAAC,UAA+B,EAAA;AAClC,QAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC;AACjD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,UAAU,EAAE,CAAC;;IAGnE,qBAAqB,GAAA;QACnB,IAAI,CAAC,MAAM,CAAC;AACP,eAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;IAG3B,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;AAG1B;;;;;AAKG;AACH,IAAA,IAAI,GAAG,CAAC,OAAe,KACrB,CAAU,IAAY,EAAE,SAAkB,OAAO,CAAC,GAAG,EAAE,UAAe,IAAI,EAAE,UAAoB,KAC9F,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC;AAExD,IAAA,MAAM,OAAO,CAAU,OAAe,EAC3C,IAAY,EACZ,MAAkB,GAAA,OAAO,CAAC,GAAG,EAC7B,OAAe,GAAA,IAAI,EACnB,UAAoB,EAAA;AAEpB,QAAA,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC;QAEpD,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAExD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC;AAEnF,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,wBAAwB,EAAE;YAErC,OAAO,MAAM,SAAS,CAAC,uBAAuB,CAC5C,UAAU,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B;;QAGH,OAAO,KAAU,EAAE;YACjB,OAAO,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC;;;AAIrD,IAAA,MAAM,oBAAoB,CAAC,KAAwB,EAAE,OAAoB,EAAA;AAC/E,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;AACtB,YAAA,MAAM,KAAK;AAEb,QAAA,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;AAEnD,QAAA,OAAO,MAAM,SAAS,CAAC,YAAY,CAAC;AAClC,YAAA,UAAU,EAAE,MAAM,IAAI;AACtB,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,WAAW,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAClF,QAAQ,EAAE,YAAW;;AAEnB,gBAAA,MAAM,IAAI,CAAC,WAAW,EAAE;;AAGxB,gBAAA,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;;AAE5C,SAAA,CAAC;;IAII,MAAM,cAAc,CAAU,OAAoB,EAAA;;AAGxD,QAAA,MAAM,YAAY,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE;;AAGlE,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAI;YAC1C,MAAM,EAAE,IAAI,CAAC,UAAU;AACvB,YAAA,QAAQ,EAAE,MAAM,IAAI,CAAC;AACtB,SAAA,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC;;AAGzE,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AAEnC,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,KACtD,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;;AAG1E,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;AAEpC,QAAA,OAAO,QAAQ;;AAGT,IAAA,MAAM,WAAW,GAAA;AAEvB,QAAA,IAAI;AACF,YAAA,IAAI,MAAM,IAAI,CAAC,oBAAoB,EAAE;gBACnC;AAEF,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAE3B,YAAA,MAAM,UAAU,GAAgB;AAC9B,gBAAA,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,IAAI,EAAE,CAAC;AACxF,gBAAA,YAAY,EAAE,IAAI;aACnB;;YAGD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,uBAAuB,CACzD,UAAU,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B;AAED,YAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;;QAE5C,OAAO,KAAU,EAAE;;YAEnB,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;;gBAE5C;;AAER,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;;;;AAKxB,IAAA,kBAAkB,CAAC,OAAoB,EAAA;AAE7C,QAAA,MAAM,OAAO,GAA8B;AACzC,YAAA,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,CAAC,eAAe,GAAG,CAAG,EAAA,IAAI,CAAC,YAAY,CAAA,CAAE,EAAE,CAAC;AAClF,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,OAAO,CAAC,YAAY,GAAG,kBAAkB,EAAE,CAAC;YAC1E,CAAC,OAAO,CAAC,aAAa,GAAG,CAAU,OAAA,EAAA,IAAI,CAAC,WAAW,CAAE,CAAA;AACrD,YAAA,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAG,EAAA,IAAI,CAAC,WAAW,CAAA,CAAE,EAAE;SACrE;AAED,QAAA,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;;AAGpD,IAAA,eAAe,CACrB,OAAe,EACf,IAAA,GAAe,EAAE,EACjB,MAAA,GAAkB,OAAO,CAAC,GAAG,EAC7B,WAAmB,GAAA,IAAI,EACvB,OAAmC,EAAA;QAGnC,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;AACpD,QAAA,MAAM,UAAU,GAAG,WAAW,IAAI,WAAW,YAAY,QAAQ;QACjE,OAAO;YACL,GAAG,IAAI,CAAC,UAAU;YAClB,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU;SAC1D;;AAIK,IAAA,MAAM,wBAAwB,GAAA;AACpC,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;;;QAI9C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY;AAClE,QAAA,IAAI,gBAAgB,IAAI,IAAI,CAAC,YAAY,EAAE;;YAEzC,MAAM,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC;;;IAK9C,MAAM,oBAAoB,CAAC,QAAa,EAAA;AAE9C,QAAA,IAAI,QAAQ,EAAE,MAAM,EAAE;;AAEpB,YAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO;;aAE9B;;YAEL,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,QAAQ,CAAC,OAAO,CAAC;YACpF,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;;;AAKxD,IAAA,MAAM,oBAAoB,GAAA;AAEhC,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC;YAChG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;AAC5C,YAAA,OAAO,IAAI;;AAGb,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;;AAEtB,YAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;;AAElE,QAAA,OAAO,KAAK;;IAGd,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;AAChC,eAAA,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE;AACvE,YAAA,MAAM,KAAK,CAAC,gEAAgE,CAAC;;AAG/E,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE;AAC7E,YAAA,MAAM,KAAK,CAAC,kEAAkE,CAAC;;;uGAjQxE,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;2FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCFY,mBAAmB,CAAA;uGAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAAnB,mBAAmB,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,EALjB,SAAA,EAAA;YACP,oBAAoB;YACpB;AACH,SAAA,EAAA,CAAA;;2FAEQ,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,SAAS,EAAE;wBACP,oBAAoB;wBACpB;AACH;AACJ,iBAAA;;;MCCY,uBAAuB,CAAA;AACzB,IAAA,GAAG;AACH,IAAA,KAAK;AACL,IAAA,WAAW;AAEpB,IAAA,WAAA,CAAY,YAAkC,EAC5C,UAA8B,EAC9B,kBAA2C,EAAA;AAC3C,QAAA,IAAI,CAAC,GAAG,GAAG,UAAU;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,YAAY;AACzB,QAAA,IAAI,CAAC,WAAW,GAAG,kBAAkB;;IAGvC,UAAU,CAAC,WAAiC,EAAE,SAA8B,EAAA;;AAE1E,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;;AAG5B,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AAExB,QAAA,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC;;uGApB5E,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCSY,sBAAsB,CAAA;uGAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,YAR/B,YAAY;YACZ,mBAAmB;YACnB,sBAAsB,CAAA,EAAA,CAAA;AAMb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,EAJtB,SAAA,EAAA;YACT;AACD,SAAA,EAAA,OAAA,EAAA,CANC,YAAY;YACZ,mBAAmB;YACnB,sBAAsB,CAAA,EAAA,CAAA;;2FAMb,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAXlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,mBAAmB;wBACnB;AACD,qBAAA;AACD,oBAAA,SAAS,EAAE;wBACT;AACD;AACF,iBAAA;;;ACjBD;;ACAA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"sambath999-localize-token.mjs","sources":["../../src/localize-token/localize.token.storage.ts","../../src/localize-token/localize.token.ts","../../src/localize-token/localize.token.service.ts","../../src/localize-logindlg/localize-logindlg.component.ts","../../src/localize-logindlg/localize-logindlg.service.ts","../../src/localize-logindlg/localize-logindlg.module.ts","../../src/localize-token/helpers/localize.api.assets.ts","../../src/localize-token/helpers/interfaces.ts","../../src/localize-token/helpers/loccalize.api.helper.ts","../../src/localize-token/localize.api.service.ts","../../src/localize-token/localize.token.module.ts","../../src/localize-api-token/localize-api-token.service.ts","../../src/localize-api-token/localize-api-token.module.ts","../../src/public-api.ts","../../src/sambath999-localize-token.ts"],"sourcesContent":["import { extractMainDomain } from \"./localize.token\";\r\n\r\nexport interface ICookieOptions {\r\n /**\r\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\r\n */\r\n expires?: number | Date;\r\n path?: string;\r\n domain?: string;\r\n secure?: boolean;\r\n samesite?: \"strict\" | \"lax\" | \"none\";\r\n}\r\n\r\n/**\r\n* Assembly of @package ng2-cookies @see https://www.npmjs.com/package/ng2-cookies\r\n*\r\n* Reassembled by\r\n* @author sambath999\r\n* @date_29_09_2021\r\n* Updated from raw parameters to\r\n* @param {ICookieOptions} options and added another newer cookie flag\r\n* @param {string} samesite\r\n* @param {constant} SameSiteTypes, @param {string} strict \"strict\", @param {string} lax \"lax\", @param {string} none \"none\"\r\n*\r\n* @enum\r\n*/\r\nexport class LocalizeTokenStorage {\r\n\r\n private get getDefaultOptions(): ICookieOptions {\r\n const mainDomain = extractMainDomain(window.location.hostname);\r\n return {\r\n path: '/',\r\n domain: mainDomain,\r\n secure: true,\r\n // samesite: SameSiteType.strict,\r\n expires: 1\r\n }\r\n }\r\n\r\n private readonly defaultOptions: ICookieOptions;\r\n constructor(_defaultOptions?: ICookieOptions) {\r\n this.defaultOptions = _defaultOptions ?? this.getDefaultOptions;\r\n }\r\n\r\n /**\r\n * Checks the existence of a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the cookie\r\n * @returns existence of the cookie\r\n */\r\n check(name: string): boolean {\r\n if (typeof document === \"undefined\") return false;\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n return regexp.test(document.cookie);\r\n }\r\n\r\n /**\r\n * Retrieves a single cookie by it's name\r\n *\r\n * @param {string} name Identification of the Cookie\r\n * @returns The Cookie's value\r\n */\r\n get(name: string): string | undefined {\r\n if (!this.check(name)) return undefined;\r\n\r\n name = encodeURIComponent(name);\r\n const regexp = new RegExp('(?:^' + name + '|;\\\\s*' + name + ')=(.*?)(?:;|$)', 'g');\r\n const result = regexp.exec(document.cookie);\r\n return result ? decodeURIComponent(result[1]) : undefined;\r\n }\r\n\r\n /**\r\n * Retrieves a a list of all cookie avaiable\r\n *\r\n * @returns Object with all Cookies\r\n */\r\n getAll(): any {\r\n const cookies: any = {};\r\n if (document.cookie) {\r\n const split = document.cookie.split(';');\r\n for (const s of split) {\r\n const currCookie = s.split('=');\r\n currCookie[0] = currCookie[0].trim();\r\n cookies[decodeURIComponent(currCookie[0])] = decodeURIComponent(currCookie[1]);\r\n }\r\n }\r\n\r\n return cookies;\r\n }\r\n\r\n set(name: string, value: string, options?: ICookieOptions) {\r\n options ??= this.defaultOptions;\r\n const { expires, path, domain, secure, samesite } = { ...this.defaultOptions, ...options };\r\n let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)};`;\r\n\r\n if (expires) {\r\n const dtExpires = typeof expires === 'number' ? new Date(Date.now() + expires * 864e5) : expires;\r\n cookieStr += `expires=${dtExpires.toUTCString()};`;\r\n }\r\n\r\n cookieStr += path ? `path=${path};` : '';\r\n cookieStr += domain ? `domain=${domain};` : '';\r\n cookieStr += secure ? 'secure;' : '';\r\n cookieStr += samesite ? `samesite=${samesite};` : '';\r\n\r\n document.cookie = cookieStr;\r\n }\r\n\r\n /**\r\n * Removes specified Cookie\r\n *\r\n * @param {string} name Cookie's identification\r\n * @param {string} path Path relative to the domain where the cookie should be avaiable. Default /\r\n * @param {string} domain Domain where the cookie should be avaiable. Default current domain\r\n */\r\n delete(name: string, path: string = '/', domain: string = window.location.hostname): void {\r\n this.set(name, '', { path, domain, expires: -1 });\r\n }\r\n\r\n /**\r\n * Delete all cookie avaiable\r\n */\r\n deleteAll(path?: string, domain?: string): void {\r\n const cookies = this.getAll();\r\n\r\n for (const cookieName of Object.keys(cookies)) {\r\n this.delete(cookieName, path, domain);\r\n }\r\n }\r\n\r\n}\r\n","import { LocalizeTokenStorage } from \"./localize.token.storage\";\r\n\r\ninterface ILocalizeTokenTokens {\r\n name: string;\r\n requestUrl?: string;\r\n}\r\n\r\nexport interface ILocalizeTokenConfig {\r\n /**\r\n * The main domain of the application to set the cookies to be available for cross application with subdomains.\r\n * \r\n * Default is location.hostname (current domain) and automatically set extracted main domain if it is subdomain.\r\n */\r\n mainDomain?: string;\r\n\r\n isProduction: boolean;\r\n authToken?: ILocalizeTokenTokens;\r\n refreshToken?: ILocalizeTokenTokens;\r\n tenantToken?: ILocalizeTokenTokens;\r\n requiredTenant?: boolean;\r\n}\r\n\r\nexport class LocalizeToken {\r\n\r\n static readonly storage = new LocalizeTokenStorage();\r\n\r\n static readonly httpHeaders = {\r\n AUTHORIZATION: 'Authorization',\r\n X_TENANT: 'X-Tenant',\r\n X_REFRESH_TOKEN: 'X-RefreshToken',\r\n CONTENT_TYPE: 'Content-Type',\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Waits for a specified amount of time.\r\n * @param milliseconds - The milliseconds to wait.\r\n * @param when - The condition to wait for. Default is true.\r\n * @returns - Promise<void>\r\n */\r\nexport async function waitFor(milliseconds: number, when: boolean = true) {\r\n if (!when) return;\r\n await new Promise(resolve => setTimeout(resolve, milliseconds));\r\n}\r\n\r\n/**\r\n * Waits until the condition is met.\r\n * @param when - The condition to wait for.\r\n * @param intervalNumber - The interval number in milliseconds to check the condition. Default is 50.\r\n */\r\nexport async function waitUntil(when: () => any, intervalNumber: number = 50) {\r\n\r\n async function isConditionMet() {\r\n const cond = when();\r\n const result = cond instanceof Promise\r\n ? await cond\r\n : cond;\r\n return result;\r\n }\r\n\r\n if (await isConditionMet()) return;\r\n\r\n await new Promise(resolve => {\r\n const interval = setInterval(async () => {\r\n if (await isConditionMet()) {\r\n clearInterval(interval);\r\n resolve(true);\r\n }\r\n }, intervalNumber);\r\n });\r\n}\r\n\r\nexport function extractMainDomain(subdomain?: string): string {\r\n subdomain ??= window.location.hostname;\r\n const parts = subdomain.split('.');\r\n return parts.length > 2 ? parts.slice(-2).join('.') : subdomain;\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { extractMainDomain, ILocalizeTokenConfig, LocalizeToken } from './localize.token';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport * as jwt_decode from 'jwt-decode';\r\nexport interface JwtPayload extends jwt_decode.JwtPayload {\r\n // Define the structure of your JWT payload here\r\n email: string;\r\n sub: string;\r\n name: string;\r\n iat: number;\r\n exp: number;\r\n // Add other fields as needed\r\n}\r\n\r\ninterface IAuthToken {\r\n token: string;\r\n revoke: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class LocalizeTokenService implements OnDestroy {\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeTokenConfig>>({});\r\n readonly isRevokingTokenSubject = new BehaviorSubject<boolean>(false);\r\n private readonly defaultConfig: Partial<ILocalizeTokenConfig> = {\r\n mainDomain: extractMainDomain(),\r\n authToken: {\r\n name: 'auth-token',\r\n },\r\n refreshToken: {\r\n name: 'refresh-token',\r\n requestUrl: '/api/token/revoke'\r\n },\r\n }\r\n\r\n get config(): ILocalizeTokenConfig {\r\n this.throwIfNotInitialized();\r\n return this.configSubject.value as ILocalizeTokenConfig;\r\n }\r\n\r\n private isInitialized = false;\r\n\r\n init(config: ILocalizeTokenConfig) {\r\n console.log('LocalizeTokenService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n this.isInitialized = true;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // this.configSubject.complete();\r\n // this.isRevokingTokenSubject.complete();\r\n }\r\n\r\n private get authToken() { return this.storageGet() }\r\n private set authToken(value: IAuthToken | undefined) {\r\n value\r\n ? this.storageSet(value)\r\n : LocalizeToken.storage.delete(this.config.authToken?.name!);\r\n }\r\n\r\n get tenantToken() { return LocalizeToken.storage.get(this.config.tenantToken?.name || '') }\r\n\r\n get refreshToken() { return LocalizeToken.storage.get(this.config.refreshToken?.name || '') }\r\n get accessToken() { return this.authToken?.token }\r\n\r\n set accessToken(value: string | undefined) {\r\n value && (this.authToken = { token: value, revoke: false })\r\n }\r\n\r\n get isRevokingToken() { return this.isRevokingTokenSubject.value /* this.authToken?.revoke ?? false */ }\r\n\r\n set isRevokingToken(value: boolean) {\r\n this.isRevokingTokenSubject.next(value);\r\n this.authToken && (this.authToken = { ...this.authToken, revoke: value })\r\n }\r\n\r\n private storageGet() {\r\n try {\r\n const encoded = LocalizeToken.storage.get(this.config.authToken?.name || '');\r\n const decoded = atob(encoded || '');\r\n return JSON.parse(decoded) as IAuthToken;\r\n } catch {\r\n return undefined\r\n }\r\n }\r\n\r\n private storageSet(value: IAuthToken) {\r\n const base64 = btoa(JSON.stringify(value));\r\n LocalizeToken.storage.set(this.config.authToken?.name || '', base64);\r\n }\r\n\r\n tokensValid(): boolean | undefined {\r\n if (!this.refreshToken?.length) return false;\r\n if (this.config.requiredTenant && !this.tenantToken?.length) return false;\r\n return true;\r\n }\r\n\r\n decodeToken = (token: string) => jwt_decode.jwtDecode<JwtPayload>(token);\r\n get decodeRefreshToken() {\r\n const token = this.refreshToken;\r\n return !token ? null : this.decodeToken(token);\r\n }\r\n\r\n private throwIfNotInitialized() {\r\n if (!this.isInitialized) {\r\n throw new Error('LocalizeTokenService is not initialized. Call init() method before using it.');\r\n }\r\n }\r\n\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport { MessageService } from \"primeng/api\";\r\nimport { DynamicDialogConfig, DynamicDialogRef } from \"primeng/dynamicdialog\";\r\nimport { JwtPayload, LocalizeTokenService } from \"../localize-token/localize.token.service\";\r\nimport { LocalizeToken } from \"../localize-token/localize.token\";\r\nimport { ILoginDialogConfig, ILoginDialogProperties } from \"./localize-logindlg.service\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\n\r\n@Component({\r\n standalone: false,\r\n styles: [`\r\n #login-dlg-wrap {\r\n width: 100%;\r\n max-width: 400px;\r\n margin: 0 auto;\r\n padding: 30px;\r\n height: 100%;\r\n }\r\n \r\n .login-dlg-elm {\r\n margin-top: 1rem;\r\n }\r\n\r\n .login-dlg-elm.login-dlg-suggest {\r\n display: flex ;\r\n align-items: center;\r\n user-select: none;\r\n border-bottom: solid 1px #ddd;\r\n border-radius: 5px;\r\n padding: 5px 10px;\r\n background: #f9f9f9;\r\n box-shadow: 1px 5px 10px -12px #000;\r\n }\r\n \r\n #login-dlg-header {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n \r\n #login-dlg-header h3 {\r\n font-weight: bold;\r\n font-size: 0.9rem;\r\n color: orange;\r\n text-align: center;\r\n }\r\n \r\n #login-logo {\r\n height: 55px;\r\n width: 55px;\r\n /* background: url(\"/assets/images/logo-300px.png\") no-repeat; */\r\n background-size: contain !important;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup {\r\n height: 45px;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon {\r\n height: 45px;\r\n border-radius: 15px 0 0 15px;\r\n width: 50px;\r\n }\r\n #login-dlg-content *{\r\n font-size: .9rem;\r\n /* font-family: 'Lexend', 'Roboto', sans-serif, 'material-icons-round'; */\r\n }\r\n \r\n #login-dlg-content .p-inputgroup .p-inputgroup-addon * {\r\n font-size: 1rem;\r\n }\r\n \r\n #login-dlg-content .p-inputgroup input {\r\n height: 45px;\r\n border-radius: 0 15px 15px 0;\r\n }\r\n \r\n #login-dlg-content button {\r\n height: 45px;\r\n border-radius: 15px;\r\n }\r\n \r\n /*check animation block*/\r\n \r\n .check-animation-wrap {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: calc(100% - 200px);\r\n min-height: 400px;\r\n }\r\n \r\n .check-main-container {\r\n width: 100%;\r\n height: 100vh;\r\n display: flex;\r\n flex-flow: column;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n \r\n .check-container {\r\n width: 6.25rem;\r\n height: 7.5rem;\r\n display: flex;\r\n flex-flow: column;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n \r\n .check-container .check-background {\r\n width: 100%;\r\n height: calc(100% - 1.25rem);\r\n background: linear-gradient(to bottom right, #5de593, #41d67c);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n transform: scale(0.84);\r\n border-radius: 50%;\r\n animation: animateContainer 0.75s ease-out forwards 0.75s;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n }\r\n \r\n .check-container .check-background svg {\r\n width: 65%;\r\n transform: translateY(0.25rem);\r\n stroke-dasharray: 80;\r\n stroke-dashoffset: 80;\r\n animation: animateCheck 0.35s forwards 1.25s ease-out;\r\n min-width: auto !important;\r\n }\r\n \r\n .check-container .check-shadow {\r\n bottom: calc(-15% - 5px);\r\n left: 0;\r\n border-radius: 50%;\r\n background: radial-gradient(closest-side, rgba(73, 218, 131, 1), transparent);\r\n animation: animateShadow 0.75s ease-out forwards 0.75s;\r\n }\r\n \r\n @keyframes animateContainer {\r\n 0% {\r\n opacity: 0;\r\n transform: scale(0);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 25% {\r\n opacity: 1;\r\n transform: scale(0.9);\r\n box-shadow: 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 43.75% {\r\n transform: scale(1.15);\r\n box-shadow: 0px 0px 0px 43.334px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 65px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 62.5% {\r\n transform: scale(1);\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 21.667px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 81.25% {\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n \r\n 100% {\r\n opacity: 1;\r\n box-shadow: 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset, 0px 0px 0px 0px rgba(255, 255, 255, 0.25) inset;\r\n }\r\n }\r\n \r\n @keyframes animateCheck {\r\n from {\r\n stroke-dashoffset: 80;\r\n }\r\n \r\n to {\r\n stroke-dashoffset: 0;\r\n }\r\n }\r\n \r\n @keyframes animateShadow {\r\n 0% {\r\n opacity: 0;\r\n width: 100%;\r\n height: 15%;\r\n }\r\n \r\n 25% {\r\n opacity: 0.25;\r\n }\r\n \r\n 43.75% {\r\n width: 40%;\r\n height: 7%;\r\n opacity: 0.35;\r\n }\r\n \r\n 100% {\r\n width: 85%;\r\n height: 15%;\r\n opacity: 0.25;\r\n }\r\n }\r\n #login-dlg-wrap .loader-wrap {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height:100%;\r\n width:100%;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 100;\r\n background: #ffffff42;\r\n backdrop-filter: blur(1px);\r\n }\r\n\r\n #login-dlg-wrap .login-dlg-loader {\r\n border: 15px solid #e7e7e7;\r\n border-top: 15px solid #52dba1;\r\n border-radius: 50%;\r\n width: 100px;\r\n height: 100px;\r\n animation: spinloader 2s linear infinite;\r\n }\r\n\r\n #login-dlg-wrap .loader-wrap::before {\r\n content: \"\";\r\n position: absolute;\r\n width: 70px;\r\n height: 70px;\r\n transform: translate(-50%, -50%);\r\n z-index: 1;\r\n border: 15px solid #e7e7e700;\r\n border-top: 15px solid #52dba1c9;\r\n border-radius: 50%;\r\n animation: spinloader .75s linear infinite;\r\n }\r\n\r\n @keyframes spinloader {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n template: `<p-toast key=\"$login-dlg\" position=\"top-center\"></p-toast>\r\n <div id=\"login-dlg-wrap\">\r\n <div id=\"login-dlg-header\">\r\n <div id=\"login-logo\" class=\"p-mb-2\" style=\"background: url('{{properties.logoImage}}') no-repeat\"></div>\r\n <h3 *ngIf=\"!success\" [innerHTML]=\"sanitizedTitle\"></h3>\r\n <h3 *ngIf=\"success\" style=\"color:green !important;\">{{properties.loginSuccessMessage}}</h3>\r\n </div>\r\n <div id=\"login-dlg-content\">\r\n <ng-container *ngIf=\"!success\">\r\n <div *ngIf=\"loading\" class=\"loader-wrap\">\r\n <div class=\"login-dlg-loader\"></div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <div class=\"p-inputgroup\">\r\n <span class=\"p-inputgroup-addon\">\r\n <i class=\"material-icons-round\">person</i>\r\n </span>\r\n <input disabled pInputText type=\"text\" placeholder=\"{{properties.username?.placeHolder}}\" [value]=\"decodeToken?.email\" />\r\n </div>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm\">\r\n <div class=\"p-inputgroup\">\r\n <span class=\"p-inputgroup-addon\">\r\n <i class=\"material-icons-round\">lock</i>\r\n </span>\r\n <input [disabled]=\"loading\" (keydown.enter)=\"clickLogin()\" pInputText type=\"password\" \r\n placeholder=\"{{properties.password?.placeHolder}}\" [(ngModel)]=\"password\"\r\n autofocus />\r\n </div>\r\n </div>\r\n <div class=\"login-dlg-elm\">\r\n <button style=\"width: 100%;\" pButton type=\"button\" label=\"{{properties.loginButton?.placeHolder}}\" (click)=\"clickLogin()\"\r\n [disabled]=\"!password || loading\"></button>\r\n </div>\r\n \r\n <div class=\"login-dlg-elm login-dlg-suggest\" style=\"display:flex;align-items: center;user-select: none;\">\r\n <span>{{properties.logoutButton?.message}}</span>\r\n <button class=\"p-button-text\" pButton type=\"button\" label=\"{{properties.logoutButton?.placeHolder}}\" \r\n (click)=\"clickLogout()\"></button>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"success\">\r\n <div style=\"margin-top:35px;\"></div>\r\n <div class=\"check-animation-wrap\">\r\n <div class=\"check-main-container\">\r\n <div class=\"check-container\">\r\n <div class=\"check-background\">\r\n <svg viewBox=\"0 0 65 51\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 25L27.3077 44L58.5 7\" stroke=\"white\" stroke-width=\"13\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>`,\r\n selector: \"app-localize-logindlg\",\r\n providers: [MessageService],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class LocalizeLogindlgComponent implements OnInit {\r\n readonly messageKey = \"$login-dlg\";\r\n password: any;\r\n readonly decodeToken: JwtPayload | null;\r\n loading = false;\r\n success = false;\r\n private get config() { return this.tokenService.config; }\r\n private readonly loginConfig: ILoginDialogConfig\r\n\r\n private logout?: () => any\r\n private loginUrl?: string;\r\n readonly properties: ILoginDialogProperties;\r\n\r\n\r\n constructor(\r\n private readonly messageService: MessageService,\r\n private readonly cdt: ChangeDetectorRef,\r\n private readonly dlgRef: DynamicDialogRef,\r\n private readonly dlgConfig: DynamicDialogConfig,\r\n private readonly tokenService: LocalizeTokenService,\r\n private readonly httpClient: HttpClient,\r\n private readonly sanitizer: DomSanitizer\r\n ) {\r\n this.decodeToken = this.tokenService.decodeRefreshToken;\r\n this.loginConfig = this.dlgConfig.data.loginConfig;\r\n this.properties = this.loginConfig.properties!;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.dlgConfig.closable = false;\r\n this.logout = this.loginConfig.logoutFunc;\r\n this.loginUrl = this.loginConfig.loginUrl\r\n\r\n if (!this.decodeToken) {\r\n this.showMessage(\"error\", \"Token is invalid\");\r\n setTimeout(() => this.logout?.(), 2000);\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.cdt.detectChanges();\r\n }\r\n\r\n async clickLogin() {\r\n if (!this.isValidPassword) {\r\n return this.showMessage(\"error\", \"Password is required and must be at least 6 characters\");\r\n }\r\n\r\n this.loading = true;\r\n const loginRes = await this.login();\r\n if (!loginRes?.status) {\r\n return this.showMessage(\"error\", loginRes.message ?? \"An error occurred\");\r\n }\r\n\r\n this.tokenService.accessToken = loginRes.tokens.accessToken;\r\n const cookieOptions = { expires: this.loginConfig.expire ?? 365 }\r\n LocalizeToken.storage.set(this.config.refreshToken?.name || '', loginRes.tokens.refreshToken, cookieOptions);\r\n this.success = true;\r\n setTimeout(() => {\r\n this.dlgConfig.dismissableMask = true;\r\n this.dlgConfig.modal = false;\r\n this.dlgRef.close(true);\r\n }, 2000);\r\n }\r\n\r\n private async login() {\r\n if (!this.loginUrl?.trim().length) {\r\n this.showMessage(\"error\", \"Login url is required\");\r\n throw new Error(\"Login url is required\");\r\n }\r\n\r\n try {\r\n\r\n if (this.loginConfig.loginFunction) {\r\n console.log(\"Using custom login function\");\r\n return await this.loginConfig.loginFunction(this.decodeToken?.email ?? '', this.password.trim(), this.getHeaders());\r\n }\r\n\r\n return await new Promise<any>((resolve, reject) =>\r\n this.httpClient.post(this.loginUrl!,\r\n { password: this.password.trim() },\r\n { headers: this.getHeaders() }).subscribe({ next: resolve, error: reject }));\r\n\r\n } catch (e: any) {\r\n this.showMessage(\"error\", e.message);\r\n return null;\r\n }\r\n }\r\n\r\n private getHeaders() {\r\n return {\r\n [LocalizeToken.httpHeaders.X_REFRESH_TOKEN]: this.tokenService.refreshToken ?? \"\",\r\n [LocalizeToken.httpHeaders.X_TENANT]: this.tokenService.tenantToken ?? \"\",\r\n };\r\n }\r\n\r\n get isValidPassword(): boolean {\r\n this.loading = false;\r\n return this.properties.passwordValidator\r\n ? this.properties.passwordValidator(this.password)\r\n : this.password && this.password.trim().length >= 6 && this.password.trim().length <= 50;\r\n }\r\n\r\n clickLogout = () => this.logout?.();\r\n\r\n private showMessage(severity: string, summary: string) {\r\n this.messageService.add({ key: this.messageKey, severity, summary });\r\n this.loading = false;\r\n }\r\n\r\n get sanitizedTitle() {\r\n return this.sanitizer.bypassSecurityTrustHtml(this.properties.title ?? '');\r\n }\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\nimport { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog';\nimport { LocalizeLogindlgComponent } from './localize-logindlg.component';\nexport interface ILoginDialogPlaceHolder {\n /**\n * Message to display in the input field, typically used for error messages or hints.\n * This is optional and can be used to provide additional context or instructions to the user.\n */\n message?: string;\n /**\n * Placeholder or label text for the input field\n */\n placeHolder?: string;\n}\n\nexport interface ILoginDialogProperties {\n /**\n * Title of the login dialog\n */\n title?: string;\n loginSuccessMessage?: string;\n /**\n * Logog image path or URL to display in the login dialog\n * If not provided, the \"/assets/images/logo-300px.png\" image will be used.\n */\n logoImage?: string;\n username?: ILoginDialogPlaceHolder;\n password?: ILoginDialogPlaceHolder;\n loginButton?: ILoginDialogPlaceHolder;\n logoutButton?: ILoginDialogPlaceHolder;\n /**\n * Function to validate the password.\n * If not provided, the default validation checks if the password is between 6 and 50 characters long.\n * @param password\n * @returns\n */\n passwordValidator?: (password: string) => boolean;\n}\n\nexport interface ILoginDialogConfig {\n loginUrl?: string;\n logoutUrl?: string;\n loginFunction?: (username: string, password: string, headers?: { [key: string]: string }) => Promise<any>;\n logoutFunc?: () => void;\n /**\n * Cookie expiration date in days from now. If not provided the cookie is a session cookie\n */\n expire?: number;\n /**\n * Configuration for the login dialog.\n * This interface defines the properties that can be used to customize the login dialog's behavior and appearance\n */\n properties?: ILoginDialogProperties;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalizeLogindlgService {\n\n constructor(private readonly injector: Injector) { }\n\n async openLoginDialog(loginConfig: ILoginDialogConfig, config?: DynamicDialogConfig) {\n\n config = this.intercepDialogConfig(config);\n this.initConfig(loginConfig);\n\n config.data = { ...(config.data || {}), ...{ loginConfig } };\n\n const dialogService = this.injector.get(DialogService);\n const dialog = dialogService.open(LocalizeLogindlgComponent, config);\n\n await new Promise<void>((resolve) =>\n dialog.onClose.subscribe(res => {\n if (res) {\n resolve();\n }\n }));\n }\n\n private intercepDialogConfig(config?: DynamicDialogConfig) {\n config ??= {\n header: 'Login',\n style: { 'max-width': '400px', width: '100%', 'height': '650px' },\n modal: true,\n closable: false,\n showHeader: false,\n }\n\n config = {\n ...config, ...{\n contentStyle: { 'height': '100%', 'border-radius': '20px' }\n }\n }\n config.style = { ...config.style, ...{ 'border-radius': '20px' } };\n return config;\n }\n\n\n private initConfig(loginConfig: ILoginDialogConfig) {\n loginConfig ??= {}\n loginConfig.properties ??= {\n title: 'Your session is expired!<br/> Please login again to continue.',\n loginSuccessMessage: 'You have successfully logged in.',\n logoImage: '/assets/images/logo-300px.png',\n username: { placeHolder: 'Username' },\n password: { placeHolder: 'Password' },\n loginButton: { placeHolder: 'Login' },\n logoutButton: {\n message: 'No, I want to login with another user.',\n placeHolder: 'Logout'\n }\n }\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { LocalizeLogindlgComponent } from \"./localize-logindlg.component\";\nimport { InputTextModule } from \"primeng/inputtext\";\nimport { ButtonModule } from \"primeng/button\";\nimport { ToastModule } from 'primeng/toast';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { LocalizeLogindlgService } from \"./localize-logindlg.service\";\n\n@NgModule({\n declarations: [LocalizeLogindlgComponent],\n exports: [LocalizeLogindlgComponent],\n imports: [\n CommonModule,\n ToastModule,\n InputTextModule,\n BrowserModule,\n FormsModule,\n ButtonModule,\n ],\n providers: [LocalizeLogindlgService],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class LocalizeLogindlgModule { }\n","export const LOCALIZE_API_ASSETS = {\r\n network: {\r\n noConnection: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <svg id=\"lze-no-connection\" data-name=\"Layer 2\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 77.29 70.98\">\r\n <defs>\r\n <style> .cls-1 { fill: #fff; } .cls-2, .cls-3 { fill: #e30613; } .cls-3 { stroke: #e30613; stroke-miterlimit: 10; stroke-width: .25px; } </style>\r\n </defs>\r\n <g id=\"Layer_3\" data-name=\"Layer 3\">\r\n <g>\r\n <path class=\"cls-1\" d=\"m73.29,35c-1.2,0-2.33-.53-3.09-1.46-.48-.57-11.23-13.2-31.55-13.2s-31.11,12.66-31.56,13.2c-1.4,1.71-3.92,1.95-5.63.55-1.71-1.4-1.95-3.92-.55-5.63.54-.66,13.47-16.12,37.74-16.12s37.2,15.46,37.74,16.12c1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.61.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m63.96,45.66c-1.19,0-2.32-.53-3.08-1.44-5.79-6.05-13.86-9.39-22.24-9.21-8.38-.18-16.45,3.16-22.24,9.22-1.46,1.65-3.99,1.81-5.64.35-1.57-1.39-1.8-3.77-.52-5.43,7.32-7.89,17.64-12.29,28.4-12.12,10.76-.17,21.08,4.24,28.4,12.12,1.4,1.71,1.15,4.23-.56,5.62-.71.58-1.6.9-2.53.9Z\"/>\r\n <path class=\"cls-1\" d=\"m53.3,56.32c-1.24,0-2.41-.57-3.16-1.55-5.73-6.35-15.52-6.85-21.87-1.13-.4.36-.77.73-1.13,1.13-1.36,1.73-3.88,2.03-5.61.67-1.71-1.34-2.03-3.8-.73-5.54,8.39-9.85,23.18-11.04,33.03-2.65.95.81,1.84,1.69,2.65,2.65,1.34,1.75,1,4.26-.75,5.6-.7.53-1.55.82-2.43.82Z\"/>\r\n </g>\r\n <path class=\"cls-2\" d=\"m47.21,9.45l-4.06,41.36c-.64,5.42-8.39,5.39-9.01,0,0,0-4.06-41.36-4.06-41.36-.46-4.73,2.99-8.94,7.72-9.4,5.33-.58,9.97,4.09,9.4,9.4h0Z\"/>\r\n <circle class=\"cls-3\" cx=\"38.64\" cy=\"64.79\" r=\"6.07\"/>\r\n </g>\r\n </svg>`\r\n }\r\n}","import { HttpErrorResponse } from \"@angular/common/http\";\r\n\r\n/**\r\n * Http method options\r\n */\r\nexport enum EMethod {\r\n POST = 'post',\r\n GET = 'get',\r\n PUT = 'put',\r\n DELETE = 'delete',\r\n PATCH = 'patch',\r\n}\r\n\r\nexport interface IOnConnectionError {\r\n /**\r\n * Callback function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n callback?: (error: HttpErrorResponse) => Promise<void> | any;\r\n /**\r\n * If true, the request will block the screen with overlay on connection errors.\r\n * Default is false.\r\n */\r\n blockScreen?: boolean;\r\n\r\n /** Optional z-index for the block screen overlay.\r\n * Default is 10000.\r\n */\r\n blockScreenZIndex?: number;\r\n\r\n /**\r\n * Optional message to display when a connection error occurs.\r\n */\r\n message?: string;\r\n suggestionMessage?: string;\r\n}\r\n\r\ninterface IRetryOptions {\r\n\r\n /**\r\n * Maximum number of retries for a failed request.\r\n * Default is 100.\r\n */\r\n maxRetries?: number;\r\n\r\n /**\r\n * Delay in milliseconds before retrying a failed request.\r\n * Default is 500ms.\r\n */\r\n delay?: number;\r\n\r\n /**\r\n * Function to determine if a request should be retried based on the error.\r\n * If not provided, the default function will retry for network errors and server errors (status 500-599).\r\n * @param error - The error object from the failed request.\r\n * @returns true if the request should be retried, false otherwise.\r\n */\r\n retryFunction?: (error: HttpErrorResponse) => Promise<boolean> | any;\r\n\r\n /**\r\n * Function to execute when a connection error occurs.\r\n * This function should return a Promise or any value.\r\n */\r\n onConnectionError?: IOnConnectionError;\r\n\r\n}\r\n\r\nexport interface ILocalizeApiConfigs {\r\n onPrepareRequest?: () => Promise<void> | any;\r\n onAutoLogout?: () => Promise<void> | any;\r\n onRevokeUnauthorized?: () => Promise<void> | any;\r\n\r\n waitEachRequest?: {\r\n milliseconds: number;\r\n };\r\n enableRequestCancellation?: boolean;\r\n\r\n /**\r\n * Config for retrying failed requests.\r\n * If not provided, the default retry options will be used.\r\n */\r\n retryOptions?: IRetryOptions;\r\n}\r\n\r\nexport interface IApiOptions {\r\n headers?: { [key: string]: string };\r\n method: EMethod;\r\n requestUrl: string;\r\n requestBody?: any;\r\n isFormData?: boolean;\r\n /**\r\n * If true, the request will use the refresh token for authorization.\r\n */\r\n refreshToken?: boolean;\r\n}\r\n\r\nexport interface IHeader {\r\n [key: string]: string;\r\n}\r\n\r\n// export interface INormalizedError {\r\n// error: any;\r\n// code: string;\r\n// message: string;\r\n// details?: any;\r\n// status: number;\r\n// }\r\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { IApiOptions, ILocalizeApiConfigs, IOnConnectionError } from \"./interfaces\";\r\nimport { takeUntil, catchError, throwError, Subject } from \"rxjs\";\r\nimport { waitFor } from \"../localize.token\";\r\nimport { LOCALIZE_API_ASSETS } from \"./localize.api.assets\";\r\n\r\ninterface IRequestInstance {\r\n client: HttpClient;\r\n destroy$: () => Subject<void>;\r\n}\r\n\r\ninterface IRetryOptions {\r\n maxRetries: () => number;\r\n delay: number;\r\n callback: () => Promise<any> | any;\r\n retryUnless?: (error: any) => boolean;\r\n onError?: (error: any) => Promise<void> | any;\r\n connectionError?: IOnConnectionError\r\n}\r\n\r\nclass LocalizeApiHelper {\r\n\r\n readonly defaultRetryOptions: Partial<IRetryOptions> = {\r\n connectionError: {\r\n message: 'Connection error occurred. Please wait',\r\n blockScreen: true,\r\n blockScreenZIndex: 10000\r\n }\r\n };\r\n\r\n async performRetry<T = any>(options: IRetryOptions): Promise<T> {\r\n let attempts = 0;\r\n let lastError: any;\r\n let consoleCount = 0;\r\n\r\n // Merge default retry options with provided options\r\n options = { ...this.defaultRetryOptions, ...options }\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n\r\n while (attempts < options.maxRetries()) {\r\n try {\r\n const result = await options.callback();\r\n this.removeBlocker(styleElement);\r\n return result;\r\n\r\n } catch (error: any) {\r\n lastError = error;\r\n\r\n if (consoleCount >= 7) {\r\n console.clear();\r\n consoleCount = 0;\r\n }\r\n\r\n if (options.retryUnless && !options.retryUnless(error))\r\n throw error; // If the error should not be retried, rethrow it\r\n\r\n // Handle connection error\r\n styleElement = await this.onConnectionError(options, error);\r\n\r\n if (options.onError)\r\n await this.invokeHook(options.onError.bind(this, error));\r\n\r\n if (attempts >= options.maxRetries() - 1)\r\n throw error;\r\n\r\n attempts++;\r\n consoleCount++;\r\n console.warn(`Attempt ${attempts} failed. Retrying...`, error);\r\n await waitFor(options.delay);\r\n }\r\n }\r\n\r\n console.warn(`Failed after ${options.maxRetries} attempts`);\r\n throw lastError;\r\n }\r\n\r\n async performRequestWithRetry<T = any>(\r\n options: IApiOptions,\r\n config: ILocalizeApiConfigs,\r\n performRequest: <T = any>(options: IApiOptions) => Promise<T>\r\n ): Promise<T> {\r\n\r\n const retryUnless = config.retryOptions?.retryFunction\r\n || this.isConnectionError;\r\n\r\n return await this.performRetry({\r\n connectionError: config.retryOptions?.onConnectionError,\r\n maxRetries: () => config.retryOptions?.maxRetries ?? 1000,\r\n delay: config.retryOptions?.delay ?? 500,\r\n callback: () => performRequest<T>(options),\r\n retryUnless: retryUnless,\r\n })\r\n }\r\n\r\n buildUrl(baseUrl: string, path: string): string {\r\n const normalizedUrl = `${baseUrl.trim().replace(/\\/?$/, '/')}${path.trim().replace(/^\\//, '')}`;\r\n return normalizedUrl.endsWith('/')\r\n ? normalizedUrl.slice(0, -1)\r\n : normalizedUrl;\r\n }\r\n\r\n async invokeHook(callback?: () => Promise<any> | any): Promise<any> {\r\n if (!callback) return;\r\n\r\n const result = callback();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n\r\n createRequest<T = any>(\r\n instance: Required<IRequestInstance>,\r\n method: string,\r\n url: string,\r\n body: any,\r\n options: { headers: HttpHeaders }\r\n ) {\r\n const request$ = instance.client.request<T>(method, url, {\r\n ...options,\r\n body,\r\n observe: 'response',\r\n }).pipe(\r\n takeUntil(instance.destroy$()),\r\n catchError((error: HttpErrorResponse) => {\r\n // Convert to a non-observable error to handle in the promise\r\n return throwError(() => error);\r\n })\r\n );\r\n\r\n return request$;\r\n }\r\n\r\n defaultRetryFunction(error: HttpErrorResponse): boolean {\r\n\r\n // Don't retry for other errors (like 400, 401, 403, etc.)\r\n if (!this.isConnectionError(error))\r\n throw error;\r\n\r\n return true;\r\n }\r\n\r\n isConnectionError(error: HttpErrorResponse): boolean {\r\n const isNetworkError = error.status === 0;\r\n const isServerError = error.status >= 1000 && error.status < 600;\r\n return isNetworkError || isServerError;\r\n }\r\n\r\n async onConnectionError(\r\n options: IRetryOptions,\r\n error: any\r\n ): Promise<Promise<void> | any> {\r\n\r\n if (!options.connectionError)\r\n return;\r\n\r\n let styleElement: HTMLStyleElement | undefined;\r\n if (this.isConnectionError(error)) {\r\n\r\n styleElement = this.screenBlocker(options, error, true);\r\n\r\n await this.invokeHook(options.connectionError.callback?.bind(this, error));\r\n return styleElement;\r\n } else {\r\n this.screenBlocker(options, error, false);\r\n styleElement?.remove();\r\n }\r\n }\r\n\r\n screenBlocker(optons: IRetryOptions,\r\n error?: HttpErrorResponse,\r\n add: boolean = true): HTMLStyleElement | undefined {\r\n\r\n if (!optons.connectionError?.blockScreen)\r\n return;\r\n\r\n const message = optons.connectionError?.message\r\n || 'Connection error occurred. Please wait';\r\n const errorMessage = error?.error?.message || 'An error occurred';\r\n const suggestinMessage = optons.connectionError?.suggestionMessage\r\n || 'Please check your internet connection or the server status.';\r\n\r\n const zIndex = optons.connectionError?.blockScreenZIndex || 10000;\r\n\r\n const body = document.body;\r\n const blcokerHtml = `\r\n <div class=\"lze-blocker\">\r\n ${LOCALIZE_API_ASSETS.network.noConnection}\r\n <div class=\"lze-blocker__message\">\r\n ${message}\r\n <span class=\"lze-blocker__dotting\">\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n <span class=\"lze-blocker__dot\"></span>\r\n </span>\r\n </div>\r\n <div class=\"lze-blocker__error\">${errorMessage}</div>\r\n <div class=\"lze-blocker__error_suggestion\">${suggestinMessage}</div>\r\n </div>\r\n `;\r\n const style = `\r\n div.lze-blocker {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.85) !important;\r\n z-index: ${zIndex};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n color: #fff !important;\r\n font-family: Arial, sans-serif;\r\n text-align: center;\r\n padding: 20px;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n svg#lze-no-connection {\r\n width: 75px;\r\n height: 75px;\r\n margin-bottom: 20px;\r\n }\r\n \r\n div.lze-blocker__message {\r\n color: #fff !important;\r\n font-size: 18px !important;\r\n margin-bottom: 10px;\r\n }\r\n \r\n .lze-blocker__dotting {\r\n display: inline-block;\r\n vertical-align: middle;\r\n }\r\n span.lze-blocker__dot {\r\n display: inline-block;\r\n width: 7px;\r\n height: 7px;\r\n background-color: #ffffff !important;\r\n border-radius: 50%;\r\n margin-left: 3px;\r\n opacity: 0.3;\r\n animation: dotting 1s infinite;\r\n }\r\n .lze-blocker__dot:nth-child(1) {\r\n animation-delay: 0s;\r\n opacity: 1;\r\n }\r\n .lze-blocker__dot:nth-child(2) {\r\n animation-delay: 0.2s;\r\n }\r\n .lze-blocker__dot:nth-child(3) {\r\n animation-delay: 0.4s;\r\n }\r\n\r\n @keyframes dotting {\r\n 0%, 80%, 100% { opacity: 0.3; }\r\n 40% { opacity: 1; }\r\n }\r\n\r\n div.lze-blocker__error {\r\n color: #f00;\r\n font-size: 14px !important;\r\n margin-bottom: 10px;\r\n text-shadow: 0 0 1px #ff5f5f !important;\r\n }\r\n\r\n div.lze-blocker__error_suggestion {\r\n color: #ccc !important;\r\n font-size: 14px !important;\r\n margin-top: 10px;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `;\r\n\r\n const styleElement = document.createElement('style');\r\n\r\n if (add) {\r\n if (!document.querySelector('.lze-blocker')) {\r\n styleElement.innerHTML = style;\r\n document.head.appendChild(styleElement);\r\n body.insertAdjacentHTML('beforeend', blcokerHtml);\r\n }\r\n } else {\r\n this.removeBlocker(styleElement);\r\n }\r\n\r\n return styleElement;\r\n }\r\n\r\n private removeBlocker(styleElement: HTMLStyleElement | undefined): void {\r\n const blocker = document.querySelector('.lze-blocker');\r\n blocker?.remove();\r\n styleElement?.remove();\r\n }\r\n}\r\n\r\nexport const ApiHelper = new LocalizeApiHelper();","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { LocalizeTokenService } from \"./localize.token.service\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders } from \"@angular/common/http\";\r\nimport { LocalizeToken, waitFor, waitUntil } from \"./localize.token\";\r\nimport { BehaviorSubject, Subject } from \"rxjs\";\r\nimport { ILocalizeApiConfigs, IApiOptions, EMethod, IHeader } from \"./helpers/interfaces\";\r\nimport { ApiHelper } from \"./helpers/loccalize.api.helper\";\r\n\r\nconst SCHEMES = LocalizeToken.httpHeaders;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiService implements OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private readonly configSubject = new BehaviorSubject<Partial<ILocalizeApiConfigs>>({});\r\n readonly isRequestingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isResolvingStartupSubject = new BehaviorSubject<boolean>(false);\r\n get isResolvingStartup() { return this.isResolvingStartupSubject.value; }\r\n\r\n get needTenant(): boolean { return this.localizeTokenService.config.tenantToken !== undefined; }\r\n\r\n get isRequesting() { return this.isRequestingSubject.value; }\r\n get isRevokingToken() { return this.localizeTokenService.isRevokingToken; }\r\n set isRevokingToken(value: boolean) { this.localizeTokenService.isRevokingToken = value; }\r\n\r\n get accessToken(): string | undefined { return this.localizeTokenService.accessToken; }\r\n set accessToken(value: string | undefined) { this.localizeTokenService.accessToken = value; }\r\n\r\n get refreshToken(): string | undefined { return this.localizeTokenService.refreshToken; }\r\n get tenantToken(): string | undefined { return this.localizeTokenService.tenantToken; }\r\n\r\n private defaultConfig: Partial<ILocalizeApiConfigs> = {\r\n waitEachRequest: { milliseconds: 0 },\r\n enableRequestCancellation: true,\r\n\r\n retryOptions: {\r\n maxRetries: 1000,\r\n delay: 1000,\r\n retryFunction: ApiHelper.defaultRetryFunction.bind(this),\r\n },\r\n\r\n };\r\n\r\n private get config(): Partial<ILocalizeApiConfigs> {\r\n this.validateConfig();\r\n return this.configSubject.value;\r\n }\r\n\r\n private apiOptions: Partial<IApiOptions> = {\r\n method: EMethod.GET,\r\n requestBody: null,\r\n };\r\n\r\n constructor(readonly httpClient: HttpClient,\r\n private readonly localizeTokenService: LocalizeTokenService\r\n ) { }\r\n\r\n /**\r\n * Initialize the API service.\r\n * @param apiConfigs - The API configurations.\r\n */\r\n init(apiConfigs: ILocalizeApiConfigs) {\r\n console.log('LocalizeApiService is initialized.');\r\n this.configSubject.next({ ...this.defaultConfig, ...apiConfigs });\r\n }\r\n\r\n cancelPendingRequests(): void {\r\n this.config.enableRequestCancellation\r\n && this.destroy$.next();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * A higher-order function that returns a curried function for making API requests.\r\n *\r\n * @param baseUrl - The base URL of the API.\r\n * @returns A curried function that can be used to make API requests.\r\n */\r\n func = (baseUrl: string) =>\r\n <T = any>(path: string, method: EMethod = EMethod.GET, reqBody: any = null, reqHeaders?: IHeader) =>\r\n this.request<T>(baseUrl, path, method, reqBody, reqHeaders)\r\n\r\n public async request<T = any>(baseUrl: string,\r\n path: string,\r\n method: EMethod = EMethod.GET,\r\n reqBody: any = null,\r\n reqHeaders?: IHeader): Promise<T> {\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 500);\r\n\r\n await ApiHelper.invokeHook(this.config.onPrepareRequest);\r\n\r\n const apiOptions = this.buildApiOptions(baseUrl, path, method, reqBody, reqHeaders);\r\n\r\n try {\r\n await this.toWaitForPreviousRequest();\r\n\r\n return await ApiHelper.performRequestWithRetry<T>(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n }\r\n catch (error: any) {\r\n return await this.handleOnRequestError(error, apiOptions);\r\n }\r\n }\r\n\r\n private async handleOnRequestError(error: HttpErrorResponse, options: IApiOptions): Promise<any> {\r\n if (error.status !== 401)\r\n throw error;\r\n\r\n await waitUntil(() => !this.isResolvingStartup, 50);\r\n\r\n return await ApiHelper.performRetry({\r\n maxRetries: () => 1000,\r\n delay: 10,\r\n retryUnless: (error) => error.status === 401 || ApiHelper.isConnectionError(error),\r\n callback: async () => {\r\n // Only handle 401 Unauthorized errors\r\n await this.revokeToken();\r\n\r\n // Retry the request with the new access token\r\n return await this.performRequest(options);\r\n }\r\n })\r\n\r\n }\r\n\r\n private async performRequest<T = any>(options: IApiOptions): Promise<T> {\r\n\r\n // Build the request options\r\n const buildOptions = { headers: this.buildHeaderOptions(options) };\r\n\r\n // Create the request observable\r\n const request$ = ApiHelper.createRequest<T>({\r\n client: this.httpClient,\r\n destroy$: () => this.destroy$\r\n }, options.method, options.requestUrl, options.requestBody, buildOptions);\r\n\r\n // Set the isRequesting state to true before making the request\r\n this.isRequestingSubject.next(true);\r\n\r\n const response = await new Promise<any>((resolve, reject) =>\r\n request$.subscribe({ next: (res) => resolve(res.body), error: reject }));\r\n\r\n // Reset the isRequesting state after the request completes\r\n this.isRequestingSubject.next(false);\r\n\r\n return response;\r\n }\r\n\r\n private async revokeToken(): Promise<void> {\r\n\r\n try {\r\n if (await this.interceptRevokeToken())\r\n return;\r\n\r\n this.isRevokingToken = true;\r\n\r\n const apiOptions: IApiOptions = {\r\n ...this.buildApiOptions(this.localizeTokenService.config.refreshToken?.requestUrl || ''),\r\n refreshToken: true,\r\n }\r\n\r\n // const revokeToken = await this.performRequest(apiOptions);\r\n const revokeToken = await ApiHelper.performRequestWithRetry(\r\n apiOptions,\r\n this.config,\r\n this.performRequest.bind(this)\r\n );\r\n\r\n await this.handleOnTokenRevoked(revokeToken);\r\n\r\n } catch (error: any) {\r\n // Handle the error, log it\r\n await ApiHelper.invokeHook(this.config.onAutoLogout);\r\n throw error;\r\n\r\n } finally {\r\n // Reset the revoking token state\r\n this.isRevokingToken = false;\r\n }\r\n }\r\n\r\n /** default http request options */\r\n private buildHeaderOptions(options: IApiOptions): HttpHeaders {\r\n\r\n const headers: { [key: string]: string } = {\r\n ...(options.refreshToken && { [SCHEMES.X_REFRESH_TOKEN]: `${this.refreshToken}` }),\r\n ...(!options.isFormData && { [SCHEMES.CONTENT_TYPE]: 'application/json' }),\r\n [SCHEMES.AUTHORIZATION]: `Bearer ${this.accessToken}`,\r\n ...(this.needTenant && { [SCHEMES.X_TENANT]: `${this.tenantToken}` })\r\n };\r\n\r\n return new HttpHeaders({ ...headers, ...options.headers });\r\n }\r\n\r\n private buildApiOptions(\r\n baseUrl: string,\r\n path: string = '',\r\n method: EMethod = EMethod.GET,\r\n requestBody: any = null,\r\n headers?: { [key: string]: string }\r\n ): IApiOptions {\r\n\r\n const requestUrl = ApiHelper.buildUrl(baseUrl, path);\r\n const isFormData = requestBody && requestBody instanceof FormData;\r\n return {\r\n ...this.apiOptions,\r\n ...{ headers, method, requestUrl, requestBody, isFormData }\r\n };\r\n }\r\n\r\n\r\n private async toWaitForPreviousRequest() {\r\n if (this.isRevokingToken) {\r\n await waitUntil(() => !this.isRevokingToken);\r\n }\r\n\r\n // to wait for each request in 50ms, even if the request is not completed\r\n const waitMilliseconds = this.config.waitEachRequest?.milliseconds;\r\n if (waitMilliseconds && this.isRequesting) {\r\n // console.warn(`Request throttling: Another request is in progress. Waiting for ${waitMilliseconds}ms.`);\r\n await waitFor(waitMilliseconds, this.isRequesting);\r\n }\r\n }\r\n\r\n\r\n private async handleOnTokenRevoked(response: any): Promise<void> {\r\n\r\n if (response?.status) {\r\n // If the response is successful, update the access token\r\n this.accessToken = response.message;\r\n\r\n } else {\r\n // If the response indicates an error, invoke the onRevokeUnauthorized hook\r\n console.warn('Token revocation failed, refresh token is expired.', response.message);\r\n await ApiHelper.invokeHook(this.config.onRevokeUnauthorized);\r\n }\r\n\r\n }\r\n\r\n private async interceptRevokeToken() {\r\n\r\n if (this.isRevokingToken) {\r\n console.warn('Token is already being revoked. Waiting for the current operation to complete...');\r\n await waitUntil(() => !this.isRevokingToken);\r\n return true;\r\n }\r\n\r\n if (!this.refreshToken) {\r\n // await ApiHelper.invokeHook(this.apiConfigs.onAutoLogout);\r\n throw new Error('Refresh token is missing. Please login again.');\r\n }\r\n return false;\r\n }\r\n\r\n validateConfig(): void {\r\n if (this.localizeTokenService.config.requiredTenant\r\n && !this.localizeTokenService.config.tenantToken?.name?.trim().length) {\r\n throw Error('Tenant token is required but tenantTokenName is not configured');\r\n }\r\n\r\n if (!this.localizeTokenService.config.refreshToken?.requestUrl?.trim().length) {\r\n throw Error('Revoke token URL is not configured - token refresh will not work');\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { LocalizeTokenService } from './localize.token.service';\r\nimport { LocalizeApiService } from './localize.api.service';\r\n\r\n@NgModule({\r\n providers: [\r\n LocalizeTokenService,\r\n LocalizeApiService\r\n ]\r\n})\r\nexport class LocalizeTokenModule { }","import { Injectable } from '@angular/core';\r\nimport { LocalizeLogindlgService } from '../localize-logindlg/localize-logindlg.service';\r\nimport { ILocalizeApiConfigs } from '../localize-token/helpers/interfaces';\r\nimport { LocalizeApiService } from '../localize-token/localize.api.service';\r\nimport { ILocalizeTokenConfig } from '../localize-token/localize.token';\r\nimport { LocalizeTokenService } from '../localize-token/localize.token.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalizeApiTokenService {\r\n readonly api: LocalizeApiService;\r\n readonly token: LocalizeTokenService;\r\n readonly loginDialog: LocalizeLogindlgService;\r\n\r\n constructor(tokenService: LocalizeTokenService,\r\n apiService: LocalizeApiService,\r\n loginDialogService: LocalizeLogindlgService) {\r\n this.api = apiService;\r\n this.token = tokenService;\r\n this.loginDialog = loginDialogService;\r\n }\r\n\r\n initialize(tokenConfig: ILocalizeTokenConfig, apiConfig: ILocalizeApiConfigs) {\r\n // Initialize the LocalizeTokenService with the provided token configuration\r\n this.token.init(tokenConfig);\r\n\r\n // Initialize the LocalizeApiService with the provided API configuration\r\n this.api.init(apiConfig);\r\n\r\n console.log('LocalizeApiTokenService initialized with token and API configurations.');\r\n\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LocalizeLogindlgModule } from '../localize-logindlg/localize-logindlg.module';\r\nimport { LocalizeTokenModule } from '../localize-token/localize.token.module';\r\nimport { LocalizeApiTokenService } from './localize-api-token.service';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n LocalizeTokenModule,\r\n LocalizeLogindlgModule\r\n ],\r\n providers: [\r\n LocalizeApiTokenService\r\n ]\r\n})\r\nexport class LocalizeApiTokenModule { }\r\n","//#region login dialog\r\nexport * from './localize-logindlg/localize-logindlg.component'\r\nexport * from './localize-logindlg/localize-logindlg.module'\r\nexport * from './localize-logindlg/localize-logindlg.service'\r\n\r\n//#region localize token\r\nexport * from './localize-token/helpers/localize.api.assets';\r\nexport * from './localize-token/helpers/interfaces';\r\nexport * from './localize-token/helpers/loccalize.api.helper';\r\nexport * from './localize-token/localize.token.service';\r\nexport * from './localize-token/localize.token';\r\nexport * from './localize-token/localize.token.storage';\r\nexport * from './localize-token/localize.token.module';\r\nexport * from './localize-token/localize.api.service';\r\n\r\n//#region localize api token\r\nexport * from './localize-api-token/localize-api-token.service';\r\nexport * from './localize-api-token/localize-api-token.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.LocalizeTokenService","i1","i2.LocalizeTokenService","i1.LocalizeTokenService","i2.LocalizeApiService","i3.LocalizeLogindlgService"],"mappings":"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"}
|