RhetTbull / osxphotos

Python app to work with pictures and associated metadata from Apple Photos on macOS. Also includes a package to provide programmatic access to the Photos library, pictures, and metadata.
MIT License
2.14k stars 99 forks source link

Slow sync with --download-missing --use-photokit option #1504

Open odedia opened 7 months ago

odedia commented 7 months ago

When using the option --download-missing --use-photokit the process appears to be taking considerably more time. My library is 95% stored locally. I have around 2500 "downloading originals" still in process from an 80,000 library, so I doubt that's the root cause, but it's possible.

The difference is around 10 minutes to sync the full library without these parameters compared to over 4 hours since the new sync began, and around 5 hours left to the process, so an estimated 9 hours to complete.

This is the command I used:

osxphotos export /Users/odedia/Pictures/OSXPhotos \
--directory "{created.year}/{created.year}-{created.mm}-{created.dd}" \
--retry 3 --sidecar XMP \
--keyword-template "{label}" \
--keyword-template "{keyword}" \
--keyword-template "{person}" \
--keyword-template "{album}" \
--replace-keywords \
--sidecar-drop-ext \
--edited-suffix "_edited" --update --cleanup \
--report /tmp/export_{today.date}.csv \
--download-missing --use-photokit

App version:

macOS version: Sonoma.
> osxphotos --version
osxphotos, version 0.67.10
Python 3.12.1 (v3.12.1:2305ca5144, Dec  7 2023, 17:23:39) [Clang 13.0.0 (clang-1300.0.29.30)]
macOS 14.4.1, x86_64
RhetTbull commented 7 months ago

Are you using Download Originals to this Mac in Photos > Settings > iCloud?

odedia commented 7 months ago

Yes, I do.

RhetTbull commented 7 months ago

If you use --download-missing without --use-photokit, do you still see the slow down? Trying to figure out which code path is being triggered.

RhetTbull commented 7 months ago

Please try running this command and post the output:

edited to add --profile

osxphotos  --profile \
--watch osxphotos.photoexporter::PhotoExporter._stage_missing_photos_for_export \
--watch osxphotos.photoexporter::PhotoExporter._stage_photo_for_export_with_photokit \
--watch osxphotos.photoexporter::PhotoExporter._should_update_photo \
export /private/tmp \
--directory "{created.year}/{created.year}-{created.mm}-{created.dd}" \
--retry 3 --sidecar XMP \
--keyword-template "{label}" \
--keyword-template "{keyword}" \
--keyword-template "{person}" \
--keyword-template "{album}" \
--replace-keywords \
--sidecar-drop-ext \
--edited-suffix "_edited" --update --cleanup \
--report /tmp/export_{today.date}.csv \
--download-missing --use-photokit \
--verbose \
--limit 10 > osxphotos_profile.txt

This uses some of the built-in debugging features of osxphotos to watch certain function calls. It sounds like the photokit is getting called even when not needed but looking at the code, I don't see why. Send the osxphotos_profile.txt file to osxphotos.py@gmail.com or post here.

odedia commented 7 months ago

After completing the full remaining downloads it seems to be a lot faster. Not as fast as without --download-missing but definitely useable (around 20-30 minutes to complete). I suspect that Apple began throttling me since I've been downloading the full catalog multiple times in the past month or so. I will provide the output of the command above with and without --download-missing --use-photokit for reference. Thanks again for all the help.

odedia commented 7 months ago

At the end of the script it started deleting all my files, it seems. Not sure what has changed. Perhaps it cleans up files that were unchanged? That doesn't seem right.

filepath='/Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2023/2023-04-19/IMG_8086.HEIC', 
quote=False, caller='export'), replace_keywords=True, rich=True, export_aae=False, sidecar_drop_ext=True, 
sidecar=4, strip=False, timeout=120, touch_file=False, update=True, update_errors=False, 
use_albums_as_keywords=False, use_persons_as_keywords=False, use_photokit=True, use_photos_export=False, 
verbose=<function _verbose_print_function.<locals>.rich_verbose_ at 0x11260fba0>, tmpdir=None, 
favorite_rating=False, fix_orientation=False)) and kwargs: {}
2024-04-08T15:24:43.359676 _should_update_photo returned: False, elapsed time: 0.0004864820002694614 sec
Exported IMG_8086.HEIC to /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2023/2023-04-19/IMG_8086.mov
Skipped up to date XMP sidecar /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2023/2023-04-19/IMG_8086.xmp
Exported new file /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2023/2023-04-19/IMG_8086.mov
Skipped up to date file /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2023/2023-04-19/IMG_8086.HEIC
Exporting 78416 photos (limit = 10) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Processed: 78416 photos, exported: 10, updated: 0, skipped: 9808, updated EXIF data: 0, missing: 1, error: 0, limit: 10/10 exported
Elapsed time: 0:06:25
Cleaning up /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-06/IMG_1226.xmp
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-06/IMG_1227.JPG
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-06/IMG_1226.JPG
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-06/IMG_1227.xmp
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-06/IMG_1225.xmp
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-06/IMG_1224.JPG
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-06/IMG_1225.JPG
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-06/IMG_1224.xmp
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-01/IMG_1202_edited.xmp
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-01/IMG_1202_edited.jpeg
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos/2013/2013-04-01/IMG_1209.JPG

I then proceeded to run the flow again but against a fresh directory (thanks APFS for not destroying my storage space), and this is the result:

dest_path='/Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos_/2021/2021-02-17', filepath=None, quote=False, caller='export'), replace_keywords=True, rich=True, 
export_aae=False, sidecar_drop_ext=True, sidecar=4, strip=False, timeout=120, touch_file=False, update=True, update_errors=False, use_albums_as_keywords=False, 
use_persons_as_keywords=False, use_photokit=True, use_photos_export=False, verbose=<function _verbose_print_function.<locals>.rich_verbose_ at 0x10ef47ba0>, tmpdir=None, 
favorite_rating=False, fix_orientation=False)}
2024-04-08T15:35:13.704177 _stage_missing_photos_for_export returned: {'original': '/Volumes/ExternalData/Users/odedia/Pictures/Photo 
Library.photoslibrary/originals/3/322857BF-D1E8-47C2-98C9-498C9B82E7E7.png', 'original_live': None, 'edited': None, 'edited_live': None, 'preview': None, 'raw': None, 
'error': []}, elapsed time: 8.075000550888944e-06 sec
Exported IMG_4564.PNG to /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos_/2021/2021-02-17/IMG_4564.PNG
Writing XMP sidecar /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos_/2021/2021-02-17/IMG_4564.xmp
Exported new file /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos_/2021/2021-02-17/IMG_4564.PNG
Exporting 78416 photos (limit = 10) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Processed: 78416 photos, exported: 13, updated: 0, skipped: 0, updated EXIF data: 0, missing: 0, error: 0, limit: 10/10 exported
Elapsed time: 0:00:00
Cleaning up /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos_
Deleting /Volumes/ExternalData/Users/odedia/Pictures/OSXPhotos_/.DS_Store
Deleted: 1 file, 0 directories
Wrote export report to /tmp/export_2024-04-08.csv
Cleaning up lock files
Profiling completed
         45042317 function calls (45013199 primitive calls) in 31.565 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000   31.530   31.530 core.py:1423(invoke)
        1    0.000    0.000   31.530   31.530 core.py:732(invoke)
        1    0.000    0.000   31.530   31.530 decorators.py:44(new_func)
        1    0.000    0.000   31.530   31.530 decorators.py:32(new_func)
        1    0.000    0.000   31.530   31.530 crash_reporter.py:76(wrapped)
        1    0.000    0.000   31.530   31.530 export.py:137(export)
        1    0.001    0.001   31.530   31.530 export.py:1119(export_cli)
        1    0.001    0.001   30.402   30.402 photosdb.py:102(__init__)
        1    5.124    5.124   30.387   30.387 photosdb.py:1689(_process_database5)
        1    9.138    9.138   19.210   19.210 _photosdb_process_searchinfo.py:39(_process_searchinfo)
  5351307    4.458    0.000    7.627    0.000 unicode.py:78(normalize_unicode)
 15729006    1.891    0.000    1.892    0.000 {built-in method builtins.isinstance}
        1    0.000    0.000    1.830    1.830 _photosdb_process_faceinfo.py:23(_process_faceinfo)
        1    1.595    1.595    1.830    1.830 _photosdb_process_faceinfo.py:173(_process_faceinfo_5)
      273    1.551    0.006    1.551    0.006 {method 'execute' of 'sqlite3.Cursor' objects}
  4905856    1.305    0.000    1.305    0.000 {method 'replace' of 'str' objects}
  4803438    0.890    0.000    0.890    0.000 {method 'append' of 'list' objects}
  5206487    0.789    0.000    0.789    0.000 {built-in method unicodedata.normalize}
        1    0.000    0.000    0.707    0.707 _photosdb_process_exif.py:11(_process_exifinfo)
        1    0.233    0.233    0.707    0.707 _photosdb_process_exif.py:33(_process_exifinfo_5)
    72625    0.209    0.000    0.649    0.000 _photosdb_process_searchinfo.py:198(ints_to_uuid)
        1    0.001    0.001    0.605    0.605 photosdb.py:3171(query)
        1    0.040    0.040    0.604    0.604 photoquery.py:406(photo_query)
        1    0.000    0.000    0.576    0.576 _photosdb_process_scoreinfo.py:24(_process_scoreinfo)
        1    0.574    0.574    0.576    0.576 _photosdb_process_scoreinfo.py:40(_process_scoreinfo_5)
      108    0.001    0.000    0.532    0.005 console.py:1624(print)
        1    0.480    0.480    0.519    0.519 photosdb.py:3002(photos)
  5351307    0.512    0.000    0.512    0.000 unicode.py:37(get_unicode_form)
        3    0.471    0.157    0.471    0.157 {method 'fetchall' of 'sqlite3.Cursor' objects}
      110    0.000    0.000    0.368    0.003 console.py:863(__exit__)
      111    0.000    0.000    0.368    0.003 console.py:820(_exit_buffer)
      111    0.001    0.000    0.368    0.003 console.py:1989(_check_buffer)
        1    0.000    0.000    0.359    0.359 progress.py:1171(__exit__)
        1    0.000    0.000    0.359    0.359 progress.py:1161(stop)
       10    0.000    0.000    0.353    0.035 export.py:2252(export_photo)
   111462    0.344    0.000    0.344    0.000 {method 'astimezone' of 'datetime.datetime' objects}
       12    0.000    0.000    0.306    0.025 export.py:2690(export_photo_to_directory)
       12    0.000    0.000    0.298    0.025 photoexporter.py:154(export)
    72625    0.194    0.000    0.258    0.000 uuid.py:139(__init__)
  1635107    0.235    0.000    0.235    0.000 _constants.py:406(search_category_factory)
        1    0.000    0.000    0.219    0.219 _photosdb_process_syndicationinfo.py:14(_process_syndicationinfo)
        1    0.217    0.217    0.219    0.219 _photosdb_process_syndicationinfo.py:30(_process_syndicationinfo_7)
        1    0.000    0.000    0.196    0.196 photosdb.py:2614(_process_moments)
        1    0.074    0.074    0.196    0.196 photosdb.py:2625(_process_moment_5)
   196292    0.174    0.000    0.174    0.000 {built-in method fromtimestamp}
        1    0.000    0.000    0.160    0.160 _photosdb_process_shared_library.py:17(_process_shared_library_info)
        1    0.157    0.157    0.160    0.160 _photosdb_process_shared_library.py:31(_process_shared_library_info_8)
       12    0.000    0.000    0.126    0.011 photoexporter.py:564(_stage_photos_for_export)
       12    0.000    0.000    0.124    0.010 wrappers.py:630(__call__)
       12    0.000    0.000    0.124    0.010 debug.py:43(debug_watch)
       24    0.001    0.000    0.123    0.005 __init__.py:53(print)
    72625    0.116    0.000    0.116    0.000 uuid.py:280(__str__)
5465/4474    0.004    0.000    0.095    0.000 {method 'extend' of 'list' objects}
       12    0.000    0.000    0.088    0.007 sidecars.py:62(write_sidecar_files)
4981/4921    0.003    0.000    0.087    0.000 console.py:1287(render)
      216    0.015    0.000    0.082    0.000 inspect.py:1355(getfullargspec)
     4919    0.002    0.000    0.081    0.000 text.py:683(__rich_console__)
       13    0.001    0.000    0.073    0.006 photoexporter.py:867(_export_photo)
       12    0.000    0.000    0.068    0.006 sidecars.py:236(xmp_sidecar)
      216    0.001    0.000    0.058    0.000 inspect.py:2463(_signature_from_callable)
      216    0.014    0.000    0.057    0.000 inspect.py:2368(_signature_from_function)
       80    0.000    0.000    0.056    0.001 phototemplate.py:463(render)
       80    0.000    0.000    0.053    0.001 phototemplate.py:415(parse)
       80    0.000    0.000    0.053    0.001 metamodel.py:662(model_from_str)
       81    0.000    0.000    0.052    0.001 __init__.py:1507(parse)
       80    0.000    0.000    0.051    0.001 model.py:376(get_model_from_str)
  7826/81    0.011    0.000    0.051    0.001 __init__.py:243(parse)
       72    0.000    0.000    0.051    0.001 photoinfo.py:1799(render_template)
  3994/81    0.005    0.000    0.050    0.001 __init__.py:362(_parse)
      108    0.001    0.000    0.049    0.000 console.py:1486(_collect_renderables)
       76    0.001    0.000    0.045    0.001 verbose.py:231(rich_verbose_)
   145250    0.045    0.000    0.045    0.000 {method 'to_bytes' of 'int' objects}
  351/112    0.001    0.000    0.045    0.000 __init__.py:513(_parse)
      106    0.001    0.000    0.042    0.000 console.py:1397(render_str)
    78610    0.040    0.000    0.040    0.000 photosdb.py:3185(_duplicate_signature)
        1    0.000    0.000    0.039    0.039 core.py:907(make_context)
        1    0.000    0.000    0.039    0.039 core.py:1399(parse_args)
      174    0.000    0.000    0.037    0.000 core.py:2392(handle_parse_result)
     4919    0.010    0.000    0.037    0.000 text.py:714(render)
      109    0.001    0.000    0.036    0.000 text.py:1193(wrap)
 2301/417    0.001    0.000    0.035    0.000 __init__.py:455(_parse)
      174    0.000    0.000    0.035    0.000 core.py:2355(process_value)
      174    0.000    0.000    0.035    0.000 core.py:2295(type_cast_value)
      121    0.000    0.000    0.034    0.000 core.py:2315(convert)
      121    0.000    0.000    0.034    0.000 types.py:76(__call__)
        7    0.000    0.000    0.034    0.005 param_types.py:224(convert)
      106    0.000    0.000    0.032    0.000 highlighter.py:20(__call__)
       80    0.000    0.000    0.032    0.000 model.py:335(_parse)
       47    0.031    0.001    0.031    0.001 {built-in method _io.open}
        1    0.000    0.000    0.031    0.031 common.py:57(get_photos_db)
        1    0.000    0.000    0.031    0.031 utils.py:184(get_last_library_path)
       24    0.000    0.000    0.031    0.001 highlighter.py:67(highlight)
       96    0.023    0.000    0.031    0.000 text.py:589(highlight_regex)
       56    0.000    0.000    0.030    0.001 __init__.py:287(wrapped_f)
       80    0.000    0.000    0.030    0.000 phototemplate.py:428(__init__)
       12    0.000    0.000    0.030    0.002 sidecars.py:357(_xmp_template)
        1    0.000    0.000    0.030    0.030 template.py:225(__init__)
        1    0.000    0.000    0.029    0.029 template.py:369(_compile_from_file)
       12    0.000    0.000    0.029    0.002 export.py:2925(get_dirnames_from_template)
       80    0.000    0.000    0.029    0.000 phototemplate.py:407(__init__)
        1    0.000    0.000    0.029    0.029 metamodel.py:68(metamodel_from_file)
        1    0.000    0.000    0.029    0.029 template.py:675(_compile_text)
        1    0.000    0.000    0.029    0.029 metamodel.py:42(metamodel_from_str)
        1    0.000    0.000    0.029    0.029 lang.py:1110(language_from_str)
       56    0.000    0.000    0.027    0.000 __init__.py:369(__call__)
        1    0.000    0.000    0.027    0.027 template.py:650(_compile)
    11448    0.014    0.000    0.027    0.000 inspect.py:2729(__init__)
    77718    0.025    0.000    0.025    0.000 photoinfo.py:933(burst)
       26    0.001    0.000    0.024    0.001 photoinfo.py:2035(asdict)
       16    0.000    0.000    0.023    0.001 photoinfo.py:2170(json)
    78706    0.022    0.000    0.022    0.000 photoinfo.py:93(__init__)
4254/3683    0.005    0.000    0.022    0.000 __init__.py:768(parse)
    73129    0.021    0.000    0.021    0.000 {method 'upper' of 'str' objects}
1734/1508    0.006    0.000    0.020    0.000 {built-in method builtins.sum}
    72627    0.020    0.000    0.020    0.000 {method 'count' of 'list' objects}
