@openreplay/tracker 10.0.3 → 10.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/cjs/app/index.js +1 -1
  2. package/cjs/index.js +1 -1
  3. package/cjs/modules/Network/fetchProxy.js +4 -2
  4. package/coverage/clover.xml +1331 -562
  5. package/coverage/coverage-final.json +13 -6
  6. package/coverage/lcov-report/index.html +49 -34
  7. package/coverage/lcov-report/main/app/canvas.ts.html +1 -1
  8. package/coverage/lcov-report/main/app/guards.ts.html +42 -42
  9. package/coverage/lcov-report/main/app/index.html +24 -24
  10. package/coverage/lcov-report/main/app/index.ts.html +1046 -56
  11. package/coverage/lcov-report/main/app/logger.ts.html +1 -1
  12. package/coverage/lcov-report/main/app/messages.gen.ts.html +1 -1
  13. package/coverage/lcov-report/main/app/nodes.ts.html +1 -1
  14. package/coverage/lcov-report/main/app/observer/iframe_observer.ts.html +1 -1
  15. package/coverage/lcov-report/main/app/observer/iframe_offsets.ts.html +1 -1
  16. package/coverage/lcov-report/main/app/observer/index.html +1 -1
  17. package/coverage/lcov-report/main/app/observer/shadow_root_observer.ts.html +1 -1
  18. package/coverage/lcov-report/main/app/observer/top_observer.ts.html +1 -1
  19. package/coverage/lcov-report/main/app/sanitizer.ts.html +1 -1
  20. package/coverage/lcov-report/main/app/session.ts.html +1 -1
  21. package/coverage/lcov-report/main/app/ticker.ts.html +1 -1
  22. package/coverage/lcov-report/main/index.html +11 -11
  23. package/coverage/lcov-report/main/index.ts.html +274 -100
  24. package/coverage/lcov-report/main/modules/Network/beaconProxy.ts.html +1 -1
  25. package/coverage/lcov-report/main/modules/Network/fetchProxy.ts.html +1 -1
  26. package/coverage/lcov-report/main/modules/Network/index.html +1 -1
  27. package/coverage/lcov-report/main/modules/Network/index.ts.html +1 -1
  28. package/coverage/lcov-report/main/modules/Network/networkMessage.ts.html +1 -1
  29. package/coverage/lcov-report/main/modules/Network/utils.ts.html +1 -1
  30. package/coverage/lcov-report/main/modules/Network/xhrProxy.ts.html +1 -1
  31. package/coverage/lcov-report/main/modules/attributeSender.ts.html +1 -1
  32. package/coverage/lcov-report/main/modules/axiosSpy.ts.html +1 -1
  33. package/coverage/lcov-report/main/modules/conditionsManager.ts.html +799 -0
  34. package/coverage/lcov-report/main/modules/connection.ts.html +1 -1
  35. package/coverage/lcov-report/main/modules/console.ts.html +1 -1
  36. package/coverage/lcov-report/main/modules/constructedStyleSheets.ts.html +1 -1
  37. package/coverage/lcov-report/main/modules/cssrules.ts.html +1 -1
  38. package/coverage/lcov-report/main/modules/exception.ts.html +1 -1
  39. package/coverage/lcov-report/main/modules/featureFlags.ts.html +10 -7
  40. package/coverage/lcov-report/main/modules/focus.ts.html +1 -1
  41. package/coverage/lcov-report/main/modules/fonts.ts.html +1 -1
  42. package/coverage/lcov-report/main/modules/img.ts.html +1 -1
  43. package/coverage/lcov-report/main/modules/index.html +27 -12
  44. package/coverage/lcov-report/main/modules/input.ts.html +1 -1
  45. package/coverage/lcov-report/main/modules/mouse.ts.html +1 -1
  46. package/coverage/lcov-report/main/modules/network.ts.html +1 -1
  47. package/coverage/lcov-report/main/modules/performance.ts.html +1 -1
  48. package/coverage/lcov-report/main/modules/scroll.ts.html +1 -1
  49. package/coverage/lcov-report/main/modules/selection.ts.html +1 -1
  50. package/coverage/lcov-report/main/modules/tabs.ts.html +1 -1
  51. package/coverage/lcov-report/main/modules/timing.ts.html +1 -1
  52. package/coverage/lcov-report/main/modules/userTesting/SignalManager.ts.html +370 -0
  53. package/coverage/lcov-report/main/modules/userTesting/dnd.ts.html +10 -22
  54. package/coverage/lcov-report/main/modules/userTesting/index.html +57 -27
  55. package/coverage/lcov-report/main/modules/userTesting/index.ts.html +814 -115
  56. package/coverage/lcov-report/main/modules/userTesting/recorder.ts.html +136 -67
  57. package/coverage/lcov-report/main/modules/userTesting/styles.ts.html +111 -39
  58. package/coverage/lcov-report/main/modules/userTesting/utils.ts.html +364 -0
  59. package/coverage/lcov-report/main/modules/viewport.ts.html +1 -1
  60. package/coverage/lcov-report/main/utils.ts.html +48 -6
  61. package/coverage/lcov-report/webworker/BatchWriter.ts.html +1 -1
  62. package/coverage/lcov-report/webworker/MessageEncoder.gen.ts.html +1 -1
  63. package/coverage/lcov-report/webworker/PrimitiveEncoder.ts.html +1 -1
  64. package/coverage/lcov-report/webworker/QueueSender.ts.html +1 -1
  65. package/coverage/lcov-report/webworker/index.html +5 -5
  66. package/coverage/lcov-report/webworker/index.ts.html +15 -9
  67. package/coverage/lcov.info +2306 -900
  68. package/lib/app/index.js +1 -1
  69. package/lib/index.js +1 -1
  70. package/lib/modules/Network/fetchProxy.js +4 -2
  71. package/package.json +1 -1
@@ -25,28 +25,28 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/296</span>
28
+ <span class='fraction'>0/452</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/170</span>
35
+ <span class='fraction'>0/240</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/57</span>
42
+ <span class='fraction'>0/75</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/288</span>
49
+ <span class='fraction'>0/441</span>
50
50
  </div>
51
51
 
52
52
 
@@ -840,7 +840,339 @@
840
840
  <a name='L775'></a><a href='#L775'>775</a>
841
841
  <a name='L776'></a><a href='#L776'>776</a>
842
842
  <a name='L777'></a><a href='#L777'>777</a>
843
- <a name='L778'></a><a href='#L778'>778</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a>
1057
+ <a name='L992'></a><a href='#L992'>992</a>
1058
+ <a name='L993'></a><a href='#L993'>993</a>
1059
+ <a name='L994'></a><a href='#L994'>994</a>
1060
+ <a name='L995'></a><a href='#L995'>995</a>
1061
+ <a name='L996'></a><a href='#L996'>996</a>
1062
+ <a name='L997'></a><a href='#L997'>997</a>
1063
+ <a name='L998'></a><a href='#L998'>998</a>
1064
+ <a name='L999'></a><a href='#L999'>999</a>
1065
+ <a name='L1000'></a><a href='#L1000'>1000</a>
1066
+ <a name='L1001'></a><a href='#L1001'>1001</a>
1067
+ <a name='L1002'></a><a href='#L1002'>1002</a>
1068
+ <a name='L1003'></a><a href='#L1003'>1003</a>
1069
+ <a name='L1004'></a><a href='#L1004'>1004</a>
1070
+ <a name='L1005'></a><a href='#L1005'>1005</a>
1071
+ <a name='L1006'></a><a href='#L1006'>1006</a>
1072
+ <a name='L1007'></a><a href='#L1007'>1007</a>
1073
+ <a name='L1008'></a><a href='#L1008'>1008</a>
1074
+ <a name='L1009'></a><a href='#L1009'>1009</a>
1075
+ <a name='L1010'></a><a href='#L1010'>1010</a>
1076
+ <a name='L1011'></a><a href='#L1011'>1011</a>
1077
+ <a name='L1012'></a><a href='#L1012'>1012</a>
1078
+ <a name='L1013'></a><a href='#L1013'>1013</a>
1079
+ <a name='L1014'></a><a href='#L1014'>1014</a>
1080
+ <a name='L1015'></a><a href='#L1015'>1015</a>
1081
+ <a name='L1016'></a><a href='#L1016'>1016</a>
1082
+ <a name='L1017'></a><a href='#L1017'>1017</a>
1083
+ <a name='L1018'></a><a href='#L1018'>1018</a>
1084
+ <a name='L1019'></a><a href='#L1019'>1019</a>
1085
+ <a name='L1020'></a><a href='#L1020'>1020</a>
1086
+ <a name='L1021'></a><a href='#L1021'>1021</a>
1087
+ <a name='L1022'></a><a href='#L1022'>1022</a>
1088
+ <a name='L1023'></a><a href='#L1023'>1023</a>
1089
+ <a name='L1024'></a><a href='#L1024'>1024</a>
1090
+ <a name='L1025'></a><a href='#L1025'>1025</a>
1091
+ <a name='L1026'></a><a href='#L1026'>1026</a>
1092
+ <a name='L1027'></a><a href='#L1027'>1027</a>
1093
+ <a name='L1028'></a><a href='#L1028'>1028</a>
1094
+ <a name='L1029'></a><a href='#L1029'>1029</a>
1095
+ <a name='L1030'></a><a href='#L1030'>1030</a>
1096
+ <a name='L1031'></a><a href='#L1031'>1031</a>
1097
+ <a name='L1032'></a><a href='#L1032'>1032</a>
1098
+ <a name='L1033'></a><a href='#L1033'>1033</a>
1099
+ <a name='L1034'></a><a href='#L1034'>1034</a>
1100
+ <a name='L1035'></a><a href='#L1035'>1035</a>
1101
+ <a name='L1036'></a><a href='#L1036'>1036</a>
1102
+ <a name='L1037'></a><a href='#L1037'>1037</a>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a>
1127
+ <a name='L1062'></a><a href='#L1062'>1062</a>
1128
+ <a name='L1063'></a><a href='#L1063'>1063</a>
1129
+ <a name='L1064'></a><a href='#L1064'>1064</a>
1130
+ <a name='L1065'></a><a href='#L1065'>1065</a>
1131
+ <a name='L1066'></a><a href='#L1066'>1066</a>
1132
+ <a name='L1067'></a><a href='#L1067'>1067</a>
1133
+ <a name='L1068'></a><a href='#L1068'>1068</a>
1134
+ <a name='L1069'></a><a href='#L1069'>1069</a>
1135
+ <a name='L1070'></a><a href='#L1070'>1070</a>
1136
+ <a name='L1071'></a><a href='#L1071'>1071</a>
1137
+ <a name='L1072'></a><a href='#L1072'>1072</a>
1138
+ <a name='L1073'></a><a href='#L1073'>1073</a>
1139
+ <a name='L1074'></a><a href='#L1074'>1074</a>
1140
+ <a name='L1075'></a><a href='#L1075'>1075</a>
1141
+ <a name='L1076'></a><a href='#L1076'>1076</a>
1142
+ <a name='L1077'></a><a href='#L1077'>1077</a>
1143
+ <a name='L1078'></a><a href='#L1078'>1078</a>
1144
+ <a name='L1079'></a><a href='#L1079'>1079</a>
1145
+ <a name='L1080'></a><a href='#L1080'>1080</a>
1146
+ <a name='L1081'></a><a href='#L1081'>1081</a>
1147
+ <a name='L1082'></a><a href='#L1082'>1082</a>
1148
+ <a name='L1083'></a><a href='#L1083'>1083</a>
1149
+ <a name='L1084'></a><a href='#L1084'>1084</a>
1150
+ <a name='L1085'></a><a href='#L1085'>1085</a>
1151
+ <a name='L1086'></a><a href='#L1086'>1086</a>
1152
+ <a name='L1087'></a><a href='#L1087'>1087</a>
1153
+ <a name='L1088'></a><a href='#L1088'>1088</a>
1154
+ <a name='L1089'></a><a href='#L1089'>1089</a>
1155
+ <a name='L1090'></a><a href='#L1090'>1090</a>
1156
+ <a name='L1091'></a><a href='#L1091'>1091</a>
1157
+ <a name='L1092'></a><a href='#L1092'>1092</a>
1158
+ <a name='L1093'></a><a href='#L1093'>1093</a>
1159
+ <a name='L1094'></a><a href='#L1094'>1094</a>
1160
+ <a name='L1095'></a><a href='#L1095'>1095</a>
1161
+ <a name='L1096'></a><a href='#L1096'>1096</a>
1162
+ <a name='L1097'></a><a href='#L1097'>1097</a>
1163
+ <a name='L1098'></a><a href='#L1098'>1098</a>
1164
+ <a name='L1099'></a><a href='#L1099'>1099</a>
1165
+ <a name='L1100'></a><a href='#L1100'>1100</a>
1166
+ <a name='L1101'></a><a href='#L1101'>1101</a>
1167
+ <a name='L1102'></a><a href='#L1102'>1102</a>
1168
+ <a name='L1103'></a><a href='#L1103'>1103</a>
1169
+ <a name='L1104'></a><a href='#L1104'>1104</a>
1170
+ <a name='L1105'></a><a href='#L1105'>1105</a>
1171
+ <a name='L1106'></a><a href='#L1106'>1106</a>
1172
+ <a name='L1107'></a><a href='#L1107'>1107</a>
1173
+ <a name='L1108'></a><a href='#L1108'>1108</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
1176
  <span class="cline-any cline-no">&nbsp;</span>
