boris-behav-obs 9.5__py2.py3-none-any.whl → 9.6__py2.py3-none-any.whl

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.
@@ -0,0 +1,22 @@
1
+ """
2
+ BORIS plugin
3
+
4
+ number of occurences of behaviors
5
+ """
6
+
7
+ import pandas as pd
8
+
9
+ __version__ = "0.0.1"
10
+ __version_date__ = "2025-06-13"
11
+ __plugin_name__ = "List of dataframe columns"
12
+ __author__ = "Olivier Friard - University of Torino - Italy"
13
+
14
+
15
+ def run(df: pd.DataFrame) -> pd.DataFrame:
16
+ """
17
+ List the columns present in the dataframe
18
+ """
19
+
20
+ df_results = pd.DataFrame(df.columns, columns=["column name"])
21
+
22
+ return df_results
boris/connections.py CHANGED
@@ -166,8 +166,10 @@ def connections(self):
166
166
  # menu playback
167
167
  self.actionJumpTo.triggered.connect(self.jump_to)
168
168
  self.action_deinterlace.triggered.connect(lambda: video_operations.deinterlace(self))
169
+ self.action_change_time_offset_of_players.triggered.connect(lambda: video_operations.change_player_offset(self))
169
170
  self.actionZoom_level.triggered.connect(lambda: video_operations.zoom_level(self))
170
171
  self.actionRotate_current_video.triggered.connect(lambda: video_operations.rotate_displayed_video(self))
172
+
171
173
  self.actionDisplay_subtitles.triggered.connect(lambda: video_operations.display_subtitles(self))
172
174
  self.actionVideo_equalizer.triggered.connect(lambda: video_equalizer.video_equalizer_show(self))
173
175
 
boris/core_ui.py CHANGED
@@ -380,6 +380,8 @@ class Ui_MainWindow(object):
380
380
  self.action_load_plugins.setObjectName(u"action_load_plugins")
381
381
  self.actionCreate_video_spectrogram = QAction(MainWindow)
382
382
  self.actionCreate_video_spectrogram.setObjectName(u"actionCreate_video_spectrogram")
383
+ self.action_change_time_offset_of_players = QAction(MainWindow)
384
+ self.action_change_time_offset_of_players.setObjectName(u"action_change_time_offset_of_players")
383
385
  self.centralwidget = QWidget(MainWindow)
384
386
  self.centralwidget.setObjectName(u"centralwidget")
385
387
  self.horizontalLayout_2 = QHBoxLayout(self.centralwidget)
@@ -486,7 +488,7 @@ class Ui_MainWindow(object):
486
488
  MainWindow.setCentralWidget(self.centralwidget)
487
489
  self.menubar = QMenuBar(MainWindow)
488
490
  self.menubar.setObjectName(u"menubar")
489
- self.menubar.setGeometry(QRect(0, 0, 1509, 20))
491
+ self.menubar.setGeometry(QRect(0, 0, 1509, 25))
490
492
  self.menuHelp = QMenu(self.menubar)
491
493
  self.menuHelp.setObjectName(u"menuHelp")
492
494
  self.menuFile = QMenu(self.menubar)
@@ -743,6 +745,7 @@ class Ui_MainWindow(object):
743
745
  self.menuPlayback.addAction(self.actionJumpForward)
744
746
  self.menuPlayback.addAction(self.actionJumpBackward)
745
747
  self.menuPlayback.addAction(self.actionJumpTo)
748
+ self.menuPlayback.addAction(self.action_change_time_offset_of_players)
746
749
  self.menuPlayback.addAction(self.action_deinterlace)
747
750
  self.menuPlayback.addSeparator()
748
751
  self.menuPlayback.addAction(self.actionZoom_level)
@@ -1033,6 +1036,7 @@ class Ui_MainWindow(object):
1033
1036
  self.actionAdd_frame_indexes.setText(QCoreApplication.translate("MainWindow", u"Add frame indexes", None))
1034
1037
  self.action_load_plugins.setText(QCoreApplication.translate("MainWindow", u"Load plugins", None))
1035
1038
  self.actionCreate_video_spectrogram.setText(QCoreApplication.translate("MainWindow", u"Create video spectrogram", None))
1039
+ self.action_change_time_offset_of_players.setText(QCoreApplication.translate("MainWindow", u"Change time offset of players", None))
1036
1040
  self.lbLogoBoris.setText("")