101547/100086    0.019    0.000    0.020    0.000 {built-in method builtins.len}
        1    0.000    0.000    0.020    0.020 __init__.py:1784(_parse)
     49/2    0.000    0.000    0.020    0.010 __init__.py:472(_parse)
       80    0.001    0.000    0.019    0.000 model.py:508(parse_tree_to_objgraph)
   157363    0.019    0.000    0.019    0.000 photoinfo.py:680(uuid)
        1    0.000    0.000    0.019    0.019 lexer.py:218(parse)
     8500    0.004    0.000    0.019    0.000 cells.py:29(cell_len)
    72841    0.018    0.000    0.018    0.000 {built-in method from_bytes}
      570    0.000    0.000    0.016    0.000 photoinfo.py:1291(orientation)
     4681    0.007    0.000    0.016    0.000 text.py:753(get_current_style)
      280    0.000    0.000    0.016    0.000 photoinfo.py:726(adjustments)
 1131/170    0.001    0.000    0.016    0.000 __init__.py:402(_parse)
       28    0.000    0.000    0.015    0.001 plistlib.py:865(load)
       63    0.000    0.000    0.014    0.000 export_db.py:739(_relative_filepath)
        1    0.000    0.000    0.014    0.014 platform.py:1218(platform)
      950    0.001    0.000    0.013    0.000 cells.py:11(cached_cell_len)
      107    0.002    0.000    0.013    0.000 _wrap.py:20(divide_line)
       71    0.000    0.000    0.013    0.000 functools.py:979(__get__)
       13    0.011    0.001    0.013    0.001 fileutil.py:107(copy)
  392/376    0.002    0.000    0.013    0.000 segment.py:265(split_and_crop_lines)
        2    0.000    0.000    0.013    0.006 subprocess.py:417(check_output)
        2    0.000    0.000    0.012    0.006 subprocess.py:506(run)
      293    0.009    0.000    0.012    0.000 {built-in method posix.stat}
       63    0.001    0.000    0.012    0.000 pathlib.py:663(relative_to)
  1027/80    0.004    0.000    0.012    0.000 model.py:547(process_node)
      432    0.001    0.000    0.011    0.000 console.py:992(size)
      215    0.001    0.000    0.011    0.000 text.py:773(join)
       38    0.000    0.000    0.011    0.000 export_db.py:189(create_or_get_file_record)
       18    0.000    0.000    0.011    0.001 adjustmentsinfo.py:31(__init__)
      216    0.004    0.000    0.011    0.000 inspect.py:3015(__init__)
      107    0.005    0.000    0.011    0.000 text.py:1098(divide)
       36    0.000    0.000    0.011    0.000 personinfo.py:404(asdict)
       18    0.000    0.000    0.011    0.001 adjustmentsinfo.py:63(_load_plist_file)
      757    0.001    0.000    0.011    0.000 __init__.py:280(_compile)
       12    0.000    0.000    0.010    0.001 template.py:427(render)
       12    0.000    0.000    0.010    0.001 runtime.py:860(_render)
      116    0.003    0.000    0.010    0.000 markup.py:106(render)
      108    0.001    0.000    0.010    0.000 console.py:979(options)
       12    0.000    0.000    0.010    0.001 runtime.py:908(_render_context)
       12    0.000    0.000    0.010    0.001 runtime.py:923(_exec_template)
       12    0.000    0.000    0.010    0.001 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:15(render_body)
      186    0.000    0.000    0.009    0.000 pathlib.py:835(stat)
       72    0.000    0.000    0.009    0.000 personinfo.py:361(_make_point)
       36    0.000    0.000    0.009    0.000 personinfo.py:182(center)
        1    0.000    0.000    0.009    0.009 __init__.py:1268(visit_parse_tree)
        3    0.000    0.000    0.009    0.003 sqlite_utils.py:59(sqlite_db_is_locked)
       47    0.000    0.000    0.009    0.000 _compiler.py:740(compile)
        4    0.009    0.002    0.009    0.002 {method 'execute' of 'sqlite3.Connection' objects}
      279    0.000    0.000    0.009    0.000 segment.py:312(adjust_line_length)
       13    0.009    0.001    0.009    0.001 {method 'close' of 'sqlite3.Connection' objects}
       21    0.000    0.000    0.008    0.000 plistlib.py:180(parse)
       21    0.003    0.000    0.008    0.000 {method 'ParseFile' of 'pyexpat.xmlparser' objects}
        1    0.000    0.000    0.008    0.008 _photosdb_process_comments.py:14(_process_comments)
        2    0.000    0.000    0.008    0.004 subprocess.py:807(__init__)
    26067    0.007    0.000    0.008    0.000 {method 'get' of 'dict' objects}
        1    0.002    0.002    0.008    0.008 _photosdb_process_comments.py:37(_process_comments_5)
    806/1    0.002    0.000    0.008    0.008 __init__.py:1003(visit)
      188    0.001    0.000    0.008    0.000 lexer.py:124(append_node)
     1152    0.001    0.000    0.008    0.000 pathlib.py:437(__str__)
    39601    0.008    0.000    0.008    0.000 cells.py:25(<genexpr>)
        1    0.000    0.000    0.008    0.008 codegen.py:31(compile)
        1    0.000    0.000    0.008    0.008 platform.py:690(architecture)
     4929    0.001    0.000    0.008    0.000 segment.py:331(<genexpr>)
        1    0.000    0.000    0.008    0.008 platform.py:646(_syscmd_file)
        2    0.000    0.000    0.007    0.004 subprocess.py:1789(_execute_child)
     1461    0.001    0.000    0.007    0.000 lexer.py:51(match)
     2202    0.003    0.000    0.007    0.000 __init__.py:882(_parse)
      728    0.001    0.000    0.007    0.000 pathlib.py:551(drive)
       33    0.000    0.000    0.007    0.000 __init__.py:226(compile)
    11882    0.005    0.000    0.007    0.000 enum.py:713(__call__)
        2    0.000    0.000    0.007    0.003 photosdb_utils.py:76(get_model_version)
      434    0.001    0.000    0.007    0.000 console.py:967(is_dumb_terminal)
      270    0.000    0.000    0.007    0.000 text.py:856(truncate)
     14/1    0.000    0.000    0.007    0.007 codegen.py:106(__init__)
    11664    0.006    0.000    0.007    0.000 inspect.py:3062(<genexpr>)
      201    0.000    0.000    0.007    0.000 lexer.py:403(match_expression)
       70    0.000    0.000    0.007    0.000 pathlib.py:886(is_file)
      471    0.001    0.000    0.007    0.000 pathlib.py:407(_load_parts)
     6608    0.003    0.000    0.007    0.000 text.py:804(<genexpr>)
      670    0.001    0.000    0.006    0.000 console.py:931(is_terminal)
     4650    0.002    0.000    0.006    0.000 segment.py:81(cell_length)
4604/2740    0.004    0.000    0.006    0.000 __init__.py:117(flatten)
     1370    0.002    0.000    0.006    0.000 __init__.py:1116(__init__)
     1971    0.002    0.000    0.006    0.000 __init__.py:849(_parse)
       16    0.000    0.000    0.006    0.000 sqlite_utils.py:40(sqlite_open_ro)
        1    0.000    0.000    0.006    0.006 export_db.py:504(close)
        1    0.000    0.000    0.006    0.006 export.py:3073(cleanup_files)
     3970    0.005    0.000    0.006    0.000 __init__.py:1707(_nm_raise)
       25    0.000    0.000    0.006    0.000 export_db.py:747(_normalize_filepath_relative)
      110    0.000    0.000    0.006    0.000 console.py:1528(check_text)
       63    0.000    0.000    0.006    0.000 pathlib.py:690(is_relative_to)
     1973    0.001    0.000    0.006    0.000 <frozen _collections_abc>:804(get)
      700    0.000    0.000    0.006    0.000 <frozen _collections_abc>:1022(__iter__)
       12    0.000    0.000    0.006    0.000 photoexporter.py:398(_get_dest_path)
        1    0.000    0.000    0.006    0.006 platform.py:860(__iter__)
      109    0.003    0.000    0.006    0.000 console.py:2068(_render_buffer)
        1    0.000    0.000    0.005    0.005 platform.py:856(processor)
      216    0.000    0.000    0.005    0.000 console.py:1049(width)
        1    0.000    0.000    0.005    0.005 platform.py:795(get)
        1    0.000    0.000    0.005    0.005 platform.py:817(from_subprocess)
        1    0.000    0.000    0.005    0.005 verbose.py:130(verbose_print)
       47    0.000    0.000    0.005    0.000 _parser.py:969(parse)
     1114    0.001    0.000    0.005    0.000 pathlib.py:380(with_segments)
      637    0.001    0.000    0.005    0.000 pathlib.py:277(__getitem__)
       10    0.000    0.000    0.005    0.001 photoinfo.py:1676(hexdigest)
        1    0.000    0.000    0.005    0.005 color_themes.py:185(get_theme)
        1    0.000    0.000    0.005    0.005 color_themes.py:203(get_default_theme)
        1    0.000    0.000    0.005    0.005 color_themes.py:178(get_theme_manager)
       29    0.005    0.000    0.005    0.000 {method 'intersection' of 'set' objects}
       14    0.000    0.000    0.005    0.000 codegen.py:285(write_render_callable)
   105/47    0.000    0.000    0.005    0.000 _parser.py:452(_parse_sub)
       22    0.000    0.000    0.005    0.000 export.py:2654(_render_suffix_template)
       10    0.000    0.000    0.005    0.000 photoinfo.py:2203(_json_hexdigest)
        1    0.000    0.000    0.005    0.005 manager.py:18(__init__)
      264    0.000    0.000    0.005    0.000 personinfo.py:321(_fix_orientation)
   143/47    0.002    0.000    0.005    0.000 _parser.py:512(_parse)
      429    0.005    0.000    0.005    0.000 {method 'read' of '_io.BufferedReader' objects}
     7761    0.005    0.000    0.005    0.000 {method 'match' of 're.Pattern' objects}
      494    0.002    0.000    0.005    0.000 pathlib.py:387(_parse_path)
    20531    0.005    0.000    0.005    0.000 {built-in method __new__ of type object at 0x10769d8d0}
      121    0.002    0.000    0.005    0.000 {method 'flush' of '_io.TextIOWrapper' objects}
       84    0.001    0.000    0.005    0.000 exportoptions.py:219(__init__)
       18    0.000    0.000    0.005    0.000 photoinfo.py:704(adjustments_path)
     2037    0.002    0.000    0.005    0.000 <frozen os>:680(__getitem__)
     1362    0.001    0.000    0.005    0.000 pathlib.py:1157(__init__)
    17081    0.004    0.000    0.005    0.000 {built-in method builtins.getattr}
     3206    0.002    0.000    0.004    0.000 console.py:1456(get_style)
     1031    0.001    0.000    0.004    0.000 text.py:143(__init__)
        7    0.000    0.000    0.004    0.001 plistlib.py:467(parse)
     1318    0.001    0.000    0.004    0.000 control.py:187(strip_control_codes)
        1    0.000    0.000    0.004    0.004 export_db.py:101(__init__)
       13    0.000    0.000    0.004    0.000 export_db.py:426(set_history)
       36    0.000    0.000    0.004    0.000 photoinfo.py:1228(place)
       48    0.000    0.000    0.004    0.000 pathlib.py:1097(rglob)
       12    0.000    0.000    0.004    0.000 path_utils.py:29(sanitize_filepath)
        6    0.000    0.000    0.004    0.001 live.py:220(refresh)
        4    0.000    0.000    0.004    0.001 placeinfo.py:583(__init__)
   1370/7    0.002    0.000    0.004    0.001 plistlib.py:515(_read_object)
       12    0.000    0.000    0.004    0.000 _filepath.py:408(sanitize_filepath)
        2    0.000    0.000    0.004    0.002 subprocess.py:1165(communicate)
      403    0.000    0.000    0.004    0.000 pathlib.py:447(__fspath__)
  846/257    0.001    0.000    0.004    0.000 parsetree.py:39(accept_visitor)
        4    0.000    0.000    0.004    0.001 archiver.py:21(unarchive)
      105    0.004    0.000    0.004    0.000 {method 'commit' of 'sqlite3.Connection' objects}
        4    0.000    0.000    0.004    0.001 archiver.py:263(top_object)
      134    0.004    0.000    0.004    0.000 {built-in method builtins.compile}
       26    0.000    0.000    0.004    0.000 pathlib.py:1228(resolve)
        6    0.000    0.000    0.004    0.001 plistlib.py:887(loads)
     1333    0.004    0.000    0.004    0.000 {method 'translate' of 'str' objects}
      613    0.001    0.000    0.004    0.000 pathlib.py:420(_from_parsed_parts)
       24    0.000    0.000    0.004    0.000 _filepath.py:193(validate)
        1    0.000    0.000    0.004    0.004 photosdb_utils.py:97(get_photos_version_from_model)
       48    0.000    0.000    0.004    0.000 pathlib.py:234(_select_from)
    23922    0.004    0.000    0.004    0.000 {method 'span' of 're.Match' objects}
      158    0.000    0.000    0.004    0.000 lexer.py:424(match_control_line)
     1886    0.002    0.000    0.004    0.000 _wrap.py:10(words)
      119    0.000    0.000    0.004    0.000 lexer.py:274(match_tag_start)
        5    0.000    0.000    0.004    0.001 click_rich_echo.py:91(rich_echo)
       96    0.000    0.000    0.003    0.000 personinfo.py:248(mpri_reg_rect)
       43    0.000    0.000    0.003    0.000 parsetree.py:196(__init__)
       17    0.003    0.000    0.003    0.000 {built-in method _sqlite3.connect}
       12    0.000    0.000    0.003    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:34(mwg_face_regions)
       12    0.000    0.000    0.003    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:279(render_mwg_face_regions)
       12    0.000    0.000    0.003    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:24(mpri_face_regions)
       69    0.000    0.000    0.003    0.000 ast.py:20(__init__)
        2    0.003    0.002    0.003    0.002 {built-in method _posixsubprocess.fork_exec}
       12    0.000    0.000    0.003    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:310(render_mpri_face_regions)
     2079    0.002    0.000    0.003    0.000 {method 'join' of 'str' objects}
       47    0.000    0.000    0.003    0.000 _compiler.py:573(_code)
     1362    0.002    0.000    0.003    0.000 pathlib.py:358(__init__)
        1    0.000    0.000    0.003    0.003 export_db.py:511(_open_export_db)
      168    0.000    0.000    0.003    0.000 _base.py:211(_validate_reserved_keywords)
       96    0.000    0.000    0.003    0.000 personinfo.py:222(mwg_rs_area)
       12    0.000    0.000    0.003    0.000 sidecars.py:371(_write_sidecar)
        1    0.000    0.000    0.003    0.003 manager.py:81(load_themes)
      260    0.000    0.000    0.003    0.000 pathlib.py:519(__eq__)
       12    0.000    0.000    0.003    0.000 export_db.py:213(get_uuid_for_file)
       27    0.000    0.000    0.003    0.000 __init__.py:183(dumps)
       12    0.000    0.000    0.003    0.000 _filepath.py:78(sanitize)
       69    0.001    0.000    0.003    0.000 exportoptions.py:305(__iadd__)
       93    0.000    0.000    0.003    0.000 lexer.py:355(match_text)
     2337    0.001    0.000    0.003    0.000 __init__.py:740(_parse_comments)
       26    0.000    0.000    0.003    0.000 <frozen posixpath>:431(realpath)
       27    0.000    0.000    0.003    0.000 encoder.py:183(encode)
        4    0.000    0.000    0.003    0.001 theme.py:306(read)
       12    0.000    0.000    0.003    0.000 path_utils.py:34(is_valid_filepath)
        2    0.003    0.001    0.003    0.001 {built-in method posix.read}
       12    0.000    0.000    0.003    0.000 _filepath.py:374(is_valid_filepath)
      520    0.001    0.000    0.003    0.000 pathlib.py:484(_str_normcase)
     6987    0.002    0.000    0.003    0.000 plistlib.py:206(handle_data)
      150    0.001    0.000    0.003    0.000 pathlib.py:200(_select_from)
       27    0.003    0.000    0.003    0.000 encoder.py:205(iterencode)
   467/80    0.001    0.000    0.003    0.000 model.py:767(call_obj_processors)
       63    0.000    0.000    0.003    0.000 <frozen _collections_abc>:1032(__contains__)
        4    0.000    0.000    0.003    0.001 archiver.py:182(unpack_archive_header)
        4    0.000    0.000    0.003    0.001 theme.py:274(from_file)
    15162    0.003    0.000    0.003    0.000 text.py:755(<genexpr>)
       80    0.000    0.000    0.003    0.000 phototemplate.py:507(_render_statement)
    11543    0.003    0.000    0.003    0.000 {built-in method builtins.hasattr}
  548/133    0.000    0.000    0.003    0.000 _ast_util.py:131(visit)
       30    0.003    0.000    0.003    0.000 {built-in method posix.mkdir}
      611    0.002    0.000    0.003    0.000 markup.py:73(_parse)
     1462    0.001    0.000    0.003    0.000 lexer.py:62(match_reg)
     5494    0.002    0.000    0.003    0.000 {built-in method builtins.sorted}
     8537    0.002    0.000    0.002    0.000 {method 'startswith' of 'str' objects}
       12    0.000    0.000    0.002    0.000 _base.py:131(is_valid)
        1    0.000    0.000    0.002    0.002 threading.py:1016(_bootstrap)
        7    0.000    0.000    0.002    0.000 live.py:96(get_renderable)
    11454    0.002    0.000    0.002    0.000 {method 'isidentifier' of 'str' objects}
        7    0.000    0.000    0.002    0.000 progress.py:1535(get_renderable)
        1    0.000    0.000    0.002    0.002 export.py:1934(cleanup_lock_files)
       80    0.000    0.000    0.002    0.000 model.py:148(get_children_of_type)
       14    0.000    0.000    0.002    0.000 progress.py:1540(get_renderables)
      121    0.002    0.000    0.002    0.000 {built-in method posix.scandir}
      119    0.000    0.000    0.002    0.000 phototemplate.py:533(_render_template_string)
  426/133    0.001    0.000    0.002    0.000 _ast_util.py:138(generic_visit)
        7    0.000    0.000    0.002    0.000 progress.py:1545(make_tasks_table)
       48    0.000    0.000    0.002    0.000 lexer.py:84(parse_until_text)
   223/47    0.001    0.000    0.002    0.000 _compiler.py:37(_compile)
        6    0.000    0.000    0.002    0.000 live.py:196(renderable)
        7    0.000    0.000    0.002    0.000 core.py:2342(<genexpr>)
    11882    0.002    0.000    0.002    0.000 enum.py:1116(__new__)
    22896    0.002    0.000    0.002    0.000 inspect.py:2782(name)
    22896    0.002    0.000    0.002    0.000 inspect.py:2786(default)
      153    0.001    0.000    0.002    0.000 exportoptions.py:264(attributes)
  280/172    0.000    0.000    0.002    0.000 plistlib.py:591(<genexpr>)
        1    0.000    0.000    0.002    0.002 photosdb.py:3179(execute)
        1    0.000    0.000    0.002    0.002 live.py:134(stop)
      367    0.001    0.000    0.002    0.000 pygen.py:83(writeline)
       80    0.000    0.000    0.002    0.000 model.py:95(get_children)
     1239    0.001    0.000    0.002    0.000 __init__.py:1659(pos_to_linecol)
       13    0.000    0.000    0.002    0.000 tempfile.py:880(__init__)
      305    0.001    0.000    0.002    0.000 metamodel.py:501(_init_obj_attrs)
       10    0.000    0.000    0.002    0.000 photoinfo.py:973(path_live_photo)
   467/80    0.001    0.000    0.002    0.000 model.py:113(follow)
     2037    0.001    0.000    0.002    0.000 <frozen os>:762(encode)
      287    0.001    0.000    0.002    0.000 text.py:960(append)
       12    0.000    0.000    0.002    0.000 photoexporter.py:371(_init_temp_dir)
       26    0.000    0.000    0.002    0.000 <frozen posixpath>:440(_joinrealpath)
      481    0.001    0.000    0.002    0.000 <frozen posixpath>:71(join)
       43    0.002    0.000    0.002    0.000 {method '__exit__' of '_io._IOBase' objects}
       11    0.000    0.000    0.002    0.000 weakref.py:585(__call__)
       13    0.000    0.000    0.002    0.000 tempfile.py:360(mkdtemp)
    11448    0.002    0.000    0.002    0.000 {method '__contains__' of 'frozenset' objects}
       11    0.000    0.000    0.002    0.000 tempfile.py:932(_cleanup)
      192    0.000    0.000    0.002    0.000 text.py:439(copy)
       91    0.000    0.000    0.002    0.000 pathlib.py:1059(_scandir)
       12    0.000    0.000    0.002    0.000 fileutil.py:254(tmpdir)
       38    0.000    0.000    0.002    0.000 pathlib.py:228(_iterate_directories)
      661    0.002    0.000    0.002    0.000 {method 'isatty' of '_io.TextIOWrapper' objects}
     2334    0.002    0.000    0.002    0.000 {method 'groupdict' of 're.Match' objects}
      401    0.000    0.000    0.002    0.000 __init__.py:164(match)
       39    0.000    0.000    0.002    0.000 parsetree.py:81(__init__)
      106    0.000    0.000    0.002    0.000 phototemplate.py:831(get_field_values)
       68    0.000    0.000    0.002    0.000 pathlib.py:1081(glob)
       52    0.000    0.000    0.002    0.000 dataclasses.py:1299(asdict)
      4/3    0.000    0.000    0.002    0.001 _lazyimport.py:157(__getattr__)
       11    0.000    0.000    0.002    0.000 tempfile.py:890(_rmtree)
        1    0.000    0.000    0.002    0.002 manager.py:96(write_themes)
      499    0.000    0.000    0.002    0.000 style.py:600(combine)
       11    0.000    0.000    0.002    0.000 shutil.py:712(rmtree)
      300    0.000    0.000    0.002    0.000 plistlib.py:201(handle_end_element)
        4    0.000    0.000    0.002    0.000 theme.py:104(save)
        4    0.000    0.000    0.002    0.000 theme.py:99(to_file)
  1248/52    0.001    0.000    0.002    0.000 dataclasses.py:1323(_asdict_inner)
      109    0.000    0.000    0.002    0.000 text.py:1054(split)
       68    0.000    0.000    0.002    0.000 photoinfo.py:162(path)
        1    0.000    0.000    0.002    0.002 export_db.py:552(_get_database_version)
       21    0.000    0.000    0.002    0.000 ast.py:85(__init__)
      336    0.000    0.000    0.002    0.000 _base.py:139(_is_reserved_keyword)
       38    0.000    0.000    0.002    0.000 fileutil.py:212(file_sig)
      133    0.000    0.000    0.002    0.000 pyparser.py:32(parse)
     7258    0.002    0.000    0.002    0.000 {built-in method builtins.setattr}
    17/10    0.000    0.000    0.002    0.000 <frozen os>:200(makedirs)
      133    0.000    0.000    0.002    0.000 _ast_util.py:89(parse)
        9    0.000    0.000    0.002    0.000 lang.py:1064(visit_re_match)
       38    0.001    0.000    0.002    0.000 pathlib.py:1112(walk)
      327    0.000    0.000    0.001    0.000 containers.py:69(__init__)
       12    0.000    0.000    0.001    0.000 live_render.py:82(__rich_console__)
