{"version":3,"file":"spa.js","mappings":";;;;;AAAA;AACA;AAQA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;ACrFA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1CA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AACA;;AAGA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;;;;;;;ACxKA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;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;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5FA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1CA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;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;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AAGA;AACA;AAIA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAMA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChQA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAGA;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;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAKA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAEA;AACA;AAMA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrCA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAKA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAMA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;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;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAGA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;AACA;AACA;AAAA;AAEA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAKA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5eA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;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;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAMA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAKA;AAGA;AACA;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AASA;AAEA;AACA;AACA;AACA;AAUA;AACA;AACA;AAUA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAiBA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAIA;AACA;AACA;AACA;AACA;AAEA;AAMA;AACA;AAEA;AAIA;AACA;AACA;AACA;AACA;AACA;AAEA;AAMA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AAGA;AACA;AAIA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;;AAEA;AACA;AAEA;AAKA;AAIA;AAGA;AAEA;AAMA;AACA;AACA;AACA;AAOA;AAEA;AAIA;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AAIA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AAKA;AACA;AAIA;AACA;AACA;;AAEA;AACA;AACA;AAGA;;AAEA;AACA;AACA;AAIA;AAGA;AACA;AAKA;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AAEA;AAOA;AACA;AACA;AAIA;AACA;AAIA;AACA;AAIA;AACA;AAMA;AAEA;AAIA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAWA;AACA;AACA;AACA;AAKA;AACA;AAGA;AACA;AACA;AACA;AAOA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAMA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;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;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;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;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;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;;;;;;;ACtvBA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AAEA;AAGA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;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;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAKA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAGA;AACA;AAEA;AACA;AAWA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1eA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AClBA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;;AAEA;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;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AAIA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnLA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAGA;AACA;AAEA;AACA;AAGA;AACA;AAGA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;AAEA;;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;;AAEA;AACA;AAEA;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;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAKA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;;AAGA;;AAEA;AACA;AACA;AAEA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;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;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;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;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5QA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAEA;AAAA;AAAA;AAEA;AAEA;AACA;AAQA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAIA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvVA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxDA;AACA;AAEA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;AC1BA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;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;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;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;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;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;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;;;;;;;ACvdA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AAGA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAKA;AAAA;AAEA;AAAA;AACA;AAAA;AACA;AAEA;AAGA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAKA;AAAA;AAEA;AAAA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAIA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;;;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA","sources":["webpack:///./Frontend/src/Shared/Main/Live/BinderTextScroll.ts","webpack:///./Frontend/src/Shared/Main/Bonuses/binder.js","webpack:///./Frontend/src/Shared/Main/Event/EventBlock.js","webpack:///./Frontend/src/Shared/Main/Event/OpenEvent.js","webpack:///./Frontend/src/Shared/Main/Event/binder.js","webpack:///./Frontend/src/Shared/Main/History/binder.js","webpack:///./Frontend/src/Shared/Main/Live/BinderLive.js","webpack:///./Frontend/src/Shared/Main/Live/BinderLiveFavorites.js","webpack:///./Frontend/src/Shared/Main/Live/BinderLiveSingleSport.js","webpack:///./Frontend/src/Shared/Main/Live/ModeTableLive.js","webpack:///./Frontend/src/Shared/Main/Live/TableFetcherLive.js","webpack:///./Frontend/src/Shared/Main/Prematch/BinderPrematch.js","webpack:///./Frontend/src/Shared/Main/Prematch/BinderPrematchFavorites.js","webpack:///./Frontend/src/Shared/Main/Prematch/BinderPrematchSingleSport.js","webpack:///./Frontend/src/Shared/Main/Prematch/ModeTablePrematch.js","webpack:///./Frontend/src/Shared/Main/Results/Results.js","webpack:///./Frontend/src/Shared/Main/Results/binder.js","webpack:///./Frontend/src/Shared/Main/SuperExpress/binder.js","webpack:///./Frontend/src/Shared/Main/Tickets/Tickets.js","webpack:///./Frontend/src/Shared/Routing/navigo.js","webpack:///./Frontend/src/Shared/Routing/spa.js","webpack:///webpack/bootstrap","webpack:///./Frontend/src/spa.ts"],"sourcesContent":["// text \"ПРИЕМ СТАВОК ВРЕМЕННО ПРИОСТАНОВЛЕН\" will follow scroll\nvar BinderTextScroll = window.BinderTextScroll = (function () {\n    interface IListenersType {\n        [key: number]: {\n            now: () => void | null,\n            after: () => void | null,\n        };\n    }\n\n    const listeners: IListenersType = {}; // save scroll eventListeners here\n\n    function throttle(fn: () => void, wait: number) {\n        let time = Date.now();\n        return () => {\n            if ((time + wait - Date.now()) < 0) {\n                fn();\n                time = Date.now();\n            }\n        };\n    }\n\n    function bindScroll(coefsNode: JQuery) {\n        const el = coefsNode[0]; // get native element from jquery\n        const rect = el.getBoundingClientRect();\n        const eventId = parseInt(el.dataset.eventId, 10);\n\n        if (rect.height < window.innerHeight) {\n            return;\n        }\n\n        const elText: HTMLParagraphElement = el.querySelector(\".events-table__row-blocked-text\");\n        elText.style.top = \"10%\";\n\n        const throttledMoveText = throttle(moveText.bind(null, el), 300);\n        const moveTextAfterScrollEnds = moveText.bind(null, el);\n\n        listeners[eventId] = {\n            after: null,\n            now: null,\n        };\n        listeners[eventId].now = throttledMoveText;\n        listeners[eventId].after = moveTextAfterScrollEnds;\n\n        window.addEventListener(\"scroll\", throttledMoveText);\n        window.addEventListener(\"scroll\", moveTextAfterScrollEnds);\n    }\n\n    function unbindScroll(eventId: number) {\n        if (!!listeners[eventId]) {\n            window.removeEventListener(\"scroll\", listeners[eventId].now);\n            window.removeEventListener(\"scroll\", listeners[eventId].after);\n            delete listeners[eventId];\n        }\n    }\n\n    function moveText(el: HTMLDivElement) {\n        if (isScrolledIntoView(el)) {\n            const text: HTMLParagraphElement = el.querySelector(\".events-table__row-blocked-text\");\n            const parentRect = el.getBoundingClientRect();\n\n            if (parentRect.top < parentRect.height * (-1) + window.innerHeight / 2 + text.offsetHeight * 2) {\n                text.classList.remove(\"m-fixed\");\n                text.style.top = \"90%\";\n            } else if (parentRect.top < 200) {\n                text.classList.add(\"m-fixed\");\n                text.style.top = \"50%\";\n            } else {\n                text.classList.remove(\"m-fixed\");\n                text.style.top = \"10%\";\n            }\n        }\n    }\n\n    function isScrolledIntoView(eventNodeCoefs: HTMLDivElement) {\n        const rect = eventNodeCoefs.getBoundingClientRect();\n        const elementTop = rect.top;\n        const elementBottom = rect.bottom;\n        const isVisible = elementTop < window.innerHeight && elementBottom >= 0;\n        return isVisible;\n    }\n\n    return {\n        bindScroll,\n        unbindScroll\n    }\n}());\n","BinderBonuses = window.BinderBonuses = (function () {\n    var bindUI = function () {\n        return false;\n\n    }\n    var unBindUI = function () {\n        return false;\n    }\n\n    var bind = function (justLoaded) { bindUI(); };\n    var unBind = function () { unBindUI(); };\n\n    return {\n        bind: bind,\n        unBind: unBind,\n        name: 'BinderBonuses',\n        url: '/Bonuses/GetViewSet'\n    };\n}());\n\n//-----------------------------------\n\nScopeBonuses = (function () {\n\n    function init() {\n        app.VerticalMenu.hide();\n    }\n\n    function dispose() {\n        return;\n    }\n\n    var start = function (justLoaded) { init(); };\n    var stop = function () { dispose(); };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopeBonuses',\n        title: Localization.getString('Shared.Bonuses','Бонусы'),\n        isLayoutRightColumnVisible: false\n    };\n}());","var EventBlock = window.EventBlock = (function () {\n    const selectors = {\n        header: '[eb-header]',\n        titleT1: '[oe-t1]',\n        titleT2: '[oe-t2]',\n\n        market: '.event-markets__item',\n        cell: '.event-markets__coef',\n        cellValue: '.event-markets__coef-value'\n    };\n\n    function animateCellChange(cellNode, isInc) {\n        var className = (isInc) ? 'change plus' : 'change minus';\n\n        cellNode.addClass(className);\n        setTimeout(function () { cellNode.removeClass(className);}, 2000);\n    }\n\n\n    //ctor\n    var EventBlock = function (wrapperNode, eType) {\n        this.init(wrapperNode, eType);\n    };\n\n    var EType = {\n        Undefined: 0,\n        Accent: 10,\n        OpenEvent: 20,\n        LiveTable: 30\n    };\n    EventBlock.EType = EType;\n\n\n    //WrapperNode DOM requirements:\n    //data-event-id\n    //data-islive\n    //inner <div [eb-header] data-dscr=\"dscr\" data-isTable=\"\">\n    //inner <div id=\"eb-list{id}\" class=\"+m-blocked\">\n    EventBlock.prototype.init = function (wrapperNode, eType) {\n        this.domNode = wrapperNode;\n        this.setType(eType);\n\n        this.bindUI();\n\n        this.id = this.domNode.data('event-id');\n\n        if (this.type === EType.LiveTable) {\n            this.isLive = true;\n            this.title = this.domNode.closest(ModeTableLive.selectors.event).find(ModeTableLive.selectors.eventTitle).first().text().trim();\n\n            return;\n        }\n\n        this.isLive = Boolean(this.domNode.data('islive'));\n\n        if (this.type === EType.OpenEvent) {\n            this.loadState();\n            this.restoreMarkets();\n        }\n\n        this.title = this.domNode.find(selectors.titleT1).text() + (this.domNode.find(selectors.titleT2).length ? ' — ' + this.domNode.find(selectors.titleT2).text() : '');\n    };\n\n    EventBlock.prototype.dispose = function () {\n        this.unBindUI();\n    };\n\n    EventBlock.prototype.setType = function (eType) {\n        if (eType === EType.Accent || eType === EType.OpenEvent || eType === EType.LiveTable) {\n            this.type = eType;\n        }\n        else {\n            this.type = EType.Undefined;\n        }\n    };\n\n    EventBlock.prototype.bindUI = function () {\n        var self = this;\n\n        // Betting cart (add/remove)\n        self.domNode.on('click', selectors.cell + '[data-aid]', function () {\n            var that = $(this);\n\n            if (that.hasClass('active')) {\n                var oid = that.attr('data-oid');\n                if (BettingCart.removeItem(oid)) // return false if cart is sending now, return true if removed or already removed.  Blink on false\n                    that.removeClass('active');\n            }\n            else {\n                var marketNode = that.closest(selectors.market);\n                if (marketNode.hasClass('m-blocked'))\n                    return;\n\n                var sData = {\n                    oId: that.attr('data-oid'),\n                    aId: that.attr('data-aid'),\n                    rTitle: marketNode.find('.event-markets__title').text() + ' (' + that.find('.event-markets__coef-title').attr('title') + ')',\n                    val: that.find(selectors.cellValue).attr('data-coefvalue'),\n                    eId: self.id,\n                    eTitle: self.title,\n                    isLive: self.isLive\n                };\n\n                if (BettingCart.addItem(sData)) {\n                    that.addClass('active');\n                    if (self.type === EType.LiveTable) {\n                        BettingCart.Highlighting.activate.table();\n                    }\n                }\n\n            }\n            return false;\n        });\n\n        if (this.type === EType.OpenEvent) {\n            self.domNode.on('click', selectors.market, function (e) {\n                if (e.target.className === 'event-markets__body') {\n                    return false;\n                }\n\n                var that = $(this);\n                that.toggleClass('m-collapsed');\n                self.setMarketState(that.attr('data-id'), !that.hasClass('m-collapsed'));\n                return false;\n            });\n        }\n\n    };\n    EventBlock.prototype.unBindUI = function () {\n        this.domNode\n            .off('click', selectors.cell + '[data-aid]')\n            .off('click', selectors.market);\n    };\n\n    //\n    EventBlock.prototype.setMarketState = function (id, isExpanded) {\n        this.state[id] = isExpanded;\n        this.saveState();\n    };\n    EventBlock.prototype.loadState = function () {\n        var jsonState = sessionStorage.getItem('event' + this.id);\n        this.state = (jsonState === null) ? {} : JSON.parse(jsonState);\n    };\n    EventBlock.prototype.saveState = function () {\n        sessionStorage.setItem('event' + this.id, JSON.stringify(this.state));\n    };\n    EventBlock.prototype.restoreMarkets = function () {\n        var self = this;\n\n        for (var key in self.state) {\n            var marketNode = self.domNode.find(selectors.market + '[data-id=' + key + ']');\n            (self.state[key] === true) ? marketNode.removeClass('m-collapsed') : marketNode.addClass('m-collapsed');\n        }\n    };\n\n    EventBlock.prototype.oldResults = [];\n    EventBlock.prototype.saveCurrentState = function () {\n        var self = this;\n        self.oldResults = [];\n        self.domNode.find(selectors.cell + '[data-oid]').each(function (ind) {\n            var oid = $(this).data('oid');\n            var val = $(this).find(selectors.cellValue).attr('data-coefvalue');\n            self.oldResults[oid] = val;\n        });\n    };\n\n\n    return EventBlock;\n}());","var OpenEvent = window.OpenEvent = (function () {\n    var self;\n\n    const selectors = {\n        eventFavstar: '[oe-favstar]',\n        searchFavstar: '[search-favstar]',\n        searchEvent: '[search-event]'\n    };\n\n    const DEFER_TIMEOUT = 500;\n    var timeoutPool = {};\n    function deferAction(key, action) {\n        clearTimeout(timeoutPool[key]);\n        timeoutPool[key] = setTimeout(function () {\n            action();\n            delete timeoutPool[key];\n        }, DEFER_TIMEOUT);\n    }\n\n    function getEventBlockInstanceById(eventId) {\n        return (self.EventInstance.id == eventId) ? self.EventInstance : null;\n    }\n\n    function bindUI() {\n        //Fave UnFave\n        app.body.on('click', selectors.eventFavstar + ',' + selectors.searchFavstar, function () {\n            var that = $(this),\n                isRemovingFromFav = that.hasClass('m-active'),\n                eventId = !that.closest(selectors.searchEvent).length ? self.EventInstance.id : that.closest(selectors.searchEvent).data('id');\n\n            var mainEvent = document.querySelector('[data-mei]')\n            var mainEventId = mainEvent ? Number(mainEvent.dataset.mei) : NaN;\n\n            var allStars = (eventId === self.EventInstance.id) ? $.merge($(selectors.eventFavstar), $(selectors.searchEvent + '[data-id=' + eventId + ']').find(selectors.searchFavstar)) : $(selectors.searchEvent + '[data-id=' + eventId + ']').find(selectors.searchFavstar);\n            var typeUrlPart = (self.EventInstance.isLive) ? '/Live' : '/Prematch';\n            var actionUrlPart = (isRemovingFromFav) ? '/UnFaveEvent' : '/FaveEvent';\n            that.addClass('m-loading');\n            if (isRemovingFromFav) {\n                allStars.removeClass('m-active');\n                allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_10', 'Добавить в избранное'));\n            }\n            else {\n                allStars.addClass('m-active');\n                allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_11', 'Удалить из избранного'));\n            }\n            Ajax.postJson(typeUrlPart + actionUrlPart, {\n                data: {\n                    id: mainEventId || eventId\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    if (resp && resp.Message) {\n                        that.removeClass('m-active');\n                        Tooltip.errorNode(that, resp.Message);\n                        that.removeClass('m-loading');\n                        return;\n                    }\n\n                    that.removeClass('m-loading');\n                },\n            });\n\n            return;\n        });\n    }\n\n    function unBindUI() {\n        app.body.off('click', selectors.eventFavstar + ',' + selectors.searchFavstar);\n    }\n\n    return {\n        init: function () {\n            self = this;\n\n            var wrapperNode = $('#event-instance-wrapper');\n            if (wrapperNode.length == 1) {\n                this.EventInstance = new EventBlock(wrapperNode, EventBlock.EType.OpenEvent);\n            }\n            else {\n                Ajax.redirect('/live');\n            }\n\n            BettingCart.Highlighting.activate.openEvent();\n            bindUI();\n        },\n        dispose: function () {\n            unBindUI();\n            if (this.EventInstance) {\n                this.EventInstance.dispose();\n            }\n        }\n    }\n}());\n","BinderEvent = window.BinderEvent = (function () {\n    return {\n        bind: function (justLoaded) {\n        },\n        unBind: function () {\n        },\n        name: 'BinderEvent',\n        url: '/Event/GetViewSet',\n    }\n}());\n\n//--------------------------------------------\n\nScopeEvent = window.ScopeEvent = (function () {\n\n    function init() {\n        app.VerticalMenu.hide();\n        MainNavigation.updatePage();\n\n        app.OpenEvent.init();\n\n        if (app.OpenEvent.EventInstance.isLive) {\n            app.Search.init('live');\n        } else {\n            app.Search.init('prematch');\n        }\n    }\n\n    function dispose() {\n        app.OpenEvent.dispose();\n    }\n\n    return {\n        start: function (justLoaded) {\n            init();\n        },\n        stop: function () {\n            dispose();\n        },\n        name: 'ScopeEvent',\n        url: 'EVENT',\n    };\n}());","//TODO: переделать:\n//Общий модуль BetHistory.\n//      В нем весь BindUI / UnBindUI .\n//      В нем инкапсулирован HidtoryUpdatePool.\n//BinderHistory и ScopeHistory облегчить (как в открытом событии)\n\nvar HistoryUpdatePool = window.HistoryUpdatePool = (function () {\n    var timeOutH;\n    var intervalH;\n    var queueLength = 0;\n    var timeout = 4000;\n    var totalTimeout = 0;\n    var maximumTimeout = 10000;\n\n    function add() {\n        queueLength++;\n        clearTimeout(timeOutH);\n        clearInterval(intervalH);\n        if (totalTimeout >= maximumTimeout) {\n            spillOut();\n        }\n        else {\n            timeOutH = setTimeout(spillOut, timeout);\n            intervalH = setInterval(function () {\n                totalTimeout += 10;\n            }, 10);\n        }\n    }\n\n    function spillOut() {\n        clearTimeout(timeOutH);\n        clearInterval(intervalH);\n        totalTimeout = 0;\n        if (queueLength > 0) {\n            if ($('#page-content').attr('data-page') === 'history') {\n                Ajax.postJson(\"/History/UpdateHistoryTable\", {\n                    success: function () {\n                        queueLength = 0;\n                        window.Balance.update();\n                    }\n                });\n            }\n            else {\n                queueLength = 0;\n            }\n        }\n    }\n\n    function stop() {\n        clearTimeout(timeOutH);\n        clearInterval(intervalH);\n        totalTimeout = 0;\n        queueLength = 0;\n    }\n\n    return {\n        add: add,\n        isEmpty: Boolean(queueLength === 0),\n        stop: stop\n    };\n}());\n\n//-----------------------------------------------------\n\nBinderHistory = window.BinderHistory = (function () {\n    var selectors = {\n        hstBetTypeFilter: '#hst-bettype_filter',\n        historyDetailedRow: '[js-node=\"history-detailed__row\"]',\n        hstBetItem: '[hst-betitem]',\n        hstToggleBetItem: '[hst-toggle_betitem]',\n        hstBetItemDetailed: '[hst-betitem_detailed]',\n        //  hstShowMatchFacts: '[hst-show_matchfacts]',\n        seActiveStateSwitcher: '[js-node=express_active-state-switcher]',\n        eventNum: '.j-history_bet-info',\n        paginationLink: '[bal-pagination_link]',\n        paginationInput: '[bal-pagination_input]',\n        couponToggle : '[history-coupon-info-toggle]'\n    };\n\n    var actions = {\n        filterBefore: function(element) {\n            app.enableLoading();\n            HistoryUpdatePool.stop();\n        },\n        filterAfter: function (element) {\n            app.Balance.update();\n            app.disableLoading();\n        },\n        filterBetTypeAfter: function(element) {\n            $(selectors.hstBetTypeFilter + ' .m-active').removeClass('m-active');\n            $(element).addClass('m-active');\n            app.Balance.update();\n            app.disableLoading();\n        }\n    };\n\n    var bindUI = function () {\n        var body = app.body;\n        // unbind();\n\n        // Переход на страницу v2.0\n        body.on('click', selectors.paginationLink, function () {\n            app.enableLoading();\n            HistoryUpdatePool.stop();\n            Ajax.getJson(\"/History/GetViewSet\", {\n                data: { currentPage: $(this).data('pagenumber') },\n                success: function () {\n                    app.disableLoading();\n                }\n            });\n            return false;\n        });\n\n        // Переход на страницу по определенному номеру, введенному пользователем v2.0\n        body.on('keypress', selectors.paginationInput, function (e) {\n            if (e.keyCode === 13) {\n                app.enableLoading();\n                HistoryUpdatePool.stop();\n                Ajax.getJson(\"/History/GetViewSet\", {\n                    data: { currentPage: $(this).val() },\n                    success: function () {\n                        app.disableLoading();\n                    }\n                });\n                return false;\n            }\n            return true;\n        });\n\n        // Toggle BetItem v2.0\n        $(document).on('click', selectors.hstToggleBetItem, function () {\n            var betItemNode = $(this).closest(selectors.hstBetItem);\n            var isCollapsing = betItemNode.hasClass('m-expanded');\n\n            var succes = (isCollapsing)\n                ? function () {\n                    betItemNode.removeClass('m-expanded');\n                    betItemNode.find(selectors.hstBetItemDetailed).empty();\n                    app.disableLoading();\n                }\n                : function () {\n                    betItemNode.addClass('m-expanded');\n                    SPA.updatePageLinks();\n                    app.disableLoading();\n                };\n\n            app.enableLoading();\n            Ajax.postJson(\"/History/ToggleBetState\", {\n                data: { betNumber: betItemNode.data('num'), betType: betItemNode.data('type'), isExpanded: isCollapsing },\n                success: succes\n            });\n            return false;\n        });\n\n        body.on('click', selectors.couponToggle, function () {\n            var couponNode = $(this).closest('[data-coupon-number]');\n            var couponNumber = couponNode.attr('data-coupon-number');\n            var isExpanded = couponNode.is('[state-expanded]');\n\n            var betNode = couponNode.closest('[data-betnumber]');\n            var betNumber = betNode.data('betnumber');\n            var ajaxUrl = (isExpanded) ? '/history/getbriefcouponinfo' : '/history/getdetailedcouponinfo';\n            app.enableLoading();\n            Ajax.postJson(ajaxUrl, {\n                data: { betNumber: betNumber, couponNumber: couponNumber },\n                success: function () {\n                    app.disableLoading();\n                }\n            });\n        });\n\n        //Show Open Event or IsOver MessageWin v2.0\n        body.on('click', 'div' + selectors.eventNum, function () {\n            var that = $(this);\n\n            var link = that.attr('data-link');\n            if (link === undefined)\n                return;\n\n            if (that.attr('is-over') === 'true') {\n                if (that.attr('inprogress') === undefined)\n                    app.Tooltip.errorNode(that, Localization.getString('Events.EventCompleted', 'Событие завершено'));\n                else\n                    app.Tooltip.errorNode(that, Localization.getString('Events.EventBetCompleted', 'Приём ставок завершен'));\n            }\n            else {\n                SPA.navigate(link);\n            }\n        });\n\n        // Подсветить результаты балтсистемы (Last.DetailedBetItem)\n        body.on('change', selectors.seActiveStateSwitcher, function () {\n            app.Superexpress.highlightBetActiveStates(this);\n        });\n    };\n\n    var unBindUI = function () {\n        app.body\n            .off('click', selectors.hstToggleBetItem)\n            .off('change', selectors.seActiveStateSwitcher)\n            .off('click', selectors.eventNum)\n            .off('click', selectors.paginationLink)\n            .off('keypress', selectors.paginationInput);\n    };\n\n    var bind = function(justLoaded) { bindUI(); }\n    var unBind = function() { unBindUI(); }\n\n\n    return {\n        bind: bind,\n        unBind: unBind,\n        bindUI: bindUI,\n        name: 'BinderHistory',\n        url: '/History/GetViewSet',\n        actions: actions\n    };\n}());\n\n//--------------------------------------------------------\n\nScopeHistory = window.ScopeHistory = (function () {\n    var selectors = {\n        mnHistCount: '#mn-hist_count'\n    };\n\n\n    function init() {\n        app.VerticalMenu.hide();\n        $(selectors.mnHistCount).removeClass('active');\n        app.Balance.update();\n        app.Search.bindCloseButtonHandler();\n    }\n\n    function dispose() {\n        HistoryUpdatePool.stop();\n        app.Search.unbindCloseButtonHandler();\n    }\n\n    var start = function (justLoaded) { init(); };\n    var stop = function () { dispose(); }; //TurnOff signalR before stopping pools\n\n    var actions = {\n        betSellError: function (obj, data) {\n            if (data) Tooltip.errorNode($(obj), data);\n        }\n    };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopeHistory',\n        title: Localization.getString('Shared.MyBets', 'Мои пари'),\n        isLayoutRightColumnVisible: false,\n        actions: actions\n    };\n}());\n\n\n","BinderLive = window.BinderLive = (function () {\n    const selectors = {\n        tbTable: '.events-table',\n        tbEvent: '.events-table__body-row',\n\n        tbFavstar: '[tb-favstar],[tb-favstar-fav]',\n        tbCalendar: '[tb-calendar]',\n        searchFavstar: '[search-favstar]',\n        searchEvent: '[search-event]',\n\n        vmSelectAll: '#sports-filter__select-all',\n        vmSportsFilterItem: '.j-sports-filter-item',\n        vmSportsFilterSelectButton: '.j-sports-filter-item-select-button',\n        vmSportsFilterLinkButton: '.j-sports-filter-item-link-button',\n        vmSportsFilterItemsContainer: '#vm-sports-filter-items',\n\n        emptyBetplace: '#live-empty_betplace',\n        cmSorting: '#cm-sorting',\n\n        broadcastFilter: '#tv-broadcast-filter',\n        visualizationFilter: '#visualization-filter',\n        broadcastFilterFav: '#tv-broadcast-filter-fav',\n        visualizationFilterFav: '#visualization-filter-fav',\n\n        nestedEventsFilter: '#nested-events-filter',\n        favNestedEventsFilter: '#fav-nested-events-filter',\n\n        pageScrollbarContainer: '#m-page-content-scrollbar-scrollarea',\n\n        removeAll: '#live_favs-remove_all'\n    };\n\n    const vmSelectedClass = 'm-selected';\n\n    var bindUI = function (isFavorite) {\n        var body = app.body;\n        if (isFavorite === undefined) {\n            isFavorite = false;\n        }\n\n        // toggle SportFilterItem v3.0\n        $(document).on('click', selectors.vmSportsFilterItem + '[data-sport-type-id]', function (e) {\n            e.stopImmediatePropagation();\n            e.preventDefault();\n\n            var container = $(this),\n                sportId = container.data('sport-type-id');\n\n            var isAllChecked = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem + ':not(.m-selected)').length > 0 ? false : true;\n            var filterItemsLength = $(selectors.vmSportsFilterItem).length;\n\n            if (isAllChecked && filterItemsLength > 1) {\n                container.addClass('m-loading');\n                Ajax.postJson(\"/Live/EnableOnlyOneItem\", {\n                    data: {\n                        sportId: sportId\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function (resp) {\n                        $(selectors.vmSelectAll).prop('checked', false);\n                        app.ModeTableLive.clear();\n                        $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem).removeClass('m-selected');\n                        container.addClass('m-selected');\n\n                        app.ModeTableLive.insertTable(resp.html);\n\n                        container.removeClass('m-loading');\n                    }\n                });\n            } else {\n                toggleSportsFilterItem(sportId, container);\n            }\n\n            return false;\n        });\n\n        // toggle SportFilter v3.0\n        body.on('click', selectors.vmSelectAll, function () {\n            TableFetcherLive.stop();\n\n            var that = $(this),\n                removingAll = !that.prop('checked'),\n                allItems = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem);\n\n\n            that.parent().parent().addClass('m-loading');\n            Ajax.postJson(\"/Live/ToggleSportFilter\", {\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    if (removingAll) {\n                        app.ModeTableLive.clear();\n                        that.prop('checked', false);\n                        allItems.removeClass(vmSelectedClass);\n                    }\n                    else {\n                        app.ModeTableLive.update();\n                        that.prop('checked', true);\n                        allItems.addClass(vmSelectedClass);\n                    }\n                    (app.ModeTableLive.count() === 0)\n                        ? $(selectors.emptyBetplace).addClass('active')\n                        : $(selectors.emptyBetplace).removeClass('active');\n                    that.parent().parent().removeClass('m-loading');\n                }\n            });\n            return false;\n        });\n\n        // <select> on 'live' page\n        body.on('change', selectors.cmSorting, function () {\n            Ajax.postJson(\"/Live/SetSortingType\", {\n                data: { sortingType: $(this).val() },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTableLive.update();\n                    (app.ModeTableLive.count() === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                }\n            });\n            return false;\n        });\n\n        var handleBroadcastFilter = function (isFavorite, checkBoxValue) {\n            Ajax.postJson(\"/Live/SetBroadcastFilter\", {\n                data: { isBroadcastFilter: checkBoxValue, isFavorite: isFavorite },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTableLive.update();\n                    (app.ModeTableLive.isEmpty()) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                }\n            });\n            return false;\n        };\n\n        var handleVisualizationFilter = function (isFavorite, checkBoxValue) {\n            Ajax.postJson(\"/Live/SetVisualizationFilter\", {\n                data: { isVisualizationFilter: checkBoxValue, isFavorite: isFavorite },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTableLive.update();\n                    (app.ModeTableLive.isEmpty()) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                }\n            });\n            return false;\n        };\n\n        var handleNestedEventsFilter = function (isFavorite, checkboxValue) {\n            Ajax.postJson(\"/Live/SetNestedEventsFilter\", {\n                data: { isFavorite: isFavorite, isNestedEventsFilter: checkboxValue },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTableLive.update();\n                }\n            });\n            return false;\n        }\n\n        // <input[checkbox]> on 'live' page for Broadcast and Visualization filters\n        body.on('change', selectors.broadcastFilter, function () {\n            handleBroadcastFilter(false, $(this).is(\":checked\"));\n        });\n        body.on('change', selectors.visualizationFilter, function () {\n            handleVisualizationFilter(false, $(this).is(\":checked\"));\n        });\n        body.on('change', selectors.broadcastFilterFav, function () {\n            handleBroadcastFilter(true, $(this).is(\":checked\"));\n        });\n        body.on('change', selectors.visualizationFilterFav, function () {\n            handleVisualizationFilter(true, $(this).is(\":checked\"));\n        });\n\n        body.on('change', selectors.nestedEventsFilter, function () {\n            handleNestedEventsFilter(false, $(this).is(\":checked\"));\n        });\n\n        body.on('change', selectors.favNestedEventsFilter, function () {\n            handleNestedEventsFilter(true, $(this).is(\":checked\"));\n        });\n\n        // Fave/Unfave calendarEvent\n        //TODO: Calendar is obsolete. Удалить после выхода единого события\n        body.on('click', selectors.tbCalendar, function (e) {\n\n            var that = $(this),\n                eventId = that.closest(selectors.tbEvent).data('id'),\n                dataIdFilter = '[data-id=' + eventId + ']',\n                isRemovingFromFav = that.hasClass('m-active');\n\n            that.addClass('m-loading');\n            Ajax.postJson(isRemovingFromFav ? \"/Calendar/UnFaveEvent\" : \"/Calendar/FaveEvent\", {\n                data: {\n                    id: eventId\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    that.toggleClass('m-active');\n\n                    if (resp && resp.Message) {\n                        that.removeClass('m-active');\n                        Tooltip.errorNode(that, resp.Message);\n                        that.removeClass('m-loading');\n                        return;\n                    }\n\n                    if (isRemovingFromFav) {\n                        var currentEvent = $(selectors.tbEvent + dataIdFilter),\n                            parentTable = currentEvent.closest(selectors.tbTable),\n                            nestedEvents = $(`[data-meid=\"${eventId}\"]`);\n                        if(nestedEvents.length) {\n                            nestedEvents.each(function() {\n                                this.remove();\n                            })\n                        }\n                        if (parentTable.find(selectors.tbEvent).length <= 1) {\n                            ModeTableLive.removeTable(parentTable.data('sportid'));\n                            (app.ModeTableLive.count() === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                        }\n                        currentEvent.remove();\n                    }\n\n                    app.VerticalMenu.changeFavorites();\n\n                    that.removeClass('m-loading');\n                }\n            });\n\n            return false;\n        });\n\n        // Fave event v3.0\n        body.on('click', (selectors.tbFavstar + ',' + selectors.searchFavstar), function (e) {\n\n            var that = $(this),\n                isRemovingFromFav = that.hasClass('m-active'),\n                eventId = (that.is(selectors.tbFavstar)) ? that.closest(selectors.tbEvent).data('id') : that.closest(selectors.searchEvent).data('id'),\n                dataIdFilter = '[data-id=' + eventId + ']',\n                allStars = $.merge($(selectors.tbEvent + dataIdFilter).find(selectors.tbFavstar), $(selectors.searchEvent + dataIdFilter).find(selectors.searchFavstar));\n\n            that.addClass('m-loading');\n\n            var url = isRemovingFromFav ? \"/Live/UnFaveEvent\" : \"/Live/FaveEvent\";\n            if (isRemovingFromFav && that.is('[tb-favstar-fav]'))\n                url = \"/Live/UnFaveFavoriteEvent\";\n\n            Ajax.postJson(url, {\n                data: {\n                    id: eventId\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    if (resp && resp.Message) {\n                        that.removeClass('m-active');\n                        Tooltip.errorNode(that, resp.Message);\n                        that.removeClass('m-loading');\n                        return;\n                    }\n\n                    if (isRemovingFromFav) {\n                        allStars.removeClass('m-active');\n                        allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_10', 'Добавить в избранное'));\n                        if (isFavorite) {\n                            var currentEvent = $(selectors.tbEvent + dataIdFilter),\n                                parentTable = currentEvent.closest(selectors.tbTable),\n                                nestedEvents = $(`[data-meid=\"${eventId}\"]`);\n                                if(nestedEvents.length) {\n                                    nestedEvents.each(function() {\n                                        this.remove();\n                                    })\n                                }\n\n                            if (parentTable.find(selectors.tbEvent).length <= 1) {\n                                ModeTableLive.removeTable(parentTable.data('sportid'));\n                                if (app.ModeTableLive.count() === 0) {\n                                    $(selectors.emptyBetplace).addClass('active');\n                                    $(selectors.removeAll).hide();\n                                }\n                                else {\n                                    $(selectors.emptyBetplace).removeClass('active');\n                                }\n                            }\n                            else {\n                                currentEvent.remove();\n                            }\n                        }\n                    }\n                    else {\n                        allStars.addClass('m-active');\n                        allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_11', 'Удалить из избранного'));\n                        if (isFavorite && that.is(selectors.searchFavstar)) {\n                            TableFetcherLive.full();\n                            //TODO: Здесь получать только betPlace() без вертикального меню. и возможно не использовать fetcher (лишние расчеты diff)\n                            $(selectors.emptyBetplace).removeClass('active');\n                            $(selectors.removeAll).show();\n                        }\n                    }\n\n                    app.VerticalMenu.changeFavorites();\n\n                    that.removeClass('m-loading');\n                },\n            });\n\n            return;\n        });\n\n\n        ConfirmButton.init(\n            selectors.removeAll,\n            function () {},\n            '/Live/UnFaveAll',\n            function (resp) {\n                app.ModeTableLive.destroyTables();\n\n                if (app.ModeTableLive.count() === 0) {\n                    $(selectors.emptyBetplace).addClass('active');\n                    $(selectors.removeAll).hide();\n                } else {\n                    $(selectors.emptyBetplace).removeClass('active');\n                    $(selectors.removeAll).show();\n                }\n\n                app.VerticalMenu.changeFavorites();\n            }\n        );\n\n        (app.ModeTableLive.count() === 0) ? $(selectors.removeAll).hide() : $(selectors.removeAll).show();\n\n    };\n\n    var unBindUI = function () {\n        app.body\n            .off('click', (selectors.tbFavstar + ',' + selectors.searchFavstar))\n            .off('click', selectors.tbCalendar)\n            .off('click', selectors.vmSelectAll)\n            .off('change', selectors.cmSorting);\n\n        $(document).off('click', selectors.vmSportsFilterItem + '[data-sport-type-id]');\n        ConfirmButton.dispose(selectors.removeAll);\n    };\n\n    var toggleSportsFilterItem = function (sportId, sportsFilterItemContainer, callback) {\n        TableFetcherLive.stop();\n\n        var removing = sportsFilterItemContainer.hasClass(vmSelectedClass),\n            allItems = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem),\n            selectAllbtn = $(selectors.vmSelectAll);\n        var that = $(this);\n\n        sportsFilterItemContainer.addClass('m-loading');\n        Ajax.postJson(\"/Live/ToggleSportFilterItem\", {\n            data: {\n                sportId: sportId,\n            },\n            doCallAjaxViewParsers: false,\n            success: function (resp) {\n\n                var prevFilter;\n                var insertAfterId;\n                if (window.globalAppSettings.site === \"unicom\") {\n                    app.ModeTableLive.clear();\n                    that.prop('checked', false);\n                    allItems.removeClass(vmSelectedClass);\n\n                    prevFilter = sportsFilterItemContainer.prevAll('.' + vmSelectedClass);\n                    insertAfterId = (prevFilter.length !== 0) ? prevFilter.data('sport-type-id') : undefined;\n                    app.ModeTableLive.insertTable(resp.html, insertAfterId);\n                    sportsFilterItemContainer.addClass(vmSelectedClass);\n                } else {\n                    if (removing) {\n                        app.ModeTableLive.removeTable(sportId);\n                        sportsFilterItemContainer.removeClass(vmSelectedClass);\n                    }\n                    else {\n                        prevFilter = sportsFilterItemContainer.prevAll('.' + vmSelectedClass);\n                        insertAfterId = (prevFilter.length !== 0) ? prevFilter.data('sport-type-id') : undefined;\n                        app.ModeTableLive.insertTable(resp.html, insertAfterId);\n                        sportsFilterItemContainer.addClass(vmSelectedClass);\n                    }\n                }\n\n                selectAllbtn.prop('checked', (allItems.filter('.' + vmSelectedClass).length === allItems.length));\n                (app.ModeTableLive.count() === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n\n                sportsFilterItemContainer.removeClass('m-loading');\n\n                if (callback) callback();\n            }\n        });\n    }\n\n    var bind = function (justLoaded) { bindUI(); };\n    var unBind = function () { unBindUI(); };\n    var bindFavorites = function (justLoaded) { bindUI(true); };\n    var unBindFavorites = function () { unBindUI(); };\n\n    return {\n        bind: bind,\n        bindFavorites: bindFavorites,\n        unBind: unBind,\n        unBindFavorites: unBindFavorites,\n        name: 'BinderLive',\n        url: '/Live/GetViewSet',\n    };\n}());\n\nScopeLive = (function () {\n    function init() {\n        app.VerticalMenu.init();\n        TableFetcherLive.setMode.standard();\n        app.ModeTableLive.init();\n\n        app.Search.init('live');\n    }\n\n    function dispose() {\n        app.VerticalMenu.dispose();\n        app.ModeTableLive.dispose();\n    }\n\n    var start = function (justLoaded) { init(); };\n    var stop = function () { dispose(); };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopeLive',\n        url: 'LIVE',\n        title: Localization.getString('Shared.Live', 'Лайв')\n    };\n}());\n","BinderLiveFavorites = window.BinderLiveFavorites = (function () {\n    return {\n        bind: BinderLive.bindFavorites,\n        unBind: BinderLive.unBindFavorites,\n        name: 'BinderLiveFavorites',\n        url: '/Live/GetFavoritesViewSet',\n    };\n})();\n\nScopeLiveFavorites = (function () {\n    function init() {\n        app.VerticalMenu.init();\n        TableFetcherLive.setMode.favorites();\n        app.ModeTableLive.init();\n\n        app.Search.init('live');\n    }\n\n    function dispose() {\n        app.VerticalMenu.dispose();\n        app.ModeTableLive.dispose();\n    }\n\n    var start = function (justLoaded) {\n        init();\n    };\n    var stop = function () {\n        dispose();\n    };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopeLiveFavorites',\n        url: 'LIVE/FAVORITES',\n        title: Localization.getString('Shared.FavoriteLive', 'Лайв:Избранное'),\n    };\n})();\n","BinderLiveSingleSport = window.BinderLiveSingleSport = (function () {\n    const selectors = {\n        tbTable: '.events-table',\n        tbEvent: '.events-table__body-row',\n\n        tbFavstar: '[tb-favstar]',\n        tbCalendar: '[tb-calendar]',\n        searchFavstar: '[search-favstar]',\n        searchEvent: '[search-event]',\n\n\n        vmSelectAll: '#sports-filter__select-all',\n        vmSportsFilterItem: '.sports-filter__item',\n        vmSportsFilterSelectButton: '.j-sports-filter-item-select-button',\n        vmSportsFilterLinkButton: '.j-sports-filter-item-link-button',\n        vmSportsFilterItemsContainer: '#vm-sports-filter-items',\n\n        emptyBetplace: '#live-empty_betplace',\n        cmSorting: '#cm-sorting',\n\n        broadcastFilter: '#tv-broadcast-filter',\n        visualizationFilter: '#visualization-filter',\n\n        pageScrollbarContainer: '#m-page-content-scrollbar-scrollarea'\n    };\n\n    const vmSelectedClass = 'm-selected';\n    var sportType;\n\n    var bindUI = function (isFavorite) {\n        var body = app.body;\n        if (isFavorite === undefined) {\n            isFavorite = false;\n        }\n\n        // toggle SportFilterItem v3.0\n        $(document).on('click', selectors.vmSportsFilterItem + '[data-sport-type-id]', function (e) {\n            e.stopImmediatePropagation();\n            e.preventDefault();\n\n            var container = $(this),\n                sportId = container.data('sport-type-id');\n\n            var isAllChecked = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem + ':not(.m-selected)').length > 0 ? false : true;\n\n            if (isAllChecked) {\n                container.addClass('m-loading');\n                Ajax.postJson(\"/Live/EnableOnlyOneItem\", {\n                    data: {\n                        sportId: sportId\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function (resp) {\n                        $(selectors.vmSelectAll).prop('checked', false);\n                        app.ModeTableLive.clear();\n                        $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem).removeClass('m-selected');\n                        container.addClass('m-selected');\n\n                        app.ModeTableLive.insertTable(resp.html);\n\n                        container.removeClass('m-loading');\n                    }\n                });\n            } else {\n                toggleSportsFilterItem(sportId, container);\n            }\n\n            return false;\n        });\n\n        // toggle SportFilter v3.0\n        body.on('click', selectors.vmSelectAll, function () {\n            TableFetcherLive.stop();\n\n            var that = $(this),\n                removingAll = !that.prop('checked'),\n                allItems = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem);\n\n\n            that.parent().parent().addClass('m-loading');\n            Ajax.postJson(\"/Live/ToggleSportFilter\", {\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    if (removingAll) {\n                        app.ModeTableLive.clear();\n                        that.prop('checked', false);\n                        allItems.removeClass(vmSelectedClass);\n                    }\n                    else {\n                        app.ModeTableLive.update();\n                        that.prop('checked', true);\n                        allItems.addClass(vmSelectedClass);\n                    }\n                    (app.ModeTableLive.count() === 0)\n                        ? $(selectors.emptyBetplace).addClass('active')\n                        : $(selectors.emptyBetplace).removeClass('active');\n\n                    that.parent().parent().removeClass('m-loading');\n                }\n            });\n            return false;\n        });\n\n        body.on('change', selectors.cmSorting, function () {\n            Ajax.postJson(\"/Live/SetSortingType\", {\n                data: { sortingType: $(this).val(), sportType: sportType },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTableLive.update();\n                    (app.ModeTableLive.count() === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                }\n            });\n            return false;\n        });\n\n        // <input[checkbox]> on 'live' page for Broadcast and Visualization filters\n        body.on('change', selectors.broadcastFilter, function () {\n            Ajax.postJson(\"/Live/SetBroadcastFilter\", {\n                data: { isBroadcastFilter: $(this).is(\":checked\"), isFavorite: false, sportType: sportType },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTableLive.update();\n                    (app.ModeTableLive.isEmpty()) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                }\n            });\n            return false;\n        });\n        body.on('change', selectors.visualizationFilter, function () {\n            Ajax.postJson(\"/Live/SetVisualizationFilter\", {\n                data: { isVisualizationFilter: $(this).is(\":checked\"), isFavorite: false, sportType: sportType },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTableLive.update();\n                    (app.ModeTableLive.isEmpty()) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                }\n            });\n            return false;\n        });\n\n        // Fave/Unfave calendarEvent\n        body.on('click', (selectors.tbCalendar), function (e) {\n\n            var that = $(this),\n                eventId = that.closest(selectors.tbEvent).data('id'),\n                dataIdFilter = '[data-id=' + eventId + ']',\n                isRemovingFromFav = that.hasClass('m-active');\n\n            that.addClass('m-loading');\n            Ajax.postJson(isRemovingFromFav ? \"/Calendar/UnFaveEvent\" : \"/Calendar/FaveEvent\", {\n                data: {\n                    id: eventId\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    that.toggleClass('m-active');\n\n                    if (resp && resp.Message) {\n                        that.removeClass('m-active');\n                        Tooltip.errorNode(that, resp.Message);\n                        that.removeClass('m-loading');\n                        return;\n                    }\n                    if (isRemovingFromFav) {\n                        var currentEvent = $(selectors.tbEvent + dataIdFilter),\n                            parentTable = currentEvent.closest(selectors.tbTable);\n                        if (parentTable.find(selectors.tbEvent).length <= 1) {\n                            ModeTableLive.removeTable(parentTable.data('sportid'));\n                            (app.ModeTableLive.count() === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                        }\n                        currentEvent.remove();\n                    }\n\n                    that.removeClass('m-loading');\n                }\n            });\n\n            return false;\n        });\n\n        // Fave event v3.0\n        body.on('click', (selectors.tbFavstar + ',' + selectors.searchFavstar), function (e) {\n\n            var that = $(this),\n                isRemovingFromFav = that.hasClass('m-active'),\n                eventId = (that.is(selectors.tbFavstar)) ? that.closest(selectors.tbEvent).data('id') : that.closest(selectors.searchEvent).data('id'),\n                dataIdFilter = '[data-id=' + eventId + ']',\n                allStars = $.merge($(selectors.tbEvent + dataIdFilter).find(selectors.tbFavstar), $(selectors.searchEvent + dataIdFilter).find(selectors.searchFavstar));\n\n            that.addClass('m-loading');\n            Ajax.postJson(isRemovingFromFav ? \"/Live/UnFaveEvent\" : \"/Live/FaveEvent\", {\n                data: {\n                    id: eventId\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    if (resp && resp.Message) {\n                        that.removeClass('m-active');\n                        Tooltip.errorNode(that, resp.Message);\n                        that.removeClass('m-loading');\n                        return;\n                    }\n\n                    if (isRemovingFromFav) {\n                        allStars.removeClass('m-active');\n                        allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_10', 'Добавить в избранное'));\n                        if (isFavorite) {\n                            var currentEvent = $(selectors.tbEvent + dataIdFilter),\n                                parentTable = currentEvent.closest(selectors.tbTable);\n\n                            if (parentTable.find(selectors.tbEvent).length <= 1) {\n                                ModeTableLive.removeTable(parentTable.data('sportid'));\n                                (app.ModeTableLive.count() === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                            }\n                            else {\n                                currentEvent.remove();\n                            }\n                        }\n                    }\n                    else {\n                        allStars.addClass('m-active');\n                        allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_11', 'Удалить из избранного'));\n                        if (isFavorite && that.is(selectors.searchFavstar)) {\n                            TableFetcherLive.full();\n                            //TODO: Здесь получать только betPlace() без вертикального меню. и возможно не использовать fetcher (лишние расчеты diff)\n                            $(selectors.emptyBetplace).removeClass('active')\n                        }\n                    }\n\n                    app.VerticalMenu.changeFavorites();\n\n                    that.removeClass('m-loading');\n                },\n            });\n\n            return false;\n        });\n\n\n        ConfirmButton.init(\n            '#live_favs-remove_all',\n            function () { },\n            '/Live/UnFaveAll',\n            function (resp) {\n                app.ModeTableLive.destroyTables();\n                (app.ModeTableLive.count() === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                app.VerticalMenu.changeFavorites();\n            }\n        );\n\n    };\n\n    var unBindUI = function () {\n        app.body\n            .off('click', (selectors.tbFavstar + ',' + selectors.searchFavstar))\n            .off('click', selectors.tbCalendar)\n            .off('click', selectors.vmSelectAll)\n            .off('change', selectors.cmSorting);\n\n        $(document).off('click', selectors.vmSportsFilterItem + '[data-sport-type-id]');\n        ConfirmButton.dispose('#live_favs-remove_all');\n    };\n\n    var toggleSportsFilterItem = function (sportId, sportsFilterItemContainer, callback) {\n        TableFetcherLive.stop();\n\n        var removing = sportsFilterItemContainer.hasClass(vmSelectedClass),\n            allItems = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem),\n            selectAllbtn = $(selectors.vmSelectAll);\n\n        sportsFilterItemContainer.addClass('m-loading');\n        Ajax.postJson(\"/Live/ToggleSportFilterItem\", {\n            data: {\n                sportId: sportId,\n            },\n            doCallAjaxViewParsers: false,\n            success: function (resp) {\n                if (removing) {\n                    app.ModeTableLive.removeTable(sportId);\n                    sportsFilterItemContainer.removeClass(vmSelectedClass);\n                }\n                else {\n                    var prevFilter = sportsFilterItemContainer.prevAll('.' + vmSelectedClass);\n                    var insertAfterId = (prevFilter.length !== 0) ? prevFilter.data('sport-type-id') : undefined;\n                    app.ModeTableLive.insertTable(resp.html, insertAfterId);\n                    sportsFilterItemContainer.addClass(vmSelectedClass);\n                }\n\n                selectAllbtn.prop('checked', (allItems.filter('.' + vmSelectedClass).length === allItems.length));\n                (app.ModeTableLive.count() === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n\n                sportsFilterItemContainer.removeClass('m-loading');\n\n                if (callback) callback();\n            }\n        });\n    };\n\n    function setScopeData(scopeData) {\n        if (scopeData != undefined && scopeData.hasOwnProperty('sport')) {\n            sportType = scopeData.sport;\n        }\n    }\n\n    var bind = function (justLoaded, scopeData) { setScopeData(scopeData);  bindUI(); };\n    var unBind = function () { unBindUI(); };\n    var bindFavorites = function (justLoaded) { bindUI(true); };\n    var unBindFavorites = function () { unBindUI(); };\n\n    return {\n        bind: bind,\n        bindFavorites: bindFavorites,\n        unBind: unBind,\n        unBindFavorites: unBindFavorites,\n        name: 'BinderLiveSingleSport',\n        url: '/Live/GetViewSet',\n    };\n}());\n\n//-----------------------------------\n\nScopeLiveSingleSport = (function () {\n\n    var sportType;\n\n    function init() {\n        app.VerticalMenu.init();\n        TableFetcherLive.setMode.standartSingleSport(sportType);\n        app.ModeTableLive.init();\n\n        app.Search.init('liveSingleSport', { sportType: sportType });\n    }\n\n    function dispose() {\n        app.VerticalMenu.dispose();\n        app.ModeTableLive.dispose();\n    }\n\n    var start = function (justLoaded, scopeData) { sportType = scopeData.sportType; init(); };\n    var stop = function () { dispose(); };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopeLiveSingleSport',\n        url: 'LIVE/SPORT',\n    };\n}());\n","window.ModeTableLive = (function () {\n    const selectors = {\n        betPlace: '#bet-place',\n        table: '.events-table',\n        header: '.events-table__header',\n        resultsLine: '[tb-resline]',\n        event: '.events-table__body-row',\n        eventTitle: '.events-table__title',\n        eventAllCoefsCount: '.events-table__all-coefs-count',\n        cell: '.events-table__markets-cell',\n        scrollbarContentWrapper: '.m-page-content-scrollbar > .awesome-scrollbar__content-wrapper',\n        eventCoefs: '.events-table__row-coefs',\n        expandAllCoefsButton: '.js-expand-all-coefs',\n        sportsFilterItem: '.sports-filter__item',\n        expandNestedEventsButton: '.js-expand-nested-events'\n    };\n\n    const topHeight = {\n        bannerHeight: $('#mobile-app-banner').height(),\n        headHeight: $('#app-header').height(),\n        headerWithBanner: null\n    };\n    topHeight.headerWithBanner = topHeight.bannerHeight + topHeight.headHeight;\n    const visibilityArea = $(window).height();\n    const isClientCartEnabled = window?.globalAppSettings?.isClientCartEnabled;\n\n    function removeFromCart(oId) {\n        if (isClientCartEnabled) {\n            window.ClientCart.removeOutcome(Number(oId));\n        } else {\n            BettingCart.removeItem(oId);\n        }\n    }\n\n    function addToCart(sData) {\n        if (isClientCartEnabled) {\n            window.ClientCart.addOutcome({\n                oId: Number(sData.oId),\n                eId: Number(sData.eId),\n            });\n        } else {\n            BettingCart.addItem(sData);\n            BettingCart.Highlighting.activate.allScopes();\n        }\n    }\n\n    function highlightCoef() {\n        if (isClientCartEnabled) {\n            window.ClientCart.highlight();\n        } else {\n            BettingCart.Highlighting.activate.table();\n        }\n    }\n\n    var Table = (function () {\n        var Table = function (domTable) {\n            this.id = domTable.data('sportid');\n            this.domTable = domTable;\n            this.header = domTable.find(selectors.header);\n            this.isFavorite = domTable.hasClass('m-favorite');\n\n            this.bindUI();\n            SPA.updatePageLinks();\n        };\n\n        Table.prototype.bindUI = function () {\n        };\n\n        return Table;\n    }());\n\n    var tables = {},\n        eventBlocks = {},\n        pageContentScrollTop = 0,\n        maxEventBlocksCount = 1;\n\n    var bindUI = function () {\n\n        // Fix table Header v3.0\n        if (app.isIE()) {\n            $(selectors.scrollbarContentWrapper).on('scroll.liveTable', function () {\n                pageContentScrollTop = $(this).scrollTop();\n                fixHeader(pageContentScrollTop);\n            });\n        }\n\n        // Betting cart (add/remove) v3.0\n        app.body.on('click', selectors.cell + '[data-aid]', function () {\n            var that = $(this),\n                coefOid = that.attr('data-oid');\n\n            if (that.hasClass('active')) {\n                removeFromCart(coefOid);\n                return false;\n            }\n\n            var coefVal = that.attr('data-coefvalue'),\n                coefAid = that.attr('data-aid');\n            var event = that.closest(selectors.event),\n                eventId = event.attr('data-id');\n            var sData = {\n                oId: coefOid,\n                aId: coefAid,\n                val: coefVal,\n                isLive: true,\n                eId: eventId,\n            };\n\n            // return false if cart is sending now or overflowed, return true if added or already added.  Blink on false\n            addToCart(sData);\n\n            return false;\n        });\n\n        app.body.on('click', selectors.expandNestedEventsButton, function () {\n            var mainEventId = $(this).closest(selectors.event).data('id');\n            var mainEventNode = $(this).closest(selectors.event);\n            var isCollapsing = mainEventNode.hasClass('m-nested-expanded');\n\n            var nestedEvents = document.querySelectorAll(`[data-meid=\"${mainEventId}\"`);\n\n            if (isCollapsing) {\n                var isFavorites = $('#favorites-switcher').hasClass('m-selected');\n                Ajax.postJson(\"/Live/HideNestedEvents\", {\n                    data: {\n                        mainEventId: mainEventId,\n                        isFavorites: isFavorites,\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function (response) {\n                        $(nestedEvents).each(function () {\n                            var nestedEventNode = $(this).closest(selectors.event);\n                            nestedEventNode.addClass('m-hidden');\n                        });\n                        mainEventNode.removeClass('m-nested-expanded');\n                    }\n                });\n            }\n            else {\n                Ajax.postJson(\"/Live/ShowNestedEvents\", {\n                    data: {\n                        mainEventId: mainEventId,\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function (response) {\n                        $(nestedEvents).each(function () {\n                            var nestedEventNode = $(this).closest(selectors.event);\n                            nestedEventNode.removeClass('m-hidden');\n                        });\n                        mainEventNode.addClass('m-nested-expanded');\n                    }\n                });\n            }\n            return false;\n        })\n\n        //Expand EventCoefs\n        app.body.on('click', selectors.expandAllCoefsButton, function () {\n            var eventNode = $(this).closest(selectors.event),\n                coefsNode = eventNode.find(selectors.eventCoefs),\n                isCollapsing = coefsNode.hasClass('m-visible'),\n                id = eventNode.data('id');\n\n            if ($('#mobile-app-banner').css('display') == 'none') {\n                $('.events-table__row-main-info').css('top', topHeight.headHeight);\n            } else {\n                $('.events-table__row-main-info').css('top', topHeight.headerWithBanner);\n            }\n\n            //filter sticky\n\n            if ($('.events-table__scoring', eventNode).length > 0) {\n                $(eventNode).attr('data-filter-sticky', 'bigSpace');\n            } else {\n                $(eventNode).attr('data-filter-sticky', 'ordinarySpace');\n            }\n\n            if (isCollapsing) {\n                eventNode.removeClass('m-expanded');\n                disposeEventBlock(id);\n                coefsNode.empty();\n                coefsNode.removeClass('m-visible');\n                Ajax.postJson('/Live/CollapseEventCoefs', { data: { id: id }, doCallAjaxViewParsers: false });\n\n\n\n                let defaultPosition = $(eventNode).data('node-saved-top');\n                let scrollEvent = $(window).scrollTop();\n                if (defaultPosition == undefined) {\n                    defaultPosition = scrollEvent;\n                };\n\n                let deltaScroll = Number(defaultPosition) - Number(scrollEvent);//direction scrollTop\n\n                let positionEventBeforeCollapse = $(eventNode).offset().top;\n                //scrollDefaultPosition\n                if (globalAppSettings.isMobileDevice && !globalAppSettings.isMobileDeviceInDesktopMode) {\n\n                    if ((deltaScroll < 0) && (scrollEvent > defaultPosition) && (scrollEvent > positionEventBeforeCollapse)) {\n                        if ($('#mobile-app-banner').css('display') == 'none') {\n                            $(window).scrollTop(eventNode.offset().top - topHeight.headHeight);\n                        } else {\n                            $(window).scrollTop(eventNode.offset().top - topHeight.headerWithBanner);\n                        }\n                    } else if (deltaScroll > 0 || scrollEvent < positionEventBeforeCollapse) {\n                        $(window).scrollTop(scrollEvent);\n                    } else {\n                        $(window).scrollTop(defaultPosition);\n                    }\n                }\n\n                return false;\n            } else {\n                $(eventNode).data('node-saved-top', $(window).scrollTop());\n            }\n\n            eventNode.addClass('m-expanded');\n            eventNode.addClass('m-loading');\n            Ajax.postJson(\"/Live/ExpandEventCoefs\", {\n                data: {\n                    id: id,\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    var newCoefsNode = $(resp.html);\n                    coefsNode.replaceWith(newCoefsNode);\n\n                    initEventBlock(newCoefsNode);\n                    if (!isClientCartEnabled) {\n                        BettingCart.Highlighting.activate.openEvent();\n                    } else {\n                        window.ClientCart.highlight();\n                    }\n\n                    if (Object.keys(eventBlocks).length > maxEventBlocksCount) {\n                        var minEventBlock = Object.values(eventBlocks).reduce(function (acc, val) { return (val.orderValue < acc.orderValue) ? val : acc; }, { orderValue: Infinity });\n\n                        minEventBlock.domNode.closest(selectors.event).removeClass('m-expanded');\n                        minEventBlock.domNode.empty();\n                        minEventBlock.domNode.removeClass('m-visible');\n                        disposeEventBlock(minEventBlock.id);\n                    }\n\n                    dispatchShowEventsListCoefsEvent();\n                    eventNode.removeClass('m-loading');\n                }\n            });\n            return false;\n        });\n    };\n\n    var dispatchShowEventsListCoefsEvent = function () {\n        let ids = $(selectors.event + '.m-expanded').map(function () {\n            return $(this).attr('data-id');\n        }).toArray();\n\n        if (ids.length > 0) {\n            console.log('dispatchShowEventsListCoefsEvent');\n            document.dispatchEvent(new CustomEvent('showEventsListCoefs', {\n                detail: {\n                    ids: ids\n                }\n            }));\n        } else {\n            document.dispatchEvent(new CustomEvent('stopShowingEventsListCoefs'));\n        }\n    };\n\n    var unbindUI = function () {\n        app.body\n            .off('click', selectors.cell + '[data-aid]')\n            .off('click', selectors.expandAllCoefsButton)\n            .off('click', selectors.expandNestedEventsButton);\n\n        if (app.isIE()) {\n            $(selectors.scrollbarContentWrapper).off('scroll.liveTable');\n        }\n    };\n\n    var init = (function () {\n        $(selectors.table).each(function () {\n            var self = $(this);\n            var id = $(this).data('sportid');\n\n            tables[id] = new Table(self);\n        });\n\n        highlightCoef();\n\n        setTimeout(function () {\n            $(selectors.scrollbarContentWrapper).scrollTop(sessionStorage.getItem('livePageContentScrollTop') || 0)\n        }, 10);\n\n        bindUI();\n        if (!isEmpty()) {\n            TableFetcherLive.start();\n        }\n\n        maxEventBlocksCount = globalAppSettings.liveTableMaxExpandedEvents || 1;\n    });\n\n    var fixHeader = function (scrollTop) {\n        for (key in tables) {\n            var table = tables[key];\n            var top = table.domTable.position().top + parseInt(table.domTable.css('margin-top')) + 10;\n            var height = table.domTable.outerHeight();\n\n            if (scrollTop > top && scrollTop < top + height - 25) {\n                table.header.css({\n                    transform: 'translateY(' + (scrollTop - (top + 2)) + 'px)'\n                });\n            } else {\n                table.header.css({\n                    transform: 'translateY(0)'\n                });\n            }\n        }\n    };\n\n    var update = function () {\n        clear();\n        dispatchShowEventsListCoefsEvent();\n\n        $(selectors.table).each(function () {\n            var self = $(this);\n            var id = $(this).data('sportid');\n\n            tables[id] = new Table(self);\n\n            //filter sticky\n            if ($('.events-table__scoring', self).length > 0) {\n                $('.events-table__body-row.m-expanded', self).attr('data-filter-sticky', 'bigSpace');\n            } else {\n                $('.events-table__body-row.m-expanded', self).attr('data-filter-sticky', 'ordinarySpace');\n            }\n        });\n\n        highlightCoef();\n\n        $(selectors.scrollbarContentWrapper).scroll();\n\n        if (isEmpty()) {\n            $('#live-empty_betplace').addClass('active');\n        } else {\n            TableFetcherLive.start();\n\n            if ($('#mobile-app-banner').css('display') == 'none') {\n                $('.events-table__row-main-info').css('top', topHeight.headHeight);\n            } else {\n                $('.events-table__row-main-info').css('top', topHeight.headerWithBanner);\n            }\n        }\n\n        initEventBlocks();\n    };\n\n    var destroyTables = function () {\n        for (var key in tables) {\n            tables[key].domTable.remove();\n            delete tables[key];\n        }\n    };\n\n    var removeTable = function (id) {\n        var table = tables[id];\n        if (table !== undefined) {\n            table.domTable.remove();\n            delete tables[id];\n        }\n        if (!isEmpty()) {\n            TableFetcherLive.start();\n        }\n\n        initEventBlocks();\n    };\n\n    var clear = function () {\n        for (var key in tables) {\n            tables[key].domTable.remove();\n            delete tables[key];\n        }\n    };\n\n    var dispose = function () {\n        TableFetcherLive.stop();\n        clear();\n        unbindUI();\n        disposeEventBlocks();\n        sessionStorage.setItem('livePageContentScrollTop', pageContentScrollTop);\n    };\n\n    var insertTable = function (html, insertAfterId) {\n        var self = $(html);\n        var id = self.data('sportid');\n\n        if (tables[id] != undefined) {\n            tables[id].domTable.remove();\n            delete tables[id];\n        }\n\n        if (insertAfterId !== undefined) {\n            var insertAfterTable = tables[insertAfterId];\n            (insertAfterTable !== undefined) ? self.insertAfter(insertAfterTable.domTable) : $(selectors.betPlace).prepend(self);\n        }\n        else {\n            $(selectors.betPlace).prepend(self);\n        }\n\n        tables[id] = new Table(self);\n\n        highlightCoef();\n\n        if (!isEmpty()) {\n            dispatchShowEventsListCoefsEvent();\n            TableFetcherLive.start();\n        }\n    };\n\n    var disposeEventBlocks = function () {\n        for (var key in eventBlocks) {\n            disposeEventBlock(key);\n        }\n        eventBlocks = {};\n    }\n\n    var initEventBlocks = function () {\n        disposeEventBlocks();\n        var wrapperNodes = $(selectors.eventCoefs + '.m-visible');\n        if (wrapperNodes.length > 0) {\n            wrapperNodes.each(function () {\n                initEventBlock($(this));\n            });\n\n            if (isClientCartEnabled) {\n                window.ClientCart.highlight();\n            } else {\n                BettingCart.Highlighting.activate.openEvent();\n            }\n        }\n    }\n\n    function disposeEventBlock(id) {\n        if(!eventBlocks[id]) {\n            return\n        }\n        eventBlocks[id].dispose();\n        delete eventBlocks[id];\n        BinderTextScroll.unbindScroll(id);\n    }\n\n    function initEventBlock(node) {\n        var eventBlock = new EventBlock(node, EventBlock.EType.LiveTable);\n        BinderTextScroll.bindScroll(eventBlock.domNode);\n\n        if (eventBlock.id) {\n            var maxOrderValue = Math.max.apply(null, Object.values(eventBlocks).map(function (x) { return x.orderValue }));\n            eventBlock.orderValue = (maxOrderValue == -Infinity) ? 0 : maxOrderValue + 1;\n            eventBlocks[eventBlock.id] = eventBlock;\n            //new AwesomeScrollbar('[data-event-id=\"' + eventBlock.id + '\"] [js-node=\"accent-event-body\"]', 'm-accent-event');\n        }\n    }\n\n    function getEventBlockInstanceById(eventId) {\n        return (eventBlocks.hasOwnProperty(eventId)) ? eventBlocks[eventId] : null;\n    }\n\n    const DEFER_TIMEOUT = 1500;\n    var timeoutPool = {};\n    function deferAction(key, action) {\n        clearTimeout(timeoutPool[key]);\n        timeoutPool[key] = setTimeout(function () {\n            action();\n            delete timeoutPool[key];\n        }, DEFER_TIMEOUT);\n    }\n\n    var count = function () { return Object.keys(tables).length };\n    var isEmpty = function () { return count() === 0 };\n\n    return {\n        'tables': tables,\n        'count': count,\n        'init': init,\n        'dispose': dispose,\n        'isEmpty': isEmpty,\n        'update': update,\n        'clear': clear,\n        'removeTable': removeTable,\n        'destroyTables': destroyTables,\n        'insertTable': insertTable,\n        'selectors': selectors\n    };\n}());","var TableFetcherLive = window.TableFetcherLive = (function () {\n    const moduleName = 'TableFetcherLive';\n\n    const selectors = {\n        betPlace: '#bet-place',\n        emptyBetplace: '#live-empty_betplace',\n        tbCell: '.events-table__markets-cell',\n        tbEventUnique: '#te',\n        tbEvent: '.events-table__body-row',\n\n        tbScore: '.events-table__body-score',\n        tbMatchTime: '.live-timer__comment',\n        tbStartTime: '.live-timer__start-time',\n        tbEventInfo: '.events-table__row-comment',\n\n        tbDopCoefCounter: '.events-table__acc-number',\n    };\n\n    const EMPTY_COEF = '-',\n        EVENT_UPD_INFO = {\n            SELF: 'e',\n            ID: 'i',\n            DOP_COEF_COUNTER: 'x',\n\n            IS_ACTIVE: 'a',\n            CURRENT_TIME: 't',\n            MATCH_TIME: 'm',\n            COMMENT: 'n',\n            START_TIME: 'b',\n        },\n        SCORE_INFO = {\n            SELF: 's',\n            GENERAL: 'g',\n            DETAILED: 't',\n            POINTS: 'p',\n            INNINGS: 'i',\n            ADVANT: 'a',\n        },\n        SCORE_UNIT = {\n            TEAM1: 'f',\n            TEAM2: 's',\n            FIRST_WON: 'w',\n        },\n        COEF_UPD_INFO = {\n            SELF: 'c',\n            ORIGINAL_ID: 'o',\n            ACTUAL_ID: 'a',\n            COEF_TYPE_ID: 't',\n            IS_COEF_VALUE: 's',\n            VALUE: 'v',\n            TEXT_VALUE: 'x',\n        };\n\n    var externalUpdatedCoefs = {};\n\n    var isLightReady = true;\n\n    const isClientCartEnabled = window?.globalAppSettings?.isClientCartEnabled;\n\n    function isInCart(oId) {\n        if (isClientCartEnabled) {\n            return window.ClientCart.hasOutcome(Number(oId));\n        }\n        return BettingCart.hasItem(Number(oId));\n    }\n\n    function log(msg) {\n        app.console.log(\n            '%c%s %s',\n            'color: #6495ED;',\n            '[' + moduleName + ']',\n            msg\n        );\n    }\n\n    function selectByCoefTypeId(coefTypeId) {\n        return function (coef) {\n            return coef.t === coefTypeId;\n        };\n    }\n\n    function externalUpdateCoef(originalId, actualId, value, isActive) {\n        let cellNode = $('#tcell_' + originalId);\n        if (cellNode.length === 0) return;\n\n        let actualIdCurrent = parseInt(cellNode.attr('data-aid'));\n        if (isNaN(actualIdCurrent)) actualIdCurrent = 0;\n\n        actualId = parseInt(actualId);\n        if (actualIdCurrent < actualId) {\n\n            if (isActive) {\n                let valueCurrent = parseFloat(cellNode.attr('data-coefvalue'));\n                cellNode.attr('data-aid', actualId)\n                    .attr('data-coefvalue', value.toFixed(2))\n                    .text(window.Utils.displayCoefValue(value))\n                    .removeClass('m-empty');\n\n                if (\n                    !cellNode.closest(selectors.tbEvent).hasClass('m-expanded')\n                ) {\n                    animateCellChange(cellNode, value > valueCurrent);\n                }\n            } else {\n                cellNode\n                    .attr('data-aid', actualId)\n                    .text(EMPTY_COEF)\n                    .addClass('m-empty');\n            }\n\n            externalUpdatedCoefs[parseInt(originalId)] = {\n                aidFrom: actualIdCurrent,\n                aidTo: actualId,\n                isActive: isActive,\n            };\n        } else if (actualIdCurrent === actualId) {\n            let isActiveCurrent = !cellNode.hasClass('m-empty');\n            if (isActiveCurrent !== isActive) {\n                if (isActive) {\n                    cellNode.attr('data-coefvalue', value.toFixed(2))\n                        .text(window.Utils.displayCoefValue(value))\n                        .removeClass('m-empty');\n                }\n                else {\n                    cellNode.text(EMPTY_COEF).addClass('m-empty');\n                }\n                externalUpdatedCoefs[parseInt(originalId)] = {\n                    aidFrom: actualIdCurrent,\n                    aidTo: actualId,\n                    isActive: isActive,\n                };\n            }\n        }\n    }\n\n    function animateCellChange(node, isInc) {\n        var deltaClass = 'change ' + (isInc ? 'plus' : 'minus');\n\n        node.addClass(deltaClass);\n        setTimeout(function () {\n            node.removeClass(deltaClass);\n        }, 2000);\n    }\n\n    function generateInnerGeneralScore(score) {\n        var generalScore = score[SCORE_INFO.GENERAL];\n        if (generalScore === undefined) return '';\n\n        return (\n            '<span class=\"events-table__points-item m-points-first m-general\">' +\n            generalScore[SCORE_UNIT.TEAM1] +\n            '</span>' +\n            '<span class=\"events-table__points-divider m-general\"> : </span>' +\n            '<span class=\"events-table__points-item m-points-second m-general\">' +\n            generalScore[SCORE_UNIT.TEAM2] +\n            '</span>'\n        );\n    }\n\n    function updateFirstPeriodSubScore(score, node) {\n        let scoreString = '';\n        if (score[SCORE_INFO.DETAILED][0] !== undefined) {\n            scoreString =\n                '<span class=\"events-table__points-item m-points-first\">' +\n                '(' +\n                score[SCORE_INFO.DETAILED][0][SCORE_UNIT.TEAM1] +\n                '</span>' +\n                '<span class=\"events-table__points-divider\"> : </span>' +\n                '<span class=\"events-table__points-item m-points-second\">' +\n                score[SCORE_INFO.DETAILED][0][SCORE_UNIT.TEAM2] +\n                ')' +\n                '</span>';\n            node.addClass('m-grey');\n        } else if (score[SCORE_INFO.GENERAL] !== undefined) {\n            scoreString =\n                '<span class=\"events-table__points-item m-points-first\">' +\n                '(' +\n                score[SCORE_INFO.GENERAL][SCORE_UNIT.TEAM1] +\n                '</span>' +\n                '<span class=\"events-table__points-divider\"> : </span>' +\n                '<span class=\"events-table__points-item m-points-second\">' +\n                score[SCORE_INFO.GENERAL][SCORE_UNIT.TEAM2] +\n                ')' +\n                '</span>';\n            node.removeClass('m-grey');\n        }\n        node.html(scoreString);\n    }\n\n    function generateInnerPointsScore(score, showInnings) {\n        var points = score[SCORE_INFO.POINTS],\n            advantage = score[SCORE_INFO.ADVANT];\n        if (!points && !advantage) return '';\n\n        var innings = showInnings ? score[SCORE_INFO.INNINGS] : 0;\n        return [\n            '<div class=\"events-table__points-total\">',\n            '<span class=\"events-table__points-item m-points-first' +\n                (innings === 1 ? ' m-serve' : '') +\n                (advantage === 1 ? ' m-advantage' : '') +\n                '\">' +\n                +(advantage === 0 ? points[SCORE_UNIT.TEAM1] : '40') +\n                '</span>',\n            '<span class=\"events-table__points-divider\"> : </span>',\n            '<span class=\"events-table__points-item m-points-second' +\n                (innings === 2 ? ' m-serve' : '') +\n                (advantage === 2 ? ' m-advantage' : '') +\n                '\">' +\n                +(advantage === 0 ? points[SCORE_UNIT.TEAM2] : '40') +\n                '</span>',\n            '</div>',\n        ].join('\\n');\n    }\n\n    function generateDetailedTableScore(score, showInnings, tableSize) {\n        let detailedTable = score[SCORE_INFO.DETAILED];\n        if (!detailedTable || !detailedTable.length) return '';\n\n        var innings = showInnings ? score[SCORE_INFO.INNINGS] : 0;\n\n        let startIndex = detailedTable.length - tableSize;\n        startIndex = startIndex < 0 ? 0 : startIndex;\n\n        let html =\n            '<div class=\"events-table__row-first' +\n            (innings === 1 ? ' m-serve' : '') +\n            '\">';\n        for (let i = startIndex; i <= detailedTable.length - 1; i++) {\n            if (startIndex > 0 && i === startIndex) {\n                html += '<div class=\"events-table__row-set\">...</div>';\n            } else {\n                html +=\n                    '<div class=\"events-table__row-set' +\n                (detailedTable[i][SCORE_UNIT.FIRST_WON] === 1 //true\n                        ? ' m-win'\n                        : '') +\n                    '\">' +\n                    detailedTable[i][SCORE_UNIT.TEAM1] +\n                    '</div>';\n            }\n        }\n\n        html +=\n            '</div><div class=\"events-table__row-second' +\n            (innings === 2 ? ' m-serve' : '') +\n            '\">';\n        for (let i = startIndex; i <= detailedTable.length - 1; i++) {\n            if (startIndex > 0 && i === startIndex) {\n                //TODO: REDO\n                html += '<div class=\"events-table__row-set\">...</div>';\n            } else {\n                html +=\n                    '<div class=\"events-table__row-set' +\n                (detailedTable[i][SCORE_UNIT.FIRST_WON] === 0 //false\n                        ? ' m-win'\n                        : '') +\n                    '\">' +\n                    detailedTable[i][SCORE_UNIT.TEAM2] +\n                    '</div>';\n            }\n        }\n        html += '</div>';\n\n        return html;\n    }\n\n    //оснСчет в теннисе: .events-table__total-score\n    //оснСчет в футболе .events-table__body-score TODO: привести к одному\n    //табличный счет: .events-table__sets\n    function updateScore(eventNode, event) {\n        let scoreNode = eventNode.find(selectors.tbScore),\n            newScoreString = JSON.stringify(event[SCORE_INFO.SELF]);\n\n        //Just GeneralScore\n\n        if (scoreNode.attr('tooltip-event-score'))\n            scoreNode.attr('tooltip-event-score', newScoreString);\n\n        if (scoreNode.attr('data-event-score') !== newScoreString) {\n            scoreNode\n                .html(generateInnerGeneralScore(event[SCORE_INFO.SELF]))\n                .addClass('change');\n\n            let subScoreNode = eventNode.find('.events-table__score-expanded');\n            if (subScoreNode.length) {\n                updateFirstPeriodSubScore(event[SCORE_INFO.SELF], subScoreNode);\n            }\n            setTimeout(function () { scoreNode.removeClass('change'); }, 2000);\n        }\n\n        scoreNode.attr('data-event-score', newScoreString);\n\n        //General Score + Detailed Score Table\n        let tennisScoreNode = eventNode.find('.events-table__scoring');\n\n        if (\n            !tennisScoreNode.length ||\n            tennisScoreNode.attr('data-event-score') === newScoreString\n        ) return;\n\n        var prevScore = JSON.parse(tennisScoreNode.attr('data-event-score'));\n\n\n\n        if (tennisScoreNode.attr('tooltip-event-score'))\n            tennisScoreNode.attr('tooltip-event-score', newScoreString);\n\n        tennisScoreNode.attr('data-event-score', newScoreString);\n\n        if (\n            JSON.stringify(event[SCORE_INFO.SELF][SCORE_INFO.DETAILED]) !==\n                JSON.stringify(prevScore[SCORE_INFO.DETAILED]) ||\n            event[SCORE_INFO.SELF][SCORE_INFO.INNINGS] !==\n                prevScore[SCORE_INFO.INNINGS]\n        ) {\n            let setsNode = eventNode.find('.events-table__sets');\n            let tableSize = setsNode.attr('data-tsize');\n            let showInnings = setsNode.attr('show-innings') !== undefined;\n            setsNode.html(\n                generateDetailedTableScore(\n                    event[SCORE_INFO.SELF],\n                    showInnings,\n                    tableSize\n                )\n            );\n        }\n\n        if (\n            JSON.stringify(event[SCORE_INFO.SELF][SCORE_INFO.GENERAL]) !==\n            JSON.stringify(prevScore[SCORE_INFO.GENERAL])\n        ) {\n            eventNode\n                .find('.events-table__score')\n                .html(generateInnerGeneralScore(event[SCORE_INFO.SELF]));\n            let totalScore = tennisScoreNode.find('.events-table__total-score');\n            totalScore.addClass('change');\n            setTimeout(function () {\n                totalScore.removeClass('change');\n            }, 2000);\n        }\n\n        //TODO: Вот тут явно можно производительнее сделать\n        delete event[SCORE_INFO.SELF][SCORE_INFO.DETAILED];\n        delete prevScore[SCORE_INFO.DETAILED];\n        delete event[SCORE_INFO.SELF][SCORE_INFO.GENERAL];\n        delete prevScore[SCORE_INFO.GENERAL];\n\n        if (\n            JSON.stringify(event[SCORE_INFO.SELF]) !== JSON.stringify(prevScore)\n        ) {\n            var pointsNode = eventNode.find('.events-table__points');\n            var showInnings = pointsNode.attr('show-innings') !== undefined;\n            var pointsInnerHtml = generateInnerPointsScore(\n                event[SCORE_INFO.SELF],\n                showInnings\n            );\n            pointsNode.html(pointsInnerHtml);\n\n            if (pointsInnerHtml.length) pointsNode.removeClass('m-empty');\n            else pointsNode.addClass('m-empty');\n        }\n    }\n\n    function handleLightFetch(data) {\n        app.console.time('Fetched(Light)');\n\n        for (\n            var eventIndex = 0;\n            eventIndex < data.length;\n            eventIndex++\n        ) {\n            var event = data[eventIndex],\n                eventNode = $(\n                    selectors.tbEventUnique + event[EVENT_UPD_INFO.ID]\n                );\n\n            if (eventNode.length < 1) {\n                continue;\n            }\n\n            //currentTime\n            let currentTimeNode = eventNode.find('.live-timer__current-time');\n            if (currentTimeNode.text() !== event[EVENT_UPD_INFO.CURRENT_TIME])\n                currentTimeNode.text(event[EVENT_UPD_INFO.CURRENT_TIME]);\n\n            updateScore(eventNode, event);\n\n            //dopCoefCounters\n            var NECESSARY_COEF_COUNTERS = 5;\n            if (\n                eventNode.find(selectors.tbDopCoefCounter + '.m-0').text() !==\n                event[EVENT_UPD_INFO.DOP_COEF_COUNTER].toString()\n            ) {\n                eventNode\n                    .find(selectors.tbDopCoefCounter + '.m-0')\n                    .text(event[EVENT_UPD_INFO.DOP_COEF_COUNTER]);\n                if (event[EVENT_UPD_INFO.DOP_COEF_COUNTER] >= 0) {\n                    for (\n                        var index = 0;\n                        index < NECESSARY_COEF_COUNTERS;\n                        index++\n                    ) {\n                        eventNode\n                            .find(selectors.tbDopCoefCounter + '.m-' + index)\n                            .text(event[EVENT_UPD_INFO.DOP_COEF_COUNTER]);\n                    }\n                }\n            }\n\n            //isActive (isOver included)\n            if (!!event[EVENT_UPD_INFO.IS_ACTIVE]) {\n                eventNode.removeClass('m-blocked');\n            } else {\n                eventNode.addClass('m-blocked');\n                continue;\n            }\n\n            //coefs\n            var isEventExpanded = eventNode.hasClass('m-expanded');\n            eventNode.find(selectors.tbCell).each(function (ind) {\n                var cellNode = $(this),\n                    coefTypeId = cellNode.data('ctid'),\n                    newCoef = event[COEF_UPD_INFO.SELF].filter(\n                        selectByCoefTypeId(coefTypeId)\n                    )[0];\n\n                if (!newCoef) {\n                    if (!cellNode.hasClass('m-empty')) {\n                        let oid = parseInt(cellNode.attr('data-oid'));\n                        if (!isNaN(oid)) {\n                            let externalUpdateData = externalUpdatedCoefs[oid];\n                            if (\n                                !!externalUpdateData &&\n                                externalUpdateData.aidTo ===\n                                    externalUpdateData.aidFrom &&\n                                externalUpdateData.isActive\n                            ) {\n                                return true;\n                            }\n                        }\n\n                        cellNode\n                            .attr('data-aid', null)\n                            .attr('data-oid', null)\n                            .attr('id', null)\n                            .text(EMPTY_COEF)\n                            .addClass('m-empty')\n                            .removeClass('active m-txt');\n                    }\n                } else {\n                    if (!newCoef[COEF_UPD_INFO.ACTUAL_ID])\n                        newCoef[COEF_UPD_INFO.ACTUAL_ID] =\n                            newCoef[COEF_UPD_INFO.ORIGINAL_ID];\n\n                    if (!!newCoef[COEF_UPD_INFO.IS_COEF_VALUE]) {\n                        let externalUpdateData =\n                            externalUpdatedCoefs[\n                                newCoef[COEF_UPD_INFO.ORIGINAL_ID]\n                            ];\n                        if (externalUpdateData !== undefined) {\n                            if (\n                                externalUpdateData.aidTo >\n                                newCoef[COEF_UPD_INFO.ACTUAL_ID]\n                            ) {\n                                return true;\n                            } else if (\n                                externalUpdateData.aidTo ===\n                                    newCoef[COEF_UPD_INFO.ACTUAL_ID] &&\n                                externalUpdateData.aidTo ===\n                                    externalUpdateData.aidFrom\n                            ) {\n                                let isActiveCurrent =\n                                    !cellNode.hasClass('m-empty');\n                                if (\n                                    isActiveCurrent ===\n                                    externalUpdateData.isActive\n                                ) {\n                                    return true;\n                                }\n                            }\n                            delete externalUpdatedCoefs[\n                                newCoef[COEF_UPD_INFO.ORIGINAL_ID]\n                            ];\n                        }\n\n                        if (newCoef[COEF_UPD_INFO.VALUE] > 1) {\n                            let currentTextFloat = parseFloat(cellNode.attr('data-coefvalue'));\n                            if ( currentTextFloat !== newCoef[COEF_UPD_INFO.VALUE]) {\n                                cellNode\n                                    .attr('data-aid', newCoef[COEF_UPD_INFO.ACTUAL_ID])\n                                    .attr('data-oid', newCoef[COEF_UPD_INFO.ORIGINAL_ID])\n                                    .attr('id', 'tcell_' + newCoef[COEF_UPD_INFO.ORIGINAL_ID])\n                                    .attr('data-coefvalue', newCoef[COEF_UPD_INFO.VALUE].toFixed(2))\n                                    .html(\n                                        '<span class=\"coef-animation-text\">' +\n                                            window.Utils.displayCoefValue(newCoef[COEF_UPD_INFO.VALUE]) +\n                                        '</span>'\n                                    );\n\n                                if (cellNode.hasClass('m-empty')) {\n                                    cellNode.removeClass('m-empty');\n                                } else if (!isEventExpanded) {\n                                    animateCellChange(\n                                        cellNode,\n                                        newCoef[COEF_UPD_INFO.VALUE] >\n                                            currentTextFloat\n                                    );\n                                }\n                                isInCart(newCoef[COEF_UPD_INFO.ORIGINAL_ID])\n                                    ? cellNode.addClass('active')\n                                    : cellNode.removeClass('active');\n                            }\n                        } else {\n                            if (!cellNode.hasClass('m-empty')) {\n                                cellNode\n                                    .attr('data-aid', null)\n                                    .attr('data-oid', null)\n                                    .attr('id', null)\n                                    .text(EMPTY_COEF)\n                                    .addClass('m-empty')\n                                    .removeClass('active');\n                            }\n                        }\n                    } else {\n                        if (cellNode.attr('data-coefvalue') !== newCoef[COEF_UPD_INFO.TEXT_VALUE]) {\n                            cellNode\n                                .attr('data-aid', null)\n                                .attr('data-coefvalue', newCoef[COEF_UPD_INFO.TEXT_VALUE])\n                                .text(newCoef[COEF_UPD_INFO.TEXT_VALUE])\n                                .addClass('m-txt')\n                                .removeClass('m-empty');\n                        }\n                    }\n                }\n            });\n        }\n        app.console.timeEnd('Fetched(Light)');\n    }\n\n    var handleFullFetch = (function () {\n        var oldResults;\n        return {\n            preProc: function () {\n                oldResults = [];\n                $(selectors.betPlace)\n                    .find(selectors.tbCell + '[data-oid]')\n                    .each(function () {\n                        oldResults[$(this).data('oid')] = $(this).text().trim();\n                    });\n            },\n            postProc: function () {\n                var avaliableCells = $(selectors.betPlace).find(\n                    selectors.tbEvent +\n                        ':not(.m-blocked) ' +\n                        selectors.tbCell +\n                        '[data-oid]'\n                );\n                for (key in oldResults) {\n                    var cellNode = avaliableCells\n                        .filter('[data-oid=' + key + ']')\n                        .first();\n                    if (!cellNode) continue;\n                    var currentText = cellNode.attr('data-coefvalue');\n                    if (currentText === oldResults[key]) continue;\n                    animateCellChange(cellNode, currentText > oldResults[key]);\n                }\n                oldResults = [];\n            },\n        };\n    })();\n\n    var fullIntervalId, lightIntervalId;\n    var fullInterval = 30 * 1000,\n        lightInterval = globalAppSettings.lightFetchTimeout;\n\n    var fullUrl = undefined;\n    var currentSportType;\n    const fullStandardUrl = '/Live/UpdateBetPlace',\n        fullFavoritesUrl = '/Live/UpdateFavoritesBetPlace',\n        lightUrlEventService = globalAppSettings.api.prematchServiceUrl + '/api/live/table/fetch',\n        lightUrlDiffFetch = globalAppSettings.api.prematchServiceUrl + '/api/live/table/fetch/diff';\n\n    const isDiffFetchEnabled = globalAppSettings.isDiffLightFetchEnabled;\n\n    function fullFetch() {\n        if (fullUrl === undefined) {\n            return;\n        }\n\n        var requestData = {};\n        if (currentSportType !== undefined) {\n            requestData.sportType = currentSportType;\n        }\n\n        stopLight();\n        //handleFullFetch.preProc();\n\n        Ajax.getJson(fullUrl, {\n            data: requestData,\n            success: function () {\n                app.ModeTableLive.update();\n                app.ModeTableLive.count() === 0\n                    ? $(selectors.emptyBetplace).addClass('active')\n                    : $(selectors.emptyBetplace).removeClass('active');\n\n                //handleFullFetch.postProc();\n                app.VerticalMenu.dispose();\n                app.VerticalMenu.init();\n                log('Fetched(Full)');\n                startLight();\n                document.dispatchEvent(new CustomEvent('updateLiveTable'));\n            },\n        });\n    }\n\n    var errorsLeft = 3;\n    function lightFetchEventService() {\n        if (app.ModeTableLive.count() === 0) {\n            log('Nothing to Fetch(Light)');\n            return;\n        }\n\n        if (!isLightReady) {\n            log('Not Ready: Fetch(Light)');\n        } else {\n            isLightReady = false;\n            $.ajax({\n                method: 'GET',\n                async: true,\n                xhrFields: {\n                    withCredentials: true,\n                },\n                beforeSend: function (request) {\n                    request.setRequestHeader('bb_appSource', globalAppSettings.api.appSource);\n                    request.setRequestHeader('bb_lang', globalAppSettings.lang);\n                },\n                url: lightUrlEventService,\n                success: function (data) {\n                    handleLightFetch(data);\n                    data = null;\n                    isLightReady = true;\n                },\n                error: function (data) {\n                    log('LIGHTFETCH ERROR!', data);\n                    if (errorsLeft-- <= 0) {\n                        Ajax.redirect('/live');\n                    }\n                    isLightReady = true;\n                },\n            });\n        }\n    }\n\n\n    var lastRequestTime;\n    function lightFetchDiff() {\n        if (app.ModeTableLive.count() === 0) {\n            log('Nothing to Fetch(Light)');\n            return;\n        }\n\n        if (!isLightReady) {\n            log('Not Ready: DiffFetch(Light)');\n        } else {\n            isLightReady = false;\n            $.ajax({\n                method: 'GET',\n                async: true,\n                xhrFields: {\n                    withCredentials: true,\n                },\n                data: { lrt: lastRequestTime },\n                beforeSend: function (request) {\n                    request.setRequestHeader('bb_appSource', globalAppSettings.api.appSource);\n                    request.setRequestHeader('bb_lang', globalAppSettings.lang);\n                },\n                url: lightUrlDiffFetch,\n                success: function (data) {\n                    lastRequestTime = Math.floor(new Date().getTime() / 1000);\n                    handleLightFetch(data);\n                    data = null;\n                    isLightReady = true;\n                },\n                error: function (data) {\n                    log('DIFF FETCH ERROR!', data);\n                    if (errorsLeft-- <= 0) {\n                        Ajax.redirect('/live');\n                    }\n                    isLightReady = true;\n                },\n            });\n        }\n    }\n\n    function stopFull() {\n        clearInterval(fullIntervalId);\n        log('FULL_UPD STOP');\n    }\n\n    function startFull() {\n        clearInterval(fullIntervalId);\n        fullIntervalId = setInterval(fullFetch, fullInterval);\n        //log('FULL_UPD START');\n    }\n\n    function stopLight() {\n        clearInterval(lightIntervalId);\n        log('LIGHT_UPD STOP');\n        isLightReady = false;\n    }\n\n    function startLight() {\n        isLightReady = true; //TODO: look back in history.\n        clearInterval(lightIntervalId);\n        if (isDiffFetchEnabled)\n            lightIntervalId = setInterval(lightFetchDiff, lightInterval);\n        else\n            lightIntervalId = setInterval(lightFetchEventService, lightInterval);\n        log('LIGHT_UPD START');\n    }\n\n    function refreshFullFetch() {\n        stopFull();\n        startFull();\n    }\n\n    var stop = function () {\n        stopFull();\n        stopLight();\n    };\n\n    var start = function () {\n        startLight();\n        startFull();\n    };\n\n    var setMode = {\n        standard: function () {\n            fullUrl = fullStandardUrl;\n        },\n        favorites: function () {\n            fullUrl = fullFavoritesUrl;\n        },\n        standartSingleSport: function (sportType) {\n            fullUrl = fullStandardUrl;\n            currentSportType = sportType;\n        },\n    };\n\n    return {\n        start: start,\n        stop: stop,\n        full: fullFetch,\n        refreshFull: refreshFullFetch,\n        blink: animateCellChange,\n        updateCoef: externalUpdateCoef,\n        setMode: setMode,\n    };\n})();\n","BinderPrematch = window.BinderPrematch = (function () {\n    const selectors = {\n\n        vmSelectAll: '#sports-filter__select-all',\n        vmSportsFilterItem: '.j-sports-filter-item',\n        vmSportsFilterSelectButton: '.j-sports-filter-item-select-button',\n        vmSportsFilterLinkButton: '.j-sports-filter-item-link-button',\n        vmSportsFilterItemsContainer: '#vm-sports-filter-items',\n\n        tbTable: '.events-table',\n        tbEvent: '.events-table__body-row',\n        searchEvent: '[search-event]',\n\n        tbFavstar: '[tb-favstar]',\n        searchFavstar: '[search-favstar]',\n\n\n        emptyBetplace: '#empty_betplace',\n\n        tbSport: '.events-table',\n        tbExpandSport: '.js-expand-table',\n        tbExpandHotTable: '.js-expand-hot-table',\n        tbLeague: '.js-expand-league',\n        tbHotEvents: '.js-expand-hot-events',\n        tbLeagueBody: '.events-table__group-body',\n\n        cmTimeOffset: '#cm-time_offset',\n\n        pageScrollbarContainer: '#m-page-content-scrollbar-scrollarea',\n\n        removeAll: '#prematch_favs-remove_all'\n    };\n\n    var vmSelectedClass = 'm-selected';\n\n\n    var bindUI = function () {\n        var body = app.body;\n\n        // Toggle SportFilterItem v2.0\n        body.on('click', selectors.vmSportsFilterItem + '[data-id]', function (e) {\n            e.stopImmediatePropagation();\n            e.preventDefault();\n\n            var container = $(this),\n                id = container.data('id');\n\n            var isAllChecked = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem + ':not(.m-selected)').length > 0 ? false : true;\n            var filterItemsLength = $(selectors.vmSportsFilterItem).length;\n\n            if (isAllChecked && filterItemsLength > 1) {\n                container.addClass('m-loading');\n                Ajax.postJson(\"/Prematch/EnableOnlyOneItem\", {\n                    data: {\n                        id: id\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function (resp) {\n                        app.ModeTablePrematch.update();\n                        $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem).removeClass('m-selected');\n                        $(selectors.vmSelectAll).prop('checked', false);\n                        container.addClass('m-selected');\n\n                        app.ModeTablePrematch.insertTable(resp.html);\n\n                        container.removeClass('m-loading');\n                    }\n                });\n            } else {\n                toggleSportsFilterItem(id, container);\n            }\n\n            return false;\n        });\n\n        // Toggle SportFilter v3.0\n        body.on('click', selectors.vmSelectAll, function () {\n            const selectedClass = 'm-selected';\n\n            var that = $(this),\n                removingAll = !that.prop('checked'),\n                allItems = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem);\n\n            that.parent().parent().addClass('m-loading');\n            Ajax.postJson(\"/Prematch/ToggleSportFilter\", {\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTablePrematch.update();\n                    if (removingAll) {\n                        that.prop('checked', false);\n                        allItems.removeClass(selectedClass);\n                    }\n                    else {\n                        that.prop('checked', true);\n                        allItems.addClass(selectedClass);\n                    }\n\n                    (app.ModeTablePrematch.isEmpty())\n                        ? $(selectors.emptyBetplace).addClass('active')\n                        : $(selectors.emptyBetplace).removeClass('active');\n\n                    that.parent().parent().removeClass('m-loading');\n                }\n            });\n            return false;\n        });\n\n        // Toggle SportTable v2.5\n        body.on('click', selectors.tbExpandSport, function () {\n            var that = $(this).closest('.events-table'),\n                id = that.data('id');\n\n            that.addClass('m-loading');\n            if (that.hasClass('m-expanded')) {\n                Ajax.postJson('/Prematch/CollapseNode', {\n                    data: { id: id },\n                    doCallAjaxViewParsers: false,\n                    success: function () {\n\t\t\t\t\t\tthat.removeClass('m-expanded').addClass('m-collapsed');\n                        app.ModeTablePrematch.collapseTable(id);\n                        that.removeClass('m-loading');\n                    }\n                });\n                return false;\n            }\n\n            Ajax.postJson('/Prematch/ExpandSportsTable', {\n                data: { id: id, groups: app.getUrlParams('groups') },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTablePrematch.updateTable(id);\n                    that.removeClass('m-loading');\n                }\n            });\n            return false;\n        });\n\n        var processCollapseNodes = function(nodes) {\n            for (var i = 0; i < nodes.length; i++) {\n                //league/hotgroups\n                var that = $('.events-table__group[data-id=' + nodes[i] + ']');\n                that.find(selectors.tbLeagueBody).remove();\n                that.removeClass('m-expanded').addClass('m-collapsed');\n                app.ModeTablePrematch.shrinkTable(nodes[i]);\n            }\n        };\n\n        body.on('click', selectors.tbExpandHotTable, function () {\n            var that = $(this).closest('.events-table'),\n                id = that.data('id');\n\n            that.addClass('m-loading');\n            if (that.hasClass('m-expanded')) {\n                Ajax.postJson('/Prematch/CollapseHotTable', {\n                    data: {},\n                    doCallAjaxViewParsers: false,\n                    success: function () {\n                        that.removeClass('m-expanded').addClass('m-collapsed');\n                        app.ModeTablePrematch.collapseTable(id);\n                        that.removeClass('m-loading');\n                    }\n                });\n                return false;\n            }\n\n            Ajax.postJson('/Prematch/ExpandHotTable', {\n                data: {},\n                doCallAjaxViewParsers: false,\n                success: function (data) {\n                    app.ModeTablePrematch.updateTable(id);\n                    that.removeClass('m-loading');\n\n                    processCollapseNodes(data.CollapseNodes);\n                }\n            });\n            return false;\n        });\n\n        // Toggle League v2.5\n        body.on('click', selectors.tbLeague, function (e) {\n            e.stopImmediatePropagation();\n            e.preventDefault();\n\n            var that = $(this).closest('.events-table__group'),\n                id = that.data('id'),\n                tId = that.closest(selectors.tbSport).data('id');\n\n            that.addClass('m-loading');\n            if (that.hasClass('m-expanded')) {\n                Ajax.postJson('/Prematch/CollapseNode', {\n                    data: {\n                        id: id\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function () {\n                        that.removeClass('m-expanded').addClass('m-collapsed');\n                        that.find(selectors.tbLeagueBody).remove();\n                        app.ModeTablePrematch.shrinkTable(tId);\n                        that.removeClass('m-loading');\n                    }\n                });\n                return false;\n            }\n            Ajax.postJson('/Prematch/ExpandLeague', {\n                data: { id: id },\n                doCallAjaxViewParsers: false,\n                success: function (data) {\n                    app.ModeTablePrematch.extendTable(tId);\n                    that.removeClass('m-loading');\n\n                    processCollapseNodes(data.CollapseNodes);\n                }\n            });\n            return false;\n        });\n\n        body.on('click', selectors.tbHotEvents, function () {\n            var that = $(this).closest('.events-table__group'),\n                id = that.closest(selectors.tbSport).data('id');\n\n            that.addClass('m-loading');\n            if (that.hasClass('m-expanded')) {\n                Ajax.postJson('/Prematch/CollapseHotEvents', {\n                    data: {\n                        id: id\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function () {\n                        that.removeClass('m-expanded').addClass('m-collapsed');\n                        that.find(selectors.tbLeagueBody).remove();\n                        app.ModeTablePrematch.shrinkTable(id);\n                        that.removeClass('m-loading');\n                    }\n                });\n                return false;\n            }\n            Ajax.postJson('/Prematch/ExpandHotEvents', {\n                data: { id: id, groups: app.getUrlParams('groups') },\n                doCallAjaxViewParsers: false,\n                success: function (data) {\n                    app.ModeTablePrematch.extendTable(id);\n                    that.removeClass('m-loading');\n\n                    processCollapseNodes(data.CollapseNodes);\n                }\n            });\n            return false;\n        });\n\n\n        // Set TimeOffset v2.0\n        body.on('change', selectors.cmTimeOffset, function () {\n            Ajax.postJson(\"/Prematch/SetTimeOffset\", {\n                data: { to: $(this).val(), groups: app.getUrlParams('groups') },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTablePrematch.update();\n                    (app.ModeTablePrematch.isEmpty()) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                }\n            });\n            return false;\n        });\n\n        // Fave event v3.0\n        body.on('click', (selectors.tbFavstar + ',' + selectors.searchFavstar), function (e) {\n\n            var that = $(this),\n                isRemovingFromFav = that.hasClass('m-active'),\n                eventId = (that.is(selectors.tbFavstar)) ? that.closest(selectors.tbEvent).data('id') : that.closest(selectors.searchEvent).data('id'),\n                dataIdFilter = '[data-id=' + eventId + ']',\n                allStars = $.merge($(selectors.tbEvent + dataIdFilter).find(selectors.tbFavstar), $(selectors.searchEvent + dataIdFilter).find(selectors.searchFavstar));\n\n            that.addClass('m-loading');\n            Ajax.postJson(isRemovingFromFav ? \"/Prematch/UnFaveEvent\" : \"/Prematch/FaveEvent\", {\n                data: {\n                    id: eventId\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    if (resp && resp.Message) {\n                        that.removeClass('m-active');\n                        Tooltip.errorNode(that, resp.Message);\n                        that.removeClass('m-loading');\n                        return;\n                    }\n\n                    if (isRemovingFromFav) {\n                        allStars.removeClass('m-active');\n                        allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_10', 'Добавить в избранное'));\n                    }\n                    else {\n                        allStars.addClass('m-active');\n                        allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_11', 'Удалить из избранного'));\n                    }\n\n                    app.VerticalMenu.changeFavorites();\n\n                    that.removeClass('m-loading');\n                },\n            });\n\n            return;\n        });\n    };\n\n    var bindFavoritesUI = function () {\n        // Fave event v3.0\n        app.body.on('click', (selectors.tbFavstar + ',' + selectors.searchFavstar), function (e) {\n\n            var that = $(this),\n                isRemovingFromFav = that.hasClass('m-active'),\n                eventId = (that.is(selectors.tbFavstar)) ? that.closest(selectors.tbEvent).data('id') : that.closest(selectors.searchEvent).data('id'),\n                dataIdFilter = '[data-id=' + eventId + ']',\n                allStars = $.merge($(selectors.tbEvent + dataIdFilter).find(selectors.tbFavstar), $(selectors.searchEvent + dataIdFilter).find(selectors.searchFavstar));\n\n            that.addClass('m-loading');\n            Ajax.postJson(isRemovingFromFav ? \"/Prematch/UnFaveEvent\" : \"/Prematch/FaveEvent\", {\n                data: {\n                    id: eventId,\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    if (resp && resp.Message) {\n                        that.removeClass('m-active');\n                        Tooltip.errorNode(that, resp.Message);\n                        that.removeClass('m-loading');\n                        return;\n                    }\n\n                    if (isRemovingFromFav) {\n                        allStars.removeClass('m-active');\n                        var currentEvent = $(selectors.tbEvent + dataIdFilter),\n                            parentTable = currentEvent.closest(selectors.tbTable);\n\n                        if (parentTable.find(selectors.tbEvent).length <= 1) {\n                            ModeTablePrematch.removeTable(parentTable.data('id'));\n\n                            if (app.ModeTablePrematch.isEmpty()) {\n                                $(selectors.emptyBetplace).addClass('active')\n                                $(selectors.removeAll).hide();\n                            } else {\n                                $(selectors.emptyBetplace).removeClass('active');\n                            };\n\n                        }\n                        else {\n                            currentEvent.remove();\n                        }\n                        that.removeClass('m-loading');\n                    }\n                    else {\n                        allStars.addClass('m-active');\n                        Ajax.getJson(\"/Prematch/UpdateFavoritesBetPlace\", {\n                            success: function () {\n                                app.ModeTablePrematch.update();\n                                that.removeClass('m-loading');\n                                $(selectors.emptyBetplace).removeClass('active');\n                                $(selectors.removeAll).show();\n                            }\n                        });\n\n                    }\n                    app.VerticalMenu.changeFavorites();\n                },\n            });\n\n            return false;\n        });\n\n        ConfirmButton.init(\n            selectors.removeAll,\n            function () { },\n            '/Prematch/UnFaveAll',\n            function (resp) {\n                app.ModeTablePrematch.destroyTables();\n\n                if (app.ModeTablePrematch.isEmpty()) {\n                    $(selectors.emptyBetplace).addClass('active')\n                    $(selectors.removeAll).hide()\n                } else {\n                    $(selectors.emptyBetplace).removeClass('active');\n                    $(selectors.removeAll).show();\n                };\n\n                app.VerticalMenu.changeFavorites();\n            }\n        );\n\n        (app.ModeTablePrematch.isEmpty()) ? $(selectors.removeAll).hide() : $(selectors.removeAll).show();\n    };\n\n    var unBindUI = function () {\n        app.body\n            .off('click', selectors.vmSportsFilterItem + '[data-id]')\n            .off('click', selectors.vmSelectAll)\n            .off('click', selectors.tbExpandSport)\n            .off('click', selectors.tbLeague)\n            .off('click', selectors.tbExpandHotTable)\n            .off('click', selectors.tbHotEvents)\n\n            .off('click', (selectors.tbFavstar + ',' + selectors.searchFavstar))\n            .off('change', selectors.cmTimeOffset);\n\n        ConfirmButton.dispose(selectors.removeAll);\n\n    };\n\n    var toggleSportsFilterItem = function (id, sportsFilterItemContainer, callback) {\n        var removing = sportsFilterItemContainer.hasClass(vmSelectedClass),\n            allItems = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem),\n            selectAllbtn = $(selectors.vmSelectAll);\n\n        sportsFilterItemContainer.addClass('m-loading');\n        Ajax.postJson(\"/Prematch/ToggleSportFilterItem\", {\n            data: {\n                id: id,\n            },\n            doCallAjaxViewParsers: false,\n            success: function (resp) {\n                if (removing) {\n                    app.ModeTablePrematch.removeTable(id);\n                    sportsFilterItemContainer.removeClass(vmSelectedClass);\n                }\n                else {\n                    if (resp.isempty && app.ModeTablePrematch.isEmpty()) {\n                        $(selectors.emptyBetplace).fadeOut(150, function () { $(selectors.emptyBetplace).fadeIn(150); });\n                    }\n                    else {\n                        var prevFilter = sportsFilterItemContainer.prevAll('.' + vmSelectedClass);\n                        var insertAfterId = (prevFilter.length !== 0) ? prevFilter.data('id') : undefined;\n                        app.ModeTablePrematch.insertTable(resp.html, insertAfterId);\n                    }\n                    sportsFilterItemContainer.addClass(vmSelectedClass);\n                }\n\n                selectAllbtn.prop('checked', (allItems.filter('.' + vmSelectedClass).length === allItems.length));\n                (app.ModeTablePrematch.isEmpty()) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n\n                sportsFilterItemContainer.removeClass('m-loading');\n\n                if(callback) callback();\n            }\n        });\n    }\n\n    var scrollToTable = function(id) {\n        var table = $(selectors.tbTable).filter('[data-id=\"' + id + '\"]');\n\n        if (table.length > 0) {\n            $(selectors.pageScrollbarContainer).scrollTop(table.position().top - 40);\n        }\n    }\n\n    var bind = function(justLoaded) { bindUI(); }\n    var bindFavorites = function(justLoaded) { bindFavoritesUI(); }\n    var unBind = function () { unBindUI(); }\n\n    return {\n        bind: bind,\n        bindFavorites: bindFavorites,\n        unBind: unBind,\n        name: 'BinderPrematch',\n        url: '/Prematch/GetViewSet'\n    };\n\n}());\n\n\nScopePrematch = (function () {\n    function init() {\n        app.VerticalMenu.init();\n        app.ModeTablePrematch.init();\n        app.Search.init('prematch');\n    }\n\n    function dispose() {\n        app.ModeTablePrematch.dispose();\n        app.VerticalMenu.dispose();\n    }\n\n    var start = function (justLoaded) { init(); };\n    var stop = function () { dispose(); };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopePrematch',\n        url: 'PREMATCH',\n        title: Localization.getString('Shared.Prematch', 'Линия')\n    };\n}());\n","BinderPrematchFavorites = window.BinderPrematchFavorites = (function () {\n    return {\n        bind: BinderPrematch.bindFavorites,\n        unBind: BinderPrematch.unBind,\n        name: 'BinderPrematchFavorites',\n        url: '/Prematch/GetFavoritesViewSet'\n    };\n}());\n\n\nScopePrematchFavorites = window.ScopePrematchFavorites = (function () {\n    return {\n        start: ScopePrematch.start,\n        stop: ScopePrematch.stop,\n        name: 'ScopePrematchFavorites',\n        url: '/PREMATCH/FAVORITES',\n        title: Localization.getString('Shared.FavoritePrematch','Линия: Избранное')\n    };\n}());","BinderPrematchSingleSport = window.BinderPrematchSingleSport = (function () {\n    const selectors = {\n\n        vmSelectAll: '#sports-filter__select-all',\n        vmSportsFilterItem: '.sports-filter__item',\n        vmSportsFilterItemsContainer: '#vm-sports-filter-items',\n\n        tbTable: '.events-table',\n        tbEvent: '.events-table__body-row',\n        searchEvent: '[search-event]',\n\n        tbFavstar: '[tb-favstar]',\n        searchFavstar: '[search-favstar]',\n\n\n        emptyBetplace: '#empty_betplace',\n\n        tbSport: '.events-table',\n        tbExpandSport: '.js-expand-table',\n        tbLeague: '.js-expand-league',\n        tbLeagueBody: '.mode-table__group-body',\n\n        cmTimeOffset: '#cm-time_offset',\n    };\n\n    var sportType;\n\n    var bindUI = function () {\n        var body = app.body;\n\n        // Toggle League v2.5\n        body.on('click', selectors.tbLeague, function () {\n            var that = $(this).closest('.events-table__group'),\n                id = that.data('id'),\n                tId = that.closest(selectors.tbSport).data('id');\n\n            app.enableLoading();\n            if (that.hasClass('m-expanded')) {\n                Ajax.postJson('/Prematch/CollapseNode', {\n                    data: {\n                        id: id,\n                        sportType: sportType\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function () {\n                        that.removeClass('m-expanded').addClass('m-collapsed');\n                        that.find(selectors.tbLeagueBody).remove();\n                        app.ModeTablePrematch.shrinkTable(tId);\n                        app.disableLoading();\n                    }\n                });\n                return false;\n            }\n            Ajax.postJson('/Prematch/ExpandLeague', {\n                data: {\n                    id: id,\n                    sportType: sportType\n                },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTablePrematch.extendTable(tId);\n                    app.disableLoading();\n                }\n            });\n            return false;\n        });\n\n\n        // Set TimeOffset v2.0\n        body.on('change', selectors.cmTimeOffset, function () {\n            app.enableLoading();\n            Ajax.postJson(\"/Prematch/SetTimeOffset\", {\n                data: {\n                    to: $(this).val(),\n                    sportType: sportType\n                },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTablePrematch.update();\n                    app.disableLoading();\n                    (app.ModeTablePrematch.isEmpty()) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n                }\n            });\n            return false;\n        });\n\n        // Fave event v3.0\n        body.on('click', (selectors.tbFavstar + ',' + selectors.searchFavstar), function (e) {\n\n            var that = $(this),\n                isRemovingFromFav = that.hasClass('m-active'),\n                eventId = (that.is(selectors.tbFavstar)) ? that.closest(selectors.tbEvent).data('id') : that.closest(selectors.searchEvent).data('id'),\n                dataIdFilter = '[data-id=' + eventId + ']',\n                allStars = $.merge($(selectors.tbEvent + dataIdFilter).find(selectors.tbFavstar), $(selectors.searchEvent + dataIdFilter).find(selectors.searchFavstar));\n\n            app.enableLoading();\n            Ajax.postJson(isRemovingFromFav ? \"/Prematch/UnFaveEvent\" : \"/Prematch/FaveEvent\", {\n                data: {\n                    id: eventId\n                },\n                doCallAjaxViewParsers: false,\n                success: function (resp) {\n                    if (resp && resp.Message) {\n                        that.removeClass('m-active');\n                        Tooltip.errorNode(that, resp.Message);\n                        that.removeClass('m-loading');\n                        return;\n                    }\n\n                    if (isRemovingFromFav) {\n                        allStars.removeClass('m-active');\n                        allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_10', 'Добавить в избранное'));\n                    }\n                    else {\n                        allStars.addClass('m-active');\n                        allStars.attr('bb-tool', window.Localization.getString('Scripts_Shared_Main.Accent_11', 'Удалить из избранного'));\n                    }\n\n                    app.VerticalMenu.changeFavorites();\n\n                    app.disableLoading();\n                },\n            });\n\n            return;\n        });\n    };\n\n\n    var unBindUI = function () {\n        app.body\n            .off('click', selectors.tbLeague)\n            .off('click', (selectors.tbFavstar + ',' + selectors.searchFavstar))\n            .off('change', selectors.cmTimeOffset);\n    };\n\n    function setScopeData(scopeData) {\n        if (scopeData != undefined && scopeData.hasOwnProperty('sportType')) {\n            sportType = scopeData.sportType;\n        }\n    }\n\n    var bind = function (justLoaded, scopeData) { setScopeData(scopeData); bindUI(); }\n    var unBind = function () { unBindUI(); }\n\n    return {\n        bind: bind,\n        unBind: unBind,\n        name: 'BinderPrematchSingleSport',\n        url: BinderPrematch.url\n    };\n}());\n\n//-----------------------------------\n\nScopePrematchSingleSport = (function () {\n\n    var sportType;\n\n    function init() {\n        app.VerticalMenu.init();\n        app.ModeTablePrematch.init();\n        app.Search.init('prematchSingleSport', { sportType: sportType });\n    }\n\n    function dispose() {\n        app.ModeTablePrematch.dispose();\n        app.VerticalMenu.dispose();\n    }\n\n    var start = function (justLoaded, scopeData) { sportType = scopeData.sportType; init(); };\n    var stop = function () { dispose(); };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopePrematchSingleSport',\n        url: 'PREMATCH/SPORT'\n    };\n}());\n","window.ModeTablePrematch = (function () {\n\n    const selectors = {\n        betPlace: '#bet-place',\n        table: '.events-table',\n        tbHeader: '.events-table__header',\n        resultsLine: '[tb-resline]',\n        event: '.events-table__body-row',\n        eventTitle: '.events-table__title',\n\t\teventAllCoefsCount: '.events-table__all-coefs-count',\n        expandAllCoefsButton: '.js-expand-all-coefs',\n        cell: '.events-table__markets-cell',\n        scrollbarContentWrapper: '.m-page-content-scrollbar > .awesome-scrollbar__content-wrapper',\n\n        eventCoefs: '.events-table__row-coefs',\n        oeCell: '.event-markets__coef',\n        oeList: '#oe-market_list',\n        oeMarket: '.event-markets__item',\n    };\n\n    const topHeight = {\n        bannerHeight: $('#mobile-app-banner').height(),\n        headHeight: $('#app-header').height(),\n        headerWithBanner: null\n    };\n    topHeight.headerWithBanner = topHeight.bannerHeight + topHeight.headHeight;\n\n    var Table = (function () {\n        var Table = function (domTable) {\n            this.domTable = domTable;\n\n            this.id = this.domTable.data('id');\n            this.isExpanded = this.domTable.hasClass('m-expanded');\n\n            if (this.isExpanded) {\n                this.header = this.domTable.find(selectors.tbHeader);\n                this.showHighlightBtn = this.domTable.find('[prematch-show-highlight-popup]');\n\n                this.setHighlightingAvaliability();\n                this.hType = this.getConfig().hType || 'None';\n                this.highlight();\n\n                this.bindUI();\n                SPA.updatePageLinks();\n            }\n        };\n\n        Table.prototype.getConfig = function () {//TODO: слишком много лишнего чтения стораджа при нескольких таблицах. поднять общий конфиг на уровень выше.\n            var storageData = sessionStorage.getItem('tableConfig'),\n                tableConfig = {};\n\n            if (storageData) {\n                storageData = JSON.parse(storageData);\n\n                if (storageData.hasOwnProperty(this.id))\n                    tableConfig = storageData[this.id];\n            }\n\n            return tableConfig;\n        }\n\n        Table.prototype.setConfig = function (data) {\n            var storageData = sessionStorage.getItem('tableConfig');\n\n            if (storageData) {\n                storageData = JSON.parse(storageData);\n            } else {\n                storageData = {};\n            }\n\n            storageData[this.id] = data;\n            sessionStorage.setItem('tableConfig', JSON.stringify(storageData));\n        }\n\n        Table.prototype.updateConfig = function (data) {\n            var tableConfig = this.getConfig();\n\n            for (key in data) {\n                tableConfig[key] = data[key];\n            }\n\n            this.setConfig(data);\n        }\n\n        Table.prototype.setHType = function (hType) {\n            this.updateConfig({\n                hType: hType\n            });\n            this.hType = hType;\n        };\n\n        Table.prototype.bindUI = function () {\n            var self = this;\n\n\n            this.showHighlightBtn.off('click').on('click', function () {\n                if (window.Highlight) {\n\n                    window.Highlight.show($(this), self.hType, function (newHType) {\n                        self.setHType(newHType);\n                        self.highlight();\n                    });\n\n                }\n            });\n\n        };\n\n        Table.prototype.extend = function () {\n            this.setHighlightingAvaliability();\n            this.hType = this.getConfig().hType || 'None';\n            this.highlight();\n        };\n\n        Table.prototype.shrink = function () {\n            this.setHighlightingAvaliability();\n        }\n\n        Table.prototype.collapse = function () {\n            this.header.css({\n                transform: 'translateY(0)'\n            });\n            delete this.header;\n            delete this.showHighlightBtn;\n        };\n\n        Table.prototype.highlight = function () {\n            const _str1 = '1', _strX = 'x', _str2 = '2', _strT = window.Localization.getString('Scripts_Shared_Main.ModeTablePrematch_12', 'тотал'), _strB = window.Localization.getString('Scripts_Shared_Main.ModeTablePrematch_13', 'бол'), _strM = window.Localization.getString('Scripts_Shared_Main.ModeTablePrematch_14', 'мен');\n            const _favHas1x2Ceil = 1.8, _favHas12Ceil = 1.5, _cleFavHas1x2Ceil = 1.4, _cleFavHas12Ceil = 1.2, _highLowCeil = 1.5;\n            var self = this;\n\n            if (self.domTable.hasClass('m-collapsed'))\n                return false;\n\n            self.domTable.find('.hl').removeClass('hl');\n            procTypeGroup();\n\n            function procTypeGroup() {\n                if (self.hType === 'None')\n                    return false;\n\n                var cols = self.domTable.find(selectors.resultsLine + ' ' + selectors.cell);\n                if (!cols.length)\n                    return false;\n\n                var events = self.domTable.find('.mode-table__body .mode-table__center-col--inner');\n                events.each(function () {\n                    procEvent($(this));\n                });\n\n\n                function procEvent(event) {\n                    var has1x2 = has12 = hasTBM = false;\n                    if (self.hType == 'Favorites' || self.hType == 'ClearFavorites') {\n                        var h1 = hx = h2 = false;\n                        cols.each(function () {\n                            var col = $(this);\n                            var colH = col.text().trim().toLowerCase();\n                            var is1 = (colH == _str1), isx = (colH == _strX), is2 = (colH == _str2);\n                            if (is1 || isx || is2) {\n                                var res = event.find(selectors.cell).eq(col.index());\n                                if (res && res.attr('data-oid')) {\n                                    if (is1) h1 = true;\n                                    else if (isx) hx = true;\n                                    else h2 = true;\n                                }\n                            }\n                        });\n                        has1x2 = (h1 && hx && h2);\n                        has12 = (h1 && !hx && h2);\n                    }\n                    else {\n                        var hb = hm = false;\n                        cols.each(function () {\n                            var col = $(this);\n                            var colH = col.text().trim().toLowerCase();\n                            var isB = (colH == _strB), isM = (colH == _strM);\n                            if (isB || isM) {\n                                var res = event.find(selectors.cell).eq(col.index());\n                                if (res && res.attr('data-oid') && res.attr('data-coefvalue') != '-') {\n                                    if (isB) hb = true;\n                                    else hm = true;\n                                }\n                            }\n                        });\n                        hasTBM = (hb && hm);\n                    }\n\n                    event.find(selectors.cell).each(function () {\n                        procCoef($(this));\n                    });\n\n                    function procCoef(coef) {\n                        if (!coef.attr('data-oid'))\n                            return false;\n                        var colTitle = cols.eq(coef.index()).text().trim().toLowerCase();\n                        var coefVal = parseFloat(coef.attr('data-coefvalue'));\n                        if (isNaN(coefVal))\n                            return;\n\n                        switch (self.hType) {\n                            case 'Favorites':\n                                {\n                                    if (has12 || has1x2) {\n                                        var ceiling = (has1x2) ? _favHas1x2Ceil : _favHas12Ceil;\n                                        var is12 = (colTitle == _str1 || colTitle == _str2);\n                                        if (is12 && coefVal <= ceiling)\n                                            hltCoef();\n                                    }\n                                    break;\n                                }\n                            case 'ClearFavorites':\n                                {\n                                    if (has12 || has1x2) {\n                                        var ceiling = (has1x2) ? _cleFavHas1x2Ceil : _cleFavHas12Ceil;\n                                        var is12 = (colTitle == _str1 || colTitle == _str2);\n                                        if (is12 && coefVal <= ceiling)\n                                            hltCoef();\n                                    }\n                                    break;\n                                }\n                            case 'HighMatches':\n                                {\n                                    if (hasTBM && (colTitle == _strB) && coefVal <= _highLowCeil)\n                                        hltCoef();\n                                    break;\n                                }\n                            case 'LowMatches':\n                                {\n                                    if (hasTBM && (colTitle == _strM) && coefVal <= _highLowCeil)\n                                        hltCoef();\n                                    break;\n                                }\n                        }\n\n                        function hltCoef() {\n                            coef.addClass('hl');\n                        }\n                    }\n                }\n            }\n        };\n\n        Table.prototype.setHighlightingAvaliability = function () {\n            (this.domTable.find(selectors.event).length) ? this.showHighlightBtn.removeClass('m-disabled') : this.showHighlightBtn.addClass('m-disabled');\n        };\n\n        return Table;\n    }());\n\n    //----------------------------------------------------\n\n    var tables = {},\n        pageContentScrollTop = 0;\n\n    const isClientCartEnabled = window?.globalAppSettings?.isClientCartEnabled;\n\n    function removeFromCart(oId) {\n        if (isClientCartEnabled) {\n            window.ClientCart.removeOutcome(Number(oId));\n        } else {\n            BettingCart.removeItem(oId);\n        }\n    }\n\n    function addToCart(sData) {\n        if (isClientCartEnabled) {\n            window.ClientCart.addOutcome({\n                oId: Number(sData.oId),\n                eId: Number(sData.eId),\n            });\n        } else {\n            BettingCart.addItem(sData);\n            BettingCart.Highlighting.activate.allScopes();\n        }\n    }\n\n    function highlightCoef() {\n        if (!isClientCartEnabled) BettingCart.Highlighting.activate.table();\n    }\n\n    function bindUI() {\n\n        // Fix Header v3.0\n        if (app.isIE()) {\n            $(selectors.scrollbarContentWrapper).on('scroll.prematchTable', function () {\n                pageContentScrollTop = $(this).scrollTop();\n                fixHeader(pageContentScrollTop);\n            });\n        }\n\n\t\t// Expand Event coefs v3.0\n        app.body.on('click', selectors.expandAllCoefsButton, function () {\n            var eventNode = $(this).closest(selectors.event),\n                coefsNode = eventNode.find(selectors.eventCoefs);\n\n            if (globalAppSettings.isMobileDevice && !globalAppSettings.isMobileDeviceInDesktopMode) {\n\n                if ($('#mobile-app-banner').css('display') == 'none') {\n                    $('.events-table__row-main-info').css('top', topHeight.headHeight);\n                    eventNode.attr('data-filter-sticky', 'ordinaryTop');\n                } else {\n                    $('.events-table__row-main-info').css('top', topHeight.headerWithBanner);\n                    eventNode.attr('data-filter-sticky', 'topWithBanner');\n                }\n            }\n\n\n            if (coefsNode.data('loaded') !== undefined) {\n                eventNode.toggleClass('m-expanded');\n\n\n                if (eventNode.hasClass('m-expanded')) {\n                    let scrollEvent = $(window).scrollTop();\n\n                    eventNode.data('node-saved-top', scrollEvent);\n                } else {\n                    let defaultPosition = eventNode.data('node-saved-top');\n                    let scrollEvent = $(window).scrollTop();\n                    if (defaultPosition == undefined) {\n                        defaultPosition = scrollEvent;\n                    };\n                    let deltaScroll = defaultPosition - scrollEvent; //direction scrollTop\n                    let positionEventBeforeCollapse = $(eventNode).offset().top;\n\n                    //scrollDefaultPosition\n                    if (globalAppSettings.isMobileDevice && !globalAppSettings.isMobileDeviceInDesktopMode) {\n\n                        if ((deltaScroll < 0) && (scrollEvent > defaultPosition) && (scrollEvent > positionEventBeforeCollapse)) {\n                            if ($('#mobile-app-banner').css('display') == 'none') {\n                                $(window).scrollTop(eventNode.offset().top - topHeight.headHeight);\n                            } else {\n                                $(window).scrollTop(eventNode.offset().top - topHeight.headerWithBanner);\n                            }\n                        } else if (deltaScroll > 0 || scrollEvent < positionEventBeforeCollapse) {\n                            $(window).scrollTop(scrollEvent);\n                        } else {\n                            $(window).scrollTop(defaultPosition);\n                        }\n                    }\n                }\n                return false;\n            }\n\n            if (id = eventNode.data('id')) {\n                eventNode.addClass('m-expanded m-loading');\n                Ajax.postJson(\"/Prematch/ShowEventCoefs\", {\n                    data: {\n                        id: id,\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function (resp) {\n                        coefsNode.replaceWith(resp.html);\n                        highlightCoef();\n                        eventNode.removeClass('m-loading');\n\n                        document.dispatchEvent(new CustomEvent('showEventsListCoefs', {\n                            detail: {\n                                ids: [id]\n                            }\n                        }));\n                    }\n                });\n\n                let scrollEvent = $(window).scrollTop();\n\n                eventNode.data('node-saved-top', scrollEvent);\n            }\n            return false;\n        });\n\n        // Betting cart TableLine (add/remove) v3.0\n        app.body.on('click', selectors.cell + '[data-aid]', function () {\n            var that = $(this),\n                coefOid = that.attr('data-oid');\n\n            if (that.hasClass('active')) {\n                removeFromCart(coefOid);\n                that.removeClass('active');\n                return false;\n            }\n\n            var event = that.closest(selectors.event),\n                eventTitle = event.find(selectors.eventTitle).first().text().trim(),\n                eventId = event.attr('data-id'),\n                coefVal = that.attr('data-coefvalue'),\n                coefAid = that.attr('data-aid');\n\n            if (that.hasClass('blocked') || event.hasClass('blocked') || coefVal === '-')\n                return false;\n\n            var resTitleNodes = that.closest(selectors.table).find(selectors.resultsLine + ' [data-ctid]'),\n                resTitleNode = resTitleNodes.eq(that.index()),\n                resTitle = resTitleNode.text().trim(),\n                lowResTitle = resTitle.toLowerCase(),\n                smTitle = resTitleNode.attr('data-sm'),\n                complexResTitle = '',\n                period = '';\n\n            if (resTitleNode.attr('data-dvd') !== undefined) { //рынки с периодом/сэтом\n                periodIndex = resTitleNodes.filter('[data-sm=\"' + smTitle + '\"]').first().index();\n                period = ' (' + event.find(selectors.cell).eq(periodIndex).text().trim() + ')';\n            }\n\n            if (lowResTitle === window.Localization.getString('Scripts_Shared_Main.ModeTablePrematch_14', 'мен') || lowResTitle === window.Localization.getString('Scripts_Shared_Main.ModeTablePrematch_13', 'бол')) { //рынок ТОТАЛ\n                offset = (lowResTitle === window.Localization.getString('Scripts_Shared_Main.ModeTablePrematch_14', 'мен')) ? 2 : 1;\n                var totalVal = event.find(selectors.cell).eq(that.index() - offset).attr('data-coefvalue');\n                complexResTitle = smTitle + '(' + resTitle + '(' + totalVal + '))';\n            }\n            else if (lowResTitle === window.Localization.getString('Scripts_Shared_Main.ModeTablePrematch_15', 'кф')) {  //рынок ФОРА\n                var fkTitle = resTitleNodes.eq(that.index() - 1).text().trim();\n                var fkVal = event.find(selectors.cell).eq(that.index() - 1).attr('data-coefvalue');\n                complexResTitle = smTitle + ' (' + fkTitle + '(' + fkVal + ')' + ') ' + resTitle;\n            }\n            else { //простые рынки\n                complexResTitle = smTitle + ' (' + resTitle + ')';\n            }\n            complexResTitle += period;\n\n            var sData = {\n                oId: coefOid,\n                aId: coefAid,\n                eId: eventId,\n                eTitle: eventTitle,\n                rTitle: complexResTitle,\n                val: coefVal,\n                isLive: false\n            }\n            //alert(JSON.stringify(sData));\n\n            // return false if cart is sending now or overflowed, return true if added or already added.  Blink on false\n            addToCart(sData);\n            return false;\n        });\n\n        // Betting cart MarketList (add/remove) v3.0\n        app.body.on('click', selectors.oeCell + '[data-aid]', function () {\n            var that = $(this);\n\n            if (that.hasClass('active')) {\n                var oid = that.attr('data-oid');\n                removeFromCart(oid);\n                that.removeClass('active');\n            } else {\n\n                var event = that.closest(selectors.event),\n                    eventTitle = event.find(selectors.eventTitle).first().text().trim(),\n                    eventId = event.attr('data-id');\n\n                var market = that.closest(selectors.oeMarket),\n                    list = $(selectors.oeList);\n\n                if (that.hasClass('m-blocked') || market.hasClass('m-blocked') || list.hasClass('m-blocked'))\n                    return;\n\n                var sData = {\n                    oId: that.attr('data-oid'),\n                    aId: that.attr('data-aid'),\n                    eId: eventId,\n                    eTitle: eventTitle,\n                    rTitle: market.find('.event-markets__title').text() + ' (' + that.find('.event-markets__coef-title').attr('title') + ')',\n                    val: that.find('.event-markets__coef-value').attr('data-coefvalue'),\n                    isLive: false\n                }\n                // alert(JSON.stringify(sData));\n\n                addToCart(sData);\n            }\n            return false;\n        });\n\n    }\n\n    function unBindUI() {\n        app.body\n            .off('click', selectors.expandAllCoefsButton)\n            .off('click', selectors.cell + '[data-aid]')\n            .off('click', selectors.oeCell + '[data-aid]');\n\n        if (app.isIE()) {\n            $(selectors.scrollbarContentWrapper).off('scroll.prematchTable');\n        }\n    }\n\n    function createTables() {\n        $(selectors.table).each(function () {\n            var self = $(this);\n            var id = self.attr('data-id');\n            if (id !== undefined)\n                tables[id] = new Table(self);\n        });\n    }\n\n    function destroyTables() {\n        for (var key in tables) {\n            tables[key].domTable.remove();\n            delete tables[key];\n        }\n    }\n\n\tfunction init() {\n\t\tcreateTables();\n\t\thighlightCoef();\n\t\tsetTimeout(function () {\n\t\t\t$(selectors.scrollbarContentWrapper).scrollTop(sessionStorage.getItem('prematchPageContentScrollTop') || 0)\n\t\t}, 0);\n        bindUI();\n    }\n\n    function dispose() {\n\t\tunBindUI();\n        sessionStorage.setItem('prematchPageContentScrollTop', pageContentScrollTop);\n        destroyTables();\n    }\n\n    function update () {\n        destroyTables();\n        createTables();\n        highlightCoef();\n    };\n\n    function updateTable (id) {\n        delete tables[id];\n        var self = $(selectors.table + '[data-id=' + id + ']');\n        if (self.length === 0)\n            return;\n        tables[id] = new Table(self);\n        highlightCoef();\n        $(selectors.scrollbarContentWrapper).scroll();\n    }\n\n    function extendTable(id) {\n        if (tables.hasOwnProperty(id))\n            tables[id].extend();\n       // $(selectors.scrollbarContentWrapper).scroll();\n       highlightCoef();\n    }\n\n    function shrinkTable (id) {\n        if (tables.hasOwnProperty(id))\n            tables[id].shrink();\n    }\n\n    function collapseTable (id) {\n        if (tables.hasOwnProperty(id))\n            tables[id].collapse();\n    }\n\n    function removeTable (id) {\n        if (tables.hasOwnProperty(id)) {\n            tables[id].domTable.remove();\n            delete tables[id];\n        }\n    }\n\n    function insertTable (html, insertAfterId) {\n        var self = $(html);\n        var id = self.data('id');\n        removeTable(id);\n\n        if (insertAfterId !== undefined && tables.hasOwnProperty(insertAfterId))\n            self.insertAfter(tables[insertAfterId].domTable);\n        else\n            $(selectors.betPlace).prepend(self);\n\n        tables[id] = new Table(self);\n        highlightCoef();\n    }\n\n\n    //-------------------------------------------------------------\n\n    var fixHeader = function (scrollTop) {\n        for (key in tables) {\n            var table = tables[key];\n\n            if (table.header === undefined)\n                continue;\n\n            var top = table.domTable.position().top + parseInt(table.domTable.css('margin-top')) + 10;\n            var height = table.domTable.outerHeight();\n\n            if (scrollTop > top && scrollTop < top + height - 25) {\n                table.header.css({\n                    transform: 'translateY(' + (scrollTop - (top + 2)) + 'px)'\n                });\n            } else {\n                table.header.css({\n                    transform: 'translateY(0)'\n                });\n            }\n        }\n    }\n\n    return {\n        'tables': tables,\n\t\t'isEmpty': function () { return Object.keys(tables).length === 0 },\n        'count': function() { return Object.keys(tables).length },\n        'init': init,\n        'dispose': dispose,\n        'update': update,\n        'extendTable': extendTable,\n        'shrinkTable': shrinkTable,\n        'updateTable': updateTable,\n        'collapseTable': collapseTable,\n        'removeTable': removeTable,\n        'destroyTables': destroyTables,\n        'insertTable': insertTable,\n    };\n}());\n\n\n\n","Results = window.Results = (function () {\n    const selectors = {\n        betPlace: '#bet-place',\n        searchInput: '#search-input',\n        dateStart: '#results-datetime-filter-datepicker-from',\n        dateEnd: '#results-datetime-filter-datepicker-to',\n        dateStartVal: '#results-datetime-filter-value-from',\n        dateEndVal: '#results-datetime-filter-value-to',\n        datetimeFilterOverlay: '#results-datetime-filter-overlay',\n        setPeriod: '#results-datetime-filter-confirm-button',\n        setToday: '#results-set_today',\n        typeFilter: '#results-type',\n        vmSelectAll: '#sports-filter__select-all',\n        vmSportsFilterItem: '.j-sports-filter-item',\n        vmSportsFilterSelectButton: '.j-sports-filter-item-select-button',\n        vmSportsFilterLinkButton: '.j-sports-filter-item-link-button',\n        vmSportsFilterItemsContainer: '#vm-sports-filter-items',\n        emptyBetplace: '#empty_betplace',\n        sportsBlock: '.results-block',\n        eventExpandButton: '[res-event-expand-button]',\n        event: '[res-event]',\n        goto: '.icon-results-goto',\n        pageScrollbarContainer: '#m-page-content-scrollbar-scrollarea',\n        tbExpandSport: '.js-expand-table',\n        tbLeague: '.js-expand-league',\n        collapseAllNodes: '#cm-collapse_all_nodes',\n        datetimeFilter: '#results-datetime-filter',\n        datetimeFilterDropdownWrapper: '#results-datetime-filter-dropdown-wrapper',\n        openDatetimeFilterButton: '#open-datetime-filter-button',\n        timeFilter: '[results-time-filter]'\n    };\n    function getHours() {\n        return new Date($(selectors.datetimeFilterDropdownWrapper).data('initial-today')).getHours() * 60 * 60 * 1000;\n    }\n\n    function getMinutes() {\n        return new Date($(selectors.datetimeFilterDropdownWrapper).data('initial-today')).getMinutes() * 60 * 1000;\n    }\n\n    function getFromTimestamp() {\n        var local = $(selectors.dateStart).datepicker('getDate').getTime() + getHours() + getMinutes();\n        var timezoneTimestamp = local - new Date(local).getTimezoneOffset() * 60 * 1000;\n        return timezoneTimestamp;\n    }\n\n    function getToTimestamp() {\n        var local = $(selectors.dateEnd).datepicker('getDate').getTime() + getHours() + getMinutes();\n        var timezoneTimestamp = local - new Date(local).getTimezoneOffset() * 60 * 1000;\n        return timezoneTimestamp;\n    }\n\n    function getFromDateTimestamp() {\n        var localDate = new Date($(selectors.dateStart).datepicker('getDate'));\n        var timezoneDateTime = new Date(localDate.getTime() - localDate.getTimezoneOffset() * 60 * 1000);\n        var timezoneDate = Date.UTC(timezoneDateTime.getUTCFullYear(), timezoneDateTime.getUTCMonth(), timezoneDateTime.getUTCDate());\n        return timezoneDate;\n    }\n\n    function getToDateTimestamp() {\n        var localDate = new Date($(selectors.dateEnd).datepicker('getDate'));\n        var timezoneDateTime = new Date(localDate.getTime() - localDate.getTimezoneOffset() * 60 * 1000);\n        var timezoneDate = Date.UTC(timezoneDateTime.getUTCFullYear(), timezoneDateTime.getUTCMonth(), timezoneDateTime.getUTCDate());\n        return timezoneDate;\n    }\n\n    function init() {\n        initDatepickers();\n        bindUI();\n        app.Search.init('results');\n    }\n\n    function bindUI() {\n        $(document).on('click.openDatetimeFilterButton', selectors.openDatetimeFilterButton, function () {\n            datepickerHelper.openFilter();\n        });\n\n        $(document).on('click.timeFilter', selectors.timeFilter, function () {\n            var hours = $(this).attr('results-time-filter');\n            var text = $(this).text();\n            filterByTime(hours);\n            $(selectors.dateStartVal).text(text);\n            $(selectors.datetimeFilter).addClass('m-text');\n            datepickerHelper.closeFilter();\n        });\n\n        $(document).on('click', selectors.setPeriod, function () {\n            datepickerHelper.closeFilter();\n        });\n\n        $(document).on('click', selectors.datetimeFilterOverlay, function () {\n            datepickerHelper.closeFilter();\n            datepickerHelper.restorePrevVals();\n            datepickerHelper.savePrevVals();\n            datepickerHelper.restorePrevVals();\n        });\n    }\n\n    function filterByTime(hours) {\n        var intialToday = new Date($(selectors.datetimeFilterDropdownWrapper).data('initial-today'));\n        var to = intialToday.getTime() - intialToday.getTimezoneOffset() * 60 * 1000 - 100;\n\n        var from = to - 1000 * 60 * 60 * hours;\n\n        datepickerHelper.setFrom(from);\n        datepickerHelper.setTo(to);\n\n        $(selectors.setPeriod).click();\n    }\n\n    var datepickerHelper = {\n        overlay: $('<div/>', {\n            'class': 'results-datetime-filter__overlay',\n            'id': 'results-datetime-filter-overlay'\n        }),\n        setFrom: function (timestamp) {\n            $(selectors.dateStart).attr('data-timestamp', timestamp);\n            $(selectors.dateStart).datepicker('setDate', new Date(timestamp));\n            $(selectors.dateStartVal).html($(selectors.dateStart).datepicker().val());\n            datepickerHelper.updateDatepickersHeaders();\n        },\n        setTo: function (timestamp) {\n            datepickerHelper.setDateEndMaxValue();\n            $(selectors.dateEnd).attr('data-timestamp', timestamp);\n            $(selectors.dateEnd).datepicker('setDate', new Date(timestamp));\n            $(selectors.dateEndVal).html($(selectors.dateEnd).datepicker().val());\n            datepickerHelper.updateDatepickersHeaders();\n        },\n        updateDatepickersHeaders: function () {\n            setTimeout(function () {\n                var monthNames = [Localization.getString('Datepicker.January1', 'января'), Localization.getString('Datepicker.February1', 'февраля'), Localization.getString('Datepicker.March1', 'марта'), Localization.getString('Datepicker.April1', 'апреля'), Localization.getString('Datepicker.May1', ''), Localization.getString('Datepicker.June1', 'мая'), Localization.getString('Datepicker.July1', 'июля'), Localization.getString('Datepicker.August1', 'августа'), Localization.getString('Datepicker.September1', 'сентября'), Localization.getString('Datepicker.October1', 'октября'), Localization.getString('Datepicker.November1', 'ноября'), Localization.getString('Datepicker.December1','декабря')];\n                var fromText = $(selectors.dateStart).datepicker('getDate').getDate() + ' ' + monthNames[$(selectors.dateStart).datepicker('getDate').getMonth()];\n\n                if ($('.page-navigation__link.m-active[data-type]').data('type').toLowerCase() !== 'live') {\n                    fromText = window.Localization.getString('Scripts_Shared_Main.Results_16', 'с ') + fromText;\n                }\n\n                $('#results-datetime-filter-datepicker-from .ui-datepicker-month').html(fromText);\n                $('#results-datetime-filter-datepicker-to .ui-datepicker-month').html(window.Localization.getString('Scripts_Shared_Main.Results_17', 'по ') + $(selectors.dateEnd).datepicker('getDate').getDate() + ' ' + monthNames[$(selectors.dateEnd).datepicker('getDate').getMonth()]);\n            });\n        },\n        savePrevVals: function () {\n            $(selectors.dateStartVal).attr('data-prev-timestamp', getFromTimestamp());\n            $(selectors.dateEndVal).attr('data-prev-timestamp', getToTimestamp());\n        },\n        restorePrevVals: function () {\n            datepickerHelper.setFrom(parseInt($(selectors.dateStartVal).attr('data-prev-timestamp')));\n            datepickerHelper.setTo(parseInt($(selectors.dateEndVal).attr('data-prev-timestamp')));\n        },\n        openFilter: function () {\n            $(selectors.datetimeFilter).addClass('m-expanded');\n            document.body.style.overflow = 'hidden';\n            document.body.style.top = `-${window.scrollY}px`;\n            datepickerHelper.overlay.appendTo('body');\n            datepickerHelper.savePrevVals();\n        },\n        closeFilter: function () {\n            $(selectors.datetimeFilter).removeClass('m-expanded');\n            document.body.style.overflow = '';\n            document.body.style.top = '';\n            datepickerHelper.overlay.remove();\n        },\n        setDateEndMaxValue: function () {\n            var from = $(selectors.dateStart),\n                to = $(selectors.dateEnd);\n\n            var maxDateTimestamp = from.datepicker('getDate').getTime() + 1000 * 60 * 60 * 24 * 7,\n                maxDate = maxDateTimestamp < new Date($(selectors.datetimeFilterDropdownWrapper).data('initial-today')).getTime() ? new Date(from.datepicker('getDate').getTime() + 1000 * 60 * 60 * 24 * 6) : new Date($(selectors.datetimeFilterDropdownWrapper).data('initial-today'));\n\n            to.datepicker('option', 'minDate', from.datepicker('getDate'));\n            to.datepicker('option', 'maxDate', maxDate);\n        },\n        selectRange: function (date) {\n            if (!$(selectors.dateEnd).datepicker('getDate'))\n                return false;\n\n            dateTimestamp = date.getTime();\n            var startTime = $(selectors.dateStart).datepicker('getDate').getTime();\n            var endTime = $(selectors.dateEnd).datepicker('getDate').getTime();\n\n            if (dateTimestamp === startTime && dateTimestamp === endTime) {\n                return [true, 'm-highlight-start m-highlight-end'];\n            } else if (dateTimestamp === startTime) {\n                return [true, 'm-highlight-start'];\n            } else if (dateTimestamp === endTime) {\n                return [true, 'm-highlight-end'];\n            } else if (dateTimestamp > startTime && dateTimestamp < endTime) {\n                return [true, 'm-highlight-range'];\n            } else {\n                return [true, ''];\n            }\n        },\n        isLive: function () {\n            return $('.page-navigation__link.m-active[data-type]').data('type').toLowerCase() === 'live';\n        }\n    };\n\n    function initDatepickers() {\n        var from = $(selectors.dateStart).datepicker({\n            dateFormat: 'dd.mm.yy',\n            defaultDate: new Date($(selectors.dateStart).data('initial-datetime')),\n            maxDate: new Date($(selectors.datetimeFilterDropdownWrapper).data('initial-today')),\n            showOtherMonths: true,\n            selectOtherMonths: true,\n            onSelect: function (dateText, inst) {\n                datepickerHelper.setDateEndMaxValue();\n                to.datepicker('setDate', from.datepicker('getDate'));\n                setActualValue();\n                $(selectors.datetimeFilter).removeClass('m-text');\n            },\n            beforeShowDay: function (date) {\n                return datepickerHelper.selectRange(date);\n            }\n        });\n\n        var to = $(selectors.dateEnd).datepicker({\n            dateFormat: 'dd.mm.yy',\n            defaultDate: new Date($(selectors.dateEnd).data('initial-datetime')),\n            maxDate: new Date($(selectors.datetimeFilterDropdownWrapper).data('initial-today')),\n            showOtherMonths: true,\n            selectOtherMonths: true,\n            onSelect: function (dateText, inst) {\n                setActualValue();\n                $(selectors.datetimeFilter).removeClass('m-text');\n            },\n            beforeShowDay: function (date) {\n                return datepickerHelper.selectRange(date);\n            }\n        });\n\n        function setActualValue() {\n            datepickerHelper.setFrom(getFromDateTimestamp());\n            datepickerHelper.setTo(getToDateTimestamp());\n        }\n\n        var initialToDate = new Date($(selectors.dateEnd).data('initial-datetime'));\n        var initialFromTimestamp = new Date($(selectors.dateStart).data('initial-datetime')).getTime();\n        var initialToTimestamp = initialToDate.getTime();\n        var today = new Date($(selectors.datetimeFilterDropdownWrapper).data('initial-today'));\n\n        datepickerHelper.setFrom(getFromDateTimestamp());\n        datepickerHelper.setTo(getToDateTimestamp());\n        datepickerHelper.savePrevVals();\n        datepickerHelper.restorePrevVals();\n\n        function setInitInterval(intervalInHours) {\n            var text = $(selectors.timeFilter).filter('[results-time-filter=\"' + intervalInHours + '\"]').text();\n            $(selectors.dateStartVal).text(text);\n            $(selectors.datetimeFilter).addClass('m-text');\n        }\n\n        // если выбран временной интервал\n        var intervalInHours = (initialToTimestamp - initialFromTimestamp) / 1000 / 60 / 60;\n        if (intervalInHours !== 0 && [1, 3, 6, 12, 24].indexOf(intervalInHours) > -1) {\n            if (initialToDate.getDate() === today.getDate() && initialToDate.getMonth() === today.getMonth() && initialToDate.getFullYear() === today.getFullYear()) {\n                setInitInterval(intervalInHours);\n            }\n        }\n    }\n\n    function dispose() {\n        $('#page-content').empty();\n    }\n\n    return {\n        selectors: selectors,\n        init: init,\n        dispose: dispose\n    }\n}());","BinderResults = window.BinderResults = (function () {\n    var selectors = Results.selectors;\n    var vmSelectedClass = 'm-selected';\n\n    function getUtcTimeStamp(timeStamp) {\n        return timeStamp - globalAppSettings.timeOffset * 60 * 1000;\n    }\n\n    var bindUI = function () {\n        var body = app.body;\n\n        //--- v2.0 start -------------------------------------------------------\n\n        // Change time period v2.0\n        body.on('click', selectors.setPeriod, function () {\n            app.enableLoading();\n            app.VerticalMenu.dispose();\n\n            var startDate = new Date(getUtcTimeStamp(parseInt($(selectors.dateStart).attr('data-timestamp'))));\n            var endDate = new Date(getUtcTimeStamp(parseInt($(selectors.dateEnd).attr('data-timestamp'))));\n\n            Ajax.postJson(\"/Results/SetTimePeriod\", {\n                data: {\n                    start: startDate.toISOString(),\n                    end: endDate.toISOString()\n                },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.VerticalMenu.init();\n                    app.disableLoading();\n                }\n            });\n        });\n        //\n        // Set today v2.0\n        body.on('click', selectors.setToday, function () {\n            var date = new Date();\n            $(selectors.dateStart).datepicker('setDate', date);\n            $(selectors.dateEnd).datepicker('option', 'maxDate', date).datepicker('setDate', date);\n            $(selectors.setPeriod).click();\n            return false;\n        });\n\n        // toggle SportFilterItem v2.0\n        body.on('click', selectors.vmSportsFilterItem + '[data-id]', function (e) {\n            e.stopImmediatePropagation();\n            e.preventDefault();\n\n            var container = $(this),\n                id = container.data('id');\n\n            var isAllChecked = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem + ':not(.m-selected)').length > 0 ? false : true;\n            var filterItemsLength = $(selectors.vmSportsFilterItem).length;\n\n            if (isAllChecked && filterItemsLength > 1) {\n                container.addClass('m-loading');\n                Ajax.postJson(\"/Results/EnableOnlyOneItem\", {\n                    data: {\n                        id: id\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function (resp) {\n                        $(selectors.vmSelectAll).prop('checked', false);\n                        $(selectors.sportsBlock).remove();\n                        $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem).removeClass('m-selected');\n                        container.addClass('m-selected');\n                        insertTable(resp.html, container);\n                        container.removeClass('m-loading');\n                    }\n                });\n            } else {\n                toggleSportsFilterItem(id, container);\n            }\n\n            return false;\n        });\n\n        // toggle SportFilter v2.0\n        body.on('click', selectors.vmSelectAll, function () {\n            const selectedClass = 'm-selected';\n            var that = $(this),\n                removingAll = !that.prop('checked'),\n                allItems = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem);\n\n            that.parent().parent().addClass('m-loading');\n            Ajax.postJson(\"/Results/ToggleSportFilter\", {\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    if (removingAll) {\n                        $(selectors.sportsBlock).remove();\n                        that.prop('checked', false);\n                        allItems.removeClass(selectedClass);\n                    }\n                    else {\n                        that.prop('checked', true);\n                        allItems.addClass(selectedClass);\n                    }\n                    ($(selectors.sportsBlock).length === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n\n                    that.parent().parent().removeClass('m-loading');\n                }\n            });\n            return false;\n        });\n\n        // Search v2.0\n        var lastQuery = '';\n        body.on('keypress', selectors.searchInput, function (e) {\n            if (e.which == 13) {\n                var query = $(this).val();\n                if (query.trim() === lastQuery)\n                    return false;\n                lastQuery = query.trim();\n                app.enableLoading();\n                Ajax.postJson(\"/Results/Search\", {\n                    data: { query: query, enter: e.successHandler ? false : true },\n                    doCallAjaxViewParsers: false,\n                    success: function (resp) {\n                        app.disableLoading();\n                        if (e.successHandler) {\n                            e.successHandler(resp, query);\n                        } else {\n                            window.Search.hide();\n                        }\n                    }\n                });\n                return false;\n            }\n        });\n\n        //Expand Details v2.0\n        body.on('click', selectors.eventExpandButton, function () {\n            $(this).closest(selectors.event).toggleClass('m-expanded');\n        });\n\n        // Toggle SportTable v2.5\n        body.on('click', selectors.tbExpandSport, function () {\n            var that = $(this).closest('.events-table'),\n                id = that.data('id');\n\n            that.addClass('m-loading');\n            if (that.hasClass('m-expanded')) {\n                Ajax.postJson('/results/CollapseNode', {\n                    data: { id: id },\n                    doCallAjaxViewParsers: false,\n                    success: function () {\n                        that.removeClass('m-expanded').addClass('m-collapsed');\n                        app.ModeTablePrematch.collapseTable(id);\n                        that.removeClass('m-loading');\n                    }\n                });\n                return false;\n            }\n\n            Ajax.postJson('/results/ExpandSportsTable', {\n                data: { id: id },\n                success: function () {\n                    app.ModeTablePrematch.updateTable(id);\n                    that.removeClass('m-loading');\n                }\n            });\n            return false;\n        });\n\n        // Toggle League v2.5\n        body.on('click', selectors.tbLeague, function () {\n            var that = $(this).closest('.events-table__group'),\n                id = that.data('id'),\n                tId = that.closest(selectors.tbSport).data('id');\n\n            that.addClass('m-loading');\n            if (that.hasClass('m-expanded')) {\n                Ajax.postJson('/results/CollapseNode', {\n                    data: {\n                        id: id\n                    },\n                    doCallAjaxViewParsers: false,\n                    success: function () {\n                        that.removeClass('m-expanded').addClass('m-collapsed');\n                        that.find(selectors.tbLeagueBody).remove();\n                        app.ModeTablePrematch.shrinkTable(tId);\n                        that.removeClass('m-loading');\n                    }\n                });\n                return false;\n            }\n            Ajax.postJson('/results/ExpandLeague', {\n                data: { id: id },\n                doCallAjaxViewParsers: false,\n                success: function () {\n                    app.ModeTablePrematch.extendTable(tId);\n                    app.disableLoading();\n                }\n            });\n            return false;\n        });\n\n        ConfirmButton.init(\n            selectors.collapseAllNodes,\n            function () { app.enableLoading(); },\n            '/results/CollapseAllNodes',\n            function () { app.ModeTablePrematch.update(); app.disableLoading(); }\n        );\n    };\n\n    var unBindUI = function() {\n        app.body.off('click', selectors.setPeriod)\n            .off('click', selectors.setToday)\n            .off('click', selectors.vmSportsFilterItem + '[data-id]')\n            .off('click', selectors.vmSelectAll)\n            .off('keyup', selectors.searchInput)\n            .off('click', selectors.eventExpandButton)\n            .off('click', selectors.tbExpandSport)\n            .off('click', selectors.tbLeague);\n        ConfirmButton.dispose(selectors.collapseAllNodes);\n    };\n\n    var toggleSportsFilterItem = function (id, sportsFilterItemContainer, callback) {\n        var removing = sportsFilterItemContainer.hasClass(vmSelectedClass),\n            allItems = $(selectors.vmSportsFilterItemsContainer).find(selectors.vmSportsFilterItem),\n            selectAllbtn = $(selectors.vmSelectAll);\n\n        sportsFilterItemContainer.addClass('m-loading');\n        Ajax.postJson(\"/Results/ToggleSportFilterItem\", {\n            data: {\n                id: id\n            },\n            doCallAjaxViewParsers: false,\n            success: function (resp) {\n                if (removing) {\n                    $(selectors.sportsBlock + '[data-id=' + id + ']').remove();\n                    sportsFilterItemContainer.removeClass(vmSelectedClass);\n                }\n                else {\n                    insertTable(resp.html, sportsFilterItemContainer);\n                    sportsFilterItemContainer.addClass(vmSelectedClass);\n                }\n\n                selectAllbtn.prop('checked', (allItems.filter('.' + vmSelectedClass).length === allItems.length));\n                ($(selectors.sportsBlock).length === 0) ? $(selectors.emptyBetplace).addClass('active') : $(selectors.emptyBetplace).removeClass('active');\n\n                sportsFilterItemContainer.removeClass('m-loading');\n\n                if (callback) callback();\n            }\n        });\n    }\n\n    var insertTable = function (html, sportsFilterItemContainer) {\n        var openedTableIds = $(selectors.sportsBlock).toArray().map(function (x) {\n            return $(x).data('id');\n        });\n\n        var insertAfterId = sportsFilterItemContainer.prevAll('.' + vmSelectedClass).toArray()\n            .map(function (x) {\n                return $(x).data('id');\n            })\n            .filter(function (x) {\n                return openedTableIds.indexOf(x) !== -1;\n            })[0];\n\n        if (insertAfterId !== undefined) {\n            var insertAfterTable = $(selectors.sportsBlock + '[data-id=' + insertAfterId + ']');\n            if (insertAfterTable.length !== 0)\n                $(html).insertAfter(insertAfterTable);\n            else\n                $(selectors.betPlace).prepend(html);\n        }\n        else\n            $(selectors.betPlace).prepend(html);\n    }\n\n    var scrollToTable = function (id) {\n        var table = $(selectors.sportsBlock).filter('[data-id=\"' + id + '\"]');\n        var pageContentMargin = 20;\n\n        if (table.length > 0) {\n            $(selectors.pageScrollbarContainer).scrollTop(table.position().top + pageContentMargin);\n        }\n    }\n\n    var bind = function(justLoaded) { bindUI(); }\n    var unBind = function() { unBindUI(); }\n\n    var scrollToEvent = function(id) {\n        app.enableLoading();\n        query = $(selectors.searchInput).val();\n        Ajax.postJson(\"/Results/Search\", {\n            data: { query: query, enter: true },\n            doCallAjaxViewParsers: false,\n            success: function () {\n                window.Search.hide();\n                lastQuery = query.trim();\n                app.disableLoading();\n                var event = $(selectors.event).filter('[data-id=\"' + id + '\"]');\n                var pageContentMargin = 20;\n\n                if (event.length > 0) {\n                    $(selectors.pageScrollbarContainer).scrollTop(event.position().top - pageContentMargin);\n                    var eventid = event.find(\".results-event__number\");\n                    eventid.text(\"\");\n                    eventid.append($('<mark>' + id + '</mark>'));\n                }\n            }\n        });\n    }\n\n    return {\n        bind: bind,\n        unBind: unBind,\n        name: 'BinderResults',\n        url: '/Results/GetViewSet',\n        scrollToEvent: scrollToEvent\n    }\n}());\n\n//-----------------------------------\n\nScopeResults = (function () {\n    function init() {\n        app.VerticalMenu.init();\n        app.VerticalMenu.show();\n        Results.init();\n        app.Search.bindCloseButtonHandler();\n    }\n\n    function dispose() {\n        Results.dispose();\n        app.VerticalMenu.dispose();\n        app.Search.unbindCloseButtonHandler();\n    }\n\n    var start = function (justLoaded) { init(); };\n    var stop = function () { dispose(); };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopeResults',\n        url: 'RESULTS',\n        title: Localization.getString('Shared.Results','Результаты'),\n        isLayoutRightColumnVisible: false\n    };\n}());","BinderSuperExpress = window.BinderSuperExpress = (function () {\n    var bindUI = function () {\n        return false;\n\n    }\n    var unBindUI = function () {\n        return false;\n    }\n\n    var bind = function(justLoaded) { bindUI(); }\n    var unBind = function() { unBindUI(); }\n\n    return {\n        bind: bind,\n        unBind: unBind,\n        name: 'BinderSuperExpress',\n        url: '/baltsystem/getviewset'\n    }\n}());\n\n//-----------------------------------\n\nBinderAllSuperExpress = window.BinderAllSuperExpress = (function () {\n    return {\n\t\tbind: function () { BinderSuperExpress.bind() },\n\t\tunBind: function () { BinderSuperExpress.unBind() },\n        name: 'BinderAllSuperExpress',\n        url: '/baltsystem/getalldrawings'\n    }\n}());\n\n//-----------------------------------\n\nScopeSuperExpress = window.ScopeSuperExpress = (function () {\n\n    function init() {\n        app.VerticalMenu.hide();\n        app.Superexpress.init();\n        // Superexpress.refresh();\n        // liveTableTimerInit();\n    }\n\n    function dispose() {\n        //TODO: nullref check\n        app.Superexpress.dispose();\n        return;\n    }\n\n    var start = function (justLoaded) { init(); };\n    var stop = function () { dispose(); };\n\n    return {\n        start: start,\n        stop: stop,\n        name: 'ScopeSuperExpress',\n    };\n}());","// Обработка отправки сообщений в поддержку\nwindow.Tickets = (function () {\n\n    const selectors = {\n        ticketsText: \".j-ticket-text\",\n        ticketsSubmitButton: \".j-ticket-submit\"\n    };\n\n    const disabledClass = 'm-disabled';\n\n    // Деактивируем кнопку \"Отправить\", если ввод пуст\n    $(document).on('input', selectors.ticketsText, function () {\n        if ($(this).val().length === 0)\n            $(selectors.ticketsSubmitButton).addClass(disabledClass);\n        else\n            $(selectors.ticketsSubmitButton).removeClass(disabledClass);\n    });\n\n    const clear = function () {\n        $(selectors.ticketsText).val('');\n        $(selectors.ticketsText).trigger('input');\n    }\n\n    return {\n        clear\n    };\n}());","var Navigo = window.Navigo = (function () {\n\n    function Navigo(r, useHash, hash, reload) {\n        this.root = null;\n        this._routes = [];\n        this._reload = typeof reload === 'undefined' ? false : reload;\n        this._useHash = useHash;\n        this._hash = typeof hash === 'undefined' ? '#' : hash;\n        this._paused = false;\n        this._destroyed = false;\n        this._lastRouteResolved = null;\n        this._notFoundHandler = null;\n        this._defaultHandler = null;\n        this._usePushState = !useHash && isPushStateAvailable();\n        this._onLocationChange = this._onLocationChange.bind(this);\n        this._genericHooks = null;\n        this._historyAPIUpdateMethod = 'pushState';\n\n        if (r) {\n            this.root = useHash ? r.replace(/\\/$/, '/' + this._hash) : r.replace(/\\/$/, '');\n        } else if (useHash) {\n            this.root = this._cLoc().split(this._hash)[0].replace(/\\/$/, '/' + this._hash);\n        }\n\n        this._listen();\n        this.updatePageLinks();\n        return this;\n    }\n\n    var _typeof = (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\")\n        ? function (obj) { return typeof obj; }\n        : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); }\n    }\n\n    function isPushStateAvailable() {\n        return !!(typeof window !== 'undefined' && window.history && window.history.pushState);\n    }\n\n    function clean(s) {\n        if (s instanceof RegExp) return s;\n        return s.replace(/\\/+$/, '').replace(/^\\/+/, '^/');\n    }\n\n    function regExpResultToParams(match, names) {\n        if (names.length === 0) return null;\n        if (!match) return null;\n        return match.slice(1, match.length).reduce(function (params, value, index) {\n            if (params === null) params = {};\n            params[names[index]] = decodeURIComponent(value);\n            return params;\n        }, null);\n    }\n\n    function replaceDynamicURLParts(route) {\n        var paramNames = [],\n            regexp;\n\n        if (route instanceof RegExp) {\n            regexp = route;\n        } else {\n            regexp = new RegExp(route.replace(Navigo.PARAMETER_REGEXP, function (full, dots, name) {\n                paramNames.push(name);\n                return Navigo.REPLACE_VARIABLE_REGEXP;\n            }).replace(Navigo.WILDCARD_REGEXP, Navigo.REPLACE_WILDCARD) + Navigo.FOLLOWED_BY_SLASH_REGEXP, Navigo.MATCH_REGEXP_FLAGS);\n        }\n        return { regexp: regexp, paramNames: paramNames };\n    }\n\n    function getUrlDepth(url) {\n        return url.replace(/\\/$/, '').split('/').length;\n    }\n\n    function compareUrlDepth(urlA, urlB) {\n        return getUrlDepth(urlB) - getUrlDepth(urlA);\n    }\n\n    function findMatchedRoutes(url) {\n        var routes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n        return routes.map(function (route) {\n            var _replaceDynamicURLPar = replaceDynamicURLParts(clean(route.route)),\n                regexp = _replaceDynamicURLPar.regexp,\n                paramNames = _replaceDynamicURLPar.paramNames;\n\n            var match = url.replace(/^\\/+/, '/').match(regexp);\n            var params = regExpResultToParams(match, paramNames);\n\n            return match ? { match: match, route: route, params: params } : false;\n        }).filter(function (m) {\n            return m;\n        });\n    }\n\n    function match(url, routes) {\n        return findMatchedRoutes(url, routes)[0] || false;\n    }\n\n    function root(url, routes) {\n        var matched = routes.map(function (route) {\n            return route.route === '' || route.route === '*' ? url : url.split(new RegExp(route.route + '($|\\/)'))[0];\n        });\n        var fallbackURL = clean(url);\n\n        if (matched.length > 1) {\n            return matched.reduce(function (result, url) {\n                if (result.length > url.length) result = url;\n                return result;\n            }, matched[0]);\n        } else if (matched.length === 1) {\n            return matched[0];\n        }\n        return fallbackURL;\n    }\n\n    function isHashChangeAPIAvailable() {\n        return !!(typeof window !== 'undefined' && 'onhashchange' in window);\n    }\n\n    function extractGETParameters(url) {\n        return url.split(/\\?(.*)?$/).slice(1).join('');\n    }\n\n    function getOnlyURL(url, useHash, hash) {\n        var onlyURL = url.split(/\\?(.*)?$/)[0],\n            split;\n\n        if (typeof hash === 'undefined') {\n            // To preserve BC\n            hash = '#';\n        }\n\n        if (isPushStateAvailable() && !useHash) {\n            onlyURL = onlyURL.split(hash)[0];\n        } else {\n            split = onlyURL.split(hash);\n            onlyURL = split.length > 1 ? onlyURL.split(hash)[1] : split[0];\n        }\n\n        return onlyURL;\n    }\n\n    function manageHooks(handler, hooks, params) {\n        if (hooks && (typeof hooks === 'undefined' ? 'undefined' : _typeof(hooks)) === 'object') {\n            if (hooks.before) {\n                hooks.before(function () {\n                    var shouldRoute = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n                    if (!shouldRoute) return;\n                    handler();\n                    hooks.after && hooks.after(params);\n                }, params);\n            } else if (hooks.after) {\n                handler();\n                hooks.after && hooks.after(params);\n            }\n            return;\n        }\n        handler();\n    };\n\n    function isHashedRoot(url, useHash, hash) {\n        if (isPushStateAvailable() && !useHash) {\n            return false;\n        }\n\n        if (!url.match(hash)) {\n            return false;\n        }\n\n        var split = url.split(hash);\n\n        if (split.length < 2 || split[1] === '') {\n            return true;\n        }\n\n        return false;\n    };\n\n    Navigo.prototype = {\n        helpers: {\n            match: match,\n            root: root,\n            clean: clean\n        },\n        navigate: function navigate(path, absolute) {\n            var to;\n\n            path = path || '';\n            if (this._usePushState) {\n                to = (!absolute ? this._getRoot() + '/' : '') + path.replace(/^\\/+/, '/');\n                to = to.replace(/([^:])(\\/{2,})/g, '$1/');\n                history[this._historyAPIUpdateMethod]({}, '', to);\n                this.resolve();\n            } else if (typeof window !== 'undefined') {\n                path = path.replace(new RegExp('^' + this._hash), '');\n                window.location.href = window.location.href.replace(/#$/, '').replace(new RegExp(this._hash + '.*$'), '') + this._hash + path;\n            }\n            return this;\n        },\n        on: function on() {\n            var _this = this;\n\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n            }\n\n            if (typeof args[0] === 'function') {\n                this._defaultHandler = { handler: args[0], hooks: args[1] };\n            } else if (args.length >= 2) {\n                if (args[0] === '/') {\n                    var func = args[1];\n\n                    if (_typeof(args[1]) === 'object') {\n                        func = args[1].uses;\n                    }\n\n                    this._defaultHandler = { handler: func, hooks: args[2] };\n                } else {\n                    this._add(args[0], args[1], args[2]);\n                }\n            } else if (_typeof(args[0]) === 'object') {\n                var orderedRoutes = Object.keys(args[0]).sort(compareUrlDepth);\n\n                orderedRoutes.forEach(function (route) {\n                    _this.on(route, args[0][route]);\n                });\n            }\n            return this;\n        },\n        off: function off(handler) {\n            if (this._defaultHandler !== null && handler === this._defaultHandler.handler) {\n                this._defaultHandler = null;\n            } else if (this._notFoundHandler !== null && handler === this._notFoundHandler.handler) {\n                this._notFoundHandler = null;\n            }\n            this._routes = this._routes.reduce(function (result, r) {\n                if (r.handler !== handler) result.push(r);\n                return result;\n            }, []);\n            return this;\n        },\n        notFound: function notFound(handler, hooks) {\n            this._notFoundHandler = { handler: handler, hooks: hooks };\n            return this;\n        },\n        resolve: function resolve(current) {\n            var _this2 = this;\n\n            var handler, m;\n            var url = (current || this._cLoc()).replace(this._getRoot(), '');\n\n            if (this._useHash) {\n                url = url.replace(new RegExp('^\\/' + this._hash), '/');\n            }\n\n            var GETParameters = extractGETParameters(current || this._cLoc());\n            var onlyURL = getOnlyURL(url, this._useHash, this._hash);\n\n            if (this._paused) return false;\n\n            if (this._lastRouteResolved && onlyURL === this._lastRouteResolved.url && GETParameters === this._lastRouteResolved.query) {\n                if (this._reload) {\n                    window.location.reload();\n                    return false;\n                }\n                if (this._lastRouteResolved.hooks && this._lastRouteResolved.hooks.already) {\n                    this._lastRouteResolved.hooks.already(this._lastRouteResolved.params);\n                }\n                return false;\n            }\n\n            m = match(onlyURL, this._routes);\n\n            if (m) {\n                this._callLeave();\n                this._lastRouteResolved = {\n                    url: onlyURL,\n                    query: GETParameters,\n                    hooks: m.route.hooks,\n                    params: m.params,\n                    name: m.route.name\n                };\n                handler = m.route.handler;\n                manageHooks(function () {\n                    manageHooks(function () {\n                        m.route.route instanceof RegExp ? handler.apply(undefined, _toConsumableArray(m.match.slice(1, m.match.length))) : handler(m.params, GETParameters);\n                    }, m.route.hooks, m.params, _this2._genericHooks);\n                }, this._genericHooks, m.params);\n                return m;\n            } else if (this._defaultHandler && (onlyURL === '' || onlyURL === '/' || onlyURL === this._hash || isHashedRoot(onlyURL, this._useHash, this._hash))) {\n                manageHooks(function () {\n                    manageHooks(function () {\n                        _this2._callLeave();\n                        _this2._lastRouteResolved = { url: onlyURL, query: GETParameters, hooks: _this2._defaultHandler.hooks };\n                        _this2._defaultHandler.handler(GETParameters);\n                    }, _this2._defaultHandler.hooks);\n                }, this._genericHooks);\n                return true;\n            } else if (this._notFoundHandler) {\n                manageHooks(function () {\n                    manageHooks(function () {\n                        _this2._callLeave();\n                        _this2._lastRouteResolved = { url: onlyURL, query: GETParameters, hooks: _this2._notFoundHandler.hooks };\n                        _this2._notFoundHandler.handler(GETParameters);\n                    }, _this2._notFoundHandler.hooks);\n                }, this._genericHooks);\n            }\n            return false;\n        },\n        destroy: function destroy() {\n            this._routes = [];\n            this._destroyed = true;\n            clearTimeout(this._listeningInterval);\n            if (typeof window !== 'undefined') {\n                window.removeEventListener('popstate', this._onLocationChange);\n                window.removeEventListener('hashchange', this._onLocationChange);\n            }\n        },\n        updatePageLinks: function updatePageLinks() {\n            var self = this;\n\n            if (typeof document === 'undefined') return;\n\n            this._findLinks().forEach(function (link) {\n                if (!link.hasListenerAttached) {\n                    link.addEventListener('click', function (e) {\n                        var location = self.getLinkPath(link);\n\n                        if (!self._destroyed) {\n                            e.preventDefault();\n                            self.navigate(location.replace(/\\/+$/, '').replace(/^\\/+/, '/'));\n                        }\n                    });\n                    link.hasListenerAttached = true;\n                }\n            });\n        },\n        generate: function generate(name) {\n            var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n            var result = this._routes.reduce(function (result, route) {\n                var key;\n\n                if (route.name === name) {\n                    result = route.route;\n                    for (key in data) {\n                        result = result.toString().replace(':' + key, data[key]);\n                    }\n                }\n                return result;\n            }, '');\n\n            return this._useHash ? this._hash + result : result;\n        },\n        link: function link(path) {\n            return this._getRoot() + path;\n        },\n        pause: function pause() {\n            var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n            this._paused = status;\n            if (status) {\n                this._historyAPIUpdateMethod = 'replaceState';\n            } else {\n                this._historyAPIUpdateMethod = 'pushState';\n            }\n        },\n        resume: function resume() {\n            this.pause(false);\n        },\n        historyAPIUpdateMethod: function historyAPIUpdateMethod(value) {\n            if (typeof value === 'undefined') return this._historyAPIUpdateMethod;\n            this._historyAPIUpdateMethod = value;\n            return value;\n        },\n        disableIfAPINotAvailable: function disableIfAPINotAvailable() {\n            if (!isPushStateAvailable()) {\n                this.destroy();\n            }\n        },\n        lastRouteResolved: function lastRouteResolved() {\n            return this._lastRouteResolved;\n        },\n        getLinkPath: function getLinkPath(link) {\n            return link.pathname || link.getAttribute('href');\n        },\n        hooks: function hooks(_hooks) {\n            this._genericHooks = _hooks;\n        },\n\n        _add: function _add(route) {\n            var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n            var hooks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n            if (typeof route === 'string') {\n                route = encodeURI(route);\n            }\n            if ((typeof handler === 'undefined' ? 'undefined' : _typeof(handler)) === 'object') {\n                this._routes.push({\n                    route: route,\n                    handler: handler.uses,\n                    name: handler.as,\n                    hooks: hooks || handler.hooks\n                });\n            } else {\n                this._routes.push({ route: route, handler: handler, hooks: hooks });\n            }\n            return this._add;\n        },\n        _getRoot: function _getRoot() {\n            if (this.root !== null) return this.root;\n            this.root = root(this._cLoc().split('?')[0], this._routes);\n            return this.root;\n        },\n        _listen: function _listen() {\n            var _this3 = this;\n\n            if (this._usePushState) {\n                window.addEventListener('popstate', this._onLocationChange);\n            } else if (isHashChangeAPIAvailable()) {\n                window.addEventListener('hashchange', this._onLocationChange);\n            } else {\n                var cached = this._cLoc(),\n                    current = void 0,\n                    _check = void 0;\n\n                _check = function check() {\n                    current = _this3._cLoc();\n                    if (cached !== current) {\n                        cached = current;\n                        _this3.resolve();\n                    }\n                    _this3._listeningInterval = setTimeout(_check, 200);\n                };\n                _check();\n            }\n        },\n        _cLoc: function _cLoc() {\n            if (typeof window !== 'undefined') {\n                if (typeof window.__NAVIGO_WINDOW_LOCATION_MOCK__ !== 'undefined') {\n                    return window.__NAVIGO_WINDOW_LOCATION_MOCK__;\n                }\n                return clean(window.location.href);\n            }\n            return '';\n        },\n        _findLinks: function _findLinks() {\n            return [].slice.call(document.querySelectorAll('[data-navigo]'));\n        },\n        _onLocationChange: function _onLocationChange() {\n            this.resolve();\n        },\n        _callLeave: function _callLeave() {\n            if (this._lastRouteResolved && this._lastRouteResolved.hooks && this._lastRouteResolved.hooks.leave) {\n                this._lastRouteResolved.hooks.leave();\n            }\n        }\n    };\n\n    Navigo.PARAMETER_REGEXP = /([:*])(\\w+)/g;\n    Navigo.WILDCARD_REGEXP = /\\*/g;\n    Navigo.REPLACE_VARIABLE_REGEXP = '([^\\/]+)';\n    Navigo.REPLACE_WILDCARD = '(?:.*)';\n    Navigo.FOLLOWED_BY_SLASH_REGEXP = '(?:\\/$|$)';\n    Navigo.MATCH_REGEXP_FLAGS = '';\n\n    return Navigo;\n\n}());","var SPA = window.SPA = (function () {\n    var self = {};\n    var log = function (msg) { app.console.log('%c%s %s', 'color: brown; font-weight: bold;', '[ROUTER]', msg); };\n    var error = function (msg) { app.console.log('%c%s %s', 'color: red; font-weight: bold;', '[ROUTER] ERROR:', msg); };\n    var logGroupStart = function (msg) { app.console.group('%c%s\\t\\t\\t\\t\\t\\t\\t', 'background: #2F4F4F; color: #FFFACD; font-weight: bold; display: block; text-align: center', msg); };\n    var logGroupEnd = function (msg) { app.console.log('%c%s %s', 'color: brown; font-weight: bold;', '[ROUTER]', msg); window.console.groupEnd(); };\n\n    var justLoaded = true;\n    var currentScope;\n    var setCurrentBinder = function (binder) { self.currentBinder = binder; log('→ Binder set to: ' + binder.name); };\n    var setCurrentScope = function (scope) { currentScope = scope; log('→ Scope set to: ' + scope.name); };\n\n    var isSPAEnabled = (typeof globalAppSettings.isSPAEnabled != 'undefined') ? globalAppSettings.isSPAEnabled : false;\n\n    function setPageTitle() {\n        if (justLoaded || !isSPAEnabled) {\n            return;\n        }\n\n        if (currentScope.title !== undefined) {\n            document.title = currentScope.title;\n        }\n        else {\n            var title = $('#page-content').data('pagetitle');\n            if (title != undefined) {\n                document.title = title;\n            }\n        }\n    }\n\n    function generalLeaveHook() {\n        logGroupStart('NEW ROUTE (' + router.lastRouteResolved().url + ' → ' + window.location.pathname + ')');\n        app.Tooltip.hide();\n        justLoaded = false;\n        app.enableLoading();\n        if (self.currentBinder !== undefined && currentScope !== undefined) {\n            self.currentBinder.unBind();\n            log('❌ ' + self.currentBinder.name + ' DISABLED.');\n            currentScope.stop();\n            log('❌ ' + currentScope.name + ' DISABLED.');\n        }\n        else {\n            error('CurrentBinder or CurrentScope not found. Refreshing page...');\n            Ajax.redirect(window.location.pathname);\n        }\n    }\n\n    function generalAfterHook(scopeData) {\n        log('⏳ THE ROUTE IS MATCHED. Starting binder... ScopeData=' + JSON.stringify(scopeData));\n\n        if (self.currentBinder !== undefined) {\n            self.currentBinder.bind(justLoaded, scopeData);\n            log('✓ ' + self.currentBinder.name + ' ENABLED.');\n        }\n        else {\n            error('CurrentBinder not found. Refreshing page...');\n            Ajax.redirect(window.location.pathname);\n        }\n\n        if (typeof ReturnButton !== 'undefined') {\n            ReturnButton.init();\n        }\n        var activePathname = new CustomEvent('triggerMesssageModal', {\n            detail: {\n                pathname: window.location.pathname,\n\n            },\n            bubbles: true,\n          });\n        document.dispatchEvent(activePathname);\n    }\n\n    var generalHooks = {\n        leave: generalLeaveHook,\n        after: generalAfterHook\n        //before:\n        //already:\n    };\n\n    var _generalRoute = function (binder, scope, ajaxData, scopeData) {\n\n        if (!isSPAEnabled) {\n            router.destroy();\n            log('Router destroyed.');\n        }\n\n        LayoutResolver.resolve(scope);\n\n        ajaxData = ajaxData || {};\n        scopeData = scopeData || {};\n\n\n        log('⏳ Starting route body...');\n        setCurrentBinder(binder);\n        setCurrentScope(scope);\n\n        if (justLoaded) {\n            currentScope.start(true, scopeData);\n            log(currentScope.name + ' JUSTLOADED ENABLED! ');\n            return;\n        }\n        log('Getting Data...');\n        Ajax.getJson(self.currentBinder.url, {\n            data: ajaxData,\n            success: function () {\n                log('...Data Received');\n                currentScope.start(false, scopeData);\n                router.updatePageLinks();\n                app.MainNavigation.updatePage();\n                setPageTitle();\n                logGroupEnd('✓ ' + currentScope.name + ' ENABLED! ');\n                app.disableLoading();\n            }\n        });\n    };\n\n    function generalNonSpaRoute() {\n        log('General NonSpa Binder');\n\n        router.destroy();\n        log('Router destroyed.');\n    }\n\n    var live = function () { _generalRoute(BinderLive, ScopeLive); };\n    var liveFavorites = function () { _generalRoute(BinderLiveFavorites, ScopeLiveFavorites); };\n    var liveSingleSport = function (sport) { _generalRoute(BinderLiveSingleSport, ScopeLiveSingleSport, { sportType: sport }, { sportType: sport }); };\n\n    var prematch = function (sport) { _generalRoute(BinderPrematch, ScopePrematch, { sportType: sport }); };\n    var prematchFavorites = function () { _generalRoute(BinderPrematchFavorites, ScopePrematchFavorites); };\n    var prematchSingleSport = function (sport) {\n        _generalRoute(BinderPrematchSingleSport, ScopePrematchSingleSport, { sportType: sport }, { sportType: sport });\n        generalAfterHook({ sportType: sport });\n    };\n\n    var history = function () { _generalRoute(BinderHistory, ScopeHistory); };\n    var results = function () { _generalRoute(BinderResults, ScopeResults); };\n    var event = function (id) { _generalRoute(BinderEvent, ScopeEvent, { id: id }); };\n    var bonuses = function (tab) { _generalRoute(BinderBonuses, ScopeBonuses, (tab) ? { tab: tab } : {}); };\n    var superexpress = function (num) { _generalRoute(BinderSuperExpress, ScopeSuperExpress, (num) ? { number: num } : {}); };\n    var superexpressAll = function () { _generalRoute(BinderAllSuperExpress, ScopeSuperExpress); };\n\n\n    var router = new Navigo(window.location.origin, false, '#!', true); //TODO: old browser location.origin support\n    //CASE SENSITIVE!\n    if (globalAppSettings.isLocalizationEnabled) {\n        router\n            .on('/:lang/live', live, generalHooks)\n            .on('/:lang/live/favorites', liveFavorites, generalHooks)\n            .on('/:lang/live/:sport', function (params) { return liveSingleSport(params.sport); }, generalHooks)\n\n            .on('/:lang/prematch', prematch, generalHooks)\n            .on('/:lang/prematch/favorites', prematchFavorites, generalHooks)\n            .on('/:lang/prematch/:sport', function (params) { return prematchSingleSport(params.sport); }, { leave: generalLeaveHook, after: function () { } })\n            .on(/^\\/([^/\\n]+)\\/(prematch)\\/([^/\\n]+)\\/(.+)-gid-(\\d+)$/, function (eventType, sport, leagueTitle, id) { return prematchSingleSport(sport); }, { leave: generalLeaveHook, after: function () { } })\n\n            .on('/:lang/history', history, generalHooks)\n            .on('/:lang/results/:type', results, generalHooks)\n            .on('/:lang/results/:type/:sportType', results, generalHooks)\n\n            .on('/:lang/bonuses', bonuses, generalHooks)\n            .on('/:lang/bonuses/:tab', function (params) { return bonuses(params.tab); }, generalHooks)\n\n            .on('/:lang/baltsystem', superexpress, generalHooks)\n            .on('/:lang/baltsystem/landing', superexpress, generalHooks)\n            .on('/:lang/baltsystem/all', superexpressAll, generalHooks)\n            .on('/:lang/baltsystem/:num', function (params) { superexpress(params.num); }, generalHooks)\n\n            .on('/:lang/event/:id', function (params) { return event(params.id); }, generalHooks)\n            .on(/^\\/([^/\\n]+)\\/(live|prematch)\\/(.+)\\/(.+)-id-(\\d+)$/, function (lang, eventType, sportAndLeague, title, id) { return event(id); }, generalHooks);\n    }\n    else {\n        router\n            .on('/live', live, generalHooks)\n            .on('/live/favorites', liveFavorites, generalHooks)\n            .on('/live/:sport', function (params) { return liveSingleSport(params.sport); }, generalHooks)\n\n            .on('/prematch', prematch, generalHooks)\n            .on('/prematch/favorites', prematchFavorites, generalHooks)\n            .on('/prematch/:sport', function (params) { return prematchSingleSport(params.sport); }, { leave: generalLeaveHook, after: function () { } })\n            .on(/^\\/(prematch)\\/([^/\\n]+)\\/(.+)-gid-(\\d+)$/, function (eventType, sport, leagueTitle, id) { return prematchSingleSport(sport); }, { leave: generalLeaveHook, after: function () { } })\n\n            .on('/history', history, generalHooks)\n            .on('/results/:type', results, generalHooks)\n            .on('/results/:type/:sportType', results, generalHooks)\n\n            .on('/bonuses', bonuses, generalHooks)\n            .on('/bonuses/:tab', function (params) { return bonuses(params.tab); }, generalHooks)\n\n            .on('/baltsystem', superexpress, generalHooks)\n            .on('/baltsystem/landing', superexpress, generalHooks)\n            .on('/baltsystem/all', superexpressAll, generalHooks)\n            .on('/baltsystem/:num', function (params) { superexpress(params.num); }, generalHooks)\n\n            .on('/event/:id', function (params) { return event(params.id); }, generalHooks)\n            .on(/^\\/(live|prematch)\\/(.+)\\/(.+)-id-(\\d+)$/, function (eventType, sportAndLeague, title, id) { return event(id); }, generalHooks);\n    }\n\n    router.notFound(function (query) {\n        log('Route not found. Query=\"' + query + '\"');\n        generalNonSpaRoute();\n    });\n\n\n    self.configure = function (config) {\n        self._config = $.extend(true, newConfig, self.config || {}, config || {});\n    };\n\n    self.resolveRoutes = function () {\n        log('Route resolving...');\n        var resolved = router.resolve();\n        log('Route resolved: ' + JSON.stringify(resolved));\n        if (typeof ReturnButton !== 'undefined') {\n            ReturnButton.init();\n        };\n    };\n\n\n\n    self.navigate = function (path) {\n        if (isSPAEnabled && router !== undefined && !router._destroyed) {\n            router.navigate(path);\n        }\n        else {\n            window.location.href = path;\n        }\n    };\n\n    self.updatePageLinks = function () {\n        if (isSPAEnabled) {\n            router.updatePageLinks();\n        }\n    };\n\n    $(function () {\n        log('Route resolving...');\n        var resolved = router.resolve();\n        log('Route resolved: ' + JSON.stringify(resolved));\n        if (typeof ReturnButton !== 'undefined') {\n            ReturnButton.init();\n        }\n        app.disableLoading();\n    });\n\n    return self;\n}());\n\n\n\n\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import './Shared/Main/Live/ModeTableLive.js';\nimport './Shared/Main/Live/TableFetcherLive.js';\nimport './Shared/Main/Live/BinderLive.js';\nimport './Shared/Main/Live/BinderLiveFavorites.js';\nimport './Shared/Main/Live/BinderLiveSingleSport.js';\nimport './Shared/Main/Live/BinderTextScroll.ts';\n\nimport './Shared/Main/Prematch/ModeTablePrematch.js';\nimport './Shared/Main/Prematch/BinderPrematch.js';\nimport './Shared/Main/Prematch/BinderPrematchFavorites.js';\nimport './Shared/Main/Prematch/BinderPrematchSingleSport.js';\n\nimport './Shared/Main/Event/EventBlock.js';\nimport './Shared/Main/Event/OpenEvent.js';\nimport './Shared/Main/Event/binder.js';\n\nimport './Shared/Main/Tickets/Tickets.js';\n\nimport './Shared/Main/History/binder.js';\nimport './Shared/Main/SuperExpress/binder.js';\n\nimport './Shared/Main/Results/Results.js';\nimport './Shared/Main/Results/binder.js';\n\nimport './Shared/Main/Bonuses/binder.js';\n\nimport './Shared/Routing/navigo.js';\nimport './Shared/Routing/spa.js';\n"],"names":[],"sourceRoot":""}