845
1177
  <span class="cline-any cline-no">&nbsp;</span>
846
1178
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -866,6 +1198,7 @@
866
1198
  <span class="cline-any cline-neutral">&nbsp;</span>
867
1199
  <span class="cline-any cline-neutral">&nbsp;</span>
868
1200
  <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
869
1202
  <span class="cline-any cline-neutral">&nbsp;</span>
870
1203
  <span class="cline-any cline-neutral">&nbsp;</span>
871
1204
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -893,6 +1226,21 @@
893
1226
  <span class="cline-any cline-neutral">&nbsp;</span>
894
1227
  <span class="cline-any cline-no">&nbsp;</span>
895
1228
  <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
1244
  <span class="cline-any cline-neutral">&nbsp;</span>
897
1245
  <span class="cline-any cline-neutral">&nbsp;</span>
898
1246
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -916,6 +1264,8 @@
916
1264
  <span class="cline-any cline-no">&nbsp;</span>
917
1265
  <span class="cline-any cline-no">&nbsp;</span>
918
1266
  <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
1269
  <span class="cline-any cline-neutral">&nbsp;</span>
920
1270
  <span class="cline-any cline-neutral">&nbsp;</span>
921
1271
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -970,6 +1320,12 @@
970
1320
  <span class="cline-any cline-no">&nbsp;</span>
971
1321
  <span class="cline-any cline-neutral">&nbsp;</span>
972
1322
  <span class="cline-any cline-neutral">&nbsp;</span>
1323
+ <span class="cline-any cline-neutral">&nbsp;</span>
1324
+ <span class="cline-any cline-neutral">&nbsp;</span>
1325
+ <span class="cline-any cline-no">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-neutral">&nbsp;</span>
1328
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
1329
  <span class="cline-any cline-no">&nbsp;</span>
974
1330
  <span class="cline-any cline-no">&nbsp;</span>
975
1331
  <span class="cline-any cline-no">&nbsp;</span>
@@ -986,15 +1342,15 @@
986
1342
  <span class="cline-any cline-neutral">&nbsp;</span>
987
1343
  <span class="cline-any cline-neutral">&nbsp;</span>
988
1344
  <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-no">&nbsp;</span>
990
- <span class="cline-any cline-neutral">&nbsp;</span>
991
1345
  <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-no">&nbsp;</span>
992
1347
  <span class="cline-any cline-neutral">&nbsp;</span>
993
1348
  <span class="cline-any cline-neutral">&nbsp;</span>
994
1349
  <span class="cline-any cline-neutral">&nbsp;</span>
995
1350
  <span class="cline-any cline-neutral">&nbsp;</span>
996
1351
  <span class="cline-any cline-neutral">&nbsp;</span>
997
1352
  <span class="cline-any cline-neutral">&nbsp;</span>
1353
+ <span class="cline-any cline-no">&nbsp;</span>
998
1354
  <span class="cline-any cline-neutral">&nbsp;</span>
999
1355
  <span class="cline-any cline-no">&nbsp;</span>
1000
1356
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1021,6 +1377,8 @@
1021
1377
  <span class="cline-any cline-neutral">&nbsp;</span>
1022
1378
  <span class="cline-any cline-neutral">&nbsp;</span>
1023
1379
  <span class="cline-any cline-neutral">&nbsp;</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1024
1382
  <span class="cline-any cline-no">&nbsp;</span>
1025
1383
  <span class="cline-any cline-no">&nbsp;</span>
1026
1384
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1039,6 +1397,7 @@
1039
1397
  <span class="cline-any cline-no">&nbsp;</span>
1040
1398
  <span class="cline-any cline-no">&nbsp;</span>
1041
1399
  <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1042
1401
  <span class="cline-any cline-neutral">&nbsp;</span>
1043
1402
  <span class="cline-any cline-no">&nbsp;</span>
1044
1403
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1184,11 +1543,35 @@
1184
1543
  <span class="cline-any cline-neutral">&nbsp;</span>
1185
1544
  <span class="cline-any cline-neutral">&nbsp;</span>
1186
1545
  <span class="cline-any cline-no">&nbsp;</span>
1546
+ <span class="cline-any cline-no">&nbsp;</span>
1547
+ <span class="cline-any cline-no">&nbsp;</span>
1548
+ <span class="cline-any cline-no">&nbsp;</span>
1549
+ <span class="cline-any cline-neutral">&nbsp;</span>
1550
+ <span class="cline-any cline-no">&nbsp;</span>
1551
+ <span class="cline-any cline-neutral">&nbsp;</span>
1552
+ <span class="cline-any cline-no">&nbsp;</span>
1553
+ <span class="cline-any cline-neutral">&nbsp;</span>
1554
+ <span class="cline-any cline-neutral">&nbsp;</span>
1555
+ <span class="cline-any cline-neutral">&nbsp;</span>
1556
+ <span class="cline-any cline-neutral">&nbsp;</span>
1557
+ <span class="cline-any cline-neutral">&nbsp;</span>
1558
+ <span class="cline-any cline-neutral">&nbsp;</span>
1559
+ <span class="cline-any cline-no">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-neutral">&nbsp;</span>
1562
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
1563
  <span class="cline-any cline-neutral">&nbsp;</span>
1188
1564
  <span class="cline-any cline-neutral">&nbsp;</span>
1189
1565
  <span class="cline-any cline-neutral">&nbsp;</span>
1190
1566
  <span class="cline-any cline-neutral">&nbsp;</span>
1191
1567
  <span class="cline-any cline-neutral">&nbsp;</span>
1568
+ <span class="cline-any cline-neutral">&nbsp;</span>
1569
+ <span class="cline-any cline-no">&nbsp;</span>
1570
+ <span class="cline-any cline-no">&nbsp;</span>
1571
+ <span class="cline-any cline-no">&nbsp;</span>
1572
+ <span class="cline-any cline-no">&nbsp;</span>
1573
+ <span class="cline-any cline-neutral">&nbsp;</span>
1574
+ <span class="cline-any cline-no">&nbsp;</span>
1192
1575
  <span class="cline-any cline-no">&nbsp;</span>
1193
1576
  <span class="cline-any cline-no">&nbsp;</span>
1194
1577
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1196,18 +1579,39 @@
1196
1579
  <span class="cline-any cline-neutral">&nbsp;</span>
1197
1580
  <span class="cline-any cline-neutral">&nbsp;</span>
1198
1581
  <span class="cline-any cline-no">&nbsp;</span>
1582
+ <span class="cline-any cline-neutral">&nbsp;</span>
1583
+ <span class="cline-any cline-neutral">&nbsp;</span>
1584
+ <span class="cline-any cline-neutral">&nbsp;</span>
1585
+ <span class="cline-any cline-neutral">&nbsp;</span>
1586
+ <span class="cline-any cline-neutral">&nbsp;</span>
1587
+ <span class="cline-any cline-neutral">&nbsp;</span>
1588
+ <span class="cline-any cline-neutral">&nbsp;</span>
1589
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
1590
  <span class="cline-any cline-no">&nbsp;</span>
1200
1591
  <span class="cline-any cline-no">&nbsp;</span>
1201
1592
  <span class="cline-any cline-no">&nbsp;</span>
1593
+ <span class="cline-any cline-no">&nbsp;</span>
1594
+ <span class="cline-any cline-no">&nbsp;</span>
1595
+ <span class="cline-any cline-no">&nbsp;</span>
1596
+ <span class="cline-any cline-no">&nbsp;</span>
1597
+ <span class="cline-any cline-neutral">&nbsp;</span>
1598
+ <span class="cline-any cline-neutral">&nbsp;</span>
1599
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
1600
  <span class="cline-any cline-neutral">&nbsp;</span>