3494/3458    0.001    0.000    0.001    0.000 {built-in method posix.fspath}
        4    0.000    0.000    0.001    0.000 configparser.py:692(read_file)
    13056    0.001    0.000    0.001    0.000 style.py:432(__hash__)
       25    0.000    0.000    0.001    0.000 progress.py:1567(<genexpr>)
        4    0.001    0.000    0.001    0.000 configparser.py:974(_read)
       46    0.000    0.000    0.001    0.000 pathlib.py:852(exists)
        9    0.000    0.000    0.001    0.000 __init__.py:831(compile)
      9/1    0.000    0.000    0.001    0.001 console.py:1338(render_lines)
       24    0.000    0.000    0.001    0.000 _filename.py:66(sanitize)
        3    0.000    0.000    0.001    0.000 _lazyimport.py:350(__get_constant)
       20    0.000    0.000    0.001    0.000 progress.py:509(__call__)
       18    0.000    0.000    0.001    0.000 __init__.py:174(search)
       13    0.000    0.000    0.001    0.000 <frozen genericpath>:27(isfile)
        1    0.000    0.000    0.001    0.001 export.py:3383(render_and_validate_report)
       80    0.000    0.000    0.001    0.000 model.py:310(clone)
       13    0.000    0.000    0.001    0.000 parsetree.py:233(__call__)
       13    0.000    0.000    0.001    0.000 table.py:471(__rich_console__)
      313    0.001    0.000    0.001    0.000 {method 'sort' of 'list' objects}
       13    0.000    0.000    0.001    0.000 parsetree.py:450(__init__)
      206    0.000    0.000    0.001    0.000 text.py:1121(<genexpr>)
      127    0.000    0.000    0.001    0.000 pathlib.py:741(parents)
    168/4    0.000    0.000    0.001    0.000 archiver.py:229(decode_object)
      288    0.001    0.000    0.001    0.000 _filename.py:130(reserved_keywords)
      307    0.001    0.000    0.001    0.000 _emoji_replace.py:12(_emoji_replace)
    11448    0.001    0.000    0.001    0.000 inspect.py:2794(kind)
    11448    0.001    0.000    0.001    0.000 inspect.py:2790(annotation)
       15    0.000    0.000    0.001    0.000 codegen.py:1085(branch)
       56    0.000    0.000    0.001    0.000 ast.py:54(__init__)
        4    0.000    0.000    0.001    0.000 placeinfo.py:138(decode_archive)
       24    0.000    0.000    0.001    0.000 _filename.py:168(validate)
     3078    0.001    0.000    0.001    0.000 {built-in method sys.intern}
       16    0.000    0.000    0.001    0.000 codegen.py:1018(__init__)
        1    0.000    0.000    0.001    0.001 click_rich_echo.py:170(rich_click_echo)
       56    0.000    0.000    0.001    0.000 __init__.py:467(set_result)
        1    0.000    0.000    0.001    0.001 core.py:1312(make_parser)
   212/36    0.000    0.000    0.001    0.000 archiver.py:149(decode)
      163    0.000    0.000    0.001    0.000 pathlib.py:1065(_make_child_relpath)
   212/36    0.000    0.000    0.001    0.000 archiver.py:223(decode_key)
      127    0.000    0.000    0.001    0.000 pathlib.py:268(__init__)
        1    0.000    0.000    0.001    0.001 export_db.py:547(_get_db_connection)
       80    0.000    0.000    0.001    0.000 copy.py:61(copy)
      993    0.001    0.000    0.001    0.000 pathlib.py:429(_format_parsed_parts)
       25    0.000    0.000    0.001    0.000 export_db.py:1297(digest)
     1370    0.001    0.000    0.001    0.000 text.py:398(plain)
       44    0.000    0.000    0.001    0.000 pathlib.py:870(is_dir)
      182    0.001    0.000    0.001    0.000 {built-in method posix.lstat}
        1    0.000    0.000    0.001    0.001 pygen.py:15(__init__)
        4    0.000    0.000    0.001    0.000 theme.py:75(config)
       25    0.000    0.000    0.001    0.000 export_db.py:1318(_digest_setter)
       10    0.000    0.000    0.001    0.000 text.py:258(from_markup)
      152    0.001    0.000    0.001    0.000 photoinfo.py:953(burst_photos)
       12    0.000    0.000    0.001    0.000 _filepath.py:27(__init__)
     1362    0.001    0.000    0.001    0.000 pathlib.py:1164(__new__)
       11    0.000    0.000    0.001    0.000 report_writer.py:121(write)
       54    0.000    0.000    0.001    0.000 phototemplate.py:878(get_template_value)
        1    0.000    0.000    0.001    0.001 lang.py:379(second_textx_model)
        3    0.000    0.000    0.001    0.000 platform.py:480(mac_ver)
        3    0.000    0.000    0.001    0.000 platform.py:458(_mac_ver_xml)
        1    0.001    0.001    0.001    0.001 {method 'read' of '_io.TextIOWrapper' objects}
     3287    0.001    0.000    0.001    0.000 {built-in method builtins.max}
       13    0.000    0.000    0.001    0.000 export_db.py:1656(__exit__)
      745    0.001    0.000    0.001    0.000 __init__.py:1061(__init__)
       53    0.001    0.000    0.001    0.000 dataclasses.py:1531(replace)
      173    0.000    0.000    0.001    0.000 core.py:2931(consume_value)
       32    0.000    0.000    0.001    0.000 metamodel.py:376(_new_class)
        1    0.000    0.000    0.001    0.001 codegen.py:176(write_toplevel)
  499/141    0.000    0.000    0.001    0.000 parsetree.py:40(traverse)
     1330    0.001    0.000    0.001    0.000 {method 'split' of 'str' objects}
       43    0.000    0.000    0.001    0.000 codegen.py:809(visitExpression)
       13    0.000    0.000    0.001    0.000 table.py:743(_render)
      173    0.000    0.000    0.001    0.000 core.py:2695(add_to_parser)
     3681    0.001    0.000    0.001    0.000 {built-in method builtins.min}
     3241    0.001    0.000    0.001    0.000 {method 'group' of 're.Match' objects}
      5/4    0.000    0.000    0.001    0.000 threading.py:637(wait)
       24    0.000    0.000    0.001    0.000 _filepath.py:162(__init__)
     2115    0.001    0.000    0.001    0.000 __init__.py:985(__init__)
      746    0.000    0.000    0.001    0.000 text.py:785(iter_text)
      655    0.001    0.000    0.001    0.000 style.py:757(__add__)
       25    0.000    0.000    0.001    0.000 export_db.py:1430(dest_sig)
        1    0.000    0.000    0.001    0.001 export.py:2992(find_files_in_branch)
  212/106    0.000    0.000    0.001    0.000 model.py:527(process_match)
        3    0.000    0.000    0.001    0.000 dictdiff.py:21(dictdiff)
      113    0.000    0.000    0.001    0.000 console.py:170(update)
        5    0.000    0.000    0.001    0.000 progress.py:623(render)
     1677    0.000    0.000    0.001    0.000 _parser.py:261(get)
      5/4    0.000    0.000    0.001    0.000 threading.py:323(wait)
      794    0.001    0.000    0.001    0.000 metamodel.py:604(__getitem__)
     17/3    0.000    0.000    0.001    0.000 dictdiff.py:45(_dictdiff)
       81    0.000    0.000    0.001    0.000 __init__.py:947(_parse)
       25    0.000    0.000    0.001    0.000 export_db.py:1454(_dest_sig_setter)
       60    0.000    0.000    0.001    0.000 _base.py:186(__init__)
     1251    0.000    0.000    0.001    0.000 sidecars.py:354(<genexpr>)
       66    0.001    0.000    0.001    0.000 {built-in method builtins.__build_class__}
       23    0.000    0.000    0.001    0.000 lang.py:713(visit_rule_name)
     2783    0.001    0.000    0.001    0.000 {method 'encode' of 'str' objects}
        4    0.000    0.000    0.001    0.000 placeinfo.py:190(decode_archive)
        1    0.000    0.000    0.001    0.001 export_db.py:723(_insert_run_info)
      120    0.000    0.000    0.001    0.000 pathlib.py:719(__truediv__)
      173    0.000    0.000    0.001    0.000 parser.py:291(add_option)
      168    0.000    0.000    0.001    0.000 _base.py:235(__extract_root_name)
     1269    0.001    0.000    0.001    0.000 {built-in method builtins.next}
       47    0.000    0.000    0.001    0.000 _compiler.py:511(_compile_info)
      432    0.001    0.000    0.001    0.000 {built-in method posix.get_terminal_size}
        8    0.000    0.000    0.001    0.000 configparser.py:582(__init__)
        1    0.000    0.000    0.001    0.001 configoptions.py:141(write_to_str)
      123    0.000    0.000    0.001    0.000 pathlib.py:711(joinpath)
      494    0.001    0.000    0.001    0.000 <frozen posixpath>:138(splitroot)
       93    0.000    0.000    0.001    0.000 codegen.py:860(visitText)
       39    0.000    0.000    0.001    0.000 codegen.py:1162(visitDefTag)
       14    0.000    0.000    0.001    0.000 codegen.py:452(write_variable_declares)
        8    0.000    0.000    0.001    0.000 archiver.py:118(decode_archive)
       26    0.000    0.000    0.001    0.000 photoinfo.py:630(album_info)
       11    0.001    0.000    0.001    0.000 {built-in method posix.rmdir}
       84    0.000    0.000    0.001    0.000 _base.py:37(__init__)
     1422    0.001    0.000    0.001    0.000 _parser.py:168(__getitem__)
       21    0.000    0.000    0.001    0.000 <frozen os>:282(walk)
       32    0.000    0.000    0.001    0.000 archiver.py:146(decode_index)
      112    0.000    0.000    0.001    0.000 __init__.py:305(iter)
      216    0.000    0.000    0.001    0.000 inspect.py:175(get_annotations)
       65    0.000    0.000    0.001    0.000 dataclasses.py:1269(fields)
      695    0.001    0.000    0.001    0.000 __init__.py:1361(append_result)
        1    0.000    0.000    0.001    0.001 lang.py:391(_resolve_rule_refs)
      235    0.001    0.000    0.001    0.000 protocol.py:19(rich_cast)
       27    0.000    0.000    0.001    0.000 csv.py:163(writerow)
       13    0.000    0.000    0.001    0.000 export_db.py:1382(src_sig)
      576    0.000    0.000    0.001    0.000 personinfo.py:191(size_pixels)
        2    0.000    0.000    0.001    0.000 platform.py:13(get_macos_version)
      7/1    0.000    0.000    0.001    0.001 utils.py:562(is_photoslibrary_path)
        2    0.000    0.000    0.001    0.000 photosdb.py:665(get_db_connection)
     1913    0.001    0.000    0.001    0.000 {method 'add' of 'set' objects}
      200    0.000    0.000    0.001    0.000 unicode.py:69(normalize_fs_path)
      773    0.001    0.000    0.001    0.000 typing.py:378(inner)
        8    0.000    0.000    0.001    0.000 configparser.py:1285(__init__)
      196    0.000    0.000    0.001    0.000 __init__.py:179(sub)
       13    0.000    0.000    0.001    0.000 export_db.py:1406(_src_sig_setter)
       24    0.000    0.000    0.001    0.000 _filepath.py:240(validate_abspath)
       18    0.000    0.000    0.001    0.000 plistlib.py:276(end_data)
      983    0.000    0.000    0.001    0.000 console.py:759(file)
      331    0.000    0.000    0.001    0.000 enum.py:1531(__or__)
      174    0.000    0.000    0.001    0.000 core.py:2275(consume_value)
      215    0.000    0.000    0.001    0.000 text.py:426(blank_copy)
   276/66    0.000    0.000    0.001    0.000 lang.py:394(_resolve_rule)
     3197    0.001    0.000    0.001    0.000 console.py:787(_theme_stack)
      195    0.000    0.000    0.001    0.000 filters.py:27(xml_escape)
       29    0.000    0.000    0.001    0.000 pygen.py:78(writelines)
        1    0.000    0.000    0.001    0.001 encoder.py:34(dumps)
       60    0.000    0.000    0.001    0.000 _base.py:104(__init__)
     1239    0.001    0.000    0.001    0.000 {method 'index' of 'str' objects}
     3094    0.001    0.000    0.001    0.000 {method 'remove' of 'list' objects}
      480    0.000    0.000    0.001    0.000 metamodel.py:550(process)
      555    0.000    0.000    0.001    0.000 {method 'sub' of 're.Pattern' objects}
      114    0.001    0.000    0.001    0.000 {built-in method now}
       13    0.000    0.000    0.001    0.000 export_db.py:1478(photoinfo)
        2    0.000    0.000    0.001    0.000 encoder.py:182(dump_sections)
       82    0.000    0.000    0.001    0.000 __init__.py:957(EOF)
      120    0.000    0.000    0.001    0.000 __init__.py:729(__init__)
       52    0.000    0.000    0.001    0.000 photoinfo.py:1588(exif_info)
   248/87    0.000    0.000    0.001    0.000 _parser.py:178(getwidth)
        8    0.000    0.000    0.001    0.000 configparser.py:809(items)
       21    0.000    0.000    0.001    0.000 pathlib.py:164(select_from)
      336    0.000    0.000    0.001    0.000 <frozen posixpath>:169(basename)
       27    0.000    0.000    0.001    0.000 {method 'writerow' of '_csv.writer' objects}
       13    0.000    0.000    0.001    0.000 export_db.py:1506(_photoinfo_setter)
       43    0.000    0.000    0.001    0.000 codegen.py:777(create_filter_callable)
       56    0.000    0.000    0.001    0.000 __init__.py:403(__init__)
       19    0.000    0.000    0.001    0.000 padding.py:79(__rich_console__)
      237    0.000    0.000    0.001    0.000 console.py:160(copy)
      109    0.000    0.000    0.001    0.000 containers.py:111(justify)
      748    0.000    0.000    0.001    0.000 plistlib.py:492(_get_size)
     3180    0.001    0.000    0.001    0.000 text.py:739(<genexpr>)
       13    0.000    0.000    0.001    0.000 ast.py:117(__init__)
      189    0.000    0.000    0.001    0.000 __init__.py:185(__init__)
  817/328    0.000    0.000    0.001    0.000 __init__.py:1135(position_end)
        7    0.000    0.000    0.001    0.000 __init__.py:299(loads)
      173    0.000    0.000    0.001    0.000 parser.py:160(__init__)
      171    0.001    0.000    0.001    0.000 {method 'isoformat' of 'datetime.datetime' objects}
     2728    0.001    0.000    0.001    0.000 {method 'strip' of 'str' objects}
       95    0.000    0.000    0.001    0.000 configparser.py:833(<lambda>)
     1163    0.000    0.000    0.001    0.000 _ast_util.py:94(iter_fields)
       18    0.000    0.000    0.001    0.000 plistlib.py:130(_decode_base64)
       26    0.000    0.000    0.001    0.000 albuminfo.py:187(__init__)
       35    0.000    0.000    0.001    0.000 progress.py:1554(<genexpr>)
        7    0.000    0.000    0.001    0.000 decoder.py:332(decode)
       32    0.000    0.000    0.001    0.000 placeinfo.py:225(decode_archive)
       16    0.000    0.000    0.001    0.000 pathlib.py:464(as_uri)
       82    0.000    0.000    0.001    0.000 __init__.py:940(__init__)
      966    0.000    0.000    0.000    0.000 <frozen posixpath>:41(_get_sep)
       48    0.000    0.000    0.000    0.000 {method 'strftime' of 'datetime.date' objects}
      548    0.000    0.000    0.000    0.000 _ast_util.py:122(get_visitor)
       50    0.000    0.000    0.000    0.000 phototemplate.py:1713(format_date_field)
       54    0.000    0.000    0.000    0.000 _compiler.py:243(_optimize_charset)
       39    0.000    0.000    0.000    0.000 codegen.py:827(visitControlLine)
     2447    0.000    0.000    0.000    0.000 {method 'keys' of 'dict' objects}
      202    0.000    0.000    0.000    0.000 lexer.py:344(match_end)
     1860    0.000    0.000    0.000    0.000 personinfo.py:211(photo)
       66    0.000    0.000    0.000    0.000 photoinfo.py:586(face_info)
     1273    0.000    0.000    0.000    0.000 pathlib.py:274(__len__)
       95    0.000    0.000    0.000    0.000 configparser.py:365(before_get)
     4597    0.000    0.000    0.000    0.000 style.py:331(__bool__)
       10    0.000    0.000    0.000    0.000 export.py:3302(run_post_function)
       56    0.000    0.000    0.000    0.000 _base.py:537(set_result)
       80    0.000    0.000    0.000    0.000 copy.py:247(_reconstruct)
        1    0.000    0.000    0.000    0.000 progress.py:1583(add_task)
       56    0.000    0.000    0.000    0.000 _base.py:328(__init__)
     3702    0.000    0.000    0.000    0.000 style.py:694(render)
        1    0.000    0.000    0.000    0.000 parse.py:672(unquote)
       23    0.000    0.000    0.000    0.000 lang.py:631(visit_textx_rule)
        7    0.000    0.000    0.000    0.000 decoder.py:343(raw_decode)
        4    0.000    0.000    0.000    0.000 parse.py:662(_generate_unquoted_parts)
       26    0.000    0.000    0.000    0.000 albuminfo.py:63(__init__)
     3180    0.000    0.000    0.000    0.000 text.py:740(<genexpr>)
       18    0.000    0.000    0.000    0.000 {built-in method binascii.a2b_base64}
        1    0.000    0.000    0.000    0.000 progress.py:1530(refresh)
       39    0.000    0.000    0.000    0.000 pathlib.py:731(parent)
       16    0.000    0.000    0.000    0.000 export_db.py:1470(photoinfo)
        2    0.000    0.000    0.000    0.000 subprocess.py:1282(_close_pipe_fds)
        1    0.000    0.000    0.000    0.000 parse.py:631(_unquote_impl)
     1874    0.000    0.000    0.000    0.000 _parser.py:240(__next)
      550    0.000    0.000    0.000    0.000 <frozen os>:766(decode)
      106    0.000    0.000    0.000    0.000 lexer.py:324(match_tag_end)
       12    0.000    0.000    0.000    0.000 photoexporter.py:830(_should_convert_to_jpeg)
      4/2    0.000    0.000    0.000    0.000 pathlib.py:81(_make_selector)
       16    0.000    0.000    0.000    0.000 export_db.py:1487(_photoinfo)
        2    0.000    0.000    0.000    0.000 core.py:1255(get_params)
     2480    0.000    0.000    0.000    0.000 {method 'read' of '_io.BytesIO' objects}
     1991    0.000    0.000    0.000    0.000 {method 'rstrip' of 'str' objects}
        2    0.000    0.000    0.000    0.000 core.py:1291(get_help_option)
        2    0.000    0.000    0.000    0.000 pathlib.py:225(__init__)
      333    0.000    0.000    0.000    0.000 metamodel.py:647(__contains__)
        1    0.000    0.000    0.000    0.000 photosdb_utils.py:32(get_db_version)
     3852    0.000    0.000    0.000    0.000 style.py:457(link)
      4/2    0.000    0.000    0.000    0.000 pathlib.py:155(__init__)
       28    0.000    0.000    0.000    0.000 table.py:114(copy)
       95    0.000    0.000    0.000    0.000 configparser.py:378(_interpolate_some)
      170    0.000    0.000    0.000    0.000 <frozen posixpath>:117(splitext)
      920    0.000    0.000    0.000    0.000 pathlib.py:569(_tail)
      269    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:1390(_handle_fromlist)
        2    0.000    0.000    0.000    0.000 pathlib.py:193(__init__)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:40(dc_subject)
    24/12    0.000    0.000    0.000    0.000 dataclasses.py:255(wrapper)
      110    0.000    0.000    0.000    0.000 console.py:858(__enter__)
       88    0.000    0.000    0.000    0.000 {built-in method builtins.locals}
      590    0.000    0.000    0.000    0.000 _loop.py:18(loop_last)
        2    0.000    0.000    0.000    0.000 pathlib.py:106(_compile_pattern)
      267    0.000    0.000    0.000    0.000 text.py:660(rstrip_end)
       22    0.000    0.000    0.000    0.000 utils.py:508(hexdigest)
        1    0.000    0.000    0.000    0.000 table.py:519(_calculate_column_widths)
       29    0.000    0.000    0.000    0.000 <frozen genericpath>:39(isdir)
      225    0.000    0.000    0.000    0.000 plistlib.py:512(_read_refs)
       26    0.000    0.000    0.000    0.000 {built-in method builtins.eval}
       44    0.000    0.000    0.000    0.000 pathlib.py:591(suffix)
      119    0.000    0.000    0.000    0.000 lexer.py:462(match_comment)
        1    0.000    0.000    0.000    0.000 export_db.py:327(set_export_results)
       13    0.000    0.000    0.000    0.000 __init__.py:209(findall)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1269(israw)
        4    0.000    0.000    0.000    0.000 table.py:703(_measure_column)
       52    0.000    0.000    0.000    0.000 phototemplate.py:1215(get_template_value_multi)
      156    0.000    0.000    0.000    0.000 runtime.py:162(_locals)
       13    0.000    0.000    0.000    0.000 {built-in method posix.open}
       36    0.000    0.000    0.000    0.000 _filename.py:149(__init__)
      103    0.000    0.000    0.000    0.000 enum.py:1541(__and__)
       58    0.000    0.000    0.000    0.000 threading.py:277(__init__)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:148(render_dc_subject)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:26(dc_description)
      439    0.000    0.000    0.000    0.000 {method 'search' of 're.Pattern' objects}
     1046    0.000    0.000    0.000    0.000 {method 'decode' of 'bytes' objects}
       56    0.000    0.000    0.000    0.000 __init__.py:299(begin)
       24    0.000    0.000    0.000    0.000 _filename.py:203(validate_abspath)
       78    0.000    0.000    0.000    0.000 photoinfo.py:845(uti_original)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:51(dk_tagslist)
      112    0.000    0.000    0.000    0.000 __init__.py:407(failed)
