{"version":3,"file":"app-c92480b7.xxxxxxxxxxxxxxxxxxxx.bundle.js","mappings":";;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACfA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;AAGA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAIA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAGA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAGA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AAGA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AAAA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAAA;AACA;AAIA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;;;;;ACzTA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACnDA;AACA;AAEA;AAAA;AAMA;AAEA;AACA;AACA;AAIA;AACA;AAGA;AAAA;;;;;;;;;;;;;;;;AClBA;AAKA;;;;;;;;;;;;;;;;ACNA;AAqBA;AAbA;AACA;AACA;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC1CA;AAKA;;;;;;;;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACFA;AACA;AAEA;AAAA;;AACA;AACA;AACA;AAAA;;;;;;;;;;;;;;;;ACRA;AAAA;AACA;AAEA;AAIA;AAEA;AACA;AACA;AAAA;;;;;;;;;;;;;;;;ACXA;AACA;AAGA;AAFA;AACA;AAEA;AACA;;;;;;;;;;;;;;;;ACNA;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AAIA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxBA;AAAA;;AAAA;AAFA;AAFA;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AAEA;AAAA;AAGA;AACA;AAAA;AAHA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLA;AACA;AAGA;AAUA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAdA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AARA;AADA;AAWA;AAVA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJA;AACA;AAIA;AAMA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAVA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AAJA;AADA;AAOA;AANA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLA;AACA;AACA;AAIA;AAGA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAVA;AAAA;AAAA;AAAA;AADA;AAFA;AAKA;AAHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AAGA;AAAA;AACA;AASA;AAPA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AATA;AAAA;;AAAA;AADA;AADA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AArBA;AADA;AAIA;AACA;AACA;AACA;AANA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACRA;AACA;AAGA;AAIA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AARA;AAAA;;AAAA;AACA;AAAA;;AAAA;AAFA;AADA;AAKA;AAJA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJA;AAEA;AAAA;AAEA;AACA;AACA;AAMA;AAHA;AACA;AACA;AACA;AATA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;AACA;AAAA;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AAGA;AAMA;AACA;AACA;AAPA;AACA;AACA;AAMA;AAEA;;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AAEA;AAEA;AAGA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAvEA;AADA;AAQA;AACA;AARA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAWA;AACA;AACA;AAZA;AACA;AACA;AACA;AAGA;AACA;AACA;AAKA;AACA;AAEA;;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA3JA;AADA;AAaA;AACA;AAbA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACVA;AACA;AAGA;AAIA;AAAA;AAHA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAZA;AAAA;;AAAA;AACA;AAAA;;AAAA;AAFA;AADA;AAKA;AAJA;;;;;;;;;;;;;;;;;ACFA;AACA;AACA;;;;;;;;;;;;;;;;;;ACJA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJA;AACA;AACA;AAGA;AAGA;AACA;AAHA;AAIA;AACA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlDA;AADA;AAKA;AAAA;AAJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLA;AACA;AACA;AAEA;AACA;AAGA;AAOA;AACA;AACA;AACA;AAPA;AAEA;AAuBA;AACA;AACA;AACA;AACA;AACA;AAtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AASA;;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAlJA;AADA;AASA;AACA;AACA;AAVA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACRA;AAEA;AAGA;AACA;AAMA;AAIA;AACA;AACA;AACA;AANA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AAEA;AAEA;AACA;AAAA;AACA;AA3HA;AADA;AAOA;AADA;AACA;AANA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAIA;AAHA;AACA;AAGA;AAEA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA;AAEA;AACA;AACA;AAAA;AAEA;;AACA;;;;;;;;;;;;;;;;;;AAkBA;AAEA;AAEA;AACA;AAAA;AAEA;;AACA;;AAEA;AAEA;AACA;AAAA;AACA;AA/EA;AADA;AAKA;AAFA;AACA;AACA;AAJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACRA;AACA;AAEA;AAEA;AAIA;AACA;AACA;AACA;AANA;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AACA;AAJA;AAKA;AACA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAEA;;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxFA;AADA;AAMA;AADA;AACA;AALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AAGA;AAGA;AACA;AACA;AAJA;AAKA;AACA;AACA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AA5CA;AADA;AAMA;AADA;AACA;AALA;;;;;;;;;;;;;;;;;ACNA;AAAA;AAKA;AAEA;AAgBA;AAZA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA","sources":["webpack://contact-management-web/./src/resources/elements/check-box/check-box.scss","webpack://contact-management-web/./src/resources/elements/contacts-list-pagination/contacts-list-pagination.scss","webpack://contact-management-web/./src/resources/elements/contacts-list-view/contacts-list-view.scss","webpack://contact-management-web/./src/resources/elements/dl-column-mapping/dl-column-mapping.scss","webpack://contact-management-web/./src/resources/elements/error-dialog/error-dialog.scss","webpack://contact-management-web/./src/resources/elements/header-element/header-element.scss","webpack://contact-management-web/./src/resources/elements/info-element/info-element.scss","webpack://contact-management-web/./src/resources/elements/navigation-menu/navigation-menu.scss","webpack://contact-management-web/./src/resources/elements/search-input/search-input.scss","webpack://contact-management-web/./src/resources/elements/start-here/start-here.scss","webpack://contact-management-web/./src/resources/elements/text-link/text-link.scss","webpack://contact-management-web/./src/resources/elements/check-box/check-box.html","webpack://contact-management-web/./src/resources/elements/contacts-list-pagination/contacts-list-pagination.html","webpack://contact-management-web/./src/resources/elements/contacts-list-view/contacts-list-view.html","webpack://contact-management-web/./src/resources/elements/dl-column-mapping/dl-column-mapping.html","webpack://contact-management-web/./src/resources/elements/error-dialog/error-dialog.html","webpack://contact-management-web/./src/resources/elements/header-element/header-element.html","webpack://contact-management-web/./src/resources/elements/info-element/info-element.html","webpack://contact-management-web/./src/resources/elements/navigation-menu/navigation-menu.html","webpack://contact-management-web/./src/resources/elements/puzzel-button/puzzel-button.html","webpack://contact-management-web/./src/resources/elements/search-input/search-input.html","webpack://contact-management-web/./src/resources/elements/settings-export/settings-export.html","webpack://contact-management-web/./src/resources/elements/settings-ftp/settings-ftp.html","webpack://contact-management-web/./src/resources/elements/start-here/start-here.html","webpack://contact-management-web/./src/resources/elements/text-link/text-link.html","webpack://contact-management-web/./src/main.ts","webpack://contact-management-web/./src/models/column-mappings.ts","webpack://contact-management-web/./src/models/column.ts","webpack://contact-management-web/./src/models/contact-import-metadata.ts","webpack://contact-management-web/./src/models/contact-management-settings.ts","webpack://contact-management-web/./src/models/contact-model.ts","webpack://contact-management-web/./src/models/error-dialog-content.ts","webpack://contact-management-web/./src/models/events/search-event.ts","webpack://contact-management-web/./src/models/ftp-contact-import-metadata.ts","webpack://contact-management-web/./src/models/ftp-settings.ts","webpack://contact-management-web/./src/models/graphql-errors.ts","webpack://contact-management-web/./src/models/status-model.ts","webpack://contact-management-web/./src/resources/attributes/bootstrap-tooltips.ts","webpack://contact-management-web/./src/resources/elements/check-box/check-box.ts","webpack://contact-management-web/./src/resources/elements/contacts-list-pagination/contacts-list-pagination.ts","webpack://contact-management-web/./src/resources/elements/contacts-list-view/contacts-list-view.ts","webpack://contact-management-web/./src/resources/elements/error-dialog/error-dialog.ts","webpack://contact-management-web/./src/resources/elements/loading-indicator/loading-indicator.ts","webpack://contact-management-web/./src/resources/elements/navigation-menu/navigation-menu.ts","webpack://contact-management-web/./src/resources/elements/puzzel-button/puzzel-button.ts","webpack://contact-management-web/./src/resources/elements/search-input/search-input.ts","webpack://contact-management-web/./src/resources/elements/settings-export/settings-export.ts","webpack://contact-management-web/./src/resources/elements/settings-ftp/settings-ftp.ts","webpack://contact-management-web/./src/resources/elements/text-link/text-link.ts","webpack://contact-management-web/./src/resources/index.ts","webpack://contact-management-web/./src/resources/value-converters/date-format.ts","webpack://contact-management-web/./src/resources/value-converters/filter-on-property.ts","webpack://contact-management-web/./src/resources/value-converters/object-keys.ts","webpack://contact-management-web/./src/resources/value-converters/sort-by-date.ts","webpack://contact-management-web/./src/resources/value-converters/take-value.ts","webpack://contact-management-web/./src/services/auth-http-service.ts","webpack://contact-management-web/./src/services/auth-service.ts","webpack://contact-management-web/./src/services/backend-service.ts","webpack://contact-management-web/./src/services/contact-service.ts","webpack://contact-management-web/./src/services/graphql-service.ts","webpack://contact-management-web/./src/services/pcc-api-service.ts","webpack://contact-management-web/./src/services/solution-api-service.ts","webpack://contact-management-web/./src/services/state-service.ts"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.checkbox-label {\n background: transparent;\n color: #32424f;\n font-weight: bold;\n font-size: 14px;\n margin-left: 5px;\n}\n\n/* The container */\n.cb-container {\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n color: #5872f0;\n}\n\n/* Hide the browser's default checkbox */\n.cb-container input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n height: 0;\n width: 0;\n}\n\n/* Create a custom checkbox */\n.checkmark {\n position: absolute;\n top: 0;\n left: 0;\n height: 20px;\n width: 20px;\n background-color: #fff;\n border: 1px #cdcdcd solid;\n border-radius: 3px;\n}\n\n/* On mouse-over, add a grey background color */\n.cb-container:hover input ~ .checkmark {\n background-color: #fff;\n}\n\n/* When the checkbox is checked, add a blue background */\n.cb-container input:checked ~ .checkmark {\n background-color: #5872f0;\n}\n\n/* When the checkbox is checked, change label to blue */\n.cb-container input:checked ~ .checkbox-label {\n color: #5872f0;\n}\n\n/* Create the checkmark/indicator (hidden when not checked) */\n.checkmark:after {\n content: \"\";\n position: absolute;\n display: none;\n}\n\n/* Show the checkmark when checked */\n.cb-container input:checked ~ .checkmark:after {\n display: block;\n}\n\n/* Style the checkmark/indicator */\n.cb-container .checkmark:after {\n left: 6px;\n top: 0px;\n width: 7px;\n height: 15px;\n border: solid white;\n border-width: 0 2px 2px 0;\n -webkit-transform: rotate(45deg);\n -ms-transform: rotate(45deg);\n transform: rotate(40deg);\n}\n\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n margin-right: 15px;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/check-box/check-box.scss\"],\"names\":[],\"mappings\":\"AACA;EACE,uBAAA;EACE,cAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;AAAJ;;AAGA,kBAAA;AACA;EACE,eAAA;EACA,yBAAA;EACA,sBAAA;EACA,qBAAA;EACA,iBAAA;EACA,cAAA;AAAF;;AAGA,wCAAA;AACA;EACE,kBAAA;EACA,UAAA;EACA,eAAA;EACA,SAAA;EACA,QAAA;AAAF;;AAGA,6BAAA;AACA;EACE,kBAAA;EACA,MAAA;EACA,OAAA;EACA,YAAA;EACA,WAAA;EACA,sBAAA;EACA,yBAAA;EACA,kBAAA;AAAF;;AAGA,+CAAA;AACA;EACE,sBAAA;AAAF;;AAGA,wDAAA;AACA;EACE,yBAAA;AAAF;;AAGA,uDAAA;AACA;EACE,cAAA;AAAF;;AAGA,6DAAA;AACA;EACE,WAAA;EACA,kBAAA;EACA,aAAA;AAAF;;AAGA,oCAAA;AACA;EACE,cAAA;AAAF;;AAGA,kCAAA;AACA;EACE,SAAA;EACA,QAAA;EACA,UAAA;EACA,YAAA;EACA,mBAAA;EACA,yBAAA;EACA,gCAAA;EACA,4BAAA;EACA,wBAAA;AAAF;;AAGA;EACE,kBAAA;EACA,qBAAA;EACA,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,sBAAA;EACA,eAAA;EACA,kBAAA;AAAF\",\"sourcesContent\":[\"\\n.checkbox-label {\\n background: transparent;\\n color: #32424f;\\n font-weight: bold;\\n font-size: 14px;\\n margin-left: 5px;\\n}\\n\\n/* The container */\\n.cb-container {\\n cursor: pointer;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n color: #5872f0;\\n}\\n\\n/* Hide the browser's default checkbox */\\n.cb-container input {\\n position: absolute;\\n opacity: 0;\\n cursor: pointer;\\n height: 0;\\n width: 0;\\n}\\n\\n/* Create a custom checkbox */\\n.checkmark {\\n position: absolute;\\n top: 0;\\n left: 0;\\n height: 20px;\\n width: 20px;\\n background-color: #fff;\\n border: 1px #cdcdcd solid;\\n border-radius: 3px;\\n}\\n\\n/* On mouse-over, add a grey background color */\\n.cb-container:hover input ~ .checkmark {\\n background-color: #fff;\\n}\\n\\n/* When the checkbox is checked, add a blue background */\\n.cb-container input:checked ~ .checkmark {\\n background-color: #5872f0;\\n}\\n\\n/* When the checkbox is checked, change label to blue */\\n.cb-container input:checked ~ .checkbox-label {\\n color: #5872f0;\\n}\\n\\n/* Create the checkmark/indicator (hidden when not checked) */\\n.checkmark:after {\\n content: \\\"\\\";\\n position: absolute;\\n display: none;\\n}\\n\\n/* Show the checkmark when checked */\\n.cb-container input:checked ~ .checkmark:after {\\n display: block;\\n}\\n\\n/* Style the checkmark/indicator */\\n.cb-container .checkmark:after {\\n left: 6px;\\n top: 0px;\\n width: 7px;\\n height: 15px;\\n border: solid white;\\n border-width: 0 2px 2px 0;\\n -webkit-transform: rotate(45deg);\\n -ms-transform: rotate(45deg);\\n transform: rotate(40deg);\\n}\\n\\n.checkbox-inline {\\n position: relative;\\n display: inline-block;\\n padding-left: 20px;\\n margin-bottom: 0;\\n font-weight: 400;\\n vertical-align: middle;\\n cursor: pointer;\\n margin-right: 15px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.page-link-active {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #212529;\n font-weight: bolder;\n text-decoration: none !important;\n}\n\n.page-link-active i {\n color: #212529;\n}\n\n.page-link-default {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/contacts-list-pagination/contacts-list-pagination.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAA;EACA,cAAA;EACA,uBAAA;EACA,iBAAA;EACA,iBAAA;EACA,cAAA;EACA,mBAAA;EACA,gCAAA;AACF;;AAEA;EACE,cAAA;AACF;;AAEA;EACE,kBAAA;EACE,cAAA;EACA,uBAAA;EACA,iBAAA;EACA,iBAAA;EACA,cAAA;AACJ\",\"sourcesContent\":[\".page-link-active{\\n position: relative;\\n display: block;\\n padding: 0.5rem 0.75rem;\\n margin-left: -1px;\\n line-height: 1.25;\\n color: #212529;\\n font-weight: bolder; \\n text-decoration: none !important;\\n}\\n\\n.page-link-active i{\\n color: #212529;\\n}\\n\\n.page-link-default{\\n position: relative;\\n display: block;\\n padding: 0.5rem 0.75rem;\\n margin-left: -1px;\\n line-height: 1.25;\\n color: #007bff; \\n}\\n\\n// .page-link-default:hover{\\n// font-size: 20px;\\n// }\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.tableRow {\n cursor: pointer;\n}\n\n.column-spacer {\n width: 20px;\n padding: 0 !important;\n}\n\na:link {\n text-decoration: underline;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/contacts-list-view/contacts-list-view.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,eAAA;AACF;;AAEA;EACE,WAAA;EACA,qBAAA;AACF;;AAEA;EACE,0BAAA;AACF\",\"sourcesContent\":[\".tableRow {\\n cursor: pointer;\\n}\\n\\n.column-spacer {\\n width: 20px;\\n padding: 0 !important; \\n}\\n\\na:link {\\n text-decoration: underline;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.column-mapping option {\n color: black;\n}\n\n.selected-column-color {\n color: #4f65ca;\n}\n\n.column-mapping {\n border-radius: 3px;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/dl-column-mapping/dl-column-mapping.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,YAAA;AACF;;AAEA;EACE,cAAA;AACF;;AAEA;EACE,kBAAA;AACF\",\"sourcesContent\":[\".column-mapping option {\\n color: black;\\n}\\n\\n.selected-column-color {\\n color: #4f65ca;\\n}\\n\\n.column-mapping {\\n border-radius: 3px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `ux-dialog-overlay.active {\n background-color: #b3b4ba;\n opacity: 0.5;\n}\n\nux-dialog > ux-dialog-footer {\n display: block;\n padding: 6px;\n border-top: 0cm;\n text-align: center;\n}\n\nux-dialog {\n border-radius: 0%;\n background: #f1f3f5;\n width: 450px;\n box-shadow: none;\n border-style: solid;\n border-color: white;\n border-width: 2px;\n}\n\nux-dialog > ux-dialog-header {\n display: block;\n padding: 0;\n text-align: left;\n border-bottom: 0cm;\n font-weight: bolder;\n}\n\nux-dialog > ux-dialog-body {\n padding: 25px;\n}\n\nux-dialog-container {\n padding-top: 16%;\n}\n\nux-dialog > ux-dialog-header > button {\n position: relative;\n right: 30px;\n color: #5872f0;\n font-size: 30px;\n}\n\n.window-title {\n background-color: white;\n position: relative;\n margin-top: -1px;\n left: 0px;\n top: -1px;\n width: fit-content;\n padding: 5px;\n font-size: 12px;\n font-weight: bold;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/error-dialog/error-dialog.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,yBAAA;EACA,YAAA;AACF;;AAEA;EACE,cAAA;EACA,YAAA;EACA,eAAA;EACA,kBAAA;AACF;;AAEA;EACE,iBAAA;EACA,mBAAA;EACA,YAAA;EACA,gBAAA;EACA,mBAAA;EACA,mBAAA;EACA,iBAAA;AACF;;AAEA;EACE,cAAA;EACA,UAAA;EACA,gBAAA;EACA,kBAAA;EACA,mBAAA;AACF;;AAEA;EACE,aAAA;AACF;;AAEA;EACE,gBAAA;AACF;;AAEA;EACE,kBAAA;EACA,WAAA;EACA,cAAA;EACA,eAAA;AACF;;AAEA;EACE,uBAAA;EACA,kBAAA;EACA,gBAAA;EACA,SAAA;EACA,SAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;EACA,iBAAA;AACF\",\"sourcesContent\":[\"ux-dialog-overlay.active {\\n background-color: #b3b4ba;\\n opacity: .5;\\n}\\n\\nux-dialog>ux-dialog-footer {\\n display: block;\\n padding: 6px;\\n border-top: 0cm;\\n text-align: center;\\n}\\n\\nux-dialog {\\n border-radius: 0%;\\n background: #f1f3f5;\\n width: 450px;\\n box-shadow: none;\\n border-style: solid;\\n border-color: white;\\n border-width: 2px;\\n}\\n\\nux-dialog>ux-dialog-header {\\n display: block;\\n padding: 0;\\n text-align: left;\\n border-bottom: 0cm;\\n font-weight: bolder;\\n}\\n\\nux-dialog>ux-dialog-body {\\n padding: 25px;\\n}\\n\\nux-dialog-container {\\n padding-top: 16%\\n}\\n\\nux-dialog>ux-dialog-header>button {\\n position: relative;\\n right: 30px;\\n color: #5872f0;\\n font-size: 30px;\\n}\\n\\n.window-title {\\n background-color: white;\\n position: relative;\\n margin-top: -1px;\\n left: 0px;\\n top: -1px;\\n width: fit-content;\\n padding: 5px;\\n font-size: 12px;\\n font-weight: bold;\\n}\\n\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.header-row {\n display: flex;\n}\n\n.info-element-class {\n display: flex;\n align-items: center;\n margin: 12px 0 0 10px;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/header-element/header-element.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,aAAA;AACF;;AAEA;EACE,aAAA;EACA,mBAAA;EACA,qBAAA;AACF\",\"sourcesContent\":[\".header-row {\\n display: flex;\\n}\\n\\n.info-element-class {\\n display: flex;\\n align-items: center;\\n margin: 12px 0 0 10px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.info-text {\n color: #32424f;\n cursor: pointer;\n font-size: 1.5em;\n}\n\n.info-text:hover,\n.info-text:focus,\n.info-text:active {\n border-color: #d01458;\n color: #d01458;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/info-element/info-element.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,cAAA;EACA,eAAA;EAGA,gBAAA;AADF;;AAIA;;;EAGE,qBAAA;EACA,cAAA;AADF\",\"sourcesContent\":[\".info-text {\\n color: #32424f;\\n cursor: pointer;\\n // margin: 25px 0px auto 5px;\\n // padding-top: 0px;\\n font-size: 1.5em;\\n}\\n\\n.info-text:hover,\\n.info-text:focus,\\n.info-text:active { \\n border-color: #d01458;\\n color: #d01458;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../../assets/puzzel.png\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.navigationMenu {\n padding-top: 12px;\n background-color: #32424f;\n color: #cfcfcf;\n width: 100%;\n height: 100px;\n background-image: url(${___CSS_LOADER_URL_REPLACEMENT_0___});\n background-position: right 40px top 30px;\n background-repeat: no-repeat;\n background-size: 151px 47px;\n position: relative;\n z-index: 900;\n font-size: 13px;\n}\n\n.unselectable {\n user-select: none;\n}\n\n.navigationList {\n color: #999999;\n position: relative;\n height: 100%;\n}\n\nul {\n list-style-type: none;\n padding: 0;\n}\n\nul.navigationList > li {\n float: left;\n position: relative;\n height: 100%;\n}\n\nul.navigationList > li.static {\n height: auto;\n padding: 0 7px;\n margin-top: 13px;\n}\n\nul.navigationList > li.active i {\n color: #fff;\n}\n\nul.navigationList > li.active:hover i {\n color: #fff;\n}\n\nul.navigationList > li.active span {\n color: #fff;\n}\n\n.navigationList > li:first-child {\n margin-left: 20px;\n}\n\n.navigationList > li.rightBorder {\n border-right: 0.5px solid #cfcfcf;\n height: 45px;\n margin: 13px 20px;\n}\n\n.imageAlign {\n text-align: center;\n display: inline-block;\n height: 100%;\n cursor: pointer;\n padding: 7px 14px;\n}\n\n.imageAlign:hover {\n color: #fff;\n}\n\n.header-info {\n margin: 0;\n color: #fff;\n width: 180px;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.disabled:hover, .disabled:hover i {\n color: inherit;\n}\n\n.search-input {\n float: right !important;\n right: 220px;\n top: 14px;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/navigation-menu/navigation-menu.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,iBAAA;EACA,yBAAA;EACA,cAAA;EACA,WAAA;EACA,aAAA;EACA,yDAAA;EACA,wCAAA;EACA,4BAAA;EACA,2BAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;AACF;;AACA;EACE,iBAAA;AAEF;;AAAA;EACE,cAAA;EACA,kBAAA;EACA,YAAA;AAGF;;AAAA;EACE,qBAAA;EACA,UAAA;AAGF;;AAAA;EACE,WAAA;EACA,kBAAA;EACA,YAAA;AAGF;;AAAA;EACE,YAAA;EACA,cAAA;EACA,gBAAA;AAGF;;AAAA;EACE,WAAA;AAGF;;AAAA;EACE,WAAA;AAGF;;AAAA;EACE,WAAA;AAGF;;AAAA;EACE,iBAAA;AAGF;;AAAA;EACE,iCAAA;EACA,YAAA;EACA,iBAAA;AAGF;;AAAA;EACE,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,eAAA;EACA,iBAAA;AAGF;;AAAA;EACE,WAAA;AAGF;;AAAA;EACE,SAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;EACA,mBAAA;AAGF;;AAAA;EACE,cAAA;AAGF;;AAAA;EACE,uBAAA;EACA,YAAA;EACA,SAAA;AAGF\",\"sourcesContent\":[\".navigationMenu {\\n padding-top: 12px;\\n background-color: #32424f;\\n color: #cfcfcf;\\n width: 100%;\\n height: 100px;\\n background-image: url(\\\"../../assets/puzzel.png\\\");\\n background-position: right 40px top 30px;\\n background-repeat: no-repeat;\\n background-size: 151px 47px;\\n position: relative;\\n z-index: 900;\\n font-size: 13px;\\n}\\n.unselectable {\\n user-select: none;\\n}\\n.navigationList {\\n color: #999999;\\n position: relative;\\n height: 100%;\\n}\\n\\nul {\\n list-style-type: none;\\n padding: 0;\\n}\\n\\nul.navigationList > li {\\n float: left;\\n position: relative;\\n height: 100%;\\n}\\n\\nul.navigationList > li.static {\\n height: auto;\\n padding: 0 7px;\\n margin-top: 13px;\\n}\\n\\nul.navigationList > li.active i {\\n color: #fff;\\n}\\n\\nul.navigationList > li.active:hover i {\\n color: #fff;\\n}\\n\\nul.navigationList > li.active span {\\n color: #fff;\\n}\\n\\n.navigationList > li:first-child {\\n margin-left: 20px;\\n}\\n\\n.navigationList > li.rightBorder {\\n border-right: 0.5px solid #cfcfcf;\\n height: 45px;\\n margin: 13px 20px;\\n}\\n\\n.imageAlign {\\n text-align: center;\\n display: inline-block;\\n height: 100%;\\n cursor: pointer;\\n padding: 7px 14px;\\n}\\n\\n.imageAlign:hover {\\n color: #fff;\\n}\\n\\n.header-info {\\n margin: 0;\\n color: #fff;\\n width: 180px;\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n\\n.disabled:hover, .disabled:hover i {\\n color: inherit;\\n}\\n\\n.search-input {\\n float: right !important;\\n right: 220px;\\n top: 14px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.search-input-bar {\n width: 100%;\n padding: 20px;\n margin: -10px 0 0 0;\n top: -10px;\n}\n\n.search-input .form-control {\n padding-left: 1rem;\n font-size: 10pt;\n}\n\n.search-input {\n display: flex;\n margin-bottom: 0;\n}\n\n.search-input .form-control-feedback {\n position: absolute;\n z-index: 2;\n display: block;\n width: 2.375rem;\n height: 34px;\n line-height: 2.15rem;\n text-align: center;\n pointer-events: none;\n color: #aaa;\n right: 15px;\n background: white;\n border: 1px #ced4da solid;\n border-radius: 0 0.25rem 0.25rem 0;\n border-left: none;\n}\n\n.search-input .form-control:focus {\n border-color: #ced4da;\n}\n\n.query-element span {\n color: red;\n}\n\n.custom-control-label {\n vertical-align: middle;\n margin-bottom: 0.5rem;\n}\n\n.col-switch {\n width: 40px;\n}\n\n.col-search {\n width: 100%;\n}\n\ninput[type=text]::placeholder {\n opacity: 0.5;\n}\n\n@media screen and (max-width: 920px) {\n .search-input {\n display: none;\n }\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/search-input/search-input.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,WAAA;EACA,aAAA;EACA,mBAAA;EACA,UAAA;AACF;;AAEA;EACE,kBAAA;EAEA,eAAA;AAAF;;AAGA;EACE,aAAA;EACA,gBAAA;AAAF;;AAGA;EACE,kBAAA;EACA,UAAA;EACA,cAAA;EACA,eAAA;EACA,YAAA;EACA,oBAAA;EACA,kBAAA;EACA,oBAAA;EACA,WAAA;EACA,WAAA;EACA,iBAAA;EACA,yBAAA;EACA,kCAAA;EACA,iBAAA;AAAF;;AAGA;EAEE,qBAAA;AADF;;AAIC;EACE,UAAA;AADH;;AAIC;EACC,sBAAA;EACA,qBAAA;AADF;;AAIA;EACE,WAAA;AADF;;AAIA;EACE,WAAA;AADF;;AAGA;EACE,YAAA;AAAF;;AAGA;EACE;IACE,aAAA;EAAF;AACF\",\"sourcesContent\":[\".search-input-bar {\\n width: 100%;\\n padding: 20px;\\n margin: -10px 0 0 0;\\n top: -10px;\\n}\\n\\n.search-input .form-control {\\n padding-left: 1rem;\\n // border-radius: 20px;\\n font-size: 10pt;\\n}\\n\\n.search-input {\\n display: flex;\\n margin-bottom: 0;\\n}\\n\\n.search-input .form-control-feedback {\\n position: absolute;\\n z-index: 2;\\n display: block;\\n width: 2.375rem;\\n height: 34px;\\n line-height: 2.15rem;\\n text-align: center;\\n pointer-events: none;\\n color: #aaa;\\n right: 15px;\\n background: white;\\n border: 1px #ced4da solid;\\n border-radius: 0 0.25rem 0.25rem 0;\\n border-left: none;\\n}\\n\\n.search-input .form-control:focus\\n {\\n border-color: #ced4da;\\n }\\n\\n .query-element span {\\n color: red;\\n }\\n\\n .custom-control-label {\\n vertical-align: middle;\\n margin-bottom: 0.5rem;\\n}\\n\\n.col-switch {\\n width: 40px;\\n}\\n\\n.col-search {\\n width: 100%;\\n}\\ninput[type=\\\"text\\\"]::placeholder {\\n opacity: 0.5;\\n}\\n\\n@media screen and (max-width: 920px) {\\n .search-input {\\n display: none;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.helper-start {\n position: absolute;\n left: 375px;\n top: 90px;\n animation: slide-up 0.4s ease;\n}\n\n.helper-start-text {\n bottom: 32px;\n color: #515665;\n float: right;\n font-size: 2.4em;\n line-height: 50%;\n left: 200px;\n position: absolute;\n white-space: nowrap;\n font-weight: bold;\n}\n\n.helper-start img {\n width: 200px;\n}\n\n@keyframes slide-up {\n 0% {\n opacity: 0;\n transform: translate(30px, 30px);\n transform: rotate(-5deg);\n }\n 100% {\n opacity: 1;\n transform: translate(0, 0);\n transform: rotate(0);\n }\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/start-here/start-here.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAA;EACA,WAAA;EACA,SAAA;EACA,6BAAA;AACF;;AAEA;EACE,YAAA;EACA,cAAA;EACA,YAAA;EACA,gBAAA;EACA,gBAAA;EACA,WAAA;EACA,kBAAA;EACA,mBAAA;EACA,iBAAA;AACF;;AAEA;EACE,YAAA;AACF;;AAEA;EACE;IACI,UAAA;IACA,gCAAA;IACA,wBAAA;EACJ;EACA;IACI,UAAA;IACA,0BAAA;IACA,oBAAA;EACJ;AACF\",\"sourcesContent\":[\".helper-start {\\n position: absolute;\\n left: 375px;\\n top: 90px;\\n animation: slide-up 0.4s ease;\\n}\\n\\n.helper-start-text {\\n bottom: 32px;\\n color: #515665;\\n float: right;\\n font-size: 2.4em;\\n line-height: 50%;\\n left: 200px;\\n position: absolute;\\n white-space: nowrap;\\n font-weight: bold;\\n}\\n\\n.helper-start img {\\n width: 200px;\\n}\\n\\n@keyframes slide-up {\\n 0% {\\n opacity: 0;\\n transform: translate(30px, 30px);\\n transform: rotate(-5deg);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(0, 0);\\n transform: rotate(0);\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.no-link {\n color: #5872f0;\n font-weight: bolder;\n}\n\n.href-buttons,\n.href-buttons:hover {\n color: #5872f0;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/resources/elements/text-link/text-link.scss\"],\"names\":[],\"mappings\":\"AAAA;EACE,cAAA;EACA,mBAAA;AACF;;AAEA;;EAEE,cAAA;AACF\",\"sourcesContent\":[\".no-link {\\n color: #5872f0;\\n font-weight: bolder;\\n}\\n\\n.href-buttons,\\n.href-buttons:hover {\\n color: #5872f0;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","module.exports = \"\\n\";","import { AuthService } from \"./services/auth-service\";\n/// \nimport { Aurelia } from \"aurelia-framework\";\nimport environment from \"./environment\";\nimport { PLATFORM } from \"aurelia-pal\";\nimport * as Bluebird from \"bluebird\";\nimport \"@fortawesome/fontawesome-free/css/all.css\";\n\n// remove out if you don't want a Promise polyfill (remove also from webpack.config.js)\nBluebird.config({ warnings: { wForgottenReturn: false } });\n\nexport function configure(aurelia: Aurelia) {\n // Strip non-injectable built-in types from DI dependency lists so the\n // container never tries to `Reflect.construct(Function, [])` (which becomes\n // `new Function()` and violates a strict CSP that disallows 'unsafe-eval').\n // This happens because tsconfig has `emitDecoratorMetadata: true`, which\n // emits constructor param types like Function/Object/Promise as DI keys.\n const NON_INJECTABLE_BUILTINS: unknown[] = [\n Function,\n Object,\n String,\n Number,\n Boolean,\n Array,\n Date,\n RegExp,\n Promise,\n ];\n aurelia.container.setHandlerCreatedCallback((handler: any) => {\n if (Array.isArray(handler.dependencies)) {\n handler.dependencies = handler.dependencies.filter(\n (dep: unknown) => dep != null && !NON_INJECTABLE_BUILTINS.includes(dep),\n );\n }\n return handler;\n });\n\n aurelia.use\n .standardConfiguration()\n .feature(PLATFORM.moduleName(\"resources/index\"))\n .plugin(PLATFORM.moduleName(\"aurelia-dialog\"));\n\n // Uncomment the line below to enable animation.\n // aurelia.use.plugin(PLATFORM.moduleName('aurelia-animator-css'));\n // if the css animator is enabled, add swap-order=\"after\" to all router-view elements\n\n // Anyone wanting to use HTMLImports to load views, will need to install the following plugin.\n // aurelia.use.plugin(PLATFORM.moduleName('aurelia-html-import-template-loader'));\n\n if (environment.debug) {\n aurelia.use.developmentLogging();\n }\n\n if (environment.testing) {\n aurelia.use.plugin(PLATFORM.moduleName(\"aurelia-testing\"));\n }\n\n // --- Revised Startup Logic using sessionStorage ---\n\n let resolveAuthPromise: (value: string | PromiseLike) => void;\n let rejectAuthPromise: (reason?: any) => void;\n const authPromise = new Promise((resolve, reject) => {\n resolveAuthPromise = resolve;\n rejectAuthPromise = reject;\n });\n\n // Function to handle authentication and startup\n const authenticateAndStart = async (cause: string) => {\n console.log(\"Authentication cause:\", cause);\n try {\n await aurelia.start();\n const auth = aurelia.container.get(AuthService); // Still need AuthService\n let isAuthenticated = false;\n let storedStateData: any = null; // To store parsed state from session storage\n\n // Try reading and parsing state from sessionStorage\n try {\n const storedStateString = sessionStorage.getItem(\"state-service\");\n if (storedStateString) {\n storedStateData = JSON.parse(storedStateString);\n }\n } catch (e) {\n console.error(\n \"Failed to parse state from sessionStorage during auth\",\n e,\n );\n sessionStorage.clear(); // Clear corrupted state\n rejectAuthPromise(\"State parse error during auth\");\n return; // Stop startup\n }\n\n if (cause === \"refresh\") {\n const token = sessionStorage.getItem(\"token\");\n // Check for necessary data in parsed state and token in storage\n if (\n storedStateData?.refreshToken &&\n storedStateData?.customerKey &&\n token\n ) {\n console.log(\n \"Attempting authentication via refresh token from session.\",\n );\n try {\n // Pass the refreshToken object from parsed state to auth.load\n isAuthenticated = await auth.load(storedStateData.refreshToken);\n if (!isAuthenticated) {\n console.warn(\n \"Refresh token authentication failed. Clearing session.\",\n );\n sessionStorage.clear();\n rejectAuthPromise(\"Refresh token auth failed\");\n return; // Stop startup\n } else {\n // Ensure the access token read from storage is handled\n // Assuming auth.load might not call handleNewAccessToken itself, or we want to be sure.\n auth.handleNewAccessToken(token);\n }\n } catch (err) {\n console.error(\"Error during refresh token load:\", err);\n sessionStorage.clear();\n rejectAuthPromise(\"Refresh token load error\");\n return; // Stop startup\n }\n } else {\n console.warn(\n \"Refresh scenario but missing required data in session state. Clearing session.\",\n );\n sessionStorage.clear();\n rejectAuthPromise(\"Incomplete session state for refresh\");\n return; // Stop startup\n }\n } else if (cause === \"external\") {\n console.log(\"Attempting authentication via externally provided token.\");\n // Check for refreshToken in parsed state (should have been set by setPuzzelToken)\n if (storedStateData?.refreshToken) {\n try {\n isAuthenticated = await auth.load(storedStateData.refreshToken);\n if (!isAuthenticated) {\n console.error(\"External token authentication failed.\");\n // Don't clear session here, maybe let user retry? Or depends on auth.load failure reason.\n rejectAuthPromise(\"External token auth failed\");\n return; // Stop startup\n }\n // Assuming auth.load internally calls handleNewAccessToken upon success\n // and handleNewAccessToken updates sessionStorage('token') if needed.\n } catch (err) {\n console.error(\"Error during external token load:\", err);\n // Don't clear session here either?\n rejectAuthPromise(\"External token load error\");\n return; // Stop startup\n }\n } else {\n console.error(\n \"External auth cause but no refresh token found in session state.\",\n );\n rejectAuthPromise(\"Missing external token data\");\n return; // Stop startup\n }\n } else {\n console.error(\"Unknown authentication cause:\", cause);\n rejectAuthPromise(\"Unknown auth cause\");\n return; // Stop startup\n }\n\n if (isAuthenticated) {\n console.log(\"Authentication successful. Setting root.\");\n // Re-read state to ensure necessary info (like customerKey) is present after auth.load potentially updated it\n let finalStateData: any = null;\n try {\n const finalStateStr = sessionStorage.getItem(\"state-service\");\n if (finalStateStr) finalStateData = JSON.parse(finalStateStr);\n } catch (e) {\n console.error(\"Failed parsing final state after auth\", e);\n /* ignore parse error here, handled by check below */\n }\n\n // Crucial check: Does the state *after* authentication contain the customerKey?\n if (!finalStateData?.customerKey) {\n console.error(\n \"Authentication succeeded but customerKey is missing in session state post-auth!\",\n );\n sessionStorage.clear(); // Clear potentially inconsistent state\n rejectAuthPromise(\n \"State inconsistency after auth (missing customerKey)\",\n );\n return; // Stop startup\n }\n await aurelia.setRoot(PLATFORM.moduleName(\"app\"));\n } else {\n console.error(\"Authentication failed. Not setting root.\");\n // Display failure message. Avoid clearing session here as specific failure paths handle it if needed.\n document.body.innerHTML =\n \"

Authentication Failed

Could not authenticate with the provided token or session.

\";\n }\n } catch (err) {\n console.error(\"Aurelia startup or authentication process failed:\", err);\n // General error during startup or the auth process itself\n document.body.innerHTML = `

Application Error

An error occurred during startup: ${err.message}

`;\n // Reject the main promise to indicate overall failure\n rejectAuthPromise(`Startup/Auth Process Error: ${err.message}`);\n }\n };\n\n // Check if we can use existing session storage\n let initialSessionIsValid = false;\n try {\n const storedStateString = sessionStorage.getItem(\"state-service\");\n const token = sessionStorage.getItem(\"token\");\n if (storedStateString && token) {\n const parsedState = JSON.parse(storedStateString);\n // Check for the essential pieces needed for a refresh attempt\n if (parsedState && parsedState.refreshToken && parsedState.customerKey) {\n initialSessionIsValid = true;\n }\n }\n } catch (e) {\n console.error(\"Failed to parse initial state from sessionStorage\", e);\n sessionStorage.clear(); // Clear potentially corrupted state\n }\n\n if (initialSessionIsValid) {\n console.log(\n \"Valid session state found in sessionStorage. Attempting refresh.\",\n );\n resolveAuthPromise(\"refresh\"); // Proceed with refresh attempt\n } else {\n console.log(\n \"No valid session state found or session is incomplete. Waiting for external token.\",\n );\n // Clear any potentially partial/invalid session state before waiting\n if (sessionStorage.length > 0) {\n console.log(\"Clearing potentially incomplete session storage.\");\n sessionStorage.clear();\n }\n\n // Set up listener for the external token\n const setPuzzelToken = async (message: MessageEvent) => {\n // Basic validation of the message structure\n if (message.data && message.data.SessionId && message.data.CustomerKey) {\n console.log(\"External token received from origin:\", message.origin);\n const receivedRefreshToken = message.data;\n console.log(\n \"Token set for customerKey: \" + receivedRefreshToken.CustomerKey,\n );\n\n // Store necessary info directly into sessionStorage under \"state-service\"\n // This will be read by authenticateAndStart when cause is 'external'\n const stateDataForAuth = {\n refreshToken: receivedRefreshToken,\n customerKey: receivedRefreshToken.CustomerKey,\n // Add other minimal essential fields if auth.load requires them immediately\n searchString: \"\",\n };\n try {\n sessionStorage.setItem(\n \"state-service\",\n JSON.stringify(stateDataForAuth),\n );\n // Explicitly remove any old access token that might conflict\n sessionStorage.removeItem(\"token\");\n } catch (e) {\n console.error(\n \"Failed to write external token state to sessionStorage\",\n e,\n );\n rejectAuthPromise(\"Failed to store external token\");\n PLATFORM.removeEventListener(\"message\", setPuzzelToken); // Clean up listener on error\n return;\n }\n\n PLATFORM.removeEventListener(\"message\", setPuzzelToken); // Remove listener after processing\n resolveAuthPromise(\"external\"); // Signal that we received the external token\n } else {\n // Log unexpected messages if needed for debugging\n // console.log(\"Received message, but it doesn't contain expected token structure.\", message.data);\n }\n };\n PLATFORM.addEventListener(\"message\", setPuzzelToken);\n\n // Set up a timeout for receiving the external token\n const TIMEOUT_MS = 15000; // 15 seconds\n const timeoutHandle = setTimeout(() => {\n console.error(\n `Timeout: No token received via postMessage within ${TIMEOUT_MS / 1000} seconds.`,\n );\n PLATFORM.removeEventListener(\"message\", setPuzzelToken); // Clean up listener\n rejectAuthPromise(\"timeout\"); // Reject the promise due to timeout\n document.body.innerHTML =\n \"

Authentication Timeout

Failed to receive authentication token from the parent window.

\";\n }, TIMEOUT_MS);\n\n // Ensure the timeout is cleared if the token arrives or another error occurs first\n authPromise.finally(() => clearTimeout(timeoutHandle));\n }\n\n // Wait for the authPromise to resolve (with \"refresh\" or \"external\") or reject, then proceed\n authPromise\n .then(authenticateAndStart) // Calls authenticateAndStart with the determined cause\n .catch((errorReason) => {\n // This catches rejections from the promise (timeout, explicit rejections)\n console.error(\"Authentication process failed:\", errorReason);\n // Avoid duplicating the timeout message if that was the cause\n if (\n errorReason !== \"timeout\" &&\n !document.body.innerHTML.includes(\"

\")\n ) {\n // Display a generic error if no specific message was already shown\n document.body.innerHTML = `

Authentication Error

Could not complete authentication: ${errorReason}. Please try reloading.

`;\n }\n // Potentially log errorReason to an error reporting service\n });\n\n // --- End Revised Startup Logic ---\n}\n","export class ColumnMappings {\n public Title?: any = undefined;\n public FirstName?: any = undefined;\n public MiddleName?: any = undefined;\n public LastName: string = undefined;\n public ExternalId?: any = undefined;\n public Phone1: string = undefined;\n public Phone1Description?: any = undefined;\n public Phone2?: any = undefined;\n public Phone2Description?: any = undefined;\n public Email1: string = undefined;\n public Email1Description?: any = undefined;\n public Email2?: any = undefined;\n public Email2Description?: any = undefined;\n public FacebookId?: string = null;\n public TwitterId?: string = null;\n public TrustpilotId?: string = null;\n public WorkingTitle?: any = undefined;\n public Organization?: any = undefined;\n public Department?: any = undefined;\n public ExternalLink?: any = undefined;\n public StreetName?: any = undefined;\n public StreetNumber?: any = undefined;\n public ZipCode?: any = undefined;\n public ZipLocation?: any = undefined;\n public CountryCode?: any = undefined;\n}\n","export class Column {\n public GetPrettyName(propertyName: string) {\n switch (propertyName) {\n case \"FirstName\":\n return \"First name\";\n case \"MiddleName\":\n return \"Middle name\";\n case \"LastName\":\n return \"Last name\";\n case \"ExternalId\":\n return \"External Id\";\n case \"Phone1\":\n return \"Phone\";\n case \"Phone1Description\":\n return \"Phone description\";\n case \"Phone2\":\n return \"Mobile\";\n case \"Phone2Description\":\n return \"Mobile description\";\n case \"Email1\":\n return \"Email 1\";\n case \"Email1Description\":\n return \"Email 1 description\";\n case \"Email2\":\n return \"Email 2\";\n case \"Email2Description\":\n return \"Email 2 description\";\n case \"WorkingTitle\":\n return \"Working title\";\n case \"StreetName\":\n return \"Street name\";\n case \"StreetNumber\":\n return \"Street number\";\n case \"ZipCode\":\n return \"Zip code\";\n case \"ZipLocation\":\n return \"Zip location\";\n case \"CountryCode\":\n return \"Country code\";\n case \"ExternalLink\":\n return \"External link\";\n case \"FacebookId\":\n return \"Facebook ID\";\n case \"TwitterId\":\n return \"Twitter ID\";\n case \"TrustpilotId\":\n return \"Trustpilot ID\";\n default:\n return propertyName;\n }\n }\n}\n","import { StatusModel } from \"./status-model\";\nimport { ColumnMappings } from \"./column-mappings\";\n\nexport class ContactImportMetadata {\n public CustomerNo: number;\n public WorkbookFiles: FileList;\n public Sheets: string[];\n public WorkbookFileType: number;\n public BlobLocation: string;\n public DefaultCountryCode: string = \"NO\";\n public SheetName: string;\n public HasHeaders: boolean = true;\n public ImportMode: number = 1;\n public ColumnMappings: ColumnMappings = new ColumnMappings();\n public Headers: string[];\n public Contacts: any[];\n public StartImportCompleted: boolean;\n public Status: StatusModel = new StatusModel();\n public Version: number = 2;\n public ContactCount: number;\n public ImportSource: number;\n}\n","import {ColumnMappings} from \"./column-mappings\";\nimport {FtpSettings} from \"./ftp-settings\";\n\nexport class ContactManagementSettings {\n public importType: string;\n public columnMapping: ColumnMappings;\n public ftpSettings?: FtpSettings;\n public defaultLanguage: string;\n}\n","import { IAddress, INote, IContact, IContactIdentifier } from \"interfaces/igraph-response\";\n\nexport class ContactModel {\n public id: number;\n public type: string;\n public title: string;\n public firstName: string;\n public middleName: string;\n public lastName: string;\n public displayName: string;\n public phones: string[] = [];\n public mobiles: string[] = [];\n public emails: string[] = [];\n public organization: string;\n public department: string;\n public workingTitle: string;\n public externalLink: string;\n public lastModified: Date;\n public externalId: string;\n public contactIdentifiers: IContactIdentifier[];\n public addresses: IAddress[];\n public notes: INote[];\n\n constructor(contact: IContact = null) {\n if (contact) {\n this.id = contact.id;\n this.type = contact.type;\n this.title = contact.title;\n this.firstName = contact.firstName;\n this.middleName = contact.middleName;\n this.lastName = contact.lastName;\n this.organization = contact.organization;\n this.department = contact.department;\n this.workingTitle = contact.workingTitle;\n this.contactIdentifiers = contact.contactIdentifiers;\n this.addresses = contact.addresses;\n this.notes = contact.notes;\n this.lastModified = contact.lastModified;\n this.externalId = contact.externalId;\n this.externalLink = contact.externalLink;\n }\n }\n}\n","export class ErrorDialogContent {\n public Title: string;\n public WindowTitle: string;\n public Message1: string;\n public Message2: string;\n}\n","export class SearchEvent {\n constructor(\n public readonly searchText: string) {\n }\n}\n","import { StatusModel } from \"./status-model\";\nimport { ColumnMappings } from \"./column-mappings\";\nimport { ContactImportMetadata } from \"./contact-import-metadata\";\nimport {FtpSettings} from \"./ftp-settings\";\n\nexport class FtpContactImportMetadata extends ContactImportMetadata{\n public SheetName: string = \"Sheet1\";\n public FtpSettings: FtpSettings = new FtpSettings();\n}\n","export class FtpSettings {\n public FileType: string = \"Csv\";\n public FileName: string;\n public Delimiter: string = \";\";\n public SheetName: string;\n public HasHeaders: boolean;\n public ImportSource: number;\n public Version: number = 2;\n public WorkbookFileType: number;\n public ImportMode: number = 0;\n public ImportModeText: string = \"Full replace\";\n}\n","export class GraphQlError extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string) {\n super();\n }\n}\n","export class StatusModel {\n public blobLocation: string;\n public successRows: number;\n public errorRows: number;\n public statusMessage: string;\n public completed: boolean;\n}\n","import { customAttribute, inject, bindable } from \"aurelia-framework\";\nimport * as $ from \"jquery\";\nimport \"bootstrap\";\n\n@customAttribute(\"bootstrap-tooltip\")\n@inject(Element)\nexport class BootstrapTooltip {\n public element: any;\n @bindable public title: any; // TODO: Add binding support\n constructor(element) {\n this.element = element;\n }\n\n public bind(bindingContext, overrideContext) {\n $(this.element).tooltip({\n delay: { show: 500, hide: 100 },\n trigger: \"hover\"\n }).attr(\"data-original-title\", this.title);\n }\n\n public unbind() {\n $(this.element).tooltip(\"dispose\");\n }\n\n public titleChanged(newValue) {\n // if attribute [aria-describedby] is present the tooltip is active\n const tooltipActive = $(this.element).attr(\"aria-describedby\");\n const action = tooltipActive ? \"show\" : \"hide\";\n $(this.element).tooltip(\"hide\")\n .attr(\"data-original-title\", newValue)\n .tooltip(action);\n }\n}\n","import { bindable, bindingMode } from \"aurelia-framework\";\n\nexport class CheckBox {\n @bindable public label: string;\n @bindable({ defaultBindingMode: bindingMode.twoWay }) public checked: boolean;\n @bindable public disabled = true;\n}\n","import { autoinject, bindable } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\n\n@autoinject\nexport class ContactsListPagination {\n @bindable private queryContactFunction: any;\n @bindable private totalSearchCount: number;\n @bindable private searchString: string;\n @bindable private page: number;\n @bindable private showPageFrom: number;\n @bindable private maxPaginatorLinks: number;\n @bindable private totalPages: number;\n @bindable private maxLimit: number;\n\n constructor(private readonly router: Router) { }\n\n public onPaginationClick(searchString: string, limit: number, page: number) {\n this.queryContactFunction({ searchString, limit, page });\n }\n}\n","import { autoinject, bindable } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\nimport { ContactModel } from \"models/contact-model\";\n\n@autoinject\nexport class ContactsListView {\n @bindable public contacts: ContactModel[];\n @bindable public headertooltip: string;\n @bindable public selectcontactfunction: any;\n @bindable public totalContacts: number;\n\n constructor(private readonly router: Router) { }\n\n public onContactClick(contact: ContactModel) {\n this.selectcontactfunction({ contact });\n }\n}\n","import { ErrorDialogContent } from \"./../../../models/error-dialog-content\";\nimport { bindable, autoinject } from \"aurelia-framework\";\nimport { DialogController } from \"aurelia-dialog\";\n\n@autoinject\n\nexport class ErrorDialog {\n @bindable public errorDialogContent: ErrorDialogContent;\n\n constructor(public controller: DialogController, ) {\n this.controller = controller;\n\n controller.settings.centerHorizontalOnly = true;\n }\n public activate(errorDialogContent) {\n this.errorDialogContent = errorDialogContent;\n }\n}\n","import * as nprogress from \"nprogress\";\nimport {bindable, noView} from \"aurelia-framework\";\n\n@noView()\nexport class LoadingIndicator {\n @bindable public loading = false;\n\n public loadingChanged(newValue) {\n if (newValue) {\n nprogress.start();\n } else {\n nprogress.done();\n }\n }\n}\n","import { StateService } from \"./../../../services/state-service\";\nimport { SearchEvent } from \"./../../../models/events/search-event\";\nimport { autoinject } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\nimport { EventAggregator } from \"aurelia-event-aggregator\";\nimport { ContactService } from \"services/contact-service\";\n\n@autoinject\nexport class NavigationMenu {\n\n constructor(\n private readonly router: Router,\n private readonly stateService: StateService,\n private readonly eventAggregator: EventAggregator,\n private readonly contactService: ContactService) { }\n\n public navigateTo(path: string) {\n switch (path) {\n default:\n this.router.navigateToRoute(path);\n break;\n case \"home\":\n this.router.navigateToRoute(\"home\");\n break;\n }\n }\n public search(searchText: string) {\n this.eventAggregator.publish(new SearchEvent(searchText));\n }\n}\n","import { bindable, autoinject } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\n\n@autoinject\nexport class PuzzelButton {\n @bindable public text: string;\n @bindable public buttonFunction: any;\n\n constructor(private readonly router: Router) { }\n\n public click() {\n this.buttonFunction();\n }\n}\n","import { bindable, observable } from \"aurelia-framework\";\n\nexport class SearchInput {\n @bindable public searchFunction: any;\n @bindable public placeholderText = \"Search for contacts\";\n @bindable public isDisabled = false;\n @bindable public iconClass: string = \"fa fa-search\";\n @observable public searchText: string;\n\n public search() {\n this.searchFunction({ searchText: this.searchText });\n }\n}\n","import { ContactExportMetadata } from \"./../../../models/contact-export-metadata\";\nimport { autoinject, LogManager } from \"aurelia-framework\";\nimport { BackendService } from \"services/backend-service\";\nimport { StateService } from \"services/state-service\";\n\n@autoinject\nexport class SettingsExport {\n public readonly log = LogManager.getLogger(\"contact-management-web:settings-export\");\n public statusMessage = \"\";\n public exportContactFiles: ContactExportMetadata[] = [];\n public refreshInterval: any;\n\n constructor(\n private stateService: StateService,\n private backendService: BackendService) {\n }\n\n public async attached() {\n await this.getExportListsAsync();\n this.refreshInterval = setInterval(() => this.getExportListsAsync(), 20000);\n }\n\n public detached() {\n clearInterval(this.refreshInterval);\n }\n\n public async initiateExportAsync() {\n\n try {\n const status = await this.backendService.exportContacts(this.stateService.customerKey);\n this.statusMessage = \"Export initiated - the file will soon be available in the list below.\";\n } catch (error) {\n this.log.error(error);\n this.statusMessage = \"A problem occured initiating the export - please try again.\";\n }\n }\n\n public async getExportListsAsync() {\n try {\n this.log.info(\"Getting list\");\n this.exportContactFiles = await this.backendService.getListOfContactExports(this.stateService.customerKey);\n this.statusMessage = \"\";\n } catch (error) {\n this.log.error(error);\n }\n }\n\n public async onFileClickAsync(blobUri: string) {\n try {\n this.statusMessage = \"Downloading file - please wait.\";\n\n const filename = this.getFileName(blobUri);\n\n const response =\n await this.backendService.downloadContactFile(this.stateService.customerKey, filename);\n\n const url = window.URL.createObjectURL(response);\n\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"href\", url);\n anchor.setAttribute(\"download\", filename);\n anchor.click();\n window.URL.revokeObjectURL(url);\n\n this.statusMessage = \"\";\n } catch (error) {\n this.log.info(error);\n this.statusMessage = \"\";\n }\n }\n\n private getFileName(blobUri: string) {\n const startPosition: number = blobUri.lastIndexOf(\"/\") + 1;\n const lengthOfUri: number = blobUri.length;\n return blobUri.substr(startPosition, lengthOfUri - startPosition);\n }\n\n}\n","import { autoinject, LogManager } from \"aurelia-framework\";\nimport { Column } from \"models/column\";\nimport { FtpContactImportMetadata } from \"models/ftp-contact-import-metadata\";\nimport { ErrorDialogContent } from \"models/error-dialog-content\";\nimport { ErrorDialog } from \"resources/elements/error-dialog/error-dialog\";\nimport { DialogService } from \"aurelia-dialog\";\nimport { BackendService } from \"services/backend-service\";\nimport { ContactManagementSettings } from \"models/contact-management-settings\";\n\n@autoinject\nexport class SettingsFtp {\n public readonly log = LogManager.getLogger(\"contact-management-web:settings-ftp\");\n public column: Column = new Column();\n public ftpContactImportMetadata: FtpContactImportMetadata = new FtpContactImportMetadata();\n public contactManagementSettings: ContactManagementSettings = new ContactManagementSettings();\n public columnsCount: number;\n public errorDialogContent: ErrorDialogContent;\n public statusMessage = \"\";\n private tooltipFtpSettings: string = \"Map columns from the Excel file to each field. For example External Id to the Excel column id.

\" +\n \"Write in the number of columns in your sheet to generate the correct amount of columns\";\n\n constructor(\n private dialogService: DialogService,\n private backendService: BackendService) {\n this.errorDialogContent = new ErrorDialogContent();\n }\n\n public async attached() {\n this.selectedFileTypeChanged();\n await this.getMapping();\n }\n\n public generateColumns() {\n this.statusMessage = \"\";\n if (this.ftpContactImportMetadata.FtpSettings.FileType === \"Csv\") {\n this.ftpContactImportMetadata.Headers = this.generateDefaultCsvColumnHeaders(this.columnsCount);\n } else {\n this.ftpContactImportMetadata.Headers = this.generateDefaultExcelColumnHeaders(this.columnsCount);\n }\n }\n public async saveSettings() {\n try {\n if (!this.isValidColumnMapping()) { this.statusMessage = \"\"; return; }\n this.statusMessage = \"Saving...\";\n this.contactManagementSettings.ftpSettings = this.ftpContactImportMetadata.FtpSettings;\n this.contactManagementSettings.ftpSettings.SheetName = this.ftpContactImportMetadata.SheetName;\n this.contactManagementSettings.columnMapping = this.ftpContactImportMetadata.ColumnMappings;\n this.contactManagementSettings.defaultLanguage = this.ftpContactImportMetadata.DefaultCountryCode;\n this.contactManagementSettings.importType = \"ftpSettings\";\n this.contactManagementSettings.ftpSettings.HasHeaders = this.ftpContactImportMetadata.HasHeaders;\n this.contactManagementSettings.ftpSettings.ImportSource = 0; //Ftp\n this.contactManagementSettings.ftpSettings.Version = 2;\n this.contactManagementSettings.ftpSettings.ImportMode = 1; //Replace and append\n\n const status = await this.backendService.saveColumnMapping(this.contactManagementSettings);\n this.log.info(\"Column mapping saved\", status);\n this.statusMessage = \"Saved ok\";\n } catch (error) {\n this.log.error(error);\n this.statusMessage = \"Saving failed\";\n }\n }\n\n public async getMapping() {\n const mapping = await this.backendService.getColumnMapping(\"ftpSettings\");\n if (mapping != null) {\n this.log.info(\"Fetched column mapping\");\n this.ftpContactImportMetadata = mapping;\n\n this.ftpContactImportMetadata.DefaultCountryCode = mapping.DefaultCountryCode;\n this.ftpContactImportMetadata.SheetName = mapping.FtpSettings.SheetName;\n this.ftpContactImportMetadata.HasHeaders = mapping.FtpSettings.HasHeaders;\n\n this.columnsCount = 0;\n Object.values(mapping.ColumnMappings).forEach(value => {\n if (value !== null) {\n this.columnsCount++;\n }\n });\n this.generateColumns();\n }\n }\n\n public selectedImportModeTypeChanged() {\n this.statusMessage = \"\";\n if (this.ftpContactImportMetadata.FtpSettings.ImportModeText === \"Full replace\") {\n this.ftpContactImportMetadata.FtpSettings.ImportMode = 0;\n } else if (this.ftpContactImportMetadata.FtpSettings.ImportModeText === \"Replace and append\") {\n this.ftpContactImportMetadata.FtpSettings.ImportMode = 1;\n }\n this.ftpContactImportMetadata.Headers = null;\n }\n\n public selectedFileTypeChanged() {\n this.statusMessage = \"\";\n if (this.ftpContactImportMetadata.FtpSettings.FileType === \"Csv\") {\n this.ftpContactImportMetadata.FtpSettings.WorkbookFileType = 2;\n } else if (this.ftpContactImportMetadata.FtpSettings.FileType === \"Xls\") {\n this.ftpContactImportMetadata.FtpSettings.WorkbookFileType = 0;\n } else if (this.ftpContactImportMetadata.FtpSettings.FileType === \"Xlsx\") {\n this.ftpContactImportMetadata.FtpSettings.WorkbookFileType = 1;\n }\n this.ftpContactImportMetadata.Headers = null;\n this.generateColumns();\n }\n\n public generateDefaultExcelColumnHeaders(columnsCount: number) {\n const newHeaders: string[] = [];\n let j = 0;\n let prefix = \"\";\n let numberOfRuns = 0;\n if (columnsCount > 200) { this.log.info(`User generating too many columns: ${columnsCount}`); return; }\n // tslint:disable-next-line: prefer-for-of\n for (let i = 0; i < columnsCount; i++) {\n if (j === 26) {\n j = 0;\n prefix = ((String.fromCharCode)(65 + numberOfRuns));\n numberOfRuns++;\n }\n const columnNumber = (String.fromCharCode)(65 + j);\n j++;\n newHeaders.push(`Column ${prefix}${columnNumber}`);\n }\n this.log.info(`Generating ${columnsCount} excel columns`);\n return newHeaders;\n }\n\n public generateDefaultCsvColumnHeaders(columnsCount: number) {\n const newHeaders: string[] = [];\n\n let numberOfRuns = 0;\n if (columnsCount > 200) { this.log.info(`User generating too many columns: ${columnsCount}`); return; }\n // tslint:disable-next-line: prefer-for-of\n for (let i = 0; i < columnsCount; i++) {\n\n newHeaders.push(`Column ${numberOfRuns}`);\n numberOfRuns++;\n }\n this.log.info(`Generating ${columnsCount} csv columns`);\n return newHeaders;\n }\n\n public isValidColumnMapping() {\n let validColumnMapping: boolean = true;\n const selectedField = this.ftpContactImportMetadata.ColumnMappings;\n const fileName = this.ftpContactImportMetadata.FtpSettings.FileName;\n this.errorDialogContent.WindowTitle = \"ERROR\";\n this.errorDialogContent.Title = \"Required fields\";\n this.errorDialogContent.Message1 = \"You will need to map File name, Last name, External Id and either Phone, Mobile or Email\";\n if (!selectedField.LastName || !fileName || !selectedField.ExternalId) {\n this.dialogService.open({\n viewModel: ErrorDialog,\n model: this.errorDialogContent, lock: true\n });\n validColumnMapping = false;\n } else if (!selectedField.Phone1 && !selectedField.Phone2 && !selectedField.Email2 &&\n !selectedField.Email1) {\n this.dialogService.open({\n viewModel: ErrorDialog,\n model: this.errorDialogContent, lock: true\n });\n validColumnMapping = false;\n }\n return validColumnMapping;\n }\n}\n","import { bindable, autoinject } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\n\n@autoinject\nexport class TextLink {\n @bindable public text = \"Back\";\n @bindable public goBack: boolean = true; // else cancel\n\n constructor(private readonly router: Router) { }\n\n public click() {\n if (this.goBack) {\n this.router.navigateBack();\n } else {\n location.assign(\"\");\n }\n }\n}\n","import {FrameworkConfiguration} from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration) {\n //config.globalResources([]);\n}\n","import * as moment from \"moment\";\n\nexport class DateFormatValueConverter {\n public toView(value, format) {\n return moment(value).format(format);\n }\n}\n","export class FilterOnPropertyValueConverter {\n public toView(array: Array<{}>, property: string, exp: string) {\n if (array === undefined || array === null || property === undefined || exp === undefined) {\n return array;\n }\n return array.filter((item) => item[property].toLowerCase().indexOf(exp.toLowerCase()) > -1);\n }\n}\n","export class ObjectKeysValueConverter {\n toView(obj) {\n return Reflect.ownKeys(obj);\n }\n}\n","export class SortDateValueConverter {\n public toView(array, propertyName) {\n return array\n .sort((a, b) => {\n return new Date(b[propertyName]).getTime() - new Date(a[propertyName]).getTime();\n });\n }\n}\n","export class TakeValueConverter {\n public toView(array, count) {\n return array.slice(0, count);\n }\n}\n","import environment from \"environment\";\nimport { autoinject, inject, NewInstance, LogManager } from \"aurelia-framework\";\nimport { HttpClient, json } from \"aurelia-fetch-client\";\n\n@autoinject\nexport class AuthHttpService {\n public readonly log = LogManager.getLogger(\"contact-management-web:auth-http-service\");\n\n constructor(\n @inject(NewInstance.of(HttpClient)) private client: HttpClient) {\n client.configure(config => {\n config\n .useStandardConfiguration()\n });\n }\n\n public async postAuth(path: string, data: any, platformArea: string) {\n let url = \"\";\n switch (platformArea) {\n case \"UK1\":\n url = environment.authEndpoint_UK1;\n break;\n case \"EU1\":\n url = environment.authEndpoint_EU1;\n break;\n case \"OPO\":\n default:\n url = environment.authEndpoint_OPO;\n break;\n }\n\n try {\n const response = await this.client.fetch(url + path, {\n method: \"post\",\n headers: {\n \"Origin-Agent-Cluster\": \"?0\"\n },\n body: json(data)\n });\n return this.checkResponse(response);\n } catch (error) { this.log.warn(error.statusText); }\n }\n\n public checkResponse(response) {\n return response.json().then(data => {\n if (!response.ok) {\n if (response.status === 401) {\n this.log.warn(response.statusText);\n }\n throw new Error(response.statusText);\n }\n // OK! return fetched data\n return data;\n });\n }\n}\n","import { AuthHttpService } from \"./auth-http-service\";\nimport { StateService } from \"./state-service\";\nimport { autoinject, LogManager } from \"aurelia-framework\";\nimport environment from \"environment\";\nimport { JwtDecode } from \"aurelia-plugins-jwt-decode\";\nimport { SolutionApiService } from \"./solution-api-service\";\n\n@autoinject\nexport class AuthService {\n public accessToken: string;\n public refreshToken: any;\n public refreshTimeoutId: any = null;\n public accessTokenExpiryTimeMs: number;\n public readonly log = LogManager.getLogger(\"contact-management-web:auth-service\");\n\n constructor(\n private stateService: StateService,\n private readonly authHttpService: AuthHttpService,\n private readonly solutionApiService: SolutionApiService) {\n const sessionState = sessionStorage.getItem(\"state-service\");\n if (sessionState) {\n const ss: StateService = JSON.parse(sessionStorage.getItem(\"state-service\"));\n stateService.updateState(s => {\n s.accessToken = ss.accessToken;\n s.customerKey = ss.customerKey;\n s.customerName = ss.customerName;\n s.refreshToken = ss.refreshToken;\n s.searchString = ss.searchString;\n s.errorMessage = ss.errorMessage;\n });\n }\n this.log.debug(JSON.stringify(stateService));\n this.accessToken = stateService.accessToken;\n this.refreshToken = stateService.refreshToken;\n }\n\n public getToken = async (): Promise => {\n if (!this.accessToken) {\n this.accessToken = sessionStorage.getItem(\"token\");\n }\n return Promise.resolve(this.accessToken);\n }\n\n public async load(refreshToken) {\n if (refreshToken) {\n this.refreshToken = refreshToken;\n this.stateService.updateState(state => state.refreshToken = refreshToken);\n\n // IQADMIN only in OPO\n let platformArea: string;\n if (refreshToken.CustomerKey !== undefined && refreshToken.CustomerKey.toUpperCase() !== \"IQADMIN\") {\n this.log.info(\"Storing customer key in state: \" + this.refreshToken.CustomerKey);\n this.stateService.updateState(state => state.customerKey = refreshToken.CustomerKey);\n\n const solutionDetails = await this.solutionApiService.getSolutionDetails(refreshToken.CustomerKey);\n if (!solutionDetails) {\n this.log.error(\"Failed to retrieve solution details. Cannot determine platform area.\");\n return false;\n }\n platformArea = solutionDetails.platformArea;\n } else {\n platformArea = \"OPO\";\n }\n\n this.stateService.updateState(state => state.platformArea = platformArea);\n\n try {\n const result = await this.authHttpService.postAuth(\"Authenticate/GetAccessToken\", this.refreshToken, platformArea) as string;\n this.handleNewAccessToken(result);\n return true;\n } catch (error) {\n return false;\n }\n }\n if (!this.accessToken) {\n return false;\n }\n this.refreshAccessTokenTimer();\n return true;\n }\n\n public async refreshAccesstoken() {\n try {\n this.log.info(\"Timer refreshing access token!\");\n const result = await this.authHttpService.postAuth(\"Authenticate/GetAccessToken\", this.refreshToken, this.stateService.platformArea) as string;\n this.handleNewAccessToken(result);\n } catch (error) {\n let msg = error.message;\n if (error.errorName === \"WrongParametersEntered\") {\n msg = \"auth.sessionTimeout\";\n }\n await this.logout(msg);\n }\n }\n\n public handleNewAccessToken(accessToken: string) {\n if (!accessToken) { throw new Error(\"Unauthorized\"); }\n this.stateService.updateState(state => state.accessToken = accessToken);\n this.accessToken = accessToken;\n sessionStorage.setItem(\"token\", accessToken);\n // // find payload in accesstoken\n try {\n const payload = JwtDecode.decode(accessToken);\n const expTime = new Date(payload.exp * 1000);\n this.log.info(`Access token expires at: ${expTime}`);\n // calculate offset from accessToken was produced to now. Local watch may not correspond to auth server time\n // const offset = (payload && payload.iat) ? Date.now() - (payload.iat * 1000) : 0;\n this.accessTokenExpiryTimeMs = (payload && payload.exp) ? payload.exp * 1000 - Date.now() : 1800000;\n this.log.info(`accessTokenExpiryTimeMs: ${this.accessTokenExpiryTimeMs}`);\n // set timer to refresh accessToken\n this.refreshAccessTokenTimer();\n } catch (exception) {\n this.log.warn(exception);\n }\n }\n\n public refreshAccessTokenTimer() {\n this.clearRefreshTimer();\n\n const expiredAccessTokenHandler = async () => {\n // refresh accesstoken\n await this.refreshAccesstoken();\n };\n // calculate ttl to 60 seconds before accessToken expires, defaults to 30 minutes (minus 1 minute)\n const defaultExpTime = 29000 * 60;\n const ttl = this.accessTokenExpiryTimeMs ? this.accessTokenExpiryTimeMs - 60000 : defaultExpTime;\n this.log.info(\"TTL: \" + ttl);\n this.refreshTimeoutId = setTimeout(expiredAccessTokenHandler, ttl);\n }\n\n public clearRefreshTimer() {\n if (this.refreshTimeoutId) {\n clearTimeout(this.refreshTimeoutId);\n }\n this.refreshTimeoutId = null;\n }\n\n public async logout(error = \"\") {\n this.accessToken = null;\n this.stateService.updateState(state => {\n state.accessToken = null;\n state.refreshToken = null;\n });\n // clear refresh of accesstoken\n this.clearRefreshTimer();\n if (this.refreshToken) {\n await this.authHttpService.postAuth(\"Authenticate/LogOut\", this.refreshToken, this.stateService.platformArea);\n }\n sessionStorage.clear();\n this.accessToken = null;\n this.accessTokenExpiryTimeMs = null;\n this.refreshToken = null;\n window.location.reload();\n }\n}\n","import { StateService } from \"./state-service\";\nimport { StatusModel } from \"./../models/status-model\";\nimport { HttpClient } from \"aurelia-fetch-client\";\nimport { ContactImportMetadata } from \"./../models/contact-import-metadata\";\nimport { AuditLog } from \"../models/audit-log\";\nimport { autoinject, LogManager, inject, NewInstance } from \"aurelia-framework\";\nimport environment from \"environment\";\nimport { DataHubApiResponse } from \"models/data-hub-api-response\";\nimport { ContactManagementSettings } from \"../models/contact-management-settings\";\nimport { ContactExportMetadata } from \"../models/contact-export-metadata\";\n\n@autoinject\nexport class BackendService {\n public readonly log = LogManager.getLogger(\"contact-management-web:backend-service\");\n private url: string = environment.datahubApiEndpoint;\n private exportFunctionKey: string = environment.exportContactsFunctionKey;\n constructor(\n private stateService: StateService,\n @inject(NewInstance.of(HttpClient)) public client: HttpClient,\n private tokenFunction: () => Promise) {\n this.tokenFunction = () => {\n let accessToken = this.stateService.accessToken;\n if (!accessToken) {\n accessToken = sessionStorage.getItem(\"token\");\n }\n return Promise.resolve(accessToken);\n };\n this.client.configure(config => {\n config.useStandardConfiguration()\n .withBaseUrl(this.url)\n .withInterceptor({\n request: async (request: Request) => {\n request.headers.set(\"Authorization\", \"Bearer \" + await this.tokenFunction());\n return request;\n },\n response: (response: Response) => {\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return response;\n }\n });\n });\n }\n\n public async sendFile(contactImportMetadata: ContactImportMetadata) {\n const formData = new FormData();\n formData.append(contactImportMetadata.WorkbookFiles[0].name, contactImportMetadata.WorkbookFiles[0]);\n const response = await this.client.fetch(`ImportFile/${contactImportMetadata.CustomerNo}`, {\n method: \"post\",\n body: formData\n });\n const data: DataHubApiResponse = await response.json();\n return data.reference;\n }\n\n public async startImport(contactImportMetadata: ContactImportMetadata) {\n const response = await this.client.fetch(\"StartImport\", {\n method: \"post\",\n body: JSON.stringify(contactImportMetadata, [\n \"CustomerNo\", \"WorkbookFileType\",\n \"BlobLocation\", \"DefaultCountryCode\",\n \"SheetName\", \"HasHeaders\",\n \"ImportMode\", \"ColumnMappings\",\n \"Title\", \"FirstName\", \"MiddleName\", \"LastName\",\n \"ExternalId\", \"Phone1\", \"Phone1Description\", \"Phone2\",\n \"Phone2Description\", \"Email1\", \"Email1Description\",\n \"Email2\", \"Email2Description\", \"WorkingTitle\",\n \"Organization\", \"Department\", \"ExternalLink\", \"StreetName\", \"StreetNumber\",\n \"ZipCode\", \"ZipLocation\", \"CountryCode\", \"Version\", \"ImportSource\",\n \"FacebookId\", \"TwitterId\", \"TrustpilotId\"\n ])\n });\n const data: any = await response;\n return data.ok;\n }\n\n public async getStatus(customerKey: number, jobId: string) {\n const response = await this.client.fetch(`GetStatus/${customerKey}/${jobId}`);\n const data: StatusModel = await response.json();\n return data;\n }\n\n public async getAuditLogs(customerKey: number) {\n const response = await this.client.fetch(`GetImportLog/${customerKey}`);\n const data: AuditLog[] = await response.json();\n return data;\n }\n\n public async getColumnMapping(importType: string) {\n try {\n const response = await this.client.fetch(`customersettings/${this.stateService.customerKey}/${importType}`);\n const data: any = await response.json();\n return data.value;\n } catch (error) {\n this.log.warn(error);\n return null;\n }\n }\n\n public async saveColumnMapping(contactManagementSettings: ContactManagementSettings) {\n const content = {\n DefaultCountryCode: contactManagementSettings.defaultLanguage,\n ColumnMappings: contactManagementSettings.columnMapping,\n FtpSettings: contactManagementSettings.ftpSettings\n };\n const response = await this.client.fetch(`customersettings/${this.stateService.customerKey}/${contactManagementSettings.importType}`, {\n method: \"post\",\n body: JSON.stringify(content)\n });\n const data: any = await response;\n return data.ok;\n }\n\n public async exportContacts(customerKey: number) {\n const response = await this.client.fetch(`ExportContacts/${customerKey}/?code=${this.exportFunctionKey}`, {\n method: \"post\"\n });\n const data: any = await response;\n return data.ok;\n }\n\n public async getListOfContactExports(customerKey: number) {\n const response = await this.client.fetch(`ExportContacts/${customerKey}/?code=${this.exportFunctionKey}`);\n const data: ContactExportMetadata[] = await response.json();\n return data;\n }\n\n public async downloadContactFile(customerKey: number, fileName: string) {\n const response =\n await this.client.fetch(`ExportContacts/${customerKey}/${fileName}?code=${this.exportFunctionKey}`)\n .then(res => res.blob());\n\n return response;\n }\n}\n","import { autoinject, inject, NewInstance } from \"aurelia-framework\";\nimport { AuthService } from \"./auth-service\";\nimport environment from \"environment\";\nimport { GraphQlService } from \"./graphql-service\";\nimport { HttpClient } from \"aurelia-fetch-client\";\nimport { StateService } from \"./state-service\";\n\n@autoinject\nexport class ContactService extends GraphQlService {\n constructor(\n readonly authService: AuthService,\n private readonly stateService: StateService,\n @inject(NewInstance.of(HttpClient)) client: HttpClient) {\n super(environment.contactsApiEndpoint, client, authService.getToken);\n }\n\n public async contactByIdAsync(id: number) {\n const query = `query contactById($customerKey: Int!, $id: Int!) {\n contactById(customerKey: $customerKey, id: $id) {\n id\n type\n title\n firstName\n middleName\n lastName\n organization\n department\n workingTitle\n lastModified\n externalId\n externalLink\n contactIdentifiers {\n type\n address\n description\n }\n addresses {\n type\n streetName\n streetNumber\n zipCode\n zipLocation\n countryCode\n }\n notes {\n note\n }\n }\n }`;\n\n const response = await this.fetch(query, { customerKey: this.stateService.customerKey, id });\n return response.data.contactById;\n }\n\n public async contactsSearchAsync(fullText: string, limit: number, skip: number) {\n const query = `query contactsSearch($customerKey: Int!, $fullText: String!, $limit: Int, $skip: Int) {\n contactsSearch(customerKey: $customerKey, fullText: $fullText, limit: $limit, skip: $skip) {\n totalCount\n contacts {\n id\n firstName\n middleName\n lastName\n organization\n department\n workingTitle\n phoneNumbers\n emails\n facebookIds\n twitterIds\n trustpilotIds\n }\n }\n }`;\n\n const response =\n await this.fetch(query, { customerKey: this.stateService.customerKey, fullText, limit, skip });\n return response.data.contactsSearch;\n }\n\n public async deleteContactAsync(id: number) {\n const query = `mutation DeleteContact($customerKey: Int!, $id: Int!) {\n deleteContact(customerKey: $customerKey, id: $id)\n }`;\n\n await this.fetch(query, { customerKey: this.stateService.customerKey, id });\n }\n}\n","import { LogManager } from \"aurelia-framework\";\nimport { HttpClient, json } from \"aurelia-fetch-client\";\nimport { IGraphResponse } from \"interfaces/igraph-response\";\nimport { GraphQlError } from \"models/graphql-errors\";\n\nexport class GraphQlService {\n public readonly log = LogManager.getLogger(\"contact-management-web:graphql-service\");\n private accessToken: string;\n\n constructor(\n private url: string,\n public client: HttpClient,\n private tokenFunction: () => Promise\n ) {\n this.client.configure(config => {\n config\n .withBaseUrl(this.url)\n .withDefaults({\n headers: {\n \"credentials\": \"same-origin\",\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n })\n .withInterceptor({\n request: async (request: Request) => {\n request.headers.set(\"Authorization\", \"Bearer \" + await this.tokenFunction());\n return request;\n },\n response: (response: Response) => {\n if (!response.ok) {\n throw new GraphQlError(response.status, response.statusText);\n }\n return response;\n }\n });\n });\n }\n\n public async fetch(query: string, variables: object): Promise {\n try {\n const response = await this.client.fetch(\"\", {\n method: \"post\",\n body: json({ query, variables })\n });\n const data: IGraphResponse = await response.json();\n if (data.errors) {\n throw new GraphQlError(500, data.errors[0].message);\n }\n return data;\n } catch (e) {\n this.log.error(\n `Fetch error - status: ${e.status}${this.log.isDebugEnabled() ? `, statusText: ${e.statusText}` : \"\"}`);\n throw e;\n }\n }\n}\n","import environment from \"environment\";\nimport { autoinject, inject, NewInstance, LogManager } from \"aurelia-framework\";\nimport { HttpClient } from \"aurelia-fetch-client\";\nimport { StateService } from \"services/state-service\";\nimport { JwtDecode } from \"aurelia-plugins-jwt-decode\";\n\n@autoinject\nexport class PccApiService {\n public readonly log = LogManager.getLogger(\"contact-management-web:pcc-api-service\");\n\n constructor(\n private readonly stateService: StateService,\n @inject(NewInstance.of(HttpClient)) private client: HttpClient) {\n client.configure(config => {\n config\n .useStandardConfiguration()\n });\n }\n\n public async getAgentUserId(jwt: string) {\n const tokenPayload = await this.decodeToken(jwt);\n return tokenPayload.uid.toString();\n }\n\n public async getUserDetails() {\n try {\n if (!this.stateService.agentUserId) {\n this.stateService.agentUserId = await this.getAgentUserId(this.stateService.accessToken);\n }\n\n const path = `${this.stateService.customerKey}/users/${this.stateService.agentUserId}`;\n const response = await this.sendRequest(path);\n\n const result = await this.checkResponse(response);\n return result;\n } catch (error) {\n this.log.warn(error.statusText);\n }\n }\n\n public async getUserGroup(groupId: number) {\n try {\n const groups = await this.getUserGroups();\n const group = groups.find(g => g.id === groupId);\n return group;\n } catch (error) {\n this.log.warn(error.statusText);\n }\n }\n\n public async getUserGroups() {\n try {\n const path = `${this.stateService.customerKey}/usergroups`;\n const response = await this.sendRequest(path);\n\n return await this.checkResponse(response);\n } catch (error) {\n this.log.warn(error.statusText);\n }\n }\n\n public checkResponse(response) {\n return response.json().then(data => {\n if (!response.ok) {\n if (response.status === 401) {\n this.log.warn(response.statusText);\n }\n throw new Error(response.statusText);\n }\n // OK! return fetched data\n return data.result;\n });\n }\n\n private decodeToken(accessToken: string) {\n const payload = JwtDecode.decode(accessToken);\n return payload;\n }\n\n private async sendRequest(path: string) {\n return await this.client.fetch(this.getUrl() + path, {\n headers: {\n Authorization: `Bearer ${this.stateService.accessToken}`\n }\n });\n }\n\n private getUrl() {\n switch (this.stateService.platformArea) {\n case \"UK1\": return environment.pccApiUrl_UK1;\n case \"EU1\": return environment.pccApiUrl_EU1;\n case \"OPO\":\n default: return environment.pccApiUrl_OPO;\n }\n }\n}\n","import environment from \"environment\";\nimport { autoinject, inject, NewInstance, LogManager } from \"aurelia-framework\";\nimport { HttpClient } from \"aurelia-fetch-client\";\nimport { StateService } from \"services/state-service\";\n\n@autoinject\nexport class SolutionApiService {\n private readonly log = LogManager.getLogger(\"contacts-management-web:solution-api-service\");\n\n constructor(\n private readonly stateService: StateService,\n @inject(NewInstance.of(HttpClient)) private client: HttpClient) {\n client.configure(config => {\n config\n .useStandardConfiguration()\n .withBaseUrl(environment.solutionApi);\n });\n }\n\n public async getSolutionDetails(customerKey: string) {\n try {\n const path = `solutions/customer/${customerKey}?componentId=36`;\n const response = await this.sendRequest(path);\n\n const result = await this.checkResponse(response);\n return result;\n } catch (error) {\n this.log.warn(error.statusText || error.message || error);\n }\n }\n\n private checkResponse(response) {\n return response.json().then(data => {\n if (!response.ok) {\n if (response.status === 401) {\n this.log.warn(response.statusText);\n }\n throw new Error(response.statusText);\n }\n return data[0];\n });\n }\n\n private async sendRequest(path: string) {\n return await this.client.fetch(path, {\n headers: {\n Authorization: `Bearer ${environment.solutionApiReadOnlyToken}`\n }\n });\n }\n}\n","export class StateService {\n public accessToken: string;\n public refreshToken: any;\n public customerName: string;\n public customerKey: number;\n public searchString: string = \"\";\n public errorMessage: string;\n public deletedContactIds: number[] = [];\n public agentUserId: string;\n public platformArea: string;\n\n public updateState(action: (state: StateService) => void) {\n action(this);\n this.save();\n }\n\n public serialize() {\n return JSON.stringify(this);\n }\n\n public save() {\n sessionStorage[\"state-service\"] = this.serialize();\n }\n}\n"],"names":[],"sourceRoot":""}