1203
1601
  <span class="cline-any cline-no">&nbsp;</span>
1204
1602
  <span class="cline-any cline-no">&nbsp;</span>
1603
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
1604
  <span class="cline-any cline-no">&nbsp;</span>
1206
1605
  <span class="cline-any cline-neutral">&nbsp;</span>
1207
1606
  <span class="cline-any cline-neutral">&nbsp;</span>
1208
1607
  <span class="cline-any cline-neutral">&nbsp;</span>
1209
1608
  <span class="cline-any cline-neutral">&nbsp;</span>
1210
1609
  <span class="cline-any cline-no">&nbsp;</span>
1610
+ <span class="cline-any cline-no">&nbsp;</span>
1611
+ <span class="cline-any cline-no">&nbsp;</span>
1612
+ <span class="cline-any cline-neutral">&nbsp;</span>
1613
+ <span class="cline-any cline-neutral">&nbsp;</span>
1614
+ <span class="cline-any cline-no">&nbsp;</span>
1211
1615
  <span class="cline-any cline-neutral">&nbsp;</span>
1212
1616
  <span class="cline-any cline-neutral">&nbsp;</span>
1213
1617
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1378,12 +1782,54 @@
1378
1782
  <span class="cline-any cline-neutral">&nbsp;</span>
1379
1783
  <span class="cline-any cline-neutral">&nbsp;</span>
1380
1784
  <span class="cline-any cline-neutral">&nbsp;</span>
1785
+ <span class="cline-any cline-no">&nbsp;</span>
1786
+ <span class="cline-any cline-no">&nbsp;</span>
1787
+ <span class="cline-any cline-no">&nbsp;</span>
1788
+ <span class="cline-any cline-no">&nbsp;</span>
1789
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
1790
  <span class="cline-any cline-neutral">&nbsp;</span>
1382
1791
  <span class="cline-any cline-no">&nbsp;</span>
1383
1792
  <span class="cline-any cline-no">&nbsp;</span>
1793
+ <span class="cline-any cline-no">&nbsp;</span>
1384
1794
  <span class="cline-any cline-neutral">&nbsp;</span>
1385
1795
  <span class="cline-any cline-no">&nbsp;</span>
1796
+ <span class="cline-any cline-neutral">&nbsp;</span>
1797
+ <span class="cline-any cline-neutral">&nbsp;</span>
1798
+ <span class="cline-any cline-neutral">&nbsp;</span>
1799
+ <span class="cline-any cline-neutral">&nbsp;</span>
1800
+ <span class="cline-any cline-neutral">&nbsp;</span>
1801
+ <span class="cline-any cline-neutral">&nbsp;</span>
1802
+ <span class="cline-any cline-neutral">&nbsp;</span>
1803
+ <span class="cline-any cline-no">&nbsp;</span>
1804
+ <span class="cline-any cline-no">&nbsp;</span>
1386
1805
  <span class="cline-any cline-no">&nbsp;</span>
1806
+ <span class="cline-any cline-no">&nbsp;</span>
1807
+ <span class="cline-any cline-neutral">&nbsp;</span>
1808
+ <span class="cline-any cline-no">&nbsp;</span>
1809
+ <span class="cline-any cline-no">&nbsp;</span>
1810
+ <span class="cline-any cline-no">&nbsp;</span>
1811
+ <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-neutral">&nbsp;</span>
1813
+ <span class="cline-any cline-neutral">&nbsp;</span>
1814
+ <span class="cline-any cline-neutral">&nbsp;</span>
1815
+ <span class="cline-any cline-neutral">&nbsp;</span>
1816
+ <span class="cline-any cline-neutral">&nbsp;</span>
1817
+ <span class="cline-any cline-neutral">&nbsp;</span>
1818
+ <span class="cline-any cline-neutral">&nbsp;</span>
1819
+ <span class="cline-any cline-neutral">&nbsp;</span>
1820
+ <span class="cline-any cline-neutral">&nbsp;</span>
1821
+ <span class="cline-any cline-neutral">&nbsp;</span>
1822
+ <span class="cline-any cline-neutral">&nbsp;</span>
1823
+ <span class="cline-any cline-neutral">&nbsp;</span>
1824
+ <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-neutral">&nbsp;</span>
1826
+ <span class="cline-any cline-neutral">&nbsp;</span>
1827
+ <span class="cline-any cline-neutral">&nbsp;</span>
1828
+ <span class="cline-any cline-neutral">&nbsp;</span>
1829
+ <span class="cline-any cline-neutral">&nbsp;</span>
1830
+ <span class="cline-any cline-neutral">&nbsp;</span>
1831
+ <span class="cline-any cline-neutral">&nbsp;</span>
1832
+ <span class="cline-any cline-neutral">&nbsp;</span>
1387
1833
  <span class="cline-any cline-neutral">&nbsp;</span>
1388
1834
  <span class="cline-any cline-neutral">&nbsp;</span>
1389
1835
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1391,33 +1837,119 @@
1391
1837
  <span class="cline-any cline-neutral">&nbsp;</span>
1392
1838
  <span class="cline-any cline-no">&nbsp;</span>
1393
1839
  <span class="cline-any cline-no">&nbsp;</span>
1840
+ <span class="cline-any cline-no">&nbsp;</span>
1841
+ <span class="cline-any cline-neutral">&nbsp;</span>
1394
1842
  <span class="cline-any cline-neutral">&nbsp;</span>
1843
+ <span class="cline-any cline-neutral">&nbsp;</span>
1844
+ <span class="cline-any cline-neutral">&nbsp;</span>
1845
+ <span class="cline-any cline-neutral">&nbsp;</span>
1846
+ <span class="cline-any cline-neutral">&nbsp;</span>
1847
+ <span class="cline-any cline-neutral">&nbsp;</span>
1848
+ <span class="cline-any cline-no">&nbsp;</span>
1395
1849
  <span class="cline-any cline-no">&nbsp;</span>
1396
1850
  <span class="cline-any cline-no">&nbsp;</span>
1397
1851
  <span class="cline-any cline-neutral">&nbsp;</span>
1398
1852
  <span class="cline-any cline-no">&nbsp;</span>
1853
+ <span class="cline-any cline-no">&nbsp;</span>
1854
+ <span class="cline-any cline-no">&nbsp;</span>
1855
+ <span class="cline-any cline-no">&nbsp;</span>
1856
+ <span class="cline-any cline-no">&nbsp;</span>
1857
+ <span class="cline-any cline-no">&nbsp;</span>
1858
+ <span class="cline-any cline-no">&nbsp;</span>
1859
+ <span class="cline-any cline-no">&nbsp;</span>
1399
1860
  <span class="cline-any cline-neutral">&nbsp;</span>
1400
1861
  <span class="cline-any cline-no">&nbsp;</span>
1862
+ <span class="cline-any cline-no">&nbsp;</span>
1863
+ <span class="cline-any cline-no">&nbsp;</span>
1401
1864
  <span class="cline-any cline-neutral">&nbsp;</span>
1402
1865
  <span class="cline-any cline-no">&nbsp;</span>
1866
+ <span class="cline-any cline-no">&nbsp;</span>
1867
+ <span class="cline-any cline-no">&nbsp;</span>
1868
+ <span class="cline-any cline-no">&nbsp;</span>
1403
1869
  <span class="cline-any cline-neutral">&nbsp;</span>
1870
+ <span class="cline-any cline-no">&nbsp;</span>
1871
+ <span class="cline-any cline-neutral">&nbsp;</span>
1872
+ <span class="cline-any cline-no">&nbsp;</span>
1873
+ <span class="cline-any cline-neutral">&nbsp;</span>
1874
+ <span class="cline-any cline-no">&nbsp;</span>
1404
1875
  <span class="cline-any cline-neutral">&nbsp;</span>
1405
1876
  <span class="cline-any cline-neutral">&nbsp;</span>
1406
1877
  <span class="cline-any cline-neutral">&nbsp;</span>
1407
1878
  <span class="cline-any cline-neutral">&nbsp;</span>
1408
1879
  <span class="cline-any cline-no">&nbsp;</span>
1880
+ <span class="cline-any cline-neutral">&nbsp;</span>
1409
1881
  <span class="cline-any cline-no">&nbsp;</span>
1410
1882
  <span class="cline-any cline-neutral">&nbsp;</span>
1883
+ <span class="cline-any cline-no">&nbsp;</span>
1884
+ <span class="cline-any cline-no">&nbsp;</span>
1411
1885
  <span class="cline-any cline-neutral">&nbsp;</span>
1886
+ <span class="cline-any cline-no">&nbsp;</span>
1887
+ <span class="cline-any cline-no">&nbsp;</span>
1412
1888
  <span class="cline-any cline-neutral">&nbsp;</span>
1889
+ <span class="cline-any cline-no">&nbsp;</span>
1413
1890
  <span class="cline-any cline-neutral">&nbsp;</span>
1414
1891
  <span class="cline-any cline-neutral">&nbsp;</span>
1415
1892
  <span class="cline-any cline-neutral">&nbsp;</span>
1893
+ <span class="cline-any cline-no">&nbsp;</span>
1894
+ <span class="cline-any cline-no">&nbsp;</span>
1895
+ <span class="cline-any cline-no">&nbsp;</span>
1896
+ <span class="cline-any cline-no">&nbsp;</span>
1897
+ <span class="cline-any cline-no">&nbsp;</span>
1898
+ <span class="cline-any cline-no">&nbsp;</span>
1899
+ <span class="cline-any cline-no">&nbsp;</span>
1900
+ <span class="cline-any cline-no">&nbsp;</span>
1901
+ <span class="cline-any cline-no">&nbsp;</span>
1902
+ <span class="cline-any cline-no">&nbsp;</span>
1416
1903
  <span class="cline-any cline-neutral">&nbsp;</span>
1904
+ <span class="cline-any cline-no">&nbsp;</span>
1905
+ <span class="cline-any cline-no">&nbsp;</span>
1906
+ <span class="cline-any cline-no">&nbsp;</span>
1907
+ <span class="cline-any cline-no">&nbsp;</span>
1908
+ <span class="cline-any cline-no">&nbsp;</span>
1417
1909
  <span class="cline-any cline-neutral">&nbsp;</span>
1910
+ <span class="cline-any cline-no">&nbsp;</span>
1418
1911
  <span class="cline-any cline-neutral">&nbsp;</span>
