{"version":3,"file":"main.js","mappings":"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A,eACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,cACA,iBACA,eACA,kBACA,eACA,kBACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,WACA,cACA,WACA,cACA,YACA,eACA,aACA,gBACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,qBACA,kBACA,qBACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,WACA,cACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,WACA,cACA,YACA,eACA,UACA,aACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,eACA,kBACA,cACA,iBACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,iBACA,oBACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,aACA,gBACA,YACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,eACA,kBACA,YACA,eACA,YACA,eACA,WACA,iBACA,oBACA,cACA,UACA,aACA,iBACA,oBACA,WACA,cACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,mBAIA,SAAAic,EAAAvL,GACA,IAAAwL,EAAAC,EAAAzL,GACA,OAAAgI,EAAAwD,EACA,CACA,SAAAC,EAAAzL,GACA,IAAAgI,EAAA0D,EAAApc,EAAA0Q,GAAA,CACA,IAAA3G,EAAA,IAAAc,MAAA,uBAAA6F,EAAA,KACA,MAAA3G,EAAA+J,KAAA,mBACA/J,CACA,CACA,OAAA/J,EAAA0Q,EACA,CACAuL,EAAA/Y,KAAA,WACA,OAAAD,OAAAC,KAAAlD,EACA,EACAic,EAAAlJ,QAAAoJ,EACAE,EAAAC,QAAAL,EACAA,EAAAC,GAAA","names":["AppComponent","constructor","primengConfig","appTranslationService","codebooksService","appThemeService","this","menuMode","ngOnInit","ripple","document","documentElement","style","fontSize","loadApp","_this","_asyncToGenerator","initApp","preloadCodebooks","initTheme","i0","i1","i2","i3","i4","selectors","decls","vars","consts","template","rf","ctx","DevComponent","route","routeSub","queryParams","subscribe","params","decodeURIComponent","user","userLoadedRemotely","ngOnDestroy","unsubscribe","CODEBOOK_ITEMS","faculties","departments","biblioCategories","CodebooksService","http","storageKey","preferencesChanged","Subject","values","isLoading","getFaculties","get","environment","API_URL","pipe","map","res","items","getDepartments","facultyId","getBiblioCategoryCodebook","BASE_API_URL","key","defaultValue","undefined","of","Observable","observer","data","next","value","complete","checkDataFromLocalStorage","firstValueFrom","set","localData","window","localStorage","getItem","JSON","parse","save","saveToLocalStorage","setItem","stringify","_this2","factory","ɵfac","providedIn","ThemesEnum","DEFAULT","themesList","name","properties","AppThemeService","LOCAL_STORAGE_KEY","getFromLocalStorage","getThemeByName","find","theme","getCurrentTheme","currentTheme","getThemes","setTheme","Object","keys","forEach","property","setProperty","storeToLocalStorage","themeName","AppRedirectService","router","cookieService","redirectLogin","sendReturnUrl","production","isLocal","location","href","AUTH_REDIRECT_URL","encodeURIComponent","LOCAL_FRONTEND_URL","expires","Date","now","AUTH_RETURN_URL_COOKIE_EXPIRATION","AUTH_BASE_COOKIE_DOMAIN","check","delete","BASE_FRONTEND_URL","redirect","url","redirectEpc","APP_URL_EPC","redirectEtd","APP_URL_ETD","redirectIsbn","APP_URL_ISBN","redirectRoombook","APP_URL_ROOMBOOK","redirectZp","APP_URL_ZP","redirectUik","APP_URL_UIK","redirectHelpdesk","APP_URL_HELPDESK","redirectTools","APP_URL_TOOLS","redirectAlfred","APP_URL_ALFRED","redirectLibadmin","APP_URL_LIBADMIN","DOCUMENT","AUTH_TOKEN_REFRESH_INTERVAL","AUTH_TOKEN_EXPIRATION_THRESHOLD","AUTH_TOKEN_EXPIRATION_CHECK_THRESHOLD","AUTH_REFRESH_TOKEN_EXPIRATION_THRESHOLD","AUTH_BASE_URL","getBaseApiUrl","BASE_URL","SYSTEM_NAME","getAuthBaseCookieDomain","getAppRedirectUrl","systemName","_","getAuthRedirectUrl","getBaseFrontendUrl","UkAppsEnum","EPC","ETD","ISBN","ROOMBOOK","ZP","UIK","HELPDESK","TOOLS","LIBADMIN","ALFRED","API_LOGIN","API_LOGOUT","API_GET_EMPLOYMENTS","API_CHANGE_EMPLOYMENT","getLoginUrl","getLogoutUrl","getEmploymentsUrl","changeEmploymentUrl","ALLOWED_ROLE_PREFIX","HELIOS","ALLOWED_GENERAL_ROLES","LoginResourceModel","login","password","sessionGuid","refreshToken","localStorageToken","toLowerCase","AuthenticationService","encryptData","decryptData","saveAuthData","response","encrypted","refresh_expires","access_token","refresh_token","session_guid","toString","getStoredAuthData","sessionJson","StringUtils","isNullOrWhitespace","decrypted","removeItem","e","console","error","updateAuthData","jsonData","currentUser","updateCurrentUser","accessToken","expirationTime","refreshExpirationTime","getLoggedUser","getServerLocalTimeDifference","xmlHttp","XMLHttpRequest","Error","open","setRequestHeader","send","serverTime","moment","getResponseHeader","localTime","diff","checkExpirationTime","isExpirationTimeClosingLimit","checkRefreshExpirationTime","isSessionExpired","checkSystemAccessPermission","toUpperCase","roles","some","role","includes","tokenRefreshInProgress","mIsRefreshingToken","appRedirectService","log","errorMessage","removeUserAndCookie","clearInterval","mRefreshTokenInterval","setInterval","getNewToken","err","saveLoggedUserFromEncrypted","cipher","parsed","saveUserCookie","checkUser","checkTokenRefreshRequirement","getEmployments","httpOptions","headers","HttpHeaders","Authorization","post","catchError","changeEmployment","employmentCode","body","username","logout","token","resultHandler","isExternal","returnUrl","SYSTEM_NAME_AUTH","checkForUserCookie","throwError","EMPTY","responseType","result","type","updateSessionFromCookie","session","cookie","getUserCookie","isUpdateFromCookieValid","cookieExp","expires_in","Number","parseInt","userExp","_fromCookie","chunks","splitStringIntoChunks","baseCookieName","chunk","index","length","partsCountStr","partsCount","isNaN","encryptedData","i","str","chunkSize","push","slice","AuthInterceptor","injector","calledLogout","tokenRefreshedSubject","tokenRefreshed","asObservable","interruptLogout","intercept","req","authenticationService","headersToSet","has","clone","setHeaders","handle","tap","HttpResponse","status","HttpErrorResponse","CURRENT_API_HOST_URL","getSessionValidityCheckUrl","switchMap","refreshError","setInterruptLogout","subscriber","currentSession","d","DirectivesModule","AppMissingTranslationService","MissingTranslationHandler","super","missingKeys","load","getMissingKeys","loaded","AppTranslationService","translateService","_changedLanguageSubject","changedLanguage","currentLanguage","_currentLanguage","hasSavedLanguage","switchLanguage","language","Promise","resolve","availableLanguages","indexOf","reject","asPromise","use","then","navigator","languages","testedLang","simplifyLanguageCode","defaultLocale","setDefaultLang","returnedPromise","initTranslatePlaceholderFunction","code","substring","I18nModule","imports","LangSwitcherModule","HttpLoaderFactory","TranslateHttpLoader","CommonModule","input","translateRightNow","translate","instant","UserRolePipe","getCurrentUserRoles","transform","requestedRoles","reverse","pure","AUTH","PROD_HOST","PROD_HOST_PORT","PROD_API_HOST","PROD_API_HOST_PORT","DEV_HOST","DEV_HOST_PORT","DEV_API_HOST","DEV_API_HOST_PORT","getClientProtocol","getCurrentApiHost","getApiProtocol","useHttps","isNullOrEmpty","REGEX__CONTAINS_ONLY_WHITESPACE","RegExp","extractNumericValueFromCSS","s","parseFloat","nullOrEmpty","onlyWhitespace","test","mergeRoutes","baseRoute","routes","processedBaseRoute","substr","processedRoutes","processedRoute","concat","normalizeStringForSearch","caseConversion","accentInsensitive","normalizationForm","normalize","replace","organizationName","organizationWebsiteUrl","organizationSupportEmail","epcSupportEmail","organizationSupportPhone","userRoles","SuperAdmin","UK_ADMIN","All","AuthGuard","canActivate","state","development","path","navigate","AppRoutingModule","RouterModule","forRoot","component","pathMatch","loadChildren","all","__webpack_require__","bind","m","ApplicationModule","PublicSectionModule","scrollPositionRestoration","anchorScrolling","InlineLoaderModule","RoleGuard","userRolePipe","POSSIBLE_ROLES","CURRENT_USER_ROLES","rols","AUTH_INTERCEPTOR_PROVIDER","provide","HTTP_INTERCEPTORS","useClass","multi","CookieService","PercentageSignTranslateParser","TranslateDefaultParser","regexp","interpolate","expr","innerPart","__ngFactoryType__","AppThemeModule","AppModule","bootstrap","LocationStrategy","HashLocationStrategy","MessageService","TranslatePipe","BrowserModule","FormsModule","HttpClientModule","BrowserAnimationsModule","MyCommonModule","TranslateModule","loader","TranslateLoader","useFactory","deps","HttpClient","parser","TranslateParser","missingTranslationHandler","useExisting","MessagesModule","ToastModule","ProgressSpinnerModule","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","webpackContext","id","webpackContextResolve","o","module","exports"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/app.component.ts","./src/app/app.component.html","./src/app/application/dev/dev.component.ts","./src/app/application/dev/dev.component.html","./src/app/application/services/codebooks.service.ts","./src/app/application/theme/themes-list.ts","./src/app/application/theme/app-theme.service.ts","./src/app/common/auth/app-redirect.service.ts","./src/app/common/auth/auth-constants.ts","./src/app/common/auth/auth.urls.ts","./src/app/common/allowed-role-prefix.ts","./src/app/common/auth/model/login-resource.model.ts","./src/app/common/auth/authentication.service.ts","./src/app/common/auth/interceptors/auth.interceptor.ts","./src/app/common/directives/directives.module.ts","./src/app/common/i18n/app-missing-translation.service.ts","./src/app/common/i18n/app-translation.service.ts","./src/app/common/i18n/i18n.module.ts","./src/app/common/i18n/lang-switcher/lang-switcher.module.ts","./src/app/common/i18n/translate-placeholder.ts","./src/app/common/pipes/user-role.pipe.ts","./src/app/common/uk-apps.ts","./src/app/common/urls.ts","./src/app/common/utils/string-utils.ts","./src/environments/environment.dev.ts","./src/app/common/auth/guards/auth.guard.ts","./src/app/app-routing.module.ts","./src/app/common/components/inline-loader/inline-loader.module.ts","./src/app/common/auth/guards/role.guard.ts","./src/app/common/auth/interceptors/auth-interceptor.provider.ts","./src/app/common/common.module.ts","./src/app/common/i18n/percentage-sign-translate-parser.ts","./src/app/application/theme/app-theme.module.ts","./src/app/app.module.ts","./src/main.ts","./node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["import {Component} from '@angular/core';\nimport {PrimeNGConfig} from 'primeng/api';\nimport {AppTranslationService} from './common/i18n/app-translation.service';\nimport {CodebooksService} from './application/services/codebooks.service';\nimport {AppThemeService} from './application/theme/app-theme.service';\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styles: [`\n\n #loading {\n position: fixed;\n z-index: 999999;\n height: 100vh;\n width: 100vw;\n top: 0;\n left: 0;\n background: rgba(0, 0, 0, 0.27);\n display: none;\n justify-content: center;\n align-items: center;\n }\n\n `]\n})\n\nexport class AppComponent {\n\n menuMode = 'static';\n\n constructor(\n private primengConfig: PrimeNGConfig,\n private appTranslationService: AppTranslationService,\n private codebooksService: CodebooksService,\n private appThemeService: AppThemeService\n ) {\n }\n\n ngOnInit() {\n this.primengConfig.ripple = true;\n document.documentElement.style.fontSize = '14px';\n this.loadApp();\n }\n\n async loadApp() {\n const res = await this.appTranslationService.initApp();\n\n await this.codebooksService.preloadCodebooks();\n\n this.appThemeService.initTheme();\n }\n}\n","\n\n\n\n
\n\n \n\n
\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ActivatedRoute } from '@angular/router';\n\n@Component({\n selector: 'app-dev',\n templateUrl: './dev.component.html',\n styleUrls: ['./dev.component.scss'],\n})\nexport class DevComponent implements OnInit, OnDestroy {\n userLoadedRemotely: boolean;\n\n private routeSub: Subscription;\n\n constructor(private route: ActivatedRoute) {}\n\n ngOnInit(): void {\n this.routeSub = this.route.queryParams.subscribe(params => {\n const userParam = decodeURIComponent(params.user);\n\n if (userParam) {\n this.userLoadedRemotely = true;\n }\n });\n }\n\n ngOnDestroy(): void {\n if (this.routeSub) {\n this.routeSub.unsubscribe();\n }\n }\n}\n","
\n
\n
\n
\n
\n
\n
\n
\n DEVELOPMENT MODE\n
\n
\n
\n
\n
\n User loaded remotely:\n
\n
\n {{userLoadedRemotely && 'TRUE' || 'FALSE'}}\n
\n
\n
\n
\n
\n
\n
\n
\n","import {Injectable} from '@angular/core';\nimport {firstValueFrom, Observable, of, Subject} from 'rxjs';\nimport {HttpClient} from '@angular/common/http';\nimport {environment} from '../../../environments/environment.dev';\nimport {map} from 'rxjs/operators';\n\nexport enum CODEBOOK_ITEMS {\n faculties = \"faculties\",\n departments = \"departments\",\n biblioCategories = \"biblioCategories\"\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CodebooksService {\n\n protected storageKey = 'codebookItems';\n\n preferencesChanged: Subject = new Subject();\n\n protected values: { [key: string]: any } = {};\n\n private isLoading: { [key: string]: boolean } = {};\n\n constructor(\n private http: HttpClient\n ) {\n }\n\n getFaculties(): Observable {\n return this.http.get(`${environment.API_URL}/codebook/getFacultiesWithHistorical`).pipe(map((res: any) => res.items));\n }\n\n getDepartments(facultyId: number = null): Observable {\n if (facultyId === null) {\n return this.http.get(`${environment.API_URL}/codebook/getDepartments`).pipe(map((res: any) => res.items));\n }\n return this.http.get(`${environment.API_URL}/codebook/getDepartments/${facultyId}`).pipe(map((res: any) => res.items));\n }\n\n getBiblioCategoryCodebook(): Observable {\n return this.http.get(`${environment.BASE_API_URL}/epc/api/codebook/getAllBiblioCategoryCodebook`).pipe(map((res: any) => res));\n }\n\n async get(key: string, defaultValue = undefined) {\n if (typeof this.values[key] !== \"undefined\") {\n return this.values[key];\n }\n\n if (this.values[key]) {\n return of(this.values[key]);\n }\n\n if (this.isLoading[key]) {\n return new Observable((observer) => {\n this.preferencesChanged.subscribe((data) => {\n if (data.key === key) {\n observer.next(data.value);\n observer.complete();\n }\n });\n });\n }\n\n let items = [];\n\n items = this.checkDataFromLocalStorage(key);\n\n if (!items) {\n this.isLoading[key] = true;\n\n switch (key) {\n case CODEBOOK_ITEMS.faculties:\n items = await firstValueFrom(this.getFaculties());\n break;\n case CODEBOOK_ITEMS.departments:\n items = await firstValueFrom(this.getDepartments());\n break;\n case CODEBOOK_ITEMS.biblioCategories:\n items = await firstValueFrom(this.getBiblioCategoryCodebook());\n break;\n }\n }\n\n if (items) {\n this.isLoading[key] = false;\n\n this.values[key] = items;\n\n this.set(key, items, true);\n }\n\n return items;\n }\n\n checkDataFromLocalStorage(key: string) {\n const localData = window.localStorage.getItem(this.storageKey);\n if (localData) {\n const data = JSON.parse(localData);\n if (data[key]) {\n return data[key];\n }\n }\n return null;\n }\n\n set(key: string, value: any, save = true) {\n this.values[key] = value;\n if (save) {\n this.saveToLocalStorage();\n }\n this.preferencesChanged.next({ key, value });\n }\n\n saveToLocalStorage() {\n window.localStorage.setItem(this.storageKey, JSON.stringify(this.values));\n }\n\n async preloadCodebooks() {\n await this.get(CODEBOOK_ITEMS.faculties);\n await this.get(CODEBOOK_ITEMS.departments);\n }\n}\n","import { Theme } from \"./theme\";\n\nexport enum ThemesEnum {\n DEFAULT = 'default'\n}\n\nexport const themesList: Theme[] = [\n {\n name: ThemesEnum.DEFAULT,\n properties: {\n '--header-bg': '#111',\n '--footer-bg': '#111',\n '--sidebar-bg': '#111',\n\n '--header-text-color': '#fff',\n '--footer-text-color': '#A0A0A0',\n\n '--tuke-color': '#A59466'\n }\n }\n]\n","import { Injectable } from '@angular/core';\nimport { ThemesEnum, themesList } from \"./themes-list\";\nimport { Theme } from \"./theme\";\n\n@Injectable()\nexport class AppThemeService {\n\n currentTheme: Theme;\n\n LOCAL_STORAGE_KEY = 'app-theme';\n\n constructor() { }\n\n initTheme() {\n this.getFromLocalStorage();\n }\n\n getThemeByName(name: ThemesEnum) {\n return themesList.find(theme => theme.name === name);\n }\n\n getCurrentTheme(): Theme {\n return this.currentTheme;\n }\n\n getThemes(): Theme[] {\n return themesList;\n }\n\n setTheme(name: ThemesEnum) {\n this.currentTheme = this.getThemeByName(name);\n\n Object.keys(this.currentTheme.properties).forEach(property => {\n document.documentElement.style.setProperty(\n property,\n this.currentTheme.properties[property]\n );\n });\n\n this.storeToLocalStorage();\n }\n\n storeToLocalStorage() {\n localStorage.setItem(this.LOCAL_STORAGE_KEY, this.currentTheme.name);\n }\n\n getFromLocalStorage() {\n let themeName = localStorage.getItem(this.LOCAL_STORAGE_KEY) as ThemesEnum;\n\n if (!themeName) {\n themeName = ThemesEnum.DEFAULT;\n }\n\n this.setTheme(themeName);\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { DOCUMENT } from '@angular/common';\nimport { CookieService } from 'ngx-cookie-service';\nimport {\n APP_URL_ALFRED,\n APP_URL_EPC,\n APP_URL_ETD,\n APP_URL_HELPDESK,\n APP_URL_ISBN,\n APP_URL_LIBADMIN,\n APP_URL_ROOMBOOK,\n APP_URL_TOOLS,\n APP_URL_UIK,\n APP_URL_ZP,\n AUTH_BASE_COOKIE_DOMAIN,\n AUTH_REDIRECT_URL\n} from \"./auth.urls\";\nimport { AUTH_RETURN_URL_COOKIE_EXPIRATION } from './auth-constants';\nimport {environment} from '../../../environments/environment.dev';\nimport {BASE_FRONTEND_URL, LOCAL_FRONTEND_URL} from '../urls';\n\n@Injectable()\nexport class AppRedirectService {\n constructor(private router: Router, private cookieService: CookieService, @Inject(DOCUMENT) private document: any) {}\n\n redirectLogin(sendReturnUrl: boolean = false): void {\n if (!environment.production && environment.isLocal) {\n this.document.location.href =\n AUTH_REDIRECT_URL + '?development=true&redirectAfterLogin=' + encodeURIComponent(LOCAL_FRONTEND_URL + '/#/dev');\n } else {\n if (sendReturnUrl) {\n const expires = Date.now() + AUTH_RETURN_URL_COOKIE_EXPIRATION;\n this.cookieService.set(\n 'auth_ret',\n encodeURIComponent(this.document.location.href),\n expires,\n '/',\n AUTH_BASE_COOKIE_DOMAIN,\n environment.production\n );\n } else if (this.cookieService.check('auth_ret')) {\n this.cookieService.delete('auth_ret', '/', AUTH_BASE_COOKIE_DOMAIN);\n }\n\n this.document.location.href = AUTH_REDIRECT_URL + '/dashboard?action=logout&success=true&redirectAfterLogin=' + encodeURIComponent(BASE_FRONTEND_URL);\n }\n }\n\n redirect(url: string): void {\n this.document.location.href = url;\n }\n\n redirectEpc(): void {\n this.document.location.href = APP_URL_EPC;\n }\n\n redirectEtd(): void {\n this.document.location.href = APP_URL_ETD;\n }\n\n redirectIsbn(): void {\n this.document.location.href = APP_URL_ISBN;\n }\n\n redirectRoombook(): void {\n this.document.location.href = APP_URL_ROOMBOOK;\n }\n\n redirectZp(): void {\n this.document.location.href = APP_URL_ZP;\n }\n\n redirectUik(): void {\n this.document.location.href = APP_URL_UIK;\n }\n\n redirectHelpdesk(): void {\n this.document.location.href = APP_URL_HELPDESK;\n }\n\n redirectTools(): void {\n this.document.location.href = APP_URL_TOOLS;\n }\n\n redirectAlfred(): void {\n this.document.location.href = APP_URL_ALFRED;\n }\n\n redirectLibadmin(): void {\n this.document.location.href = APP_URL_LIBADMIN;\n }\n}\n","/*\n * Auth Thresholds\n */\nexport const AUTH_RETURN_URL_COOKIE_EXPIRATION = 1800000;\nexport const AUTH_TOKEN_REFRESH_INTERVAL = 600000;\nexport const AUTH_TOKEN_EXPIRATION_THRESHOLD = 300000;\nexport const AUTH_TOKEN_EXPIRATION_CHECK_THRESHOLD = 1500000;\nexport const AUTH_REFRESH_TOKEN_EXPIRATION_THRESHOLD = 300000;\n","import * as _ from 'lodash';\nimport {environment, SYSTEM_NAME} from '../../../environments/environment.dev';\nimport {BASE_FRONTEND_URL, DEV_HOST, getBaseApiUrl, getBaseFrontendUrl, LOCAL_HOST, PROD_HOST} from '../urls';\nimport {UkAppsEnum} from '../uk-apps';\n\nexport const AUTH_BASE_URL = getBaseApiUrl('AUTH');\nconst BASE_URL = getBaseApiUrl(SYSTEM_NAME);\n\nexport const AUTH_BASE_COOKIE_DOMAIN = getAuthBaseCookieDomain();\n\n// constructs URL for auth redirection\nfunction getAuthRedirectUrl(): string {\n return getBaseFrontendUrl('AUTH');\n}\n\n// constructs base domain for cookie storage\nfunction getAuthBaseCookieDomain(): string {\n if (environment.production) {\n return 'tuke.sk';\n } else if (environment.isLocal) {\n return 'localhost';\n }\n return 'tuke.sk';\n}\n\n// constructs redirect URL for specified app\nfunction getAppRedirectUrl(systemName: UkAppsEnum): string {\n return `${BASE_FRONTEND_URL}/${_.toLower(systemName)}`;\n}\n\nexport const AUTH_REDIRECT_URL = getAuthRedirectUrl();\n\nexport const APP_URL_EPC = getAppRedirectUrl(UkAppsEnum.EPC);\nexport const APP_URL_ETD = getAppRedirectUrl(UkAppsEnum.ETD);\nexport const APP_URL_ISBN = getAppRedirectUrl(UkAppsEnum.ISBN);\nexport const APP_URL_ROOMBOOK = getAppRedirectUrl(UkAppsEnum.ROOMBOOK);\nexport const APP_URL_ZP = getAppRedirectUrl(UkAppsEnum.ZP);\nexport const APP_URL_UIK = getAppRedirectUrl(UkAppsEnum.UIK);\nexport const APP_URL_HELPDESK = getAppRedirectUrl(UkAppsEnum.HELPDESK);\nexport const APP_URL_TOOLS = getAppRedirectUrl(UkAppsEnum.TOOLS);\nexport const APP_URL_LIBADMIN = getAppRedirectUrl(UkAppsEnum.LIBADMIN);\nexport const APP_URL_ALFRED = getAppRedirectUrl(UkAppsEnum.ALFRED);\n\n/* ### AUTH URLS ### */\nconst API_LOGIN = '/auth/token';\nconst API_LOGOUT = '/auth/logout';\nconst API_GET_EMPLOYMENTS = '/auth/getEmployments';\nconst API_CHANGE_EMPLOYMENT = '/auth/changeEmployment';\n\nexport function getLoginUrl() {\n return `${BASE_URL}${API_LOGIN}`;\n}\n\nexport function getLogoutUrl() {\n return `${BASE_URL}${API_LOGOUT}`;\n}\n\nexport function getEmploymentsUrl() {\n return `${BASE_URL}${API_GET_EMPLOYMENTS}`;\n}\n\nexport function changeEmploymentUrl() {\n return `${BASE_URL}${API_CHANGE_EMPLOYMENT}`;\n}\n\nexport function getAppConfigurationUrl() {\n return `${BASE_URL}/config/client`;\n}\n","export const ALLOWED_ROLE_PREFIX = {\n EPC: 'EPC',\n ETD: 'ETD',\n ISBN: 'ISBN',\n ROOMBOOK: 'ROOMBOOK',\n ZP: 'ZP',\n UIK: 'UIK',\n HELPDESK: 'HELPDESK',\n TOOLS: 'TOOLS',\n LIBADMIN: 'LIBADMIN',\n ALFRED: 'ALFRED',\n HELIOS: 'HELIOS',\n};\n\nexport const ALLOWED_GENERAL_ROLES = [\n 'SUPERADMIN',\n 'STUDENT',\n 'PHD',\n 'PEDAGOGUE',\n 'EMPLOYEE'\n];\n","export class LoginResourceModel {\n constructor (\n public readonly login: string,\n public readonly password?: string,\n public readonly sessionGuid?: string,\n public readonly refreshToken?: string\n ) {}\n}\n","import {HttpClient, HttpHeaders} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\nimport {Router} from '@angular/router';\nimport * as _ from 'lodash';\nimport * as moment from 'moment';\nimport {CookieService} from 'ngx-cookie-service';\nimport {EMPTY, Observable, of, throwError} from 'rxjs';\nimport {catchError, map} from 'rxjs/operators';\nimport {ALLOWED_GENERAL_ROLES, ALLOWED_ROLE_PREFIX} from '../allowed-role-prefix';\nimport {StringUtils} from '../utils/string-utils';\nimport {AppRedirectService} from './app-redirect.service';\nimport {\n AUTH_BASE_COOKIE_DOMAIN, AUTH_BASE_URL,\n changeEmploymentUrl,\n getEmploymentsUrl,\n getLoginUrl,\n getLogoutUrl,\n} from './auth.urls';\nimport {LoginResourceModel} from './model/login-resource.model';\nimport {environment, SYSTEM_NAME, SYSTEM_NAME_AUTH} from '../../../environments/environment.dev';\nimport {\n AUTH_REFRESH_TOKEN_EXPIRATION_THRESHOLD,\n AUTH_TOKEN_EXPIRATION_CHECK_THRESHOLD,\n AUTH_TOKEN_EXPIRATION_THRESHOLD, AUTH_TOKEN_REFRESH_INTERVAL,\n} from './auth-constants';\nimport {SystemUserModel} from '../../application/models/system-user.model';\nimport {getBaseFrontendUrl} from '../urls';\n\nexport const localStorageToken = `${environment.systemName.toLowerCase()}user`;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthenticationService {\n private mIsRefreshingToken = false;\n private mRefreshTokenInterval;\n\n public token: string;\n\n static encryptData(data): string {\n return data;\n }\n\n static decryptData(data): string {\n return data;\n }\n\n /* ### Save logged user to local storage ### */\n static saveAuthData(response) {\n if (!response) {\n return;\n }\n\n const jsonData = response;\n const user = {\n user: jsonData.user,\n expires: jsonData.expires,\n refresh_expires: jsonData.refresh_expires,\n access_token: jsonData.access_token,\n refresh_token: jsonData.refresh_token,\n session_guid: jsonData.session_guid,\n };\n\n const encrypted = AuthenticationService.encryptData(JSON.stringify(user));\n\n localStorage.setItem(`${localStorageToken}`, encrypted.toString());\n }\n\n static getStoredAuthData() {\n try {\n const sessionJson = localStorage.getItem(`${localStorageToken}`);\n\n if (StringUtils.isNullOrWhitespace(sessionJson)) {\n return undefined;\n }\n\n const decrypted = AuthenticationService.decryptData(sessionJson);\n\n if (!sessionJson || !decrypted) {\n localStorage.removeItem(`${localStorageToken}`);\n return undefined;\n }\n\n return StringUtils.isNullOrWhitespace(decrypted) ? undefined : JSON.parse(decrypted);\n } catch (e) {\n\n localStorage.removeItem(`${localStorageToken}`);\n\n if (!environment.production) {\n console.error(e);\n }\n }\n\n return undefined;\n }\n\n static updateAuthData(response) {\n if (!response) {\n return;\n }\n\n const jsonData = response;\n const currentUser = AuthenticationService.getStoredAuthData();\n\n if (!currentUser) {\n return;\n }\n\n const user = {\n user: jsonData,\n expires: currentUser.expires,\n refresh_expires: currentUser.refresh_expires,\n access_token: currentUser.access_token,\n refresh_token: currentUser.refresh_token,\n session_guid: currentUser.session_guid,\n };\n const encrypted = AuthenticationService.encryptData(JSON.stringify(user));\n\n localStorage.removeItem(`${localStorageToken}`);\n localStorage.setItem(`${localStorageToken}`, encrypted.toString());\n }\n\n static updateCurrentUser(\n accessToken: string,\n refreshToken: string,\n expirationTime: number,\n refreshExpirationTime: number,\n sessionGuid: string,\n ) {\n const currentUser = AuthenticationService.getStoredAuthData();\n\n if (!currentUser) {\n return;\n }\n\n localStorage.removeItem(`${localStorageToken}`);\n currentUser.access_token = accessToken;\n currentUser.refresh_token = refreshToken;\n currentUser.expires = expirationTime;\n currentUser.refresh_expires = refreshExpirationTime;\n currentUser.session_guid = sessionGuid;\n\n const encrypted = AuthenticationService.encryptData(JSON.stringify(currentUser));\n\n localStorage.setItem(`${localStorageToken}`, encrypted.toString());\n }\n\n static getLoggedUser(): SystemUserModel | null {\n let data = AuthenticationService.getStoredAuthData();\n\n let user = null;\n\n if (data && data.user) {\n user = data.user as SystemUserModel;\n }\n\n return user;\n }\n\n static getServerLocalTimeDifference() {\n let xmlHttp;\n try {\n xmlHttp = new XMLHttpRequest();\n } catch (err1) {\n throw new Error();\n }\n xmlHttp.open('HEAD', window.location.href.toString(), true);\n xmlHttp.setRequestHeader('Content-Type', 'text/html');\n xmlHttp.send('');\n const serverTime = moment(xmlHttp.getResponseHeader('Date'));\n const localTime = moment(new Date());\n return serverTime.diff(localTime, 'seconds');\n }\n\n static checkExpirationTime(): boolean {\n const currentUser = AuthenticationService.getStoredAuthData();\n\n if (!currentUser) {\n return false;\n }\n\n const expires = currentUser.expires;\n const now = Date.now();\n const timeDiff = expires - now;\n\n return expires > now && timeDiff > AUTH_TOKEN_EXPIRATION_THRESHOLD;\n }\n\n static isExpirationTimeClosingLimit(): boolean {\n const currentUser = AuthenticationService.getStoredAuthData();\n\n if (!currentUser) {\n return false;\n }\n\n const expires = currentUser.expires;\n const now = Date.now();\n const timeDiff = expires - now;\n\n if (expires <= now) {\n return false;\n }\n\n return timeDiff <= AUTH_TOKEN_EXPIRATION_CHECK_THRESHOLD;\n }\n\n static checkRefreshExpirationTime(): boolean {\n const currentUser = AuthenticationService.getStoredAuthData();\n\n if (!currentUser) {\n return false;\n }\n\n const expires = currentUser.refresh_expires;\n const now = Date.now();\n const timeDiff = expires - now;\n\n return expires > now && timeDiff > AUTH_REFRESH_TOKEN_EXPIRATION_THRESHOLD;\n }\n\n static isSessionExpired(): boolean {\n const expired = !AuthenticationService.checkExpirationTime() && !AuthenticationService.checkRefreshExpirationTime();\n\n return expired;\n }\n\n static checkSystemAccessPermission(systemName: string = environment.systemName.toUpperCase()): boolean {\n const currentUser = AuthenticationService.getStoredAuthData();\n\n if (!currentUser) {\n return false;\n }\n\n const roles = currentUser.user.roles || [];\n\n // return true if ALLOWED_ROLE_PREFIX is defined for the system or if the user has role from ALLOWED_GENERAL_ROLES\n return ALLOWED_ROLE_PREFIX[systemName] || roles.some(role => ALLOWED_GENERAL_ROLES.includes(role));\n }\n\n get tokenRefreshInProgress(): boolean {\n return this.mIsRefreshingToken;\n }\n\n constructor(\n private http: HttpClient,\n private router: Router,\n private cookieService: CookieService,\n private appRedirectService: AppRedirectService,\n ) {\n if (AuthenticationService.getServerLocalTimeDifference() > 600) {\n console.log('Bad Time!');\n this.errorMessage(1);\n this.removeUserAndCookie();\n this.appRedirectService.redirectLogin(false);\n }\n\n clearInterval(this.mRefreshTokenInterval);\n\n console.log('load auth service');\n\n this.mRefreshTokenInterval = setInterval(() => {\n if (this.mIsRefreshingToken) {\n return;\n }\n\n const currentUser = AuthenticationService.getStoredAuthData();\n\n console.log('currentUser:: ', currentUser)\n\n if (!_.isNil(currentUser)) {\n this.getNewToken(currentUser.user.login, currentUser.refresh_token, currentUser.session_guid).subscribe({\n next: (user: any) => {\n console.log('refresh user:: ', user);\n },\n error: (err: any) => {\n // console.log(err);\n },\n });\n }\n }, AUTH_TOKEN_REFRESH_INTERVAL);\n }\n\n saveLoggedUserFromEncrypted(cipher: string): void {\n if (!cipher) {\n return;\n }\n\n const decrypted = AuthenticationService.decryptData(cipher);\n\n if (!StringUtils.isNullOrWhitespace(decrypted) && decrypted !== 'undefined') {\n const parsed = JSON.parse(decrypted);\n\n this.saveUserCookie(parsed);\n\n AuthenticationService.saveAuthData(parsed);\n }\n }\n\n checkUser(): boolean {\n if (!AuthenticationService.checkExpirationTime() && !this.mIsRefreshingToken) {\n const currentUser = AuthenticationService.getStoredAuthData();\n\n if (!currentUser) {\n return false;\n }\n\n this.getNewToken(currentUser.user.login, currentUser.refresh_token, currentUser.session_guid).subscribe({\n error: error => {\n console.log('Error while updating refresh token for user ', error);\n },\n });\n }\n\n return true;\n }\n\n checkTokenRefreshRequirement(): void {\n if (AuthenticationService.isExpirationTimeClosingLimit() && !this.mIsRefreshingToken) {\n const currentUser = AuthenticationService.getStoredAuthData();\n\n if (!currentUser) {\n return;\n }\n\n this.getNewToken(currentUser.user.login, currentUser.refresh_token, currentUser.session_guid).subscribe({\n error: error => {\n console.log('Error while updating refresh token for user ', error);\n },\n });\n }\n }\n\n getEmployments(): Observable {\n const httpOptions = {\n headers: new HttpHeaders({\n Authorization: `Bearer ${AuthenticationService.getStoredAuthData().access_token}`,\n }),\n };\n\n return this.http.post(getEmploymentsUrl(), {}, httpOptions)\n .pipe(\n catchError(e => {\n return e;\n }),\n );\n }\n\n changeEmployment(employmentCode): Observable {\n const httpOptions = {\n headers: new HttpHeaders({\n Authorization: `Bearer ${AuthenticationService.getStoredAuthData().access_token}`,\n 'Content-Type': 'application/x-www-form-urlencoded',\n }),\n };\n const body = `employmentCode=${employmentCode}`;\n return this.http.post(changeEmploymentUrl(), body, httpOptions).pipe(\n map(response => {\n AuthenticationService.updateAuthData(response);\n return of(response);\n }),\n catchError(e => {\n throw e;\n }),\n );\n }\n\n login(username: string, password: string): Observable {\n const httpOptions = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n }),\n };\n const body = new LoginResourceModel(_.trim(username), password);\n\n return this.http.post(getLoginUrl(), body, httpOptions).pipe(\n map((response: any) => {\n if (!StringUtils.isNullOrWhitespace(response.access_token)) {\n AuthenticationService.saveAuthData(response);\n this.saveUserCookie(response);\n return true;\n } else {\n return false;\n }\n }),\n catchError(e => {\n throw e;\n }),\n );\n }\n\n logout(): Observable {\n\n const data = AuthenticationService.getStoredAuthData();\n\n let token = null;\n\n if (data && data.access_token) {\n token = data.access_token\n }\n\n const resultHandler = () => {\n this.token = null;\n this.removeUserAndCookie();\n };\n\n if (token) {\n\n const isExternal = data.user.isExternal || false;\n\n if (!isExternal) {\n\n const returnUrl = getBaseFrontendUrl(SYSTEM_NAME_AUTH);\n const url = `${AUTH_BASE_URL}/sso/logout?retUrl=${encodeURIComponent(returnUrl)}`;\n\n window.open(url, '_self');\n\n // this.removeUserAndCookie();\n this.token = null;\n\n return of(true);\n }\n\n const httpOptions = {\n headers: new HttpHeaders({\n Authorization: token,\n }),\n };\n\n if (this.checkForUserCookie(false)) {\n return this.http.post(getLogoutUrl(), {}, httpOptions).pipe(\n map(() => {\n resultHandler();\n\n this.appRedirectService.redirectLogin();\n\n return true;\n }),\n catchError(error => {\n resultHandler();\n\n this.appRedirectService.redirectLogin();\n\n return throwError(error);\n }),\n );\n }\n\n }\n\n this.appRedirectService.redirectLogin();\n\n resultHandler();\n\n return of(true);\n }\n\n getNewToken(username, refreshToken, sessionGuid): Observable {\n if (this.mIsRefreshingToken) {\n return EMPTY;\n }\n\n this.mIsRefreshingToken = true;\n\n const httpOptions: any = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${refreshToken}`\n }),\n responseType: 'json',\n };\n const body = new LoginResourceModel(username, undefined, sessionGuid, refreshToken);\n\n return this.http.post(getLoginUrl(), body, httpOptions).pipe(\n map((res: any) => {\n const result = res;\n this.mIsRefreshingToken = false;\n\n this.saveUserCookie(result);\n AuthenticationService.updateCurrentUser(\n result.access_token,\n result.refresh_token,\n result.expires,\n result.refresh_expires,\n result.session_guid,\n );\n\n return result;\n }),\n catchError(e => {\n this.mIsRefreshingToken = false;\n\n throw e;\n }),\n );\n }\n\n errorMessage(type: number) {\n }\n\n checkForUserCookie(updateSessionFromCookie = true): boolean {\n const session = AuthenticationService.getStoredAuthData();\n const cookie = this.getUserCookie();\n\n if (!_.isNil(session) && !cookie) {\n this.removeUserAndCookie();\n\n return false;\n } else if (updateSessionFromCookie && this.isUpdateFromCookieValid(session, cookie)) {\n if (cookie) {\n AuthenticationService.saveAuthData(cookie);\n\n if (AuthenticationService.isSessionExpired()) {\n this.removeUserAndCookie();\n\n return false;\n }\n\n return true;\n }\n this.removeUserAndCookie();\n\n return false;\n } else if (_.isNil(session) || AuthenticationService.isSessionExpired()) {\n this.removeUserAndCookie();\n\n return false;\n }\n\n return true;\n }\n\n private isUpdateFromCookieValid(user: any, cookie: any): boolean {\n if (!cookie || !cookie.session_guid || !cookie.refresh_token) {\n return false;\n }\n\n if (!user || !user.session_guid || cookie.session_guid !== user.session_guid) {\n return true;\n }\n\n let cookieExp;\n\n if (cookie.expires) {\n cookieExp = cookie.expires;\n } else if (cookie.expires_in) {\n cookieExp = Number.parseInt(cookie.expires_in, 0) * 1000 + Date.now();\n }\n\n const userExp = Number.parseInt(user.expires, 0);\n\n if (cookieExp && cookieExp === userExp) {\n return false;\n }\n\n if (\n cookieExp > userExp &&\n cookie.session_guid === user.session_guid &&\n cookie.refresh_token !== user.refresh_token\n ) {\n return true;\n }\n\n const diff = cookieExp - userExp;\n\n return diff > AUTH_TOKEN_EXPIRATION_THRESHOLD;\n }\n\n private saveUserCookie(user: any): void {\n if (!user) return;\n\n user._fromCookie = true;\n const encrypted = AuthenticationService.encryptData(JSON.stringify(user));\n\n // Split encrypted data into chunks if it exceeds the cookie size limit\n const chunkSize = 3000; // Each chunk is around 3 KB to fit comfortably within the 4 KB limit\n const chunks = this.splitStringIntoChunks(encrypted, chunkSize);\n\n // Save each chunk as a separate cookie\n const baseCookieName = environment.production ? 'auth_user' : 'devauth_user';\n chunks.forEach((chunk, index) => {\n const cookieName = `${baseCookieName}_part${index}`;\n this.cookieService.set(\n cookieName,\n chunk,\n undefined,\n '/',\n AUTH_BASE_COOKIE_DOMAIN,\n environment.production\n );\n });\n\n // Save the total number of chunks in an additional cookie\n this.cookieService.set(\n `${baseCookieName}_partsCount`,\n chunks.length.toString(),\n undefined,\n '/',\n AUTH_BASE_COOKIE_DOMAIN,\n environment.production\n );\n }\n\n private getUserCookie(): any {\n const baseCookieName = environment.production ? 'auth_user' : 'devauth_user';\n const partsCountStr = this.cookieService.get(`${baseCookieName}_partsCount`);\n const partsCount = parseInt(partsCountStr, 10);\n\n if (isNaN(partsCount) || partsCount <= 0) {\n return undefined;\n }\n\n let encryptedData = '';\n for (let i = 0; i < partsCount; i++) {\n const chunk = this.cookieService.get(`${baseCookieName}_part${i}`);\n if (chunk) {\n encryptedData += chunk;\n } else {\n console.error(`Missing cookie part ${i}. Unable to reconstruct user data.`);\n return undefined;\n }\n }\n\n // Decrypt the reconstructed data\n const decrypted = AuthenticationService.decryptData(encryptedData);\n return StringUtils.isNullOrWhitespace(decrypted) ? undefined : JSON.parse(decrypted);\n }\n\n private removeUserAndCookie(): void {\n const baseCookieName = environment.production ? 'auth_user' : 'devauth_user';\n const partsCountStr = this.cookieService.get(`${baseCookieName}_partsCount`);\n const partsCount = parseInt(partsCountStr, 10);\n\n // Remove all chunk cookies if they exist\n if (!isNaN(partsCount) && partsCount > 0) {\n for (let i = 0; i < partsCount; i++) {\n const cookieName = `${baseCookieName}_part${i}`;\n this.cookieService.delete(cookieName, '/', AUTH_BASE_COOKIE_DOMAIN);\n }\n this.cookieService.delete(`${baseCookieName}_partsCount`, '/', AUTH_BASE_COOKIE_DOMAIN);\n }\n\n // Also clear localStorage if applicable\n localStorage.removeItem(SYSTEM_NAME.toLowerCase() + 'user');\n }\n\n// Utility function to split a string into smaller chunks\n private splitStringIntoChunks(str: string, chunkSize: number): string[] {\n const chunks: string[] = [];\n let index = 0;\n\n while (index < str.length) {\n chunks.push(str.slice(index, index + chunkSize));\n index += chunkSize;\n }\n\n return chunks;\n }\n}\n","import {\n HttpErrorResponse,\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest,\n HttpResponse,\n} from '@angular/common/http';\nimport {Injectable, Injector} from '@angular/core';\nimport * as _ from 'lodash';\nimport {EMPTY, Observable, of, Subject, throwError} from 'rxjs';\nimport {AppRedirectService} from '../app-redirect.service';\nimport {getLoginUrl, getLogoutUrl} from '../auth.urls';\nimport {AuthenticationService} from '../authentication.service';\nimport {CURRENT_API_HOST_URL} from '../../urls';\nimport {catchError, map, switchMap, tap} from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthInterceptor {\n private calledLogout = false;\n private tokenRefreshedSubject: Subject = new Subject();\n private tokenRefreshed: Observable = this.tokenRefreshedSubject.asObservable();\n\n private interruptLogout = false;\n\n constructor(private injector: Injector) {\n // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n // Ak bude potrebne pouzit v interceptore nejaku service, tak referenciu tahat cez Injector, nie cez DI konstruktora!\n // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n }\n\n intercept(req: HttpRequest, next: HttpHandler) {\n\n const authenticationService: AuthenticationService = this.injector.get(AuthenticationService);\n\n const appRedirectService: AppRedirectService = this.injector.get(AppRedirectService);\n\n const headersToSet = {};\n\n const access_token = AuthenticationService.getStoredAuthData()?.access_token || null;\n\n if (req.headers) {\n if (!req.headers.has('Content-Type')) {\n headersToSet['Content-Type'] = 'application/json';\n }\n\n if (access_token && !req.headers.has('Authorization')) {\n\n headersToSet['Authorization'] = 'Bearer ' + access_token;\n }\n }\n\n req = req.clone({\n setHeaders: headersToSet,\n });\n\n return next.handle(req)\n .pipe(tap({\n next: (response) => {\n if (response instanceof HttpResponse) {\n if (response.status === 200) {\n if (_.startsWith(response.url, getLogoutUrl())) {\n this.logout(response, authenticationService, appRedirectService);\n }\n }\n }\n },\n }))\n .pipe(\n catchError((error) => {\n\n if (error.status === 401) {\n this.logout(error, authenticationService, appRedirectService);\n }\n\n if (\n !(error instanceof HttpErrorResponse) ||\n !_.startsWith((error as HttpErrorResponse).url, CURRENT_API_HOST_URL)\n ) {\n return throwError(error.error);\n }\n\n if (_.startsWith(error.url, getLoginUrl())) {\n if (error.status !== 400) {\n // TODO: Zobrazit error toast ak je potrebne\n } else {\n this.logout(error, authenticationService, appRedirectService);\n }\n\n return throwError(error.error);\n } else if (_.startsWith(error.url, getLogoutUrl())) {\n if (error.status !== 401) {\n // TODO: Zobrazit error toast ak je potrebne\n }\n\n return throwError(error.error);\n } else if (_.startsWith(error.url, getSessionValidityCheckUrl())) {\n if (error.status !== 401) {\n // TODO: Zobrazit error toast ak je potrebne\n } else {\n this.logout(error, authenticationService, appRedirectService);\n }\n\n return throwError(error.error);\n } else if (error.status === 401) {\n if (AuthenticationService.isSessionExpired()) {\n // TODO: Zobrazit error toast ze nastala chyba pri odhlasovani ak je potrebne\n\n this.logout(error, authenticationService, appRedirectService);\n } else if (\n !AuthenticationService.checkExpirationTime() &&\n AuthenticationService.checkRefreshExpirationTime()\n ) {\n return this.refreshToken(authenticationService).pipe(\n switchMap(() => {\n return next.handle(req);\n }),\n catchError(refreshError => {\n // TODO: Zobrazit error toast ze nastala chyba autentifikacie ak je potrebne\n\n if (refreshError.status === 400 || refreshError.status === 401 || refreshError.status === 500) {\n this.logout(refreshError, authenticationService, appRedirectService);\n\n return EMPTY;\n }\n\n return throwError(error.error);\n }),\n );\n } else {\n // TODO: Zobrazit error toast 401 ak je potrebne\n\n this.logout(error, authenticationService, appRedirectService);\n }\n } else if (error.status < 200 || error.status > 299) {\n // TODO: Zobrazit error toast ak je potrebne ked sa vyskytne neocakavany stav alebo chyba protokolu\n }\n }),\n );\n }\n\n setInterruptLogout(interruptLogout: boolean) {\n this.interruptLogout = interruptLogout;\n }\n\n private logout(\n response: HttpResponse | HttpErrorResponse,\n authenticationService: AuthenticationService,\n appRedirectService: AppRedirectService,\n ): void {\n\n if (this.interruptLogout) {\n return;\n }\n\n if (this.calledLogout) {\n return;\n }\n\n this.calledLogout = true;\n authenticationService.logout().subscribe({\n next: () => {\n this.calledLogout = false;\n appRedirectService.redirectLogin(false);\n },\n error: error => {\n this.calledLogout = false;\n appRedirectService.redirectLogin(false);\n },\n });\n }\n\n private refreshToken(authenticationService: AuthenticationService): Observable {\n if (authenticationService.tokenRefreshInProgress) {\n return new Observable(subscriber => {\n this.tokenRefreshed.subscribe({\n next: () => {\n subscriber.next();\n subscriber.complete();\n },\n error: error => {\n subscriber.error(error);\n subscriber.complete();\n },\n });\n });\n } else {\n const currentSession = AuthenticationService.getStoredAuthData();\n\n if (_.isNil(currentSession)) {\n return throwError('No session present!');\n }\n\n return authenticationService\n .getNewToken(currentSession.user.login, currentSession.refresh_token, currentSession.session_guid)\n .pipe(\n tap({\n next: (d) => {\n this.tokenRefreshedSubject.next(d);\n },\n error: error => {\n // console.log(error);\n this.tokenRefreshedSubject.error(error);\n },\n }),\n );\n }\n }\n}\n\nfunction getSessionValidityCheckUrl(): string {\n throw new Error('Function not implemented.');\n}\n\n","import {NgModule} from '@angular/core';\nimport {OutsideClickDirective} from './outside-click.directive';\n\n@NgModule({\n\tdeclarations: [\n\t\tOutsideClickDirective\n\t],\n\texports: [\n\t\tOutsideClickDirective\n\t]\n})\n\nexport class DirectivesModule {}\n","import { MissingTranslationHandler, MissingTranslationHandlerParams } from '@ngx-translate/core';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class AppMissingTranslationService extends MissingTranslationHandler {\n\n protected missingKeys: {[key: string]: boolean} = {};\n\n constructor() {\n super();\n this.load();\n }\n\n getMissingKeys() {\n return this.missingKeys;\n }\n\n protected save() {\n window.localStorage.setItem('missingTranslations', JSON.stringify(Object.keys(this.missingKeys)));\n }\n\n protected load() {\n let loaded = window.localStorage.getItem('missingTranslations');\n if (loaded) {\n let parsed = JSON.parse(loaded);\n if (parsed && parsed.length && parsed.map) {\n parsed.map(\n (key: string) => {\n this.missingKeys[key] = true;\n }\n );\n }\n }\n }\n\n handle(params: MissingTranslationHandlerParams): any {\n let key = params.key;\n this.missingKeys[key] = true;\n this.save();\n return key;\n }\n\n}\n","import {Injectable} from '@angular/core';\nimport {firstValueFrom, Subject} from 'rxjs';\nimport {TranslateService} from '@ngx-translate/core';\nimport {initTranslatePlaceholderFunction} from './translate-placeholder';\nimport {environment} from '../../../environments/environment.dev';\n\n@Injectable()\nexport class AppTranslationService {\n\n private _currentLanguage: string;\n\n private _changedLanguageSubject = new Subject();\n\n constructor(\n private translateService: TranslateService,\n ) {\n }\n\n get changedLanguage(): Subject {\n return this._changedLanguageSubject;\n }\n\n set currentLanguage(value: string) {\n this._currentLanguage = value;\n }\n\n get currentLanguage(): string {\n return this._currentLanguage;\n }\n\n get hasSavedLanguage(): boolean {\n const language = window.localStorage.getItem('language');\n return !!language;\n }\n\n switchLanguage(language: string): Promise {\n\n if (language === this._currentLanguage) {\n return Promise.resolve();\n }\n\n if (environment.availableLanguages.indexOf(language) === -1) {\n return Promise.reject('Invalid language code: ' + language);\n }\n\n this._currentLanguage = language;\n\n window.localStorage.setItem('language', language);\n\n const asPromise = firstValueFrom(this.translateService.use(\n language,\n ));\n\n asPromise.then(\n () => {\n this._changedLanguageSubject.next(this._currentLanguage);\n },\n );\n\n return asPromise;\n\n }\n\n async initApp(): Promise {\n let currentLanguage: string | null = '';\n\n if (window.localStorage.getItem('language')) {\n currentLanguage = window.localStorage.getItem('language');\n }\n\n if (!currentLanguage) {\n if (navigator.languages) {\n for (let testedLang of navigator.languages) {\n testedLang = this.simplifyLanguageCode(testedLang);\n if (environment.availableLanguages.indexOf(testedLang) !== -1) {\n currentLanguage = testedLang;\n break;\n }\n }\n } else if (navigator.language && environment.availableLanguages.indexOf(this.simplifyLanguageCode(navigator.language)) !== -1) {\n currentLanguage = navigator.language;\n }\n }\n\n if (!currentLanguage) {\n currentLanguage = environment.defaultLocale;\n }\n\n this.translateService.setDefaultLang(\n environment.defaultLocale,\n );\n\n this._currentLanguage = currentLanguage;\n const returnedPromise = firstValueFrom(this.translateService.use(\n currentLanguage,\n ));\n\n initTranslatePlaceholderFunction(this.translateService);\n\n await this.switchLanguage(this._currentLanguage);\n\n return returnedPromise;\n }\n\n protected simplifyLanguageCode(code: string): string {\n return code.substring(0, 2);\n }\n}\n","import {NgModule} from '@angular/core';\nimport { LangSwitcherModule } from './lang-switcher/lang-switcher.module';\nimport {AppMissingTranslationService} from './app-missing-translation.service';\nimport {PercentageSignTranslateParser} from './percentage-sign-translate-parser';\nimport {HttpClient} from '@angular/common/http';\nimport {AppTranslationService} from './app-translation.service';\nimport {MissingTranslationHandler, TranslateLoader, TranslateModule, TranslateParser} from '@ngx-translate/core';\nimport {TranslateHttpLoader} from '@ngx-translate/http-loader';\n\n@NgModule({\n imports: [\n LangSwitcherModule,\n ],\n declarations: [\n ],\n exports: [\n ],\n providers: [\n AppTranslationService,\n AppMissingTranslationService\n ]\n})\n\nexport class I18nModule {}\n\nexport function HttpLoaderFactory(http: HttpClient) {\n return new TranslateHttpLoader(\n http,\n 'assets/langs/',\n '.json',\n );\n}\n","import {NgModule} from '@angular/core';\nimport {LangSwitcherComponent} from './lang-switcher.component';\nimport {CommonModule} from '@angular/common';\nimport {DirectivesModule} from '../../directives/directives.module';\n\n@NgModule({\n\timports: [\n\t\tCommonModule,\n\t\tDirectivesModule,\n\t],\n\texports: [\n\t\tLangSwitcherComponent,\n\t],\n\tdeclarations: [\n\t\tLangSwitcherComponent,\n\t],\n})\n\nexport class LangSwitcherModule {\n}\n","import { TranslateService } from '@ngx-translate/core';\n\nexport function _(input: string, translateRightNow = true) {\n\tif (!input) {\n\t\treturn '';\n\t}\n\tif (translateRightNow && translate) {\n\t\treturn translate.instant(input);\n\t}\n\treturn input;\n}\n\nexport function getTranslatedText(input: string) {\n\tif (!input) {\n\t\treturn '';\n\t}\n\tif (translate) {\n\t\treturn translate.instant(input);\n\t}\n\treturn input;\n}\n\nlet translate: TranslateService;\n\n\n/**\n * Call this function as soon as possible in your app to \"inject\"\n * ngx-translate's TranslateService to the _() function.\n *\n * Then you can use _('some text') in your .ts files. The text\n * wrapped in _() function will be extractable by ngx-translate-extract\n * and also automatically translated (unless false is given in second arg)\n *\n * Using _() function assume the translations are already loaded, so it is safe to\n * call instant() method for synchronous translation\n *\n * @param translateService\n */\nexport function initTranslatePlaceholderFunction(translateService: TranslateService) {\n\tif (translate) {\n\t\tthrow new Error('Translate placeholder function already registered!');\n\t}\n\ttranslate = translateService;\n}\n","import {Pipe, PipeTransform} from '@angular/core';\nimport {environment} from '../../../environments/environment.dev';\nimport {AuthenticationService} from '../auth/authentication.service';\n\n@Pipe({\n name: 'userRole',\n})\nexport class UserRolePipe implements PipeTransform {\n\n static getCurrentUserRoles(): any[] {\n return AuthenticationService.getStoredAuthData()?.user?.roles || [];\n }\n\n transform(requestedRoles: string[], reverse?: boolean): any {\n return true;\n // const POSSIBLE_ROLES = environment.userRoles.All;\n // const currentUserRoles = UserRolePipe.getCurrentUserRoles();\n //\n // if (!requestedRoles) {\n // return;\n // }\n //\n // if (reverse) {\n // return !currentUserRoles.every(role => requestedRoles.includes(role));\n // }\n //\n // if (typeof requestedRoles === 'string') {\n // requestedRoles = [requestedRoles];\n // }\n //\n // if (POSSIBLE_ROLES.some(roles => currentUserRoles.includes(roles))) {\n // return requestedRoles.some(roles => currentUserRoles.includes(roles));\n // } else {\n // return false;\n // }\n }\n}\n","export enum UkAppsEnum {\n AUTH = 'AUTH',\n EPC = 'EPC',\n ETD = 'ETD',\n ISBN = 'ISBN',\n ROOMBOOK = 'ROOMBOOK',\n ZP = 'ZP',\n UIK = 'UIK',\n HELPDESK = 'HELPDESK',\n TOOLS = 'TOOLS',\n LIBADMIN = 'LIBADMIN',\n ALFRED = 'ALFRED',\n HELIOS = 'HELIOS'\n}\n\nexport enum UkAppsFullNameEnum {\n AUTH = 'AUTH',\n EPC = 'EPC',\n ETD = 'thesisEvidence',\n ISBN = 'ISBN',\n ROOMBOOK = 'roombook',\n ZP = 'ZP',\n UIK = 'UIK',\n HELPDESK = 'HELPDESK',\n TOOLS = 'TOOLS',\n LIBADMIN = 'libadmin',\n ALFRED = 'ALFRED',\n HELIOS = 'HELIOS'\n}\n","// base URL for frontend (non-local)\nimport {environment, SYSTEM_NAME_AUTH} from '../../environments/environment.dev';\nimport {StringUtils} from './utils/string-utils';\n\nexport const LOCAL_HOST = 'localhost'; // local frontend host (default localhost)\nexport const LOCAL_FRONTEND_PORT = '3003'; // local frontend port\nexport const PROD_HOST = 'portal.tuke.sk'; // production hostname\nexport const PROD_HOST_PORT = ''; // production host port (empty for default)\nexport const PROD_API_HOST = 'portal.tuke.sk'; // production API hostname\nexport const PROD_API_HOST_PORT = ''; // production API host port (empty for default)\nexport const DEV_HOST = 'portal.dev.msweb.tuke.sk'; // development hostname\nexport const DEV_HOST_PORT = ''; // development host port (empty for default)\nexport const DEV_API_HOST = 'portal.dev.msweb.tuke.sk'; // development API hostname\nexport const DEV_API_HOST_PORT = ''; // development API host port (empty for default)\n\nexport const BASE_URL = getBaseApiUrl(environment.systemName);\n\nexport const LOCAL_FRONTEND_URL = `${getClientProtocol()}://${LOCAL_HOST}:${LOCAL_FRONTEND_PORT}`;\nexport const CURRENT_API_HOST_URL = getCurrentApiHost();\n\nexport const BASE_FRONTEND_URL = getBaseFrontendUrl(environment.systemName);\n\nfunction getClientProtocol(): string {\n if (environment.production) {\n if (environment.useHttps) {\n return 'https';\n } else {\n return 'http';\n }\n }\n\n if (!environment.production) {\n if (environment.useHttps) {\n return 'https';\n } else {\n return 'http';\n }\n }\n\n return 'http';\n}\n\nfunction getApiProtocol(): string {\n if (environment.production) {\n if (environment.useHttps) {\n return 'https';\n } else {\n return 'http';\n }\n }\n\n if (!environment.production) {\n if (environment.useHttps) {\n return 'https';\n } else {\n return 'http';\n }\n }\n\n return 'http';\n}\n\n// constructs base URL for API host without suffix\nfunction getCurrentApiHost(): string {\n if (environment.production) {\n return `${getApiProtocol()}://${PROD_API_HOST}`;\n }\n\n return `${getApiProtocol()}://${DEV_API_HOST}`;\n}\n\n// constructs base URL for API\nexport function getBaseApiUrl(systemName?: string): string {\n if (environment.production) {\n return `${getApiProtocol()}://api.${systemName}.${PROD_API_HOST}${\n StringUtils.isNullOrEmpty(PROD_API_HOST_PORT) ? '' : (':' + PROD_API_HOST_PORT)\n }/api`;\n }\n\n return `${getApiProtocol()}://api.${systemName}.${DEV_API_HOST}${\n StringUtils.isNullOrEmpty(DEV_API_HOST_PORT) ? '' : (':' + DEV_API_HOST_PORT)\n }/api`;\n}\n\nexport function getBaseFrontendUrl(systemName?: string): string {\n if (systemName === SYSTEM_NAME_AUTH) {\n return `${getClientProtocol()}://${environment.production ? PROD_HOST : DEV_HOST}${\n StringUtils.isNullOrEmpty(environment.production ? PROD_HOST_PORT : DEV_HOST_PORT) ? '' : (':' + (environment.production ? PROD_HOST_PORT : DEV_HOST_PORT))\n }`;\n }\n return `${getClientProtocol()}://${systemName}.${environment.production ? PROD_HOST : DEV_HOST}${\n StringUtils.isNullOrEmpty(environment.production ? PROD_HOST_PORT : DEV_HOST_PORT) ? '' : (':' + (environment.production ? PROD_HOST_PORT : DEV_HOST_PORT))\n }`;\n}\n","import * as _ from 'lodash';\n\nexport class StringUtils {\n private static readonly REGEX__CONTAINS_ONLY_WHITESPACE: RegExp = new RegExp('^\\s+$', 'i');\n\n public static extractNumericValueFromCSS(s: string): number {\n if (!s) {\n return 0;\n }\n\n const result = parseFloat(s);\n\n if (_.isFinite(result)) {\n return result;\n }\n\n return 0;\n }\n\n public static isNullOrEmpty(s: string): boolean {\n return _.isNil(s) || s === '';\n }\n\n public static isNullOrWhitespace(s: string): boolean {\n const nullOrEmpty: boolean = this.isNullOrEmpty(s);\n let onlyWhitespace = true;\n\n if (!nullOrEmpty) {\n onlyWhitespace = StringUtils.REGEX__CONTAINS_ONLY_WHITESPACE.test(s);\n }\n\n return nullOrEmpty || onlyWhitespace;\n }\n\n public static mergeRoutes(baseRoute: string, ...routes: string[]): string {\n if (StringUtils.isNullOrEmpty(baseRoute)) {\n return undefined;\n }\n\n const processedBaseRoute = _.endsWith(baseRoute, '/') ? baseRoute.substr(0, baseRoute.length - 1) : baseRoute;\n const processedRoutes = _.map(routes, route => {\n if (StringUtils.isNullOrEmpty(route)) {\n return '';\n }\n\n const processedRoute = _.endsWith(route, '/') ? route.substr(0, route.length - 1) : route;\n\n return _.startsWith(processedRoute, '/') ? processedRoute : `/${processedRoute}`;\n });\n\n let result = processedBaseRoute;\n\n _.forEach(processedRoutes, route => {\n if (StringUtils.isNullOrEmpty(route)) {\n return;\n }\n\n result = result.concat(route);\n });\n\n return result;\n }\n\n public static normalizeStringForSearch(\n s: string,\n caseConversion: 'upper' | 'lower' | 'none' = 'none',\n accentInsensitive: boolean = true,\n normalizationForm: string = 'NFD'\n ): string {\n if (_.isNil(s)) {\n return undefined;\n }\n\n let result = s.normalize(normalizationForm);\n\n if (accentInsensitive) {\n result = result.replace(/[\\u0300-\\u036f]/g, '');\n }\n\n switch (caseConversion) {\n case 'upper':\n result = _.toUpper(result);\n break;\n\n case 'lower':\n result = _.toLower(result);\n break;\n\n default:\n break;\n }\n\n return result;\n }\n}\n","// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build` replaces `environment.dev.ts` with `environmentDev.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\n\nexport const SYSTEM_NAME = 'HELIOS';\nexport const SYSTEM_NAME_AUTH = 'AUTH';\n\nexport const environment = {\n production: false,\n useHttps: true,\n isLocal: false,\n systemName: SYSTEM_NAME,\n organizationName: 'Univerzitná knižnica',\n organizationWebsiteUrl: 'https://www.tuke.sk/',\n organizationSupportEmail: 'kniznica@tuke.sk',\n epcSupportEmail: 'epc@tuke.sk',\n organizationSupportPhone: '+421 55 602 7700',\n availableLanguages: ['sk', 'en'],\n defaultLocale: 'sk',\n API_URL: `https://api.helios.portal.dev.msweb.tuke.sk/api`,\n BASE_API_URL: `https://auth.api.portal.dev.msweb.tuke.sk`,\n userRoles: {\n SuperAdmin: 'SUPERADMIN',\n UK_ADMIN: 'UK_ADMIN',\n All: [\n 'SUPERADMIN','UK_ADMIN',\n ],\n },\n};\n\n/*\n * For easier debugging in development mode, you can import the following file\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\n *\n * This import should be commented out in production mode because it will have a negative impact\n * on performance if an error is thrown.\n */\n// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.\n","import { Injectable } from '@angular/core';\nimport { Router, CanActivate, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router';\nimport { AuthenticationService } from '../authentication.service';\nimport { AppRedirectService } from '../app-redirect.service';\nimport {environment} from '../../../../environments/environment.dev';\n\n@Injectable()\nexport class AuthGuard implements CanActivate {\n constructor(\n private router: Router,\n private authenticationService: AuthenticationService,\n private appRedirectService: AppRedirectService,\n ) { }\n\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n let returnUrl = true;\n\n if (!environment.production && environment.isLocal) {\n if (\n route.queryParams &&\n route.queryParams.development &&\n decodeURIComponent(route.queryParams.development) === 'true'\n ) {\n if (route.queryParams.user) {\n console.log(route.queryParams);\n this.authenticationService.saveLoggedUserFromEncrypted(decodeURIComponent(route.queryParams.user));\n }\n }\n } else {\n if (route.url && route.url[0] && route.url[0].path === 'dev') {\n this.router.navigate(['']);\n return false;\n }\n }\n\n if (this.authenticationService.checkForUserCookie() && !AuthenticationService.isSessionExpired()) {\n this.authenticationService.checkTokenRefreshRequirement();\n\n if (AuthenticationService.checkSystemAccessPermission()) {\n return true;\n } else {\n returnUrl = false;\n }\n }\n\n this.appRedirectService.redirectLogin(returnUrl);\n return false;\n }\n}\n","import {RouterModule} from '@angular/router';\nimport {NgModule} from '@angular/core';\nimport {AuthGuard} from './common/auth/guards/auth.guard';\nimport {DevComponent} from './application/dev/dev.component';\n\n@NgModule({\n imports: [\n RouterModule.forRoot([\n {\n path: 'dev', component: DevComponent, pathMatch: 'full', canActivate: [AuthGuard]\n },\n {\n path: '',\n loadChildren: () => import('./application/application.module').then(m => m.ApplicationModule),\n canActivate: [AuthGuard]\n },\n {\n path: 'public',\n loadChildren: () => import('./application/public/public-section.module').then(m => m.PublicSectionModule),\n },\n ], {scrollPositionRestoration: 'enabled', anchorScrolling: 'enabled'}),\n ],\n providers: [\n AuthGuard,\n ],\n exports: [RouterModule],\n})\nexport class AppRoutingModule {\n}\n","import { NgModule } from \"@angular/core\";\nimport { InlineLoaderComponent } from \"./inline-loader.component\";\n\n@NgModule({\n exports: [\n InlineLoaderComponent\n ],\n declarations: [InlineLoaderComponent]\n})\n\nexport class InlineLoaderModule {}\n","import {Injectable} from '@angular/core';\nimport {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router';\nimport {AuthenticationService} from '../authentication.service';\nimport {UserRolePipe} from '../../pipes/user-role.pipe';\n\n@Injectable()\nexport class RoleGuard implements CanActivate {\n constructor(\n private userRolePipe: UserRolePipe,\n private roles: string[]\n ) {\n }\n\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n // const POSSIBLE_ROLES = UserRoles.All;\n const POSSIBLE_ROLES = [];\n const CURRENT_USER_ROLES = AuthenticationService.getStoredAuthData().user.roles;\n\n const roles = route.data.roles as Array;\n\n if (!roles) {\n return false;\n }\n\n return roles.some(role => {\n if (POSSIBLE_ROLES.some(rols => CURRENT_USER_ROLES.includes(rols))) {\n return [role].some(rols => CURRENT_USER_ROLES.includes(rols));\n } else {\n return false;\n }\n });\n }\n}\n","import { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { Provider } from '@angular/core';\nimport { AuthInterceptor } from './auth.interceptor';\n\nexport const AUTH_INTERCEPTOR_PROVIDER = {\n provide: HTTP_INTERCEPTORS,\n useClass: AuthInterceptor,\n multi: true\n} as Provider;\n","import {NgModule} from '@angular/core';\nimport {InlineLoaderModule} from './components/inline-loader/inline-loader.module';\nimport {RoleGuard} from './auth/guards/role.guard';\nimport {AuthenticationService} from './auth/authentication.service';\nimport {CookieService} from 'ngx-cookie-service';\nimport {AppRedirectService} from './auth/app-redirect.service';\nimport {AUTH_INTERCEPTOR_PROVIDER} from \"./auth/interceptors/auth-interceptor.provider\";\n\n@NgModule({\n imports: [\n InlineLoaderModule,\n ],\n exports: [],\n declarations: [\n ],\n providers: [\n AUTH_INTERCEPTOR_PROVIDER,\n RoleGuard,\n AuthenticationService,\n CookieService,\n AppRedirectService,\n ],\n})\n\nexport class CommonModule {\n}\n","import { TranslateDefaultParser } from '@ngx-translate/core';\nimport {Injectable} from '@angular/core';\n\n/**\n * Enables using placeholder using %placeholder% syntax instead of {{ placeholder }}\n * Useful when keys are also viewable texts and {{ }} syntax would mess up with angular template syntax\n *\n * In template:\n *\n *
Hello %who%
\n *
{{ 'Hello %who%' | translate:{who: 'world'} }}
\n *\n * With original {{ }} syntax, this would reult in an error\n *
Hello {{ who }}
\n *
{{ 'Hello {{ who }}' | translate:{who: 'world'} }}
\n *\n *\n * Usage - in NgModule definition when configuring imported TranslateModule:\n *\n * \t\tTranslateModule.forRoot({\n *\t\t\t// loaders, missing translation handlers, etc\n *\t\t\tparser: {\n *\t\t\t\tprovide: TranslateParser,\n *\t\t\t\tuseClass: PercentageSignTranslateParser,\n *\t\t\t},\n *\t\t}),\n *\n */\n@Injectable()\nexport class PercentageSignTranslateParser extends TranslateDefaultParser {\n\n\tprotected regexp = new RegExp(/%\\s?([a-z0-9\\-_]+)\\s?%/, 'ig');\n\n\toverride interpolate(expr: string | Function, params?: any): string {\n\t\tif (typeof expr === 'string') {\n\t\t\treturn super.interpolate(\n\t\t\t\texpr.replace(\n\t\t\t\t\tthis.regexp,\n\t\t\t\t\t(all, innerPart) => `{{ ${innerPart} }}`\n\t\t\t\t),\n\t\t\t\tparams\n\t\t\t);\n\t\t}\n\t\treturn super.interpolate(expr, params);\n\t}\n\n}\n","import { NgModule } from \"@angular/core\";\nimport { AppThemeService } from \"./app-theme.service\";\n\n@NgModule({\n imports: [],\n declarations: [],\n providers: [\n AppThemeService\n ],\n exports: []\n})\n\nexport class AppThemeModule { }\n","import { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {HttpClient, HttpClientModule} from '@angular/common/http';\nimport {LocationStrategy, HashLocationStrategy} from '@angular/common';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { AppRoutingModule } from './app-routing.module';\nimport { AppComponent } from './app.component';\nimport {BrowserModule} from '@angular/platform-browser';\nimport {CommonModule as MyCommonModule} from './common/common.module';\nimport {HttpLoaderFactory, I18nModule} from './common/i18n/i18n.module';\nimport {AUTH_INTERCEPTOR_PROVIDER} from './common/auth/interceptors/auth-interceptor.provider';\nimport {AuthGuard} from './common/auth/guards/auth.guard';\nimport {AuthenticationService} from './common/auth/authentication.service';\nimport {RoleGuard} from './common/auth/guards/role.guard';\nimport {CookieService} from 'ngx-cookie-service';\nimport {AppRedirectService} from './common/auth/app-redirect.service';\nimport {\n MissingTranslationHandler,\n TranslateLoader,\n TranslateModule,\n TranslateParser,\n TranslatePipe,\n} from '@ngx-translate/core';\nimport {PercentageSignTranslateParser} from \"./common/i18n/percentage-sign-translate-parser\";\nimport {AppMissingTranslationService} from \"./common/i18n/app-missing-translation.service\";\nimport {MessagesModule} from 'primeng/messages';\nimport {ToastModule} from 'primeng/toast';\nimport {ProgressSpinnerModule} from 'primeng/progressspinner';\nimport {MessageService} from 'primeng/api';\nimport {AppThemeModule} from './application/theme/app-theme.module';\n\n@NgModule({\n imports: [\n BrowserModule,\n FormsModule,\n AppRoutingModule,\n HttpClientModule,\n BrowserAnimationsModule,\n MyCommonModule,\n I18nModule,\n TranslateModule.forRoot(\n {\n loader: {\n provide: TranslateLoader,\n useFactory: HttpLoaderFactory,\n deps: [HttpClient],\n },\n parser: {\n provide: TranslateParser,\n useClass: PercentageSignTranslateParser,\n },\n missingTranslationHandler: {\n provide: MissingTranslationHandler,\n useExisting: AppMissingTranslationService,\n },\n },\n ),\n MessagesModule,\n ToastModule,\n ProgressSpinnerModule,\n AppThemeModule\n ],\n declarations: [\n AppComponent\n ],\n providers: [\n {provide: LocationStrategy, useClass: HashLocationStrategy},\n AUTH_INTERCEPTOR_PROVIDER,\n AuthGuard,\n RoleGuard,\n AuthenticationService,\n CookieService,\n AppRedirectService,\n MessageService,\n TranslatePipe\n ],\n bootstrap: [AppComponent]\n})\nexport class AppModule { }\n","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment.dev';\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n .catch(err => console.error(err));\n","var map = {\n\t\"./af\": 5637,\n\t\"./af.js\": 5637,\n\t\"./ar\": 6777,\n\t\"./ar-dz\": 4508,\n\t\"./ar-dz.js\": 4508,\n\t\"./ar-kw\": 7504,\n\t\"./ar-kw.js\": 7504,\n\t\"./ar-ly\": 5373,\n\t\"./ar-ly.js\": 5373,\n\t\"./ar-ma\": 2412,\n\t\"./ar-ma.js\": 2412,\n\t\"./ar-ps\": 8823,\n\t\"./ar-ps.js\": 8823,\n\t\"./ar-sa\": 6670,\n\t\"./ar-sa.js\": 6670,\n\t\"./ar-tn\": 6448,\n\t\"./ar-tn.js\": 6448,\n\t\"./ar.js\": 6777,\n\t\"./az\": 3009,\n\t\"./az.js\": 3009,\n\t\"./be\": 8299,\n\t\"./be.js\": 8299,\n\t\"./bg\": 4685,\n\t\"./bg.js\": 4685,\n\t\"./bm\": 1171,\n\t\"./bm.js\": 1171,\n\t\"./bn\": 3590,\n\t\"./bn-bd\": 5841,\n\t\"./bn-bd.js\": 5841,\n\t\"./bn.js\": 3590,\n\t\"./bo\": 4309,\n\t\"./bo.js\": 4309,\n\t\"./br\": 4130,\n\t\"./br.js\": 4130,\n\t\"./bs\": 8033,\n\t\"./bs.js\": 8033,\n\t\"./ca\": 5294,\n\t\"./ca.js\": 5294,\n\t\"./cs\": 3028,\n\t\"./cs.js\": 3028,\n\t\"./cv\": 5807,\n\t\"./cv.js\": 5807,\n\t\"./cy\": 342,\n\t\"./cy.js\": 342,\n\t\"./da\": 8269,\n\t\"./da.js\": 8269,\n\t\"./de\": 1489,\n\t\"./de-at\": 2123,\n\t\"./de-at.js\": 2123,\n\t\"./de-ch\": 7757,\n\t\"./de-ch.js\": 7757,\n\t\"./de.js\": 1489,\n\t\"./dv\": 8152,\n\t\"./dv.js\": 8152,\n\t\"./el\": 7687,\n\t\"./el.js\": 7687,\n\t\"./en-au\": 6668,\n\t\"./en-au.js\": 6668,\n\t\"./en-ca\": 6798,\n\t\"./en-ca.js\": 6798,\n\t\"./en-gb\": 3615,\n\t\"./en-gb.js\": 3615,\n\t\"./en-ie\": 1364,\n\t\"./en-ie.js\": 1364,\n\t\"./en-il\": 9907,\n\t\"./en-il.js\": 9907,\n\t\"./en-in\": 533,\n\t\"./en-in.js\": 533,\n\t\"./en-nz\": 3190,\n\t\"./en-nz.js\": 3190,\n\t\"./en-sg\": 1096,\n\t\"./en-sg.js\": 1096,\n\t\"./eo\": 3962,\n\t\"./eo.js\": 3962,\n\t\"./es\": 7726,\n\t\"./es-do\": 5010,\n\t\"./es-do.js\": 5010,\n\t\"./es-mx\": 3654,\n\t\"./es-mx.js\": 3654,\n\t\"./es-us\": 9043,\n\t\"./es-us.js\": 9043,\n\t\"./es.js\": 7726,\n\t\"./et\": 5343,\n\t\"./et.js\": 5343,\n\t\"./eu\": 728,\n\t\"./eu.js\": 728,\n\t\"./fa\": 787,\n\t\"./fa.js\": 787,\n\t\"./fi\": 1771,\n\t\"./fi.js\": 1771,\n\t\"./fil\": 5335,\n\t\"./fil.js\": 5335,\n\t\"./fo\": 9761,\n\t\"./fo.js\": 9761,\n\t\"./fr\": 1670,\n\t\"./fr-ca\": 8991,\n\t\"./fr-ca.js\": 8991,\n\t\"./fr-ch\": 7280,\n\t\"./fr-ch.js\": 7280,\n\t\"./fr.js\": 1670,\n\t\"./fy\": 4203,\n\t\"./fy.js\": 4203,\n\t\"./ga\": 9858,\n\t\"./ga.js\": 9858,\n\t\"./gd\": 8605,\n\t\"./gd.js\": 8605,\n\t\"./gl\": 7365,\n\t\"./gl.js\": 7365,\n\t\"./gom-deva\": 3896,\n\t\"./gom-deva.js\": 3896,\n\t\"./gom-latn\": 5587,\n\t\"./gom-latn.js\": 5587,\n\t\"./gu\": 7950,\n\t\"./gu.js\": 7950,\n\t\"./he\": 2029,\n\t\"./he.js\": 2029,\n\t\"./hi\": 1897,\n\t\"./hi.js\": 1897,\n\t\"./hr\": 9816,\n\t\"./hr.js\": 9816,\n\t\"./hu\": 2253,\n\t\"./hu.js\": 2253,\n\t\"./hy-am\": 8196,\n\t\"./hy-am.js\": 8196,\n\t\"./id\": 1307,\n\t\"./id.js\": 1307,\n\t\"./is\": 5474,\n\t\"./is.js\": 5474,\n\t\"./it\": 3099,\n\t\"./it-ch\": 8188,\n\t\"./it-ch.js\": 8188,\n\t\"./it.js\": 3099,\n\t\"./ja\": 9127,\n\t\"./ja.js\": 9127,\n\t\"./jv\": 182,\n\t\"./jv.js\": 182,\n\t\"./ka\": 758,\n\t\"./ka.js\": 758,\n\t\"./kk\": 3444,\n\t\"./kk.js\": 3444,\n\t\"./km\": 2034,\n\t\"./km.js\": 2034,\n\t\"./kn\": 6223,\n\t\"./kn.js\": 6223,\n\t\"./ko\": 3064,\n\t\"./ko.js\": 3064,\n\t\"./ku\": 8714,\n\t\"./ku-kmr\": 961,\n\t\"./ku-kmr.js\": 961,\n\t\"./ku.js\": 8714,\n\t\"./ky\": 2062,\n\t\"./ky.js\": 2062,\n\t\"./lb\": 4796,\n\t\"./lb.js\": 4796,\n\t\"./lo\": 9279,\n\t\"./lo.js\": 9279,\n\t\"./lt\": 106,\n\t\"./lt.js\": 106,\n\t\"./lv\": 1840,\n\t\"./lv.js\": 1840,\n\t\"./me\": 2240,\n\t\"./me.js\": 2240,\n\t\"./mi\": 3588,\n\t\"./mi.js\": 3588,\n\t\"./mk\": 5518,\n\t\"./mk.js\": 5518,\n\t\"./ml\": 7823,\n\t\"./ml.js\": 7823,\n\t\"./mn\": 8657,\n\t\"./mn.js\": 8657,\n\t\"./mr\": 1285,\n\t\"./mr.js\": 1285,\n\t\"./ms\": 3014,\n\t\"./ms-my\": 6253,\n\t\"./ms-my.js\": 6253,\n\t\"./ms.js\": 3014,\n\t\"./mt\": 167,\n\t\"./mt.js\": 167,\n\t\"./my\": 7940,\n\t\"./my.js\": 7940,\n\t\"./nb\": 14,\n\t\"./nb.js\": 14,\n\t\"./ne\": 9023,\n\t\"./ne.js\": 9023,\n\t\"./nl\": 4208,\n\t\"./nl-be\": 1412,\n\t\"./nl-be.js\": 1412,\n\t\"./nl.js\": 4208,\n\t\"./nn\": 1354,\n\t\"./nn.js\": 1354,\n\t\"./oc-lnc\": 870,\n\t\"./oc-lnc.js\": 870,\n\t\"./pa-in\": 389,\n\t\"./pa-in.js\": 389,\n\t\"./pl\": 7342,\n\t\"./pl.js\": 7342,\n\t\"./pt\": 4774,\n\t\"./pt-br\": 3003,\n\t\"./pt-br.js\": 3003,\n\t\"./pt.js\": 4774,\n\t\"./ro\": 5333,\n\t\"./ro.js\": 5333,\n\t\"./ru\": 3451,\n\t\"./ru.js\": 3451,\n\t\"./sd\": 3921,\n\t\"./sd.js\": 3921,\n\t\"./se\": 9682,\n\t\"./se.js\": 9682,\n\t\"./si\": 582,\n\t\"./si.js\": 582,\n\t\"./sk\": 4348,\n\t\"./sk.js\": 4348,\n\t\"./sl\": 5337,\n\t\"./sl.js\": 5337,\n\t\"./sq\": 9358,\n\t\"./sq.js\": 9358,\n\t\"./sr\": 683,\n\t\"./sr-cyrl\": 9382,\n\t\"./sr-cyrl.js\": 9382,\n\t\"./sr.js\": 683,\n\t\"./ss\": 1156,\n\t\"./ss.js\": 1156,\n\t\"./sv\": 9855,\n\t\"./sv.js\": 9855,\n\t\"./sw\": 8536,\n\t\"./sw.js\": 8536,\n\t\"./ta\": 7754,\n\t\"./ta.js\": 7754,\n\t\"./te\": 7809,\n\t\"./te.js\": 7809,\n\t\"./tet\": 1297,\n\t\"./tet.js\": 1297,\n\t\"./tg\": 2527,\n\t\"./tg.js\": 2527,\n\t\"./th\": 5862,\n\t\"./th.js\": 5862,\n\t\"./tk\": 9331,\n\t\"./tk.js\": 9331,\n\t\"./tl-ph\": 4387,\n\t\"./tl-ph.js\": 4387,\n\t\"./tlh\": 3592,\n\t\"./tlh.js\": 3592,\n\t\"./tr\": 9732,\n\t\"./tr.js\": 9732,\n\t\"./tzl\": 9570,\n\t\"./tzl.js\": 9570,\n\t\"./tzm\": 3553,\n\t\"./tzm-latn\": 7699,\n\t\"./tzm-latn.js\": 7699,\n\t\"./tzm.js\": 3553,\n\t\"./ug-cn\": 5674,\n\t\"./ug-cn.js\": 5674,\n\t\"./uk\": 9974,\n\t\"./uk.js\": 9974,\n\t\"./ur\": 5773,\n\t\"./ur.js\": 5773,\n\t\"./uz\": 357,\n\t\"./uz-latn\": 7135,\n\t\"./uz-latn.js\": 7135,\n\t\"./uz.js\": 357,\n\t\"./vi\": 43,\n\t\"./vi.js\": 43,\n\t\"./x-pseudo\": 767,\n\t\"./x-pseudo.js\": 767,\n\t\"./yo\": 150,\n\t\"./yo.js\": 150,\n\t\"./zh-cn\": 1828,\n\t\"./zh-cn.js\": 1828,\n\t\"./zh-hk\": 6644,\n\t\"./zh-hk.js\": 6644,\n\t\"./zh-mo\": 9305,\n\t\"./zh-mo.js\": 9305,\n\t\"./zh-tw\": 1860,\n\t\"./zh-tw.js\": 1860\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 5358;"],"x_google_ignoreList":[35]}