1515/1406    0.000    0.000    0.000    0.000 {built-in method builtins.iter}
     1082    0.000    0.000    0.000    0.000 {method 'rfind' of 'str' objects}
      232    0.000    0.000    0.000    0.000 plistlib.py:502(_read_ints)
      624    0.000    0.000    0.000    0.000 _base.py:78(_is_windows)
       13    0.000    0.000    0.000    0.000 codegen.py:578(write_def_decl)
       16    0.000    0.000    0.000    0.000 parse.py:925(quote_from_bytes)
      213    0.000    0.000    0.000    0.000 text.py:172(__str__)
       14    0.000    0.000    0.000    0.000 codegen.py:643(write_def_finish)
       50    0.000    0.000    0.000    0.000 photoinfo.py:1552(labels)
       77    0.000    0.000    0.000    0.000 pathlib.py:583(name)
       48    0.000    0.000    0.000    0.000 error.py:131(__init__)
       12    0.000    0.000    0.000    0.000 <string>:2(__repr__)
       83    0.000    0.000    0.000    0.000 theme.py:91(<genexpr>)
       84    0.000    0.000    0.000    0.000 _common.py:18(validate_pathtype)
        1    0.000    0.000    0.000    0.000 metamodel.py:185(__init__)
       26    0.000    0.000    0.000    0.000 lang.py:911(visit_assignment)
        1    0.000    0.000    0.000    0.000 core.py:114(iter_params_for_processing)
     2260    0.000    0.000    0.000    0.000 {method 'append' of 'collections.deque' objects}
       38    0.000    0.000    0.000    0.000 _parser.py:98(closegroup)
      300    0.000    0.000    0.000    0.000 plistlib.py:195(handle_begin_element)
       13    0.000    0.000    0.000    0.000 export_db.py:1534(export_options)
        5    0.000    0.000    0.000    0.000 progress.py:744(render)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:116(render_dc_description)
     1106    0.000    0.000    0.000    0.000 {method 'lower' of 'str' objects}
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:196(render_dk_tagslist)
      111    0.000    0.000    0.000    0.000 console.py:816(_enter_buffer)
      729    0.000    0.000    0.000    0.000 csv.py:161(<genexpr>)
       12    0.000    0.000    0.000    0.000 exifwriter.py:87(exif_options_from_options)
      119    0.000    0.000    0.000    0.000 console.py:233(reset_height)
       13    0.000    0.000    0.000    0.000 export_db.py:1553(_export_options_setter)
       17    0.000    0.000    0.000    0.000 functools.py:518(decorating_function)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:47(adobe_createdate)
        1    0.000    0.000    0.000    0.000 report_writer.py:498(export_report_writer_factory)
       48    0.000    0.000    0.000    0.000 <frozen posixpath>:416(abspath)
       26    0.000    0.000    0.000    0.000 datetime_utils.py:26(get_local_tz)
      109    0.000    0.000    0.000    0.000 containers.py:105(extend)
       96    0.000    0.000    0.000    0.000 codegen.py:1110(check_declared)
      308    0.000    0.000    0.000    0.000 pygen.py:158(_is_unindentor)
      112    0.000    0.000    0.000    0.000 _base.py:463(exception)
       96    0.000    0.000    0.000    0.000 __init__.py:219(finditer)
       36    0.000    0.000    0.000    0.000 personinfo.py:278(face_rect)
       18    0.000    0.000    0.000    0.000 plistlib.py:279(end_date)
      545    0.000    0.000    0.000    0.000 containers.py:75(__iter__)
        1    0.000    0.000    0.000    0.000 report_writer.py:79(__init__)
      378    0.000    0.000    0.000    0.000 {method 'clear' of 'list' objects}
       11    0.000    0.000    0.000    0.000 shutil.py:643(_rmtree_safe_fd)
     1239    0.000    0.000    0.000    0.000 {built-in method _bisect.bisect_left}
       95    0.000    0.000    0.000    0.000 configparser.py:743(get)
      670    0.000    0.000    0.000    0.000 {method 'partition' of 'str' objects}
        1    0.000    0.000    0.000    0.000 export_db.py:63(pickle_and_zip)
     2206    0.000    0.000    0.000    0.000 __init__.py:1481(ws)
      174    0.000    0.000    0.000    0.000 core.py:123(sort_key)
        2    0.000    0.000    0.000    0.000 core.py:1283(get_help_option_names)
   104/23    0.000    0.000    0.000    0.000 lang.py:667(_update_attr_multiplicities)
        1    0.000    0.000    0.000    0.000 {built-in method objc._objc.lookUpClass}
      336    0.000    0.000    0.000    0.000 __init__.py:1225(visit__default__)
      122    0.000    0.000    0.000    0.000 <frozen posixpath>:60(isabs)
        4    0.000    0.000    0.000    0.000 console.py:632(__init__)
        6    0.000    0.000    0.000    0.000 {built-in method posix.listdir}
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:213(render_adobe_createdate)
       86    0.000    0.000    0.000    0.000 lang.py:843(visit_repeatable_expr)
     1920    0.000    0.000    0.000    0.000 _base.py:25(platform)
      228    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:645(parent)
     1579    0.000    0.000    0.000    0.000 dataclasses.py:1284(<genexpr>)
      324    0.000    0.000    0.000    0.000 dictdiff.py:11(_compare)
        8    0.000    0.000    0.000    0.000 {built-in method posix.getcwd}
      258    0.000    0.000    0.000    0.000 plistlib.py:225(get_data)
  205/192    0.000    0.000    0.000    0.000 {method 'format' of 'str' objects}
        8    0.000    0.000    0.000    0.000 {built-in method builtins.dir}
      178    0.000    0.000    0.000    0.000 contextlib.py:299(helper)
      508    0.000    0.000    0.000    0.000 __init__.py:71(__init__)
       57    0.000    0.000    0.000    0.000 codegen.py:1127(visitExpression)
      281    0.000    0.000    0.000    0.000 {method 'update' of 'dict' objects}
      108    0.000    0.000    0.000    0.000 console.py:922(encoding)
       48    0.000    0.000    0.000    0.000 path_utils.py:70(sanitize_dirname)
       13    0.000    0.000    0.000    0.000 tempfile.py:153(__next__)
       24    0.000    0.000    0.000    0.000 _base.py:144(__init__)
       80    0.000    0.000    0.000    0.000 metamodel.py:688(kwargs_callback)
      179    0.000    0.000    0.000    0.000 contextlib.py:141(__exit__)
      456    0.000    0.000    0.000    0.000 _parser.py:164(__len__)
      203    0.000    0.000    0.000    0.000 {method 'cursor' of 'sqlite3.Connection' objects}
      488    0.000    0.000    0.000    0.000 _parser.py:176(append)
       26    0.000    0.000    0.000    0.000 <frozen genericpath>:16(exists)
       52    0.000    0.000    0.000    0.000 photoinfo.py:1362(score)
       17    0.000    0.000    0.000    0.000 functools.py:35(update_wrapper)
       93    0.000    0.000    0.000    0.000 lexer.py:384(match_python_block)
        1    0.000    0.000    0.000    0.000 threading.py:1056(_bootstrap_inner)
       48    0.000    0.000    0.000    0.000 codegen.py:782(locate_encode)
       12    0.000    0.000    0.000    0.000 _filename.py:29(__init__)
      8/4    0.000    0.000    0.000    0.000 measure.py:78(get)
      193    0.000    0.000    0.000    0.000 {method 'finditer' of 're.Pattern' objects}
      868    0.000    0.000    0.000    0.000 {method 'pop' of 'list' objects}
       52    0.000    0.000    0.000    0.000 subprocess.py:1878(<genexpr>)
      657    0.000    0.000    0.000    0.000 {built-in method _struct.unpack}
       84    0.000    0.000    0.000    0.000 _common.py:112(normalize_platform)
      156    0.000    0.000    0.000    0.000 runtime.py:151(_copy)
       29    0.000    0.000    0.000    0.000 lang.py:1042(visit_str_match)
      159    0.000    0.000    0.000    0.000 core.py:2854(get_default)
      180    0.000    0.000    0.000    0.000 <frozen os>:812(fsencode)
       13    0.000    0.000    0.000    0.000 parsetree.py:268(__init__)
       10    0.000    0.000    0.000    0.000 photoinfo.py:182(_path_5)
      444    0.000    0.000    0.000    0.000 inspect.py:371(isfunction)
       87    0.000    0.000    0.000    0.000 {method 'fetchone' of 'sqlite3.Cursor' objects}
        1    0.000    0.000    0.000    0.000 rich_progress.py:38(rich_progress)
       18    0.000    0.000    0.000    0.000 plistlib.py:143(_date_from_string)
       48    0.000    0.000    0.000    0.000 path_utils.py:85(sanitize_pathpart)
      170    0.000    0.000    0.000    0.000 <frozen genericpath>:133(_splitext)
        2    0.000    0.000    0.000    0.000 iphoto.py:2551(is_iphoto_library)
        1    0.000    0.000    0.000    0.000 progress.py:1065(__init__)
     1412    0.000    0.000    0.000    0.000 text.py:166(__len__)
        4    0.000    0.000    0.000    0.000 contextlib.py:530(callback)
       18    0.000    0.000    0.000    0.000 adjustmentsinfo.py:49(_decode_adjustments_from_plist)
       66    0.000    0.000    0.000    0.000 photoinfo.py:570(persons)
       50    0.000    0.000    0.000    0.000 searchinfo.py:32(labels)
      531    0.000    0.000    0.000    0.000 _parser.py:256(match)
     1096    0.000    0.000    0.000    0.000 metamodel.py:658(_current_namespace)
        4    0.000    0.000    0.000    0.000 placeinfo.py:305(decode_archive)
     1466    0.000    0.000    0.000    0.000 photoinfo.py:1286(width)
      231    0.000    0.000    0.000    0.000 threading.py:299(__enter__)
      129    0.000    0.000    0.000    0.000 plistlib.py:243(end_key)
      806    0.000    0.000    0.000    0.000 __init__.py:1358(__init__)
      419    0.000    0.000    0.000    0.000 {method 'copy' of 'dict' objects}
       80    0.000    0.000    0.000    0.000 model.py:1003(_end_model_construction)
        1    0.000    0.000    0.000    0.000 color_themes.py:170(get_theme_dir)
       11    0.000    0.000    0.000    0.000 report_writer.py:349(prepare_export_results_for_writing)
       48    0.000    0.000    0.000    0.000 _filepath.py:150(reserved_keywords)
       56    0.000    0.000    0.000    0.000 retry.py:68(__call__)
       26    0.000    0.000    0.000    0.000 albuminfo.py:220(folder_names)
      608    0.000    0.000    0.000    0.000 {method 'count' of 'str' objects}
      570    0.000    0.000    0.000    0.000 {method 'endswith' of 'str' objects}
       36    0.000    0.000    0.000    0.000 _base.py:90(_get_default_max_path_len)
      333    0.000    0.000    0.000    0.000 console.py:778(_buffer_index)
        1    0.000    0.000    0.000    0.000 configoptions.py:194(_get_toml_dict)
        1    0.000    0.000    0.000    0.000 util.py:374(read_file)
       28    0.000    0.000    0.000    0.000 plistlib.py:415(_is_fmt_xml)
       12    0.000    0.000    0.000    0.000 datetime_formatter.py:29(mm)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:44(adobe_modifydate)
        1    0.000    0.000    0.000    0.000 lang.py:455(_determine_rule_types)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:37(dc_datecreated)
       13    0.000    0.000    0.000    0.000 tempfile.py:114(_sanitize_params)
       37    0.000    0.000    0.000    0.000 __init__.py:357(__init__)
       39    0.000    0.000    0.000    0.000 parsetree.py:490(undeclared_identifiers)
       12    0.000    0.000    0.000    0.000 runtime.py:884(_kwargs_for_callable)
       16    0.000    0.000    0.000    0.000 table.py:622(_get_cells)
      182    0.000    0.000    0.000    0.000 {method 'index' of 'list' objects}
      328    0.000    0.000    0.000    0.000 __init__.py:1075(position_end)
       22    0.000    0.000    0.000    0.000 {method 'update' of '_blake2.blake2b' objects}
      159    0.000    0.000    0.000    0.000 core.py:2915(value_from_envvar)
       12    0.000    0.000    0.000    0.000 wrappers.py:506(__get__)
       83    0.000    0.000    0.000    0.000 _compiler.py:398(_simple)
        1    0.000    0.000    0.000    0.000 photoquery.py:239(query_options_from_kwargs)
      667    0.000    0.000    0.000    0.000 {method 'values' of 'collections.OrderedDict' objects}
        2    0.000    0.000    0.000    0.000 subprocess.py:1686(_get_handles)
        4    0.000    0.000    0.000    0.000 padding.py:125(__rich_measure__)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:21(gps_info)
       94    0.000    0.000    0.000    0.000 pyparser.py:135(visit_Name)
      360    0.000    0.000    0.000    0.000 _base.py:69(_is_universal)
      468    0.000    0.000    0.000    0.000 plistlib.py:101(__hash__)
        1    0.000    0.000    0.000    0.000 lang.py:547(_resolve_cls_refs)
       49    0.000    0.000    0.000    0.000 cells.py:45(get_character_cell_size)
      372    0.000    0.000    0.000    0.000 _base.py:66(_is_posix)
       20    0.000    0.000    0.000    0.000 configparser.py:1208(__init__)
       13    0.000    0.000    0.000    0.000 parsetree.py:319(_parse_attributes)
        4    0.000    0.000    0.000    0.000 configparser.py:1096(_join_multiline_values)
       50    0.000    0.000    0.000    0.000 searchinfo.py:227(_get_text_for_category)
      372    0.000    0.000    0.000    0.000 _base.py:84(_is_macos)
       80    0.000    0.000    0.000    0.000 {method '__reduce_ex__' of 'object' objects}
       13    0.000    0.000    0.000    0.000 export_db.py:1289(digest)
       29    0.000    0.000    0.000    0.000 __init__.py:876(__init__)
       86    0.000    0.000    0.000    0.000 _parser.py:372(_escape)
        1    0.000    0.000    0.000    0.000 {built-in method _pickle.dumps}
      178    0.000    0.000    0.000    0.000 contextlib.py:132(__enter__)
       32    0.000    0.000    0.000    0.000 __init__.py:444(__init__)
       93    0.000    0.000    0.000    0.000 parsetree.py:129(__init__)
       56    0.000    0.000    0.000    0.000 _base.py:428(result)
      896    0.000    0.000    0.000    0.000 {method 'seek' of '_io.BytesIO' objects}
       38    0.000    0.000    0.000    0.000 export_db.py:743(_normalize_filepath)
        1    0.000    0.000    0.000    0.000 fileutil.py:144(unlink)
        2    0.000    0.000    0.000    0.000 utils.py:219(echo)
       10    0.000    0.000    0.000    0.000 placeinfo.py:715(asdict)
       58    0.000    0.000    0.000    0.000 threading.py:424(notify_all)
       38    0.000    0.000    0.000    0.000 photoinfo.py:2184(default)
      224    0.000    0.000    0.000    0.000 __init__.py:253(statistics)
     1158    0.000    0.000    0.000    0.000 photoinfo.py:1281(height)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:28(photoshop_sidecar_for_extension)
      178    0.000    0.000    0.000    0.000 contextlib.py:104(__init__)
       12    0.000    0.000    0.000    0.000 compat.py:21(inspect_getargspec)
      231    0.000    0.000    0.000    0.000 threading.py:302(__exit__)
      457    0.000    0.000    0.000    0.000 {method 'values' of 'dict' objects}
        5    0.000    0.000    0.000    0.000 codegen.py:1264(mangle_mako_loop)
      716    0.000    0.000    0.000    0.000 photoinfo.py:699(hasadjustments)
       13    0.000    0.000    0.000    0.000 random.py:454(choices)
       13    0.000    0.000    0.000    0.000 export_db.py:1306(_digest)
        2    0.000    0.000    0.000    0.000 verbose.py:180(_verbose_print_function)
        1    0.000    0.000    0.000    0.000 common.py:90(get_config_dir)
      109    0.000    0.000    0.000    0.000 text.py:190(__contains__)
       92    0.000    0.000    0.000    0.000 __init__.py:470(_asdict)
        7    0.000    0.000    0.000    0.000 table.py:251(grid)
      693    0.000    0.000    0.000    0.000 {method 'difference_update' of 'set' objects}
       75    0.000    0.000    0.000    0.000 plistlib.py:273(end_string)
        7    0.000    0.000    0.000    0.000 style.py:378(normalize)
      326    0.000    0.000    0.000    0.000 console.py:773(_buffer)
        1    0.000    0.000    0.000    0.000 pathlib.py:1336(unlink)
      346    0.000    0.000    0.000    0.000 enum.py:1254(__hash__)
        1    0.000    0.000    0.000    0.000 live.py:51(__init__)
       32    0.000    0.000    0.000    0.000 metamodel.py:442(_init_class)
      157    0.000    0.000    0.000    0.000 dataclasses.py:1287(_is_dataclass_instance)
       24    0.000    0.000    0.000    0.000 path_utils.py:39(sanitize_filename)
       63    0.000    0.000    0.000    0.000 <frozen posixpath>:408(normpath)
    88/32    0.000    0.000    0.000    0.000 lang.py:550(_resolve_cls)
        1    0.000    0.000    0.000    0.000 {built-in method posix.unlink}
    47/37    0.000    0.000    0.000    0.000 _compiler.py:436(_get_literal_prefix)
       80    0.000    0.000    0.000    0.000 model.py:1096(resolve_one_step)
        4    0.000    0.000    0.000    0.000 placeinfo.py:636(_process_place_info)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:227(render_adobe_modifydate)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:165(render_dc_datecreated)
      996    0.000    0.000    0.000    0.000 {built-in method builtins.hash}
        2    0.000    0.000    0.000    0.000 pathlib.py:1197(home)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:49(iptc_personinimage)
       26    0.000    0.000    0.000    0.000 photoinfo.py:787(date_added)
      283    0.000    0.000    0.000    0.000 _parser.py:293(tell)
      182    0.000    0.000    0.000    0.000 parser.py:109(split_opt)
      267    0.000    0.000    0.000    0.000 {method 'groups' of 're.Match' objects}
      168    0.000    0.000    0.000    0.000 runtime.py:209(_push_frame)
      120    0.000    0.000    0.000    0.000 runtime.py:135(get)
       54    0.000    0.000    0.000    0.000 markup.py:143(pop_style)
       66    0.000    0.000    0.000    0.000 photosdb.py:3139(get_photo)
      513    0.000    0.000    0.000    0.000 {method 'pop' of 'dict' objects}
      573    0.000    0.000    0.000    0.000 {method 'setdefault' of 'dict' objects}
      631    0.000    0.000    0.000    0.000 {built-in method builtins.callable}
     10/5    0.000    0.000    0.000    0.000 codegen.py:1302(visitControlLine)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:255(render_gps_info)
       11    0.000    0.000    0.000    0.000 progress.py:1500(advance)
       34    0.000    0.000    0.000    0.000 photoinfo.py:296(path_edited)
      159    0.000    0.000    0.000    0.000 core.py:2239(get_default)
      168    0.000    0.000    0.000    0.000 runtime.py:215(_pop_frame)
       71    0.000    0.000    0.000    0.000 parsetree.py:206(undeclared_identifiers)
       13    0.000    0.000    0.000    0.000 util.py:156(getvalue)
     24/5    0.000    0.000    0.000    0.000 codegen.py:1295(_loop_reference_detected)
        3    0.000    0.000    0.000    0.000 pathlib.py:1398(expanduser)
        3    0.000    0.000    0.000    0.000 {method 'close' of '_io.TextIOWrapper' objects}
    82/64    0.000    0.000    0.000    0.000 lang.py:458(_determine_rule_type)
      305    0.000    0.000    0.000    0.000 {method 'rsplit' of 'str' objects}
       96    0.000    0.000    0.000    0.000 personinfo.py:143(__init__)
       39    0.000    0.000    0.000    0.000 parsetree.py:484(get_argument_expressions)
       12    0.000    0.000    0.000    0.000 export.py:2864(get_filenames_from_template)
       21    0.000    0.000    0.000    0.000 {built-in method pyexpat.ParserCreate}
      387    0.000    0.000    0.000    0.000 {method '__exit__' of '_thread.RLock' objects}
      159    0.000    0.000    0.000    0.000 core.py:2896(resolve_envvar_value)
      150    0.000    0.000    0.000    0.000 plistlib.py:209(add_object)
      206    0.000    0.000    0.000    0.000 configparser.py:852(optionxform)
      712    0.000    0.000    0.000    0.000 pathlib.py:560(root)
        1    0.000    0.000    0.000    0.000 codegen.py:155(write_metadata_struct)
      308    0.000    0.000    0.000    0.000 pygen.py:198(_indent_line)
        1    0.000    0.000    0.000    0.000 parser.py:326(parse_args)
        5    0.000    0.000    0.000    0.000 progress.py:781(render)
        5    0.000    0.000    0.000    0.000 table.py:418(add_row)
        7    0.000    0.000    0.000    0.000 table.py:186(__init__)
        7    0.000    0.000    0.000    0.000 style.py:496(parse)
       27    0.000    0.000    0.000    0.000 csv.py:155(_dict_to_list)
        1    0.000    0.000    0.000    0.000 export_db.py:1026(_perform_db_maintenance)
      140    0.000    0.000    0.000    0.000 adjustmentsinfo.py:127(adj_orientation)
      222    0.000    0.000    0.000    0.000 console.py:783(_buffer_index)
       26    0.000    0.000    0.000    0.000 _emoji_replace.py:23(do_replace)
        1    0.000    0.000    0.000    0.000 report_writer.py:128(close)
      128    0.000    0.000    0.000    0.000 {method 'write' of '_io.TextIOWrapper' objects}
        1    0.000    0.000    0.000    0.000 gzip.py:602(compress)
        1    0.000    0.000    0.000    0.000 export_db.py:311(set_config)
        5    0.000    0.000    0.000    0.000 pyparser.py:176(visit_Tuple)
      110    0.000    0.000    0.000    0.000 <frozen posixpath>:131(splitdrive)
       36    0.000    0.000    0.000    0.000 photoinfo.py:1924(_get_album_uuids)
       49    0.000    0.000    0.000    0.000 cells.py:58(_get_codepoint_cell_size)
       53    0.000    0.000    0.000    0.000 _parser.py:312(_class_escape)
       17    0.000    0.000    0.000    0.000 <frozen abc>:117(__instancecheck__)
       38    0.000    0.000    0.000    0.000 photoinfo.py:606(albums)
       54    0.000    0.000    0.000    0.000 _compiler.py:216(_compile_charset)
       56    0.000    0.000    0.000    0.000 <frozen _collections_abc>:868(__iter__)
       26    0.000    0.000    0.000    0.000 pathlib.py:618(stem)
        1    0.000    0.000    0.000    0.000 configoptions.py:32(__init__)
       13    0.000    0.000    0.000    0.000 tempfile.py:85(_infer_return_type)
        2    0.000    0.000    0.000    0.000 <frozen os>:625(get_exec_path)
    19/14    0.000    0.000    0.000    0.000 encoder.py:174(dump_value)
       56    0.000    0.000    0.000    0.000 lang.py:807(visit_sequence)
      131    0.000    0.000    0.000    0.000 inspect.py:295(isclass)
      204    0.000    0.000    0.000    0.000 {method 'rpartition' of 'str' objects}
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:32(dc_title)
        4    0.000    0.000    0.000    0.000 contextlib.py:567(__exit__)
       80    0.000    0.000    0.000    0.000 copyreg.py:98(__newobj__)
        1    0.000    0.000    0.000    0.000 configoptions.py:63(validate)
       12    0.000    0.000    0.000    0.000 wrappers.py:495(__init__)
       12    0.000    0.000    0.000    0.000 runtime.py:844(_populate_self_namespace)
       18    0.000    0.000    0.000    0.000 {built-in method zlib.decompress}
        1    0.000    0.000    0.000    0.000 configoptions.py:48(set_attributes)
      338    0.000    0.000    0.000    0.000 {method 'union' of 'set' objects}
        1    0.000    0.000    0.000    0.000 __init__.py:117(xdg_config_home)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:179(render_iptc_personinimage)
      493    0.000    0.000    0.000    0.000 {built-in method builtins.id}
       39    0.000    0.000    0.000    0.000 codegen.py:1130(visitControlLine)
      216    0.000    0.000    0.000    0.000 {method 'values' of 'mappingproxy' objects}
       80    0.000    0.000    0.000    0.000 model.py:469(_replace_user_attr_methods)
       60    0.000    0.000    0.000    0.000 _base.py:228(_validate_max_len)
       22    0.000    0.000    0.000    0.000 photoinfo.py:2211(default)
       38    0.000    0.000    0.000    0.000 fileutil.py:265(_sig)
       11    0.000    0.000    0.000    0.000 {built-in method _warnings.warn}
       26    0.000    0.000    0.000    0.000 photoinfo.py:137(date_modified)
        2    0.000    0.000    0.000    0.000 subprocess.py:1135(_get_devnull)
       66    0.000    0.000    0.000    0.000 threading.py:124(RLock)
       17    0.000    0.000    0.000    0.000 {built-in method _abc._abc_instancecheck}
       95    0.000    0.000    0.000    0.000 configparser.py:1120(_unify_values)
       32    0.000    0.000    0.000    0.000 placeinfo.py:200(__init__)
      248    0.000    0.000    0.000    0.000 {method 'difference' of 'set' objects}
       10    0.000    0.000    0.000    0.000 text.py:1177(right_crop)
        1    0.000    0.000    0.000    0.000 progress.py:1167(__enter__)
       84    0.000    0.000    0.000    0.000 _common.py:52(_is_not_null_string)
      224    0.000    0.000    0.000    0.000 {method '__enter__' of '_thread.RLock' objects}
       16    0.000    0.000    0.000    0.000 configparser.py:1178(set)
       52    0.000    0.000    0.000    0.000 archiver.py:206(class_for_uid)
      106    0.000    0.000    0.000    0.000 text.py:1046(copy_styles)
       18    0.000    0.000    0.000    0.000 plistlib.py:263(end_integer)
       26    0.000    0.000    0.000    0.000 photosdb.py:2748(_album_folder_hierarchy_list)
        1    0.000    0.000    0.000    0.000 {built-in method zlib.compress}
        1    0.000    0.000    0.000    0.000 verbose.py:77(set_verbose_level)
        1    0.000    0.000    0.000    0.000 parser.py:355(_process_args_for_options)
       56    0.000    0.000    0.000    0.000 <frozen os>:703(__iter__)
       58    0.000    0.000    0.000    0.000 threading.py:394(notify)
        3    0.000    0.000    0.000    0.000 text.py:702(__rich_measure__)
       50    0.000    0.000    0.000    0.000 photoinfo.py:1440(search_info)
       39    0.000    0.000    0.000    0.000 ast.py:135(get_argument_expressions)
       24    0.000    0.000    0.000    0.000 <frozen ntpath>:156(splitdrive)
      218    0.000    0.000    0.000    0.000 _pick.py:4(pick_bool)
       12    0.000    0.000    0.000    0.000 datetime_formatter.py:44(dd)
       80    0.000    0.000    0.000    0.000 model_params.py:24(__init__)
       18    0.000    0.000    0.000    0.000 datetime_utils.py:105(datetime_naive_to_utc)
        1    0.000    0.000    0.000    0.000 lang.py:354(visit_textx_model)
      305    0.000    0.000    0.000    0.000 model.py:169(<lambda>)
      189    0.000    0.000    0.000    0.000 parsetree.py:21(__init__)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:42(xmp_rating)
       80    0.000    0.000    0.000    0.000 phototemplate.py:400(__new__)
       12    0.000    0.000    0.000    0.000 runtime.py:29(__init__)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:100(render_photoshop_sidecar_for_extension)
       37    0.000    0.000    0.000    0.000 _parser.py:449(_uniq)
        2    0.000    0.000    0.000    0.000 gettext.py:616(gettext)
      161    0.000    0.000    0.000    0.000 plistlib.py:78(__init__)
       12    0.000    0.000    0.000    0.000 photoexporter.py:117(__str__)
        1    0.000    0.000    0.000    0.000 {built-in method objc._objc.loadBundleFunctions}
       19    0.000    0.000    0.000    0.000 <frozen posixpath>:100(split)
        2    0.000    0.000    0.000    0.000 gettext.py:578(dgettext)
      206    0.000    0.000    0.000    0.000 {built-in method time.monotonic}
       38    0.000    0.000    0.000    0.000 _parser.py:86(opengroup)
        1    0.000    0.000    0.000    0.000 console.py:339(__exit__)
       60    0.000    0.000    0.000    0.000 style.py:422(__eq__)
        4    0.000    0.000    0.000    0.000 configparser.py:883(write)
        1    0.000    0.000    0.000    0.000 csv.py:151(writeheader)
        1    0.000    0.000    0.000    0.000 console.py:871(end_capture)
        4    0.000    0.000    0.000    0.000 console.py:792(_detect_color_system)
    36/16    0.000    0.000    0.000    0.000 {method 'acquire' of '_thread.lock' objects}
       52    0.000    0.000    0.000    0.000 photoinfo.py:666(keywords)
      305    0.000    0.000    0.000    0.000 {method 'items' of 'collections.OrderedDict' objects}
       12    0.000    0.000    0.000    0.000 photoexporter.py:120(__repr__)
        5    0.000    0.000    0.000    0.000 pyparser.py:124(visit_For)
        9    0.000    0.000    0.000    0.000 _compiler.py:386(_mk_bitmap)
       80    0.000    0.000    0.000    0.000 model.py:480(_restore_user_attr_methods)
        2    0.000    0.000    0.000    0.000 gettext.py:519(translation)
        1    0.000    0.000    0.000    0.000 parse.py:374(urlparse)
       47    0.000    0.000    0.000    0.000 _parser.py:231(__init__)
        2    0.000    0.000    0.000    0.000 core.py:2512(__init__)
      174    0.000    0.000    0.000    0.000 _parser.py:83(groups)
       60    0.000    0.000    0.000    0.000 _base.py:72(_is_linux)
        1    0.000    0.000    0.000    0.000 darkmode.py:15(is_dark_mode)
       24    0.000    0.000    0.000    0.000 <frozen ntpath>:87(isabs)
        2    0.000    0.000    0.000    0.000 utils.py:79(_check_file_exists)
        1    0.000    0.000    0.000    0.000 progress.py:1156(start)
       12    0.000    0.000    0.000    0.000 photoexporter.py:138(__init__)
      480    0.000    0.000    0.000    0.000 metamodel.py:566(<lambda>)
       85    0.000    0.000    0.000    0.000 photoinfo.py:117(original_filename)
        1    0.000    0.000    0.000    0.000 export.py:3028(collect_files_to_keep)
      133    0.000    0.000    0.000    0.000 parsetree.py:27(exception_kwargs)
      107    0.000    0.000    0.000    0.000 {method 'startswith' of 'bytes' objects}
        1    0.000    0.000    0.000    0.000 darkmode.py:9(theme)
      419    0.000    0.000    0.000    0.000 {built-in method builtins.ord}
        1    0.000    0.000    0.000    0.000 live.py:104(start)
       12    0.000    0.000    0.000    0.000 sidecars.py:58(__init__)
      168    0.000    0.000    0.000    0.000 plistlib.py:96(__eq__)
      305    0.000    0.000    0.000    0.000 metamodel.py:547(has_obj_processor)
       15    0.000    0.000    0.000    0.000 padding.py:60(unpack)
        4    0.000    0.000    0.000    0.000 theme.py:20(__init__)
      150    0.000    0.000    0.000    0.000 {method 'find' of 'bytearray' objects}
        2    0.000    0.000    0.000    0.000 gettext.py:479(find)
       17    0.000    0.000    0.000    0.000 parser.py:499(_process_opts)
        1    0.000    0.000    0.000    0.000 model.py:277(get_model_parser)
       64    0.000    0.000    0.000    0.000 enum.py:197(__get__)
        1    0.000    0.000    0.000    0.000 param_types.py:56(convert)
      165    0.000    0.000    0.000    0.000 metamodel.py:631(__iter__)
       24    0.000    0.000    0.000    0.000 <frozen ntpath>:179(splitroot)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:883(open)
       95    0.000    0.000    0.000    0.000 __init__.py:1008(__getitem__)
      159    0.000    0.000    0.000    0.000 __init__.py:918(__hash__)
       12    0.000    0.000    0.000    0.000 photoexporter.py:608(_stage_missing_photos_for_export)
        9    0.000    0.000    0.000    0.000 __init__.py:820(__init__)
        4    0.000    0.000    0.000    0.000 subprocess.py:1259(wait)
       14    0.000    0.000    0.000    0.000 codegen.py:1091(defs)
      484    0.000    0.000    0.000    0.000 {built-in method fromhex}
       80    0.000    0.000    0.000    0.000 model.py:992(_start_model_construction)
      109    0.000    0.000    0.000    0.000 containers.py:93(__len__)
        4    0.000    0.000    0.000    0.000 configparser.py:903(_write_section)
       17    0.000    0.000    0.000    0.000 _compiler.py:407(_generate_overlap_table)
       61    0.000    0.000    0.000    0.000 {method 'findall' of 're.Pattern' objects}
       80    0.000    0.000    0.000    0.000 __init__.py:353(get_included_models)
        5    0.000    0.000    0.000    0.000 progress.py:1028(time_remaining)
       13    0.000    0.000    0.000    0.000 weakref.py:568(__init__)
      643    0.000    0.000    0.000    0.000 theme.py:63(style_names)
        2    0.000    0.000    0.000    0.000 _compat.py:584(func)
       39    0.000    0.000    0.000    0.000 codegen.py:1148(_check_name_exists)
      106    0.000    0.000    0.000    0.000 {built-in method builtins.repr}
        1    0.000    0.000    0.000    0.000 types.py:853(convert)
        5    0.000    0.000    0.000    0.000 progress.py:661(render)
      432    0.000    0.000    0.000    0.000 inspect.py:3079(return_annotation)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1572(comments)
       42    0.000    0.000    0.000    0.000 rich_utils.py:12(add_tag)
        4    0.000    0.000    0.000    0.000 placeinfo.py:239(__init__)
       18    0.000    0.000    0.000    0.000 {method 'replace' of 'datetime.datetime' objects}
      323    0.000    0.000    0.000    0.000 pygen.py:55(_update_lineno)
       53    0.000    0.000    0.000    0.000 pathlib.py:52(_ignore_error)
      117    0.000    0.000    0.000    0.000 {method '__exit__' of '_thread.lock' objects}
       20    0.000    0.000    0.000    0.000 placeinfo.py:615(address)
      143    0.000    0.000    0.000    0.000 {method 'seek' of '_io.BufferedReader' objects}
       63    0.000    0.000    0.000    0.000 {built-in method posix._path_normpath}
       47    0.000    0.000    0.000    0.000 {built-in method _sre.compile}
       16    0.000    0.000    0.000    0.000 configparser.py:869(set)
       56    0.000    0.000    0.000    0.000 __init__.py:426(__init__)
      387    0.000    0.000    0.000    0.000 model.py:148(<lambda>)
       47    0.000    0.000    0.000    0.000 _parser.py:953(fix_flags)
       26    0.000    0.000    0.000    0.000 photosdb.py:2792(_album_folder_hierarchy_list_5)
        4    0.000    0.000    0.000    0.000 contextlib.py:475(_create_cb_wrapper)
        1    0.000    0.000    0.000    0.000 metamodel.py:314(_namespace_for_file_name)
        4    0.000    0.000    0.000    0.000 theme.py:18(__init__)
       16    0.000    0.000    0.000    0.000 measure.py:24(normalize)
      241    0.000    0.000    0.000    0.000 _parser.py:113(__init__)
       10    0.000    0.000    0.000    0.000 uti.py:603(get_uti_for_extension)
        8    0.000    0.000    0.000    0.000 encoder.py:86(_dump_str)
       17    0.000    0.000    0.000    0.000 parser.py:391(_match_long_opt)
      351    0.000    0.000    0.000    0.000 core.py:95(augment_usage_errors)
       19    0.000    0.000    0.000    0.000 {built-in method posix.close}
       94    0.000    0.000    0.000    0.000 _compiler.py:570(isstring)
      112    0.000    0.000    0.000    0.000 rich_utils.py:6(add_rich_markup_tag)
       13    0.000    0.000    0.000    0.000 tempfile.py:313(gettempdir)
      422    0.000    0.000    0.000    0.000 parsetree.py:36(get_children)
      171    0.000    0.000    0.000    0.000 pygen.py:58(start_source)
       27    0.000    0.000    0.000    0.000 lang.py:796(visit_rule_ref)
       12    0.000    0.000    0.000    0.000 wrappers.py:77(__init__)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:132(render_dc_title)
        1    0.000    0.000    0.000    0.000 typing.py:1529(__getitem__)
      336    0.000    0.000    0.000    0.000 _base.py:29(reserved_keywords)
       38    0.000    0.000    0.000    0.000 photoinfo.py:804(location)
        2    0.000    0.000    0.000    0.000 fnmatch.py:74(translate)
        5    0.000    0.000    0.000    0.000 progress.py:1010(speed)
      117    0.000    0.000    0.000    0.000 {built-in method builtins.any}
        1    0.000    0.000    0.000    0.000 parse.py:452(urlsplit)
      103    0.000    0.000    0.000    0.000 {method 'start' of 're.Match' objects}
        1    0.000    0.000    0.000    0.000 live.py:19(__init__)
        4    0.000    0.000    0.000    0.000 subprocess.py:2014(_wait)
       21    0.000    0.000    0.000    0.000 plistlib.py:232(begin_dict)
        4    0.000    0.000    0.000    0.000 contextlib.py:548(_push_exit_callback)
        4    0.000    0.000    0.000    0.000 configparser.py:1184(add_section)
       29    0.000    0.000    0.000    0.000 parsetree.py:105(is_ternary)
        2    0.000    0.000    0.000    0.000 encoder.py:150(dump_list)
       26    0.000    0.000    0.000    0.000 metamodel.py:531(_new_cls_attr)
        2    0.000    0.000    0.000    0.000 subprocess.py:1233(poll)
        2    0.000    0.000    0.000    0.000 typing.py:1853(__instancecheck__)
        1    0.000    0.000    0.000    0.000 progress.py:1101(get_default_columns)
        6    0.000    0.000    0.000    0.000 <frozen posixpath>:179(dirname)
        9    0.000    0.000    0.000    0.000 <frozen codecs>:319(decode)
       14    0.000    0.000    0.000    0.000 codegen.py:1308(visitExpression)
       86    0.000    0.000    0.000    0.000 lang.py:819(visit_expression)
      171    0.000    0.000    0.000    0.000 {built-in method _stat.S_ISLNK}
        6    0.000    0.000    0.000    0.000 core.py:458(__exit__)
      200    0.000    0.000    0.000    0.000 unicode.py:53(get_unicode_fs_form)
       28    0.000    0.000    0.000    0.000 protocol.py:10(is_renderable)
        2    0.000    0.000    0.000    0.000 threading.py:616(set)
      135    0.000    0.000    0.000    0.000 {method 'is_dir' of 'posix.DirEntry' objects}
        2    0.000    0.000    0.000    0.000 core.py:2088(__init__)
        2    0.000    0.000    0.000    0.000 copyreg.py:107(_slotnames)
        1    0.000    0.000    0.000    0.000 platform.py:634(_follow_symlinks)
       80    0.000    0.000    0.000    0.000 model.py:919(<lambda>)
       11    0.000    0.000    0.000    0.000 exportoptions.py:274(all_files)
        4    0.000    0.000    0.000    0.000 {built-in method posix.pipe}
        1    0.000    0.000    0.000    0.000 live.py:28(run)
        7    0.000    0.000    0.000    0.000 color.py:431(parse)
       10    0.000    0.000    0.000    0.000 photoinfo.py:317(_path_edited_5)
        3    0.000    0.000    0.000    0.000 {built-in method posix.uname}
        1    0.000    0.000    0.000    0.000 {built-in method _thread.start_new_thread}
    72/36    0.000    0.000    0.000    0.000 lang.py:491(_has_nonmatch_ref)
      113    0.000    0.000    0.000    0.000 {method 'items' of 'dict' objects}
       26    0.000    0.000    0.000    0.000 photoinfo.py:421(path_edited_live_photo)
       96    0.000    0.000    0.000    0.000 text.py:421(spans)
       13    0.000    0.000    0.000    0.000 tempfile.py:142(rng)
      286    0.000    0.000    0.000    0.000 parsetree.py:480(funcname)
      263    0.000    0.000    0.000    0.000 typing.py:2119(cast)
       80    0.000    0.000    0.000    0.000 model_params.py:89(check_params)
       28    0.000    0.000    0.000    0.000 progress.py:505(get_table_column)
      175    0.000    0.000    0.000    0.000 {method 'update' of 'set' objects}
        2    0.000    0.000    0.000    0.000 style.py:335(_make_ansi_codes)
       10    0.000    0.000    0.000    0.000 searchinfo.py:12(__init__)
        4    0.000    0.000    0.000    0.000 theme.py:126(update)
      159    0.000    0.000    0.000    0.000 core.py:2198(__repr__)
      318    0.000    0.000    0.000    0.000 core.py:658(lookup_default)
      174    0.000    0.000    0.000    0.000 core.py:806(set_parameter_source)
       12    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:241(render_xmp_rating)
       12    0.000    0.000    0.000    0.000 exifwriter.py:113(__init__)
      128    0.000    0.000    0.000    0.000 markup.py:28(__str__)
        4    0.000    0.000    0.000    0.000 <frozen abc>:121(__subclasscheck__)
       22    0.000    0.000    0.000    0.000 {built-in method builtins.all}
        1    0.000    0.000    0.000    0.000 enum.py:1401(_missing_)
        1    0.000    0.000    0.000    0.000 _compat.py:351(get_text_stderr)
        6    0.000    0.000    0.000    0.000 text.py:707(<genexpr>)
       69    0.000    0.000    0.000    0.000 pyparser.py:50(__init__)
      168    0.000    0.000    0.000    0.000 runtime.py:146(writer)
        4    0.000    0.000    0.000    0.000 segment.py:384(set_shape)
       17    0.000    0.000    0.000    0.000 functools.py:479(lru_cache)
       13    0.000    0.000    0.000    0.000 pyparser.py:196(visit_FunctionDef)
        1    0.000    0.000    0.000    0.000 model.py:289(__init__)
       60    0.000    0.000    0.000    0.000 _common.py:35(to_str)
       11    0.000    0.000    0.000    0.000 {built-in method posix.fstat}
        1    0.000    0.000    0.000    0.000 threading.py:1574(_shutdown)
      121    0.000    0.000    0.000    0.000 {method '__exit__' of 'posix.ScandirIterator' objects}
        5    0.000    0.000    0.000    0.000 contextlib.py:481(__init__)
        4    0.000    0.000    0.000    0.000 {built-in method _abc._abc_subclasscheck}
      106    0.000    0.000    0.000    0.000 {method 'find' of 'str' objects}
       30    0.000    0.000    0.000    0.000 photoinfo.py:870(uti_edited)
        6    0.000    0.000    0.000    0.000 __init__.py:1517(debug)
      204    0.000    0.000    0.000    0.000 _base.py:33(max_len)
       24    0.000    0.000    0.000    0.000 _filename.py:217(__validate_universal_filename)
        8    0.000    0.000    0.000    0.000 padding.py:33(__init__)
       24    0.000    0.000    0.000    0.000 _filepath.py:275(__validate_unix_filepath)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1580(likes)
       52    0.000    0.000    0.000    0.000 photoinfo.py:487(path_raw)
        1    0.000    0.000    0.000    0.000 <frozen posixpath>:505(relpath)
       86    0.000    0.000    0.000    0.000 _parser.py:172(__setitem__)
       13    0.000    0.000    0.000    0.000 util.py:145(__init__)
       12    0.000    0.000    0.000    0.000 runtime.py:46(_set_with_template)
        1    0.000    0.000    0.000    0.000 __init__.py:71(search_function)
       51    0.000    0.000    0.000    0.000 live.py:249(process_renderables)
      110    0.000    0.000    0.000    0.000 photoinfo.py:132(date)
        1    0.000    0.000    0.000    0.000 {built-in method posix.access}
        1    0.000    0.000    0.000    0.000 _compat.py:296(_force_correct_text_writer)
       42    0.000    0.000    0.000    0.000 codegen.py:848(<genexpr>)
      186    0.000    0.000    0.000    0.000 {method 'isalnum' of 'str' objects}
      218    0.000    0.000    0.000    0.000 {built-in method builtins.abs}
        1    0.000    0.000    0.000    0.000 platform.py:587(_platform)
       13    0.000    0.000    0.000    0.000 tempfile.py:938(__repr__)
        2    0.000    0.000    0.000    0.000 <frozen posixpath>:256(expanduser)
       10    0.000    0.000    0.000    0.000 photoinfo.py:1470(syndicated)
        4    0.000    0.000    0.000    0.000 configparser.py:635(add_section)
       51    0.000    0.000    0.000    0.000 personinfo.py:294(roll_pitch_yaw)
        1    0.000    0.000    0.000    0.000 typing.py:1439(copy_with)
       16    0.000    0.000    0.000    0.000 measure.py:34(with_maximum)
       26    0.000    0.000    0.000    0.000 photoinfo.py:881(uti_raw)
        2    0.000    0.000    0.000    0.000 typing.py:1829(__subclasscheck__)
       15    0.000    0.000    0.000    0.000 util.py:131(union)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1342(owner)
       20    0.000    0.000    0.000    0.000 _compiler.py:467(_get_charset_prefix)
       56    0.000    0.000    0.000    0.000 {method 'clear' of 'dict' objects}
        2    0.000    0.000    0.000    0.000 core.py:2642(_parse_decls)
      216    0.000    0.000    0.000    0.000 inspect.py:3075(parameters)
       37    0.000    0.000    0.000    0.000 {built-in method fromkeys}
       84    0.000    0.000    0.000    0.000 {built-in method sys.getfilesystemencoding}
        1    0.000    0.000    0.000    0.000 threading.py:882(__init__)
        2    0.000    0.000    0.000    0.000 console.py:1183(show_cursor)
       26    0.000    0.000    0.000    0.000 datetime_utils.py:44(datetime_has_tz)
       15    0.000    0.000    0.000    0.000 configparser.py:370(before_set)
      109    0.000    0.000    0.000    0.000 types.py:596(convert)
       26    0.000    0.000    0.000    0.000 {method '__getitem__' of 'dict' objects}
        5    0.000    0.000    0.000    0.000 pyparser.py:215(__init__)
        1    0.000    0.000    0.000    0.000 lexer.py:176(decode_raw_stream)
        1    0.000    0.000    0.000    0.000 __init__.py:80(__enter__)
       24    0.000    0.000    0.000    0.000 photoexporter.py:123(asdict)
        1    0.000    0.000    0.000    0.000 _compat.py:234(_force_correct_text_stream)
       95    0.000    0.000    0.000    0.000 __init__.py:998(__init__)
       32    0.000    0.000    0.000    0.000 metamodel.py:490(_cls_fqn)
       10    0.000    0.000    0.000    0.000 {built-in method _codecs.utf_8_decode}
       89    0.000    0.000    0.000    0.000 style.py:198(null)
       80    0.000    0.000    0.000    0.000 model.py:1073(__init__)
      159    0.000    0.000    0.000    0.000 core.py:2366(resolve_envvar_value)
        1    0.000    0.000    0.000    0.000 typing.py:1223(__init__)
       16    0.000    0.000    0.000    0.000 pathlib.py:748(is_absolute)
        6    0.000    0.000    0.000    0.000 <frozen _collections_abc>:811(__contains__)
        1    0.000    0.000    0.000    0.000 {method 'throw' of 'generator' objects}
       24    0.000    0.000    0.000    0.000 datetime_formatter.py:19(year)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:705(read)
      260    0.000    0.000    0.000    0.000 _photosdb_process_comments.py:142(<lambda>)
      110    0.000    0.000    0.000    0.000 photoinfo.py:1264(has_raw)
        2    0.000    0.000    0.000    0.000 progress.py:607(__init__)
       80    0.000    0.000    0.000    0.000 verbose.py:103(console)
      190    0.000    0.000    0.000    0.000 pathlib.py:176(_select_from)
       22    0.000    0.000    0.000    0.000 {method 'hexdigest' of '_blake2.blake2b' objects}
      104    0.000    0.000    0.000    0.000 {built-in method math.floor}
      195    0.000    0.000    0.000    0.000 parser.py:118(normalize_opt)
        6    0.000    0.000    0.000    0.000 __init__.py:1790(isEnabledFor)
       66    0.000    0.000    0.000    0.000 export_db.py:142(connection)
       10    0.000    0.000    0.000    0.000 uti.py:565(_get_uti_from_ext_dict)
       28    0.000    0.000    0.000    0.000 parse.py:843(__missing__)
       80    0.000    0.000    0.000    0.000 {built-in method _stat.S_ISREG}
       52    0.000    0.000    0.000    0.000 ast.py:192(allargnames)
        1    0.000    0.000    0.000    0.000 parser.py:344(_process_args_for_args)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:454(read)
        1    0.000    0.000    0.000    0.000 <string>:2(__init__)
       20    0.000    0.000    0.000    0.000 configparser.py:1327(__iter__)
        7    0.000    0.000    0.000    0.000 progress.py:1136(tasks)
       26    0.000    0.000    0.000    0.000 progress.py:971(get_time)
       82    0.000    0.000    0.000    0.000 photoinfo.py:968(live_photo)
      163    0.000    0.000    0.000    0.000 __init__.py:1082(__str__)
        1    0.000    0.000    0.000    0.000 cli.py:116(at_exit)
      118    0.000    0.000    0.000    0.000 export_db.py:1237(connection)
       40    0.000    0.000    0.000    0.000 photoinfo.py:828(uti)
       26    0.000    0.000    0.000    0.000 style.py:732(_add)
        2    0.000    0.000    0.000    0.000 _compat.py:496(should_strip_ansi)
        2    0.000    0.000    0.000    0.000 warnings.py:481(__enter__)
        1    0.000    0.000    0.000    0.000 segment.py:370(get_shape)
        1    0.000    0.000    0.000    0.000 <frozen genericpath>:51(islink)
       96    0.000    0.000    0.000    0.000 photoinfo.py:595(<lambda>)
        6    0.000    0.000    0.000    0.000 live_render.py:39(set_renderable)
       32    0.000    0.000    0.000    0.000 metamodel.py:402(TextXClass)
        2    0.000    0.000    0.000    0.000 core.py:590(close)
       20    0.000    0.000    0.000    0.000 configparser.py:1147(_validate_value_types)
        1    0.000    0.000    0.000    0.000 template.py:586(__init__)
       80    0.000    0.000    0.000    0.000 {built-in method builtins.issubclass}
       15    0.000    0.000    0.000    0.000 personinfo.py:303(roll)
        2    0.000    0.000    0.000    0.000 gettext.py:224(_expand_lang)
        1    0.000    0.000    0.000    0.000 threading.py:973(start)
       26    0.000    0.000    0.000    0.000 photoinfo.py:636(<lambda>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        2    0.000    0.000    0.000    0.000 warnings.py:165(simplefilter)
        4    0.000    0.000    0.000    0.000 enum.py:1391(_iter_member_by_def_)
       38    0.000    0.000    0.000    0.000 photoinfo.py:104(filename)
       12    0.000    0.000    0.000    0.000 runtime.py:560(__init__)
       64    0.000    0.000    0.000    0.000 enum.py:1279(value)
       23    0.000    0.000    0.000    0.000 lang.py:802(visit_textx_rule_body)
       76    0.000    0.000    0.000    0.000 verbose.py:91(get_verbose_level)
      104    0.000    0.000    0.000    0.000 {method 'random' of '_random.Random' objects}
       21    0.000    0.000    0.000    0.000 plistlib.py:237(end_dict)
        1    0.000    0.000    0.000    0.000 live.py:25(stop)
       17    0.000    0.000    0.000    0.000 parser.py:197(process)
       12    0.000    0.000    0.000    0.000 photoexporter.py:415(_lock_filename)
       32    0.000    0.000    0.000    0.000 metamodel.py:398(TextXMetaClass)
        4    0.000    0.000    0.000    0.000 placeinfo.py:83(__init__)
       47    0.000    0.000    0.000    0.000 _parser.py:77(__init__)
       80    0.000    0.000    0.000    0.000 providers.py:28(__init__)
        1    0.000    0.000    0.000    0.000 {built-in method objc._objc._loadConstant}
       82    0.000    0.000    0.000    0.000 highlighter.py:57(highlight)
       26    0.000    0.000    0.000    0.000 encoder.py:105(__init__)
      108    0.000    0.000    0.000    0.000 _base.py:182(min_len)
       64    0.000    0.000    0.000    0.000 {method 'casefold' of 'str' objects}
       67    0.000    0.000    0.000    0.000 {method 'lstrip' of 'str' objects}
        3    0.000    0.000    0.000    0.000 {method 'close' of '_io.BufferedReader' objects}
       13    0.000    0.000    0.000    0.000 export_db.py:1651(__enter__)
        1    0.000    0.000    0.000    0.000 parse.py:921(_byte_quoter_factory)
        2    0.000    0.000    0.000    0.000 segment.py:381(<genexpr>)
       12    0.000    0.000    0.000    0.000 _filename.py:117(_get_sanitize_regexp)
       12    0.000    0.000    0.000    0.000 _filepath.py:130(_get_sanitize_regexp)
       15    0.000    0.000    0.000    0.000 __init__.py:255(escape)
       38    0.000    0.000    0.000    0.000 photoinfo.py:671(title)
       15    0.000    0.000    0.000    0.000 pygen.py:62(write_blanks)
      114    0.000    0.000    0.000    0.000 photoinfo.py:2196(<lambda>)
        8    0.000    0.000    0.000    0.000 theme.py:348(list_union)
       55    0.000    0.000    0.000    0.000 _compiler.py:31(_combine_flags)
       56    0.000    0.000    0.000    0.000 _base.py:337(_invoke_callbacks)
        1    0.000    0.000    0.000    0.000 lang.py:340(__init__)
       11    0.000    0.000    0.000    0.000 text.py:710(<genexpr>)
        1    0.000    0.000    0.000    0.000 csv.py:138(__init__)
       96    0.000    0.000    0.000    0.000 photoinfo.py:575(<lambda>)
       26    0.000    0.000    0.000    0.000 lang.py:900(visit_assignment_rhs)
        2    0.000    0.000    0.000    0.000 progress_bar.py:156(__rich_console__)
       51    0.000    0.000    0.000    0.000 {built-in method sys.audit}
        1    0.000    0.000    0.000    0.000 _var_folders_fk_rmbddpt56mbg6h5brgt9jsnh0000gp_T__MEI8d1oEG_osxphotos_templates_xmp_sidecar_mako:1(<module>)
        1    0.000    0.000    0.000    0.000 segment.py:357(get_line_length)
        2    0.000    0.000    0.000    0.000 {method 'rfind' of 'bytes' objects}
      107    0.000    0.000    0.000    0.000 parsetree.py:96(get_children)
       11    0.000    0.000    0.000    0.000 <string>:1(<lambda>)
        5    0.000    0.000    0.000    0.000 {method 'remove' of 'collections.deque' objects}
       21    0.000    0.000    0.000    0.000 {method 'release' of '_thread.lock' objects}
       16    0.000    0.000    0.000    0.000 {method 'rstrip' of 'bytes' objects}
       50    0.000    0.000    0.000    0.000 {built-in method _stat.S_ISDIR}
        1    0.000    0.000    0.000    0.000 __init__.py:1420(__init__)
       13    0.000    0.000    0.000    0.000 <frozen os>:824(fsdecode)
       38    0.000    0.000    0.000    0.000 export_db.py:1229(__init__)
        2    0.000    0.000    0.000    0.000 subprocess.py:268(_cleanup)
        2    0.000    0.000    0.000    0.000 _convenience.py:45(add_convenience_methods)
        6    0.000    0.000    0.000    0.000 typing.py:1169(__setattr__)
        1    0.000    0.000    0.000    0.000 {method 'split' of 'bytes' objects}
       64    0.000    0.000    0.000    0.000 photoinfo.py:1794(_latitude)
        8    0.000    0.000    0.000    0.000 table.py:637(get_padding)
        5    0.000    0.000    0.000    0.000 console.py:207(update_width)
       67    0.000    0.000    0.000    0.000 _compiler.py:428(_get_iscased)
        2    0.000    0.000    0.000    0.000 subprocess.py:2001(_try_wait)
        5    0.000    0.000    0.000    0.000 progress.py:1001(percentage)
       56    0.000    0.000    0.000    0.000 pyparser.py:171(__init__)
       12    0.000    0.000    0.000    0.000 inspect.py:299(ismethod)
       20    0.000    0.000    0.000    0.000 table.py:436(add_cell)
       12    0.000    0.000    0.000    0.000 photoexporter.py:107(__ior__)
       56    0.000    0.000    0.000    0.000 {method '_is_owned' of '_thread.RLock' objects}
        1    0.000    0.000    0.000    0.000 parser.py:49(_unpack_args)
        1    0.000    0.000    0.000    0.000 lexer.py:20(__init__)
        6    0.000    0.000    0.000    0.000 globals.py:50(pop_context)
       38    0.000    0.000    0.000    0.000 {built-in method _stat.S_IFMT}
       84    0.000    0.000    0.000    0.000 _base.py:47(<genexpr>)
        4    0.000    0.000    0.000    0.000 console.py:518(_is_jupyter)
       10    0.000    0.000    0.000    0.000 {built-in method _thread.allocate_lock}
        2    0.000    0.000    0.000    0.000 warnings.py:181(_add_filter)
        1    0.000    0.000    0.000    0.000 typing.py:1130(__init__)
       50    0.000    0.000    0.000    0.000 {method 'endswith' of 'bytes' objects}
        1    0.000    0.000    0.000    0.000 weakref.py:164(__setitem__)
       79    0.000    0.000    0.000    0.000 style.py:285(__str__)
        1    0.000    0.000    0.000    0.000 encoder.py:131(__init__)
       56    0.000    0.000    0.000    0.000 before.py:27(before_nothing)
        2    0.000    0.000    0.000    0.000 threading.py:588(__init__)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
       37    0.000    0.000    0.000    0.000 photoinfo.py:819(shared)
       64    0.000    0.000    0.000    0.000 photoinfo.py:1789(_longitude)
       12    0.000    0.000    0.000    0.000 _filepath.py:136(__get_path_separator)
       26    0.000    0.000    0.000    0.000 {built-in method time.perf_counter}
        1    0.000    0.000    0.000    0.000 threading.py:1079(_stop)
       24    0.000    0.000    0.000    0.000 lang.py:812(visit_choice)
       56    0.000    0.000    0.000    0.000 _base.py:398(__get_result)
       38    0.000    0.000    0.000    0.000 photoinfo.py:565(description)
       39    0.000    0.000    0.000    0.000 {method 'discard' of 'set' objects}
       18    0.000    0.000    0.000    0.000 _loop.py:31(loop_first_last)
       40    0.000    0.000    0.000    0.000 photoinfo.py:900(isphoto)
        3    0.000    0.000    0.000    0.000 typing.py:1538(<genexpr>)
       12    0.000    0.000    0.000    0.000 segment.py:368(<genexpr>)
        2    0.000    0.000    0.000    0.000 datetime_formatter.py:14(date)
        1    0.000    0.000    0.000    0.000 parse.py:836(__init__)
       37    0.000    0.000    0.000    0.000 photoinfo.py:685(ismissing)
        2    0.000    0.000    0.000    0.000 uti.py:579(get_preferred_uti_extension)
       26    0.000    0.000    0.000    0.000 photoinfo.py:913(iscloudasset)
        2    0.000    0.000    0.000    0.000 color.py:484(get_ansi_codes)
       74    0.000    0.000    0.000    0.000 photoinfo.py:2226(<lambda>)
       24    0.000    0.000    0.000    0.000 {method 'write' of '_io.StringIO' objects}
       38    0.000    0.000    0.000    0.000 photoinfo.py:768(intrash)
       10    0.000    0.000    0.000    0.000 parser.py:461(_get_value_from_state)
       11    0.000    0.000    0.000    0.000 <frozen genericpath>:99(samestat)
       50    0.000    0.000    0.000    0.000 datetime_formatter.py:11(__init__)
       26    0.000    0.000    0.000    0.000 photoinfo.py:738(external_edit)
        1    0.000    0.000    0.000    0.000 __init__.py:43(normalize_encoding)
        2    0.000    0.000    0.000    0.000 typing.py:1756(_allow_reckless_class_checks)
       41    0.000    0.000    0.000    0.000 {method 'reverse' of 'list' objects}
       26    0.000    0.000    0.000    0.000 photoinfo.py:773(date_trashed)
        2    0.000    0.000    0.000    0.000 core.py:469(scope)
       24    0.000    0.000    0.000    0.000 __init__.py:23(get_console)
        2    0.000    0.000    0.000    0.000 <frozen os>:1087(__subclasshook__)
        2    0.000    0.000    0.000    0.000 globals.py:55(resolve_color_default)
        3    0.000    0.000    0.000    0.000 __init__.py:137(__init__)
       12    0.000    0.000    0.000    0.000 runtime.py:192(__init__)
       27    0.000    0.000    0.000    0.000 {built-in method _thread.get_ident}
        4    0.000    0.000    0.000    0.000 globals.py:21(get_current_context)
       52    0.000    0.000    0.000    0.000 archiver.py:142(__init__)
       13    0.000    0.000    0.000    0.000 parsetree.py:487(declared_identifiers)
       95    0.000    0.000    0.000    0.000 configparser.py:341(before_read)
        2    0.000    0.000    0.000    0.000 inspect.py:879(cleandoc)
       10    0.000    0.000    0.000    0.000 photoinfo.py:468(_path_edited_5_live_photo)
        2    0.000    0.000    0.000    0.000 _compat.py:571(isatty)
       13    0.000    0.000    0.000    0.000 exportoptions.py:128(bit_flags)
        2    0.000    0.000    0.000    0.000 {built-in method posix.waitpid}
       52    0.000    0.000    0.000    0.000 albuminfo.py:191(title)
        1    0.000    0.000    0.000    0.000 live.py:177(_enable_redirect_io)
       43    0.000    0.000    0.000    0.000 codegen.py:172(identifiers)
        5    0.000    0.000    0.000    0.000 threading.py:311(_acquire_restore)
        1    0.000    0.000    0.000    0.000 gzip.py:581(_create_simple_gzip_header)
        7    0.000    0.000    0.000    0.000 threading.py:314(_is_owned)
        2    0.000    0.000    0.000    0.000 subprocess.py:1092(__exit__)
        1    0.000    0.000    0.000    0.000 core.py:260(__init__)
        3    0.000    0.000    0.000    0.000 core.py:453(__enter__)
       52    0.000    0.000    0.000    0.000 parsetree.py:313(is_root)
       12    0.000    0.000    0.000    0.000 runtime.py:130(_pop_buffer)
        1    0.000    0.000    0.000    0.000 types.py:268(convert)
        1    0.000    0.000    0.000    0.000 utils.py:486(format_sec_to_hhmmss)
        1    0.000    0.000    0.000    0.000 _compiler.py:391(_bytes_to_codes)
        7    0.000    0.000    0.000    0.000 plistlib.py:843(_is_fmt_binary)
       12    0.000    0.000    0.000    0.000 photoexporter.py:87(__init__)
        2    0.000    0.000    0.000    0.000 contextlib.py:616(close)
        9    0.000    0.000    0.000    0.000 {method 'translate' of 'bytearray' objects}
        4    0.000    0.000    0.000    0.000 contextlib.py:477(_exit_wrapper)
        1    0.000    0.000    0.000    0.000 progress.py:702(__init__)
        4    0.000    0.000    0.000    0.000 enum.py:1381(_iter_member_by_value_)
        2    0.000    0.000    0.000    0.000 manager.py:74(get)
       49    0.000    0.000    0.000    0.000 parsetree.py:102(undeclared_identifiers)
        6    0.000    0.000    0.000    0.000 segment.py:171(line)
        5    0.000    0.000    0.000    0.000 _ast_util.py:521(visit_Name)
       57    0.000    0.000    0.000    0.000 parsetree.py:203(declared_identifiers)
        2    0.000    0.000    0.000    0.000 typing.py:1886(_proto_hook)
        2    0.000    0.000    0.000    0.000 typing.py:175(_type_check)
        4    0.000    0.000    0.000    0.000 theme.py:87(__init__)
       26    0.000    0.000    0.000    0.000 metamodel.py:101(__init__)
        4    0.000    0.000    0.000    0.000 table.py:834(align_cell)
       21    0.000    0.000    0.000    0.000 plistlib.py:174(__init__)
       26    0.000    0.000    0.000    0.000 photoinfo.py:157(tzoffset)
        1    0.000    0.000    0.000    0.000 platform.py:978(system)
        6    0.000    0.000    0.000    0.000 platform.py:593(<genexpr>)
       26    0.000    0.000    0.000    0.000 photoinfo.py:895(ismovie)
        1    0.000    0.000    0.000    0.000 control.py:64(__init__)
        1    0.000    0.000    0.000    0.000 utf_8.py:33(getregentry)
        5    0.000    0.000    0.000    0.000 click_rich_echo.py:63(get_rich_console)
    12/11    0.000    0.000    0.000    0.000 photosdb.py:2725(_build_album_folder_hierarchy_5)
        1    0.000    0.000    0.000    0.000 _compat.py:205(_stream_is_misconfigured)
       13    0.000    0.000    0.000    0.000 tempfile.py:301(_gettempdir)
       10    0.000    0.000    0.000    0.000 photoinfo.py:1502(shared_moment)
        1    0.000    0.000    0.000    0.000 <frozen genericpath>:81(commonprefix)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:687(__init__)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:756(__exit__)
        1    0.000    0.000    0.000    0.000 types.py:448(convert)
        4    0.000    0.000    0.000    0.000 types.py:999(convert_type)
       23    0.000    0.000    0.000    0.000 progress.py:1024(<genexpr>)
        6    0.000    0.000    0.000    0.000 typing.py:1117(_is_dunder)
        5    0.000    0.000    0.000    0.000 <frozen codecs>:309(__init__)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1223(selfie)
       12    0.000    0.000    0.000    0.000 {built-in method sys._getframe}
       27    0.000    0.000    0.000    0.000 lang.py:308(__init__)
       12    0.000    0.000    0.000    0.000 inspect.py:492(iscode)
        3    0.000    0.000    0.000    0.000 globals.py:45(push_context)
        1    0.000    0.000    0.000    0.000 _compat.py:489(_is_jupyter_kernel_output)
       17    0.000    0.000    0.000    0.000 <frozen codecs>:186(__init__)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1322(original_filesize)
        2    0.000    0.000    0.000    0.000 uti.py:572(_get_ext_from_uti_dict)
        1    0.000    0.000    0.000    0.000 util.py:85(__get__)
        4    0.000    0.000    0.000    0.000 {built-in method sys.exc_info}
       22    0.000    0.000    0.000    0.000 {method 'insert' of 'list' objects}
        1    0.000    0.000    0.000    0.000 _compat.py:485(strip_ansi)
       26    0.000    0.000    0.000    0.000 photoinfo.py:763(visible)
        6    0.000    0.000    0.000    0.000 encoder.py:138(<lambda>)
        4    0.000    0.000    0.000    0.000 table.py:695(_get_padding_width)
       26    0.000    0.000    0.000    0.000 photosdb.py:2803(_recurse_folder_hierarchy)
        1    0.000    0.000    0.000    0.000 {built-in method _csv.writer}
        1    0.000    0.000    0.000    0.000 console.py:1089(capture)
        4    0.000    0.000    0.000    0.000 const.py:11(mult_lt)
       26    0.000    0.000    0.000    0.000 photoinfo.py:743(favorite)
        4    0.000    0.000    0.000    0.000 manager.py:55(themes)
        2    0.000    0.000    0.000    0.000 <frozen _collections_abc>:104(_check_methods)
       27    0.000    0.000    0.000    0.000 photoinfo.py:928(isreference)
        2    0.000    0.000    0.000    0.000 color.py:512(downgrade)
       13    0.000    0.000    0.000    0.000 {built-in method posix.getpid}
       39    0.000    0.000    0.000    0.000 parsetree.py:99(declared_identifiers)
       12    0.000    0.000    0.000    0.000 photoinfo.py:99(_exiftool_path)
       10    0.000    0.000    0.000    0.000 export.py:3335(run_post_command)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1208(hdr)
        5    0.000    0.000    0.000    0.000 progress_bar.py:33(__init__)
        1    0.000    0.000    0.000    0.000 __init__.py:234(_acquireLock)
       26    0.000    0.000    0.000    0.000 photoinfo.py:905(incloud)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1193(panorama)
       26    0.000    0.000    0.000    0.000 photoinfo.py:758(hidden)
        2    0.000    0.000    0.000    0.000 _parser.py:893(_parse_flags)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1218(portrait)
        1    0.000    0.000    0.000    0.000 __init__.py:1214(__init__)
        4    0.000    0.000    0.000    0.000 archiver.py:176(__init__)
        1    0.000    0.000    0.000    0.000 _compat.py:156(_is_binary_writer)
        5    0.000    0.000    0.000    0.000 threading.py:308(_release_save)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1307(original_height)
        2    0.000    0.000    0.000    0.000 weakref.py:451(get)
        2    0.000    0.000    0.000    0.000 parse.py:119(_coerce_args)
        2    0.000    0.000    0.000    0.000 subprocess.py:1954(_handle_exitstatus)
       26    0.000    0.000    0.000    0.000 exportoptions.py:269(datetime)
        1    0.000    0.000    0.000    0.000 core.py:3041(add_to_parser)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1198(slow_mo)
        1    0.000    0.000    0.000    0.000 parse.py:413(_splitnetloc)
        2    0.000    0.000    0.000    0.000 verbose.py:107(console)
        1    0.000    0.000    0.000    0.000 <frozen _collections_abc>:819(keys)
        1    0.000    0.000    0.000    0.000 _compat.py:223(_is_compatible_text_stream)
       10    0.000    0.000    0.000    0.000 photoinfo.py:1705(cloud_guid)
        2    0.000    0.000    0.000    0.000 locale.py:381(normalize)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1203(time_lapse)
        2    0.000    0.000    0.000    0.000 {method 'isoformat' of 'datetime.date' objects}
       26    0.000    0.000    0.000    0.000 photoinfo.py:1213(screenshot)
        1    0.000    0.000    0.000    0.000 parsetree.py:52(__init__)
        1    0.000    0.000    0.000    0.000 console.py:335(__enter__)
        1    0.000    0.000    0.000    0.000 codegen.py:187(FindTopLevel)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1312(original_width)
       30    0.000    0.000    0.000    0.000 theme.py:47(name)
       26    0.000    0.000    0.000    0.000 lang.py:334(__init__)
        5    0.000    0.000    0.000    0.000 pyparser.py:57(_add_declared)
        2    0.000    0.000    0.000    0.000 subprocess.py:1120(__del__)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1317(original_orientation)
       13    0.000    0.000    0.000    0.000 tempfile.py:229(_get_candidate_names)
       16    0.000    0.000    0.000    0.000 table.py:118(cells)
        2    0.000    0.000    0.000    0.000 verbose.py:115(get_verbose_console)
        1    0.000    0.000    0.000    0.000 metamodel.py:589(validate_user_classes)
        1    0.000    0.000    0.000    0.000 __init__.py:52(_path_from_env)
       14    0.000    0.000    0.000    0.000 {method 'end' of 're.Match' objects}
        1    0.000    0.000    0.000    0.000 threading.py:1043(_set_tstate_lock)
        2    0.000    0.000    0.000    0.000 typing.py:1745(_caller)
       26    0.000    0.000    0.000    0.000 photoinfo.py:1274(raw_original)
       14    0.000    0.000    0.000    0.000 photosdb.py:660(photos_version)
        5    0.000    0.000    0.000    0.000 _ast_util.py:223(write)
        1    0.000    0.000    0.000    0.000 threading.py:855(_maintain_shutdown_locks)
        2    0.000    0.000    0.000    0.000 {built-in method _struct.pack}
        2    0.000    0.000    0.000    0.000 core.py:2302(check_iter)
        4    0.000    0.000    0.000    0.000 progress.py:500(__init__)
       17    0.000    0.000    0.000    0.000 {method 'is_symlink' of 'posix.DirEntry' objects}
       28    0.000    0.000    0.000    0.000 lang.py:840(visit_repeat_operator)
        5    0.000    0.000    0.000    0.000 pyparser.py:219(value)
        4    0.000    0.000    0.000    0.000 __init__.py:915(__eq__)
        1    0.000    0.000    0.000    0.000 progress.py:645(__init__)
        1    0.000    0.000    0.000    0.000 __init__.py:83(__exit__)
        7    0.000    0.000    0.000    0.000 {method '__enter__' of '_thread.lock' objects}
        1    0.000    0.000    0.000    0.000 threading.py:1106(_delete)
       27    0.000    0.000    0.000    0.000 {built-in method builtins.chr}
        1    0.000    0.000    0.000    0.000 _compat.py:36(is_ascii_encoding)
        1    0.000    0.000    0.000    0.000 console.py:825(set_live)
        2    0.000    0.000    0.000    0.000 parser.py:66(_fetch)
        1    0.000    0.000    0.000    0.000 model.py:282(TextXModelParser)
        1    0.000    0.000    0.000    0.000 threading.py:1354(_make_invoke_excepthook)
        2    0.000    0.000    0.000    0.000 typing.py:1239(__hash__)
        1    0.000    0.000    0.000    0.000 _weakrefset.py:39(_remove)
        1    0.000    0.000    0.000    0.000 parser.py:316(add_argument)
       20    0.000    0.000    0.000    0.000 configparser.py:1168(converters)
       13    0.000    0.000    0.000    0.000 pyparser.py:192(__init__)
        3    0.000    0.000    0.000    0.000 lang.py:827(visit_repeat_modifiers)
       13    0.000    0.000    0.000    0.000 utils.py:422(unlock_filename)
        1    0.000    0.000    0.000    0.000 console.py:867(begin_capture)
       16    0.000    0.000    0.000    0.000 {built-in method _sre.unicode_iscased}
        1    0.000    0.000    0.000    0.000 model_params.py:86(add)
       24    0.000    0.000    0.000    0.000 placeinfo.py:656(<lambda>)
        3    0.000    0.000    0.000    0.000 types.py:407(convert)
       17    0.000    0.000    0.000    0.000 parser.py:193(takes_value)
        7    0.000    0.000    0.000    0.000 plistlib.py:464(__init__)
        2    0.000    0.000    0.000    0.000 warnings.py:502(__exit__)
        7    0.000    0.000    0.000    0.000 console.py:471(__init__)
        2    0.000    0.000    0.000    0.000 {built-in method _codecs.lookup}
        5    0.000    0.000    0.000    0.000 progress.py:975(started)
        5    0.000    0.000    0.000    0.000 _ast_util.py:217(__init__)
        2    0.000    0.000    0.000    0.000 _compat.py:214(_is_compat_stream_attr)
        2    0.000    0.000    0.000    0.000 {built-in method atexit.register}
        1    0.000    0.000    0.000    0.000 weakref.py:352(__init__)
       12    0.000    0.000    0.000    0.000 wrappers.py:631(_unpack_self)
        1    0.000    0.000    0.000    0.000 metamodel.py:793(register_obj_processors)
       10    0.000    0.000    0.000    0.000 photoinfo.py:1710(cloud_owner_hashed_id)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:94(__new__)
        5    0.000    0.000    0.000    0.000 table.py:749(<genexpr>)
        2    0.000    0.000    0.000    0.000 export.py:1620(<genexpr>)
        1    0.000    0.000    0.000    0.000 {method 'union' of 'frozenset' objects}
        2    0.000    0.000    0.000    0.000 console.py:490(__rich_console__)
        6    0.000    0.000    0.000    0.000 {built-in method builtins.divmod}
       26    0.000    0.000    0.000    0.000 _photosdb_process_comments.py:144(<lambda>)
        1    0.000    0.000    0.000    0.000 click_rich_echo.py:73(set_rich_theme)
        4    0.000    0.000    0.000    0.000 segment.py:420(align_top)
        4    0.000    0.000    0.000    0.000 core.py:2676(<lambda>)
        2    0.000    0.000    0.000    0.000 metamodel.py:322(_enter_namespace)
        2    0.000    0.000    0.000    0.000 {built-in method time.time}
       10    0.000    0.000    0.000    0.000 photoinfo.py:617(<lambda>)
        1    0.000    0.000    0.000    0.000 progress.py:1371(start_task)
        2    0.000    0.000    0.000    0.000 subprocess.py:481(__init__)
        2    0.000    0.000    0.000    0.000 warnings.py:455(__init__)
        2    0.000    0.000    0.000    0.000 core.py:2002(_check_iter)
        1    0.000    0.000    0.000    0.000 threading.py:837(_newname)
        1    0.000    0.000    0.000    0.000 progress.py:771(__init__)
        1    0.000    0.000    0.000    0.000 _weakrefset.py:85(add)
       10    0.000    0.000    0.000    0.000 photoinfo.py:1715(fingerprint)
        1    0.000    0.000    0.000    0.000 console.py:853(pop_render_hook)
        1    0.000    0.000    0.000    0.000 progress.py:965(<lambda>)
        2    0.000    0.000    0.000    0.000 {built-in method math.ceil}
        2    0.000    0.000    0.000    0.000 console.py:299(__rich_console__)
        1    0.000    0.000    0.000    0.000 weakref.py:347(__new__)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:426(__init__)
        5    0.000    0.000    0.000    0.000 progress.py:996(finished)
        4    0.000    0.000    0.000    0.000 {method 'get' of 'mappingproxy' objects}
        3    0.000    0.000    0.000    0.000 _parser.py:295(seek)
        4    0.000    0.000    0.000    0.000 enum.py:117(_iter_bits_lsb)
        1    0.000    0.000    0.000    0.000 progress.py:987(elapsed)
        5    0.000    0.000    0.000    0.000 table.py:832(<genexpr>)
       13    0.000    0.000    0.000    0.000 parsetree.py:316(get_children)
        2    0.000    0.000    0.000    0.000 platform.py:889(uname)
       12    0.000    0.000    0.000    0.000 table.py:352(padding)
        1    0.000    0.000    0.000    0.000 table.py:309(get_row_style)
       16    0.000    0.000    0.000    0.000 theme.py:67(path)
        1    0.000    0.000    0.000    0.000 codegen.py:72(__init__)
        4    0.000    0.000    0.000    0.000 {method 'getvalue' of '_io.StringIO' objects}
        1    0.000    0.000    0.000    0.000 console.py:844(push_render_hook)
        1    0.000    0.000    0.000    0.000 pygen.py:236(_flush_adjusted_lines)
       13    0.000    0.000    0.000    0.000 codegen.py:921(visitDefTag)
       12    0.000    0.000    0.000    0.000 utils.py:402(lock_filename)
       10    0.000    0.000    0.000    0.000 placeinfo.py:595(country_code)
       16    0.000    0.000    0.000    0.000 configparser.py:344(before_write)
        1    0.000    0.000    0.000    0.000 __init__.py:1485(ws)
        1    0.000    0.000    0.000    0.000 threading.py:1036(_set_ident)
        1    0.000    0.000    0.000    0.000 {method 'acquire' of '_thread.RLock' objects}
        9    0.000    0.000    0.000    0.000 unicode.py:84(<genexpr>)
        1    0.000    0.000    0.000    0.000 progress_bar.py:201(__rich_measure__)
        1    0.000    0.000    0.000    0.000 {method 'tolist' of 'memoryview' objects}
       10    0.000    0.000    0.000    0.000 placeinfo.py:600(ishome)
        5    0.000    0.000    0.000    0.000 click_rich_echo.py:38(console)
        1    0.000    0.000    0.000    0.000 {built-in method _struct.calcsize}
        1    0.000    0.000    0.000    0.000 {built-in method zlib.crc32}
        1    0.000    0.000    0.000    0.000 __init__.py:243(_releaseLock)
        4    0.000    0.000    0.000    0.000 threading.py:601(is_set)
       10    0.000    0.000    0.000    0.000 placeinfo.py:605(name)
        1    0.000    0.000    0.000    0.000 console.py:155(ascii_only)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.__import__}
        3    0.000    0.000    0.000    0.000 pygen.py:211(_reset_multi_line_flags)
        4    0.000    0.000    0.000    0.000 _log_render.py:15(__init__)
        1    0.000    0.000    0.000    0.000 click_rich_echo.py:57(set_rich_console)
        2    0.000    0.000    0.000    0.000 progress.py:980(remaining)
        1    0.000    0.000    0.000    0.000 _transform.py:239(transformAttribute)
        1    0.000    0.000    0.000    0.000 console.py:839(clear_live)
       10    0.000    0.000    0.000    0.000 placeinfo.py:590(address_str)
        8    0.000    0.000    0.000    0.000 photoinfo.py:2253(__init__)
        4    0.000    0.000    0.000    0.000 placeinfo.py:165(__init__)
        2    0.000    0.000    0.000    0.000 typing.py:166(_type_convert)
        4    0.000    0.000    0.000    0.000 {method 'pop' of 'collections.deque' objects}
       10    0.000    0.000    0.000    0.000 placeinfo.py:610(names)
        1    0.000    0.000    0.000    0.000 <frozen _collections_abc>:845(__init__)
        3    0.000    0.000    0.000    0.000 {method 'splitlines' of 'str' objects}
        5    0.000    0.000    0.000    0.000 codegen.py:1292(__init__)
        6    0.000    0.000    0.000    0.000 {built-in method _warnings._filters_mutated}
        1    0.000    0.000    0.000    0.000 typing.py:262(_collect_parameters)
        4    0.000    0.000    0.000    0.000 console.py:589(detect_legacy_windows)
        5    0.000    0.000    0.000    0.000 {method 'isascii' of 'str' objects}
        8    0.000    0.000    0.000    0.000 photoinfo.py:2256(__getattribute__)
        1    0.000    0.000    0.000    0.000 threading.py:1040(_set_native_id)
        1    0.000    0.000    0.000    0.000 parser.py:219(process)
        7    0.000    0.000    0.000    0.000 core.py:2950(<genexpr>)
        1    0.000    0.000    0.000    0.000 console.py:476(renderables)
        1    0.000    0.000    0.000    0.000 template.py:349(_setup_cache_args)
        1    0.000    0.000    0.000    0.000 live.py:187(_disable_redirect_io)
        3    0.000    0.000    0.000    0.000 enum.py:1398(<lambda>)
        5    0.000    0.000    0.000    0.000 progress.py:1132(console)
        1    0.000    0.000    0.000    0.000 utils.py:525(under_test)
        4    0.000    0.000    0.000    0.000 subprocess.py:1966(_internal_poll)
        2    0.000    0.000    0.000    0.000 threading.py:1234(daemon)
        5    0.000    0.000    0.000    0.000 <frozen codecs>:260(__init__)
        1    0.000    0.000    0.000    0.000 {built-in method sys.exit}
        1    0.000    0.000    0.000    0.000 live_render.py:28(__init__)
        1    0.000    0.000    0.000    0.000 metamodel.py:336(_leave_namespace)
        2    0.000    0.000    0.000    0.000 {method 'date' of 'datetime.datetime' objects}
        1    0.000    0.000    0.000    0.000 _compat.py:608(<lambda>)
        4    0.000    0.000    0.000    0.000 theme.py:71(path)
        1    0.000    0.000    0.000    0.000 parser.py:267(__init__)
        2    0.000    0.000    0.000    0.000 table.py:294(_extra_width)
        2    0.000    0.000    0.000    0.000 {method 'extend' of 'bytearray' objects}
        2    0.000    0.000    0.000    0.000 {built-in method sys._getframemodulename}
        2    0.000    0.000    0.000    0.000 utils.py:503(pluralize)
        1    0.000    0.000    0.000    0.000 template.py:342(reserved_names)
        4    0.000    0.000    0.000    0.000 subprocess.py:1311(_on_error_fd_closer)
        1    0.000    0.000    0.000    0.000 console.py:331(__init__)
        1    0.000    0.000    0.000    0.000 model_params.py:71(__init__)
        2    0.000    0.000    0.000    0.000 table.py:284(expand)
        7    0.000    0.000    0.000    0.000 theme.py:55(tags)
        3    0.000    0.000    0.000    0.000 {method 'locked' of '_thread.lock' objects}
        1    0.000    0.000    0.000    0.000 weakref.py:427(__setitem__)
        1    0.000    0.000    0.000    0.000 parser.py:214(__init__)
        1    0.000    0.000    0.000    0.000 threading.py:1196(ident)
        1    0.000    0.000    0.000    0.000 _parser.py:100(checkgroup)
        2    0.000    0.000    0.000    0.000 parsetree.py:57(get_children)
        4    0.000    0.000    0.000    0.000 measure.py:59(clamp)
        1    0.000    0.000    0.000    0.000 {method 'decode' of 'bytearray' objects}
        1    0.000    0.000    0.000    0.000 __init__.py:75(__init__)
        2    0.000    0.000    0.000    0.000 {built-in method posix.WIFSTOPPED}
        3    0.000    0.000    0.000    0.000 typing.py:1227(<genexpr>)
        2    0.000    0.000    0.000    0.000 {method 'expandtabs' of 'str' objects}
        4    0.000    0.000    0.000    0.000 __init__.py:909(__str__)
        1    0.000    0.000    0.000    0.000 crash_reporter.py:24(set_crash_data)
        1    0.000    0.000    0.000    0.000 {method 'cast' of 'memoryview' objects}
        1    0.000    0.000    0.000    0.000 core.py:2346(value_is_missing)
        1    0.000    0.000    0.000    0.000 {built-in method _thread._set_sentinel}
        2    0.000    0.000    0.000    0.000 subprocess.py:1089(__enter__)
        4    0.000    0.000    0.000    0.000 theme.py:51(description)
        4    0.000    0.000    0.000    0.000 theme.py:59(inherit)
        2    0.000    0.000    0.000    0.000 {method 'popleft' of 'collections.deque' objects}
        1    0.000    0.000    0.000    0.000 encoder.py:147(get_empty_table)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:348(__init__)
        1    0.000    0.000    0.000    0.000 control.py:180(__rich_console__)
        1    0.000    0.000    0.000    0.000 {method 'isalpha' of 'str' objects}
        2    0.000    0.000    0.000    0.000 platform.py:9(assert_macos)
        1    0.000    0.000    0.000    0.000 console.py:296(__init__)
        1    0.000    0.000    0.000    0.000 _compat.py:607(<lambda>)
        2    0.000    0.000    0.000    0.000 {built-in method posix.waitstatus_to_exitcode}
        1    0.000    0.000    0.000    0.000 parser.py:246(__init__)
        3    0.000    0.000    0.000    0.000 encoder.py:139(<lambda>)
        1    0.000    0.000    0.000    0.000 {method 'clear' of 'set' objects}
        1    0.000    0.000    0.000    0.000 types.py:840(coerce_path_result)
        2    0.000    0.000    0.000    0.000 {built-in method _sre.unicode_tolower}
        1    0.000    0.000    0.000    0.000 click_rich_echo.py:85(set_rich_timestamp)
        1    0.000    0.000    0.000    0.000 click_rich_echo.py:79(get_rich_theme)
        1    0.000    0.000    0.000    0.000 {method 'release' of '_thread.RLock' objects}
        1    0.000    0.000    0.000    0.000 __init__.py:1369(disable)
        1    0.000    0.000    0.000    0.000 click_rich_echo.py:42(console)
        2    0.000    0.000    0.000    0.000 contextlib.py:564(__enter__)
        1    0.000    0.000    0.000    0.000 {built-in method _thread.daemon_threads_allowed}
        1    0.000    0.000    0.000    0.000 platform.py:836(_unknown_as_blank)
        1    0.000    0.000    0.000    0.000 console.py:347(get)
        1    0.000    0.000    0.000    0.000 __init__.py:1492(eolterm)
        1    0.000    0.000    0.000    0.000 {built-in method _thread.get_native_id}
        1    0.000    0.000    0.000    0.000 {built-in method _operator.lt}
        1    0.000    0.000    0.000    0.000 parse.py:421(_checknetloc)
        1    0.000    0.000    0.000    0.000 _compat.py:561(_get_windows_console_stream)
        2    0.000    0.000    0.000    0.000 parse.py:108(_noop)
        1    0.000    0.000    0.000    0.000 live.py:91(is_started)
        1    0.000    0.000    0.000    0.000 core.py:507(meta)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 _parser.py:103(checklookbehindgroup)
        1    0.000    0.000    0.000    0.000 control.py:69(<genexpr>)
        1    0.000    0.000    0.000    0.000 core.py:1298(show_help)
        1    0.000    0.000    0.000    0.000 metamodel.py:581(validate)
        1    0.000    0.000    0.000    0.000 cli_params.py:32(validate_selected)
        1    0.000    0.000    0.000    0.000 <frozen codecs>:753(__enter__)