1912
+ <span class="cline-any cline-no">&nbsp;</span>
1419
1913
  <span class="cline-any cline-neutral">&nbsp;</span>
1420
1914
  <span class="cline-any cline-no">&nbsp;</span>
1915
+ <span class="cline-any cline-neutral">&nbsp;</span>
1916
+ <span class="cline-any cline-neutral">&nbsp;</span>
1917
+ <span class="cline-any cline-neutral">&nbsp;</span>
1918
+ <span class="cline-any cline-neutral">&nbsp;</span>
1919
+ <span class="cline-any cline-no">&nbsp;</span>
1920
+ <span class="cline-any cline-neutral">&nbsp;</span>
1921
+ <span class="cline-any cline-no">&nbsp;</span>
1922
+ <span class="cline-any cline-neutral">&nbsp;</span>
1923
+ <span class="cline-any cline-no">&nbsp;</span>
1924
+ <span class="cline-any cline-no">&nbsp;</span>
1925
+ <span class="cline-any cline-neutral">&nbsp;</span>
1926
+ <span class="cline-any cline-neutral">&nbsp;</span>
1927
+ <span class="cline-any cline-neutral">&nbsp;</span>
1928
+ <span class="cline-any cline-neutral">&nbsp;</span>
1929
+ <span class="cline-any cline-neutral">&nbsp;</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-neutral">&nbsp;</span>
1932
+ <span class="cline-any cline-neutral">&nbsp;</span>
1933
+ <span class="cline-any cline-neutral">&nbsp;</span>
1934
+ <span class="cline-any cline-neutral">&nbsp;</span>
1935
+ <span class="cline-any cline-no">&nbsp;</span>
1936
+ <span class="cline-any cline-neutral">&nbsp;</span>
1937
+ <span class="cline-any cline-neutral">&nbsp;</span>
1938
+ <span class="cline-any cline-neutral">&nbsp;</span>
1939
+ <span class="cline-any cline-neutral">&nbsp;</span>
1940
+ <span class="cline-any cline-neutral">&nbsp;</span>
1941
+ <span class="cline-any cline-neutral">&nbsp;</span>
1942
+ <span class="cline-any cline-no">&nbsp;</span>
1943
+ <span class="cline-any cline-no">&nbsp;</span>
1944
+ <span class="cline-any cline-neutral">&nbsp;</span>
1945
+ <span class="cline-any cline-no">&nbsp;</span>
1946
+ <span class="cline-any cline-neutral">&nbsp;</span>
1947
+ <span class="cline-any cline-neutral">&nbsp;</span>
1948
+ <span class="cline-any cline-neutral">&nbsp;</span>
1949
+ <span class="cline-any cline-no">&nbsp;</span>
1950
+ <span class="cline-any cline-no">&nbsp;</span>
1951
+ <span class="cline-any cline-no">&nbsp;</span>
1952
+ <span class="cline-any cline-neutral">&nbsp;</span>
1421
1953
  <span class="cline-any cline-no">&nbsp;</span>
1422
1954
  <span class="cline-any cline-no">&nbsp;</span>
1423
1955
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1428,14 +1960,30 @@
1428
1960
  <span class="cline-any cline-neutral">&nbsp;</span>
1429
1961
  <span class="cline-any cline-neutral">&nbsp;</span>
1430
1962
  <span class="cline-any cline-neutral">&nbsp;</span>
1963
+ <span class="cline-any cline-no">&nbsp;</span>
1964
+ <span class="cline-any cline-no">&nbsp;</span>
1965
+ <span class="cline-any cline-no">&nbsp;</span>
1966
+ <span class="cline-any cline-neutral">&nbsp;</span>
1967
+ <span class="cline-any cline-no">&nbsp;</span>
1968
+ <span class="cline-any cline-no">&nbsp;</span>
1969
+ <span class="cline-any cline-no">&nbsp;</span>
1970
+ <span class="cline-any cline-neutral">&nbsp;</span>
1971
+ <span class="cline-any cline-neutral">&nbsp;</span>
1972
+ <span class="cline-any cline-no">&nbsp;</span>
1973
+ <span class="cline-any cline-no">&nbsp;</span>
1974
+ <span class="cline-any cline-neutral">&nbsp;</span>
1975
+ <span class="cline-any cline-no">&nbsp;</span>
1431
1976
  <span class="cline-any cline-neutral">&nbsp;</span>
1432
1977
  <span class="cline-any cline-no">&nbsp;</span>
1433
1978
  <span class="cline-any cline-neutral">&nbsp;</span>
1979
+ <span class="cline-any cline-no">&nbsp;</span>
1434
1980
  <span class="cline-any cline-neutral">&nbsp;</span>
1435
1981
  <span class="cline-any cline-neutral">&nbsp;</span>
1436
1982
  <span class="cline-any cline-neutral">&nbsp;</span>
1437
1983
  <span class="cline-any cline-neutral">&nbsp;</span>
1438
1984
  <span class="cline-any cline-neutral">&nbsp;</span>
1985
+ <span class="cline-any cline-no">&nbsp;</span>
1986
+ <span class="cline-any cline-no">&nbsp;</span>
1439
1987
  <span class="cline-any cline-neutral">&nbsp;</span>
1440
1988
  <span class="cline-any cline-neutral">&nbsp;</span>
1441
1989
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1448,10 +1996,14 @@
1448
1996
  <span class="cline-any cline-neutral">&nbsp;</span>
1449
1997
  <span class="cline-any cline-no">&nbsp;</span>
1450
1998
  <span class="cline-any cline-no">&nbsp;</span>
1999
+ <span class="cline-any cline-no">&nbsp;</span>
1451
2000
  <span class="cline-any cline-neutral">&nbsp;</span>
1452
2001
  <span class="cline-any cline-no">&nbsp;</span>
1453
2002
  <span class="cline-any cline-neutral">&nbsp;</span>
1454
2003
  <span class="cline-any cline-neutral">&nbsp;</span>
2004
+ <span class="cline-any cline-neutral">&nbsp;</span>
2005
+ <span class="cline-any cline-neutral">&nbsp;</span>
2006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1455
2007
  <span class="cline-any cline-no">&nbsp;</span>
1456
2008
  <span class="cline-any cline-neutral">&nbsp;</span>
1457
2009
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1459,10 +2011,39 @@
1459
2011
  <span class="cline-any cline-neutral">&nbsp;</span>
1460
2012
  <span class="cline-any cline-neutral">&nbsp;</span>
1461
2013
  <span class="cline-any cline-neutral">&nbsp;</span>
2014
+ <span class="cline-any cline-neutral">&nbsp;</span>
2015
+ <span class="cline-any cline-neutral">&nbsp;</span>
2016
+ <span class="cline-any cline-neutral">&nbsp;</span>
2017
+ <span class="cline-any cline-neutral">&nbsp;</span>
2018
+ <span class="cline-any cline-neutral">&nbsp;</span>
2019
+ <span class="cline-any cline-neutral">&nbsp;</span>
2020
+ <span class="cline-any cline-neutral">&nbsp;</span>
2021
+ <span class="cline-any cline-neutral">&nbsp;</span>
2022
+ <span class="cline-any cline-neutral">&nbsp;</span>
2023
+ <span class="cline-any cline-neutral">&nbsp;</span>
2024
+ <span class="cline-any cline-neutral">&nbsp;</span>
2025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1462
2026
  <span class="cline-any cline-no">&nbsp;</span>
1463
2027
  <span class="cline-any cline-no">&nbsp;</span>
1464
2028
  <span class="cline-any cline-neutral">&nbsp;</span>
1465
2029
  <span class="cline-any cline-no">&nbsp;</span>
2030
+ <span class="cline-any cline-neutral">&nbsp;</span>
2031
+ <span class="cline-any cline-neutral">&nbsp;</span>
2032
+ <span class="cline-any cline-no">&nbsp;</span>
2033
+ <span class="cline-any cline-neutral">&nbsp;</span>
2034
+ <span class="cline-any cline-neutral">&nbsp;</span>
2035
+ <span class="cline-any cline-neutral">&nbsp;</span>
2036
+ <span class="cline-any cline-neutral">&nbsp;</span>
2037
+ <span class="cline-any cline-neutral">&nbsp;</span>
2038
+ <span class="cline-any cline-neutral">&nbsp;</span>
2039
+ <span class="cline-any cline-no">&nbsp;</span>
2040
+ <span class="cline-any cline-no">&nbsp;</span>
2041
+ <span class="cline-any cline-no">&nbsp;</span>
2042
+ <span class="cline-any cline-no">&nbsp;</span>
2043
+ <span class="cline-any cline-neutral">&nbsp;</span>
2044
+ <span class="cline-any cline-no">&nbsp;</span>
2045
+ <span class="cline-any cline-no">&nbsp;</span>
2046
+ <span class="cline-any cline-no">&nbsp;</span>
1466
2047
  <span class="cline-any cline-no">&nbsp;</span>
1467
2048
  <span class="cline-any cline-neutral">&nbsp;</span>
1468
2049
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1493,6 +2074,8 @@
1493
2074
  <span class="cline-any cline-neutral">&nbsp;</span>
1494
2075
  <span class="cline-any cline-neutral">&nbsp;</span>
1495
2076
  <span class="cline-any cline-no">&nbsp;</span>
2077
+ <span class="cline-any cline-no">&nbsp;</span>
2078
+ <span class="cline-any cline-no">&nbsp;</span>
1496
2079
  <span class="cline-any cline-neutral">&nbsp;</span>
1497
2080
  <span class="cline-any cline-no">&nbsp;</span>
1498
2081
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1527,41 +2110,113 @@
1527
2110
  <span class="cline-any cline-neutral">&nbsp;</span>
1528
2111
  <span class="cline-any cline-neutral">&nbsp;</span>
1529
2112
  <span class="cline-any cline-no">&nbsp;</span>
2113
+ <span class="cline-any cline-no">&nbsp;</span>
2114
+ <span class="cline-any cline-neutral">&nbsp;</span>
2115
+ <span class="cline-any cline-no">&nbsp;</span>
2116
+ <span class="cline-any cline-no">&nbsp;</span>
2117
+ <span class="cline-any cline-no">&nbsp;</span>
2118
+ <span class="cline-any cline-no">&nbsp;</span>
2119
+ <span class="cline-any cline-no">&nbsp;</span>
2120
+ <span class="cline-any cline-no">&nbsp;</span>
2121
+ <span class="cline-any cline-no">&nbsp;</span>
1530
2122
  <span class="cline-any cline-neutral">&nbsp;</span>
1531
2123
  <span class="cline-any cline-no">&nbsp;</span>
