Commit 4caa8aa
committed
microEye v2.4.0a7
___ __ __
/ _ | / /__ / / ___ _
/ __ |/ / _ \/ _ \/ _ `/
/_/ |_/_/ .__/_//_/\_,_/
/_/
What's New:
-------------------------------------------------------------
IMPORTANT: Zarr V3 support now requires Python 3.11 or newer.
Support for Python 3.9 and 3.10 has been discontinued.
-------------------------------------------------------------
-----------------
microEye v2.4.0a7
-----------------
- Camera Infrastructure
- `basler_panel.py`: adjust `RetrieveResult` timeout dynamically with
exposure to prevent premature timeouts at long exposures.
- `jobs.py`: guard dark-calibration path with try/except logging and
ensure `finalize()` only writes calibration files when at least two
frames were captured.
- `camera_calibration.py`: rewrite dark calibration to use Welford's
online mean/variance (Numba-accelerated), emit sample variance, and
write TIFFs via a shared helper with logging.
- Lasers / Device Manager
- `io_params.py`, `io_matchbox.py`, `io_single_laser.py`: ensure UI
parameters use `LaserState.value` strings, convert parameter-tree
limits to primitive types, and fix enum handling when toggling
combiner channels.
- `devices_manager.py`: centralize relay-command emission via
`_send_laser_relay_settings`, expose `_fetch_laser_states()` for UI
consumers.
- `controller.py` + new `indicator.py` & `color.py`: add color-coded
laser state/relay indicators to the Controller dock, including
reusable `LaserIndicator` widgets driven by wavelength-aware colors.
- `miEye.py`: update status-bar timer to refresh the new laser
indicators by pulling `_fetch_laser_states()` from the device
manager.
-----------------
microEye v2.4.0a6
-----------------
- Docs & Packaging
- `README.md`: refreshed ASCII art and fixed formatting; tightened
Python requirement to >=3.11.9; expanded Allied Vision/Vimba X
guidance with CTI auto-discovery and VIMBA_X_HOME / VIMBA_X_CTI
instructions (plus note about Vimba TL conflicts and VmbC.xml);
clarified IDS driver options (IDS Peak preferred vs IDS Software
Suite) and installer notes; improved camera/hardware package
table and CLI/launcher usage example.
- `requirements.txt`: added IDS Peak runtime.
- Logging:
- Replaced ad-hoc print statements with structured, package-wide
logging using the standard library logger.
- Loggers are module-scoped (logging.getLogger(__name__)) and use
consistent message formats and levels
(DEBUG/INFO/WARNING/ERROR).
- Runtime configuration:
- Launcher UI exposes log options (log level, disable file logging,
disable console logging).
- CLI supports --log-level, --no-log-file and --no-log-console to
control logging behavior.
- Environment variable MICROEYE_LOG_LEVEL may be used to override
default level.
- Default behavior:
- Logs written to a per-run file under ./logs when enabled and to
console unless disabled.
- File handlers and console handlers are added/removed based on
CLI/launcher settings.
- Error handling:
- Exceptions logged with exc_info=True to preserve tracebacks.
- Notes:
- Logging replaces many print() calls across camera drivers,
acquisition, analysis and GUI modules to improve
debuggability and avoid cluttering stdout.
- Core / CLI
- `microEye.__init__`:
- add a `_select_qt_api(cli_choice)` helper to pick the Qt binding
from CLI/env and set QT_API/PYQTGRAPH_QT_LIB before Qt or
camera DLLs are imported;
- add CLI logging flags (`--log-level`, `--no-log-file`,
`--no-log-console`) and a small logger bootstrap.
- `microEye.qt` now respects the preselected API instead of probing
bindings at runtime.
- Analysis / GPU
- `pyfit3Dcspline` + `mainfunctions.py`: guard GPU imports with both
CUDA availability and actual device presence to avoid crashes on
CPU-only hosts.
- Camera Infrastructure
- `hardware/cams/camera_panel.py`: normalize exposure scaling, emit
pixel-size metadata, and expand `Camera_Panel.getAcquisitionJob`
with explicit save toggles, metadata hooks, and queue events
(paired with `hardware/cams/jobs.py`).
- `camera_list`: register IDS Peak adapters and panels.
- Basler / Vimba / IDS / PCO / Thorlabs panels: tag freerun actions
with event hooks and reuse base exposure math (see
`Basler_Panel`).
- New IDS Peak stack: `PeakCamera`, `PeakPanel`, and package init
wiring; supports binning, flash, ROI and acquisition flow.
- Vimba stack
- `hardware/cams/vimba` (vimba_cam, vimba_panel): add CTI
auto-discovery (`VIMBA_X_HOME` / `VIMBA_X_CTI`), black level /
gain / correction / binning controls, and timer helpers.
- Acquisition / UI
- `focusWidget`: replace background-worker range updates with a
re-entrancy guard for synchronous plot refreshes to avoid
overlap.
- `ScanAcquisitionWidget`: more robust header resize logic for older
Qt versions.
- Protocols / Designer
- `actions`: introduce `ListLoop`; supporting UI/editor wiring added
across `actions_items`, designer, and serialization.
- App Shell
- `miEye_module`: defer heavy initialization via `_bootstrap` to keep
startup responsive and ensure clean shutdown hooks.
-----------------
microEye v2.4.0a5
-----------------
- Focus Widget:
- Previously, performance issues included GUI freezes caused by:
- Expensive autorange operations and reliance on
`pg.GraphicsLayoutWidget` for all plots.
- Non-optimized plot update logic in `focusWidget` and
`PyQtGraphDisplay` caused overlapping calls and race
conditions.
- The issue appears when acquisition display runs at high framerates
(>30Hz) with one or more ROIs.
- Issue has been resolved and tested with acquisition camera running
at ~165Hz and focus plots and GUI were responsive.
- Refactor `focusWidget` to use separate `pg.GraphicsView` and
`pg.PlotWidget` for all plots instead of
`GraphicsLayoutWidget`.
- Implemented non-pyqtgraph-native logic to update plot ranges at
less frequent intervals, reducing resource usage and
improving responsiveness.
- Added a boolean option in the GUI to enable or disable the
non-pyqtgraph-native plot range updates.
- Add async worker for plot updates to avoid GUI blocking.
- Remove use of `HistogramBarItem` for histogram plots, as it is
computationally heavy; instead, use histogram step plotting
(drawing the histogram as a stepped line plot rather than
bars) on a regular `pg.PlotWidget` for improved performance.
- Fix ROI update logic after loading config; previously the GUI did
not update accordingly.
- Update plots visibility dynamically depending on the selected
stabilization method:
- For example, when reflection "Z-only" stabilization method is
selected, only the Z histogram and Z time log plots
are shown.
- When beads or Hybrid "XYZ" stabilization methos is selected,
XY scatter and X/Y time log plots are also
displayed.
- The GUI logic automatically hides or shows relevant plots
based on the current stabilization mode.
- Display & Viewer:
- Refactor `FrameCounter` to use monotonic nanosecond clock for FPS
calculation (previously used `time.time()`).
- Fix `PyQtGraphDisplay` update logic reducing resource usage and
improving GUI responsiveness:
- Refactor histogram and CDF updates to occur at less frequent
intervals.
- Add a flag in the `PyQtGraphDisplay` class to block overlapping
update calls and prevent race conditions during rapid
image updates.
- Set `pg.GraphicsView(useOpenGL=True)` for improved rendering
performance.
- Stage Adapters: (BUG)
- Fix `PiezoConceptFOC` stage adapter to always cast Z position to
integer before sending commands, preventing random jumps
caused by `float`/`int` type mismatch.
- Device Manager: (BUG)
- Fix `FocusStabilizer` signals to use `moveXYZ` (signal) and
`StageManager.move_relative` (function), replacing legacy
`moveStage` (signal) and `move_z` (function).
- Focus Stabilizer & Controller:
- Fix controller attributes to use single underscore; double
underscore caused them to be inaccessible to subclasses.
- Add missing tau parameter to FocusStabilizer config and ensure it
is loaded/saved. (reserved to be used later)
- Fix loading of per-axis inverted flags in `FocusStabilizerView`.
- Refactor `FocusStabilizer` worker logic to use correct per-axis
stabilization and response inversion emitted through
`moveXYZ`.
- Fix method and rejection method enum handling in
`FocusStabilizerView`.
- Fix ROI activation signal emission after config load.
- Add __str__ method to RejectionMethod enum.
- Other:
- Update GitHub Actions workflow to use `Python 3.11.9`
-----------------
microEye v2.4.0a4
-----------------
- Images & Data IO
- refactor: Move all image sequence and uImage classes from
`microEye.utils.uImage` to new `microEye.images` subpackage
(`handlers.py`, `uImage.py`, `zarr.py`)
- refactor: Update all imports to use `microEye.images` instead of
`microEye.utils.uImage`
- feat: Add unified `ImageSequenceBase`, `TiffSeqHandler`,
`ZarrImageSequence`, and `saveZarrImage` to
microEye.images.handlers
- feat: Add `ZarrAcquisition`, `create_array`, and
`store_zarr_array` for streaming and saving Zarr V3 data
- feat: Added `close_display(display_name)` method to
`DisplayManager` to allow closing a specific display window
by name
- fix: Ensure Zarr handler support both zipped and directory stores
- Analysis & Viewer
- refactor: Update all analysis modules to use new image handler
imports
- fix: Remove legacy `microEye.utils.uImage` import from all modules
- feat: Add registration tool (`registration.py`) for image stack
registration and transformation
- feat: Add multi-channel stack merging and transformation
export/import in registration tool
- fix: Fixed channel display logic for multichannel data in
`images.py` so channels are handled correctly in viewer.
- Multi Viewer Module
- feat: Add "Opened Files" dock to `multi_viewer`, showing all
currently opened files and allowing quick switching
- feat: Add "Registration Tool" to Tools menu in `multi_viewer` for
stack alignment
- fix: Properly handle .zarr files in file system model and viewer
- fix: Ensure opened files are tracked and closed correctly in
`multi_viewer`
- Fitting & Filters
- fix: Update all fitting and filter modules to use new image
handler imports
- Hardware & Acquisition
- Thorlabs Camera:
- Fixed bugs in exposure range and pixel clock list handling.
- Corrected driver string and status dictionary logic.
- AcquisitionJob:
- Refactored ROI extraction and frame writing logic for
TIFF/Zarr.
- Improved resource cleanup and metadata saving.
- Ensured correct handling of Zarr array finalization and TIFF
writer logic.
- fix: Update all camera panels and acquisition logic to use new
image handler imports
- fix: Remove legacy `microEye.utils.uImage` import from hardware
modules
------------------------------------
Focus Stabilizer Refactor (v2.4.0a3)
------------------------------------
- Major refactor of the Focus Stabilizer backend and frontend:
- Modularized stabilization logic into `stabilization.controller`
and `stabilization.methods` submodules.
- Each axis (X, Y, Z) now has independent PID controller gains and
calibration coefficients.
- Outlier rejection for shift estimation is now configurable
(Standard Deviation, MAD, or None).
- Added support for XY stabilization and hybrid modalities (under
development).
- New data logging system for time, X/Y/Z shifts, and parameter
values.
- Visualization improvements:
- Z histogram, time log of X/Y/Z, XY scatter, and localization
overlays.
- All plots update in real time with stabilization.
- FocusStabilizerView and focusWidget updated for new parameter tree
and ROI management.
- Configuration save/load for all stabilizer and ROI parameters.
- Improved thread safety and async handling for stabilization
worker.
- Refactored stage and device manager integration for stabilization
toggling and lock state.
- All stabilization methods now use unified interface for parameter
fitting and shift calculation.
- Internal API changes:
- `FocusStabilizer` and `FocusStabilizerView` now use enums for all
axis and parameter references.
- `StageManager` and `DeviceManager` updated to use new
stabilization API.
- Controller widget now supports toggling XY and Z stabilization
independently.
- Added `FocusPlot` enum and unified plotting logic in
`focusWidget`.
- Camera/Acquisition/Stage:
- All camera classes now implement a `snap_image()` method for
single-frame acquisition (Basler, Vimba, uEye, Thorlabs,
PCO, PycroManager, Dummy).
- Improved dummy camera (`miDummy`) astigmatic fiducials pattern
simulation and parameters.
- `CameraManager` is now the singleton for all camera lists; all
references to `CameraList.CAMERAS` replaced with
`CameraManager.CAMERAS`.
- Acquisition manager and scan/z-stack logic updated to use new
focus stabilization API and per-axis calibration.
- KinesisXY and AbstractStage now use unified async worker logic and
busy checks.
- PycroStageXY async move logic improved and now waits for hardware
busy state.
- Spatial filter optimizations:
- Difference of Gaussians (DoG) and PointGaussFilter now use
`fftconvolve` for significantly improved filtering speed.
- Radial coordinate calculations for Fourier filters are now
Numba-accelerated for faster execution.
- General Refactoring:
- Moved focus stabilization logic out of monolithic files into
dedicated submodules under `stabilization/`.
- Minor bugfixes for timeouts, async workers, and config
serialization.
- Replaced all delay and timeout time measurements to use
`monotonic` clocks instead of `time` for improved reliability.
- Bugfixes:
- Fixed config loading to ensure Pycro-Manager instances and bridges
are started before device configuration is loaded, preventing
initialization errors.
-----------------
microEye v2.4.0a2
-----------------
-------------
Slides Widget
-------------
- Add a new `SlideWidget` for visualizing and selecting slide channels
- Support multiple slide types and channel geometries (sticky-Slide VI
0.4, μ-Slide VI 0.1, 8/18 Well)
- Implement interactive channel selection, highlight, and move-to-center
logic in `SlideWidget`
- Show current stage position and delta in info bar
- Draw position cross and center cross overlays
- Emit signals for channel selection and move the stage to the channel
center
- Add context menu for slide type, orientation (swap XY), and axis
inversion
- Persist and restore slide widget configuration (`slide`, `swap_xy`,
`invert_x`, `invert_y`) in `config.json`
- Add "Slides" dock to `miEye_module`
------------------------------------
Stage Metadata & Editable Parameters
------------------------------------
- Add editable X/Y/Z center and max parameters to `StageView` parameter
tree
- Add `get_center`, `set_center`, `get_max` methods to `AbstractStage`
for axis metadata
- Update `StageView` to support editing center/max for each axis
- Persist and restore center/max values in stage config
-------------
Stage Manager
-------------
- Implement `StageManager.center(axis)` to move X, Y, or Z stage to
editable center position
- Refactor `StageManager.move_absolute` to accept optional coordinates
and units
--------------
Device Manager
--------------
- Add unified `update_gui` methods to `DeviceManager` and `CameraList`
- Add `centerRequest` method which accepts `Axis` enum for stage
centering.
- Refactor main window timer to call widget GUI updates
------------------------------
Other Refactors & Improvements
------------------------------
- refactor `miEye_module` to accommodate all the changes and new
widgets.
- Add XY and Z "Center" buttons to the Controller widget for moving
stages to center positions
- Fix mouse event handling in `TiledImageSelector' for Qt6 compatibility
- Update `config.json` to persist new dock and widget states
-----------------
microEye v2.4.0a1
-----------------
--------------------------------------------------
Unified Abstract Stage Class & Stage View Refactor
--------------------------------------------------
- The `AbstractStage` class was refactored to unify the interface for
all stage types (Z, XY, multi-axis, etc.), supporting:
- Consistent axis handling via the `axes` property.
- Unified position, movement, and configuration methods for all axes.
- Standardized unit conversion and metadata storage.
- Improved signal handling for async operations.
- The new `StageView provides` a generic parameter tree UI for any
stage, automatically adapting to supported axes and serial
configuration.
- Legacy stage-specific views and controllers (e.g., PiezoConcept,
Kinesis) are now replaced or wrapped by the unified view.
----------------------------------
Stage Manager & Stage Manager View
----------------------------------
- Added `StageManager` singleton class to manage all connected stages,
their assignment to axes, and movement coordination.
- Supports adding/removing stages, axis assignment, and step/jump
configuration.
- Handles open/close, busy state, and movement requests for all axes.
- Added `StageManagerView` for GUI management of stages, drivers, axis
assignment, and step/jump sizes.
- Stages are now dynamically added/removed and assigned to axes via the
manager, supporting multiple hardware backends.
--------------
Device Manager
--------------
- Removed support for legacy stages and related stage selection logic.
- Updated stage management to use the new unified `StageManager` and its
API for adding/removing stages and axis assignment.
- Updated configuration loading/saving to use the new stage config
format.
-----------------------------------------
SmarAct Stage Support (Under Development)
-----------------------------------------
- Initial implementation of `MCS2Stage` for SmarAct MCS2 controllers.
- Device discovery, connection, and configuration support.
- Not yet fully integrated into the main GUI, but ready for further
development.
------------------------
Camera List Improvements
------------------------
- The `CameraList` now supports dynamic addition/removal of cameras,
including PycroManager and hardware cameras.
- Improved support for saving/loading camera configuration in the main
config file.
- Generalized population logic of available connected cameras.
-----------------
Base Camera Class
-----------------
- Added support for property trees and parameter updates for camera
settings.
- Improved ROI handling: added `set_roi`, `get_roi`, and `reset_roi`
methods.
- Added metadata retrieval with get_metadata.
- Implemented `update_cam` for dynamic parameter changes.
- Added class methods for available camera list enumeration.
------------
Camera Panel
------------
- Unified logic for exposure, framerate, ROI, and capture handling in
`Camera_Panel`.
- Removed duplicated exposure/framerate/ROI logic from subclasses
(Basler, Pycro, Dummy, IDS, Thorlabs, Vimba, PCO).
- Subclasses now delegate to base class for common parameter setup and
signal connections.
- Capture and update methods standardized; device-specific logic moved
to base class where possible.
- Clean up resources used by the camera panel using overrides of
`Camera_Panel.dispose` if needed.
- Subclass panels now only implement device-specific overrides and
minimal customizations.
---------------------
Basler Camera Support
---------------------
- Added full support for Basler cameras via the `Basler_Panel` and
`basler_cam`.
- Camera options, ROI, exposure, and acquisition are integrated into the
unified camera panel system.
- Basler cameras are now included in config save/load and dynamic camera
list management.
- SDK seems to conflict with Vimba and Vimba X SDK transport layers.
-----------------------------------
Allied Vision (Vimba X SDK) Support
-----------------------------------
- Updated support for Allied Vision cameras to use the new Vimba X SDK
(`vmbpy`), replacing legacy Vimba SDK.
- All Vimba-related panels and camera classes now use the new SDK and
are compatible with the unified camera panel and camera list system.
- Refactored the `with` context from the main scope to `vimba_cam`.
- SDK seems to conflict with Basler Pylon SDK transport layers.
------------------------
PycroManager Refactoring
------------------------
- PycroManager camera and stage classes are now split into their own
submodules:
- `PycroCamera` in `microEye/hardware/cams/pycromanager/pycro_cam.py`.
- `PycroStageZ` and `PycroStageXY` in
`microEye/hardware/stages/pycromanager/core.py`.
- `PycroPanel` in
`microEye/hardware/cams/pycromanager/pycro_panel.py`.
- Stage selection and port management are now handled via dialogs and
the stage manager.
-----------------------------
Save/Load Config Improvements
-----------------------------
- The config system now saves and loads all stages and cameras,
including their assignment, configuration, and dynamic
addition/removal.
- When loading a config, available stages and cameras are automatically
added if detected.
- Dock widget positions, visibility, and floating state are still
preserved in config.
------------------------------
Other Refactors & Improvements
------------------------------
- The miEye module has minor updates to accommodate the changes above.
- Updated controller and device views to use the new signal and
parameter system.
- The controller signals now use the improved `Axis` enum type for move
requests.
--------------
Future Updates
--------------
- Complete SmarAct MCS2 stage integration and testing.
- Develop the Focus Stabilization alternative modalities. (Under Dev)
- MacOS compatibility testing.
- Acquisition Experiments Designer tools.
- 3D Localization fitting from Experimental PSF.
- Introduction of 2D/3D Single-Particle Tracking.1 parent 1f8fde9 commit 4caa8aa
15 files changed
Lines changed: 368 additions & 92 deletions
File tree
- src/microEye
- hardware
- cams
- basler
- lasers
- mieye
- protocols
- widgets
- tools
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | 73 | | |
78 | 74 | | |
79 | 75 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
326 | 326 | | |
327 | 327 | | |
328 | 328 | | |
329 | | - | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
330 | 332 | | |
331 | 333 | | |
332 | 334 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
1 | 2 | | |
2 | 3 | | |
| 4 | + | |
3 | 5 | | |
4 | 6 | | |
5 | 7 | | |
6 | 8 | | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
7 | 18 | | |
8 | 19 | | |
9 | 20 | | |
| |||
14 | 25 | | |
15 | 26 | | |
16 | 27 | | |
| 28 | + | |
17 | 29 | | |
18 | | - | |
| 30 | + | |
19 | 31 | | |
20 | 32 | | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
25 | 44 | | |
26 | 45 | | |
27 | 46 | | |
| |||
39 | 58 | | |
40 | 59 | | |
41 | 60 | | |
42 | | - | |
43 | | - | |
44 | | - | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
45 | 69 | | |
46 | 70 | | |
47 | 71 | | |
48 | 72 | | |
49 | 73 | | |
50 | 74 | | |
51 | | - | |
52 | | - | |
| 75 | + | |
| 76 | + | |
53 | 77 | | |
54 | 78 | | |
55 | 79 | | |
56 | 80 | | |
57 | 81 | | |
58 | 82 | | |
59 | | - | |
60 | | - | |
| 83 | + | |
| 84 | + | |
61 | 85 | | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
66 | 91 | | |
67 | | - | |
| 92 | + | |
68 | 93 | | |
69 | | - | |
| 94 | + | |
70 | 95 | | |
71 | 96 | | |
72 | 97 | | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
81 | | - | |
82 | | - | |
83 | | - | |
84 | | - | |
85 | | - | |
86 | | - | |
87 | | - | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
| 2 | + | |
2 | 3 | | |
3 | 4 | | |
4 | 5 | | |
| |||
287 | 288 | | |
288 | 289 | | |
289 | 290 | | |
290 | | - | |
291 | | - | |
292 | | - | |
293 | | - | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
294 | 298 | | |
295 | 299 | | |
296 | 300 | | |
| |||
482 | 486 | | |
483 | 487 | | |
484 | 488 | | |
485 | | - | |
| 489 | + | |
486 | 490 | | |
487 | 491 | | |
488 | 492 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
446 | 446 | | |
447 | 447 | | |
448 | 448 | | |
449 | | - | |
| 449 | + | |
450 | 450 | | |
451 | 451 | | |
452 | 452 | | |
| |||
463 | 463 | | |
464 | 464 | | |
465 | 465 | | |
466 | | - | |
| 466 | + | |
467 | 467 | | |
468 | 468 | | |
469 | 469 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
| 14 | + | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
513 | 513 | | |
514 | 514 | | |
515 | 515 | | |
516 | | - | |
| 516 | + | |
517 | 517 | | |
518 | 518 | | |
519 | 519 | | |
| |||
804 | 804 | | |
805 | 805 | | |
806 | 806 | | |
807 | | - | |
| 807 | + | |
808 | 808 | | |
809 | 809 | | |
810 | 810 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
106 | | - | |
107 | | - | |
108 | | - | |
| 106 | + | |
109 | 107 | | |
110 | 108 | | |
111 | 109 | | |
| |||
139 | 137 | | |
140 | 138 | | |
141 | 139 | | |
142 | | - | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
| |||
155 | 155 | | |
156 | 156 | | |
157 | 157 | | |
158 | | - | |
159 | | - | |
160 | | - | |
| 158 | + | |
161 | 159 | | |
162 | 160 | | |
163 | 161 | | |
| |||
271 | 269 | | |
272 | 270 | | |
273 | 271 | | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
274 | 308 | | |
275 | 309 | | |
276 | 310 | | |
| |||
346 | 380 | | |
347 | 381 | | |
348 | 382 | | |
349 | | - | |
| 383 | + | |
350 | 384 | | |
351 | 385 | | |
352 | 386 | | |
| |||
359 | 393 | | |
360 | 394 | | |
361 | 395 | | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
362 | 400 | | |
363 | 401 | | |
364 | 402 | | |
| |||
0 commit comments