{"version":3,"file":"app-c89c85ad.981ca8458d389c9a476a.bundle.js","mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAGA;AACA;AAIA;AAAA;AACA;AAAA;AAKA;AAPA;AAAA;AAAA;AAIA;AAAA;AAIA;AACA;;AAGA;AACA;AACA;AAEA;;AAGA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAjDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;ACnBA;;AAEA;AACA;;AAGA;AACA;AAGA;AAAA;AACA;AAAA;AAJA;AAEA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACXA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;;AAMA;AACA;AACA;AACA;AAIA;;AAMA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;;AAIA;AACA;AAIA;AAAA;AACA;AAAA;AAiBA;AAnBA;AAAA;AAAA;AAIA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AADA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5TA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;AC7DA;;AAEA;AACA;;AAEA;AACA;;AAGA;AACA;AAGA;AAAA;AACA;AAAA;AACA;AAAA;AALA;AAEA;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAtBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;ACfA;;AAEA;AACA;;AAGA;AACA;AAGA;AAAA;AACA;AAAA;AAJA;AAEA;AAAA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACXA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;;AAKA;AACA;AACA;AACA;AAIA;;AAKA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AAAA;;AAIA;AACA;AAIA;AAAA;AACA;AAAA;AAcA;AAhBA;AAAA;AAAA;AAIA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAKA;;AAGA;AACA;AACA;AACA;AAEA;AADA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AADA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AApKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;ACvDA;;AAEA;AACA;;AAEA;AACA;;AAGA;AACA;AAGA;AAAA;AACA;AAAA;AACA;AAAA;AALA;AAEA;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AA3BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACfA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;;AAEA;AACA;;AAIA;AACA;;AAGA;AACA;AAWA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAMA;AAVA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AACA;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;;AAGA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;AChDA;;AAEA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChDA;;AAEA;AACA;;AAOA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;;AAIA;AACA;AAaA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAUA;AAdA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AACA;AACA;AACA;AACA;AACA;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAKA;AAEA;AACA;AAOA;AAGA;AACA;AAOA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;;AAGA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAEA;AAKA;AAJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AAFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;;AAGA;AACA;AAGA;AAFA;AACA;AACA;AACA;AAEA;;AAGA;AACA;AAKA;AAJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAMA;AALA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAMA;AALA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAKA;AAJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAKA;AAJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AAFA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAEA;AAGA;AAFA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AADA;AACA;AACA;AAAA;AAAA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAtcA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;ACvGA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AAJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;ACxFA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AAHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;ACxEA;AACA;;AAEA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AAJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;AC1GA;AACA;;AAEA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AALA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;AC/JA;AACA;;AAEA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AAJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;AC1GA;;AAEA;AACA;AACA;;AAMA;AACA;AACA;AACA;AAGA;AAFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACvJA;;AAEA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACnFA;;AAEA;AACA;AACA;;AAMA;AACA;AACA;AACA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACrHA;;AAEA;AACA;AACA;;AAGA;AACA;AACA;AACA;AAEA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC1DA;;AAEA;AACA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AAKA;AAJA;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;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;;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAOA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAIA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;AC/IA;;AAEA;AACA;AACA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;;AAEA;AACA;AACA;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AAOA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC3QA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AAGA;AAFA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AAEA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAIA;AACA;AACA;AACA;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtHA;;AAEA;AACA;AACA;;AAOA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAIA;AACA;;AAEA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAIA;AAOA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAQA;AAbA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AACA;AACA;AACA;AAOA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAIA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAlNA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;ACpDA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC/BA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA","sources":["webpack://latinera/./sources/components/private/adjective-inflection-item.js","webpack://latinera/./sources/components/private/adjective-inflector-item.js","webpack://latinera/./sources/components/private/adjective-lemma-form.js","webpack://latinera/./sources/components/private/adjective-lemma-item.js","webpack://latinera/./sources/components/private/adverb-inflector-item.js","webpack://latinera/./sources/components/private/adverb-lemma-form.js","webpack://latinera/./sources/components/private/adverb-lemma-item.js","webpack://latinera/./sources/components/private/analysis-activity-item.js","webpack://latinera/./sources/components/private/analysis-activity-item/delete-analysis-activity.js","webpack://latinera/./sources/components/private/analysis-activity.js","webpack://latinera/./sources/components/private/analysis-activity/handle-change-out-element-text.js","webpack://latinera/./sources/components/private/analysis-activity/handle-change-out-sentence-text.js","webpack://latinera/./sources/components/private/analysis-activity/handle-change-selected-definition.js","webpack://latinera/./sources/components/private/analysis-activity/handle-change-selected-generator.js","webpack://latinera/./sources/components/private/analysis-activity/handle-change-selected-in-inflector.js","webpack://latinera/./sources/components/private/analysis-activity/handle-merge-cards-event.js","webpack://latinera/./sources/components/private/analysis-activity/handle-move-card.js","webpack://latinera/./sources/components/private/analysis-activity/handle-split-card-event.js","webpack://latinera/./sources/components/private/analysis-activity/load-analysis-activity-states.js","webpack://latinera/./sources/components/private/analysis-activity/merge-cards.js","webpack://latinera/./sources/components/private/analysis-activity/save-analysis-activity.js","webpack://latinera/./sources/components/private/analysis-activity/split-card.js","webpack://latinera/./sources/components/private/analysis.js","webpack://latinera/./sources/components/private/analysis/initialize-cards-list-sortable.js","webpack://latinera/./sources/components/private/adjective-inflection-item.html","webpack://latinera/./sources/components/private/adjective-inflector-item.html","webpack://latinera/./sources/components/private/adjective-lemma-form.html","webpack://latinera/./sources/components/private/adjective-lemma-item.html","webpack://latinera/./sources/components/private/adverb-inflector-item.html","webpack://latinera/./sources/components/private/adverb-lemma-form.html","webpack://latinera/./sources/components/private/adverb-lemma-item.html","webpack://latinera/./sources/components/private/analysis-activity-item.html","webpack://latinera/./sources/components/private/analysis-activity.html","webpack://latinera/./sources/components/private/analysis.html"],"sourcesContent":["// Define the view-model for the \"adjective-inflection-item\" component\n\n// Import library modules\nimport { inject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\n\n// import parameter modules\nimport { placeAdjectivesBeforeNounsRegExp } from \"parameters/regexp\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\n\n// Import service modules\nimport UserService from \"services/user\";\n\n\n// Export the \"AdjectiveInflectionItem\" class\n@inject(UserService)\nexport class AdjectiveInflectionItem {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) inflectionData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n\n // Local attributes\n placeAdjectivesBeforeNouns = false;\n\n constructor(userService) {\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n bind() {\n this.placeAdjectivesBeforeNouns =\n placeAdjectivesBeforeNounsRegExp.test(this.userService.uiLocaleCode);\n }\n\n\n // Getter and setter methods\n @computedFrom(\"inflectionData.key\")\n get inflectionKey() {\n const { key: inflectionKey = \"???\" } = this.inflectionData || {};\n return inflectionKey;\n }\n @computedFrom(\"inflectionData.cathegory\")\n get inflectionCathegory() {\n const { cathegory: inflectionCathegory = \"?\" } = this.inflectionData || {};\n return inflectionCathegory;\n }\n @computedFrom(\"inflectionData.class\")\n get inflectionClass() {\n const { class: inflectionClass = \"?\" } = this.inflectionData || {};\n return inflectionClass || \"?\"; // might be null\n }\n @computedFrom(\"inflectionClass\")\n get isFirstOrSecondClass() {\n return [ \"1st\", \"2nd\" ].includes(this.inflectionClass);\n }\n @computedFrom(\"inflectionData.degree\")\n get inflectionDegree() {\n const { degree: inflectionDegree = \"?\" } = this.inflectionData || {};\n return inflectionDegree;\n }\n @computedFrom(\"inflectionData.variant\")\n get inflectionVariant() {\n const { variant: inflectionVariant = \"\" } = this.inflectionData || {};\n return inflectionVariant;\n }\n\n}\n","// Define the view-model for the \"adjective-inflector-item\" component\n\n// Import library modules\nimport { bindable, bindingMode } from \"aurelia-framework\";\n\n\n// Export AdjectiveInflectorItem class\nexport class AdjectiveInflectorItem {\n\n // Attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) inflectorData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) classes = \"\";\n\n}\n","// Define the view-model for the \"adjective-lemma-form\" component\n\n// Import library modules\nimport { inject, computedFrom, bindable, bindingMode } from \"aurelia-framework\";\nimport { Validator } from \"aurelia-validation\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { cyrb53 as computeHash } from \"utilities/hash\";\nimport { normalizeWords } from \"utilities/sentence\";\nimport { optimizeSpaces } from \"utilities/string\";\nimport { pause } from \"utilities/promise\";\nimport { clone } from \"utilities/etc\";\nimport { \n hasTonicAccents,\n removeTonicAccents \n} from \"utilities/latin\";\nimport {\n unsetFalsyProperties,\n unsetProperties,\n toString\n} from \"utilities/object\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport { \n processInputFieldChangeEventAfterMs,\n processInputFieldBlurEventAfterMs\n} from \"parameters/time\";\nimport {\n shortLemmaDegrees,\n shortAdjectiveLemmaClasses,\n adjectiveLemmaInputFormData as defaultAdjectiveLemmaInputFormData\n} from \"parameters/lemma\";\n\n// Import service modules\nimport EventService from \"services/event\";\n\n// Define internal parameters\nconst isFirstClassLemmaRegExps = [ /(us|er)$/, /(a|e?ra)$/, /(um|e?rum)$/ ];\nconst isSecondClassLemmaRegExps = [ /(er|is|[xlrs])$/, /(is|e)$/, /(e)$/ ];\nconst eventsData = [\n { name: \"adjectiveDegreeChanged\" }, \n { name: \"adjectiveClassChanged\" }, \n { name: \"adjectiveParadigm0Changed\" },\n { name: \"adjectiveParadigm1Changed\" },\n { name: \"adjectiveParadigm2Changed\" },\n { name: \"adjectiveFormsRegularComparativeChanged\" },\n { name: \"adjectiveFormsRegularSuperlativeChanged\" },\n { name: \"lemmaInflectionsChanged\" },\n];\n\n\n// Export AdjectiveLemmaForm class\n@inject(I18N, Validator, EventService)\nexport class AdjectiveLemmaForm {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.twoWay }) inElementData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n\n // Local attributes\n rawFormData = clone(defaultAdjectiveLemmaInputFormData);\n lemmaData = null;\n lemmaDataDigest = \"\";\n oldLemmaDataDigest = \"\";\n lemmaDataValid = false;\n lemmaDataReady = false;\n showParadigm0InputFieldHint = false;\n showParadigm1InputFieldHint = false;\n showParadigm2InputFieldHint = false;\n showFormsRegularCmpAndSup = false;\n showLemmaDefinitions = false;\n validationErrorsData = [];\n i18nParams = i18nParams;\n\n constructor(i18n, validator, eventService) {\n this.i18n = i18n;\n this.validator = validator;\n this.eventService = eventService;\n }\n\n\n // Lifecycle methods\n bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"adjectiveLemmaForm\",\n eventService: this.eventService,\n eventsData\n });\n\n const lemmaDegreesData = shortLemmaDegrees\n .map(shortLemmaDegree => ({\n value: shortLemmaDegree,\n text: this.i18n.tr(`enums:longInflectionDegree.${shortLemmaDegree}`)\n }));\n const nullLemmaDegreeData = {\n value: null,\n text: this.i18n.tr(`main:none`)\n };\n this.lemmaDegreesData = [ ...lemmaDegreesData, nullLemmaDegreeData ];\n const lemmaClassesData = shortAdjectiveLemmaClasses\n .map(lemmaClass => ({\n value: lemmaClass,\n text: this.i18n.tr(`enums:longAdjectiveInflectionClass.${lemmaClass}`)\n }));\n const nullLemmaClassData = {\n value: null,\n text: this.i18n.tr(`main:none`)\n };\n this.lemmaClassesData = [ ...lemmaClassesData, nullLemmaClassData ];\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"rawFormData.text\")\n get lemmaText() {\n const { text: lemmaText = \"\" } = this.rawFormData || {};\n return lemmaText;\n }\n @computedFrom(\"rawFormData.paradigm\")\n get lemmaParadigmItems() {\n const { paradigm: lemmaParadigmItems = [] } = this.rawFormData || {};\n return lemmaParadigmItems;\n }\n @computedFrom(\"lemmaParadigmItems\")\n get lemmaParadigmItemsAvailable() {\n return this.lemmaParadigmItems\n .some((lemmaParadigmItem = \"\") => lemmaParadigmItem !== \"\");\n }\n\n @computedFrom(\"rawFormData.degree\")\n get lemmaDegree() {\n const { degree: lemmaDegree = \"\" } = this.rawFormData || {};\n return lemmaDegree;\n }\n\n\n // Core methods\n initializeLemmaDataChanged() {\n this.lemmaDataDigest = this.computeLemmaDataDigest();\n this.oldLemmaDataDigest = this.lemmaDataDigest;\n this.lemmaDataChanged = false;\n }\n\n updateLemmaDataChanged() {\n this.lemmaDataDigest = this.computeLemmaDataDigest();\n this.lemmaDataChanged = this.lemmaDataDigest !== this.oldLemmaDataDigest;\n }\n conditionallyPublishLemmaDataChangedEvent() {\n this.updateLemmaDataChanged();\n if (this.lemmaDataChanged) {\n this.oldLemmaDataDigest = this.lemmaDataDigest;\n this.publishLemmaDataChangedEvent();\n }\n }\n\n updateLemmaData() {\n if (!this.rawFormData.paradigm[2]) {\n this.rawFormData.paradigm = this.rawFormData.paradigm.slice(0,2);\n }\n this.lemmaData = unsetProperties(this.rawFormData, [\"_schemaId\"]);\n this.lemmaData = unsetFalsyProperties(this.lemmaData);\n }\n\n updateLemmaClass() {\n if (this.lemmaDegree === \"pos\") { // positive degree\n const plainLemmaParadigmItems = this.rawFormData.paradigm\n .map(lemmaParadigmItem => removeTonicAccents(lemmaParadigmItem || \"\"));\n const firstClassLemmaScore = plainLemmaParadigmItems\n .reduce((accFirstClassLemmaScore, plainLemmaParadigmItem, index) => {\n const isFirstClassLemmaRegExp = isFirstClassLemmaRegExps[index];\n return accFirstClassLemmaScore +\n (isFirstClassLemmaRegExp.test(plainLemmaParadigmItem) ? 1 : 0);\n }, 0);\n const secondClassLemmaScore = plainLemmaParadigmItems\n .reduce((accSecondClassLemmaScore, plainLemmaParadigmItem, index) => {\n const isSecondClassLemmaRegExp = isSecondClassLemmaRegExps[index];\n return accSecondClassLemmaScore +\n (isSecondClassLemmaRegExp.test(plainLemmaParadigmItem) ? 1 : 0);\n }, 0);\n if (firstClassLemmaScore > secondClassLemmaScore) {\n this.rawFormData.class = \"1st\";\n } else if (firstClassLemmaScore < secondClassLemmaScore) {\n this.rawFormData.class = \"2nd\";\n } else {\n this.rawFormData.class = null; // scores are equal\n }\n } else { // comparative or superlative degrees\n this.rawFormData.class = null;\n }\n }\n\n updateLemmaDataReady() {\n const lemmaTextReady = this.lemmaText !== \"\";\n const lemmaDegreeReady = this.lemmaDegree !== null;\n const lemmaClassReady = this.lemmaClass !== null;\n const lemmaParadigmReady = this.lemmaParadigmItems\n .every(lemmaParadigmItem => lemmaParadigmItem !== \"\");\n this.lemmaDataReady = lemmaTextReady && lemmaDegreeReady &&\n lemmaClassReady && lemmaParadigmReady;\n }\n\n computeLemmaDataDigest() {\n this.updateLemmaData();\n return computeHash(`lemma-${toString(this.lemmaData)}`);\n }\n\n async validateLemmaData() {\n this.rawFormData = unsetFalsyProperties(this.rawFormData, {\n keepEmptyStrings: true\n });\n this.validationErrorsData =\n await this.validator.validateObject(this.rawFormData);\n this.lemmaDataValid = this.validationErrorsData.length === 0;\n this.updateLemmaDataReady();\n }\n\n optimizeFormTextFieldsSpaces() {\n this.rawFormData = {\n ...this.rawFormData,\n text: normalizeWords(optimizeSpaces(this.lemmaText)),\n paradigm: this.lemmaParadigmItems.map(lemmaParadigmItem => {\n return normalizeWords(optimizeSpaces(lemmaParadigmItem));\n })\n }\n }\n\n\n // Event handlers\n // note1: do not automatically convert paradigm items of adjectives to \n // lower-case because they could be capitalized (e.g. Romanus,a,um)\n // note2: replacing paradigm array with mutated clone because changing it\n // in-place with splice does not propagate through two-way binding\n async handleAdjectiveParadigm0ChangedEvent({\n newValue: lemmaParadigmItem0 = \"\"\n }) {\n const paradigm = clone(this.rawFormData.paradigm);\n paradigm[0] = lemmaParadigmItem0;\n this.rawFormData.paradigm = paradigm;\n this.rawFormData.text = lemmaParadigmItem0;\n this.updateLemmaClass();\n this.showParadigm0InputFieldHint = lemmaParadigmItem0.length > 0 && \n !hasTonicAccents(lemmaParadigmItem0);\n await pause(processInputFieldChangeEventAfterMs);\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n async handleAdjectiveParadigm0BlurEvent() {\n this.optimizeFormTextFieldsSpaces();\n this.updateLemmaClass();\n const lemmaParadigmItem0 = this.lemmaParadigmItems.at(0) || \"\";\n this.showParadigm0InputFieldHint = lemmaParadigmItem0.length > 0 && \n !hasTonicAccents(lemmaParadigmItem0);\n await pause(processInputFieldBlurEventAfterMs);\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n\n async handleAdjectiveParadigm1ChangedEvent({\n newValue: lemmaParadigmItem1 = \"\"\n }) {\n const paradigm = clone(this.rawFormData.paradigm);\n paradigm[1] = lemmaParadigmItem1;\n this.rawFormData.paradigm = paradigm;\n this.updateLemmaClass();\n this.showParadigm1InputFieldHint = lemmaParadigmItem1.length > 0 && \n !hasTonicAccents(lemmaParadigmItem1);\n await pause(processInputFieldChangeEventAfterMs);\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n async handleAdjectiveParadigm1BlurEvent() {\n this.optimizeFormTextFieldsSpaces();\n this.updateLemmaClass();\n const lemmaParadigmItem1 = this.lemmaParadigmItems.at(1) || \"\";\n this.showParadigm1InputFieldHint = lemmaParadigmItem1.length > 0 && \n !hasTonicAccents(lemmaParadigmItem1);\n await pause(processInputFieldBlurEventAfterMs);\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n\n async handleAdjectiveParadigm2ChangedEvent({\n newValue: lemmaParadigmItem2 = \"\"\n }) {\n const paradigm = clone(this.rawFormData.paradigm);\n paradigm[2] = lemmaParadigmItem2;\n this.rawFormData.paradigm = paradigm;\n this.updateLemmaClass();\n this.showParadigm2InputFieldHint = lemmaParadigmItem2.length > 0 && \n !hasTonicAccents(lemmaParadigmItem2);\n await pause(processInputFieldChangeEventAfterMs);\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n async handleAdjectiveParadigm2BlurEvent() {\n this.optimizeFormTextFieldsSpaces();\n this.updateLemmaClass();\n const lemmaParadigmItem2 = this.lemmaParadigmItems.at(2) || \"\";\n this.showParadigm2InputFieldHint = lemmaParadigmItem2.length > 0 && \n !hasTonicAccents(lemmaParadigmItem2);\n await pause(processInputFieldBlurEventAfterMs);\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n\n async handleAdjectiveDegreeChangedEvent({\n newValue: lemmaDegree\n }) {\n this.rawFormData.degree = lemmaDegree;\n this.showFormsRegularCmpAndSup = lemmaDegree === \"pos\";\n if (this.showFormsRegularCmpAndSup) {\n this.rawFormData.formsRegularComparative = true;\n this.rawFormData.formsRegularSuperlative = true;\n } else {\n this.rawFormData.formsRegularComparative = false;\n this.rawFormData.formsRegularSuperlative = false;\n }\n this.updateLemmaClass();\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n handleAdjectiveClassChangedEvent() {}\n\n async handleAdjectiveFormsRegularComparativeChangedEvent({\n newValue: formsRegularComparative\n }) {\n this.rawFormData.formsRegularComparative = formsRegularComparative;\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n\n async handleAdjectiveFormsRegularSuperlativeChangedEvent({\n newValue: formsRegularSuperlative\n }) {\n this.rawFormData.formsRegularSuperlative = formsRegularSuperlative;\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n\n async handleLemmaInflectionsChangedEvent({\n selectedInflectionsKeys = []\n }) {\n this.showLemmaDefinitions = selectedInflectionsKeys.length > 0;\n }\n\n\n // Event publishers\n publishLemmaDataChangedEvent(eventData) {\n this.eventService.publish({\n eventName: \"lemmaDataChanged\",\n eventData: {\n lemmaData: this.lemmaData,\n lemmaDataValid: this.lemmaDataValid,\n lemmaDataReady: this.lemmaDataReady,\n ...(eventData || {})\n }\n });\n }\n\n publishCloseDropEvent(eventData) {\n this.eventService.publish({\n eventName: \"closeDrop\",\n eventData: eventData || {}\n });\n }\n\n}\n","// Define the view-model for the \"adjective-lemma-item\" component\n\n// Import library modules\nimport { bindable, bindingMode, computedFrom } from \"aurelia-framework\";\n\n// Import parameter modules\nimport { runMode as defaultRunMode } from \"parameters/environment\";\n\n\n// Export the \"AdjectiveLemmaItem\" class\nexport class AdjectiveLemmaItem {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) lemmaData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n @bindable({ defaultBindingMode: bindingMode.toView }) classes = \"\";\n\n\n // Getter and setter methods\n @computedFrom(\"lemmaData.key\")\n get lemmaKey() {\n const { key: lemmaKey = \"\" } = this.lemmaData || {};\n return lemmaKey;\n }\n @computedFrom(\"lemmaData.cathegory\")\n get lemmaCathegory() {\n const { cathegory: lemmaCathegory = \"\" } = this.lemmaData || {};\n return lemmaCathegory;\n }\n @computedFrom(\"lemmaData.degree\")\n get lemmaDegree() {\n const { degree: lemmaDegree = \"\" } = this.lemmaData || {};\n return lemmaDegree;\n }\n\n}\n","// Define the view-model for the \"adverb-inflector-item\" component\n\n// Import library modules\nimport { bindable, bindingMode } from \"aurelia-framework\";\n\n\n// Export AdverbInflectorItem class\nexport class AdverbInflectorItem {\n\n // Attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) inflectorData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) classes = \"\";\n\n}\n","// Define the view-model for the \"adverb-lemma-form\" component\n\n// Import library modules\nimport { inject, computedFrom, bindable, bindingMode } from \"aurelia-framework\";\nimport { Validator } from \"aurelia-validation\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { cyrb53 as computeHash } from \"utilities/hash\";\nimport { normalizeWords } from \"utilities/sentence\";\nimport { optimizeSpaces } from \"utilities/string\";\nimport { pause } from \"utilities/promise\";\nimport { clone } from \"utilities/etc\";\nimport { \n hasTonicAccents,\n removeTonicAccents \n} from \"utilities/latin\";\nimport {\n unsetProperties,\n toString\n} from \"utilities/object\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport { \n processInputFieldChangeEventAfterMs,\n processInputFieldBlurEventAfterMs\n} from \"parameters/time\";\nimport { \n shortLemmaDegrees,\n adverbLemmaInputFormData as defaultAdverbLemmaInputFormData\n} from \"parameters/lemma\";\n\n// Import service modules\nimport EventService from \"services/event\";\n\n// Define internal parameters\nconst positiveDegreeTestRegExp = /^.+(e|er|iter)$/;\nconst comparatibeDegreeTestRegExp = /^(magis\\W+\\S+e|.+ius)$/;\nconst superlativeDegreeTestRegExp = /^(maxime\\W+\\S+e|.+issime)$/;\nconst eventsData = [\n { name: \"adverbTextChanged\" },\n { name: \"adverbDegreeChanged\" },\n { name: \"lemmaInflectionsChanged\" },\n];\n\n\n// Export AdverbLemmaForm class\n@inject(I18N, Validator, EventService)\nexport class AdverbLemmaForm {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.twoWay }) inElementData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n\n // Local attributes\n rawFormData = clone(defaultAdverbLemmaInputFormData);\n lemmaData = null;\n lemmaDataDigest = \"\";\n oldLemmaDataDigest = \"\";\n lemmaDataValid = false;\n lemmaDataReady = false;\n showTextInputFieldHint = false;\n showLemmaDefinitions = false;\n validationErrorsData = [];\n i18nParams = i18nParams;\n\n constructor(i18n, validator, eventService) {\n this.i18n = i18n;\n this.validator = validator;\n this.eventService = eventService;\n }\n\n\n // Lifecycle methods\n bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"adverbLemmaForm\",\n eventService: this.eventService,\n eventsData\n });\n\n const lemmaDegreesData = shortLemmaDegrees\n .map(shortLemmaDegree => ({\n value: shortLemmaDegree,\n text: this.i18n.tr(`enums:longInflectionDegree.${shortLemmaDegree}`)\n }));\n const nullLemmaDegreeData = {\n value: null,\n text: this.i18n.tr(`main:none`)\n };\n this.lemmaDegreesData = [ ...lemmaDegreesData, nullLemmaDegreeData ];\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"rawFormData.text\")\n get lemmaText() {\n const { text: lemmaText = \"\" } = this.rawFormData || {};\n return lemmaText;\n }\n set lemmaText(newLemmaText = \"\") {\n this.rawFormData.text = newLemmaText;\n }\n\n\n // Core methods\n initializeLemmaDataChanged() {\n this.lemmaDataDigest = this.computeLemmaDataDigest();\n this.oldLemmaDataDigest = this.lemmaDataDigest;\n this.lemmaDataChanged = false;\n }\n\n updateLemmaDataChanged() {\n this.lemmaDataDigest = this.computeLemmaDataDigest();\n this.lemmaDataChanged = this.lemmaDataDigest !== this.oldLemmaDataDigest;\n }\n conditionallyPublishLemmaDataChangedEvent() {\n this.updateLemmaDataChanged();\n if (this.lemmaDataChanged) {\n this.oldLemmaDataDigest = this.lemmaDataDigest;\n this.publishLemmaDataChangedEvent();\n }\n }\n\n updateLemmaData() {\n this.lemmaData = unsetProperties(this.rawFormData, [\"_schemaId\"]);\n }\n\n updateLemmaDataReady() {\n const lemmaTextReady = this.lemmaText !== \"\";\n this.lemmaDataReady = lemmaTextReady;\n }\n\n computeLemmaDataDigest() {\n this.updateLemmaData();\n return computeHash(`lemma-${toString(this.lemmaData)}`);\n }\n\n async validateLemmaData() {\n this.validationErrorsData =\n await this.validator.validateObject(this.rawFormData);\n this.lemmaDataValid = this.validationErrorsData.length === 0;\n this.updateLemmaDataReady();\n }\n\n setDegreeFromText() {\n const { text: lemmaText = \"\" } = this.rawFormData;\n const plainLemmaText = removeTonicAccents(lemmaText);\n this.rawFormData.degree =\n positiveDegreeTestRegExp.test(plainLemmaText) ? \"pos\" :\n comparatibeDegreeTestRegExp.test(plainLemmaText) ? \"cmp\" :\n superlativeDegreeTestRegExp.test(plainLemmaText) ? \"sup\" :\n null;\n }\n\n\n // Event handlers\n // note1: automatically converting paradigm items of adverbs to \n // lower-case because they cannot be capitalized\n async handleAdverbTextChangedEvent({\n newValue: lemmaText = \"\"\n }) {\n this.lemmaText = lemmaText;\n this.setDegreeFromText();\n this.showTextInputFieldHint = this.lemmaText.length > 0 && \n !hasTonicAccents(this.lemmaText);\n await pause(processInputFieldChangeEventAfterMs);\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n async handleAdverbTextBlurEvent() {\n this.lemmaText = normalizeWords(optimizeSpaces(\n (this.lemmaText || \"\").toLowerCase()\n ));\n this.setDegreeFromText();\n this.showTextInputFieldHint = this.lemmaText.length > 0 && \n !hasTonicAccents(this.lemmaText);\n await pause(processInputFieldBlurEventAfterMs);\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n\n async handleAdverbDegreeChangedEvent({\n newValue: lemmaDegree\n }) {\n this.rawFormData.degree = lemmaDegree;\n await this.validateLemmaData();\n this.conditionallyPublishLemmaDataChangedEvent();\n }\n\n async handleLemmaInflectionsChangedEvent({\n selectedInflectionsKeys = []\n }) {\n this.showLemmaDefinitions = selectedInflectionsKeys.length > 0;\n }\n\n\n // Event publishers\n publishLemmaDataChangedEvent() {\n this.eventService.publish({\n eventName: \"lemmaDataChanged\",\n eventData: {\n lemmaData: this.lemmaData,\n lemmaDataValid: this.lemmaDataValid,\n lemmaDataReady: this.lemmaDataReady\n }\n });\n }\n\n}\n","// Define the view-model for the \"adverb-lemma-item\" component\n\n// Import library modules\nimport { bindable, bindingMode, computedFrom } from \"aurelia-framework\";\n\n// Import parameter modules\nimport { runMode as defaultRunMode } from \"parameters/environment\";\n\n\n// Export the \"AdverbLemmaItem\" class\nexport class AdverbLemmaItem {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) lemmaData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n @bindable({ defaultBindingMode: bindingMode.toView }) classes = \"\";\n\n\n // Getter and setter methods\n @computedFrom(\"lemmaData.key\")\n get lemmaKey() {\n const { key: lemmaKey = \"\" } = this.lemmaData || {};\n return lemmaKey;\n }\n @computedFrom(\"lemmaData.cathegory\")\n get lemmaCathegory() {\n const { cathegory: lemmaCathegory = \"\" } = this.lemmaData || {};\n return lemmaCathegory;\n }\n @computedFrom(\"lemmaData.degree\")\n get lemmaDegree() {\n const { degree: lemmaDegree = \"\" } = this.lemmaData || {};\n return lemmaDegree;\n }\n @computedFrom(\"lemmaData.parentLemma\")\n get parentLemmaData() {\n const { parentLemma: parentLemmaData = null } = this.lemmaData || {};\n return parentLemmaData;\n }\n\n}\n","// Define the view-model for the \"analysis-activity-item\" component\n\n// Import library modules\nimport { inject, bindable, bindingMode, computedFrom } from \"aurelia-framework\";\nimport { DialogService } from \"aurelia-dialog\";\nimport { Router } from \"aurelia-router\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { typeOf } from \"utilities/etc\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport {\n visibleMetaDataField as defaultVisibleMetaDataField\n} from \"parameters/activity\";\n\n// Import service modules\nimport ActivityService from \"services/activity\";\nimport EventService from \"services/event\";\nimport NotificationService from \"services/notification\";\n\n// Import method modules\nimport {\n deleteAnalysisActivity\n} from \"components/private/analysis-activity-item/delete-analysis-activity\";\n\n// Define internal parameters\nconst eventsData = [];\n\n\n// Export AnalysisActivityItem class\n@inject(\n ActivityService,\n DialogService,\n EventService,\n I18N,\n NotificationService,\n Router,\n)\nexport class AnalysisActivityItem {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) analysisActivityData = {};\n @bindable({ defaultBindingMode: bindingMode.toView }) activitiesIndex = -1;\n @bindable({ defaultBindingMode: bindingMode.toView }) displayMode = \"full\";\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n\n // Local attributes\n visibleMetaDataField = defaultVisibleMetaDataField;\n i18nParams = i18nParams;\n\n constructor(\n activityService,\n dialogService,\n eventService,\n i18n,\n notificationService,\n router\n ) {\n this.activityService = activityService;\n this.dialogService = dialogService;\n this.eventService = eventService;\n this.i18n = i18n;\n this.notificationService = notificationService;\n this.router = router;\n }\n\n\n // Lifecycle methods\n bind() {\n this.validateBoundAttributes();\n\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"analysisActivity\",\n entityKey: this.analysisActivityKey,\n eventService: this.eventService,\n eventsData\n });\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"runMode\")\n get showDebugInfo() {\n return [\"dev\"].includes(this.runMode);\n }\n\n @computedFrom(\"analysisActivityData.key\")\n get analysisActivityKey() {\n const { key: analysisActivityKey } = this.analysisActivityData || {};\n return analysisActivityKey;\n }\n\n @computedFrom(\"analysisActivityData.key\")\n get analysisData() {\n const { analysis: analysisData = null } = this.analysisActivityData || {};\n return analysisData;\n }\n\n @computedFrom(\"analysisData.key\")\n get analysisKey() {\n const { key: analysisKey } = this.analysisData || {};\n return analysisKey;\n }\n\n @computedFrom(\"analysisData.inSentence\")\n get inSentenceData() {\n const { inSentence: inSentenceData = null } = this.analysisData || {};\n return inSentenceData;\n }\n\n @computedFrom(\"analysisData.outSentence\")\n get outSentenceData() {\n const { outSentence: outSentenceData = null } = this.analysisData || {};\n return outSentenceData;\n }\n\n\n // Core methods\n validateBoundAttributes() {\n if (typeOf(this.activitiesIndex) !== \"number\" || this.activitiesIndex < -1) {\n throw new Error(`Bound attribute \"activitiesIndex\" should be ` +\n `a non-negative index`);\n }\n if (![\"full\", \"compact\"].includes(this.displayMode)) {\n throw new Error(`Unknown analysis display mode \"${this.displayMode}\"`);\n }\n }\n\n toggleVisibleMetaDataField() {\n switch (this.visibleMetaDataField) {\n case \"creationTime\":\n this.visibleMetaDataField = \"modificationTime\";\n break;\n case \"modificationTime\":\n this.visibleMetaDataField = \"creationTime\";\n break;\n default:\n this.visibleMetaDataField = \"creationTime\";\n }\n }\n\n async openAnalysisActivity() {\n await this.router.navigateToRoute(\"activity\", {\n activityKey: this.analysisActivityKey,\n activitiesIndex: this.activitiesIndex,\n taskAnalysisActivityKey: \"\"\n });\n }\n\n async deleteAnalysisActivity() {\n return await deleteAnalysisActivity.call(this);\n }\n\n\n // Event publishers\n publishDeleteActivityEvent(eventData) {\n this.eventService.publish({\n eventName: \"deleteActivity\",\n eventData: {\n activityKey: this.analysisActivityKey,\n ...(eventData || {})\n }\n });\n }\n\n}\n","// Define the \"deleteAnalysisActivity\" element method\n\n// Import dialog modules\nimport {\n ConfirmDeleteAnalysisActivity\n} from \"dialogs/confirm-delete-analysis-activity\";\n\n\n// deleteAnalysisActivity: async\n// returns a promise which resolves after the user has confirmed the\n// intention to delete the current analysis activity and this has been\n// deleted from the server/index\nexport async function deleteAnalysisActivity() {\n if (!this.dialogService) {\n throw new Error(`Missing required \"dialog\" service`);\n } else if (!this.activityService) {\n throw new Error(`Missing required \"activity\" service`);\n } else if (!this.publishDeleteActivityEvent) {\n throw new Error(`Missing required \"publishDeleteActivityEvent\" method`)\n }\n\n // Show confirm dialog\n const confirmDeleteAnalysisDialogOpenResult = await this.dialogService.open({\n viewModel: ConfirmDeleteAnalysisActivity,\n model: { analysisData: this.analysisData },\n //keyboard: [\"Escape\"] // keys that close the dialog\n });\n const confirmDeleteAnalysisDialogCloseResult =\n await confirmDeleteAnalysisDialogOpenResult.closeResult;\n if (confirmDeleteAnalysisDialogCloseResult.wasCancelled) {\n console.debug(`User canceled the deletion of analysis activity ` +\n `\"${this.analysisActivityKey}\"`);\n return;\n }\n\n // Delete analysis activity\n try {\n await this.activityService.deleteAnalysisActivity({\n analysisActivityKey: this.analysisActivityKey\n });\n } catch(error) {\n console.warn(`Error deleting analysis activity ` +\n `\"${this.analysisActivityKey}\"`, error);\n return;\n }\n\n // Publish delete activity event\n this.publishDeleteActivityEvent()\n}\n","// Define the view-model for the \"analysis-activity\" component\n\n// Import library modules\nimport {\n bindable,\n bindingMode,\n computedFrom,\n inject,\n} from \"aurelia-framework\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport { pause } from \"utilities/promise\";\nimport { typeOf } from \"utilities/etc\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { runModes } from \"parameters/application\";\n\n// Import method modules\nimport { \n loadAnalysisActivityStates\n} from \"./analysis-activity/load-analysis-activity-states\";\nimport {\n saveAnalysisActivity\n} from \"./analysis-activity/save-analysis-activity\";\nimport { \n handleChangeOutSentenceText\n} from \"./analysis-activity/handle-change-out-sentence-text\";\nimport { \n handleChangeOutElementText\n} from \"./analysis-activity/handle-change-out-element-text\";\nimport { \n handleChangeSelectedInInflector\n} from \"./analysis-activity/handle-change-selected-in-inflector\";\nimport { \n handleChangeSelectedDefinition\n} from \"./analysis-activity/handle-change-selected-definition\";\nimport { \n handleChangeSelectedGenerator \n} from \"./analysis-activity/handle-change-selected-generator\";\nimport { \n handleMoveCard \n} from \"./analysis-activity/handle-move-card\";\nimport { \n mergeCards \n} from \"./analysis-activity/merge-cards\";\nimport { \n handleMergeCardsEvent \n} from \"./analysis-activity/handle-merge-cards-event\";\nimport { \n splitCard \n} from \"./analysis-activity/split-card\";\nimport { \n handleSplitCardEvent \n} from \"./analysis-activity/handle-split-card-event\";\n\n// Import service modules\nimport ActivityService from \"services/activity\";\nimport CardService from \"services/card\";\nimport ElementService from \"services/element\";\nimport EventService from \"services/event\";\nimport NotificationService from \"services/notification\";\nimport SentenceService from \"services/sentence\";\nimport StateService from \"services/state\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst bindingPropagationTimeMs = 10;\nconst scrollOptions = {\n behavior: \"smooth\", // smooth|instant|auto\n block: \"center\" // start|center|end|nearest\n};\nconst eventsData = [\n { name: \"moveCard\", filterBy: \"activityKeyAndAnalysisKey\" },\n { name: \"mergeCards\", filterBy: \"activityKeyAndAnalysisKey\" },\n { name: \"splitCard\", filterBy: \"activityKeyAndAnalysisKey\" },\n { name: \"changeOutSentenceText\", filterBy: \"activityKeyAndAnalysisKey\" },\n { name: \"changeOutElementText\", filterBy: \"activityKeyAndAnalysisKey\" },\n { name: \"changeSelectedGenerator\", filterBy: \"activityKeyAndAnalysisKey\" },\n { name: \"changeSelectedInInflector\", filterBy: \"activityKeyAndAnalysisKey\" },\n { name: \"changeSelectedDefinition\", filterBy: \"activityKeyAndAnalysisKey\" },\n];\n\n\n// Export the \"AnalysisActivity\" class\n@inject(\n ActivityService,\n CardService,\n ElementService,\n EventService,\n NotificationService,\n SentenceService,\n StateService,\n UserService,\n)\nexport class AnalysisActivity {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) analysisActivityKey = \"\";\n @bindable({ defaultBindingMode: bindingMode.toView }) taskActivityKey = \"\";\n @bindable({ defaultBindingMode: bindingMode.toView }) activitiesIndex = -1;\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n\n // Local attributes\n analysisActivityStatesExtData = null;\n isLoadingData = false;\n isSavingData = false;\n showScrollToTopIcon = false;\n showScrollToBottomIcon = true;\n i18nParams = i18nParams;\n\n constructor(\n activityService,\n cardService,\n elementService,\n eventService,\n notificationService,\n sentenceService,\n stateService,\n userService,\n ) {\n this.activityService = activityService;\n this.cardService = cardService;\n this.elementService = elementService;\n this.eventService = eventService;\n this.notificationService = notificationService;\n this.sentenceService = sentenceService;\n this.stateService = stateService;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n async bind() {\n this.validateBoundAttributes();\n\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"analysisActivity\",\n entityKey: this.analysisActivityKey,\n eventService: this.eventService,\n eventsData\n });\n\n // Set last opened activity id \n const lastOpenedActivityId = this.taskActivityKey ?\n `taskActivity=${this.taskActivityKey}` :\n `analysisActivity=${this.analysisActivityKey}`;\n await this.activityService.setLastOpenedActivityId({\n lastOpenedActivityId\n });\n\n // Load analysis activity states\n this.analysisActivityStatesExtData = await this.loadAnalysisActivityStates({\n analysisActivityKey: this.analysisActivityKey\n });\n if (!this.analysisActivityStatesExtData) {\n this.notificationService.showUINotification({\n message: \"notifications:analysisLoadingError\",\n status: \"failure\",\n group: \"private\"\n });\n this.closeAnalysisActivity();\n return;\n }\n this.publishAnalysisActivityDataChangedEvent();\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"analysisActivityStatesExtData.statesData\")\n get analysisActivityStatesData() {\n const { \n statesData: analysisActivityStatesData = [] \n } = this.analysisActivityStatesExtData || {};\n return analysisActivityStatesData;\n }\n @computedFrom(\"analysisActivityStatesData\")\n get analysisActivityStatesCount() {\n return this.analysisActivityStatesData.length;\n }\n @computedFrom(\"analysisActivityStatesExtData.currentStateIndex\")\n get analysisActivityCurrentStateIndex() {\n const { \n currentStateIndex: analysisActivityCurrentStateIndex = -1 \n } = this.analysisActivityStatesExtData || {};\n return analysisActivityCurrentStateIndex;\n }\n @computedFrom(\n \"analysisActivityStatesData\", \n \"analysisActivityCurrentStateIndex\"\n )\n get currentAnalysisActivityStateData() {\n return this.analysisActivityStatesData\n .at(this.analysisActivityCurrentStateIndex) || null;\n }\n @computedFrom(\n \"analysisActivityStatesData\", \n \"analysisActivityCurrentStateIndex\",\n \"isLoadingData\",\n \"isSavingData\"\n )\n get canUndoLastChange() {\n return !this.isLoadingData && \n !this.isSavingData &&\n this.analysisActivityCurrentStateIndex > 0;\n }\n @computedFrom(\n \"analysisActivityStatesCount\", \n \"analysisActivityCurrentStateIndex\",\n \"isLoadingData\",\n \"isSavingData\"\n )\n get canRedoLastChange() {\n return !this.isLoadingData && \n !this.isSavingData &&\n this.analysisActivityCurrentStateIndex < this.analysisActivityStatesCount-1;\n }\n @computedFrom(\"currentAnalysisActivityStateData.liveData\")\n get analysisActivityData() {\n const { \n liveData: analysisActivityData = null \n } = this.currentAnalysisActivityStateData || {};\n return analysisActivityData;\n }\n @computedFrom(\"currentAnalysisActivityStateData.metaData\")\n get analysisActivityMetaData() {\n const { \n metaData: analysisActivityMetaData = null \n } = this.currentAnalysisActivityStateData || {};\n return analysisActivityMetaData;\n }\n @computedFrom(\"analysisActivityMetaData.isModified\")\n get analysisActivityDataModified() {\n const { \n isModified: analysisActivityDataModified = false \n } = this.analysisActivityMetaData || {};\n return analysisActivityDataModified;\n }\n @computedFrom(\"analysisActivityMetaData.isValid\")\n get analysisActivityDataValid() {\n const { \n isValid: analysisActivityDataValid = true \n } = this.analysisActivityMetaData || {};\n return analysisActivityDataValid;\n }\n @computedFrom(\"analysisActivityData.analysis\")\n get analysisData() {\n const { analysis: analysisData = null } = this.analysisActivityData || {};\n return analysisData;\n }\n @computedFrom(\"analysisActivityMetaData.analysis\")\n get analysisMetaData() {\n const { \n analysis: analysisMetaData = null \n } = this.analysisActivityMetaData || {};\n return analysisMetaData;\n }\n @computedFrom(\"analysisData.key\")\n get analysisKey() {\n const { key: analysisKey = \"\" } = this.analysisData || {};\n return analysisKey;\n }\n\n @computedFrom(\"taskActivityKey\")\n get isTaskActivity() {\n return this.taskActivityKey !== \"\";\n }\n\n @computedFrom(\"isLoadingData\", \"isSavingData\")\n get showHelpIcon() {\n return !(this.isLoadingData || this.isSavingData);\n }\n\n @computedFrom(\"canUndoLastChange\", \"canRedoLastChange\")\n get showUndoRedoAlert() {\n return this.canUndoLastChange || this.canRedoLastChange;\n }\n @computedFrom(\"analysisActivityDataModified\", \"analysisActivityDataValid\")\n get showUnsavedChangesAlert() {\n return this.analysisActivityDataModified && this.analysisActivityDataValid;\n }\n @computedFrom(\"analysisActivityDataModified\", \"analysisActivityDataValid\")\n get showInvalidChangesAlert() {\n return this.analysisActivityDataModified && !this.analysisActivityDataValid;\n }\n\n @computedFrom(\"isLoadingData\", \"isSavingData\")\n get isEnabled() {\n return !(this.isLoadingData || this.isSavingData);\n }\n\n\n // Core methods\n validateBoundAttributes() {\n if (typeOf(this.activitiesIndex) !== \"number\" || this.activitiesIndex < -1) {\n throw new Error(`Bound attribute \"activitiesIndex\" should be either ` +\n `minus one or a non-negative index`);\n }\n if (!runModes.includes(this.runMode)) {\n throw new Error(`Invalid run mode \"${this.runMode}\"`);\n }\n }\n\n toggleHelpCanvas() {\n this.userService.conditionallyExtendSession(); // do not await\n }\n\n scrollToTop() {\n this.showScrollToTopIcon = false;\n this.userService.conditionallyExtendSession(); // do not await\n if (this.scrollToTopElement) {\n this.scrollToTopElement.scrollIntoView(scrollOptions);\n }\n }\n topElementScrolledIntoView() {\n this.showScrollToTopIcon = false;\n }\n topElementScrolledOutOfView() {\n this.showScrollToTopIcon = true;\n }\n\n scrollToBottom() {\n this.showScrollToBottomIcon = false;\n this.userService.conditionallyExtendSession(); // do not await\n if (this.scrollToBottomElement) {\n this.scrollToBottomElement.scrollIntoView(scrollOptions);\n }\n }\n bottomElementScrolledIntoView() {\n this.showScrollToBottomIcon = false;\n }\n bottomElementScrolledOutOfView() {\n this.showScrollToBottomIcon = true;\n }\n\n async loadAnalysisActivityStates({ analysisActivityKey = \"\" }) {\n return loadAnalysisActivityStates.call(this, { analysisActivityKey });\n }\n\n mergeCards({ \n cardData1 = null, \n cardData2 = null,\n cardMetaData1 = null, \n cardMetaData2 = null\n }) {\n return mergeCards.call(this, { \n cardData1, \n cardData2,\n cardMetaData1,\n cardMetaData2\n });\n }\n\n splitCard({ \n cardData = null,\n cardMetaData = null\n }) {\n return splitCard.call(this, { \n cardData, \n cardMetaData \n });\n }\n\n async undoLastChange() {\n if (this.canUndoLastChange) {\n this.analysisActivityStatesExtData = await this.stateService\n .undoStateByActivity({ activityKey: this.analysisActivityKey });\n await pause(bindingPropagationTimeMs);\n this.publishAnalysisActivityDataChangedEvent();\n\n // Show UI notification\n this.notificationService.showUINotification({\n message: \"notifications:lastChangeUndone\",\n status: \"success\",\n group: \"private\"\n });\n }\n }\n\n async redoLastChange() {\n if (this.canRedoLastChange) {\n this.analysisActivityStatesExtData = await this.stateService\n .redoStateByActivity({ activityKey: this.analysisActivityKey });\n await pause(bindingPropagationTimeMs);\n this.publishAnalysisActivityDataChangedEvent();\n\n // Show UI notification\n this.notificationService.showUINotification({\n message: \"notifications:lastChangeRedone\",\n status: \"success\",\n group: \"private\"\n });\n }\n }\n\n async saveAnalysisActivity() {\n await saveAnalysisActivity.call(this);\n }\n\n closeAnalysisActivity() {\n this.publishCloseActivityEvent();\n }\n\n\n // Event filters\n filterEventByActivityKeyAndAnalysisKey({ \n activityKey = \"\",\n analysisKey = \"\" \n }) {\n return activityKey === this.analysisActivityKey && \n analysisKey === this.analysisKey;\n }\n\n\n // Event handlers \n async handleChangeOutSentenceTextEvent({ \n outSentenceKey = \"\", \n outSentenceText = \"\",\n outSentenceDataModified = false,\n outSentenceDataValid = true\n }) {\n await handleChangeOutSentenceText.call(this, {\n outSentenceKey,\n outSentenceText,\n outSentenceDataModified,\n outSentenceDataValid\n });\n }\n\n async handleChangeOutElementTextEvent({ \n outElementKey = \"\", \n outElementText = \"\",\n outElementDataModified = false,\n outElementDataValid = true,\n cardIndex = -1\n }) {\n await handleChangeOutElementText.call(this, {\n outElementKey,\n outElementText,\n outElementDataModified,\n outElementDataValid,\n cardIndex\n });\n }\n\n async handleChangeSelectedGeneratorEvent({ \n generatorData = null,\n lemmaKey = \"\", \n lemmaDataModified = false,\n cardIndex = -1,\n inChildElementIndex = -1\n }) {\n await handleChangeSelectedGenerator.call(this, {\n generatorData,\n lemmaKey,\n lemmaDataModified,\n cardIndex,\n inChildElementIndex\n })\n }\n\n async handleChangeSelectedInInflectorEvent({ \n inInflectorKey = \"\", \n inInflectorDataModified = false,\n cardIndex = -1,\n inChildElementIndex = -1\n }) {\n await handleChangeSelectedInInflector.call(this, {\n inInflectorKey,\n inInflectorDataModified,\n cardIndex,\n inChildElementIndex\n });\n }\n\n async handleChangeSelectedDefinitionEvent({ \n definitionKey = \"\", \n definitionDataModified = false,\n cardIndex = -1,\n inChildElementIndex = -1\n }) {\n await handleChangeSelectedDefinition.call(this, {\n definitionKey,\n definitionDataModified,\n cardIndex,\n inChildElementIndex\n });\n }\n\n async handleMoveCardEvent({ \n oldCardIndex = -1, \n newCardIndex = -1 \n }) {\n await handleMoveCard.call(this, { oldCardIndex, newCardIndex });\n }\n\n async handleMergeCardsEvent({ \n cardIndex1 = -1,\n cardIndex2 = -1\n }) {\n await handleMergeCardsEvent.call(this, { cardIndex1, cardIndex2 });\n }\n\n async handleSplitCardEvent({ \n cardIndex = -1\n }) {\n await handleSplitCardEvent.call(this, { cardIndex });\n }\n\n\n // Event publishers\n publishAnalysisActivityDataChangedEvent(eventData) {\n this.eventService.publish({\n eventName: \"analysisActivityDataChanged\",\n eventData: {\n activityKey: this.analysisActivityKey,\n analysisKey: this.analysisKey,\n activityDataModified: this.analysisActivityDataModified,\n activityDataValid: this.analysisActivityDataValid,\n ...(eventData || {})\n }\n });\n }\n\n publishAnalysisActivityDataSavedEvent(eventData) {\n this.eventService.publish({\n eventName: \"analysisActivityDataSaved\",\n eventData: {\n analysisActivityKey: this.analysisActivityKey,\n analysisActivityData: this.analysisActivityData,\n activitiesIndex: this.activitiesIndex,\n ...(eventData || {})\n }\n });\n }\n\n publishCloseActivityEvent(eventData) {\n this.eventService.publish({\n eventName: \"closeActivity\",\n eventData: {\n activityKey: this.analysisActivityKey,\n ...(eventData || {})\n }\n });\n }\n\n}\n","// Define the \"handleChangeOutElementText\" analysis-activity component method\n\n// Import utility modules\nimport { computeUpdatedMetaData } from \"utilities/state\";\n\n\n// handleChangeOutElementText: async\n// returns a promise which resolves after the \"changeOutElementText\" event \n// has been handled by computing a new state containing the specified changes \n// to the output element's text, and pushing it to the state service\n// note: the new state is obtained by cloning and then modifying only the\n// affected output element field. All other fields are just references\n// to the previous state so that the related components are not refreshed \n// un-necessarily\nexport async function handleChangeOutElementText({\n outElementText = \"\",\n outElementDataModified = false,\n outElementDataValid = true,\n cardIndex = -1\n}) {\n if (!this.stateService) {\n throw new Error(`Missing required \"state\" service`);\n } else if (!this.publishAnalysisActivityDataChangedEvent) {\n throw new Error(`Missing required ` +\n ` \"publishAnalysisActivityDataChangedEvent\" method`);\n }\n\n // Update action data\n this.analysisActivityMetaData.action = {\n name: \"changeOutElementText\",\n outElementText,\n cardIndex\n };\n\n // Update output element data\n const { cards: cardsData = [] } = this.analysisData || {};\n const cardData = cardsData.at(cardIndex) || null;\n if (!cardData) {\n console.warn(`Could not find card data at index \"${cardIndex}\"`);\n return;\n }\n const { outElement: outElementData = null } = cardData || {};\n if (!outElementData) {\n console.warn(`Could not find output element data ` +\n `for card at index \"${cardIndex}\"`);\n return;\n }\n this.analysisData.cards[cardIndex].outElement = {\n ...outElementData,\n text: outElementText\n };\n\n // Update output element metadata\n const { cards: cardsMetaData = [] } = this.analysisMetaData || {};\n const cardMetaData = cardsMetaData.at(cardIndex) || null;\n if (!cardMetaData) {\n console.warn(`Could not find card metadata at index \"${cardIndex}\"`);\n return;\n }\n const { \n outElement: outElementMetaData = null \n } = cardMetaData || {};\n if (!outElementMetaData) {\n console.warn(`Could not find output element metadata ` +\n `for card at index \"${cardIndex}\"`);\n return;\n }\n this.analysisMetaData.cards[cardIndex].outElement = {\n ...outElementMetaData,\n isModified: outElementDataModified,\n isValid: outElementDataValid\n };\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: this.analysisActivityData,\n metaData: computeUpdatedMetaData({\n analysisActivityData: this.analysisActivityData,\n analysisActivityMetaData: this.analysisActivityMetaData\n })\n }\n });\n\n // Publish the \"analysisActivityDataChanged\" event\n this.publishAnalysisActivityDataChangedEvent();\n}\n","// Define the \"handleChangeOutSentenceText\" analysis-activity component method\n\n// Import utility modules\nimport { computeUpdatedMetaData } from \"utilities/state\";\n\n\n// handleChangeOutSentenceText: async\n// returns a promise which resolves after the \"changeOutSentenceText\" event\n// has been handled by computing a new state containing the specified changes \n// to the output sentence's text, and pushing it to the state service\n// note: the new state is obtained by cloning and then modifying only the\n// affected output sentence field. All other fields are just references\n// to the previous state so that the related components are not refreshed \n// un-necessarily\nexport async function handleChangeOutSentenceText({\n outSentenceText = \"\",\n outSentenceDataModified = false,\n outSentenceDataValid = true \n}) {\n if (!this.stateService) {\n throw new Error(`Missing required \"state\" service`);\n } else if (!this.publishAnalysisActivityDataChangedEvent) {\n throw new Error(`Missing required ` +\n `\"publishAnalysisActivityDataChangedEvent\" method`);\n }\n\n // Update action data\n this.analysisActivityMetaData.action = {\n name: \"changeOutSentenceText\",\n outSentenceText\n };\n\n // Update output sentence data\n const { outSentence: outSentenceData = null } = this.analysisData || {};\n if (!outSentenceData) {\n console.warn(`Could not find output sentence data`);\n return;\n }\n this.analysisData.outSentence = {\n ...outSentenceData,\n text: outSentenceText\n };\n\n // Update output sentence metadata\n const { \n outSentence: outSentenceMetaData = null \n } = this.analysisMetaData || {};\n if (!outSentenceMetaData) {\n console.warn(`Could not find output sentence metadata`);\n return;\n }\n this.analysisMetaData.outSentence = {\n ...outSentenceMetaData,\n isModified: outSentenceDataModified,\n isValid: outSentenceDataValid\n };\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: this.analysisActivityData,\n metaData: computeUpdatedMetaData({\n analysisActivityData: this.analysisActivityData,\n analysisActivityMetaData: this.analysisActivityMetaData\n })\n }\n });\n\n // Publish the \"analysisActivityDataChanged\" event\n this.publishAnalysisActivityDataChangedEvent();\n}\n","// Define the \"handleChangeSelectedDefinition\" analysis-acitivity component \n// method\n\n// Import utility modules\nimport { computeUpdatedMetaData } from \"utilities/state\";\nimport { clone } from \"utilities/etc\";\n\n\n// handleChangeSelectedDefinition: async \n// returns a promise which resolves after the \"changeSelectedDefinition\" event\n// has been handled by computing a new state containing the specified changes \n// to the specified definition, and pushing it to the state service\n// note: the new state is obtained by cloning and then modifying only the\n// affected definition field. All other fields are just references\n// to the previous state so that the related components are not refreshed \n// un-necessarily\nexport async function handleChangeSelectedDefinition({\n definitionKey = \"\",\n definitionDataModified = false,\n cardIndex = -1,\n inChildElementIndex = -1\n}) {\n if (!this.stateService) {\n throw new Error(`Missing required \"state\" service`);\n } else if (!this.publishAnalysisActivityDataChangedEvent) {\n throw new Error(`Missing required ` +\n `\"publishAnalysisActivityDataChangedEvent\" method`);\n }\n\n // Update action data\n this.analysisActivityMetaData.action = {\n name: \"changeSelectedDefinition\",\n definitionKey,\n cardIndex,\n inChildElementIndex\n };\n\n // Update definition data\n const { cards: cardsData = [] } = this.analysisData || {};\n const cardData = cardsData.at(cardIndex) || null;\n if (!cardData) {\n console.warn(`Could not find card data at index \"${cardIndex}\"`);\n return;\n }\n const { definitions: definitionsData = [] } = cardData || {};\n if (definitionsData.length === 0) {\n console.warn(`Could not find array of definitions' data ` +\n `for card at index \"${cardIndex}\"`);\n return;\n }\n const definitionData = definitionsData.at(inChildElementIndex) || null;\n const updatedDefinitionData = {\n ...(definitionData || {}), // might be null\n key: definitionKey\n };\n const updatedDefinitionsData = clone(definitionsData);\n updatedDefinitionsData.splice(inChildElementIndex, 1, updatedDefinitionData);\n const updatedCardData = {\n ...cardData,\n definitions: updatedDefinitionsData\n };\n this.analysisData.cards.splice(cardIndex, 1, updatedCardData);\n\n // Update definition metadata\n const { cards: cardsMetaData = [] } = this.analysisMetaData || {};\n const cardMetaData = cardsMetaData.at(cardIndex) || null;\n if (!cardMetaData) {\n console.warn(`Could not find card metadata at index \"${cardIndex}\"`);\n return;\n }\n const { definitions: definitionsMetaData = [] } = cardMetaData || {};\n if (definitionsMetaData.length === 0) {\n console.warn(`Could not find array of definitions metadata ` +\n `for card at index \"${cardIndex}\"`);\n return;\n }\n const definitionMetaData = \n definitionsMetaData.at(inChildElementIndex) || null;\n const updatedDefinitionMetaData = {\n ...definitionMetaData,\n isModified: definitionDataModified\n };\n const updatedDefinitionsMetaData = clone(definitionsMetaData);\n updatedDefinitionsMetaData\n .splice(inChildElementIndex, 1, updatedDefinitionMetaData);\n const updatedCardMetaData = {\n ...cardMetaData,\n definitions: updatedDefinitionsMetaData\n };\n this.analysisMetaData.cards.splice(cardIndex, 1, updatedCardMetaData);\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: this.analysisActivityData,\n metaData: computeUpdatedMetaData({\n analysisActivityData: this.analysisActivityData,\n analysisActivityMetaData: this.analysisActivityMetaData\n })\n }\n });\n\n // Publish the \"analysisActivityDataChanged\" event\n this.publishAnalysisActivityDataChangedEvent();\n}\n","// Define the \"handleChangeSelectedGenerator\" analysis-acitivity component \n// method\n\n// Import utility modules\nimport { computeUpdatedMetaData } from \"utilities/state\";\nimport { clone } from \"utilities/etc\";\n\n\n// handleChangeSelectedGenerator: async \n// returns a promise which resolves after the \"changeSelectedGenerator\" event\n// has been handled by computing a new state containing the specified changes \n// to the specified generator (by lemma), and pushing it to the state service\n// note: the new state is obtained by cloning and then modifying only the\n// affected lemma field. All other fields are just references\n// to the previous state so that the related components are not refreshed \n// un-necessarily\nexport async function handleChangeSelectedGenerator({\n generatorData = null,\n lemmaKey = \"\",\n lemmaDataModified = false,\n cardIndex = -1,\n inChildElementIndex = -1\n}) {\n if (!this.stateService) {\n throw new Error(`Missing required \"state\" service`);\n } else if (!this.publishAnalysisActivityDataChangedEvent) {\n throw new Error(`Missing required ` +\n `\"publishAnalysisActivityDataChangedEvent\" method`);\n }\n\n // Update action data\n this.analysisActivityMetaData.action = {\n name: \"changeSelectedGenerator\",\n lemmaKey,\n cardIndex,\n inChildElementIndex\n };\n\n // Update lemma data\n const { cards: cardsData = [] } = this.analysisData || {};\n const cardData = cardsData.at(cardIndex) || null;\n if (!cardData) {\n console.warn(`Could not find card data at index \"${cardIndex}\"`);\n return;\n }\n const { \n lemmas: lemmasData = [],\n inInflectors: inInflectorsData = [],\n definitions: definitionsData = []\n } = cardData || {};\n if (lemmasData.length === 0) {\n console.warn(`Could not find array of lemmas' data ` +\n `for card at index \"${cardIndex}\"`);\n return;\n }\n const lemmaData = lemmasData.at(inChildElementIndex) || null;\n const updatedLemmaData = {\n ...(lemmaData || {}), // might be null\n key: lemmaKey\n };\n const updatedLemmasData = clone(lemmasData);\n updatedLemmasData.splice(inChildElementIndex, 1, updatedLemmaData);\n\n const { inflectors: availableInInflectorsData = [] } = generatorData || {};\n const activeInInflectorData = availableInInflectorsData.length === 1 ?\n availableInInflectorsData.at(0) || null : null;\n const { key: activeInInflectorKey = \"\" } = activeInInflectorData || {};\n const updatedInInflectorsData = clone(inInflectorsData);\n updatedInInflectorsData.splice(inChildElementIndex, 1, activeInInflectorData);\n\n const updatedDefinitionsData = clone(definitionsData);\n updatedDefinitionsData.splice(inChildElementIndex, 1, null);\n\n const updatedCardData = {\n ...cardData,\n lemmas: updatedLemmasData,\n inInflectors: updatedInInflectorsData,\n definitions: updatedDefinitionsData\n };\n this.analysisData.cards.splice(cardIndex, 1, updatedCardData);\n\n // Update lemma metadata\n const { cards: cardsMetaData = [] } = this.analysisMetaData || {};\n const cardMetaData = cardsMetaData.at(cardIndex) || null;\n if (!cardMetaData) {\n console.warn(`Could not find card metadata at index \"${cardIndex}\"`);\n return;\n }\n const { \n lemmas: lemmasMetaData = [],\n inInflectors: inInflectorsMetaData = [],\n definitions: definitionsMetaData = []\n } = cardMetaData || {};\n if (lemmasMetaData.length === 0) {\n console.warn(`Could not find array of lemmas metadata ` +\n `for card at index \"${cardIndex}\"`);\n return;\n } else if (inInflectorsMetaData.length === 0) {\n console.warn(`Could not find array of input inflectors metadata ` +\n `for card at index \"${cardIndex}\"`);\n return;\n } else if (definitionsMetaData.length === 0) {\n console.warn(`Could not find array of definitions metadata ` +\n `for card at index \"${cardIndex}\"`);\n return;\n }\n const lemmaMetaData = lemmasMetaData.at(inChildElementIndex) || null;\n const inInflectorMetaData = \n inInflectorsMetaData.at(inChildElementIndex) || null;\n const definitionMetaData = \n definitionsMetaData.at(inChildElementIndex) || null;\n const { savedKey: savedInInflectorKey = \"\" } = inInflectorMetaData || {};\n const { savedKey: savedDefinitionKey = \"\" } = definitionMetaData || {};\n const updatedLemmaMetaData = {\n ...lemmaMetaData,\n isModified: lemmaDataModified\n };\n const updatedLemmasMetaData = clone(lemmasMetaData);\n updatedLemmasMetaData.splice(inChildElementIndex, 1, updatedLemmaMetaData);\n\n const updatedInInflectorMetaData = {\n ...inInflectorMetaData,\n isModified: activeInInflectorKey !== savedInInflectorKey\n };\n const updatedInInflectorsMetaData = clone(inInflectorsMetaData);\n updatedInInflectorsMetaData\n .splice(inChildElementIndex, 1, updatedInInflectorMetaData);\n\n const updatedDefinitionMetaData = {\n ...definitionMetaData,\n isModified: savedDefinitionKey !== \"\"\n };\n const updatedDefinitionsMetaData = clone(definitionsMetaData);\n updatedDefinitionsMetaData\n .splice(inChildElementIndex, 1, updatedDefinitionMetaData);\n\n const updatedCardMetaData = {\n ...cardMetaData,\n lemmas: updatedLemmasMetaData,\n inInflectors: updatedInInflectorsMetaData,\n definitions: updatedDefinitionsMetaData\n };\n this.analysisMetaData.cards.splice(cardIndex, 1, updatedCardMetaData);\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: this.analysisActivityData,\n metaData: computeUpdatedMetaData({\n analysisActivityData: this.analysisActivityData,\n analysisActivityMetaData: this.analysisActivityMetaData\n })\n }\n });\n\n // Publish the \"analysisActivityDataChanged\" event\n this.publishAnalysisActivityDataChangedEvent();\n}\n","// Define the \"handleChangeSelectedInInflector\" analysis-acitivity component \n// method\n\n// Import utility modules\nimport { computeUpdatedMetaData } from \"utilities/state\";\nimport { clone } from \"utilities/etc\";\n\n\n// handleChangeSelectedInInflector: async \n// returns a promise which resolves after the \"changeSelectedInInflector\" event\n// has been handled by computing a new state containing the specified changes \n// to the specified input inflector, and pushing it to the state service\n// note: the new state is obtained by cloning and then modifying only the\n// affected input inflector field. All other fields are just references\n// to the previous state so that the related components are not refreshed \n// un-necessarily\nexport async function handleChangeSelectedInInflector({\n inInflectorKey = \"\",\n inInflectorDataModified = false,\n cardIndex = -1,\n inChildElementIndex = -1\n}) {\n if (!this.stateService) {\n throw new Error(`Missing required \"state\" service`);\n } else if (!this.publishAnalysisActivityDataChangedEvent) {\n throw new Error(`Missing required ` +\n `\"publishAnalysisActivityDataChangedEvent\" method`);\n }\n\n // Update action data\n this.analysisActivityMetaData.action = {\n name: \"changeSelectedInInflector\",\n inInflectorKey,\n cardIndex,\n inChildElementIndex\n };\n\n // Update input inflector data\n const { cards: cardsData = [] } = this.analysisData || {};\n const cardData = cardsData.at(cardIndex) || null;\n if (!cardData) {\n console.warn(`Could not find card data at index \"${cardIndex}\"`);\n return;\n }\n const { inInflectors: inInflectorsData = [] } = cardData || {};\n if (inInflectorsData.length === 0) {\n console.warn(`Could not find array of input inflectors' data ` +\n `for card at index \"${cardIndex}\"`);\n return;\n }\n const inInflectorData = inInflectorsData.at(inChildElementIndex) || null;\n const updatedInInflectorData = {\n ...(inInflectorData || {}), // might be null\n key: inInflectorKey\n };\n const updatedInInflectorsData = clone(inInflectorsData);\n updatedInInflectorsData.splice(inChildElementIndex, 1, updatedInInflectorData);\n const updatedCardData = {\n ...cardData,\n inInflectors: updatedInInflectorsData\n };\n this.analysisData.cards.splice(cardIndex, 1, updatedCardData);\n\n // Update input inflector metadata\n const { cards: cardsMetaData = [] } = this.analysisMetaData || {};\n const cardMetaData = cardsMetaData.at(cardIndex) || null;\n if (!cardMetaData) {\n console.warn(`Could not find card metadata at index \"${cardIndex}\"`);\n return;\n }\n const { inInflectors: inInflectorsMetaData = [] } = cardMetaData || {};\n if (inInflectorsMetaData.length === 0) {\n console.warn(`Could not find array of input inflectors metadata ` +\n `for card at index \"${cardIndex}\"`);\n return;\n }\n const inInflectorMetaData = \n inInflectorsMetaData.at(inChildElementIndex) || null;\n const updatedInInflectorMetaData = {\n ...inInflectorMetaData,\n isModified: inInflectorDataModified\n };\n const updatedInInflectorsMetaData = clone(inInflectorsMetaData);\n updatedInInflectorsMetaData\n .splice(inChildElementIndex, 1, updatedInInflectorMetaData);\n const updatedCardMetaData = {\n ...cardMetaData,\n inInflectors: updatedInInflectorsMetaData\n };\n this.analysisMetaData.cards.splice(cardIndex, 1, updatedCardMetaData);\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: this.analysisActivityData,\n metaData: computeUpdatedMetaData({\n analysisActivityData: this.analysisActivityData,\n analysisActivityMetaData: this.analysisActivityMetaData\n })\n }\n });\n\n // Publish the \"analysisActivityDataChanged\" event\n this.publishAnalysisActivityDataChangedEvent();\n}\n","// Define the \"handleMergeCardsEvent\" analysis component method\n\n// Import utility modules\nimport { typeOf } from \"utilities/etc\";\nimport { \n computeMergedCardMetaData,\n computeUpdatedMetaData\n} from \"utilities/state\";\n\n\n// handleMergeCardsEvent: sync\n// returns a promise which resolves after the \"mergeCards\" event has been\n// handled\nexport async function handleMergeCardsEvent({ \n cardIndex1 = -1,\n cardIndex2 = -1\n}) {\n if (typeOf(cardIndex1) !== \"number\" || cardIndex1 < 0) {\n throw new Error(`Parameter \"cardIndex1\" should be a non-negative integer`);\n } else if (typeOf(cardIndex2) !== \"number\" || cardIndex2 < 0) {\n throw new Error(`Parameter \"cardIndex2\" should be a non-negative integer`);\n } else if (!this.mergeCards) {\n throw new Error(`Missing required \"mergeCards\" method`);\n } else if (!this.publishAnalysisActivityDataChangedEvent) {\n throw new Error(`Missing required ` +\n `\"publishAnalysisActivityDataChangedEvent\" method`);\n } else if (!this.notificationService) {\n throw new Error(`Missing required \"notification\" service`);\n }\n\n // Compute cards data\n const { cards: cardsData = [] } = this.analysisData || {};\n if (cardsData.length === 0) {\n console.warn(`Could not find cards data`);\n return;\n }\n const cardData1 = cardsData.at(cardIndex1) || null;\n if (!cardData1) {\n console.warn(`Could not find card data at index ${cardIndex1}`);\n return;\n }\n const cardData2 = cardsData.at(cardIndex2) || null;\n if (!cardData2) {\n console.warn(`Could not find card at index ${cardIndex2}`);\n return;\n }\n const { key: cardKey1 = \"\" } = cardData1 || {};\n const { key: cardKey2 = \"\" } = cardData2 || {};\n\n // Compute cards' metadata\n const { cards: cardsMetaData = [] } = this.analysisMetaData || {};\n if (cardsMetaData.length === 0) {\n console.warn(`Could not find cards metadata`);\n return;\n }\n const cardMetaData1 = cardsMetaData.at(cardIndex1) || null;\n if (!cardMetaData1) {\n console.warn(`Could not find card metadata at index ${cardIndex1}`);\n return;\n }\n const cardMetaData2 = cardsMetaData.at(cardIndex2) || null;\n if (!cardMetaData2) {\n console.warn(`Could not find card metadata at index ${cardIndex2}`);\n return;\n }\n\n // Merge specified cards\n const mergedCardData = await this.mergeCards({\n cardData1, \n cardData2,\n cardMetaData1,\n cardMetaData2\n });\n\n // Merge operation failed\n if (mergedCardData === null) {\n // Display console message\n console.warn(`Error merging cards \"${cardKey1}\" and \"${cardKey2}\"`);\n\n // Show UI notification\n this.notificationService.showUINotification({\n message: \"notifications:cardsMergingError\",\n status: \"failure\",\n group: \"private\"\n });\n\n return;\n }\n const { key: mergedCardKey = \"\" } = mergedCardData;\n\n // Update action data\n // note: setting action data after the merge operation succeeded\n this.analysisActivityMetaData.action = {\n name: \"mergeCards\",\n cardKey1,\n cardKey2,\n cardIndex1,\n cardIndex2\n };\n\n // Update cards data\n cardsData.splice(cardIndex1, 2, mergedCardData);\n this.analysisData.cards = cardsData;\n\n // Update cards metadata\n const mergedCardMetaData = computeMergedCardMetaData({\n cardMetaData1,\n cardMetaData2\n });\n if (mergedCardMetaData === null) {\n // Display console message\n console.warn(`Error merging cards \"${cardKey1}\" and \"${cardKey2}\" metadata`);\n\n // Show UI notification\n this.notificationService.showUINotification({\n message: \"notifications:cardsMergingError\",\n status: \"failure\",\n group: \"private\"\n });\n\n return;\n }\n cardsMetaData.splice(cardIndex1, 2, mergedCardMetaData);\n this.analysisMetaData.cards = cardsMetaData;\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: this.analysisActivityData,\n metaData: computeUpdatedMetaData({\n analysisActivityData: this.analysisActivityData,\n analysisActivityMetaData: this.analysisActivityMetaData\n })\n }\n });\n\n // Publish the \"analysisActivityDataChanged\" event\n this.publishAnalysisActivityDataChangedEvent();\n\n // Display console message\n console.info(`Merged cards \"${cardKey1}\" and \"${cardKey2}\" into ` +\n `card ${mergedCardKey} at index ${cardIndex1}`);\n\n // Display UI notification message\n this.notificationService.showUINotification({\n message: \"notifications:cardsMerged\",\n status: \"success\",\n group: \"private\"\n });\n}\n","// Define the \"handleMoveCard\" analysis-activity component method\n\n// Import utility modules\nimport { computeUpdatedMetaData } from \"utilities/state\";\nimport { moveItem } from \"utilities/array\";\nimport { pause } from \"utilities/promise\";\n\n\n// handleMoveCard: async\n// returns a promise which resolves after the \"moveCard\" event has been \n// handled by computing a new state containing the specified changes \n// to the cards' array, and pushing it to the state service\n// note: the new state is obtained by cloning and then modifying only the\n// affected cards' array field. All other fields are just references\n// to the previous state so that the related components are not refreshed \n// un-necessarily\nexport async function handleMoveCard({\n oldCardIndex,\n newCardIndex\n}) {\n if (!this.stateService) {\n throw new Error(`Missing required \"state\" service`);\n } else if (!this.notificationService) {\n throw new Error(`Missing required \"notification\" service`);\n } else if (!this.publishAnalysisActivityDataChangedEvent) {\n throw new Error(`Missing required ` +\n `\"publishAnalysisActivityDataChangedEvent\" method`);\n }\n\n // Update action data\n this.analysisActivityMetaData.action = {\n name: \"moveCard\",\n oldCardIndex,\n newCardIndex\n };\n\n // Update cards data\n const { cards: cardsData = [] } = this.analysisData || {};\n if (cardsData.length === 0) {\n console.warn(`Could not find cards data`);\n return;\n }\n this.analysisData.cards = \n moveItem(cardsData, oldCardIndex, newCardIndex);\n\n // Update cards metadata\n const { \n cards: cardsMetaData = null \n } = this.analysisMetaData || {};\n if (cardsMetaData.length === 0) {\n console.warn(`Could not find cards metadata`);\n return;\n }\n this.analysisMetaData.cards = \n moveItem(cardsMetaData, oldCardIndex, newCardIndex);\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: this.analysisActivityData,\n metaData: computeUpdatedMetaData({\n analysisActivityData: this.analysisActivityData,\n analysisActivityMetaData: this.analysisActivityMetaData\n })\n }\n });\n\n // Display console message\n console.info(`Moved card from index ${oldCardIndex} ` +\n `to index ${newCardIndex}`);\n\n // Display UI notification message\n this.notificationService.showUINotification({\n message: \"notifications:cardMoved\",\n status: \"success\",\n group: \"private\"\n });\n\n // Publish the \"analysisActivityDataChanged\" event\n await pause(50);\n this.publishAnalysisActivityDataChangedEvent();\n}\n","// Define the \"handleSplitCardEvent\" analysis component method\n\n// Import utility modules\nimport { typeOf } from \"utilities/etc\";\nimport { \n computeSplitCardsMetaData,\n computeUpdatedMetaData \n} from \"utilities/state\";\n\n\n// handleSplitCardEvent: async\n// returns a promise which resolves after the \"splitCard\" event has been\n// handled by the analysis component\nexport async function handleSplitCardEvent({ \n cardIndex = -1\n}) {\n if (typeOf(cardIndex) !== \"number\" || cardIndex < 0) {\n throw new Error(`Parameter \"cardIndex\" should be a non-negative integer`);\n } else if (!this.splitCard) {\n throw new Error(`Missing required \"splitCard\" method`);\n } else if (!this.notificationService) {\n throw new Error(`Missing required \"notification\" service`);\n }\n\n // Compute card data\n const { cards: cardsData = [] } = this.analysisData || {};\n if (cardsData.length === 0) {\n console.warn(`Could not find cards data`);\n return;\n }\n const cardData = cardsData.at(cardIndex) || null;\n if (!cardData) {\n console.warn(`Could not find card data at index ${cardIndex}`);\n return;\n }\n const { key: cardKey = \"\" } = cardData || {};\n\n // Compute card metadata\n const { cards: cardsMetaData = [] } = this.analysisMetaData || {};\n if (cardsMetaData.length === 0) {\n console.warn(`Could not find cards metadata`);\n return;\n }\n const cardMetaData = cardsMetaData.at(cardIndex) || null;\n if (!cardMetaData) {\n console.warn(`Could not find card metadata at index ${cardIndex}`);\n return;\n }\n\n // Split specified card\n const splitCardsData = await this.splitCard({ \n cardData,\n cardMetaData\n });\n const splitCardsCount = splitCardsData.length;\n\n // Split operation failed\n if (splitCardsCount === 0) {\n // Display console message\n console.warn(`Error splitting card \"${cardKey}\"`);\n\n // Show UI notification\n this.notificationService.showUINotification({\n message: \"notifications:cardSplittingError\",\n status: \"failure\",\n group: \"private\"\n });\n\n return;\n }\n const splitCardsKeys = splitCardsData\n .map(({ key: splitCardKey = \"\" }) => splitCardKey);\n\n // Update action data\n // note: setting action data after the split operation succeeded\n this.analysisActivityMetaData.action = {\n name: \"splitCard\",\n cardKey,\n cardIndex\n };\n\n // Update cards data\n cardsData.splice(cardIndex, 1, ...splitCardsData);\n this.analysisData.cards = cardsData;\n\n // Update cards metadata\n const splitCardsMetaData = computeSplitCardsMetaData({\n splitCardsData\n });\n cardsMetaData.splice(cardIndex, 1, ...splitCardsMetaData);\n this.analysisMetaData.cards = cardsMetaData;\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: this.analysisActivityData,\n metaData: computeUpdatedMetaData({\n analysisActivityData: this.analysisActivityData,\n analysisActivityMetaData: this.analysisActivityMetaData\n })\n }\n });\n\n // Publish the \"analysisActivityDataChanged\" event\n this.publishAnalysisActivityDataChangedEvent();\n\n // Display console message\n console.info(`Splitted card \"${cardKey}\" into cards [${splitCardsKeys}]`);\n\n // Show UI notification\n this.notificationService.showUINotification({\n message: \"notifications:cardSplitted\",\n status: \"success\",\n group: \"private\"\n });\n}\n","// Define the \"loadAnalysisActivityStates\" analysis-activity component method\n\n// Import utility modules\nimport { computeInitialMetaData } from \"utilities/state\";\nimport { typeOf } from \"utilities/etc\";\n\n\n// loadAnalysisActivityStates: sync\n// returns a promise which resolves either with the states data associated \n// with the specifed analysis activity key, or with null if any error occurs\nexport async function loadAnalysisActivityStates({\n analysisActivityKey = \"\"\n}) {\n if (typeOf(analysisActivityKey) !== \"string\" || !analysisActivityKey) {\n throw new Error(`Parameter \"analysisActivityKey\" should be a key string`);\n } else if (!this.activityService) {\n throw new Error(`Missing required \"activity\" service`);\n } else if (!this.stateService) {\n throw new Error(`Missing required \"state\" service`);\n }\n\n // Load analysis activity data from the activity service\n const loadedAnalysisActivityData = await this.activityService\n .getActivityByKey({ activityKey: analysisActivityKey });\n if (!loadedAnalysisActivityData) {\n return null;\n }\n\n // Load overall states data from the state service\n const analysisActivityStatesExtData = await this.stateService\n .loadStatesByActivity({ activityKey: analysisActivityKey });\n const { \n statesData = [],\n currentStateIndex = -1\n } = analysisActivityStatesExtData;\n\n // Compute initial overall states data\n const loadedStateData = {\n liveData: loadedAnalysisActivityData,\n metaData: computeInitialMetaData({\n analysisActivityData: loadedAnalysisActivityData\n })\n };\n const currentStateData = statesData.at(currentStateIndex) || null;\n const initialStateExtData = currentStateData ? analysisActivityStatesExtData : {\n statesData: [loadedStateData],\n currentStateIndex: 0\n };\n\n // Save initial overall states data to the state service\n const savedStateExtData = await this.stateService.saveStatesByActivity({\n activityKey: this.analysisActivityKey,\n statesExtData: initialStateExtData\n });\n if (!savedStateExtData) {\n console.warn(`Error saving initial overall states data to the index`);\n }\n return savedStateExtData;\n}\n","// Define the \"mergeCards\" analysis activity method\n\n// Import utility modules\nimport { canMergeCards } from \"utilities/card\";\n\n// Import parameter modules\nimport { inLocaleCode as defaultInLocaleCode } from \"parameters/environment\";\n\n\n// mergeCards: sync\n// returns a promise which resolves either with the card object obtained\n// by merging the specified card objects, or with null if any error occurs\nexport async function mergeCards({\n cardData1 = null,\n cardData2 = null,\n cardMetaData1 = null,\n cardMetaData2 = null\n}) {\n if (!cardData1) {\n throw new Error(`Missing required parameter \"cardData1\"`);\n } else if (!cardData2) {\n throw new Error(`Missing required parameter \"cardData2\"`);\n } else if (!cardMetaData1) {\n throw new Error(`Missing required parameter \"cardMetaData1\"`);\n } else if (!cardMetaData2) {\n throw new Error(`Missing required parameter \"cardMetaData2\"`);\n } else if (!this.elementService) {\n throw new Error(`Missing required \"element\" service`);\n } else if (!this.cardService) {\n throw new Error(`Missing required \"card\" service`);\n } else if (!this.userService) {\n throw new Error(`Missing required \"user\" service`);\n }\n\n // Destructure cards' data\n const {\n key: cardKey1 = \"\",\n inElement: {\n key: inElementKey1 = \"\",\n type: inElementType1 = \"\",\n text: inElementText1 = \"\"\n } = {},\n outElement: {\n key: outElementKey1 = \"\",\n text: outElementText1 = \"\"\n } = {}\n } = cardData1;\n const {\n key: cardKey2 = \"\",\n inElement: {\n key: inElementKey2 = \"\",\n type: inElementType2 = \"\",\n text: inElementText2 = \"\"\n } = {},\n outElement: {\n key: outElementKey2 = \"\",\n text: outElementText2 = \"\"\n } = {}\n } = cardData2;\n if (!outElementKey1 || !outElementKey2) {\n console.warn(`Output elements should be saved before joining cards: t.b.i.`);\n return null;\n }\n\n // Verify that cards can be merged\n const canCardsBeMerged = canMergeCards({\n cardData1,\n cardData2,\n cardMetaData1,\n cardMetaData2\n });\n if (!canCardsBeMerged) {\n console.warn(`Cannot merge cards \"${cardKey1}\" and \"${cardKey2}\"`);\n return null;\n }\n\n // Create merged input/output group elements\n const inChildElementsDataPromise1 = inElementType1 === \"grp\" ?\n this.elementService.getChildElementsByElement({ \n key: inElementKey1, \n type: inElementType1 \n }) : \n Promise.resolve([cardData1.inElement]);\n const inChildElementsDataPromise2 = inElementType2 === \"grp\" ?\n this.elementService.getChildElementsByElement({ \n key: inElementKey2, \n type: inElementType2 \n }) :\n Promise.resolve([cardData2.inElement]);\n const [ \n inChildElementsData1 = [], \n inChildElementsData2 = []\n ] = await Promise.all([\n inChildElementsDataPromise1,\n inChildElementsDataPromise2\n ]);\n const inChildElementsKeys1 = inChildElementsData1\n .map(({ key: inChildElementKey = \"\" }) => inChildElementKey);\n const inChildElementsKeys2 = inChildElementsData2\n .map(({ key: inChildElementKey = \"\" }) => inChildElementKey);\n const newInElementText = [ inElementText1, inElementText2 ]\n .map(inElementText => inElementText.trim())\n .join(\" \")\n .trim();\n const newOutElementText = [ outElementText1, outElementText2 ]\n .map(outElementText => outElementText.trim())\n .join(\" \")\n .trim();\n const createNewInElementPromise = this.elementService.createElement({\n type: \"grp\",\n text: newInElementText,\n leafElementsKeys: [ ...inChildElementsKeys1, ...inChildElementsKeys2 ],\n localeCode: defaultInLocaleCode\n });\n const createNewOutElementPromise = this.elementService.createElement({\n type: \"grp\",\n text: newOutElementText,\n leafElementsKeys: [ outElementKey1, outElementKey2 ],\n localeCode: this.userService.outLocaleCode\n });\n let newInElementData, newOutElementData;\n try {\n ([ newInElementData, newOutElementData ] = await Promise.all([\n createNewInElementPromise,\n createNewOutElementPromise\n ]));\n } catch(error) {\n console.warn(`Error creating input/output elements while merging ` +\n `cards \"${cardKey1}\" and \"${cardKey2}\"`, error);\n return null;\n }\n\n // Create merged card out of merged input/output elements\n try {\n return await this.cardService.createCard({\n inElement: newInElementData,\n outElement: newOutElementData\n });\n } catch(error) {\n console.warn(`Error creating card by merging ` +\n `cards \"${cardKey1}\" and \"${cardKey2}\"`, error);\n return null;\n }\n}\n","// Define the \"saveAnalysisActivity\" analysis activity component method\n\n// Import utility modules\nimport { computeInitialMetaData } from \"utilities/state\";\nimport { pause } from \"utilities/promise\";\n\n// Import parameter modules\nimport { mockSavingDataDurationMs } from \"parameters/time\";\n\n\n// saveAnalysisActivity: async \n// returns a promise which resolves after the current analysis activity\n// data has been saved to the server and the corresponding new state has \n// been appended to the states' array\nexport async function saveAnalysisActivity() {\n if (!this.activityService) {\n throw new Error(`Missing required \"activity\" service`);\n } else if (!this.elementService) {\n throw new Error(`Missing required \"element\" service`);\n } else if (!this.cardService) {\n throw new Error(`Missing required \"card\" service`);\n } else if (!this.notificationService) {\n throw new Error(`Missing required \"notification\" service`);\n } else if (!this.sentenceService) {\n throw new Error(`Missing required \"sentence\" service`);\n } else if (!this.stateService) {\n throw new Error(`Missing required \"state\" service`);\n } else if (!this.publishAnalysisActivityDataChangedEvent) {\n throw new Error(`Missing required ` +\n ` \"publishAnalysisActivityDataChangedEvent\" method`);\n } else if (!this.publishAnalysisActivityDataSavedEvent) {\n throw new Error(`Missing required ` +\n ` \"publishAnalysisActivityDataSavedEvent\" method`);\n }\n\n // Already saving data\n if (this.isSavingData) {\n console.debug(`Already saving analysis activity ` +\n `\"${this.analysisActivityKey}\"`);\n return;\n }\n\n // Start saving data\n this.isSavingData = true;\n\n // Mock saving data duration\n if ([\"dev\"].includes(this.runMode)) {\n console.debug(`Mocking saving analysis activity data duration of ` +\n `${mockSavingDataDurationMs}ms while in \"${this.runMode}\" mode`);\n await pause(mockSavingDataDurationMs);\n }\n\n try {\n // Unpack analysis data\n const { key: analysisKey = \"\" } = this.analysisData || {};\n const { \n isModified: analysisDataModified = false,\n isValid: analysisDataValid = true \n } = this.analysisMetaData || {};\n if (!analysisDataValid) { // should never happen\n throw new Error(`Cannot save invalid analysis \"${analysisKey}\"`);\n } else if (!analysisDataModified) {\n console.info(`Analysis \"${analysisKey}\" is already saved`);\n }\n\n // Unpack input sentence data\n const { inSentence: inSentenceData = null } = this.analysisData || {};\n const { key: inSentenceKey = \"\" } = inSentenceData || {};\n\n // Unpack output sentence data\n const { outSentence: outSentenceData = null } = this.analysisData || {};\n const { \n outSentence: outSentenceMetaData = null \n } = this.analysisMetaData || {};\n if (!outSentenceData) { // should never happen\n throw new Error(`Could not find output sentence data`);\n } else if (!outSentenceMetaData) { // should never happen\n throw new Error(`Could not find output sentence metadata`);\n }\n const { key: outSentenceKey = \"\" } = outSentenceData || {};\n const { \n isModified: outSentenceDataModified = false,\n isValid: outSentenceDataValid = true \n } = outSentenceMetaData || {};\n if (!outSentenceDataValid) { // should never happen\n throw new Error(`Cannot save invalid output sentence ` +\n `\"${outSentenceKey}\"`);\n }\n\n // Define save output sentence data promise\n const savedOutSentenceDataPromises = [outSentenceData]\n .map(async(outSentenceData) => {\n let savedOutSentenceData;\n try {\n savedOutSentenceData = await (outSentenceDataModified ?\n this.sentenceService.saveSentence({\n sentenceData: outSentenceData\n }) :\n Promise.resolve(outSentenceData));\n } catch(error) {\n console.warn(error);\n throw new Error(`Error saving output sentence \"${outSentenceKey}\"`);\n }\n const { key: savedOutSentenceKey = \"\" } = savedOutSentenceData || {};\n if (!savedOutSentenceKey) {\n throw new Error(`Error saving output sentence \"${outSentenceKey}\"`);\n }\n return savedOutSentenceData;\n });\n \n // Define save cards data promise\n const { cards: cardsData = [] } = this.analysisData || {};\n const { cards: cardsMetaData = [] } = this.analysisMetaData || {};\n const savedCardsDataPromises = cardsData\n .map(async(cardData, cardIndex) => {\n const cardMetaData = cardsMetaData.at(cardIndex) || null;\n if (!cardData) { // should never happen\n throw new Error(`Could not find card data at index ${cardIndex}`);\n } else if (!cardMetaData) { // should never happen\n throw new Error(`Could not find card metadata at index ${cardIndex}`);\n }\n const { key: cardKey = \"\" } = cardData || {};\n const { \n isModified: cardDataModified = false,\n isValid: cardDataValid = true \n } = cardMetaData || {};\n if (!cardDataValid) { // should never happen\n throw new Error(`Cannot save invalid card ` +\n `\"${cardKey}\" at index ${cardIndex}`);\n }\n\n // Unpack output element data\n const { outElement: outElementData = null } = cardData || {};\n const { outElement: outElementMetaData = null } = cardMetaData || {};\n if (!outElementData) { // should never happen\n throw new Error(`Could not find output element data ` +\n `at index ${cardIndex}`);\n } else if (!outElementMetaData) { // should never happen\n throw new Error(`Could not find output element metadata ` +\n `at index ${cardIndex}`);\n }\n const {\n key: outElementKey = \"\",\n } = outElementData || {};\n const { \n isModified: outElementDataModified = false,\n isValid: outElementDataValid = true \n } = outElementMetaData || {};\n if (!outElementDataValid) { // should never happen\n throw new Error(`Cannot saved invalid output element ` +\n `\"${outElementKey}\" at index ${cardIndex}`);\n }\n\n // Save output element\n const savedOutElementDataPromise = outElementDataModified ?\n this.elementService.saveElement(outElementData) :\n Promise.resolve(outElementData);\n let savedOutElementData;\n try {\n savedOutElementData = await savedOutElementDataPromise;\n } catch(error) {\n console.warn(error);\n throw new Error(`Error saving output element \"${outElementKey}\"`);\n }\n\n // Save card\n const savedCardDataPromise = cardDataModified ?\n this.cardService.saveCard({\n ...cardData,\n outElement: savedOutElementData\n }) : Promise.resolve(cardData);\n let savedCardData;\n try {\n savedCardData = await savedCardDataPromise;\n } catch(error) {\n console.warn(error);\n throw new Error(`Error saving card \"${cardKey}\"`);\n }\n\n // Return saved card data\n return savedCardData;\n });\n\n // Save output sentence and cards data\n const [\n savedOutSentenceData = null,\n ...savedCardsData\n ] = await Promise.all([ \n ...savedOutSentenceDataPromises,\n ...savedCardsDataPromises\n ]);\n const { key: savedOutSentenceKey = \"\" } = savedOutSentenceData || {};\n\n const savedCardsKeys = savedCardsData\n .map(({ key: savedCardKey = \"\" }) => savedCardKey);\n if (savedCardsKeys.some(savedCardKey => !savedCardKey)) {\n throw new Error(`Error saving cards`);\n }\n\n // Save analysis activity (or task analysis activity)\n const updateAnalysisActivityData = {\n inSentenceKey,\n outSentenceKey: savedOutSentenceKey,\n cardsKeys: savedCardsKeys\n };\n const savedAnalysisActivityDataPromise = this.isTaskActivity ?\n this.activityService.updateTaskAnalysisActivity({\n taskActivityKey: this.taskActivityKey,\n analysisActivityKey: this.analysisActivityKey,\n updateAnalysisActivityData\n }) : \n this.activityService.updateAnalysisActivity({\n analysisActivityKey: this.analysisActivityKey,\n updateAnalysisActivityData\n });\n let savedAnalysisActivityData;\n try {\n savedAnalysisActivityData = await savedAnalysisActivityDataPromise;\n } catch(error) {\n console.warn(error);\n throw new Error(`Error saving ${this.isTaskActivity ? \"task \" : \"\"}` +\n `analysis activity ${this.analysisActivityKey}`);\n }\n\n // Compute saved analysis activity metadata\n // note: action name is already initialized to \"saveAnalysisActivity\"\n const savedAnalysisActivityMetaData = computeInitialMetaData({\n analysisActivityData: savedAnalysisActivityData\n });\n\n // Push updated state to the index\n this.analysisActivityStatesExtData = await this.stateService\n .pushStateByActivity({\n activityKey: this.analysisActivityKey,\n stateData: {\n liveData: savedAnalysisActivityData,\n metaData: savedAnalysisActivityMetaData\n }\n });\n } catch(error) {\n // Display console message\n console.warn(error);\n console.warn(`Error saving analysis activity ` +\n `\"${this.analysisActivityKey}\": ${error.message}`);\n\n // Show UI notification\n this.notificationService.showUINotification({\n message: \"notifications:analysisSavingError\",\n status: \"failure\",\n group: \"private\"\n });\n\n return;\n } finally {\n this.isSavingData = false;\n }\n\n // Publish the \"analysisActivityDataChanged\" event\n this.publishAnalysisActivityDataChangedEvent();\n this.publishAnalysisActivityDataSavedEvent();\n\n // Show UI notification\n this.notificationService.showUINotification({\n message: \"notifications:analysisSaved\",\n status: \"success\",\n group: \"private\"\n });\n}\n","// Define the \"splitCard\" analysis component method\n\n// Import utility modules\nimport { canSplitCard } from \"utilities/card\";\n\n\n// splitCard: sync\n// Returns a promise which resolves with an array of cards obtained by \n// splitting the specified card into its components. If any error occurs,\n// an empty array is returned\n// requirements: elementService and cardService\nexport async function splitCard({ \n cardData = null,\n cardMetaData = null\n}) {\n if (!cardData) {\n throw new Error(`Could not find card data`);\n } else if (!cardMetaData) {\n throw new Error(`Could not find card metadata`);\n } else if (!this.elementService) {\n throw new Error(`Missing required \"element\" service`);\n } else if (!this.cardService) {\n throw new Error(`Missing required \"card\" service`);\n } else if (!this.userService) {\n throw new Error(`Missing required \"user\" service`);\n }\n\n // Destructure card data\n const {\n key: cardKey = \"\",\n inElement: { \n key: inElementKey = \"\", \n type: inElementType = \"\" \n },\n outElement: { \n key: outElementKey = \"\", \n type: outElementType = \"\" \n }\n } = cardData;\n\n // Verify that card can be split\n const canCardBeSplit = canSplitCard({ \n cardData,\n cardMetaData\n });\n if (!canCardBeSplit) {\n console.warn(`Cannot split card \"${cardKey}\"`);\n return null;\n }\n\n // Get child elements of input/output elements\n const inChildElementsDataPromise = this.elementService\n .getChildElementsByElement({ \n key: inElementKey, \n type: inElementType \n });\n const outChildElementsDataPromise = this.elementService\n .getChildElementsByElement({ \n key: outElementKey, \n type: outElementType \n });\n let [ \n inChildElementsData = [], \n outChildElementsData = []\n ] = await Promise.all([\n inChildElementsDataPromise,\n outChildElementsDataPromise\n ]);\n const inChildElementsCount = inChildElementsData.length;\n const outChildElementsCount = outChildElementsData.length;\n if (inChildElementsCount === 0) {\n console.warn(`No child elements for input element \"${inElementKey}\"`);\n return [];\n }\n if (outChildElementsCount === 0) {\n // Create new (empty) output child element\n let newOutChildElementData;\n try {\n newOutChildElementData = await this.elementService.createElement({\n type: \"wrd\",\n text: \"\",\n localeCode: this.userService.outLocaleCode\n });\n } catch(error) {\n console.warn(`Error creating empty output child element ` +\n `while splitting parent card \"${cardKey}\"`, error);\n return [];\n }\n\n // Create an array of output child elements' data with the same length\n // of the corresponding input child elements' data\n outChildElementsData = inChildElementsData\n .map(() => newOutChildElementData);\n }\n\n // Create split cards based on child elements' input/output elements\n const splitCardsData = await Promise.all(inChildElementsData\n .map(async(inChildElementData, childElementIndex) => {\n const outChildElementData = outChildElementsData[childElementIndex];\n // Create new split card\n try {\n return await this.cardService.createCard({\n inElement: inChildElementData,\n outElement: outChildElementData\n });\n } catch(error) {\n const { key: inChildElementKey } = inChildElementData;\n const { key: outChildElementKey } = outChildElementData;\n console.warn(`Error creating new child card from ` +\n `input element \"${inChildElementKey}\" and ` +\n `output element \"${outChildElementKey}\" ` +\n `while splitting parent card \"${cardKey}\"`, error);\n return null;\n }\n }));\n const someSplitCardDataIsNull = splitCardsData\n .some(splitCardData => splitCardData === null);\n return someSplitCardDataIsNull ? [] : splitCardsData;\n}\n","// Define the view-model for the \"analysis\" component\n\n// Import library modules\nimport { DialogService } from \"aurelia-dialog\";\nimport {\n inject,\n bindable,\n bindingMode,\n computedFrom\n} from \"aurelia-framework\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { pause } from \"utilities/promise\";\n\n// Import parameter modules\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Import method modules\nimport { \n initializeCardsListSortable \n} from \"./analysis/initialize-cards-list-sortable\";\n\n// Import service modules\nimport EventService from \"services/event\";\n\n// Import dialog modules\nimport { \n ConfirmReplaceOutSentenceText\n} from \"dialogs/confirm-replace-out-sentence-text\";\n\n// Define internal parameters\nconst whitespaceFollowedByMarkRegExp = /\\s+([.,:;!?])/g;\nconst waitForCardsListElementIntervalMs = 10;\nconst maxWaitForCardsListElementMs = 1000;\nconst eventsData = [\n { name: \"analysisActivityDataChanged\", filterBy: \"analysisKey\" },\n];\n\n\n@inject(\n DialogService,\n EventService,\n)\nexport class Analysis {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) analysisData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) analysisMetaData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) activityKey = \"\";\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n @bindable({ defaultBindingMode: bindingMode.toView }) isEnabled = true;\n\n // Local attributes\n computedOutSentenceText = \"\";\n showSyncOutSentenceTextWithOutElementsTextsButton = false;\n cardsDisplayMode = \"full\";\n i18nParams = i18nParams;\n\n constructor(\n dialogService,\n eventService,\n ) {\n this.dialogService = dialogService;\n this.eventService = eventService;\n }\n\n\n // Lifecycle methods\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"analysis\",\n entityKey: this.analysisKey,\n eventService: this.eventService,\n eventsData\n });\n\n this.updateComputedOutSentenceText();\n }\n\n async attached() {\n // Wait for the cardsListElement to be available\n let elapsedTimeMs = 0;\n do { \n await pause(waitForCardsListElementIntervalMs);\n elapsedTimeMs += waitForCardsListElementIntervalMs;\n } while(\n !this.cardsListElement &&\n elapsedTimeMs < maxWaitForCardsListElementMs\n );\n this.initializeCardsListSortable();\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"analysisData.key\")\n get analysisKey() {\n const { key: analysisKey = \"\" } = this.analysisData || {};\n return analysisKey;\n }\n @computedFrom(\"analysisMetaData.isModified\")\n get analysisDataModified() {\n const { \n isModified: analysisDataModified = false \n } = this.analysisMetaData || {};\n return analysisDataModified;\n }\n @computedFrom(\"analysisMetaData.isValid\")\n get analysisDataValid() {\n const { \n isValid: analysisDataValid = false \n } = this.analysisMetaData || {};\n return analysisDataValid;\n }\n\n @computedFrom(\"analysisData.inSentence\")\n get inSentenceData() {\n const { inSentence: inSentenceData = null } = this.analysisData || {};\n return inSentenceData;\n }\n\n @computedFrom(\"analysisData.outSentence\")\n get outSentenceData() {\n const { outSentence: outSentenceData = null } = this.analysisData || {};\n return outSentenceData;\n }\n @computedFrom(\"outSentenceData.text\")\n get outSentenceText() {\n const { text: outSentenceText = \"\" } = this.outSentenceData || {};\n return outSentenceText;\n }\n @computedFrom(\"analysisMetaData.outSentence\")\n get outSentenceMetaData() {\n const { \n outSentence: outSentenceMetaData = null \n } = this.analysisMetaData || {};\n return outSentenceMetaData;\n }\n\n\n @computedFrom(\"analysisData.cards\")\n get cardsData() {\n const { cards: cardsData = [] } = this.analysisData || {};\n return cardsData;\n }\n @computedFrom(\"analysisMetaData.cards\")\n get cardsMetaData() {\n const { cards: cardsMetaData = [] } = this.analysisMetaData || {};\n return cardsMetaData;\n }\n\n @computedFrom(\"computedOutSentenceText\")\n get setOutSentenceTextFromOutElementsTextsI18nParams() {\n return { \n ...i18nParams, \n outSentenceText: this.computedOutSentenceText \n };\n }\n\n\n // Core methods\n initializeCardsListSortable() {\n initializeCardsListSortable.call(this);\n }\n\n toggleCardsDisplayMode() {\n this.cardsDisplayMode = \n this.cardsDisplayMode === \"compact\" ? \"full\" : \"compact\";\n }\n\n async moveCard({ oldCardIndex, newCardIndex }) {\n this.publishMoveCardEvent({ oldCardIndex, newCardIndex });\n }\n\n updateComputedOutSentenceText() {\n const trimmedOutElementsTexts = this.cardsData\n .map(({ outElement: outElementData = {} }) => outElementData)\n .map(({ text: outElementText = \"\" }) => outElementText.trim());\n const someNonEmptyOutElementsTexts = trimmedOutElementsTexts\n .some(trimmedOutElementText => trimmedOutElementText !== \"\");\n this.computedOutSentenceText = trimmedOutElementsTexts\n .map(trimmedOutElementText => trimmedOutElementText || \"…\")\n .join(\" \")\n .replace(whitespaceFollowedByMarkRegExp, (_, markMatch) => markMatch);\n this.showSyncOutSentenceTextWithOutElementsTextsButton = \n someNonEmptyOutElementsTexts &&\n this.outSentenceText !== this.computedOutSentenceText;\n }\n async setOutSentenceTextFromOutElementsTexts() {\n if (this.outSentenceText !== this.computedOutSentenceText) {\n if (this.outSentenceText !== \"\") {\n const replaceOutSentenceTextDialogOpenResult = await this.dialogService\n .open({\n viewModel: ConfirmReplaceOutSentenceText,\n model: { \n oldOutSentenceText: this.outSentenceText,\n newOutSentenceText: this.computedOutSentenceText\n },\n //keyboard: [\"Escape\"] // keys that close the dialog\n });\n const replaceOutSentenceTextDialogCloseResult =\n await replaceOutSentenceTextDialogOpenResult.closeResult;\n if (replaceOutSentenceTextDialogCloseResult.wasCancelled) {\n console.debug(`User canceled syncing output sentence text with ` +\n `computed output sentence text \"${this.computedOutSentenceText}\"`);\n return;\n }\n }\n this.publishSetOutSentenceTextEvent({ \n outSentenceText: this.computedOutSentenceText \n });\n }\n }\n\n\n // Event filters\n filterEventByAnalysisKey({ analysisKey = \"\" }) {\n return analysisKey === this.analysisKey;\n }\n\n\n // Event handlers\n async handleAnalysisActivityDataChangedEvent() {\n this.updateComputedOutSentenceText();\n this.initializeCardsListSortable();\n }\n\n\n // Event publishers\n publishSetOutSentenceTextEvent(eventData) {\n this.eventService.publish({\n eventName: \"setOutSentenceText\",\n eventData: {\n outSentenceText: this.outSentenceText,\n analysisKey: this.analysisKey,\n ...(eventData || {})\n }\n });\n }\n\n publishMoveCardEvent(eventData) {\n this.eventService.publish({\n eventName: \"moveCard\",\n eventData: {\n activityKey: this.activityKey,\n analysisKey: this.analysisKey,\n ...(eventData || {})\n }\n });\n }\n\n}\n","// Define the \"initializeCardsListSortable\" analysis component method\n\n// Import library modules\nimport Sortable from \"sortablejs\";\n\n\n// initializeCardsListSortable: sync\n// initializes the list of cards sortable element\nexport function initializeCardsListSortable() {\n if (!this.cardsListSortable && this.cardsListElement) {\n this.cardsListSortable = new Sortable(this.cardsListElement, {\n group: \"cards\",\n direction: \"horizontal\",\n swapThreshold: 0.75,\n animation: 150,\n easing: \"cubic-bezier(1, 0, 0, 1)\",\n draggable: \".ps-draggable-item\",\n handle: \".ps-draggable-handle\",\n ghostClass: \"ps-draggable-ghost\",\n dragClass: \"ps-draggable-drag\",\n onMove: () => true, // allow moving cards around\n onUpdate: handleOnUpdateEvent.bind(this)\n });\n }\n}\n\nasync function handleOnUpdateEvent({ oldIndex, newIndex }) {\n await this.moveCard({ \n oldCardIndex: oldIndex, \n newCardIndex: newIndex \n });\n}\n","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\\n\\n\";\n// Exports\nexport default code;"],"names":[],"sourceRoot":""}