1532
2124
  <span class="cline-any cline-neutral">&nbsp;</span>
1533
2125
  <span class="cline-any cline-neutral">&nbsp;</span>
1534
2126
  <span class="cline-any cline-no">&nbsp;</span>
1535
2127
  <span class="cline-any cline-neutral">&nbsp;</span>
2128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1536
2129
  <span class="cline-any cline-no">&nbsp;</span>
1537
2130
  <span class="cline-any cline-no">&nbsp;</span>
2131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1538
2132
  <span class="cline-any cline-no">&nbsp;</span>
1539
2133
  <span class="cline-any cline-no">&nbsp;</span>
1540
2134
  <span class="cline-any cline-neutral">&nbsp;</span>
2135
+ <span class="cline-any cline-no">&nbsp;</span>
1541
2136
  <span class="cline-any cline-neutral">&nbsp;</span>
1542
2137
  <span class="cline-any cline-neutral">&nbsp;</span>
1543
2138
  <span class="cline-any cline-no">&nbsp;</span>
2139
+ <span class="cline-any cline-no">&nbsp;</span>
1544
2140
  <span class="cline-any cline-neutral">&nbsp;</span>
1545
2141
  <span class="cline-any cline-no">&nbsp;</span>
2142
+ <span class="cline-any cline-no">&nbsp;</span>
2143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1546
2144
  <span class="cline-any cline-neutral">&nbsp;</span>
1547
2145
  <span class="cline-any cline-no">&nbsp;</span>
1548
2146
  <span class="cline-any cline-no">&nbsp;</span>
1549
2147
  <span class="cline-any cline-neutral">&nbsp;</span>
2148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1550
2149
  <span class="cline-any cline-no">&nbsp;</span>
1551
2150
  <span class="cline-any cline-no">&nbsp;</span>
1552
2151
  <span class="cline-any cline-neutral">&nbsp;</span>
1553
2152
  <span class="cline-any cline-neutral">&nbsp;</span>
1554
2153
  <span class="cline-any cline-no">&nbsp;</span>
2154
+ <span class="cline-any cline-neutral">&nbsp;</span>
2155
+ <span class="cline-any cline-neutral">&nbsp;</span>
2156
+ <span class="cline-any cline-no">&nbsp;</span>
2157
+ <span class="cline-any cline-neutral">&nbsp;</span>
2158
+ <span class="cline-any cline-no">&nbsp;</span>
1555
2159
  <span class="cline-any cline-no">&nbsp;</span>
2160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1556
2161
  <span class="cline-any cline-no">&nbsp;</span>
2162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1557
2163
  <span class="cline-any cline-no">&nbsp;</span>
1558
2164
  <span class="cline-any cline-neutral">&nbsp;</span>
1559
2165
  <span class="cline-any cline-neutral">&nbsp;</span>
2166
+ <span class="cline-any cline-neutral">&nbsp;</span>
2167
+ <span class="cline-any cline-no">&nbsp;</span>
2168
+ <span class="cline-any cline-no">&nbsp;</span>
2169
+ <span class="cline-any cline-no">&nbsp;</span>
2170
+ <span class="cline-any cline-neutral">&nbsp;</span>
2171
+ <span class="cline-any cline-no">&nbsp;</span>
2172
+ <span class="cline-any cline-no">&nbsp;</span>
2173
+ <span class="cline-any cline-no">&nbsp;</span>
2174
+ <span class="cline-any cline-no">&nbsp;</span>
2175
+ <span class="cline-any cline-no">&nbsp;</span>
2176
+ <span class="cline-any cline-neutral">&nbsp;</span>
2177
+ <span class="cline-any cline-neutral">&nbsp;</span>
2178
+ <span class="cline-any cline-neutral">&nbsp;</span>
2179
+ <span class="cline-any cline-no">&nbsp;</span>
2180
+ <span class="cline-any cline-no">&nbsp;</span>
2181
+ <span class="cline-any cline-neutral">&nbsp;</span>
2182
+ <span class="cline-any cline-no">&nbsp;</span>
2183
+ <span class="cline-any cline-no">&nbsp;</span>
2184
+ <span class="cline-any cline-no">&nbsp;</span>
2185
+ <span class="cline-any cline-neutral">&nbsp;</span>
2186
+ <span class="cline-any cline-neutral">&nbsp;</span>
2187
+ <span class="cline-any cline-neutral">&nbsp;</span>
2188
+ <span class="cline-any cline-neutral">&nbsp;</span>
2189
+ <span class="cline-any cline-no">&nbsp;</span>
2190
+ <span class="cline-any cline-neutral">&nbsp;</span>
2191
+ <span class="cline-any cline-neutral">&nbsp;</span>
2192
+ <span class="cline-any cline-neutral">&nbsp;</span>
2193
+ <span class="cline-any cline-no">&nbsp;</span>
2194
+ <span class="cline-any cline-neutral">&nbsp;</span>
2195
+ <span class="cline-any cline-neutral">&nbsp;</span>
2196
+ <span class="cline-any cline-no">&nbsp;</span>
2197
+ <span class="cline-any cline-no">&nbsp;</span>
1560
2198
  <span class="cline-any cline-no">&nbsp;</span>
1561
2199
  <span class="cline-any cline-no">&nbsp;</span>
1562
2200
  <span class="cline-any cline-no">&nbsp;</span>
1563
2201
  <span class="cline-any cline-neutral">&nbsp;</span>
1564
2202
  <span class="cline-any cline-neutral">&nbsp;</span>
2203
+ <span class="cline-any cline-no">&nbsp;</span>
2204
+ <span class="cline-any cline-no">&nbsp;</span>
2205
+ <span class="cline-any cline-no">&nbsp;</span>
2206
+ <span class="cline-any cline-no">&nbsp;</span>
2207
+ <span class="cline-any cline-neutral">&nbsp;</span>
2208
+ <span class="cline-any cline-neutral">&nbsp;</span>
2209
+ <span class="cline-any cline-neutral">&nbsp;</span>
2210
+ <span class="cline-any cline-no">&nbsp;</span>
2211
+ <span class="cline-any cline-neutral">&nbsp;</span>
2212
+ <span class="cline-any cline-neutral">&nbsp;</span>
2213
+ <span class="cline-any cline-neutral">&nbsp;</span>
2214
+ <span class="cline-any cline-no">&nbsp;</span>
2215
+ <span class="cline-any cline-neutral">&nbsp;</span>
2216
+ <span class="cline-any cline-neutral">&nbsp;</span>
2217
+ <span class="cline-any cline-neutral">&nbsp;</span>
2218
+ <span class="cline-any cline-no">&nbsp;</span>
2219
+ <span class="cline-any cline-neutral">&nbsp;</span>
1565
2220
  <span class="cline-any cline-neutral">&nbsp;</span>
1566
2221
  <span class="cline-any cline-neutral">&nbsp;</span>
1567
2222
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1600,6 +2255,11 @@
1600
2255
  <span class="cline-any cline-neutral">&nbsp;</span>
1601
2256
  <span class="cline-any cline-no">&nbsp;</span>
1602
2257
  <span class="cline-any cline-no">&nbsp;</span>
2258
+ <span class="cline-any cline-neutral">&nbsp;</span>
2259
+ <span class="cline-any cline-neutral">&nbsp;</span>
2260
+ <span class="cline-any cline-neutral">&nbsp;</span>
2261
+ <span class="cline-any cline-no">&nbsp;</span>
2262
+ <span class="cline-any cline-no">&nbsp;</span>
1603
2263
  <span class="cline-any cline-no">&nbsp;</span>
1604
2264
  <span class="cline-any cline-no">&nbsp;</span>
1605
2265
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1617,7 +2277,9 @@
1617
2277
  <span class="cline-any cline-neutral">&nbsp;</span>
1618
2278
  <span class="cline-any cline-neutral">&nbsp;</span>
1619
2279
  <span class="cline-any cline-neutral">&nbsp;</span>
1620
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type Message from './messages.gen.js'
2280
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import ConditionsManager from '../modules/conditionsManager.js'</span>
2281
+ <span class="cstat-no" title="statement not covered" >import FeatureFlags from '../modules/featureFlags.js'</span>
2282
+ import type Message from './messages.gen.js'
1621
2283
  <span class="cstat-no" title="statement not covered" >import { Timestamp, Metadata, UserID, Type as MType, TabChange, TabData } from './messages.gen.js'</span>