RhetTbull commented 7 months ago

At the end of the script it started deleting all my files, it seems. Not sure what has changed. Perhaps it cleans up files that were unchanged? That doesn't seem right.

This appears to be a bug with --cleanup and --limit. I'll open a new issue. My example did have the export directory set to /private/tmp as my intent was to get some sample data without affecting your current export.

Did you redirect the output of the test command to a file per the example? If you have the file please send it to me at osxphotos.py@gmail.com -- what I'm looking for is why osxphotos is calling the photokit code. I've not been able to replicate this.

I'll take a look at the profile data you posted and see if anything jumps out.

I suspect that Apple began throttling me since I've been downloading the full catalog multiple times in the past month or so.

That's possible.

One more datapoint -- please run osxphotos query --missing --count and let me know what it says. I'm curious how many photos that OSXPhotos thinks are still missing (not yet downloaded from iCloud) in your catalog.

RhetTbull commented 7 months ago

The next time you run your normal export command, please add the --profile (must come between osxphotos and export but not the other --watch options or the --limit. Then let it run for a full export and post the profile output. Nothing appears out of the ordinary in the data from the run with --limit 10 but then again, the majority of the time is taken about the ~30 seconds to load the database.

odedia commented 7 months ago

Got it. I used a different folder because my library is on an external SSD so /private/tmp would destroy my sad 128gb SSD :). It seems like after all images are downloaded the speed differences are negligible if any. But I’ll run the profile commands as requested and send them to your gmail account.