1037
1041
  self.lbLogoUnito.setText("")
1038
1042
  self.lb_player_status.setText(QCoreApplication.translate("MainWindow", u"lb_player_status", None))
@@ -691,11 +691,6 @@ def export_aggregated_events(pj: dict, parameters: dict, obsId: str, force_numbe
691
691
  # obs description
692
692
  obs_description = util.eol2space(observation[cfg.DESCRIPTION])
693
693
 
694
- """
695
- obs_length = observation_operations.observation_total_length(pj[cfg.OBSERVATIONS][obsId])
696
- logging.debug(f"obs_length: {obs_length}")
697
- """
698
-
699
694
  _, _, connector = db_functions.load_aggregated_events_in_db(
700
695
  pj, parameters[cfg.SELECTED_SUBJECTS], [obsId], parameters[cfg.SELECTED_BEHAVIORS]
701
696
  )
@@ -798,6 +793,7 @@ def export_aggregated_events(pj: dict, parameters: dict, obsId: str, force_numbe
798
793
  if observation[cfg.TYPE] == cfg.MEDIA:
799
794
  observation_type = "Media file"
800
795
 
796
+ # get the media file name of the start of event
801
797
  media_file_name = observation_operations.event2media_file_name(observation, row["start"])
802
798
  if media_file_name is None:
803
799
  media_file_name = "Not found"
@@ -842,7 +838,7 @@ def export_aggregated_events(pj: dict, parameters: dict, obsId: str, force_numbe
842
838
  observation["date"].replace("T", " "),
843
839
  obs_description,
844
840
  observation_type,
845
- media_file_str,
841
+ media_file_str, # list of media used in observation
846
842
  pj[cfg.OBSERVATIONS][obsId][cfg.TIME_OFFSET],
847
843
  f"{coding_duration:.3f}" if not coding_duration.is_nan() else cfg.NA,
848
844
  media_durations_str,
@@ -1055,8 +1055,6 @@ def new_observation(self, mode: str = cfg.NEW, obsId: str = "") -> None:
1055
1055
  }
1056
1056
 
1057
1057
  if self.pj[cfg.OBSERVATIONS][new_obs_id][cfg.MEDIA_CREATION_DATE_AS_OFFSET]:
1058
- print("\n", observationWindow.media_creation_time, "\n")
1059
-
1060
1058
  self.pj[cfg.OBSERVATIONS][new_obs_id][cfg.MEDIA_INFO][cfg.MEDIA_CREATION_TIME] = observationWindow.media_creation_time
1061
1059
 
1062
1060
  try:
@@ -2423,48 +2421,55 @@ def event2media_file_name(observation: dict, timestamp: dec) -> Optional[str]:
2423
2421
  timestamp (dec): time stamp
2424
2422
 
2425
2423
  Returns:
2426
- str: name of media file containing the event
2424
+ str: path of media file containing the event
2427
2425
  """
2426
+ if observation.get(cfg.MEDIA_CREATION_DATE_AS_OFFSET, False):
2427
+ # media creation date/time was used for coding
2428
+ video_file_name = None
2429
+ for media_path in observation[cfg.MEDIA_INFO].get(cfg.MEDIA_CREATION_TIME, {}):
2430
+ start_media = observation[cfg.MEDIA_INFO][cfg.MEDIA_CREATION_TIME][media_path]
2431
+ duration = observation[cfg.MEDIA_INFO][cfg.LENGTH][media_path]
2432
+ if start_media <= timestamp <= start_media + duration:
2433
+ video_file_name = media_path
2434
+ break
2428
2435
 
2429
- cumul_media_durations: list = [dec(0)]
2430
- for media_file in observation[cfg.FILE][cfg.PLAYER1]:
2431
- try:
2432
- media_duration = observation[cfg.MEDIA_INFO][cfg.LENGTH][media_file]
2433
- # cut off media duration to 3 decimal places as that is how fine the player is
2434
- media_duration = floor(media_duration * 10**3) / dec(10**3)
2435
- cumul_media_durations.append(floor((cumul_media_durations[-1] + media_duration) * 10**3) / dec(10**3))
2436
- except KeyError:
2437
- return None
2436
+ else: # no media creation date
2437
+ cumul_media_durations: list = [dec(0)]
2438
+ for media_file in observation[cfg.FILE][cfg.PLAYER1]:
2439
+ try:
2440
+ media_duration = observation[cfg.MEDIA_INFO][cfg.LENGTH][media_file]
2441
+ # cut off media duration to 3 decimal places as that is how fine the player is
2442
+ media_duration = floor(media_duration * 10**3) / dec(10**3)
2443
+ cumul_media_durations.append(floor((cumul_media_durations[-1] + media_duration) * 10**3) / dec(10**3))
2444
+ except KeyError:
2445
+ return None
2438
2446
 
2439
- """
2440
- cumul_media_durations: list = [dec(0)]
2441
- for media_file in observation[cfg.FILE][cfg.PLAYER1]:
2442
- try:
2443
- media_duration = dec(str(observation[cfg.MEDIA_INFO][cfg.LENGTH][media_file]))
2444
- cumul_media_durations.append(round(cumul_media_durations[-1] + media_duration, 3))
2445
- except KeyError:
2446
- return None
2447
- """
2447
+ """
2448
+ cumul_media_durations: list = [dec(0)]
2449
+ for media_file in observation[cfg.FILE][cfg.PLAYER1]:
2450
+ try:
2451
+ media_duration = dec(str(observation[cfg.MEDIA_INFO][cfg.LENGTH][media_file]))
2452
+ cumul_media_durations.append(round(cumul_media_durations[-1] + media_duration, 3))
2453
+ except KeyError:
2454
+ return None
2455
+ """
2448
2456
 
2449
- cumul_media_durations.remove(dec(0))
2457
+ cumul_media_durations.remove(dec(0))
2450
2458
 
2451
- logging.debug(f"{cumul_media_durations=}")
2459
+ logging.debug(f"{cumul_media_durations=}")
2452
2460
 
2453
- # test if timestamp is at end of last media
2454
- if timestamp == cumul_media_durations[-1]:
2455
- player_idx = len(observation[cfg.FILE][cfg.PLAYER1]) - 1
2456
- else:
2457
- player_idx = -1
2458
- for idx, value in enumerate(cumul_media_durations):
2459
- start = 0 if idx == 0 else cumul_media_durations[idx - 1]
2460
- if start <= timestamp < value:
2461
- player_idx = idx
2462
- break
2461
+ # test if timestamp is at end of last media
2462
+ if timestamp == cumul_media_durations[-1]:
2463
+ player_idx = len(observation[cfg.FILE][cfg.PLAYER1]) - 1
2464
+ else:
2465
+ player_idx = None
2466
+ for idx, value in enumerate(cumul_media_durations):
2467
+ start = 0 if idx == 0 else cumul_media_durations[idx - 1]
2468
+ if start <= timestamp < value:
2469
+ player_idx = idx
2470
+ break
2463
2471
 
2464
- if player_idx != -1:
2465
- video_file_name = observation[cfg.FILE][cfg.PLAYER1][player_idx]
2466
- else:
2467
- video_file_name = None
2472
+ video_file_name = observation[cfg.FILE][cfg.PLAYER1][player_idx] if player_idx is not None else None
2468
2473
 
2469
2474
  return video_file_name
2470
2475
 
boris/version.py CHANGED
@@ -20,5 +20,5 @@ This file is part of BORIS.
20
20
 
21
21
  """
22
22
 
23
- __version__ = "9.5"
24
- __version_date__ = "2025-06-12"
23
+ __version__ = "9.6"
24
+ __version_date__ = "2025-07-15"
boris/video_operations.py CHANGED
@@ -87,13 +87,6 @@ def zoom_level(self):
87
87
  for idx, dw in enumerate(self.dw_player):
88
88
  players_list.append(("dsb", f"Player #{idx + 1}", 0.1, 12, 0.1, 2**dw.player.video_zoom, 1))
89
89
 
90
- """
91
- zoom_levels: list = []
92
- for choice in (2, 1, 0.5, 0.25):
93
- zoom_levels.append((str(choice), "selected" if log2(choice) == dw.player.video_zoom else ""))
94
- players_list.append(("il", f"Player #{idx + 1}", zoom_levels))
95
- """
96
-
97
90
  zl = dialog.Input_dialog(label_caption="Select the zoom level", elements_list=players_list, title="Video zoom level")
98
91
  if not zl.exec_():
99
92
  return
@@ -117,6 +110,52 @@ def zoom_level(self):
117
110
  self.project_changed()
118
111
 
119
112
 
113
+ def change_player_offset(self):
114
+ """
115
+ display dialog box for setting the player time offset
116
+ """
117
+ logging.info("change the player time offset")
118
+
119
+ if cfg.OFFSET not in self.pj[cfg.OBSERVATIONS][self.observationId][cfg.MEDIA_INFO]:
120
+ self.pj[cfg.OBSERVATIONS][self.observationId][cfg.MEDIA_INFO][cfg.OFFSET] = {}
121
+
122
+ players_list: list = []
123
+
124
+ for idx, dw in enumerate(self.dw_player):
125
+ players_list.append(
126
+ (
127
+ "dsb",
128
+ f"Player #{idx + 1}",
129
+ -100000,
130
+ 100000,
131
+ 0.001,
132
+ self.pj[cfg.OBSERVATIONS][self.observationId][cfg.MEDIA_INFO][cfg.OFFSET][str(idx + 1)],
133
+ 3,
134
+ )
135
+ )
136
+
137
+ zl = dialog.Input_dialog(label_caption="Select the time offset", elements_list=players_list, title="Time offset")
138
+ if not zl.exec_():
139
+ return
140
+
141
+ for idx, dw in enumerate(self.dw_player):
142
+ if (
143
+ self.pj[cfg.OBSERVATIONS][self.observationId][cfg.MEDIA_INFO][cfg.OFFSET].get(str(idx + 1), 0)
144
+ != zl.elements[f"Player #{idx + 1}"].value()
145
+ ):
146
+ logging.debug(f"time offset of player changed in {zl.elements[f'Player #{idx + 1}'].value()} for player {idx + 1}")
147
+
148
+ self.pj[cfg.OBSERVATIONS][self.observationId][cfg.MEDIA_INFO][cfg.OFFSET][str(idx + 1)] = float(
149
+ zl.elements[f"Player #{idx + 1}"].value()
150
+ )
151
+
152
+ if self.dw_player[0].player.time_pos is not None:
153
+ cumulative_time_pos = self.getLaps() # for player 1
154
+ self.sync_time(idx, cumulative_time_pos)
155
+
156
+ self.project_changed()
157
+
158
+
120
159
  def rotate_displayed_video(self):
121
160
  """
122
161
  rotate the displayed video
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boris-behav-obs
3
- Version: 9.5
3
+ Version: 9.6
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License-Expression: GPL-3.0-only
@@ -12,13 +12,13 @@ boris/cmd_arguments.py,sha256=oWb-FvhKLbKJhATlTHy9muWu8XnnUfOZ-3Fmz2M8Yzc,1848
12
12
  boris/coding_pad.py,sha256=fBKdp7DDyupySJosIYtqNd8s2E-GruzCgVhDFsoVWKE,10986
13
13
  boris/config.py,sha256=IbW8PkAFcZIL-8NoSscXSeI82dneLzpywaGXWDcnrWw,17845
14
14
  boris/config_file.py,sha256=bPDDRjtylVJ2ll-FNRjME5iIsIagonZNFns-k9kGW2Q,13545
15
- boris/connections.py,sha256=L899GFkXjVNXOYeUFO89aGGxI5VbvUe8qslyGFg0RyE,19511
15
+ boris/connections.py,sha256=kqc6jaYNzoJe8crPtfwE-fXTW4nTfB8-PojRzbbLEus,19629
16
16
  boris/converters.py,sha256=n6gDM9x2hS-ZOoHLruiifuXxnC7ERsUukiFokhHZPoQ,11678
17
17
  boris/converters_ui.py,sha256=uu7LOBV_fKv2DBdOqsqPwjGsjgONr5ODBoscAA-EP48,9900
18
18
  boris/cooccurence.py,sha256=tVERC-V8MWjWHlGEfDuu08iS94qjt4do-38jwI62QaY,10367
19
19
  boris/core.py,sha256=nq-GnTz6mdGFSv1GDAp0XJNyC0FW0DEdvqhMrlY_dCg,231016
20
20
  boris/core_qrc.py,sha256=J0kom27nrmi4-TCDLJZCZbtUAitiXQ4WEDfErawuxt8,639879
21
- boris/core_ui.py,sha256=BOEqjlV2xJKEtfk-3oaQgtSucJ7wKkKJ07fIy4qVAw8,76747
21
+ boris/core_ui.py,sha256=--VDOzUfjsA4TJRw3aFk2CeSL29193vPGLgYJRhQfUY,77143
22
22
  boris/db_functions.py,sha256=Uw9wWH_Pe-qNzpV1k21YG_jKsoOmfY_iiK_7ARZHGDc,13352
23
23
  boris/dev.py,sha256=9pUElbjl9g17rFUJXX5aVSu55_iIKIuDxNdrB0DI_d0,3671
24
24
  boris/dialog.py,sha256=LqZ73R9cwiL4qzKyMxeS2G8PKnbVZ0xFvZHw-oSek0M,34039
@@ -30,7 +30,7 @@ boris/events_cursor.py,sha256=VPY_ygD0fxE5lp25mcd2l00XQXurCR6hprffF4tKRbU,2078
30
30
  boris/events_snapshots.py,sha256=PjWzQvUGQtIcEc_7FDsRphf7fAhhTccQgYc2eQSA65g,27621
31
31
  boris/exclusion_matrix.py,sha256=ff88xD6aqc8bpIuj9ZCz9ju_HeqqgibQwoaJrIOJ6RI,5272
32
32
  boris/export_events.py,sha256=3B336WEA0g_8oW3VDo_kfq5D0ISu-e7z2f-_ROUvU9c,39756
33
- boris/export_observation.py,sha256=SvKhuGa-Ag_kK3igL9DFdJ0TKoQLDneu54R_uiSHUyo,50813
33
+ boris/export_observation.py,sha256=B8ASj6H70xfcTSUHrbcJa6YOYjih2WD4DSiUtXj5eAk,50764
34
34
  boris/external_processes.py,sha256=PogE2eEiQLVZ2useMamQMOAeDmMUX_TlIpqPKLMm6Ak,13607
35
35
  boris/geometric_measurement.py,sha256=4pI-AYpBSFlJBqS-f8dnkgLtj_Z2E5kwwAdh6WwZ4kk,35049
36
36
  boris/gui_utilities.py,sha256=2HdWFxo2y0oxC29VJAA3R-TOMxVbOy3FuVwspjrTD6A,5519
@@ -47,7 +47,7 @@ boris/mpv-1.0.3.py,sha256=EXRtzQqFjOn4wMC6482Ilq3fNQ9N1GRP1VxwLzdeaBY,88077
47
47
  boris/mpv.py,sha256=EfzIHjPbgewG4w3smEtqEUPZoVwYmMQkL4Q8ZyW-a58,76410
48
48
  boris/mpv2.py,sha256=IUI4t4r9GYX7G5OXTjd3RhMMOkDdfal_15buBgksLsk,92152
49
49
  boris/observation.py,sha256=10UkVyY8TDySntIX_-H-IsuFdiF6tEcmC6JQUzD6wYg,57139
50
- boris/observation_operations.py,sha256=-ryjKz6zTnS-tgB6SSdfZhGWbi3c7nqgcewn5ml9Y04,107271
50
+ boris/observation_operations.py,sha256=xeMtD4K9wN_Hu0d_0G7Btv1Tezkhw_Qwfs1fF2xEg4o,107865
51
51
  boris/observation_ui.py,sha256=DAnU94QBNvkLuHT6AxTwqSk_D_n6VUhSl8PexZv_dUk,33309
52
52
  boris/observations_list.py,sha256=NqwECGHtHYmKhSe-qCfqPmJ24SSfzlXvIXS2i3op_zE,10591
53
53
  boris/otx_parser.py,sha256=70QvilzFHXbjAHR88YH0aEXJ3xxheLS5fZGgHFHGpNE,16367
@@ -78,15 +78,16 @@ boris/time_budget_functions.py,sha256=y5He8crz0xsTxVfz0jATwFFQVnPAIrNHja_0sF6NtR
78
78
  boris/time_budget_widget.py,sha256=z-tyITBtIz-KH1H2OdMB5a8x9QQLK7Wu96-zkC6NVDA,43213
79
79
  boris/transitions.py,sha256=_aZJfJWv3EBrtmQ7qsdTCayQo6uWU7BXqtQQgflEhr4,12250
80
80
  boris/utilities.py,sha256=dD5HpojqlAGLVkr3YnOsaqfbCMHFYroe040ZchB5WnM,56662
81
- boris/version.py,sha256=IVsvvmK95ywLGRviJkLM91MD9o5TKwRSh9p3TLlk68U,785
81
+ boris/version.py,sha256=ZEBnf_7vJi2eFStpheIWRPeqh70jKh34dnMHHdgbbzI,785
82
82
  boris/video_equalizer.py,sha256=FartoGghFK-T53zklP70rPKYqTuzL8qdvfGlsOF2wwc,5854
83
83
  boris/video_equalizer_ui.py,sha256=1CG3s79eM4JAbaCx3i1ILZXLceb41_gGXlOLNfpBgnw,10142
84
- boris/video_operations.py,sha256=mh3iR__Sm2KnV44L_sW2pOo3AgLwlM7wiTnnqQiAVs4,9381
84
+ boris/video_operations.py,sha256=rXKWndaALaF-yLEPIY_-Z99XRAncZRzRd1sLzwSpbjs,10768
85
85
  boris/view_df.py,sha256=AKScLASX2Uatw7rqPbsnio83eVT4GZYCFhL091eMvlY,3370
86
86
  boris/view_df_ui.py,sha256=CaMeRH_vQ00CTDDFQn73ZZaS-r8BSTWpL-dMCFqzJ_Q,2775
87
87
  boris/write_event.py,sha256=RN_cFQZNE2jWbM_BiodL4tsyKT0JPREvUy7xgZnrfaM,24041
88
88
  boris/analysis_plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
89
  boris/analysis_plugins/_latency.py,sha256=9kCdFDtb5Zdao1xFpioi_exm_IxyGm6RlY3Opn6GUFo,2030
90
+ boris/analysis_plugins/list_of_dataframe_columns.py,sha256=VEiVhxADtyaIKN4JrfFV02TuTAfWhQ60bf1mHVQp27I,437
90
91
  boris/analysis_plugins/number_of_occurences.py,sha256=IDyDrdezqvSKT3BlD8QWpSYk8X9nnBBLI80OUnFJ3bY,509
91
92
  boris/analysis_plugins/number_of_occurences_by_independent_variable.py,sha256=t39bmmmZIDCSbcDvVeiKAhKNNP2SdpHp417JczHEnP4,793
92
93
  boris/analysis_plugins/time_budget.py,sha256=C1wNYwd5Jugr8h5z2aXRUBY8dF8pD4n953dPwNHY5VY,2244
@@ -96,9 +97,9 @@ boris/portion/dict.py,sha256=SyHxc7PfDw2ufNLFQycwJtzmRfL48rDp4UrM2KN7IWc,11282
96
97
  boris/portion/func.py,sha256=3TkQtFKLfsqntwd27HSGHceFhnXHmT-EbNMqktElC5Q,2174
97
98
  boris/portion/interval.py,sha256=bAdUiJjGeUAPgsBAImwNeviiwfQq5odfhFZccAWzOTA,20299
98
99
  boris/portion/io.py,sha256=ppNeRpiLNrocF1yzGeuEUIhYMf2LfsR-cji3d0nmvUs,6371
99
- boris_behav_obs-9.5.dist-info/licenses/LICENSE.TXT,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
100
- boris_behav_obs-9.5.dist-info/METADATA,sha256=l3kUWcfdo1i9Tu0fLC4CtMunI3jW5dXHoXXX0SYTf3g,4600
101
- boris_behav_obs-9.5.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
102
- boris_behav_obs-9.5.dist-info/entry_points.txt,sha256=k__8XvFi4vaA4QFvQehCZjYkKmZH34HSAJI2iYCWrMs,52
103
- boris_behav_obs-9.5.dist-info/top_level.txt,sha256=fJSgm62S7WesiwTorGbOO4nNN0yzgZ3klgfGi3Px4qI,6
104
- boris_behav_obs-9.5.dist-info/RECORD,,
100
+ boris_behav_obs-9.6.dist-info/licenses/LICENSE.TXT,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
101
+ boris_behav_obs-9.6.dist-info/METADATA,sha256=9ttZPeStpc2xkd_zZxmh5FRrOs-SjWLGt63tYmT-Tc0,4600
102
+ boris_behav_obs-9.6.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
103
+ boris_behav_obs-9.6.dist-info/entry_points.txt,sha256=k__8XvFi4vaA4QFvQehCZjYkKmZH34HSAJI2iYCWrMs,52
104
+ boris_behav_obs-9.6.dist-info/top_level.txt,sha256=fJSgm62S7WesiwTorGbOO4nNN0yzgZ3klgfGi3Px4qI,6
105
+ boris_behav_obs-9.6.dist-info/RECORD,,