1622
2284
  <span class="cstat-no" title="statement not covered" >import {</span>
1623
2285
  now,
@@ -1643,6 +2305,7 @@ import type { Options as LoggerOptions } from './logger.js'
1643
2305
  import type { Options as SessOptions } from './session.js'
1644
2306
  import type { Options as NetworkOptions } from '../modules/network.js'
1645
2307
  <span class="cstat-no" title="statement not covered" >import CanvasRecorder from './canvas.js'</span>
2308
+ <span class="cstat-no" title="statement not covered" >import UserTestManager from '../modules/userTesting/index.js'</span>
1646
2309
  &nbsp;
1647
2310
  import type {
1648
2311
  Options as WebworkerOptions,
@@ -1669,17 +2332,32 @@ interface OnStartInfo {
1669
2332
  }
1670
2333
  &nbsp;
1671
2334
  const CANCELED = <span class="cstat-no" title="statement not covered" >'canceled' as const</span>
2335
+ const uxtStorageKey = <span class="cstat-no" title="statement not covered" >'or_uxt_active'</span>
2336
+ const bufferStorageKey = <span class="cstat-no" title="statement not covered" >'or_buffer_1'</span>
1672
2337
  const START_ERROR = <span class="cstat-no" title="statement not covered" >':(' as const</span>
1673
- type SuccessfulStart = OnStartInfo &amp; { success: true }
2338
+ type SuccessfulStart = OnStartInfo &amp; {
2339
+ success: true
2340
+ }
1674
2341
  type UnsuccessfulStart = {
1675
2342
  reason: typeof CANCELED | string
1676
2343
  success: false
1677
2344
  }
1678
2345
  &nbsp;
1679
- type RickRoll = { source: string; context: string } &amp; (
1680
- | { line: 'never-gonna-give-you-up' }
1681
- | { line: 'never-gonna-let-you-down'; token: string }
1682
- | { line: 'never-gonna-run-around-and-desert-you'; token: string }
2346
+ type RickRoll = {
2347
+ source: string
2348
+ context: string
2349
+ } &amp; (
2350
+ | {
2351
+ line: 'never-gonna-give-you-up'
2352
+ }
2353
+ | {
2354
+ line: 'never-gonna-let-you-down'
2355
+ token: string
2356
+ }
2357
+ | {
2358
+ line: 'never-gonna-run-around-and-desert-you'
2359
+ token: string
2360
+ }
1683
2361
  )
1684
2362
  &nbsp;
1685
2363
  const UnsuccessfulStart = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(r</span>eason: string): UnsuccessfulStart =&gt; (<span class="cstat-no" title="statement not covered" >{ reason, success: false })</span></span>
@@ -1693,6 +2371,7 @@ type CommitCallback = (messages: Array&lt;Message&gt;) =&gt; void
1693
2371
  <span class="cstat-no" title="statement not covered" > NotActive,</span>
1694
2372
  <span class="cstat-no" title="statement not covered" > Starting,</span>
1695
2373
  <span class="cstat-no" title="statement not covered" > Active,</span>
2374
+ <span class="cstat-no" title="statement not covered" > ColdStart,</span>
1696
2375
  }
1697
2376
  &nbsp;
1698
2377
  type AppOptions = {
@@ -1714,6 +2393,7 @@ type AppOptions = {
1714
2393
  sessionStorage: Storage | null
1715
2394
  forceSingleTab?: boolean
1716
2395
  disableStringDict?: boolean
2396
+ assistSocketHost?: string
1717
2397
  &nbsp;
1718
2398
  // @deprecated
1719
2399
  onStart?: StartCallback
@@ -1745,8 +2425,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1745
2425
  readonly localStorage: Storage
1746
2426
  readonly sessionStorage: Storage
1747
2427
  private readonly <span class="cstat-no" title="statement not covered" >messages: Array&lt;Message&gt; = []</span>
2428
+ /**
2429
+ * we need 2 buffers so we don't lose anything
2430
+ * @read coldStart implementation
2431
+ * */
2432
+ private <span class="cstat-no" title="statement not covered" >bufferedMessages1: Array&lt;Message&gt; = []</span>
2433
+ private <span class="cstat-no" title="statement not covered" >bufferedMessages2: Array&lt;Message&gt; = []</span>
1748
2434
  /* private */
1749
- readonly observer: Observer // non-privat for attachContextCallback
2435
+ readonly observer: Observer // non-private for attachContextCallback
1750
2436
  private readonly <span class="cstat-no" title="statement not covered" >startCallbacks: Array&lt;StartCallback&gt; = []</span>
1751
2437
  private readonly <span class="cstat-no" title="statement not covered" >stopCallbacks: Array&lt;() =&gt; any&gt; = []</span>
1752
2438
  private readonly <span class="cstat-no" title="statement not covered" >commitCallbacks: Array&lt;CommitCallback&gt; = []</span>
@@ -1763,16 +2449,16 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1763
2449
  private readonly contextId
1764
2450
  public attributeSender: AttributeSender
1765
2451
  private <span class="cstat-no" title="statement not covered" >canvasRecorder: CanvasRecorder | null = null</span>
1766
- private <span class="cstat-no" title="statement not covered" >canvasOptions = {</span>
1767
- canvasEnabled: false,
1768
- canvasQuality: 'medium',
1769
- canvasFPS: 1,
1770
- }
1771
- &nbsp;
1772
- <span class="fstat-no" title="function not covered" > constructor(p</span>rojectKey: string, sessionToken: string | undefined, options: Partial&lt;Options&gt;) {
1773
- // if (options.onStart !== undefined) {
1774
- // deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
1775
- // } ?? maybe onStart is good
2452
+ private uxtManager: UserTestManager
2453
+ private <span class="cstat-no" title="statement not covered" >conditionsManager: ConditionsManager | null = null</span>
2454
+ public featureFlags: FeatureFlags
2455
+ &nbsp;
2456
+ <span class="fstat-no" title="function not covered" > constructor(</span>
2457
+ projectKey: string,
2458
+ sessionToken: string | undefined,
2459
+ options: Partial&lt;Options&gt;,
2460
+ private readonly <span class="cstat-no" title="statement not covered" >signalError: (error: string, apis: string[]) =&gt; void,</span>
2461
+ ) {
1776
2462
  <span class="cstat-no" title="statement not covered" > this.contextId = Math.random().toString(36).slice(2)</span>
1777
2463
  <span class="cstat-no" title="statement not covered" > this.projectKey = projectKey</span>
1778
2464
  <span class="cstat-no" title="statement not covered" > this.networkOptions = options.network</span>
@@ -1794,12 +2480,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1794
2480
  sessionStorage: null,
1795
2481
  disableStringDict: false,
1796
2482
  forceSingleTab: false,
2483
+ assistSocketHost: '',
1797
2484
  },
1798
2485
  options,
1799
2486
  )
1800
2487
  &nbsp;
1801
2488
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.options.forceSingleTab &amp;&amp; globalThis &amp;&amp; 'BroadcastChannel' in globalThis) {</span>
1802
- <span class="cstat-no" title="statement not covered" > this.bc = inIframe() ? null : new BroadcastChannel('rick')</span>
2489
+ const host = <span class="cstat-no" title="statement not covered" >location.hostname.split('.').slice(-2).join('_')</span>
2490
+ <span class="cstat-no" title="statement not covered" > this.bc = inIframe() ? null : new BroadcastChannel(`rick_${host}`)</span>
1803
2491
  }
1804
2492
  &nbsp;
1805
2493
  <span class="cstat-no" title="statement not covered" > this.revID = this.options.revID</span>
@@ -1814,6 +2502,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1814
2502
  <span class="cstat-no" title="statement not covered" > this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent)</span>
1815
2503
  <span class="cstat-no" title="statement not covered" > this.session = new Session(this, this.options)</span>
1816
2504
  <span class="cstat-no" title="statement not covered" > this.attributeSender = new AttributeSender(this, Boolean(this.options.disableStringDict))</span>
2505
+ <span class="cstat-no" title="statement not covered" > this.featureFlags = new FeatureFlags(this)</span>
1817
2506
  <span class="cstat-no" title="statement not covered" > this.session.attachUpdateCallback(<span class="fstat-no" title="function not covered" >({</span> userID, metadata }) =&gt; {</span>
1818
2507
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (userID != null) {</span>
1819
2508
  // TODO: nullable userID
@@ -1958,9 +2647,17 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1958
2647
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this._usingOldFetchPlugin &amp;&amp; message[0] === MType.NetworkRequest) {</span>
1959
2648
  <span class="cstat-no" title="statement not covered" > return</span>
1960
2649
  }
1961
- // ====================================================
1962
2650
  &nbsp;
1963
- <span class="cstat-no" title="statement not covered" > this.messages.push(message)</span>
2651
+ // ====================================================
2652
+ <span class="cstat-no" title="statement not covered" > if (this.activityState === ActivityState.ColdStart) {</span>
2653
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(message)</span>
2654
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.singleBuffer) {</span>
2655
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(message)</span>
2656
+ }
2657
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager?.processMessage(message)</span>
2658
+ } else {
2659
+ <span class="cstat-no" title="statement not covered" > this.messages.push(message)</span>
2660
+ }
1964
2661
  // TODO: commit on start if there were `urgent` sends;
1965
2662
  // Clarify where urgent can be used for;
1966
2663
  // Clarify workflow for each type of message in case it was sent before start
@@ -1971,7 +2668,11 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1971
2668
  }
1972
2669
  }
1973
2670
  &nbsp;
1974
- private <span class="fstat-no" title="function not covered" >commit(</span>): void {
2671
+ /**
2672
+ * Normal workflow: add timestamp and tab data to batch, then commit it
2673
+ * every ~30ms
2674
+ * */
2675
+ private <span class="fstat-no" title="function not covered" >_nCommit(</span>): void {
1975
2676
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker !== undefined &amp;&amp; this.messages.length) {</span>
1976
2677
  <span class="cstat-no" title="statement not covered" > requestIdleCb(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1977
2678
  <span class="cstat-no" title="statement not covered" > this.messages.unshift(TabData(this.session.getTabId()))</span>
@@ -1983,6 +2684,39 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1983
2684
  })
1984
2685
  }
1985
2686
  }
2687
+ &nbsp;
2688
+ <span class="cstat-no" title="statement not covered" > coldStartCommitN = 0</span>
2689
+ &nbsp;
2690
+ /**
2691
+ * Cold start: add timestamp and tab data to both batches
2692
+ * every 2nd tick, ~60ms
2693
+ * this will make batches a bit larger and replay will work with bigger jumps every frame
2694
+ * but in turn we don't overload batch writer on session start with 1000 batches
2695
+ * */
2696
+ private <span class="fstat-no" title="function not covered" >_cStartCommit(</span>): void {
2697
+ <span class="cstat-no" title="statement not covered" > this.coldStartCommitN += 1</span>
2698
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.coldStartCommitN === 2) {</span>
2699
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
2700
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
2701
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(Timestamp(this.timestamp()))</span>
2702
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(TabData(this.session.getTabId()))</span>
2703
+ <span class="cstat-no" title="statement not covered" > this.coldStartCommitN = 0</span>
2704
+ }
2705
+ }
2706
+ &nbsp;
2707
+ private <span class="fstat-no" title="function not covered" >commit(</span>): void {
2708
+ <span class="cstat-no" title="statement not covered" > if (this.activityState === ActivityState.ColdStart) {</span>
2709
+ <span class="cstat-no" title="statement not covered" > this._cStartCommit()</span>
2710
+ } else {
2711
+ <span class="cstat-no" title="statement not covered" > this._nCommit()</span>
2712
+ }
2713
+ }
2714
+ &nbsp;
2715
+ private <span class="fstat-no" title="function not covered" >postToWorker(</span>messages: Array&lt;Message&gt;) {
2716
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage(messages)</span>
2717
+ <span class="cstat-no" title="statement not covered" > this.commitCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(messages))</span></span>
2718
+ <span class="cstat-no" title="statement not covered" > messages.length = 0</span>
2719
+ }
1986
2720
  &nbsp;
1987
2721
  private <span class="cstat-no" title="statement not covered" >delay = 0</span>
1988
2722
  &nbsp;
@@ -2154,20 +2888,193 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2154
2888
  <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
2155
2889
  }
2156
2890
  }