RhetTbull commented 7 months ago

It seems like after all images are downloaded the speed differences are negligible if any.

My guess is that the slowness was due having to download the files from iCloud (which is the intent of the --download-missing command). If you had previously run without --download-missing then it would have been much faster but it would have been skipping the missing files. --use-photokit may be a red-herring; this simply uses a different means of downloading the file (the native API instead of the Photos AppleScript interface) which performs better usually but doesn't work if you are exporting from a library that's not the system library.

odedia commented 7 months ago

Shared the reports over email. Regarding --count, Here's the output - it basically has all images now after the remaining 2400 images were downloaded:

> osxphotos query --missing --count
Using last opened Photos library: /Volumes/ExternalData/Users/odedia/Pictures/Photo Library.photoslibrary
Processing database /Volumes/ExternalData/Users/odedia/Pictures/Photo Library.photoslibrary/database/photos.db
Processing database /Volumes/ExternalData/Users/odedia/Pictures/Photo Library.photoslibrary/database/Photos.sqlite
Photos database version: 6000, 9.
Processing persons in photos.
Processing detected faces in photos.
Processing albums.
Processing keywords.
Processing photo details.
Processing import sessions.
Processing additional photo details.
Processing face details.
Processing photo labels.
Processing EXIF details.
Processing computed aesthetic scores.
Processing comments and likes for shared photos.
Processing moments.
Processing syndication info.
Processing shared iCloud library info
Done processing details from Photos library.
1