2891
+ &nbsp;
2892
+ <span class="cstat-no" title="statement not covered" > coldInterval: ReturnType&lt;typeof setInterval&gt; | null = null</span>
2893
+ <span class="cstat-no" title="statement not covered" > orderNumber = 0</span>
2894
+ <span class="cstat-no" title="statement not covered" > coldStartTs = 0</span>
2895
+ <span class="cstat-no" title="statement not covered" > singleBuffer = false</span>
2896
+ &nbsp;
2897
+ private <span class="fstat-no" title="function not covered" >checkSessionToken(</span>forceNew?: boolean) {
2898
+ const lsReset = <span class="cstat-no" title="statement not covered" >this.sessionStorage.getItem(this.options.session_reset_key) !== null</span>
2899
+ const needNewSessionID = <span class="cstat-no" title="statement not covered" >forceNew || lsReset</span>
2900
+ const sessionToken = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
2901
+ &nbsp;
2902
+ <span class="cstat-no" title="statement not covered" > return needNewSessionID || !sessionToken</span>
2903
+ }
2904
+ /**
2905
+ * start buffering messages without starting the actual session, which gives
2906
+ * user 30 seconds to "activate" and record session by calling `start()` on conditional trigger
2907
+ * and we will then send buffered batch, so it won't get lost
2908
+ * */
2909
+ public async <span class="fstat-no" title="function not covered" >coldStart(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> conditional?: boolean) {
2910
+ <span class="cstat-no" title="statement not covered" > this.singleBuffer = false</span>
2911
+ const second = <span class="cstat-no" title="statement not covered" >1000</span>
2912
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (conditional) {</span>
2913
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager = new ConditionsManager(this, startOpts)</span>
2914
+ }
2915
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
2916
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (conditional) {</span>
2917
+ const r = <span class="cstat-no" title="statement not covered" >await fetch(this.options.ingestPoint + '/v1/web/start', {</span>
2918
+ method: 'POST',
2919
+ headers: {
2920
+ 'Content-Type': 'application/json',
2921
+ },
2922
+ body: JSON.stringify({
2923
+ ...this.getTrackerInfo(),
2924
+ timestamp: now(),
2925
+ doNotRecord: true,
2926
+ bufferDiff: 0,
2927
+ userID: this.session.getInfo().userID,
2928
+ token: undefined,
2929
+ deviceMemory,
2930
+ jsHeapSizeLimit,
2931
+ timezone: getTimezone(),
2932
+ }),
2933
+ })
2934
+ // this token is needed to fetch conditions and flags,
2935
+ // but it can't be used to record a session
2936
+ const {
2937
+ token,
2938
+ userBrowser,
2939
+ userCity,
2940
+ userCountry,
2941
+ userDevice,
2942
+ userOS,
2943
+ userState,
2944
+ projectID,
2945
+ } = <span class="cstat-no" title="statement not covered" >await r.json()</span>
2946
+ <span class="cstat-no" title="statement not covered" > this.session.assign({ projectID })</span>
2947
+ <span class="cstat-no" title="statement not covered" > this.session.setUserInfo({</span>
2948
+ userBrowser,
2949
+ userCity,
2950
+ userCountry,
2951
+ userDevice,
2952
+ userOS,
2953
+ userState,
2954
+ })
2955
+ <span class="cstat-no" title="statement not covered" > await this.conditionsManager?.fetchConditions(token as string)</span>
2956
+ <span class="cstat-no" title="statement not covered" > await this.featureFlags.reloadFlags(token as string)</span>
2957
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager?.processFlags(this.featureFlags.flags)</span>
2958
+ }
2959
+ const cycle = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2960
+ <span class="cstat-no" title="statement not covered" > this.orderNumber += 1</span>
2961
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
2962
+ <span class="cstat-no" title="statement not covered" > this.coldStartTs = now()</span>
2963
+ <span class="cstat-no" title="statement not covered" > if (this.orderNumber % 2 === 0) {</span>
2964
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length = 0</span>
2965
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
2966
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
2967
+ } else {
2968
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.length = 0</span>
2969
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(Timestamp(this.timestamp()))</span>
2970
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(TabData(this.session.getTabId()))</span>
2971
+ }
2972
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
2973
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.ColdStart</span>
2974
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
2975
+ <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
2976
+ }
2977
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.forceNew) {</span>
2978
+ // Reset session metadata only if requested directly
2979
+ <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
2980
+ }
2981
+ <span class="cstat-no" title="statement not covered" > this.session.assign({</span>
2982
+ // MBTODO: maybe it would make sense to `forceNew` if the `userID` was changed
2983
+ userID: startOpts.userID,
2984
+ metadata: startOpts.metadata,
2985
+ })
2986
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession) {</span>
2987
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2988
+ <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
2989
+ }
2990
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
2991
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
2992
+ }
2993
+ <span class="cstat-no" title="statement not covered" > this.coldInterval = setInterval(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2994
+ <span class="cstat-no" title="statement not covered" > cycle()</span>
2995
+ }, 30 * second)
2996
+ <span class="cstat-no" title="statement not covered" > cycle()</span>
2997
+ }
2998
+ &nbsp;
2999
+ public <span class="fstat-no" title="function not covered" >offlineRecording(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
3000
+ <span class="cstat-no" title="statement not covered" > this.singleBuffer = true</span>
3001
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
3002
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3003
+ <span class="cstat-no" title="statement not covered" > this.coldStartTs = now()</span>
3004
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length = 0</span>
3005
+ const saverBuffer = <span class="cstat-no" title="statement not covered" >this.localStorage.getItem(bufferStorageKey)</span>
3006
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (saverBuffer) {</span>
3007
+ const data = <span class="cstat-no" title="statement not covered" >JSON.parse(saverBuffer)</span>
3008
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1 = Array.isArray(data) ? data : []</span>
3009
+ <span class="cstat-no" title="statement not covered" > this.localStorage.removeItem(bufferStorageKey)</span>
3010
+ }
3011
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
3012
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
3013
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.ColdStart</span>
3014
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
3015
+ <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
3016
+ }
3017
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.forceNew) {</span>
3018
+ // Reset session metadata only if requested directly
3019
+ <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
3020
+ }
3021
+ <span class="cstat-no" title="statement not covered" > this.session.assign({</span>
3022
+ // MBTODO: maybe it would make sense to `forceNew` if the `userID` was changed
3023
+ userID: startOpts.userID,
3024
+ metadata: startOpts.metadata,
3025
+ })
3026
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession) {</span>
3027
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
3028
+ <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
3029
+ }
3030
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
3031
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3032
+ }
3033
+ &nbsp;
3034
+ /**
3035
+ * Saves the captured messages in localStorage (or whatever is used in its place)
3036
+ *
3037
+ * Then when this.offlineRecording is called, it will preload this messages and clear the storage item
3038
+ *
3039
+ * Keeping the size of local storage reasonable is up to the end users of this library
3040
+ * */
3041
+ public <span class="fstat-no" title="function not covered" >saveBuffer(</span>) {
3042
+ <span class="cstat-no" title="statement not covered" > this.localStorage.setItem(bufferStorageKey, JSON.stringify(this.bufferedMessages1))</span>
3043
+ }
3044
+ &nbsp;
3045
+ /**
3046
+ * Uploads the stored buffer to create session
3047
+ * */
3048
+ public <span class="fstat-no" title="function not covered" >uploadOfflineRecording(</span>) {
3049
+ const buffer = <span class="cstat-no" title="statement not covered" >this.bufferedMessages1</span>
3050
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
3051
+ // then fetch it
3052
+ <span class="cstat-no" title="statement not covered" > this.clearBuffers()</span>
3053
+ }
2157
3054
  &nbsp;
2158
3055
  private <span class="fstat-no" title="function not covered" >_start(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> resetByWorker = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: Promise&lt;StartPromiseReturn&gt; {
3056
+ const isColdStart = <span class="cstat-no" title="statement not covered" >this.activityState === ActivityState.ColdStart</span>
3057
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isColdStart &amp;&amp; this.coldInterval) {</span>
3058
+ <span class="cstat-no" title="statement not covered" > clearInterval(this.coldInterval)</span>
3059
+ }
2159
3060
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.worker) {</span>
2160
- <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart('No worker found: perhaps, CSP is not set.'))</span>
3061
+ const reason = <span class="cstat-no" title="statement not covered" >'No worker found: perhaps, CSP is not set.'</span>
3062
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3063
+ <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart(reason))</span>
2161
3064
  }
2162
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
2163
- <span class="cstat-no" title="statement not covered" > return Promise.resolve(</span>
2164
- UnsuccessfulStart(
2165
- 'OpenReplay: trying to call `start()` on the instance that has been started already.',
2166
- ),
2167
- )
3065
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
3066
+ this.activityState === ActivityState.Active ||
3067
+ this.activityState === ActivityState.Starting
3068
+ ) {
3069
+ const reason =
3070
+ <span class="cstat-no" title="statement not covered" > 'OpenReplay: trying to call `start()` on the instance that has been started already.'</span>
3071
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3072
+ <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart(reason))</span>
2168
3073
  }
2169
3074
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Starting</span>
2170
- <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3075
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isColdStart) {</span>
3076
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3077
+ }
2171
3078
  &nbsp;
2172
3079
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
2173
3080
  <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
@@ -2194,15 +3101,13 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2194
3101
  tabId: this.session.getTabId(),
2195
3102
  })
2196
3103
  &nbsp;
2197
- const lsReset = <span class="cstat-no" title="statement not covered" >this.sessionStorage.getItem(this.options.session_reset_key) !== null</span>
2198
- <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
2199
- const needNewSessionID = <span class="cstat-no" title="statement not covered" >startOpts.forceNew || lsReset || resetByWorker</span>
2200
3104
  const sessionToken = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
2201
- const isNewSession = <span class="cstat-no" title="statement not covered" >needNewSessionID || !sessionToken</span>
3105
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
3106
+ <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
2202
3107
  &nbsp;
2203
- <span class="cstat-no" title="statement not covered" > console.log(</span>
3108
+ <span class="cstat-no" title="statement not covered" > this.debug.log(</span>
2204
3109
  'OpenReplay: starting session; need new session id?',
2205
- needNewSessionID,
3110
+ isNewSession,
2206
3111
  'session token: ',
2207
3112
  sessionToken,
2208
3113
  )
@@ -2215,6 +3120,8 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2215
3120
  body: JSON.stringify({
2216
3121
  ...this.getTrackerInfo(),
2217
3122
  timestamp,
3123
+ doNotRecord: false,
3124
+ bufferDiff: timestamp - this.coldStartTs,
2218
3125
  userID: this.session.getInfo().userID,
2219
3126
  token: isNewSession ? undefined : sessionToken,
2220
3127
  deviceMemory,
@@ -2237,10 +3144,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2237
3144
  })
2238
3145
  .then(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; {
2239
3146
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.worker) {</span>
2240
- <span class="cstat-no" title="statement not covered" > return Promise.reject('no worker found after start request (this might not happen)')</span>
3147
+ const reason = <span class="cstat-no" title="statement not covered" >'no worker found after start request (this might not happen)'</span>
3148
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3149
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2241
3150
  }
2242
3151
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState === ActivityState.NotActive) {</span>
2243
- <span class="cstat-no" title="statement not covered" > return Promise.reject('Tracker stopped during authorization')</span>
3152
+ const reason = <span class="cstat-no" title="statement not covered" >'Tracker stopped during authorization'</span>
3153
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3154
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2244
3155
  }
2245
3156
  const {
2246
3157
  token,
@@ -2269,7 +3180,9 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2269
3180
  typeof delay !== 'number' ||
2270
3181
  (typeof beaconSizeLimit !== 'number' &amp;&amp; typeof beaconSizeLimit !== 'undefined')
2271
3182
  ) {
2272
- <span class="cstat-no" title="statement not covered" > return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`)</span>
3183
+ const reason = <span class="cstat-no" title="statement not covered" >`Incorrect server response: ${JSON.stringify(r)}`</span>
3184
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3185
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2273
3186
  }
2274
3187
  <span class="cstat-no" title="statement not covered" > this.delay = delay</span>
2275
3188
  <span class="cstat-no" title="statement not covered" > this.session.setSessionToken(token)</span>
@@ -2287,7 +3200,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2287
3200
  projectID,
2288
3201
  })
2289
3202
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession &amp;&amp; token === sessionToken) {</span>
2290
- <span class="cstat-no" title="statement not covered" > console.log('continuing session on new tab', this.session.getTabId())</span>
3203
+ <span class="cstat-no" title="statement not covered" > this.debug.log('continuing session on new tab', this.session.getTabId())</span>
2291
3204
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2292
3205
  <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
2293
3206
  }
@@ -2304,20 +3217,48 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2304
3217
  })
2305
3218
  &nbsp;
2306
3219
  <span class="cstat-no" title="statement not covered" > this.compressionThreshold = compressionThreshold</span>
2307
- &nbsp;
2308
3220
  const onStartInfo = <span class="cstat-no" title="statement not covered" >{ sessionToken: token, userUUID, sessionID }</span>
2309
3221
  &nbsp;
3222
+ const flushBuffer = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(b</span>uffer: Message[]) =&gt; {</span>
3223
+ let ended = <span class="cstat-no" title="statement not covered" >false</span>
3224
+ const messagesBatch: Message[] = <span class="cstat-no" title="statement not covered" >[buffer.shift() as unknown as Message]</span>
3225
+ <span class="cstat-no" title="statement not covered" > while (!ended) {</span>
3226
+ const nextMsg = <span class="cstat-no" title="statement not covered" >buffer[0]</span>
3227
+ <span class="cstat-no" title="statement not covered" > if (!nextMsg || nextMsg[0] === MType.Timestamp) {</span>
3228
+ <span class="cstat-no" title="statement not covered" > ended = true</span>
3229
+ } else {
3230
+ <span class="cstat-no" title="statement not covered" > messagesBatch.push(buffer.shift() as unknown as Message)</span>
3231
+ }
3232
+ }
3233
+ <span class="cstat-no" title="statement not covered" > this.postToWorker(messagesBatch)</span>
3234
+ }
2310
3235
  // TODO: start as early as possible (before receiving the token)
2311
- <span class="cstat-no" title="statement not covered" > this.canvasRecorder =</span>
2312
- this.canvasRecorder ?? new CanvasRecorder(this, { fps: 2, quality: 'high' })
2313
- <span class="cstat-no" title="statement not covered" > this.canvasRecorder.startTracking()</span>
2314
3236
  <span class="cstat-no" title="statement not covered" > this.startCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(onStartInfo))</span> /</span>/ MBTODO: callbacks after DOM "mounted" (observed)
2315
- <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
2316
- <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
2317
- // if (canvasEnabled) {
2318
- // canvasRecorder(this, { fps: canvasFPS, quality: canvasQuality })
2319
- // }
3237
+ <span class="cstat-no" title="statement not covered" > void this.featureFlags.reloadFlags()</span>
3238
+ /** --------------- COLD START BUFFER ------------------*/
2320
3239
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Active</span>
3240
+ <span class="cstat-no" title="statement not covered" > if (isColdStart) {</span>
3241
+ const biggestBurger =
3242
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length &gt; this.bufferedMessages2.length</span>
3243
+ ? this.bufferedMessages1
3244
+ : this.bufferedMessages2
3245
+ <span class="cstat-no" title="statement not covered" > while (biggestBurger.length &gt; 0) {</span>
3246
+ <span class="cstat-no" title="statement not covered" > flushBuffer(biggestBurger)</span>
3247
+ }
3248
+ <span class="cstat-no" title="statement not covered" > this.clearBuffers()</span>
3249
+ <span class="cstat-no" title="statement not covered" > this.commit()</span>
3250
+ /** --------------- COLD START BUFFER ------------------*/
3251
+ } else {
3252
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
3253
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3254
+ }
3255
+ &nbsp;
3256
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (canvasEnabled) {</span>
3257
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder =</span>
3258
+ this.canvasRecorder ??
3259
+ new CanvasRecorder(this, { fps: canvasFPS, quality: canvasQuality })
3260
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder.startTracking()</span>
3261
+ }
2321
3262
  &nbsp;
2322
3263
  <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay tracking started.')</span>
2323
3264
  // get rid of onStart ?
@@ -2325,20 +3266,64 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2325
3266
  <span class="cstat-no" title="statement not covered" > this.options.onStart(onStartInfo)</span>
2326
3267
  }
2327
3268
  <span class="cstat-no" title="statement not covered" > this.restartAttempts = 0</span>
3269
+ &nbsp;
3270
+ <span class="cstat-no" title="statement not covered" > this.uxtManager = this.uxtManager</span>
3271
+ ? this.uxtManager
3272
+ : new UserTestManager(this, uxtStorageKey)
3273
+ let uxtId: number | undefined
3274
+ const savedUxtTag = <span class="cstat-no" title="statement not covered" >this.localStorage.getItem(uxtStorageKey)</span>
3275
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (savedUxtTag) {</span>
3276
+ <span class="cstat-no" title="statement not covered" > uxtId = parseInt(savedUxtTag, 10)</span>
3277
+ }
3278
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (location?.search) {</span>
3279
+ const query = <span class="cstat-no" title="statement not covered" >new URLSearchParams(location.search)</span>
3280
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (query.has('oruxt')) {</span>
3281
+ const qId = <span class="cstat-no" title="statement not covered" >query.get('oruxt')</span>
3282
+ <span class="cstat-no" title="statement not covered" > uxtId = qId ? parseInt(qId, 10) : undefined</span>
3283
+ }
3284
+ }
3285
+ &nbsp;
3286
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (uxtId) {</span>
3287
+ <span class="cstat-no" title="statement not covered" > if (!this.uxtManager.isActive) {</span>
3288
+ // eslint-disable-next-line
3289
+ <span class="cstat-no" title="statement not covered" > this.uxtManager.getTest(uxtId, token, Boolean(savedUxtTag)).then(<span class="fstat-no" title="function not covered" >(i</span>d) =&gt; {</span>
3290
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (id) {</span>
3291
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.forEach(<span class="fstat-no" title="function not covered" >(c</span>b: (id: number) =&gt; void) =&gt; <span class="cstat-no" title="statement not covered" >cb(id))</span></span>
3292
+ }
3293
+ })
3294
+ } else {
3295
+ // @ts-ignore
3296
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.forEach(<span class="fstat-no" title="function not covered" >(c</span>b: (id: number) =&gt; void) =&gt; <span class="cstat-no" title="statement not covered" >cb(uxtId))</span></span>
3297
+ }
3298
+ }
3299
+ &nbsp;
2328
3300
  <span class="cstat-no" title="statement not covered" > return SuccessfulStart(onStartInfo)</span>
2329
3301
  })
2330
3302
  .catch(<span class="fstat-no" title="function not covered" >(r</span>eason) =&gt; {
2331
3303
  <span class="cstat-no" title="statement not covered" > this.stop()</span>
2332
3304
  <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
2333
3305
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (reason === CANCELED) {</span>
3306
+ <span class="cstat-no" title="statement not covered" > this.signalError(CANCELED, [])</span>
2334
3307
  <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(CANCELED)</span>
2335
3308
  }
2336
3309
  &nbsp;
2337
3310
  <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay was unable to start. ', reason)</span>
2338
3311
  <span class="cstat-no" title="statement not covered" > this._debug('session_start', reason)</span>
3312
+ <span class="cstat-no" title="statement not covered" > this.signalError(START_ERROR, [])</span>
2339
3313
  <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(START_ERROR)</span>
2340
3314
  })
2341
3315
  }
3316
+ &nbsp;
3317
+ <span class="cstat-no" title="statement not covered" > onUxtCb = []</span>
3318
+ &nbsp;
3319
+ <span class="fstat-no" title="function not covered" > addOnUxtCb(</span>cb: (id: number) =&gt; void) {
3320
+ // @ts-ignore
3321
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.push(cb)</span>
3322
+ }
3323
+ &nbsp;
3324
+ <span class="fstat-no" title="function not covered" > getUxtId(</span>): number | null {
3325
+ <span class="cstat-no" title="statement not covered" > return this.uxtManager?.getTestId()</span>
3326
+ }
2342
3327
  &nbsp;
2343
3328
  /**
2344
3329
  * basically we ask other tabs during constructor
@@ -2374,6 +3359,11 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2374
3359
  <span class="cstat-no" title="statement not covered" > return this.session.getTabId()</span>
2375
3360
  }
2376
3361
  &nbsp;
3362
+ <span class="fstat-no" title="function not covered" > clearBuffers(</span>) {
3363
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length = 0</span>
3364
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.length = 0</span>
3365
+ }
3366
+ &nbsp;
2377
3367
  <span class="fstat-no" title="function not covered" > stop(</span>stopWorker = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: void {
2378
3368
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
2379
3369
  <span class="cstat-no" title="statement not covered" > try {</span>
@@ -2401,7 +3391,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2401
3391
  <div class='footer quiet pad2 space-top1 center small'>
2402
3392
  Code coverage generated by
2403
3393
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2404
- at 2023-11-21T10:02:27.844Z
3394
+ at 2023-12-15T15:55:44.965Z
2405
3395
  </div>
2406
3396
  <script src="../../prettify.js"></script>
2407
3397
  <script>